mozhg: don't strip/obsolete unmodified revisions during rewrite (bug bug 1321548) r?gps draft
authorbyron jones <glob@mozilla.com>
Tue, 31 Jan 2017 12:34:52 +0800
changeset 10275 a1c7235bcabbd5753a199f61f1755ff542e3ddf9
parent 10266 8989ac6aa3cc22c5a6ef35ab6d1b84d734a7dd57
child 10276 f7634001bac6e9fb31bf3cbae3399b00e70a19da
push id1499
push userbjones@mozilla.com
push dateWed, 01 Feb 2017 06:47:05 +0000
reviewersgps
bugs1321548
mozhg: don't strip/obsolete unmodified revisions during rewrite (bug bug 1321548) r?gps MozReview-Commit-ID: 2lgB4Uh4Jcu
pylib/mozhg/mozhg/rewrite.py
pylib/mozhg/mozhg/tests/test-rewrite.t
pylib/mozhg/mozhg/tests/testrewrite.py
--- 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