##// END OF EJS Templates
convert: return remote branches in git source...
convert: return remote branches in git source When converting git repos, all stuff happening on branches seems to be ignored. This is caused by the fact a "git clone" of a remote git repo has all its branches prefixed with "origin/". By chance, the "origin/master" branch is always linked to a local "master" branch. So getheads() returns only the master head, and it ignores all the other heads. Make sure getheads() returns all heads, forcing remote branches to be return by git-rev-parse.

File last commit:

r7243:a8e4e599 default
r7243:a8e4e599 default
Show More
git.py
142 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
convert: read git output in binary mode under Windows (issue 1359)
r7222 return util.popen(s, 'rb')
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
convert: read git output in binary mode under Windows (issue 1359)
r7222 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
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
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 checktool('git', 'git')
Patrick Mezard
convert: fail if an external required tool is not found
r5497
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:
Edouard Gomez
convert: return remote branches in git source...
r7243 return self.gitcmd('git rev-parse --branches --remotes').read().splitlines()
Brendan Cully
convert: import all branches from git repositories
r4768 else:
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 fh = self.gitcmd("git rev-parse --verify %s" % self.rev)
Brendan Cully
convert: import all branches from git repositories
r4768 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()
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 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 = {}
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 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)
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 = {}
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 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:
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 fh = self.gitcmd("git diff-tree --root -m -r %s" % version)
Alexis S. L. Carvalho
convert_git: add --filemap support
r5380 for l in fh:
if "\t" not in l:
continue
m, f = l[:-1].split("\t")
changes.append(f)
fh.close()
else:
Dhruva Krishnamurthy
convert: use git executable only, with subcommands...
r6837 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