hg2git.py: Map 'HEAD', 'default' and '' hg branches to 'master' in git
[fast-export/dharding.git] / hg2git.py
blobaa6ad700440b344ea944c3fd9a68b982a8486508
1 #!/usr/bin/env python
3 # Copyright (c) 2007 Rocco Rutte <pdmef@gmx.net>
4 # License: MIT <http://www.opensource.org/licenses/mit-license.php>
6 from mercurial import repo,hg,cmdutil,util,ui,revlog,node
7 import re
8 import os
10 # git branch for hg's default 'HEAD' branch
11 cfg_master='master'
12 # silly regex to see if user field has email address
13 user_re=re.compile('([^<]+) (<[^>]+>)$')
14 # silly regex to clean out user names
15 user_clean_re=re.compile('^["]([^"]+)["]$')
17 def setup_repo(url):
18 myui=ui.ui(interactive=False)
19 return myui,hg.repository(myui,url)
21 def fixup_user(user,authors):
22 if authors!=None:
23 # if we have an authors table, try to get mapping
24 # by defaulting to the current value of 'user'
25 user=authors.get(user,user)
26 name,mail,m='','',user_re.match(user)
27 if m==None:
28 # if we don't have 'Name <mail>' syntax, use 'user
29 # <devnull@localhost>' if use contains no at and
30 # 'user <user>' otherwise
31 name=user
32 if '@' not in user:
33 mail='<devnull@localhost>'
34 else:
35 mail='<%s>' % user
36 else:
37 # if we have 'Name <mail>' syntax, everything is fine :)
38 name,mail=m.group(1),m.group(2)
40 # remove any silly quoting from username
41 m2=user_clean_re.match(name)
42 if m2!=None:
43 name=m2.group(1)
44 return '%s %s' % (name,mail)
46 def get_branch(name):
47 # HEAD may be from CVS imports into hg
48 if name=='HEAD' or name=='default' or name=='':
49 name=cfg_master
50 return name
52 def get_changeset(ui,repo,revision,authors={}):
53 node=repo.lookup(revision)
54 (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node)
55 tz="%+03d%02d" % (-timezone / 3600, ((-timezone % 3600) / 60))
56 branch=get_branch(extra.get('branch','master'))
57 return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra)
59 def load_cache(filename):
60 cache={}
61 if not os.path.exists(filename):
62 return cache
63 f=open(filename,'r')
64 l=0
65 for line in f.readlines():
66 l+=1
67 fields=line.split(' ')
68 if fields==None or not len(fields)==2 or fields[0][0]!=':':
69 sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l))
70 continue
71 # put key:value in cache, key without ^:
72 cache[fields[0][1:]]=fields[1].split('\n')[0]
73 f.close()
74 return cache
76 def save_cache(filename,cache):
77 f=open(filename,'w+')
78 map(lambda x: f.write(':%s %s\n' % (str(x),str(cache.get(x)))),cache.keys())
79 f.close()
81 def get_git_sha1(name,type='heads'):
82 try:
83 f=open(os.getenv('GIT_DIR','/dev/null')+'/refs/'+type+'/'+name)
84 sha1=f.readlines()[0].split('\n')[0]
85 f.close()
86 return sha1
87 except IOError:
88 return None