##// END OF EJS Templates
verify: fix "missing revlog!" errors for revlog format v0 and add test...
verify: fix "missing revlog!" errors for revlog format v0 and add test With revlog format v0 the .d files are empty if the only revision stored is an empty file. Since Mercurial can no longer create format v0 repositories, but still use it, add a script which creates a repository with a single empty file. This can be used in other tests if wanted.

File last commit:

r11134:33010ff1 default
r12170:581066a3 stable
Show More
darcs.py
167 lines | 6.0 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):
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', '')
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)
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