##// END OF EJS Templates
test-serve: wait before killing to always hide the "killed!" message....
test-serve: wait before killing to always hide the "killed!" message. Without the sleeps slower systems never display never display "killed!" while faster systems sometimes or nearly always display it.

File last commit:

r5984:9451a941 default
r6000:8e7d6498 default
Show More
git.py
143 lines | 4.6 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
Patrick Mezard
convert: fix /dev/null redirections under Windows
r5220 from mercurial import util
Brendan Cully
Split convert extension into common and repository type modules
r4536
Patrick Mezard
convert: fail if an external required tool is not found
r5497 from common import NoRepo, commit, converter_source, checktool
Brendan Cully
Split convert extension into common and repository type modules
r4536
class convert_git(converter_source):
Patrick Mezard
convert: fix issue702 about GIT_DIR= construct unsupported under Windows.
r5217 # Windows does not support GIT_DIR= construct while other systems
# cannot remove environment variable. Just assume none have
# both issues.
if hasattr(os, 'unsetenv'):
def gitcmd(self, s):
prevgitdir = os.environ.get('GIT_DIR')
os.environ['GIT_DIR'] = self.path
try:
Patrick Mezard
Fix Windows os.popen bug with interleaved stdout/stderr output...
r5481 return util.popen(s)
Patrick Mezard
convert: fix issue702 about GIT_DIR= construct unsupported under Windows.
r5217 finally:
if prevgitdir is None:
del os.environ['GIT_DIR']
else:
os.environ['GIT_DIR'] = prevgitdir
else:
def gitcmd(self, s):
Patrick Mezard
Fix Windows os.popen bug with interleaved stdout/stderr output...
r5481 return util.popen('GIT_DIR=%s %s' % (self.path, s))
Brendan Cully
convert: gitcmd wrapper for os.popen
r4767
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"
if not os.path.exists(path + "/objects"):
Alexis S. L. Carvalho
convert: display all errors if we couldn't open the source repo...
r5521 raise NoRepo("%s does not look like a Git repo" % path)
Patrick Mezard
convert: fail if an external required tool is not found
r5497
checktool('git-rev-parse', 'git')
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()
Patrick Mezard
Fix Windows os.popen bug with interleaved stdout/stderr output...
r5481 fh = self.gitcmd("git-cat-file %s %s" % (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
r5216 fh = self.gitcmd("git-diff-tree --root -m -r %s" % version)
Brendan Cully
Split convert extension into common and repository type modules
r4536 changes = []
Alexis S. L. Carvalho
convert_git: avoid returning two entries for the same file in getchanges...
r5335 seen = {}
Brendan Cully
Split convert extension into common and repository type modules
r4536 for l in fh:
Alexis S. L. Carvalho
convert_git: avoid returning two entries for the same file in getchanges...
r5335 if "\t" not in l:
continue
Brendan Cully
Split convert extension into common and repository type modules
r4536 m, f = l[:-1].split("\t")
Alexis S. L. Carvalho
convert_git: avoid returning two entries for the same file in getchanges...
r5335 if f in seen:
continue
seen[f] = 1
Brendan Cully
Split convert extension into common and repository type modules
r4536 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 = {}
Patrick Mezard
Fix Windows os.popen bug with interleaved stdout/stderr output...
r5481 fh = self.gitcmd('git-ls-remote --tags "%s"' % 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
Alexis S. L. Carvalho
convert_git: add --filemap support
r5380
def getchangedfiles(self, version, i):
changes = []
if i is None:
fh = self.gitcmd("git-diff-tree --root -m -r %s" % version)
for l in fh:
if "\t" not in l:
continue
m, f = l[:-1].split("\t")
changes.append(f)
fh.close()
else:
Patrick Mezard
convert: quote "^" to avoid windows using it as an escape char.
r5404 fh = self.gitcmd('git-diff-tree --name-only --root -r %s "%s^%s" --'
Alexis S. L. Carvalho
convert_git: add --filemap support
r5380 % (version, version, i+1))
changes = [f.rstrip('\n') for f in fh]
fh.close()
return changes