mozhg: don't strip/obsolete unmodified revisions during rewrite (bug
bug 1321548) r?gps
MozReview-Commit-ID: 2lgB4Uh4Jcu
--- a/pylib/mozhg/mozhg/rewrite.py
+++ b/pylib/mozhg/mozhg/rewrite.py
@@ -279,37 +279,43 @@ def replacechangesets(repo, oldnodes, cr
# This no-ops if nothing is dirty.
q.savedirty()
# If obsolescence is enabled, obsolete the old changesets.
if obsenabled:
markers = []
for oldrev, newrev in revmap.items():
- markers.append((repo[oldrev], (repo[newrev],)))
- obsolete.createmarkers(repo, markers)
+ if repo[oldrev] != repo[newrev]:
+ markers.append((repo[oldrev], (repo[newrev],)))
+ if markers:
+ obsolete.createmarkers(repo, markers)
# Move the working directory to the new node, if applicable.
wdirrev = repo['.'].rev()
if wdirrev in revmap:
hg.updaterepo(repo, repo[revmap[wdirrev]].node(), True)
# The active bookmark is tracked by its symbolic name, not its
# changeset. Since we didn't do anything that should change the
# active bookmark, we shouldn't need to adjust it.
if activebookmark(repo) != oldactivebookmark:
raise util.Abort('active bookmark changed; '
'this should not occur!',
hint='please file a bug')
tr.close()
- # Unless obsolescence is enabled, strip the old changesets.
+ # Unless obsolescence is enabled, strip any obsolete changesets.
if not obsenabled:
- stripnodes = [repo[rev].node() for rev in revmap.keys()]
- repair.strip(repo.ui, repo, stripnodes, topic=backuptopic)
+ stripnodes = []
+ for oldrev, newrev in revmap.items():
+ if repo[oldrev] != repo[newrev]:
+ stripnodes.append(repo[oldrev].node())
+ if stripnodes:
+ repair.strip(repo.ui, repo, stripnodes, topic=backuptopic)
finally:
if tr:
tr.release()
lockmod.release(wlock, lock)
return nodemap
--- a/pylib/mozhg/mozhg/tests/test-rewrite.t
+++ b/pylib/mozhg/mozhg/tests/test-rewrite.t
@@ -98,16 +98,34 @@ Smoke test rewrite a single changeset
files: foo
extra: branch=default
description:
single changeset
0
+Rewrite a single changeset without modifying the description should leave it
+untouched.
+
+ $ hg rewritemessage 1 --unmodified
+
+ $ hg log -G
+ @ changeset: 1:4f5daa677d00
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: single changeset
+ |
+ o changeset: 0:96ee1d7354c4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: initial
+
+
Rewrite multiple changesets with no children
$ hg up -r 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 1 > foo
$ hg commit -m 'multiple 1'
created new head
--- a/pylib/mozhg/mozhg/tests/testrewrite.py
+++ b/pylib/mozhg/mozhg/tests/testrewrite.py
@@ -2,40 +2,44 @@
# GNU General Public License version 2 or any later version.
import os
from mercurial import (
cmdutil,
context,
)
-
+from mercurial.i18n import _
OUR_DIR = os.path.dirname(__file__)
execfile(os.path.join(OUR_DIR, '..', '..', '..', '..', 'hgext', 'bootstrap.py'))
from mozhg.rewrite import (
newparents,
replacechangesets,
)
cmdtable = {}
command = cmdutil.command(cmdtable)
-@command('rewritemessage', [], 'hg rewrite REVS')
-def rewritemessage(ui, repo, revs=None):
+@command('rewritemessage', [
+ ('', 'unmodified', False, _('Do not modify the revision'), '')
+], 'hg rewrite REVS')
+def rewritemessage(ui, repo, revs=None, **opts):
nodes = [repo[rev].node() for rev in repo.revs(revs)]
offset = [0]
def createfn(repo, ctx, revmap, filectxfn):
parents = newparents(repo, ctx, revmap)
- memctx = context.memctx(repo, parents,
- ctx.description() + '\n%d' % offset[0],
+ description = ctx.description()
+ if not opts['unmodified']:
+ description += '\n%d' % offset[0]
+ memctx = context.memctx(repo, parents, description,
ctx.files(), filectxfn, user=ctx.user(),
date=ctx.date(), extra=ctx.extra())
status = ctx.p1().status(ctx)
memctx.modified = lambda: status[0]
memctx.added = lambda: status[1]
memctx.removed = lambda: status[2]
offset[0] += 1