The answer is: it depends how much manual labor you are willing to put in.
What you can do is roll up your sleeves and use the attic extension in interactive mode. If you are using TortoiseHg, you already have it, just run hgtk shelve
and it lets you move changes around one diff hunk at a time. (a hunk being a set of contiguous line diffs)
There are plenty of other diff patching tools that will give you single-hunk resolution. Let me know if you need more details.
And just for fun, let's talk about how an automated solution like bisect
is not possible, since it doesn't always make sense that half a changeset should still compile. Even worse, what if they do compile, but have logic errors? Here's a simple worst case scenario...
void main(){
Foo *x = malloc(128);
frobFoo(&x);
- free(x); //line 4 removed in changeset
}
void frobFoo(Foo ** x){
+ free(*x); //line 8 added in changeset
}