$ . "$TESTDIR/histedit-helpers.sh" $ cat >> $HGRCPATH < [extensions] > histedit= > EOF $ initrepo () > { > hg init $1 > cd $1 > for x in a b c d e f ; do > echo $x$x$x$x$x > $x > hg add $x > done > hg ci -m 'Initial commit' > for x in a b c d e f ; do > echo $x > $x > hg ci -m $x > done > echo 'I can haz no commute' > e > hg ci -m 'does not commute with e' > cd .. > } $ initrepo r $ cd r Initial generation of the command files $ EDITED="$TESTTMP/editedhistory" $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED $ hg log --template 'fold {node|short} {rev} {desc}\n' -r 7 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED $ cat $EDITED pick 65a9a84f33fd 3 c pick 00f1c5383965 4 d fold 39522b764e3d 7 does not commute with e pick 7b4e2f4b7bcd 5 e pick 500cac37a696 6 f log before edit $ hg log --graph @ changeset: 7:39522b764e3d | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 6:500cac37a696 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:7b4e2f4b7bcd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit edit the history $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts during merge. merging e incomplete! (edit conflicts, then use 'hg resolve --mark') Fix up the change and run hg histedit --continue fix up $ echo 'I can haz no commute' > e $ hg resolve --mark e (no more unresolved files) $ cat > cat.py < import sys > print open(sys.argv[1]).read() > print > print > EOF $ HGEDITOR="python cat.py" hg histedit --continue 2>&1 | fixbundle | grep -v '2 files removed' 2 files updated, 0 files merged, 0 files removed, 0 files unresolved d *** does not commute with e HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: Leave message empty to abort commit. HG: -- HG: user: test HG: branch 'default' HG: changed d HG: changed e 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 0 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts during merge. merging e incomplete! (edit conflicts, then use 'hg resolve --mark') Fix up the change and run hg histedit --continue just continue this time $ hg revert -r 'p1()' e $ hg resolve --mark e (no more unresolved files) $ hg histedit --continue 2>&1 | fixbundle 7b4e2f4b7bcd: empty changeset 0 files updated, 0 files merged, 0 files removed, 0 files unresolved 0 files updated, 0 files merged, 0 files removed, 0 files unresolved log after edit $ hg log --graph @ changeset: 5:d9cf42e54966 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 4:10486af2e984 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit contents of e $ hg cat e I can haz no commute manifest $ hg manifest a b c d e f $ cd .. Repeat test using "roll", not "fold". "roll" folds in changes but drops message $ initrepo r2 $ cd r2 Initial generation of the command files $ EDITED="$TESTTMP/editedhistory.2" $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED $ hg log --template 'roll {node|short} {rev} {desc}\n' -r 7 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED $ cat $EDITED pick 65a9a84f33fd 3 c pick 00f1c5383965 4 d roll 39522b764e3d 7 does not commute with e pick 7b4e2f4b7bcd 5 e pick 500cac37a696 6 f log before edit $ hg log --graph @ changeset: 7:39522b764e3d | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: does not commute with e | o changeset: 6:500cac37a696 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 5:7b4e2f4b7bcd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 4:00f1c5383965 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit edit the history $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle 2 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts during merge. merging e incomplete! (edit conflicts, then use 'hg resolve --mark') Fix up the change and run hg histedit --continue fix up $ echo 'I can haz no commute' > e $ hg resolve --mark e (no more unresolved files) $ hg histedit --continue 2>&1 | fixbundle | grep -v '2 files removed' 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 0 files updated, 0 files merged, 0 files removed, 0 files unresolved merging e warning: conflicts during merge. merging e incomplete! (edit conflicts, then use 'hg resolve --mark') Fix up the change and run hg histedit --continue just continue this time $ hg revert -r 'p1()' e $ hg resolve --mark e (no more unresolved files) $ hg histedit --continue 2>&1 | fixbundle 7b4e2f4b7bcd: empty changeset 0 files updated, 0 files merged, 0 files removed, 0 files unresolved 0 files updated, 0 files merged, 0 files removed, 0 files unresolved log after edit $ hg log --graph @ changeset: 5:e7c4f5d4eb75 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: f | o changeset: 4:803d1bb561fc | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 3:65a9a84f33fd | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 2:da6535b52e45 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 1:c1f09da44841 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: a | o changeset: 0:1715188a53c7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: Initial commit contents of e $ hg cat e I can haz no commute manifest $ hg manifest a b c d e f description is taken from rollup target commit $ hg log --debug --rev 4 changeset: 4:803d1bb561fceac3129ec778db9da249a3106fc3 phase: draft parent: 3:65a9a84f33fdeb1ad5679b3941ec885d2b24027b parent: -1:0000000000000000000000000000000000000000 manifest: 4:b068a323d969f22af1296ec6a5ea9384cef437ac user: test date: Thu Jan 01 00:00:00 1970 +0000 files: d e extra: branch=default extra: histedit_source=00f1c53839651fa5c76d423606811ea5455a79d0,39522b764e3d26103f08bd1fa2ccd3e3d7dbcf4e description: d done with repo r2 $ cd ..