From patchwork Fri Feb 14 00:30:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: convert: add --authormapsuffix to append set text to author names (issue4171) From: lstewart@room52.net X-Patchwork-Id: 3655 Message-Id: <2b6fdac02ea3ae0fdefa.1392337850@lgwl-lstewart2.corp.netflix.com> To: mercurial-devel@selenic.com Date: Fri, 14 Feb 2014 11:30:50 +1100 # HG changeset patch # User lstewart # Date 1392337372 -39600 # Fri Feb 14 11:22:52 2014 +1100 # Node ID 2b6fdac02ea3ae0fdefa8d0738f7df679a80dcfd # Parent 80628d4069be724089ea487a300d62f4cbd8970d convert: add --authormapsuffix to append set text to author names (issue4171) The --authormap option to convert does not provide a mechanism to template how author names should be mapped from the source to destination repository. In the absence of a more complete templating like feature, this new option allows some set text to be appended to every author name during the conversion. This is particularly useful for changing project-local usernames into globally distinguishable author identifiers e.g. by mapping "lstewart" -> "lstewart@FreeBSD.org", without first having to obtain a list of all authors in the source repository and create an authormap from that list. If --authormapsuffix is used concurrently with --authormap, the suffix is appended to post-authormap-translated names as well as non-authormap-translated names. diff -r 80628d4069be -r 2b6fdac02ea3 hgext/convert/__init__.py --- a/hgext/convert/__init__.py Fri Jan 31 01:12:35 2014 -0800 +++ b/hgext/convert/__init__.py Fri Feb 14 11:22:52 2014 +1100 @@ -85,6 +85,9 @@ Empty lines and lines starting with a ``#`` are ignored. + The authormapsuffix can be used to append set text to each + post-authormap-translated author name. + The filemap is a file that allows filtering and remapping of files and directories. Each line can contain one of the following directives:: @@ -321,6 +324,8 @@ _('import up to source revision REV'), _('REV')), ('A', 'authormap', '', _('remap usernames using this file'), _('FILE')), + ('', 'authormapsuffix', '', + _('append this suffix to remapped author names'), _('SUFFIX')), ('', 'filemap', '', _('remap file names using contents of file'), _('FILE')), ('', 'splicemap', '', diff -r 80628d4069be -r 2b6fdac02ea3 hgext/convert/convcmd.py --- a/hgext/convert/convcmd.py Fri Jan 31 01:12:35 2014 -0800 +++ b/hgext/convert/convcmd.py Fri Feb 14 11:22:52 2014 +1100 @@ -103,12 +103,15 @@ self.commitcache = {} self.authors = {} self.authorfile = None + self.authormapsuffix = '' # Record converted revisions persistently: maps source revision # ID to target revision ID (both strings). (This is how # incremental conversions work.) self.map = mapfile(ui, revmapfile) + if opts.get('authormapsuffix'): + self.authormapsuffix = opts.get('authormapsuffix') # Read first the dst author map if any authorfile = self.dest.authorfile() if authorfile and os.path.exists(authorfile): @@ -393,7 +396,7 @@ continue srcauthor = srcauthor.strip() - dstauthor = dstauthor.strip() + dstauthor = dstauthor.strip() + self.authormapsuffix if self.authors.get(srcauthor) in (None, dstauthor): msg = _('mapping author %s to %s\n') self.ui.debug(msg % (srcauthor, dstauthor)) @@ -407,7 +410,8 @@ def cachecommit(self, rev): commit = self.source.getcommit(rev) - commit.author = self.authors.get(commit.author, commit.author) + commit.author = self.authors.get(commit.author, + commit.author + self.authormapsuffix) # If commit.branch is None, this commit is coming from the source # repository's default branch and destined for the default branch in the # destination repository. For such commits, passing a literal "None" diff -r 80628d4069be -r 2b6fdac02ea3 tests/test-convert-authormap.t --- a/tests/test-convert-authormap.t Fri Jan 31 01:12:35 2014 -0800 +++ b/tests/test-convert-authormap.t Fri Feb 14 11:22:52 2014 +1100 @@ -10,6 +10,8 @@ $ cd orig $ echo foo > foo $ HGUSER='user name' hg ci -qAm 'foo' + $ echo bar > bar + $ HGUSER='user name 2' hg ci -qAm 'bar' $ cd .. Explicit --authors @@ -26,13 +28,19 @@ scanning source... sorting... converting... - 0 foo + 1 foo + 0 bar writing author map file $TESTTMP/new/.hg/authormap (glob) $ cat new/.hg/authormap user name=Long User Name $ hg -Rnew log + changeset: 1:263e7765e4b7 + tag: tip + user: user name 2 + date: Thu Jan 01 00:00:00 1970 +0000 + summary: bar + changeset: 0:d89716e88087 - tag: tip user: Long User Name date: Thu Jan 01 00:00:00 1970 +0000 summary: foo @@ -48,11 +56,73 @@ scanning source... sorting... converting... - 0 foo + 1 foo + 0 bar $ hg -Rnew log + changeset: 1:263e7765e4b7 + tag: tip + user: user name 2 + date: Thu Jan 01 00:00:00 1970 +0000 + summary: bar + changeset: 0:d89716e88087 - tag: tip user: Long User Name date: Thu Jan 01 00:00:00 1970 +0000 summary: foo + $ rm -rf new + +Use authormapsuffix together with authormap + + $ cat > authormap.txt < user name = username + > user name 2 = username2 + > EOF + $ hg convert --authormap authormap.txt --authormapsuffix '@test.org' orig new + initializing destination new repository + scanning source... + sorting... + converting... + 1 foo + 0 bar + writing author map file $TESTTMP/new/.hg/authormap + $ cat new/.hg/authormap + user name=username@test.org + user name 2=username2@test.org + $ hg -Rnew log + changeset: 1:aeeaab422b32 + tag: tip + user: username2@test.org + date: Thu Jan 01 00:00:00 1970 +0000 + summary: bar + + changeset: 0:51317d63da9e + user: username@test.org + date: Thu Jan 01 00:00:00 1970 +0000 + summary: foo + + $ rm -rf new + +Use authormapsuffix stand alone + + $ hg convert --authormapsuffix '@test.org' orig new + initializing destination new repository + scanning source... + sorting... + converting... + 1 foo + 0 bar + $ hg -Rnew log + changeset: 1:94e0dcfe3b0d + tag: tip + user: user name 2@test.org + date: Thu Jan 01 00:00:00 1970 +0000 + summary: bar + + changeset: 0:e2ff155c86b8 + user: user name@test.org + date: Thu Jan 01 00:00:00 1970 +0000 + summary: foo + + $ rm -rf new +