##// END OF EJS Templates
purge: abort with missing files avoiding problems with name-mangling fs...
purge: abort with missing files avoiding problems with name-mangling fs In a name mangling filesystem (e.g. a case insensitive one) dirstate.walk() can yield filenames different from the ones stored in the dirstate. This already confuses the status and add commands, but with purge this may cause data loss. To prevent this purge refuses to work if there are missing files and has a 'force' option if the user knows it is safe. Even with the force option purge checks if any of the missing files is still available in the working dir: if so there may be some problem with the underlying filesystem, so it unconditionally aborts.

File last commit:

r4114:d5011e34 merge default
r4310:c8919eb0 default
Show More
convert-repo
650 lines | 20.4 KiB | text/plain | TextLexer
mpm@selenic.com
Add new convert-repo script...
r316 #!/usr/bin/env python
#
# This is a generalized framework for converting between SCM
# repository formats.
#
Alexis S. L. Carvalho
convert-repo: update usage information
r3917 # To use, run:
#
Matt Mackall
Update convert-repo usage comments
r3939 # convert-repo <source> [<dest> [<mapfile>]]
Alexis S. L. Carvalho
convert-repo: update usage information
r3917 #
Matt Mackall
convert-repo: add basic CVS import support
r3953 # Currently accepted source formats: git, cvs
Matt Mackall
Update convert-repo usage comments
r3939 # Currently accepted destination formats: hg
Alexis S. L. Carvalho
convert-repo: update usage information
r3917 #
Matt Mackall
Update convert-repo usage comments
r3939 # If destination isn't given, a new Mercurial repo named <src>-hg will
# be created. If <mapfile> isn't given, it will be put in a default
# location (<dest>/.hg/shamap by default)
mpm@selenic.com
Add new convert-repo script...
r316 #
Matt Mackall
Update convert-repo usage comments
r3939 # The <mapfile> is a simple text file that maps each source commit ID to
# the destination ID for that revision, like so:
#
# <source ID> <destination ID>
mpm@selenic.com
Add new convert-repo script...
r316 #
Alexis S. L. Carvalho
convert-repo: update usage information
r3917 # If the file doesn't exist, it's automatically created. It's updated
# on each commit copied, so convert-repo can be interrupted and can
# be run repeatedly to copy new commits.
mpm@selenic.com
Add new convert-repo script...
r316
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 import sys, os, zlib, sha, time, re, locale, socket
Matt Mackall
convert-repo: add some smarts...
r3938 os.environ["HGENCODING"] = "utf-8"
from mercurial import hg, ui, util, fancyopts
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821
Matt Mackall
convert-repo: add some smarts...
r3938 class Abort(Exception): pass
Matt Mackall
convert-repo: add basic CVS import support
r3953 class NoRepo(Exception): pass
Matt Mackall
convert-repo: add some smarts...
r3938
Matt Mackall
convert-repo: add CVS branch support
r3954 class commit:
def __init__(self, **parts):
for x in "author date desc parents".split():
if not x in parts:
abort("commit missing field %s\n" % x)
self.__dict__.update(parts)
Matt Mackall
convert-repo: add some smarts...
r3938 quiet = 0
def status(msg):
if not quiet: sys.stdout.write(str(msg))
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821
Matt Mackall
convert-repo: add some smarts...
r3938 def warn(msg):
sys.stderr.write(str(msg))
def abort(msg):
raise Abort(msg)
mpm@selenic.com
Add new convert-repo script...
r316
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821 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")
Matt Mackall
convert-repo: add basic CVS import support
r3953 # CVS conversion code inspired by hg-cvs-import and git-cvsimport
class convert_cvs:
def __init__(self, path):
self.path = path
cvs = os.path.join(path, "CVS")
if not os.path.exists(cvs):
raise NoRepo("couldn't open CVS repo %s" % path)
self.changeset = {}
Matt Mackall
convert-repo: add CVS branch support
r3954 self.files = {}
Matt Mackall
convert-repo: add basic CVS import support
r3953 self.tags = {}
self.lastbranch = {}
self.parent = {}
self.socket = None
self.cvsroot = file(os.path.join(cvs, "Root")).read()[:-1]
self.cvsrepo = file(os.path.join(cvs, "Repository")).read()[:-1]
self.encoding = locale.getpreferredencoding()
self._parse()
self._connect()
def _parse(self):
if self.changeset:
return
d = os.getcwd()
try:
os.chdir(self.path)
id = None
state = 0
Edouard Gomez
Change a bit cvsps arguments...
r4112 for l in os.popen("cvsps -A -u --cvs-direct -q"):
Matt Mackall
convert-repo: add basic CVS import support
r3953 if state == 0: # header
if l.startswith("PatchSet"):
id = l[9:-2]
elif l.startswith("Date"):
date = util.parsedate(l[6:-1], ["%Y/%m/%d %H:%M:%S"])
date = util.datestr(date)
elif l.startswith("Branch"):
branch = l[8:-1]
self.parent[id] = self.lastbranch.get(branch,'bad')
self.lastbranch[branch] = id
elif l.startswith("Ancestor branch"):
ancestor = l[17:-1]
self.parent[id] = self.lastbranch[ancestor]
elif l.startswith("Author"):
author = self.recode(l[8:-1])
elif l.startswith("Tag: "):
Edouard Gomez
Don't keep trailing white space in cvs tags
r4113 t = l[5:-1].rstrip()
if t != "(none)":
Matt Mackall
convert-repo: add basic CVS import support
r3953 self.tags[t] = id
elif l.startswith("Log:"):
state = 1
log = ""
elif state == 1: # log
if l == "Members: \n":
files = {}
log = self.recode(log[:-1])
if log.isspace():
log = "*** empty log message ***\n"
state = 2
else:
log += l
elif state == 2:
if l == "\n": #
state = 0
Matt Mackall
convert-repo: add CVS branch support
r3954 p = [self.parent[id]]
if id == "1":
p = []
c = commit(author=author, date=date, parents=p,
desc=log, branch=branch)
self.changeset[id] = c
self.files[id] = files
Matt Mackall
convert-repo: add basic CVS import support
r3953 else:
file,rev = l[1:-2].rsplit(':',1)
rev = rev.split("->")[1]
files[file] = rev
self.heads = self.lastbranch.values()
finally:
os.chdir(d)
def _connect(self):
root = self.cvsroot
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 conntype = None
Matt Mackall
convert-repo: add basic CVS import support
r3953 user, host = None, None
cmd = ['cvs', 'server']
status("connecting to %s\n" % root)
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 if root.startswith(":pserver:"):
root = root[9:]
m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?(.*)', root)
if m:
conntype = "pserver"
user, passw, serv, port, root = m.groups()
if not user:
user = "anonymous"
rr = ":pserver:" + user + "@" + serv + ":" + root
if port:
rr2, port = "-", int(port)
else:
rr2, port = rr, 2401
rr += str(port)
Matt Mackall
convert-repo: add basic CVS import support
r3953
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 if not passw:
passw = "A"
pf = open(os.path.join(os.environ["HOME"], ".cvspass"))
for l in pf:
# :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z
m = re.match(r'(/\d+\s+/)?(.*)', l)
l = m.group(2)
w, p = l.split(' ', 1)
if w in [rr, rr2]:
passw = p
break
pf.close()
sck = socket.socket()
sck.connect((serv, port))
sck.send("\n".join(["BEGIN AUTH REQUEST", root, user, passw, "END AUTH REQUEST", ""]))
if sck.recv(128) != "I LOVE YOU\n":
raise NoRepo("CVS pserver authentication failed")
self.writep = self.readp = sck.makefile('r+')
if not conntype and root.startswith(":local:"):
conntype = "local"
Matt Mackall
convert-repo: add basic CVS import support
r3953 root = root[7:]
csaba.henk@creo.hu
add pserver support to convert_repo
r4047
if not conntype:
Matt Mackall
convert-repo: add basic CVS import support
r3953 # :ext:user@host/home/user/path/to/cvsroot
if root.startswith(":ext:"):
root = root[5:]
m = re.match(r'(?:([^@:/]+)@)?([^:/]+):?(.*)', root)
if not m:
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 conntype = "local"
Matt Mackall
convert-repo: add basic CVS import support
r3953 else:
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 conntype = "rsh"
Matt Mackall
convert-repo: add basic CVS import support
r3953 user, host, root = m.group(1), m.group(2), m.group(3)
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 if conntype != "pserver":
if conntype == "rsh":
rsh = os.environ.get("CVS_RSH" or "rsh")
if user:
cmd = [rsh, '-l', user, host] + cmd
else:
cmd = [rsh, host] + cmd
Matt Mackall
convert-repo: add basic CVS import support
r3953
csaba.henk@creo.hu
add pserver support to convert_repo
r4047 self.writep, self.readp = os.popen2(cmd)
Matt Mackall
convert-repo: add basic CVS import support
r3953 self.realroot = root
self.writep.write("Root %s\n" % root)
self.writep.write("Valid-responses ok error Valid-requests Mode"
" M Mbinary E Checked-in Created Updated"
" Merged Removed\n")
self.writep.write("valid-requests\n")
self.writep.flush()
r = self.readp.readline()
if not r.startswith("Valid-requests"):
abort("server sucks\n")
if "UseUnchanged" in r:
self.writep.write("UseUnchanged\n")
self.writep.flush()
r = self.readp.readline()
def getheads(self):
return self.heads
Matt Mackall
convert-repo: add CVS exec bit support
r3956 def _getfile(self, name, rev):
Matt Mackall
convert-repo: add basic CVS import support
r3953 if rev.endswith("(DEAD)"):
raise IOError
args = ("-N -P -kk -r %s --" % rev).split()
args.append(os.path.join(self.cvsrepo, name))
for x in args:
self.writep.write("Argument %s\n" % x)
self.writep.write("Directory .\n%s\nco\n" % self.realroot)
self.writep.flush()
data = ""
while 1:
line = self.readp.readline()
if line.startswith("Created ") or line.startswith("Updated "):
self.readp.readline() # path
self.readp.readline() # entries
mode = self.readp.readline()[:-1]
count = int(self.readp.readline()[:-1])
data = self.readp.read(count)
elif line.startswith(" "):
data += line[1:]
elif line.startswith("M "):
pass
elif line.startswith("Mbinary "):
count = int(self.readp.readline()[:-1])
data = self.readp.read(count)
else:
if line == "ok\n":
Daniel Holth
convert-repo converts symlinks from git
r4082 return (data, "x" in mode and "x" or "")
Matt Mackall
convert-repo: add basic CVS import support
r3953 elif line.startswith("E "):
warn("cvs server: %s\n" % line[2:])
elif line.startswith("Remove"):
l = self.readp.readline()
l = self.readp.readline()
if l != "ok\n":
abort("unknown CVS response: %s\n" % l)
else:
abort("unknown CVS response: %s\n" % line)
Matt Mackall
convert-repo: add CVS exec bit support
r3956 def getfile(self, file, rev):
data, mode = self._getfile(file, rev)
self.modecache[(file, rev)] = mode
return data
def getmode(self, file, rev):
return self.modecache[(file, rev)]
Matt Mackall
convert-repo: add basic CVS import support
r3953 def getchanges(self, rev):
Matt Mackall
convert-repo: add CVS exec bit support
r3956 self.modecache = {}
Matt Mackall
convert-repo: add CVS branch support
r3954 files = self.files[rev]
Matt Mackall
convert-repo: add CVS exec bit support
r3956 cl = files.items()
Matt Mackall
convert-repo: add basic CVS import support
r3953 cl.sort()
return cl
def recode(self, text):
return text.decode(self.encoding, "replace").encode("utf-8")
def getcommit(self, rev):
Matt Mackall
convert-repo: add CVS branch support
r3954 return self.changeset[rev]
Matt Mackall
convert-repo: add basic CVS import support
r3953
def gettags(self):
return self.tags
mpm@selenic.com
Add new convert-repo script...
r316 class convert_git:
def __init__(self, path):
Matt Mackall
convert-repo: add some smarts...
r3938 if os.path.isdir(path + "/.git"):
path += "/.git"
mpm@selenic.com
Add new convert-repo script...
r316 self.path = path
Matt Mackall
convert-repo: use .git/objects/ rather than .git/HEAD to detect git repos
r4102 if not os.path.exists(path + "/objects"):
Matt Mackall
convert-repo: add basic CVS import support
r3953 raise NoRepo("couldn't open GIT repo %s" % path)
mpm@selenic.com
Add new convert-repo script...
r316
def getheads(self):
Alexis S. L. Carvalho
make convert-repo deal with git symbolic refs....
r2657 fh = os.popen("GIT_DIR=%s git-rev-parse --verify HEAD" % self.path)
return [fh.read()[:-1]]
mpm@selenic.com
Add new convert-repo script...
r316
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 def catfile(self, rev, type):
if rev == "0" * 40: raise IOError()
Florian La Roche
git -> hg conversion script...
r1335 fh = os.popen("GIT_DIR=%s git-cat-file %s %s 2>/dev/null" % (self.path, type, rev))
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 return fh.read()
mpm@selenic.com
Add new convert-repo script...
r316 def getfile(self, name, rev):
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 return self.catfile(rev, "blob")
mpm@selenic.com
Add new convert-repo script...
r316
Matt Mackall
convert-repo: add CVS exec bit support
r3956 def getmode(self, name, rev):
return self.modecache[(name, rev)]
mpm@selenic.com
Add new convert-repo script...
r316 def getchanges(self, version):
Matt Mackall
convert-repo: add CVS exec bit support
r3956 self.modecache = {}
Florian La Roche
git -> hg conversion script...
r1335 fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s" % (self.path, version))
mpm@selenic.com
Add new convert-repo script...
r316 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")
Daniel Holth
convert-repo converts symlinks from git
r4082 s = (m[1] == "120000")
self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
Matt Mackall
convert-repo: add CVS exec bit support
r3956 changes.append((f, h))
mpm@selenic.com
Add new convert-repo script...
r316 return changes
def getcommit(self, version):
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 c = self.catfile(version, "commit") # read the commit hash
mpm@selenic.com
Add new convert-repo script...
r316 end = c.find("\n\n")
message = c[end+2:]
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821 message = recode(message)
mpm@selenic.com
Add new convert-repo script...
r316 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()
Matt Mackall
convert-repo: Fix timezone handling
r1385 tm, tz = p[-2:]
mpm@selenic.com
Add new convert-repo script...
r316 author = " ".join(p[:-2])
if author[0] == "<": author = author[1:-1]
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821 author = recode(author)
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 if n == "committer":
mpm@selenic.com
convert-repo fixups...
r431 p = v.split()
Matt Mackall
convert-repo: Fix timezone handling
r1385 tm, tz = p[-2:]
mpm@selenic.com
convert-repo fixups...
r431 committer = " ".join(p[:-2])
if committer[0] == "<": committer = committer[1:-1]
Matt Mackall
Teach convert-repo to deal with mixed charsets in git
r3821 committer = recode(committer)
Matt Mackall
convert-repo: fix recoding of committer
r3910 message += "\ncommitter: %s\n" % committer
mpm@selenic.com
Add new convert-repo script...
r316 if n == "parent": parents.append(v)
Matt Mackall
convert-repo: Fix timezone handling
r1385
tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
Vadim Gelfer
convert-repo: fix reversed time zone offset
r2093 tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
Matt Mackall
convert-repo: Fix timezone handling
r1385 date = tm + " " + str(tz)
Matt Mackall
convert-repo: add CVS branch support
r3954
c = commit(parents=parents, date=date, author=author, desc=message)
return c
mpm@selenic.com
Add new convert-repo script...
r316
mpm@selenic.com
Teach convert-repo about tags...
r694 def gettags(self):
tags = {}
Alexis S. L. Carvalho
convert-repo: handle packed git tags
r4062 fh = os.popen('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
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
mpm@selenic.com
Teach convert-repo about tags...
r694 return tags
mpm@selenic.com
Add new convert-repo script...
r316 class convert_mercurial:
def __init__(self, path):
self.path = path
u = ui.ui()
Matt Mackall
convert-repo: add some smarts...
r3938 try:
self.repo = hg.repository(u, path)
except:
Matt Mackall
convert-repo: add basic CVS import support
r3953 raise NoRepo("could open hg repo %s" % path)
Matt Mackall
convert-repo: add some smarts...
r3938
def mapfile(self):
return os.path.join(self.path, ".hg", "shamap")
mpm@selenic.com
Add new convert-repo script...
r316
def getheads(self):
h = self.repo.changelog.heads()
Florian La Roche
git -> hg conversion script...
r1335 return [ hg.hex(x) for x in h ]
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692
mpm@selenic.com
Add new convert-repo script...
r316 def putfile(self, f, e, data):
Daniel Holth
convert-repo converts symlinks from git
r4082 self.repo.wwrite(f, data, e)
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 if self.repo.dirstate.state(f) == '?':
self.repo.dirstate.update([f], "a")
mpm@selenic.com
Add new convert-repo script...
r316 def delfile(self, f):
try:
os.unlink(self.repo.wjoin(f))
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 #self.repo.remove([f])
mpm@selenic.com
Add new convert-repo script...
r316 except:
pass
Matt Mackall
convert-repo: add CVS branch support
r3954 def putcommit(self, files, parents, commit):
mpm@selenic.com
convert-repo fixups...
r431 seen = {}
pl = []
for p in parents:
if p not in seen:
pl.append(p)
seen[p] = 1
parents = pl
mpm@selenic.com
Add new convert-repo script...
r316
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 if len(parents) < 2: parents.append("0" * 40)
if len(parents) < 2: parents.append("0" * 40)
mpm@selenic.com
convert-repo fixups...
r431 p2 = parents.pop(0)
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692
Matt Mackall
convert-repo: add CVS branch support
r3954 text = commit.desc
extra = {}
try:
extra["branch"] = commit.branch
except AttributeError:
pass
mpm@selenic.com
convert-repo fixups...
r431 while parents:
p1 = p2
p2 = parents.pop(0)
Matt Mackall
convert-repo: add CVS branch support
r3954 a = self.repo.rawcommit(files, text, commit.author, commit.date,
hg.bin(p1), hg.bin(p2), extra=extra)
mpm@selenic.com
convert-repo fixups...
r431 text = "(octopus merge fixup)\n"
Matt Mackall
convert-repo: fix up octopus merge conversion
r1389 p2 = hg.hex(self.repo.changelog.tip())
mpm@selenic.com
convert-repo fixups...
r431
Matt Mackall
convert-repo: fix up octopus merge conversion
r1389 return p2
mpm@selenic.com
Add new convert-repo script...
r316
mpm@selenic.com
Teach convert-repo about tags...
r694 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:
Matt Mackall
convert-repo: add some smarts...
r3938 status("updating tags\n")
mpm@selenic.com
Teach convert-repo about tags...
r694 f = self.repo.wfile(".hgtags", "w")
f.write("".join(newlines))
f.close()
if not oldlines: self.repo.add([".hgtags"])
Florian La Roche
git -> hg conversion script...
r1335 date = "%s 0" % int(time.mktime(time.gmtime()))
mpm@selenic.com
Teach convert-repo about tags...
r694 self.repo.rawcommit([".hgtags"], "update tags", "convert-repo",
date, self.repo.changelog.tip(), hg.nullid)
Matt Mackall
convert-repo: linearize the tag commit
r1387 return hg.hex(self.repo.changelog.tip())
mpm@selenic.com
Teach convert-repo about tags...
r694
Matt Mackall
convert-repo: add basic CVS import support
r3953 converters = [convert_cvs, convert_git, convert_mercurial]
Matt Mackall
convert-repo: add some smarts...
r3938
def converter(path):
if not os.path.isdir(path):
abort("%s: not a directory\n" % path)
for c in converters:
try:
return c(path)
Matt Mackall
convert-repo: add basic CVS import support
r3953 except NoRepo:
Matt Mackall
convert-repo: add some smarts...
r3938 pass
abort("%s: unknown repository type\n" % path)
mpm@selenic.com
Add new convert-repo script...
r316 class convert:
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 def __init__(self, source, dest, mapfile, opts):
Matt Mackall
convert-repo: add some smarts...
r3938
mpm@selenic.com
Add new convert-repo script...
r316 self.source = source
self.dest = dest
self.mapfile = mapfile
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 self.opts = opts
mpm@selenic.com
Add new convert-repo script...
r316 self.commitcache = {}
self.map = {}
Matt Mackall
convert-repo: automatically create empty map file
r1655 try:
for l in file(self.mapfile):
sv, dv = l[:-1].split()
self.map[sv] = dv
except IOError:
pass
mpm@selenic.com
Add new convert-repo script...
r316
def walktree(self, heads):
visit = heads
known = {}
parents = {}
while visit:
n = visit.pop(0)
if n in known or n in self.map: continue
known[n] = 1
self.commitcache[n] = self.source.getcommit(n)
Matt Mackall
convert-repo: add CVS branch support
r3954 cp = self.commitcache[n].parents
mpm@selenic.com
Add new convert-repo script...
r316 for p in cp:
parents.setdefault(n, []).append(p)
visit.append(p)
return parents
def toposort(self, parents):
visit = parents.keys()
seen = {}
children = {}
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692
mpm@selenic.com
Add new convert-repo script...
r316 while visit:
n = visit.pop(0)
if n in seen: continue
seen[n] = 1
pc = 0
if n in parents:
for p in parents[n]:
if p not in self.map: pc += 1
visit.append(p)
children.setdefault(p, []).append(n)
if not pc: root = n
s = []
removed = {}
mpm@selenic.com
convert-repo: deal with packed git and other fixes...
r692 visit = children.keys()
mpm@selenic.com
Add new convert-repo script...
r316 while visit:
n = visit.pop(0)
if n in removed: continue
dep = 0
if n in parents:
for p in parents[n]:
if p in self.map: continue
if p not in removed:
# we're still dependent
visit.append(n)
dep = 1
break
if not dep:
# all n's parents are in the list
removed[n] = 1
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 if n not in self.map:
s.append(n)
mpm@selenic.com
Add new convert-repo script...
r316 if n in children:
for c in children[n]:
visit.insert(0, c)
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 if opts.get('datesort'):
depth = {}
for n in s:
depth[n] = 0
pl = [p for p in self.commitcache[n].parents if p not in self.map]
if pl:
depth[n] = max([depth[p] for p in pl]) + 1
s = [(depth[n], self.commitcache[n].date, n) for n in s]
s.sort()
s = [e[2] for e in s]
mpm@selenic.com
Add new convert-repo script...
r316 return s
def copy(self, rev):
Matt Mackall
convert-repo: add CVS branch support
r3954 c = self.commitcache[rev]
mpm@selenic.com
Add new convert-repo script...
r316 files = self.source.getchanges(rev)
Matt Mackall
convert-repo: add CVS exec bit support
r3956 for f,v in files:
mpm@selenic.com
Add new convert-repo script...
r316 try:
data = self.source.getfile(f, v)
except IOError, inst:
self.dest.delfile(f)
else:
Matt Mackall
convert-repo: add CVS exec bit support
r3956 e = self.source.getmode(f, v)
mpm@selenic.com
Add new convert-repo script...
r316 self.dest.putfile(f, e, data)
Matt Mackall
convert-repo: add CVS branch support
r3954 r = [self.map[v] for v in c.parents]
Matt Mackall
convert-repo: add CVS exec bit support
r3956 f = [f for f,v in files]
Matt Mackall
convert-repo: add CVS branch support
r3954 self.map[rev] = self.dest.putcommit(f, r, c)
mpm@selenic.com
Add new convert-repo script...
r316 file(self.mapfile, "a").write("%s %s\n" % (rev, self.map[rev]))
def convert(self):
Matt Mackall
convert-repo: add some smarts...
r3938 status("scanning source...\n")
mpm@selenic.com
Add new convert-repo script...
r316 heads = self.source.getheads()
parents = self.walktree(heads)
Matt Mackall
convert-repo: add some smarts...
r3938 status("sorting...\n")
mpm@selenic.com
Add new convert-repo script...
r316 t = self.toposort(parents)
num = len(t)
Matt Mackall
Revert convert-repo changes
r1715 c = None
mpm@selenic.com
Add new convert-repo script...
r316
Matt Mackall
convert-repo: add some smarts...
r3938 status("converting...\n")
mpm@selenic.com
Add new convert-repo script...
r316 for c in t:
num -= 1
Matt Mackall
convert-repo: add CVS branch support
r3954 desc = self.commitcache[c].desc
Matt Mackall
convert-repo: add basic CVS import support
r3953 if "\n" in desc:
desc = desc.splitlines()[0]
Matt Mackall
convert-repo: add some smarts...
r3938 status("%d %s\n" % (num, desc))
mpm@selenic.com
Add new convert-repo script...
r316 self.copy(c)
mpm@selenic.com
Teach convert-repo about tags...
r694 tags = self.source.gettags()
ctags = {}
for k in tags:
v = tags[k]
if v in self.map:
ctags[k] = self.map[v]
Matt Mackall
Revert convert-repo changes
r1715 if c and ctags:
Matt Mackall
convert-repo: linearize the tag commit
r1387 nrev = self.dest.puttags(ctags)
# write another hash correspondence to override the previous
# one so we don't end up with extra tag heads
Matt Mackall
convert-repo: avoid adding bogus value to shamap on tag update
r3911 if nrev:
file(self.mapfile, "a").write("%s %s\n" % (c, nrev))
mpm@selenic.com
Teach convert-repo about tags...
r694
Matt Mackall
convert-repo: add some smarts...
r3938 def command(src, dest=None, mapfile=None, **opts):
srcc = converter(src)
if not hasattr(srcc, "getcommit"):
abort("%s: can't read from this repo type\n" % src)
if not dest:
dest = src + "-hg"
status("assuming destination %s\n" % dest)
if not os.path.isdir(dest):
status("creating repository %s\n" % dest)
os.system("hg init " + dest)
destc = converter(dest)
if not hasattr(destc, "putcommit"):
abort("%s: can't write to this repo type\n" % src)
mpm@selenic.com
Add new convert-repo script...
r316
Matt Mackall
convert-repo: add some smarts...
r3938 if not mapfile:
try:
mapfile = destc.mapfile()
except:
mapfile = os.path.join(destc, "map")
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 c = convert(srcc, destc, mapfile, opts)
Matt Mackall
convert-repo: add some smarts...
r3938 c.convert()
Matt Mackall
convert-repo: add option to attempt to sort by date
r3957 options = [('q', 'quiet', None, 'suppress output'),
('', 'datesort', None, 'try to sort changesets by date')]
Matt Mackall
convert-repo: add some smarts...
r3938 opts = {}
args = fancyopts.fancyopts(sys.argv[1:], options, opts)
if opts['quiet']:
quiet = 1
try:
command(*args, **opts)
except Abort, inst:
warn(inst)
except KeyboardInterrupt:
status("interrupted\n")