mirror of
https://github.com/frej/fast-export.git
synced 2025-11-01 00:45:47 +01:00
126 lines
3.8 KiB
Python
Executable File
126 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# Copyright (c) 2007, 2008 Rocco Rutte <pdmef@gmx.net> and others.
|
|
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
|
|
|
|
from mercurial import hg,util,ui,templatefilters
|
|
from mercurial import error as hgerror
|
|
from mercurial.scmutil import binnode
|
|
|
|
import re
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
|
|
# default git branch name
|
|
cfg_master=b'master'
|
|
# default origin name
|
|
origin_name=b''
|
|
# silly regex to see if user field has email address
|
|
user_re=re.compile(b'([^<]+) (<[^>]*>)$')
|
|
# silly regex to clean out user names
|
|
user_clean_re=re.compile(b'^["]([^"]+)["]$')
|
|
|
|
def set_default_branch(name):
|
|
global cfg_master
|
|
cfg_master = name.encode('utf8') if not isinstance(name, bytes) else name
|
|
|
|
def set_origin_name(name):
|
|
global origin_name
|
|
origin_name = name
|
|
|
|
def setup_repo(url):
|
|
try:
|
|
myui=ui.ui(interactive=False)
|
|
except TypeError:
|
|
myui=ui.ui()
|
|
myui.setconfig(b'ui', b'interactive', b'off')
|
|
# Avoids a warning when the repository has obsolete markers
|
|
myui.setconfig(b'experimental', b'evolution.createmarkers', True)
|
|
return myui,hg.repository(myui, os.fsencode(url)).unfiltered()
|
|
|
|
def fixup_user(user,authors):
|
|
user=user.strip(b"\"")
|
|
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=b'',b'',user_re.match(user)
|
|
if m==None:
|
|
# if we don't have 'Name <mail>' syntax, extract name
|
|
# and mail from hg helpers. this seems to work pretty well.
|
|
# if email doesn't contain @, replace it with devnull@localhost
|
|
name=templatefilters.person(user)
|
|
mail=b'<%s>' % templatefilters.email(user)
|
|
if b'@' not in mail:
|
|
mail = b'<devnull@localhost>'
|
|
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 b'%s %s' % (name,mail)
|
|
|
|
def get_branch(name):
|
|
# 'HEAD' is the result of a bug in mutt's cvs->hg conversion,
|
|
# other CVS imports may need it, too
|
|
if name==b'HEAD' or name==b'default' or name==b'':
|
|
name=cfg_master
|
|
if origin_name:
|
|
return origin_name + b'/' + name
|
|
return name
|
|
|
|
def get_changeset(ui,repo,revision,authors={},encoding=''):
|
|
(manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(revision)
|
|
if encoding:
|
|
user=user.decode(encoding).encode('utf8')
|
|
desc=desc.decode(encoding).encode('utf8')
|
|
tz=b"%+03d%02d" % (-timezone // 3600, ((-timezone % 3600) // 60))
|
|
branch=get_branch(extra.get(b'branch', b''))
|
|
return (manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra)
|
|
|
|
def mangle_key(key):
|
|
return key
|
|
|
|
def load_cache(filename,get_key=mangle_key):
|
|
cache={}
|
|
if not os.path.exists(filename):
|
|
return cache
|
|
f=open(filename,'rb')
|
|
l=0
|
|
for line in f.readlines():
|
|
l+=1
|
|
fields=line.split(b' ')
|
|
if fields==None or not len(fields)==2 or fields[0][0:1]!=b':':
|
|
sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l))
|
|
continue
|
|
# put key:value in cache, key without ^:
|
|
cache[get_key(fields[0][1:])]=fields[1].split(b'\n')[0]
|
|
f.close()
|
|
return cache
|
|
|
|
def save_cache(filename,cache):
|
|
f=open(filename,'wb')
|
|
for key, value in cache.items():
|
|
if not isinstance(key, bytes):
|
|
key = str(key).encode('utf8')
|
|
if not isinstance(value, bytes):
|
|
value = str(value).encode('utf8')
|
|
f.write(b':%s %s\n' % (key, value))
|
|
f.close()
|
|
|
|
def get_git_sha1(name,type='heads'):
|
|
try:
|
|
# use git-rev-parse to support packed refs
|
|
ref="refs/%s/%s" % (type,name.decode('utf8'))
|
|
l=subprocess.check_output(["git", "rev-parse", "--verify",
|
|
"--quiet", ref.encode('utf8')])
|
|
if l == None or len(l) == 0:
|
|
return None
|
|
return l[0:40]
|
|
except subprocess.CalledProcessError:
|
|
return None
|