chris@1544: #!/usr/bin/env python chris@1544: chris@1544: # Copyright (c) 2007, 2008 Rocco Rutte and others. chris@1544: # License: MIT chris@1544: chris@1544: from mercurial import hg,util,ui,templatefilters chris@1544: import re chris@1544: import os chris@1544: import sys Chris@1567: import subprocess chris@1544: chris@1544: # default git branch name chris@1544: cfg_master='master' chris@1544: # default origin name chris@1544: origin_name='' chris@1544: # silly regex to see if user field has email address chris@1544: user_re=re.compile('([^<]+) (<[^>]*>)$') chris@1544: # silly regex to clean out user names chris@1544: user_clean_re=re.compile('^["]([^"]+)["]$') chris@1544: chris@1544: def set_default_branch(name): chris@1544: global cfg_master chris@1544: cfg_master = name chris@1544: chris@1544: def set_origin_name(name): chris@1544: global origin_name chris@1544: origin_name = name chris@1544: chris@1544: def setup_repo(url): chris@1544: try: chris@1544: myui=ui.ui(interactive=False) chris@1544: except TypeError: chris@1544: myui=ui.ui() chris@1544: myui.setconfig('ui', 'interactive', 'off') chris@1544: return myui,hg.repository(myui,url) chris@1544: chris@1544: def fixup_user(user,authors): chris@1544: user=user.strip("\"") chris@1544: if authors!=None: chris@1544: # if we have an authors table, try to get mapping chris@1544: # by defaulting to the current value of 'user' chris@1544: user=authors.get(user,user) chris@1544: name,mail,m='','',user_re.match(user) chris@1544: if m==None: chris@1544: # if we don't have 'Name ' syntax, extract name chris@1544: # and mail from hg helpers. this seems to work pretty well. chris@1544: # if email doesn't contain @, replace it with devnull@localhost chris@1544: name=templatefilters.person(user) chris@1544: mail='<%s>' % util.email(user) chris@1544: if '@' not in mail: chris@1544: mail = '' chris@1544: else: chris@1544: # if we have 'Name ' syntax, everything is fine :) chris@1544: name,mail=m.group(1),m.group(2) chris@1544: chris@1544: # remove any silly quoting from username chris@1544: m2=user_clean_re.match(name) chris@1544: if m2!=None: chris@1544: name=m2.group(1) chris@1544: return '%s %s' % (name,mail) chris@1544: chris@1544: def get_branch(name): chris@1544: # 'HEAD' is the result of a bug in mutt's cvs->hg conversion, chris@1544: # other CVS imports may need it, too chris@1544: if name=='HEAD' or name=='default' or name=='': chris@1544: name=cfg_master chris@1544: if origin_name: chris@1544: return origin_name + '/' + name chris@1544: return name chris@1544: chris@1544: def get_changeset(ui,repo,revision,authors={},encoding=''): chris@1544: node=repo.lookup(revision) chris@1544: (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node) chris@1544: if encoding: chris@1544: user=user.decode(encoding).encode('utf8') chris@1544: desc=desc.decode(encoding).encode('utf8') chris@1544: tz="%+03d%02d" % (-timezone / 3600, ((-timezone % 3600) / 60)) chris@1544: branch=get_branch(extra.get('branch','master')) chris@1544: return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra) chris@1544: chris@1544: def mangle_key(key): chris@1544: return key chris@1544: chris@1544: def load_cache(filename,get_key=mangle_key): chris@1544: cache={} chris@1544: if not os.path.exists(filename): chris@1544: return cache chris@1544: f=open(filename,'r') chris@1544: l=0 chris@1544: for line in f.readlines(): chris@1544: l+=1 chris@1544: fields=line.split(' ') chris@1544: if fields==None or not len(fields)==2 or fields[0][0]!=':': chris@1544: sys.stderr.write('Invalid file format in [%s], line %d\n' % (filename,l)) chris@1544: continue chris@1544: # put key:value in cache, key without ^: chris@1544: cache[get_key(fields[0][1:])]=fields[1].split('\n')[0] chris@1544: f.close() chris@1544: return cache chris@1544: chris@1544: def save_cache(filename,cache): chris@1544: f=open(filename,'w+') chris@1544: map(lambda x: f.write(':%s %s\n' % (str(x),str(cache.get(x)))),cache.keys()) chris@1544: f.close() chris@1544: chris@1544: def get_git_sha1(name,type='heads'): chris@1544: try: chris@1544: # use git-rev-parse to support packed refs Chris@1567: ref="refs/%s/%s" % (type,name) Chris@1567: l=subprocess.check_output(["git", "rev-parse", "--verify", "--quiet", ref]) chris@1544: if l == None or len(l) == 0: chris@1544: return None chris@1544: return l[0:40] Chris@1567: except subprocess.CalledProcessError: chris@1544: return None