##// END OF EJS Templates
mq: fix qrefresh -e with no patches applied
mq: fix qrefresh -e with no patches applied

File last commit:

r5247:20770c5d merge default
r5334:448eb46d default
Show More
git.py
123 lines | 4.0 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
def recode(s):
try:
return s.decode("utf-8").encode("utf-8")
except:
try:
return s.decode("latin-1").encode("utf-8")
except:
return s.decode("utf-8", "replace").encode("utf-8")
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:
return os.popen(s)
finally:
if prevgitdir is None:
del os.environ['GIT_DIR']
else:
os.environ['GIT_DIR'] = prevgitdir
else:
def gitcmd(self, s):
return os.popen('GIT_DIR=%s %s' % (self.path, s))
Brendan Cully
convert: gitcmd wrapper for os.popen
r5216
Brendan Cully
Split convert extension into common and repository type modules
r4536 def __init__(self, ui, path):
if os.path.isdir(path + "/.git"):
path += "/.git"
self.path = path
self.ui = ui
if not os.path.exists(path + "/objects"):
raise NoRepo("couldn't open GIT repo %s" % path)
def getheads(self):
Brendan Cully
convert: gitcmd wrapper for os.popen
r5216 fh = self.gitcmd("git-rev-parse --verify HEAD")
Brendan Cully
Split convert extension into common and repository type modules
r4536 return [fh.read()[:-1]]
def catfile(self, rev, type):
if rev == "0" * 40: raise IOError()
Patrick Mezard
convert: fix /dev/null redirections under Windows
r5220 fh = self.gitcmd("git-cat-file %s %s 2>%s" % (type, rev,
util.nulldev))
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 = []
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))
return changes
def getcommit(self, version):
c = self.catfile(version, "commit") # read the commit hash
end = c.find("\n\n")
message = c[end+2:]
message = recode(message)
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]
author = recode(author)
if n == "committer":
p = v.split()
tm, tz = p[-2:]
committer = " ".join(p[:-2])
if committer[0] == "<": committer = committer[1:-1]
committer = recode(committer)
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
c = commit(parents=parents, date=date, author=author, desc=message)
return c
def gettags(self):
tags = {}
Patrick Mezard
convert: fix /dev/null redirections under Windows
r5220 fh = self.gitcmd('git-ls-remote --tags "%s" 2>%s' % (self.path,
util.nulldev))
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