hg.py
97 lines
| 2.8 KiB
| text/x-python
|
PythonLexer
|
r4536 | # hg backend for convert extension | ||
import os, time | ||||
from mercurial import hg | ||||
from common import NoRepo, converter_sink | ||||
class convert_mercurial(converter_sink): | ||||
|
r4763 | def __init__(self, ui, path): | ||
|
r4536 | self.path = path | ||
self.ui = ui | ||||
try: | ||||
self.repo = hg.repository(self.ui, path) | ||||
except: | ||||
raise NoRepo("could open hg repo %s" % path) | ||||
def mapfile(self): | ||||
return os.path.join(self.path, ".hg", "shamap") | ||||
|
r4589 | def authorfile(self): | ||
return os.path.join(self.path, ".hg", "authormap") | ||||
|
r4536 | def getheads(self): | ||
h = self.repo.changelog.heads() | ||||
return [ hg.hex(x) for x in h ] | ||||
def putfile(self, f, e, data): | ||||
self.repo.wwrite(f, data, e) | ||||
if self.repo.dirstate.state(f) == '?': | ||||
self.repo.dirstate.update([f], "a") | ||||
|
r4765 | def copyfile(self, source, dest): | ||
self.repo.copy(source, dest) | ||||
|
r4536 | def delfile(self, f): | ||
try: | ||||
os.unlink(self.repo.wjoin(f)) | ||||
#self.repo.remove([f]) | ||||
except: | ||||
pass | ||||
def putcommit(self, files, parents, commit): | ||||
seen = {} | ||||
pl = [] | ||||
for p in parents: | ||||
if p not in seen: | ||||
pl.append(p) | ||||
seen[p] = 1 | ||||
parents = pl | ||||
if len(parents) < 2: parents.append("0" * 40) | ||||
if len(parents) < 2: parents.append("0" * 40) | ||||
p2 = parents.pop(0) | ||||
text = commit.desc | ||||
extra = {} | ||||
|
r4873 | if commit.branch: | ||
extra['branch'] = commit.branch | ||||
if commit.rev: | ||||
extra['convert_revision'] = commit.rev | ||||
|
r4536 | while parents: | ||
p1 = p2 | ||||
p2 = parents.pop(0) | ||||
a = self.repo.rawcommit(files, text, commit.author, commit.date, | ||||
hg.bin(p1), hg.bin(p2), extra=extra) | ||||
text = "(octopus merge fixup)\n" | ||||
p2 = hg.hex(self.repo.changelog.tip()) | ||||
return p2 | ||||
def puttags(self, tags): | ||||
try: | ||||
old = self.repo.wfile(".hgtags").read() | ||||
oldlines = old.splitlines(1) | ||||
oldlines.sort() | ||||
except: | ||||
oldlines = [] | ||||
k = tags.keys() | ||||
k.sort() | ||||
newlines = [] | ||||
for tag in k: | ||||
newlines.append("%s %s\n" % (tags[tag], tag)) | ||||
newlines.sort() | ||||
if newlines != oldlines: | ||||
self.ui.status("updating tags\n") | ||||
f = self.repo.wfile(".hgtags", "w") | ||||
f.write("".join(newlines)) | ||||
f.close() | ||||
if not oldlines: self.repo.add([".hgtags"]) | ||||
date = "%s 0" % int(time.mktime(time.gmtime())) | ||||
self.repo.rawcommit([".hgtags"], "update tags", "convert-repo", | ||||
date, self.repo.changelog.tip(), hg.nullid) | ||||
return hg.hex(self.repo.changelog.tip()) | ||||