##// END OF EJS Templates
Merge with crew...
Merge with crew Those crew folks are getting lazy about pulling from upstream before committing.

File last commit:

r5441:71e7c86a default
r5443:58496354 merge default
Show More
__init__.py
398 lines | 12.9 KiB | text/x-python | PythonLexer
Edouard Gomez
Turns convert.py into a real extension
r4513 # convert.py Foreign SCM converter
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 #
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 #
Edouard Gomez
Turns convert.py into a real extension
r4513 # This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: allow the converter_source to say "skip this revision"...
r5374 from common import NoRepo, SKIPREV, converter_source, converter_sink
Brendan Cully
Split convert extension into common and repository type modules
r4536 from cvs import convert_cvs
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 from darcs import darcs_source
Brendan Cully
Split convert extension into common and repository type modules
r4536 from git import convert_git
Bryan O'Sullivan
convert: Support Mercurial as a source, as well as a sink
r5013 from hg import mercurial_source, mercurial_sink
Bryan O'Sullivan
convert: rename convert_svn to svn_source
r5438 from subversion import svn_source, debugsvnlog
Alexis S. L. Carvalho
convert: readd --filemap...
r5377 import filemap
Brendan Cully
Split convert extension into common and repository type modules
r4536
Alexis S. L. Carvalho
convert: move filemapper class to a separate file
r5376 import os, shutil
Thomas Arendsen Hein
Some small cleanups for convert extension:...
r4532 from mercurial import hg, ui, util, commands
Bryan O'Sullivan
convert: add filename filtering and renaming support
r5016 from mercurial.i18n import _
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Thomas Arendsen Hein
convert: Use debugsvnlog instead of git-like debug-svn-log.
r5138 commands.norepo += " convert debugsvnlog"
Edouard Gomez
Turns convert.py into a real extension
r4513
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 source_converters = [
('cvs', convert_cvs),
('git', convert_git),
('svn', svn_source),
('hg', mercurial_source),
('darcs', darcs_source),
]
sink_converters = [
('hg', mercurial_sink),
]
def convertsource(ui, path, type, rev):
for name, source in source_converters:
Brendan Cully
convert: split converter into convertsource and convertsink
r4763 try:
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 if not type or name == type:
return source(ui, path, rev)
Benoit Boissinot
convert: do not output when trying to load svn bindings
r5415 except NoRepo, inst:
ui.note(_("convert: %s\n") % inst)
Brendan Cully
convert: split converter into convertsource and convertsink
r4763 raise util.Abort('%s: unknown repository type' % path)
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 def convertsink(ui, path, type):
for name, sink in sink_converters:
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 try:
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 if not type or name == type:
return sink(ui, path)
Benoit Boissinot
convert: do not output when trying to load svn bindings
r5415 except NoRepo, inst:
ui.note(_("convert: %s\n") % inst)
Brendan Cully
convert: split converter into convertsource and convertsink
r4763 raise util.Abort('%s: unknown repository type' % path)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: rename a class and a function
r5281 class converter(object):
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 def __init__(self, ui, source, dest, revmapfile, opts):
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
self.source = source
self.dest = dest
Edouard Gomez
Turns convert.py into a real extension
r4513 self.ui = ui
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 self.opts = opts
self.commitcache = {}
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 self.revmapfile = revmapfile
self.revmapfilefd = None
Edouard Gomez
convert extension: Add support for username mapping...
r4589 self.authors = {}
Brendan Cully
convert: fix various authormap handling bugs
r4590 self.authorfile = None
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: pass the order of the revmapfile to the converter_source...
r5373 self.maporder = []
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 self.map = {}
try:
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 origrevmapfile = open(self.revmapfile, 'r')
for l in origrevmapfile:
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 sv, dv = l[:-1].split()
Alexis S. L. Carvalho
convert: pass the order of the revmapfile to the converter_source...
r5373 if sv not in self.map:
self.maporder.append(sv)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 self.map[sv] = dv
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 origrevmapfile.close()
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 except IOError:
pass
Edouard Gomez
convert extension: Add support for username mapping...
r4589 # Read first the dst author map if any
Brendan Cully
convert: fix various authormap handling bugs
r4590 authorfile = self.dest.authorfile()
if authorfile and os.path.exists(authorfile):
self.readauthormap(authorfile)
Edouard Gomez
convert extension: Add support for username mapping...
r4589 # Extend/Override with new author map if necessary
Brendan Cully
convert: fix various authormap handling bugs
r4590 if opts.get('authors'):
Edouard Gomez
convert extension: Add support for username mapping...
r4589 self.readauthormap(opts.get('authors'))
Brendan Cully
convert: fix various authormap handling bugs
r4590 self.authorfile = self.dest.authorfile()
Edouard Gomez
convert extension: Add support for username mapping...
r4589
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 def walktree(self, heads):
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 '''Return a mapping that identifies the uncommitted parents of every
uncommitted changeset.'''
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 visit = heads
known = {}
parents = {}
while visit:
n = visit.pop(0)
if n in known or n in self.map: continue
known[n] = 1
Patrick Mezard
convert: wrap cached commits author remapping
r5203 commit = self.cachecommit(n)
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 parents[n] = []
Patrick Mezard
convert: wrap cached commits author remapping
r5203 for p in commit.parents:
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 parents[n].append(p)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 visit.append(p)
return parents
def toposort(self, parents):
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 '''Return an ordering such that every uncommitted changeset is
preceeded by all its uncommitted ancestors.'''
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 visit = parents.keys()
seen = {}
children = {}
while visit:
n = visit.pop(0)
if n in seen: continue
seen[n] = 1
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 # Ensure that nodes without parents are present in the 'children'
# mapping.
children.setdefault(n, [])
for p in parents[n]:
if not p in self.map:
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 visit.append(p)
Hollis Blanchard
fix 'convert' with single commit repositories...
r4719 children.setdefault(p, []).append(n)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
s = []
removed = {}
visit = children.keys()
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
if n not in self.map:
s.append(n)
if n in children:
for c in children[n]:
visit.insert(0, c)
Edouard Gomez
Turns convert.py into a real extension
r4513 if self.opts.get('datesort'):
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 depth = {}
for n in s:
depth[n] = 0
Thomas Arendsen Hein
Some small cleanups for convert extension:...
r4532 pl = [p for p in self.commitcache[n].parents
if p not in self.map]
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 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]
return s
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 def mapentry(self, src, dst):
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 if self.revmapfilefd is None:
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 try:
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 self.revmapfilefd = open(self.revmapfile, "a")
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 except IOError, (errno, strerror):
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 raise util.Abort("Could not open map file %s: %s, %s\n" % (self.revmapfile, errno, strerror))
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 self.map[src] = dst
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 self.revmapfilefd.write("%s %s\n" % (src, dst))
self.revmapfilefd.flush()
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588
Edouard Gomez
convert extension: Add support for username mapping...
r4589 def writeauthormap(self):
Brendan Cully
convert: fix various authormap handling bugs
r4590 authorfile = self.authorfile
if authorfile:
Edouard Gomez
convert extension: Add support for username mapping...
r4589 self.ui.status('Writing author map file %s\n' % authorfile)
ofile = open(authorfile, 'w+')
for author in self.authors:
ofile.write("%s=%s\n" % (author, self.authors[author]))
ofile.close()
def readauthormap(self, authorfile):
Brendan Cully
convert: fix various authormap handling bugs
r4590 afile = open(authorfile, 'r')
for line in afile:
try:
srcauthor = line.split('=')[0].strip()
dstauthor = line.split('=')[1].strip()
if srcauthor in self.authors and dstauthor != self.authors[srcauthor]:
self.ui.status(
'Overriding mapping for author %s, was %s, will be %s\n'
% (srcauthor, self.authors[srcauthor], dstauthor))
else:
self.ui.debug('Mapping author %s to %s\n'
% (srcauthor, dstauthor))
Edouard Gomez
convert extension: Add support for username mapping...
r4589 self.authors[srcauthor] = dstauthor
Brendan Cully
convert: fix various authormap handling bugs
r4590 except IndexError:
self.ui.warn(
'Ignoring bad line in author file map %s: %s\n'
% (authorfile, line))
afile.close()
Edouard Gomez
convert extension: Add support for username mapping...
r4589
Patrick Mezard
convert: wrap cached commits author remapping
r5203 def cachecommit(self, rev):
commit = self.source.getcommit(rev)
commit.author = self.authors.get(commit.author, commit.author)
self.commitcache[rev] = commit
return commit
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 def copy(self, rev):
Bryan O'Sullivan
convert: add filename filtering and renaming support
r5016 commit = self.commitcache[rev]
do_copies = hasattr(self.dest, 'copyfile')
filenames = []
Thomas Arendsen Hein
removed trailing whitespace
r4957
Alexis S. L. Carvalho
convert: allow the converter_source to say "skip this revision"...
r5374 changes = self.source.getchanges(rev)
if isinstance(changes, basestring):
if changes == SKIPREV:
dest = SKIPREV
else:
dest = self.map[changes]
self.mapentry(rev, dest)
return
files, copies = changes
Brendan Cully
convert: hg: optionally create branches as clones...
r5173 parents = [self.map[r] for r in commit.parents]
if commit.parents:
Patrick Mezard
convert: load parent commits on-demand
r5204 prev = commit.parents[0]
if prev not in self.commitcache:
self.cachecommit(prev)
pbranch = self.commitcache[prev].branch
Brendan Cully
convert: hg: optionally create branches as clones...
r5173 else:
pbranch = None
self.dest.setbranch(commit.branch, pbranch, parents)
Brendan Cully
convert: look up copies in getchanges instead of getcommit...
r5121 for f, v in files:
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 filenames.append(f)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 try:
data = self.source.getfile(f, v)
except IOError, inst:
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 self.dest.delfile(f)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 else:
e = self.source.getmode(f, v)
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 self.dest.putfile(f, e, data)
Daniel Holth
convert extension: Add SVN converter
r4765 if do_copies:
Brendan Cully
convert: look up copies in getchanges instead of getcommit...
r5121 if f in copies:
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 copyf = copies[f]
# Merely marks that a copy happened.
self.dest.copyfile(copyf, f)
Daniel Holth
convert extension: Add SVN converter
r4765
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 newnode = self.dest.putcommit(filenames, parents, commit)
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 self.mapentry(rev, newnode)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
def convert(self):
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 try:
Bryan O'Sullivan
convert: add before/after hooks for converter sources
r5356 self.source.before()
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 self.dest.before()
Alexis S. L. Carvalho
convert: pass the order of the revmapfile to the converter_source...
r5373 self.source.setrevmap(self.map, self.maporder)
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 self.ui.status("scanning source...\n")
heads = self.source.getheads()
parents = self.walktree(heads)
self.ui.status("sorting...\n")
t = self.toposort(parents)
num = len(t)
c = None
self.ui.status("converting...\n")
for c in t:
num -= 1
desc = self.commitcache[c].desc
if "\n" in desc:
desc = desc.splitlines()[0]
self.ui.status("%d %s\n" % (num, desc))
self.copy(c)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 tags = self.source.gettags()
ctags = {}
for k in tags:
v = tags[k]
Alexis S. L. Carvalho
convert: allow the converter_source to say "skip this revision"...
r5374 if self.map.get(v, SKIPREV) != SKIPREV:
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 ctags[k] = self.map[v]
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 if c and ctags:
nrev = self.dest.puttags(ctags)
# write another hash correspondence to override the previous
# one so we don't end up with extra tag heads
if nrev:
self.mapentry(c, nrev)
Edouard Gomez
convert extension: Add support for username mapping...
r4589
self.writeauthormap()
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 finally:
self.cleanup()
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Edouard Gomez
convert extension: Save a few opens on the map file...
r4588 def cleanup(self):
Bryan O'Sullivan
convert: add before/after hooks for converter sources
r5356 try:
self.dest.after()
finally:
self.source.after()
Bryan O'Sullivan
convert: acquire/release locks periodically
r5014 if self.revmapfilefd:
self.revmapfilefd.close()
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: rename a class and a function
r5281 def convert(ui, src, dest=None, revmapfile=None, **opts):
Thomas Arendsen Hein
Backout ad09ce1d393c and replace ''' with """ to make some highlighting happy....
r4958 """Convert a foreign SCM repository to a Mercurial one.
Edouard Gomez
Turns convert.py into a real extension
r4513
Accepted source formats:
- CVS
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 - Darcs
- git
- Subversion
Edouard Gomez
Turns convert.py into a real extension
r4513
Accepted destination formats:
- Mercurial
Brendan Cully
convert: add -r argument specifying latest revision to convert
r4760 If no revision is given, all revisions will be converted. Otherwise,
convert will only import up to the named revision (given in a format
understood by the source).
Thomas Arendsen Hein
convert: Use clone's behaviour for the default destionation name....
r4883 If no destination directory name is specified, it defaults to the
Thomas Arendsen Hein
Backout ad09ce1d393c and replace ''' with """ to make some highlighting happy....
r4958 basename of the source with '-hg' appended. If the destination
repository doesn't exist, it will be created.
Edouard Gomez
Turns convert.py into a real extension
r4513
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 If <revmapfile> isn't given, it will be put in a default location
(<dest>/.hg/shamap by default). The <revmapfile> is a simple text
Thomas Arendsen Hein
convert: Use clone's behaviour for the default destionation name....
r4883 file that maps each source commit ID to the destination ID for
that revision, like so:
Edouard Gomez
Turns convert.py into a real extension
r4513 <source ID> <destination ID>
Thomas Arendsen Hein
Backout ad09ce1d393c and replace ''' with """ to make some highlighting happy....
r4958 If the file doesn't exist, it's automatically created. It's updated
Edouard Gomez
Turns convert.py into a real extension
r4513 on each commit copied, so convert-repo can be interrupted and can
be run repeatedly to copy new commits.
Edouard Gomez
convert extension: Add support for username mapping...
r4589
The [username mapping] file is a simple text file that maps each source
commit author to a destination commit author. It is handy for source SCMs
that use unix logins to identify authors (eg: CVS). One line per author
mapping and the line format is:
srcauthor=whatever string you want
Bryan O'Sullivan
convert: document filemap.
r5256
The filemap is a file that allows filtering and remapping of files
and directories. Comment lines start with '#'. Each line can
contain one of the following directives:
include path/to/file
exclude path/to/file
rename from/file to/file
The 'include' directive causes a file, or all files under a
directory, to be included in the destination repository. The
'exclude' directive causes files or directories to be omitted.
The 'rename' directive renames a file or directory. To rename
from a subdirectory into the root of the repository, use '.' as
the path to rename to.
Thomas Arendsen Hein
Backout ad09ce1d393c and replace ''' with """ to make some highlighting happy....
r4958 """
Edouard Gomez
Turns convert.py into a real extension
r4513
Alexis S. L. Carvalho
convert: manually set encoding to UTF-8...
r4895 util._encoding = 'UTF-8'
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 if not dest:
Thomas Arendsen Hein
convert: Use clone's behaviour for the default destionation name....
r4883 dest = hg.defaultdest(src) + "-hg"
Edouard Gomez
Turns convert.py into a real extension
r4513 ui.status("assuming destination %s\n" % dest)
Edouard Gomez
Add some more smart when initializing destination repository
r4521
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 destc = convertsink(ui, dest, opts.get('dest_type'))
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Brendan Cully
convert: initialize source after destination, cleaning up if source is unusable
r4761 try:
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 srcc = convertsource(ui, src, opts.get('source_type'),
opts.get('rev'))
Brendan Cully
convert: initialize source after destination, cleaning up if source is unusable
r4761 except Exception:
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 for path in destc.created:
shutil.rmtree(path, True)
Brendan Cully
convert: initialize source after destination, cleaning up if source is unusable
r4761 raise
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: readd --filemap...
r5377 fmap = opts.get('filemap')
if fmap:
srcc = filemap.filemap_source(ui, srcc, fmap)
Alexis S. L. Carvalho
convert: add a mode where mercurial_sink skips empty revisions....
r5378 destc.setfilemapmode(True)
Alexis S. L. Carvalho
convert: readd --filemap...
r5377
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 if not revmapfile:
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 try:
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 revmapfile = destc.revmapfile()
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 except:
Bryan O'Sullivan
convert: rename mapfile to revmapfile, so we can map more than just revs
r5011 revmapfile = os.path.join(destc, "map")
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512
Alexis S. L. Carvalho
convert: disable current --filemap support...
r5375 c = converter(ui, srcc, destc, revmapfile, opts)
Thomas Arendsen Hein
Move convert-repo to hgext/convert/__init__.py
r4512 c.convert()
Patrick Mezard
convert: replace fork with subprocess call.
r5127
Edouard Gomez
Turns convert.py into a real extension
r4513 cmdtable = {
Thomas Arendsen Hein
Some small cleanups for convert extension:...
r4532 "convert":
Alexis S. L. Carvalho
convert: rename a class and a function
r5281 (convert,
Edouard Gomez
convert extension: Add support for username mapping...
r4589 [('A', 'authors', '', 'username mapping filename'),
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 ('d', 'dest-type', '', 'destination repository type'),
Bryan O'Sullivan
convert: add filename filtering and renaming support
r5016 ('', 'filemap', '', 'remap file names using contents of file'),
Brendan Cully
convert: add -r argument specifying latest revision to convert
r4760 ('r', 'rev', '', 'import up to target revision REV'),
Bryan O'Sullivan
convert: refactor sink initialisation, to remove hardcoding of hg...
r5441 ('s', 'source-type', '', 'source repository type'),
Edouard Gomez
convert extension: Add support for username mapping...
r4589 ('', 'datesort', None, 'try to sort changesets by date')],
Thomas Arendsen Hein
Some small cleanups for convert extension:...
r4532 'hg convert [OPTION]... SOURCE [DEST [MAPFILE]]'),
Thomas Arendsen Hein
convert: Use debugsvnlog instead of git-like debug-svn-log.
r5138 "debugsvnlog":
Patrick Mezard
convert: replace fork with subprocess call.
r5127 (debugsvnlog,
[],
Thomas Arendsen Hein
convert: Use debugsvnlog instead of git-like debug-svn-log.
r5138 'hg debugsvnlog'),
Edouard Gomez
Turns convert.py into a real extension
r4513 }
Patrick Mezard
convert: replace fork with subprocess call.
r5127