##// END OF EJS Templates
test-archive: silence stupid messages from GNU tar...
test-archive: silence stupid messages from GNU tar Recent versions of GNU tar have apparently decided they're old enough that it's ok for them to prattle on senselessly about things no one cares about without anyone objecting. We object; apply duct tape.

File last commit:

r7973:db3a68fd default
r8145:0c2ba484 default
Show More
darcs.py
126 lines | 4.5 KiB | text/x-python | PythonLexer
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 # darcs support for the convert extension
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 from common import NoRepo, checktool, commandline, commit, converter_source
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 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
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 class darcs_source(converter_source, commandline):
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 def __init__(self, ui, path, rev=None):
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 converter_source.__init__(self, ui, path, rev=rev)
commandline.__init__(self, ui, 'darcs')
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Alexis S. L. Carvalho
test-convert-darcs: skip if we can't find the elementtree module...
r5520 # check for _darcs, ElementTree, _darcs/inventory so that we can
# easily skip test-convert-darcs if ElementTree is not around
Matt Mackall
convert: attempt to check repo type before checking for tool
r7973 if not os.path.exists(os.path.join(path, '_darcs', 'inventories')):
raise NoRepo("%s does not look like a darcs repo" % path)
Alexis S. L. Carvalho
test-convert-darcs: skip if we can't find the elementtree module...
r5520 if not os.path.exists(os.path.join(path, '_darcs')):
Alexis S. L. Carvalho
convert: display all errors if we couldn't open the source repo...
r5521 raise NoRepo("%s does not look like a darcs repo" % path)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Patrick Mezard
convert: fail if an external required tool is not found
r5497 checktool('darcs')
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 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)
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 tree = self.xml('changes', xml_output=True, summary=True,
repodir=self.path)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 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):
Martin Geisler
i18n: mark strings for translation in convert extension
r6956 self.ui.debug(_('cleaning up %s\n') % self.tmppath)
Bryan O'Sullivan
convert: fix a few residual bugs in darcs importer
r5362 shutil.rmtree(self.tmppath, ignore_errors=True)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 def xml(self, cmd, **kwargs):
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 etree = ElementTree()
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 fp = self._run(cmd, **kwargs)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 etree.parse(fp)
self.checkexit(fp.close())
return etree.getroot()
def getheads(self):
return self.parents[None]
def getcommit(self, rev):
elt = self.changes[rev]
date = util.strdate(elt.get('local_date'), '%a %b %d %H:%M:%S %Z %Y')
desc = elt.findtext('name') + '\n' + elt.findtext('comment', '')
return commit(author=elt.get('author'), date=util.datestr(date),
desc=desc.strip(), parents=self.parents[rev])
def pull(self, rev):
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 output, status = self.run('pull', self.path, all=True,
match='hash %s' % rev,
no_test=True, no_posthook=True,
external_merge='/bin/false',
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 repodir=self.tmppath)
if status:
if output.find('We have conflicts in') == -1:
self.checkexit(status, output)
Bryan O'Sullivan
convert: abstract darcs's commandline handling
r5512 output, status = self.run('revert', all=True, repodir=self.tmppath)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 self.checkexit(status, output)
def getchanges(self, rev):
self.pull(rev)
copies = {}
changes = []
for elt in self.changes[rev].find('summary').getchildren():
if elt.tag in ('add_directory', 'remove_directory'):
continue
if elt.tag == 'move':
changes.append((elt.get('from'), rev))
copies[elt.get('from')] = elt.get('to')
else:
changes.append((elt.text.strip(), rev))
self.lastrev = rev
Matt Mackall
util: add sort helper
r6762 return util.sort(changes), copies
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
def getfile(self, name, rev):
if rev != self.lastrev:
raise util.Abort(_('internal calling inconsistency'))
return open(os.path.join(self.tmppath, name), 'rb').read()
def getmode(self, name, rev):
mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
return (mode & 0111) and 'x' or ''
def gettags(self):
return self.tags