[PATCH 2 of 2 evolve-ext] evolve: replace each obsolete sha1 in the description with its latest successor
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sun Aug 10 02:28:47 CDT 2014
On 08/09/2014 09:13 PM, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # 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
The feature looks awesome. Thanks. I've some feedback on the implementation.
> 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():
You are looking the node into a filtered repo. We could have the node
obsoleted but hidden. But see the other comment below.
> + 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)])
> +
There is a dedicated function to find the list of sets of successors.
This function have the good idea to take a raw node (So it works even
with hidden and missing changesets). Have a look at its documentation.
mercurial.obsolete.successorssets
(Note that this function does not take in account phases so it may be
needs some improvement.)
> 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 at default(draft) Folding with custom commit message
> + @ 16:d6239ff09c9f at default(draft) Folding with custom commit message
> |
> - o 13:b0258f43f9d0 at default(draft) dansk!
> + o 13:56ade053f46d at default(draft) dansk!
> |
> - o 7:5b410c3ae5af at default(public) another feature (child of 568a468b60fc)
> + o 7:5c9c8d9c2e4e at default(public) another feature (child of ba0ec09b1bab)
> |
> o 6:ba0ec09b1bab at 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)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list