##// END OF EJS Templates
convert: pass the order of the revmapfile to the converter_source...
convert: pass the order of the revmapfile to the converter_source The entries in this file are supposed to be topologically sorted and this may be useful for a converter_source.

File last commit:

r5360:b98c377b merge default
r5373:6aba1835 default
Show More
hg.py
213 lines | 6.8 KiB | text/x-python | PythonLexer
Brendan Cully
Split convert extension into common and repository type modules
r4536 # hg backend for convert extension
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 # Note for hg->hg conversion: Old versions of Mercurial didn't trim
# the whitespace from the ends of commit messages, but new versions
# do. Changesets created by those older versions, then converted, may
# thus have different hashes for changesets that are otherwise
# identical.
Brendan Cully
Split convert extension into common and repository type modules
r4536 import os, time
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 from mercurial.i18n import _
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 from mercurial.node import *
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 from mercurial import hg, lock, revlog, util
Brendan Cully
Split convert extension into common and repository type modules
r4536
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 from common import NoRepo, commit, converter_source, converter_sink
Brendan Cully
Split convert extension into common and repository type modules
r4536
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 class mercurial_sink(converter_sink):
Brendan Cully
convert: split converter into convertsource and convertsink
r4763 def __init__(self, ui, path):
Brendan Cully
Split convert extension into common and repository type modules
r4536 self.path = path
self.ui = ui
Brendan Cully
convert: hg: optionally create branches as clones...
r5173 self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
Brendan Cully
convert: new config variable hg.tagsbranch controls which branch tags are committed to
r5260 self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
Brendan Cully
convert: hg: optionally create branches as clones...
r5173 self.lastbranch = None
Brendan Cully
Split convert extension into common and repository type modules
r4536 try:
self.repo = hg.repository(self.ui, path)
except:
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 raise NoRepo("could not open hg repo %s as sink" % path)
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 self.lock = None
self.wlock = None
def before(self):
Alexis S. L. Carvalho
convert: fix locking order
r5052 self.wlock = self.repo.wlock()
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 self.lock = self.repo.lock()
Alexis S. L. Carvalho
convert: clear the dirstate before a conversion, invalidate it afterwards...
r5279 self.repo.dirstate.clear()
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014
def after(self):
Alexis S. L. Carvalho
convert: clear the dirstate before a conversion, invalidate it afterwards...
r5279 self.repo.dirstate.invalidate()
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 self.lock = None
self.wlock = None
Brendan Cully
Split convert extension into common and repository type modules
r4536
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 def revmapfile(self):
Brendan Cully
Split convert extension into common and repository type modules
r4536 return os.path.join(self.path, ".hg", "shamap")
Edouard Gomez
convert extension: Add support for username mapping...
r4589 def authorfile(self):
return os.path.join(self.path, ".hg", "authormap")
Brendan Cully
Split convert extension into common and repository type modules
r4536 def getheads(self):
h = self.repo.changelog.heads()
Bryan O'Sullivan
convert: get rid of "hg." prefix where not needed
r5017 return [ hex(x) for x in h ]
Brendan Cully
Split convert extension into common and repository type modules
r4536
def putfile(self, f, e, data):
self.repo.wwrite(f, data, e)
Matt Mackall
dirstate: add __contains__ and make __getitem__ more useful...
r4906 if f not in self.repo.dirstate:
Alexis S. L. Carvalho
convert: avoid dirstate checks; add a test...
r5278 self.repo.dirstate.normallookup(f)
Brendan Cully
Split convert extension into common and repository type modules
r4536
Daniel Holth
convert extension: Add SVN converter
r4765 def copyfile(self, source, dest):
self.repo.copy(source, dest)
Brendan Cully
Split convert extension into common and repository type modules
r4536 def delfile(self, f):
try:
Bryan O'Sullivan
convert: delete empty directories if deleting a file (bug 754)
r5343 util.unlink(self.repo.wjoin(f))
Brendan Cully
Split convert extension into common and repository type modules
r4536 #self.repo.remove([f])
Patrick Mezard
convert: fix missing import
r5344 except OSError:
Brendan Cully
Split convert extension into common and repository type modules
r4536 pass
Brendan Cully
convert: hg: optionally create branches as clones...
r5173 def setbranch(self, branch, pbranch, parents):
if (not self.clonebranches) or (branch == self.lastbranch):
return
self.lastbranch = branch
self.after()
if not branch:
branch = 'default'
if not pbranch:
pbranch = 'default'
branchpath = os.path.join(self.path, branch)
try:
self.repo = hg.repository(self.ui, branchpath)
except:
if not parents:
self.repo = hg.repository(self.ui, branchpath, create=True)
else:
self.ui.note(_('cloning branch %s to %s\n') % (pbranch, branch))
hg.clone(self.ui, os.path.join(self.path, pbranch),
branchpath, rev=parents, update=False,
stream=True)
self.repo = hg.repository(self.ui, branchpath)
Brendan Cully
Split convert extension into common and repository type modules
r4536 def putcommit(self, files, parents, commit):
Alexis S. L. Carvalho
convert: fix mercurial_sink.putcommit...
r5195 seen = {}
Brendan Cully
Split convert extension into common and repository type modules
r4536 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 = {}
Bryan O'Sullivan
convert: add config option to turn off use of branch names
r5038 if self.branchnames and commit.branch:
Brendan Cully
convert: record the source revision in the changelog
r4873 extra['branch'] = commit.branch
if commit.rev:
extra['convert_revision'] = commit.rev
Thomas Arendsen Hein
removed trailing whitespace
r4957
Brendan Cully
Split convert extension into common and repository type modules
r4536 while parents:
p1 = p2
p2 = parents.pop(0)
a = self.repo.rawcommit(files, text, commit.author, commit.date,
Bryan O'Sullivan
convert: get rid of "hg." prefix where not needed
r5017 bin(p1), bin(p2), extra=extra)
Alexis S. L. Carvalho
convert: avoid dirstate checks; add a test...
r5278 self.repo.dirstate.clear()
Brendan Cully
Split convert extension into common and repository type modules
r4536 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()))
Brendan Cully
convert: new config variable hg.tagsbranch controls which branch tags are committed to
r5260 extra = {}
if self.tagsbranch != 'default':
extra['branch'] = self.tagsbranch
try:
tagparent = self.repo.changectx(self.tagsbranch).node()
except hg.RepoError, inst:
tagparent = nullid
Brendan Cully
Split convert extension into common and repository type modules
r4536 self.repo.rawcommit([".hgtags"], "update tags", "convert-repo",
Brendan Cully
convert: new config variable hg.tagsbranch controls which branch tags are committed to
r5260 date, tagparent, nullid)
Bryan O'Sullivan
convert: get rid of "hg." prefix where not needed
r5017 return hex(self.repo.changelog.tip())
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013
class mercurial_source(converter_source):
def __init__(self, ui, path, rev=None):
converter_source.__init__(self, ui, path, rev)
Bryan O'Sullivan
convert: fail properly if we can't read a source hg repository
r5358 try:
self.repo = hg.repository(self.ui, path)
except:
raise NoRepo("could not open hg repo %s as source" % path)
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 self.lastrev = None
self.lastctx = None
def changectx(self, rev):
if self.lastrev != rev:
self.lastctx = self.repo.changectx(rev)
self.lastrev = rev
return self.lastctx
def getheads(self):
Bryan O'Sullivan
convert: only get history for requested revs when converting hg repo
r5131 if self.rev:
return [hex(self.repo.changectx(self.rev).node())]
else:
return [hex(node) for node in self.repo.heads()]
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013
def getfile(self, name, rev):
try:
return self.changectx(rev).filectx(name).data()
except revlog.LookupError, err:
raise IOError(err)
def getmode(self, name, rev):
m = self.changectx(rev).manifest()
return (m.execf(name) and 'x' or '') + (m.linkf(name) and 'l' or '')
def getchanges(self, rev):
ctx = self.changectx(rev)
m, a, r = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
changes = [(name, rev) for name in m + a + r]
changes.sort()
Alexis S. L. Carvalho
convert: mercurial_source: also search for copies in modified files...
r5280 return (changes, self.getcopies(ctx, m + a))
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013
Alexis S. L. Carvalho
convert: mercurial_source: also search for copies in modified files...
r5280 def getcopies(self, ctx, files):
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 copies = {}
Alexis S. L. Carvalho
convert: mercurial_source: also search for copies in modified files...
r5280 for name in files:
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 try:
copies[name] = ctx.filectx(name).renamed()[0]
except TypeError:
pass
return copies
Thomas Arendsen Hein
Remove trailing spaces, fix indentation
r5143
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 def getcommit(self, rev):
ctx = self.changectx(rev)
parents = [hex(p.node()) for p in ctx.parents() if p.node() != nullid]
return commit(author=ctx.user(), date=util.datestr(ctx.date()),
desc=ctx.description(), parents=parents,
Brendan Cully
convert: look up copies in getchanges instead of getcommit...
r5121 branch=ctx.branch())
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013
def gettags(self):
tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
return dict([(name, hex(node)) for name, node in tags])