Mercurial > hg > soundsoftware-site
comparison extra/fast-export/hg2git.py @ 1544:e9e55585ebf2 feature_1136
Add fast-export
author | Chris Cannam <chris.cannam@soundsoftware.ac.uk> |
---|---|
date | Tue, 12 Jan 2016 13:39:30 +0000 |
parents | |
children | 3ad53f43483d |
comparison
equal
deleted
inserted
replaced
1542:60acfbd8f6d6 | 1544:e9e55585ebf2 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 # Copyright (c) 2007, 2008 Rocco Rutte <pdmef@gmx.net> and others. | |
4 # License: MIT <http://www.opensource.org/licenses/mit-license.php> | |
5 | |
6 from mercurial import hg,util,ui,templatefilters | |
7 import re | |
8 import os | |
9 import sys | |
10 | |
11 # default git branch name | |
12 cfg_master='master' | |
13 # default origin name | |
14 origin_name='' | |
15 # silly regex to see if user field has email address | |
16 user_re=re.compile('([^<]+) (<[^>]*>)$') | |
17 # silly regex to clean out user names | |
18 user_clean_re=re.compile('^["]([^"]+)["]$') | |
19 | |
20 def set_default_branch(name): | |
21 global cfg_master | |
22 cfg_master = name | |
23 | |
24 def set_origin_name(name): | |
25 global origin_name | |
26 origin_name = name | |
27 | |
28 def setup_repo(url): | |
29 try: | |
30 myui=ui.ui(interactive=False) | |
31 except TypeError: | |
32 myui=ui.ui() | |
33 myui.setconfig('ui', 'interactive', 'off') | |
34 return myui,hg.repository(myui,url) | |
35 | |
36 def fixup_user(user,authors): | |
37 user=user.strip("\"") | |
38 if authors!=None: | |
39 # if we have an authors table, try to get mapping | |
40 # by defaulting to the current value of 'user' | |
41 user=authors.get(user,user) | |
42 name,mail,m='','',user_re.match(user) | |
43 if m==None: | |
44 # if we don't have 'Name <mail>' syntax, extract name | |
45 # and mail from hg helpers. this seems to work pretty well. | |
46 # if email doesn't contain @, replace it with devnull@localhost | |
47 name=templatefilters.person(user) | |
48 mail='<%s>' % util.email(user) | |
49 if '@' not in mail: | |
50 mail = '<devnull@localhost>' | |
51 else: | |
52 # if we have 'Name <mail>' syntax, everything is fine :) | |
53 name,mail=m.group(1),m.group(2) | |
54 | |
55 # remove any silly quoting from username | |
56 m2=user_clean_re.match(name) | |
57 if m2!=None: | |
58 name=m2.group(1) | |
59 return '%s %s' % (name,mail) | |
60 | |
61 def get_branch(name): | |
62 # 'HEAD' is the result of a bug in mutt's cvs->hg conversion, | |
63 # other CVS imports may need it, too | |
64 if name=='HEAD' or name=='default' or name=='': | |
65 name=cfg_master | |
66 if origin_name: | |
67 return origin_name + '/' + name | |
68 return name | |
69 | |
70 def get_changeset(ui,repo,revision,authors={},encoding=''): | |
71 node=repo.lookup(revision) | |
72 (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node) | |
73 if encoding: | |
74 user=user.decode(encoding).encode('utf8') | |
75 desc=desc.decode(encoding).encode('utf8') | |
76 tz="%+03d%02d" % (-timezone / 3600, ((-timezone % 3600) / 60)) | |
77 branch=get_branch(extra.get('branch','master')) | |
78 return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra) | |
79 | |
80 def mangle_key(key): | |
81 return key | |
82 | |
83 def load_cache(filename,get_key=mangle_key): | |
84 cache={} | |
85 if not os.path.exists(filename): | |
86 return cache | |
87 f=open(filename,'r') | |
88 l=0 | |
89 for line in f.readlines(): | |
90 l+=1 | |
91 fields=line.split(' ') | |
92 if fields==None or not len(fields)==2 or fields[0][0]!=':': | |
93 sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l)) | |
94 continue | |
95 # put key:value in cache, key without ^: | |
96 cache[get_key(fields[0][1:])]=fields[1].split('\n')[0] | |
97 f.close() | |
98 return cache | |
99 | |
100 def save_cache(filename,cache): | |
101 f=open(filename,'w+') | |
102 map(lambda x: f.write(':%s %s\n' % (str(x),str(cache.get(x)))),cache.keys()) | |
103 f.close() | |
104 | |
105 def get_git_sha1(name,type='heads'): | |
106 try: | |
107 # use git-rev-parse to support packed refs | |
108 cmd="git rev-parse --verify refs/%s/%s 2>%s" % (type,name,os.devnull) | |
109 p=os.popen(cmd) | |
110 l=p.readline() | |
111 p.close() | |
112 if l == None or len(l) == 0: | |
113 return None | |
114 return l[0:40] | |
115 except IOError: | |
116 return None |