##// END OF EJS Templates
CVS convert: Find correct parent for new branch (issue704)...
CVS convert: Find correct parent for new branch (issue704) Previously the parent was determined by the last changeset where the branched file was changed even if the branch is based on an earlier revision. Fix written by mpm.

File last commit:

r5528:6ffca2bf merge default
r5920:5df7cb79 default
Show More
git.py
140 lines | 4.5 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
from common import NoRepo, commit, converter_source
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)
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