From patchwork Sun Aug 10 04:13:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2, of, 2, evolve-ext] evolve: replace each obsolete sha1 in the description with its latest successor From: Matt Harbison X-Patchwork-Id: 5335 Message-Id: <6e20d95da8ace63e621f.1407643983@Envy> To: mercurial-devel@selenic.com Date: Sun, 10 Aug 2014 00:13:03 -0400 # HG changeset patch # User Matt Harbison # Date 1407625936 14400 # Sat Aug 09 19:12:16 2014 -0400 # Node ID 6e20d95da8ace63e621f63a59d8b1426e227eaee # Parent 66f4c5c52d970f145cd218ceed065c3fe096631d evolve: replace each obsolete sha1 in the description with its latest successor Obsolete csets are hidden by default and don't get pushed to the parent repo. In order to avoid broken references in commit messages, it makes sense to evolve those references to the latest and greatest successor, as each cset containing them is evolved. This alleviates the user that is evolving a series of commits from having to 1) recognize that there is a hash that needs updating in any one of the series 2) look up the latest successor manually 3) hg amend -e The regular expression for matching and the logic for replacing are borrowed from 45562379ce4e in the convert extension. diff --git a/hgext/evolve.py b/hgext/evolve.py --- a/hgext/evolve.py +++ b/hgext/evolve.py @@ -27,6 +27,8 @@ from StringIO import StringIO import struct import urllib +import re +sha1re = re.compile(r'\b[0-9a-f]{6,40}\b') import mercurial from mercurial import util @@ -856,6 +858,21 @@ destbookmarks = repo.nodebookmarks(dest.node()) nodesrc = orig.node() destphase = repo[nodesrc].phase() + commitmsg = orig.description() + + sha1s = re.findall(sha1re, commitmsg) + for sha1 in sha1s: + try: + if not repo[sha1].obsolete(): + continue + except error.RepoLookupError: + continue + + # There will be at most 1, but may be none if the successor was stripped + for successor in repo.set('last(allsuccessors(%s))', sha1): + newsha1 = successor.hex() + commitmsg = commitmsg.replace(sha1, newsha1[:len(sha1)]) + tr = repo.transaction('relocate') try: try: @@ -866,7 +883,7 @@ 'unresolved merge conflicts (see hg help resolve)') cmdutil.duplicatecopies(repo, orig.node(), dest.node()) nodenew = rebase.concludenode(repo, orig.node(), dest.node(), - node.nullid) + node.nullid, commitmsg) except util.Abort, exc: class LocalMergeFailure(MergeFailure, exc.__class__): pass diff --git a/tests/test-evolve.t b/tests/test-evolve.t --- a/tests/test-evolve.t +++ b/tests/test-evolve.t @@ -271,7 +271,7 @@ atop:[6] a nifty feature merging main-file-1 $ hg log - 7 feature-B: another feature (child of 568a468b60fc) - test + 7 feature-B: another feature (child of ba0ec09b1bab) - test 6 feature-A: a nifty feature - test 0 : base - test @@ -300,7 +300,7 @@ $ hg glog @ 8 feature-B: another feature that rox - test | - | o 7 : another feature (child of 568a468b60fc) - test + | o 7 : another feature (child of ba0ec09b1bab) - test |/ o 6 feature-A: a nifty feature - test | @@ -308,13 +308,13 @@ $ hg evolve --any --traceback recreate:[8] another feature that rox - atop:[7] another feature (child of 568a468b60fc) + atop:[7] another feature (child of ba0ec09b1bab) computing new diff - committed as 8234cfce9af9 + committed as 476d0454d60e $ hg glog - @ 9 feature-B: bumped update to 5b410c3ae5af: - test + @ 9 feature-B: bumped update to 5c9c8d9c2e4e: - test | - o 7 : another feature (child of 568a468b60fc) - test + o 7 : another feature (child of ba0ec09b1bab) - test | o 6 feature-A: a nifty feature - test | @@ -376,7 +376,7 @@ | o 13 feature-B: dansk! - test | - o 7 : another feature (child of 568a468b60fc) - test + o 7 : another feature (child of ba0ec09b1bab) - test | o 6 feature-A: a nifty feature - test | @@ -743,11 +743,11 @@ 2 changesets folded 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ glog - @ 16:d0aee199f74c@default(draft) Folding with custom commit message + @ 16:d6239ff09c9f@default(draft) Folding with custom commit message | - o 13:b0258f43f9d0@default(draft) dansk! + o 13:56ade053f46d@default(draft) dansk! | - o 7:5b410c3ae5af@default(public) another feature (child of 568a468b60fc) + o 7:5c9c8d9c2e4e@default(public) another feature (child of ba0ec09b1bab) | o 6:ba0ec09b1bab@default(public) a nifty feature | @@ -762,8 +762,8 @@ 2 changesets folded 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg qlog - 17 - bf2fd466ccd4 A longer + 17 - dba606655966 A longer commit message (draft) - 7 - 5b410c3ae5af another feature (child of 568a468b60fc) (public) + 7 - 5c9c8d9c2e4e another feature (child of ba0ec09b1bab) (public) 6 - ba0ec09b1bab a nifty feature (public) 0 - e55e0562ee93 base (public)