# HG changeset patch # User Bryan O'Sullivan # Date 1191358151 25200 # Node ID 6b6104430964e6468e1a8885c3efbb7cd1d6295e # Parent 4fbd27bf04b1b97a567c2834f42a1a817fe67cd2 convert: support darcs as a source repo diff --git a/contrib/darcs2hg.py b/contrib/darcs2hg.py --- a/contrib/darcs2hg.py +++ b/contrib/darcs2hg.py @@ -3,12 +3,15 @@ # vim: tw=80 ts=4 sw=4 noet # ----------------------------------------------------------------------------- # Project : Basic Darcs to Mercurial conversion script +# +# *** DEPRECATED. Use the convert extension instead. This script will +# *** be removed soon. +# # ----------------------------------------------------------------------------- # Authors : Sebastien Pierre # TK Soh # ----------------------------------------------------------------------------- # Creation : 24-May-2006 -# Last mod : 05-Jun-2006 # ----------------------------------------------------------------------------- import os, sys @@ -217,6 +220,7 @@ if __name__ == "__main__": else: print USAGE sys.exit(-1) + print 'This command is deprecated. Use the convert extension instead.' # Initializes the target repo if not os.path.isdir(darcs_repo + "/_darcs"): print "No darcs directory found at: " + darcs_repo diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py --- a/hgext/convert/__init__.py +++ b/hgext/convert/__init__.py @@ -7,6 +7,7 @@ from common import NoRepo, converter_source, converter_sink from cvs import convert_cvs +from darcs import darcs_source from git import convert_git from hg import mercurial_source, mercurial_sink from subversion import convert_svn, debugsvnlog @@ -18,7 +19,7 @@ from mercurial.i18n import _ commands.norepo += " convert debugsvnlog" converters = [convert_cvs, convert_git, convert_svn, mercurial_source, - mercurial_sink] + mercurial_sink, darcs_source] def convertsource(ui, path, **opts): for c in converters: @@ -371,9 +372,10 @@ def convert(ui, src, dest=None, revmapfi """Convert a foreign SCM repository to a Mercurial one. Accepted source formats: - - GIT - CVS - - SVN + - Darcs + - git + - Subversion Accepted destination formats: - Mercurial diff --git a/hgext/convert/darcs.py b/hgext/convert/darcs.py new file mode 100644 --- /dev/null +++ b/hgext/convert/darcs.py @@ -0,0 +1,137 @@ +# darcs support for the convert extension + +from common import NoRepo, commit, converter_source +from mercurial.i18n import _ +from mercurial import util +import os, shutil, tempfile + +# The naming drift of ElementTree is fun! + +try: from xml.etree.cElementTree import ElementTree +except ImportError: + try: from xml.etree.ElementTree import ElementTree + except ImportError: + try: from elementtree.cElementTree import ElementTree + except ImportError: + try: from elementtree.ElementTree import ElementTree + except ImportError: ElementTree = None + + +class darcs_source(converter_source): + def __init__(self, ui, path, rev=None): + super(darcs_source, self).__init__(ui, path, rev=rev) + + if not os.path.exists(os.path.join(path, '_darcs', 'inventory')): + raise NoRepo("couldn't open darcs repo %s" % path) + + if ElementTree is None: + raise util.Abort(_("Python ElementTree module is not available")) + + self.path = os.path.realpath(path) + + self.lastrev = None + self.changes = {} + self.parents = {} + self.tags = {} + + def before(self): + self.tmppath = tempfile.mkdtemp( + prefix='convert-' + os.path.basename(self.path) + '-') + output, status = self.run('init', repodir=self.tmppath) + self.checkexit(status) + + tree = self.xml('changes', '--xml-output', '--summary') + tagname = None + child = None + for elt in tree.findall('patch'): + node = elt.get('hash') + name = elt.findtext('name', '') + if name.startswith('TAG '): + tagname = name[4:].strip() + elif tagname is not None: + self.tags[tagname] = node + tagname = None + self.changes[node] = elt + self.parents[child] = [node] + child = node + self.parents[child] = [] + + def after(self): + self.ui.debug('cleaning up %s\n' % self.tmppath) + #shutil.rmtree(self.tmppath, ignore_errors=True) + + def _run(self, cmd, *args, **kwargs): + cmdline = 'darcs %s --repodir=%r %s