# HG changeset patch # User Mike Edgar # Date 2014-08-06 20:51:41 # Node ID d2a5986cb89dbfecd262139dc018e19dbb80fdac # Parent c0c369aec64386bf2ad80d0e8888ad40a3d9f144 histedit: add "roll" command to fold commit data and drop message (issue4256) This new histedit command (short for "rollup") is a variant of "fold" akin to "hg amend" for working copy: it accumulates changes without interrupting the user and asking for an updated commit message. diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -36,6 +36,7 @@ file open in your editor:: # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -57,6 +58,7 @@ would reorganize the file to look like t # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -179,6 +181,7 @@ editcomment = _("""# Edit history betwee # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above +# r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -291,7 +294,9 @@ def collapse(repo, first, last, commitop extra = commitopts.get('extra') parents = (first.p1().node(), first.p2().node()) - editor = cmdutil.getcommiteditor(edit=True, editform='histedit.fold') + editor = None + if not commitopts.get('rollup'): + editor = cmdutil.getcommiteditor(edit=True, editform='histedit.fold') new = context.memctx(repo, parents=parents, text=message, @@ -333,6 +338,11 @@ def edit(ui, repo, ctx, ha, opts): _('Make changes as needed, you may commit or record as needed now.\n' 'When you are finished, run hg histedit --continue to resume.')) +def rollup(ui, repo, ctx, ha, opts): + rollupopts = opts.copy() + rollupopts['rollup'] = True + return fold(ui, repo, ctx, ha, rollupopts) + def fold(ui, repo, ctx, ha, opts): oldctx = repo[ha] hg.update(repo, ctx.node()) @@ -360,10 +370,13 @@ def finishfold(ui, repo, ctx, oldctx, ne username = ui.username() commitopts['user'] = username # commit message - newmessage = '\n***\n'.join( - [ctx.description()] + - [repo[r].description() for r in internalchanges] + - [oldctx.description()]) + '\n' + if opts.get('rollup'): + newmessage = ctx.description() + else: + newmessage = '\n***\n'.join( + [ctx.description()] + + [repo[r].description() for r in internalchanges] + + [oldctx.description()]) + '\n' commitopts['message'] = newmessage # date commitopts['date'] = max(ctx.date(), oldctx.date()) @@ -444,6 +457,8 @@ actiontable = {'p': pick, 'edit': edit, 'f': fold, 'fold': fold, + 'r': rollup, + 'roll': rollup, 'd': drop, 'drop': drop, 'm': message, @@ -679,7 +694,7 @@ def bootstrapcontinue(ui, repo, parentct m, a, r, d = repo.status()[:4] if m or a or r or d: # prepare the message for the commit to comes - if action in ('f', 'fold'): + if action in ('f', 'fold', 'r', 'roll'): message = 'fold-temp-revision %s' % currentnode else: message = ctx.description() @@ -702,15 +717,19 @@ def bootstrapcontinue(ui, repo, parentct # to parent. replacements.append((ctx.node(), tuple(newchildren))) - if action in ('f', 'fold'): + if action in ('f', 'fold', 'r', 'roll'): if newchildren: # finalize fold operation if applicable if new is None: new = newchildren[-1] else: newchildren.pop() # remove new from internal changes - parentctx, repl = finishfold(ui, repo, parentctx, ctx, new, opts, - newchildren) + foldopts = opts + if action in ('r', 'roll'): + foldopts = foldopts.copy() + foldopts['rollup'] = True + parentctx, repl = finishfold(ui, repo, parentctx, ctx, new, + foldopts, newchildren) replacements.extend(repl) else: # newchildren is empty if the fold did not result in any commit diff --git a/tests/test-histedit-arguments.t b/tests/test-histedit-arguments.t --- a/tests/test-histedit-arguments.t +++ b/tests/test-histedit-arguments.t @@ -57,6 +57,7 @@ Run a dummy edit to make sure we get tip # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -255,6 +256,7 @@ Test that trimming description using mul # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # diff --git a/tests/test-histedit-bookmark-motion.t b/tests/test-histedit-bookmark-motion.t --- a/tests/test-histedit-bookmark-motion.t +++ b/tests/test-histedit-bookmark-motion.t @@ -73,6 +73,7 @@ # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -133,6 +134,7 @@ # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # diff --git a/tests/test-histedit-commute.t b/tests/test-histedit-commute.t --- a/tests/test-histedit-commute.t +++ b/tests/test-histedit-commute.t @@ -67,6 +67,7 @@ show the edit commands offered # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -344,6 +345,7 @@ Verify that revsetalias entries work wit # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # diff --git a/tests/test-histedit-fold-non-commute.t b/tests/test-histedit-fold-non-commute.t --- a/tests/test-histedit-fold-non-commute.t +++ b/tests/test-histedit-fold-non-commute.t @@ -183,3 +183,165 @@ manifest 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 + 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 .. diff --git a/tests/test-histedit-fold.t b/tests/test-histedit-fold.t --- a/tests/test-histedit-fold.t +++ b/tests/test-histedit-fold.t @@ -105,6 +105,50 @@ check histedit_source +rollup will fold without preserving the folded commit's message + + $ hg histedit d2ae7f538514 --commands - 2>&1 < pick d2ae7f538514 b + > roll ee283cb5f2d5 e + > pick 6de59d13424a f + > pick 9c277da72c9b d + > EOF + 0 files updated, 0 files merged, 4 files removed, 0 files unresolved + 0 files updated, 0 files merged, 2 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 + 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 logt --graph + @ 3:c4a9eb7989fc d + | + o 2:8e03a72b6f83 f + | + o 1:391ee782c689 b + | + o 0:cb9a9f314b8b a + + +description is taken from rollup target commit + + $ hg log --debug --rev 1 + changeset: 1:391ee782c68930be438ccf4c6a403daedbfbffa5 + phase: draft + parent: 0:cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b + parent: -1:0000000000000000000000000000000000000000 + manifest: 1:b5e112a3a8354e269b1524729f0918662d847c38 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + files+: b e + extra: branch=default + extra: histedit_source=d2ae7f538514cd87c17547b0de4cea71fe1af9fb,ee283cb5f2d5955443f23a27b697a04339e9a39a + description: + b + + + check saving last-message.txt $ cat > $TESTTMP/abortfolding.py < EOF $ rm -f .hg/last-message.txt - $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 6de59d13424a --commands - 2>&1 < pick 6de59d13424a f - > fold 9c277da72c9b d + $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 8e03a72b6f83 --commands - 2>&1 < pick 8e03a72b6f83 f + > fold c4a9eb7989fc d > EOF 0 files updated, 0 files merged, 1 files removed, 0 files unresolved allow non-folding commit diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t --- a/tests/test-histedit-obsolete.t +++ b/tests/test-histedit-obsolete.t @@ -57,6 +57,7 @@ Enable obsolete # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # diff --git a/tests/test-histedit-outgoing.t b/tests/test-histedit-outgoing.t --- a/tests/test-histedit-outgoing.t +++ b/tests/test-histedit-outgoing.t @@ -49,6 +49,7 @@ show the edit commands offered by outgoi # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -80,6 +81,7 @@ show the error from unrelated repos # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content # @@ -103,6 +105,7 @@ test sensitivity to branch in URL: # p, pick = use commit # e, edit = use commit, but stop for amending # f, fold = use commit, but combine it with the one above + # r, roll = like fold, but discard this commit's description # d, drop = remove commit from history # m, mess = edit message without changing commit content #