[PATCH] convert: replace old sha1s in the description

Angel Ezquerra angel.ezquerra at gmail.com
Wed Mar 27 18:55:33 CDT 2013


On Thu, Mar 28, 2013 at 12:45 AM, Sean Farley
<sean.michael.farley at gmail.com> wrote:
>
> Angel Ezquerra writes:
>
>> On Wed, Mar 27, 2013 at 11:42 PM, Sean Farley
>> <sean.michael.farley at gmail.com> wrote:
>>> # HG changeset patch
>>> # User Sean Farley <sean.michael.farley at gmail.com>
>>> # Date 1363449738 18000
>>> #      Sat Mar 16 11:02:18 2013 -0500
>>> # Node ID d7639b2cb14271ab88ed71ecb3ce0a7595d41d25
>>> # Parent  3839baf52f2f24c289487111a95e9e835d1e1c4d
>>> convert: replace old sha1s in the description
>>>
>>> This is a simple find-and-replace strategy for matching anything in the
>>> old description of a converted commit and, if that matched sha1 exists
>>> in the mapping, replacing it with the new sha1.
>>>
>>> In particular, this is helpful for descriptions that contain tags with
>>> messages such as, "Added tag 1.0 for commit abcde1234567" which will now
>>> be automatically converted.
>>>
>>> Tests have been updated accordingly.
>>>
>>> diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
>>> --- a/hgext/convert/hg.py
>>> +++ b/hgext/convert/hg.py
>>> @@ -23,10 +23,13 @@
>>>  from mercurial.node import bin, hex, nullid
>>>  from mercurial import hg, util, context, bookmarks, error
>>>
>>>  from common import NoRepo, commit, converter_source, converter_sink
>>>
>>> +import re
>>> +sha1re = re.compile(r'\b[0-9a-f]{12,40}\b')
>>> +
>>>  class mercurial_sink(converter_sink):
>>>      def __init__(self, ui, path):
>>>          converter_sink.__init__(self, ui, path)
>>>          self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
>>>          self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
>>> @@ -155,10 +158,18 @@
>>>          if len(parents) < 2:
>>>              parents.append(nullid)
>>>          p2 = parents.pop(0)
>>>
>>>          text = commit.desc
>>> +
>>> +        sha1s = re.findall(sha1re, text)
>>> +        for sha1 in sha1s:
>>> +            oldrev = source.lookuprev(sha1)
>>> +            newrev = revmap.get(oldrev)
>>> +            if newrev is not None:
>>> +                text = text.replace(sha1, newrev[:len(sha1)])
>>> +
>>>          extra = commit.extra.copy()
>>>          if self.branchnames and commit.branch:
>>>              extra['branch'] = commit.branch
>>>          if commit.rev:
>>>              extra['convert_revision'] = commit.rev
>>> diff --git a/tests/test-convert-hg-sink.t b/tests/test-convert-hg-sink.t
>>> --- a/tests/test-convert-hg-sink.t
>>> +++ b/tests/test-convert-hg-sink.t
>>> @@ -117,8 +117,8 @@
>>>    2 add foo/file
>>>    1 Added tag some-tag for changeset ad681a868e44
>>>    0 add baz
>>>    $ cd new-filemap
>>>    $ hg tags
>>> -  tip                                2:6f4fd1df87fb
>>> +  tip                                2:3c74706b1ff8
>>>    some-tag                           0:ba8636729451
>>>    $ cd ..
>>
>> +1 to this. This would have come very, very handy this week, where
>> I've had to manually redo a few converted repos because the "tag
>> commits" had the wrong message.
>
> Thanks :-)
>
>> What about actually "retagging" the repo during conversion? That is,
>> if a commit that only modifies the .hgtags file is found, try to
>> replicate it by running "hg tag" on the target repo...
>>
>> Note that I know next to nothing about the internals of hgext/convert
>> so this may not be possible...
>
> What exactly are you trying to accomplish? Renaming the tags? If so,
> Martin wrote a good starting point here:
>
> http://stackoverflow.com/questions/7866379/renaming-tags-while-converting-a-mercurial-repository

That's a pretty complete answer. It is a pity that Martin never got to
send it to the list, or did he?

Angel


More information about the Mercurial-devel mailing list