To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / extra / fast-export / hg2git.py @ 1557:9d6d2f696782

History | View | Annotate | Download (3.32 KB)

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