Search code examples
mercurialmercurial-extension

How to split a patch into two parts (with pbranch)?


I am working on a mercurial repository and using pbrach for working on a set of patches.

Assume I have two files A and B, and two patches patchA (modifies A) and patchAB (modifies A and B). The pgraph looks like this:

o  patchAB
|
@  patchA
|
o  default

By mistake, I committed a change to file B into patchA.

How do I split the patch A into 2 parts, so that I end up with: patchA=patchA' + newPatch, where patchA=Original Patch, patchA'=changes of patchA in file A, P2=changes of patchA in file B.

o  patchAB
|
| o newPatch // rest of original patchA without changes already in patchA'
|/
@  patchA' // with only the changes to file A
|
o  default

(I search something similar to splitting patches with mq but for pbranch).


Solution

  • Finally, I found a relatively short solution myself.

    First I get the revision number of the last 'good' commit (say 1), and the wrong commit (say 2).

    1) I update to patchA, revert the change on fileB, and commit it, and pmerge the changes upwards:

    hg up patchA
    hg revert -r1 fileB  // get fileB before the wrong change
    hg commit -m"revert fileB"
    hg pmerge -a
    

    2) Update to patchA again, revert the wrong commit and create a new patch:

    hg up patchA
    hg revert -r2 fileB  // get fileB after the wrong change
    hg pnew patchA2
    

    We now have the changes of fileA in patchA and the rest in patchA2.