[PATCH v6 08/16] remote-hg: add compat for hg-git author fixes
From: Felipe Contreras <hidden>
Date: 2016-06-15 22:55:11
Subsystem:
the rest · Maintainer:
Linus Torvalds
Signed-off-by: Felipe Contreras <redacted> --- contrib/remote-helpers/git-remote-hg | 59 ++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 6 deletions(-)
diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index d585756..9db4b7e 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg@@ -17,6 +17,7 @@ import os import json import shutil import subprocess +import urllib # # If you want to switch to hg-git compatibility mode:
@@ -35,6 +36,7 @@ import subprocess NAME_RE = re.compile('^([^<>]+)') AUTHOR_RE = re.compile('^([^<>]+?)? ?<([^<>]+)>$') +AUTHOR_HG_RE = re.compile('^(.*?) ?<(.+?)(?:>(.+)?)?$') RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.+)> (\d+) ([+-]\d+)') def die(msg, *args):
@@ -152,12 +154,20 @@ class Parser: return sys.stdin.read(size) def get_author(self): + global bad_mail + + ex = None m = RAW_AUTHOR_RE.match(self.line) if not m: return None _, name, email, date, tz = m.groups() + if name and 'ext:' in name: + m = re.match('^(.+?) ext:\((.+)\)$', name) + if m: + name = m.group(1) + ex = urllib.unquote(m.group(2)) - if email != 'unknown': + if email != bad_mail: if name: user = '%s <%s>' % (name, email) else:
@@ -165,6 +175,9 @@ class Parser: else: user = name + if ex: + user += ex + tz = int(tz) tz = ((tz / 100) * 3600) + ((tz % 100) * 60) return (user, int(date), -tz)
@@ -194,9 +207,9 @@ def get_filechanges(repo, ctx, parent): return added | modified, removed -def fixup_user(user): - user = user.replace('"', '') +def fixup_user_git(user): name = mail = None + user = user.replace('"', '') m = AUTHOR_RE.match(user) if m: name = m.group(1)
@@ -205,11 +218,41 @@ def fixup_user(user): m = NAME_RE.match(user) if m: name = m.group(1).strip() + return (name, mail) + +def fixup_user_hg(user): + def sanitize(name): + # stole this from hg-git + return re.sub('[<>\n]', '?', name.lstrip('< ').rstrip('> ')) + + m = AUTHOR_HG_RE.match(user) + if m: + name = sanitize(m.group(1)) + mail = sanitize(m.group(2)) + ex = m.group(3) + if ex: + name += ' ext:(' + urllib.quote(ex) + ')' + else: + name = sanitize(user) + if '@' in user: + mail = name + else: + mail = None + + return (name, mail) + +def fixup_user(user): + global mode, bad_mail + + if mode == 'git': + name, mail = fixup_user_git(user) + else: + name, mail = fixup_user_hg(user) if not name: - name = 'Unknown' + name = bad_name if not mail: - mail = 'unknown' + mail = bad_mail return '%s <%s>' % (name, mail)
@@ -660,7 +703,7 @@ def do_export(parser): def main(args): global prefix, dirname, branches, bmarks global marks, blob_marks, parsed_refs - global peer, mode + global peer, mode, bad_mail, bad_name alias = args[1] url = args[2]
@@ -676,8 +719,12 @@ def main(args): if hg_git_compat: mode = 'hg' + bad_mail = 'none@none' + bad_name = '' else: mode = 'git' + bad_mail = 'unknown' + bad_name = 'Unknown' if alias[4:] == url: is_tmp = True
--
1.8.0