# 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