##// END OF EJS Templates
convert: hg: optionally create branches as clones...
convert: hg: optionally create branches as clones If convert.hg.clonebranches is set, branches will be created as clones of their parent revisions. All clones will be subdirectories of the destination path.

File last commit:

r5121:ef338e34 default
r5173:6b4c332f default
Show More
git.py
101 lines | 3.3 KiB | text/x-python | PythonLexer
Brendan Cully
Split convert extension into common and repository type modules
r4536 # git support for the convert extension
import os
from common import NoRepo, commit, converter_source
class convert_git(converter_source):
Brendan Cully
convert: gitcmd wrapper for os.popen
r4767 def gitcmd(self, s):
return os.popen('GIT_DIR=%s %s' % (self.path, s))
Brendan Cully
convert: add -r argument specifying latest revision to convert
r4760 def __init__(self, ui, path, rev=None):
Brendan Cully
convert: call superclass init from engine init functions
r4807 super(convert_git, self).__init__(ui, path, rev=rev)
Brendan Cully
Split convert extension into common and repository type modules
r4536 if os.path.isdir(path + "/.git"):
path += "/.git"
Brendan Cully
convert: ove recode method into converter_source
r4759 if not os.path.exists(path + "/objects"):
raise NoRepo("couldn't open GIT repo %s" % path)
Brendan Cully
Split convert extension into common and repository type modules
r4536 self.path = path
def getheads(self):
Brendan Cully
convert: import all branches from git repositories
r4768 if not self.rev:
return self.gitcmd('git-rev-parse --branches').read().splitlines()
else:
fh = self.gitcmd("git-rev-parse --verify %s" % self.rev)
return [fh.read()[:-1]]
Brendan Cully
Split convert extension into common and repository type modules
r4536
def catfile(self, rev, type):
if rev == "0" * 40: raise IOError()
Brendan Cully
convert: gitcmd wrapper for os.popen
r4767 fh = self.gitcmd("git-cat-file %s %s 2>/dev/null" % (type, rev))
Brendan Cully
Split convert extension into common and repository type modules
r4536 return fh.read()
def getfile(self, name, rev):
return self.catfile(rev, "blob")
def getmode(self, name, rev):
return self.modecache[(name, rev)]
def getchanges(self, version):
self.modecache = {}
Brendan Cully
convert: gitcmd wrapper for os.popen
r4767 fh = self.gitcmd("git-diff-tree --root -m -r %s" % version)
Brendan Cully
Split convert extension into common and repository type modules
r4536 changes = []
for l in fh:
if "\t" not in l: continue
m, f = l[:-1].split("\t")
m = m.split()
h = m[3]
p = (m[1] == "100755")
s = (m[1] == "120000")
self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
changes.append((f, h))
Brendan Cully
convert: look up copies in getchanges instead of getcommit...
r5121 return (changes, {})
Brendan Cully
Split convert extension into common and repository type modules
r4536
def getcommit(self, version):
c = self.catfile(version, "commit") # read the commit hash
end = c.find("\n\n")
message = c[end+2:]
Brendan Cully
convert: ove recode method into converter_source
r4759 message = self.recode(message)
Brendan Cully
Split convert extension into common and repository type modules
r4536 l = c[:end].splitlines()
manifest = l[0].split()[1]
parents = []
for e in l[1:]:
n, v = e.split(" ", 1)
if n == "author":
p = v.split()
tm, tz = p[-2:]
author = " ".join(p[:-2])
if author[0] == "<": author = author[1:-1]
Brendan Cully
convert: ove recode method into converter_source
r4759 author = self.recode(author)
Brendan Cully
Split convert extension into common and repository type modules
r4536 if n == "committer":
p = v.split()
tm, tz = p[-2:]
committer = " ".join(p[:-2])
if committer[0] == "<": committer = committer[1:-1]
Brendan Cully
convert: ove recode method into converter_source
r4759 committer = self.recode(committer)
Brendan Cully
Split convert extension into common and repository type modules
r4536 message += "\ncommitter: %s\n" % committer
if n == "parent": parents.append(v)
tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
date = tm + " " + str(tz)
Alexis S. L. Carvalho
convert: "unknown" is a string
r4721 author = author or "unknown"
Brendan Cully
Split convert extension into common and repository type modules
r4536
Brendan Cully
convert: record the source revision in the changelog
r4873 c = commit(parents=parents, date=date, author=author, desc=message,
rev=version)
Brendan Cully
Split convert extension into common and repository type modules
r4536 return c
def gettags(self):
tags = {}
Brendan Cully
convert: gitcmd wrapper for os.popen
r4767 fh = self.gitcmd('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
Brendan Cully
Split convert extension into common and repository type modules
r4536 prefix = 'refs/tags/'
for line in fh:
line = line.strip()
if not line.endswith("^{}"):
continue
node, tag = line.split(None, 1)
if not tag.startswith(prefix):
continue
tag = tag[len(prefix):-3]
tags[tag] = node
return tags