remote-hg: add compat for hg-git author fixes

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Jeff King <peff@peff.net>

Felipe Contreras committed Nov 4, 2012 at 03:13 UTC 9490bd04fef0e0f04efa4679668f0a05328768e4
1 file changed +53 -6
contrib/remote-helpers/git-remote-hg
+53 -6
@@ -17,6 +17,7 @@ import os
17 import json
18 import shutil
19 import subprocess
20 +import urllib
21
22 #
23 # If you want to switch to hg-git compatibility mode:
@@ -35,6 +36,7 @@ import subprocess
36
37 NAME_RE = re.compile('^([^<>]+)')
38 AUTHOR_RE = re.compile('^([^<>]+?)? ?<([^<>]+)>$')
39 +AUTHOR_HG_RE = re.compile('^(.*?) ?<(.+?)(?:>(.+)?)?$')
40 RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.+)> (\d+) ([+-]\d+)')
41
42 def die(msg, *args):
@@ -152,12 +154,20 @@ class Parser:
154 return sys.stdin.read(size)
155
156 def get_author(self):
157 + global bad_mail
158 +
159 + ex = None
160 m = RAW_AUTHOR_RE.match(self.line)
161 if not m:
162 return None
163 _, name, email, date, tz = m.groups()
164 + if name and 'ext:' in name:
165 + m = re.match('^(.+?) ext:\((.+)\)$', name)
166 + if m:
167 + name = m.group(1)
168 + ex = urllib.unquote(m.group(2))
169
160 - if email != 'unknown':
170 + if email != bad_mail:
171 if name:
172 user = '%s <%s>' % (name, email)
173 else:
@@ -165,6 +175,9 @@ class Parser:
175 else:
176 user = name
177
178 + if ex:
179 + user += ex
180 +
181 tz = int(tz)
182 tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
183 return (user, int(date), -tz)
@@ -194,9 +207,9 @@ def get_filechanges(repo, ctx, parent):
207
208 return added | modified, removed
209
197 -def fixup_user(user):
198 - user = user.replace('"', '')
210 +def fixup_user_git(user):
211 name = mail = None
212 + user = user.replace('"', '')
213 m = AUTHOR_RE.match(user)
214 if m:
215 name = m.group(1)
@@ -205,11 +218,41 @@ def fixup_user(user):
218 m = NAME_RE.match(user)
219 if m:
220 name = m.group(1).strip()
221 + return (name, mail)
222 +
223 +def fixup_user_hg(user):
224 + def sanitize(name):
225 + # stole this from hg-git
226 + return re.sub('[<>\n]', '?', name.lstrip('< ').rstrip('> '))
227 +
228 + m = AUTHOR_HG_RE.match(user)
229 + if m:
230 + name = sanitize(m.group(1))
231 + mail = sanitize(m.group(2))
232 + ex = m.group(3)
233 + if ex:
234 + name += ' ext:(' + urllib.quote(ex) + ')'
235 + else:
236 + name = sanitize(user)
237 + if '@' in user:
238 + mail = name
239 + else:
240 + mail = None
241 +
242 + return (name, mail)
243 +
244 +def fixup_user(user):
245 + global mode, bad_mail
246 +
247 + if mode == 'git':
248 + name, mail = fixup_user_git(user)
249 + else:
250 + name, mail = fixup_user_hg(user)
251
252 if not name:
210 - name = 'Unknown'
253 + name = bad_name
254 if not mail:
212 - mail = 'unknown'
255 + mail = bad_mail
256
257 return '%s <%s>' % (name, mail)
258
@@ -660,7 +703,7 @@ def do_export(parser):
703 def main(args):
704 global prefix, dirname, branches, bmarks
705 global marks, blob_marks, parsed_refs
663 - global peer, mode
706 + global peer, mode, bad_mail, bad_name
707
708 alias = args[1]
709 url = args[2]
@@ -676,8 +719,12 @@ def main(args):
719
720 if hg_git_compat:
721 mode = 'hg'
722 + bad_mail = 'none@none'
723 + bad_name = ''
724 else:
725 mode = 'git'
726 + bad_mail = 'unknown'
727 + bad_name = 'Unknown'
728
729 if alias[4:] == url:
730 is_tmp = True