##// END OF EJS Templates
cmdutil: templating keywords latesttag and latesttagdistance...
cmdutil: templating keywords latesttag and latesttagdistance This can be used for referring to revisions in a reasonable meaningful, stable and monotonically increasing way, suitable for releases or builds directly from a repository. The latest tag is found by searching through untagged ancestors and finding the latest tagged ancestor based on tag date. The distance is found from the length of the longest path to the tagged revision. For example: hg log -l1 --template '{latesttag}+{latesttagdistance}\n' can return 1.3.1+197 This is mostly work by Gilles Moris <gilles.moris@free.fr>

File last commit:

r9527:b3c13e72 default
r9536:f04d1791 default
Show More
darcs.py
135 lines | 4.9 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
# GNU General Public License version 2, incorporated herein by reference.
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!
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
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()
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
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'))
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