##// END OF EJS Templates
cleanup: use x in (a, b) instead of x == a or x == b
cleanup: use x in (a, b) instead of x == a or x == b

File last commit:

r12252:4481f8a9 stable
r12387:4f8067c9 default
Show More
darcs.py
173 lines | 6.3 KiB | text/x-python | PythonLexer
Martin Geisler
convert: add copyright and license headers to back-ends
r8250 # darcs.py - darcs support for the convert extension
#
# Copyright 2007-2009 Matt Mackall <mpm@selenic.com> and others
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
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!
Matt Mackall
many, many trivial check-code fixups
r10282 try:
from xml.etree.cElementTree import ElementTree
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 except ImportError:
Matt Mackall
many, many trivial check-code fixups
r10282 try:
from xml.etree.ElementTree import ElementTree
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 except ImportError:
Matt Mackall
many, many trivial check-code fixups
r10282 try:
from elementtree.cElementTree import ElementTree
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 except ImportError:
Matt Mackall
many, many trivial check-code fixups
r10282 try:
from elementtree.ElementTree import ElementTree
except ImportError:
ElementTree = None
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
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')):
Martin Geisler
convert: mark strings for translation
r10939 raise NoRepo(_("%s does not look like a darcs repository") % path)
Matt Mackall
convert: attempt to check repo type before checking for tool
r7973
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')):
Martin Geisler
convert: mark strings for translation
r10939 raise NoRepo(_("%s does not look like a darcs repository") % 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
issue1251: bail if darcs version is too old
r9242 version = self.run0('--version').splitlines()[0].strip()
if version < '2.1':
raise util.Abort(_('darcs version 2.1 or newer needed (found %r)') %
version)
Patrick Mezard
convert: fail if an external required tool is not found
r5497
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
do not attempt to translate ui.debug output
r9467 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):
Brodie Rao
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)...
r12252 # NOTE: darcs is currently encoding agnostic and will print
# patch metadata byte-for-byte, even in the XML changelog.
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()
Patrick Mezard
convert/darcs: handle directory renaming
r9527 def manifest(self):
man = []
output, status = self.run('show', 'files', no_directories=True,
repodir=self.tmppath)
self.checkexit(status)
for line in output.split('\n'):
path = line[2:]
if path:
man.append(path)
return man
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 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', '')
Brodie Rao
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)...
r12252 # etree can return unicode objects for name, comment, and author,
# so recode() is used to ensure str objects are emitted.
return commit(author=self.recode(elt.get('author')),
date=util.datestr(date),
desc=self.recode(desc).strip(),
parents=self.parents[rev])
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
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)
Dirkjan Ochtman
kill trailing whitespace
r9712 def getchanges(self, rev):
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 copies = {}
changes = []
Patrick Mezard
convert/darcs: handle directory renaming
r9527 man = None
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 for elt in self.changes[rev].find('summary').getchildren():
if elt.tag in ('add_directory', 'remove_directory'):
continue
if elt.tag == 'move':
Patrick Mezard
convert/darcs: handle directory renaming
r9527 if man is None:
man = self.manifest()
source, dest = elt.get('from'), elt.get('to')
if source in man:
# File move
changes.append((source, rev))
changes.append((dest, rev))
copies[dest] = source
else:
# Directory move, deduce file moves from manifest
source = source + '/'
for f in man:
if not f.startswith(source):
continue
fdest = dest + '/' + f[len(source):]
changes.append((f, rev))
changes.append((fdest, rev))
copies[fdest] = f
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 else:
changes.append((elt.text.strip(), rev))
Patrick Mezard
convert/darcs: handle directory renaming
r9527 self.pull(rev)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 self.lastrev = rev
Matt Mackall
replace util.sort with sorted built-in...
r8209 return sorted(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'))
Patrick Mezard
convert: merge sources getmode() into getfile()
r11134 path = os.path.join(self.tmppath, name)
data = open(path, 'rb').read()
mode = os.lstat(path).st_mode
mode = (mode & 0111) and 'x' or ''
return data, mode
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
def gettags(self):
return self.tags