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