mirror of
https://github.com/frej/fast-export.git
synced 2025-11-02 17:25:48 +01:00
Add hg2git.py with library routines
Unfortunately, I can't do 'import hg-fast-export' from python itself, so we need to move some common methods into 'hg2git.py' which is to be used as a library for common hg->git routines. Signed-off-by: Rocco Rutte <pdmef@gmx.net>
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
|
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
|
||||||
|
|
||||||
from mercurial import repo,hg,cmdutil,util,ui,revlog,node
|
from mercurial import repo,hg,cmdutil,util,ui,revlog,node
|
||||||
|
from hg2git import setup_repo,fixup_user,get_branch,get_changeset,load_cache,save_cache
|
||||||
from tempfile import mkstemp
|
from tempfile import mkstemp
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
import re
|
import re
|
||||||
@@ -12,58 +13,11 @@ import os
|
|||||||
|
|
||||||
# silly regex to catch Signed-off-by lines in log message
|
# silly regex to catch Signed-off-by lines in log message
|
||||||
sob_re=re.compile('^Signed-[Oo]ff-[Bb]y: (.+)$')
|
sob_re=re.compile('^Signed-[Oo]ff-[Bb]y: (.+)$')
|
||||||
# silly regex to see if user field has email address
|
|
||||||
user_re=re.compile('([^<]+) (<[^>]+>)$')
|
|
||||||
# silly regex to clean out user names
|
|
||||||
user_clean_re=re.compile('^["]([^"]+)["]$')
|
|
||||||
# git branch for hg's default 'HEAD' branch
|
|
||||||
cfg_master='master'
|
|
||||||
# insert 'checkpoint' command after this many commits or none at all if 0
|
# insert 'checkpoint' command after this many commits or none at all if 0
|
||||||
cfg_checkpoint_count=0
|
cfg_checkpoint_count=0
|
||||||
# write some progress message every this many file contents written
|
# write some progress message every this many file contents written
|
||||||
cfg_export_boundary=1000
|
cfg_export_boundary=1000
|
||||||
|
|
||||||
def setup_repo(url):
|
|
||||||
myui=ui.ui()
|
|
||||||
return myui,hg.repository(myui,url)
|
|
||||||
|
|
||||||
def fixup_user(user,authors):
|
|
||||||
if authors!=None:
|
|
||||||
# if we have an authors table, try to get mapping
|
|
||||||
# by defaulting to the current value of 'user'
|
|
||||||
user=authors.get(user,user)
|
|
||||||
name,mail,m='','',user_re.match(user)
|
|
||||||
if m==None:
|
|
||||||
# if we don't have 'Name <mail>' syntax, use 'user
|
|
||||||
# <devnull@localhost>' if use contains no at and
|
|
||||||
# 'user <user>' otherwise
|
|
||||||
name=user
|
|
||||||
if '@' not in user:
|
|
||||||
mail='<devnull@localhost>'
|
|
||||||
else:
|
|
||||||
mail='<%s>' % user
|
|
||||||
else:
|
|
||||||
# if we have 'Name <mail>' syntax, everything is fine :)
|
|
||||||
name,mail=m.group(1),m.group(2)
|
|
||||||
|
|
||||||
# remove any silly quoting from username
|
|
||||||
m2=user_clean_re.match(name)
|
|
||||||
if m2!=None:
|
|
||||||
name=m2.group(1)
|
|
||||||
return '%s %s' % (name,mail)
|
|
||||||
|
|
||||||
def get_branch(name):
|
|
||||||
if name=='HEAD':
|
|
||||||
name=cfg_master
|
|
||||||
return name
|
|
||||||
|
|
||||||
def get_changeset(ui,repo,revision,authors={}):
|
|
||||||
node=repo.lookup(revision)
|
|
||||||
(manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node)
|
|
||||||
tz="%+03d%02d" % (-timezone / 3600, ((-timezone % 3600) / 60))
|
|
||||||
branch=get_branch(extra.get('branch','master'))
|
|
||||||
return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra)
|
|
||||||
|
|
||||||
def gitmode(x):
|
def gitmode(x):
|
||||||
return x and '100755' or '100644'
|
return x and '100755' or '100644'
|
||||||
|
|
||||||
@@ -305,28 +259,6 @@ def load_authors(filename):
|
|||||||
sys.stderr.write('Loaded %d authors\n' % l)
|
sys.stderr.write('Loaded %d authors\n' % l)
|
||||||
return cache
|
return cache
|
||||||
|
|
||||||
def load_cache(filename):
|
|
||||||
cache={}
|
|
||||||
if not os.path.exists(filename):
|
|
||||||
return cache
|
|
||||||
f=open(filename,'r')
|
|
||||||
l=0
|
|
||||||
for line in f.readlines():
|
|
||||||
l+=1
|
|
||||||
fields=line.split(' ')
|
|
||||||
if fields==None or not len(fields)==2 or fields[0][0]!=':':
|
|
||||||
sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l))
|
|
||||||
continue
|
|
||||||
# put key:value in cache, key without ^:
|
|
||||||
cache[fields[0][1:]]=fields[1].split('\n')[0]
|
|
||||||
f.close()
|
|
||||||
return cache
|
|
||||||
|
|
||||||
def save_cache(filename,cache):
|
|
||||||
f=open(filename,'w+')
|
|
||||||
map(lambda x: f.write(':%s %s\n' % (str(x),str(cache.get(x)))),cache.keys())
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
def verify_heads(ui,repo,cache,force):
|
def verify_heads(ui,repo,cache,force):
|
||||||
def getsha1(branch):
|
def getsha1(branch):
|
||||||
try:
|
try:
|
||||||
|
|||||||
78
hg2git.py
Executable file
78
hg2git.py
Executable file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# Copyright (c) 2007 Rocco Rutte <pdmef@gmx.net>
|
||||||
|
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
|
||||||
|
|
||||||
|
from mercurial import repo,hg,cmdutil,util,ui,revlog,node
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
# git branch for hg's default 'HEAD' branch
|
||||||
|
cfg_master='master'
|
||||||
|
# silly regex to see if user field has email address
|
||||||
|
user_re=re.compile('([^<]+) (<[^>]+>)$')
|
||||||
|
# silly regex to clean out user names
|
||||||
|
user_clean_re=re.compile('^["]([^"]+)["]$')
|
||||||
|
|
||||||
|
def setup_repo(url):
|
||||||
|
myui=ui.ui(interactive=False)
|
||||||
|
return myui,hg.repository(myui,url)
|
||||||
|
|
||||||
|
def fixup_user(user,authors):
|
||||||
|
if authors!=None:
|
||||||
|
# if we have an authors table, try to get mapping
|
||||||
|
# by defaulting to the current value of 'user'
|
||||||
|
user=authors.get(user,user)
|
||||||
|
name,mail,m='','',user_re.match(user)
|
||||||
|
if m==None:
|
||||||
|
# if we don't have 'Name <mail>' syntax, use 'user
|
||||||
|
# <devnull@localhost>' if use contains no at and
|
||||||
|
# 'user <user>' otherwise
|
||||||
|
name=user
|
||||||
|
if '@' not in user:
|
||||||
|
mail='<devnull@localhost>'
|
||||||
|
else:
|
||||||
|
mail='<%s>' % user
|
||||||
|
else:
|
||||||
|
# if we have 'Name <mail>' syntax, everything is fine :)
|
||||||
|
name,mail=m.group(1),m.group(2)
|
||||||
|
|
||||||
|
# remove any silly quoting from username
|
||||||
|
m2=user_clean_re.match(name)
|
||||||
|
if m2!=None:
|
||||||
|
name=m2.group(1)
|
||||||
|
return '%s %s' % (name,mail)
|
||||||
|
|
||||||
|
def get_branch(name):
|
||||||
|
if name=='HEAD':
|
||||||
|
name=cfg_master
|
||||||
|
return name
|
||||||
|
|
||||||
|
def get_changeset(ui,repo,revision,authors={}):
|
||||||
|
node=repo.lookup(revision)
|
||||||
|
(manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node)
|
||||||
|
tz="%+03d%02d" % (-timezone / 3600, ((-timezone % 3600) / 60))
|
||||||
|
branch=get_branch(extra.get('branch','master'))
|
||||||
|
return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra)
|
||||||
|
|
||||||
|
def load_cache(filename):
|
||||||
|
cache={}
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
return cache
|
||||||
|
f=open(filename,'r')
|
||||||
|
l=0
|
||||||
|
for line in f.readlines():
|
||||||
|
l+=1
|
||||||
|
fields=line.split(' ')
|
||||||
|
if fields==None or not len(fields)==2 or fields[0][0]!=':':
|
||||||
|
sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l))
|
||||||
|
continue
|
||||||
|
# put key:value in cache, key without ^:
|
||||||
|
cache[fields[0][1:]]=fields[1].split('\n')[0]
|
||||||
|
f.close()
|
||||||
|
return cache
|
||||||
|
|
||||||
|
def save_cache(filename,cache):
|
||||||
|
f=open(filename,'w+')
|
||||||
|
map(lambda x: f.write(':%s %s\n' % (str(x),str(cache.get(x)))),cache.keys())
|
||||||
|
f.close()
|
||||||
Reference in New Issue
Block a user