##// END OF EJS Templates
sslutil: set context security level for legacy tls testing (issue6760)...
sslutil: set context security level for legacy tls testing (issue6760) Current versions of OpenSSL do not allow the use of TLS <1.2 when the library's security level is >=1 (1 being the default on most distributions). Setting the security level in addition to the minimum protocol is therefore necessary for the legacy protocol tests. This is done here ONLY when testing, when: - explicitly setting the cipher string, or - using the "--insecure" flag, or - using the "devel.serverexactprotocol" testing option. See: https://github.com/openssl/openssl/blob/master/NEWS.md#major-changes-between-openssl-30-and-openssl-310-14-mar-2023

File last commit:

r50762:668fb0dc default
r51294:c54e9bb5 stable
Show More
darcs.py
223 lines | 7.7 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
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2007-2009 Olivia Mackall <olivia@selenic.com> and others
Martin Geisler
convert: add copyright and license headers to back-ends
r8250 #
# 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
timeless
convert: darcs use absolute_import
r28368 import os
import re
import shutil
Ian Moody
convert: remove old ElementTree import cruft from darcs...
r50265 from xml.etree.ElementTree import (
ElementTree,
XMLParser,
)
Yuya Nishihara
py3: wrap tempfile.mkdtemp() to use bytes path...
r38183
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 from mercurial.i18n import _
timeless
convert: darcs use absolute_import
r28368 from mercurial import (
error,
Yuya Nishihara
py3: wrap tempfile.mkdtemp() to use bytes path...
r38183 pycompat,
timeless
convert: darcs use absolute_import
r28368 util,
)
Boris Feld
util: extract all date-related utils in utils/dateutil module...
r36625 from mercurial.utils import dateutil
timeless
convert: darcs use absolute_import
r28368 from . import common
Augie Fackler
formatting: blacken the codebase...
r43346
timeless
convert: darcs use absolute_import
r28368 NoRepo = common.NoRepo
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Augie Fackler
formatting: blacken the codebase...
r43346
timeless
convert: darcs use absolute_import
r28368 class darcs_source(common.converter_source, common.commandline):
Matt Harbison
convert: save an indicator of the repo type for sources and sinks...
r35168 def __init__(self, ui, repotype, path, revs=None):
common.converter_source.__init__(self, ui, repotype, path, revs=revs)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 common.commandline.__init__(self, ui, b'darcs')
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 # check for _darcs, ElementTree so that we can easily skip
# test-convert-darcs if ElementTree is not around
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if not os.path.exists(os.path.join(path, b'_darcs')):
raise NoRepo(_(b"%s does not look like a darcs repository") % path)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 common.checktool(b'darcs')
version = self.run0(b'--version').splitlines()[0].strip()
if version < b'2.1':
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'darcs version 2.1 or newer needed (found %r)') % version
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
convert: fail if an external required tool is not found
r5497
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 if "ElementTree" not in globals():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"Python ElementTree module is not available"))
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
Matt Mackall
backout dbdb777502dc (issue3077) (issue3071)...
r15381 self.path = os.path.realpath(path)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
self.lastrev = None
self.changes = {}
self.parents = {}
self.tags = {}
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 # Check darcs repository format
format = self.format()
if format:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if format in (b'darcs-1.0', b'hashed'):
Augie Fackler
formatting: blacken the codebase...
r43346 raise NoRepo(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(
b"%s repository format is unsupported, "
b"please upgrade"
)
Augie Fackler
formatting: blacken the codebase...
r43346 % format
)
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.ui.warn(_(b'failed to detect repository format!'))
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 def before(self):
Yuya Nishihara
py3: wrap tempfile.mkdtemp() to use bytes path...
r38183 self.tmppath = pycompat.mkdtemp(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 prefix=b'convert-' + os.path.basename(self.path) + b'-'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 output, status = self.run(b'init', repodir=self.tmppath)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 self.checkexit(status)
Augie Fackler
formatting: blacken the codebase...
r43346 tree = self.xml(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'changes', xml_output=True, summary=True, repodir=self.path
Augie Fackler
formatting: blacken the codebase...
r43346 )
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 tagname = None
child = None
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 for elt in tree.findall('patch'):
node = self.recode(elt.get('hash'))
name = self.recode(elt.findtext('name', ''))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if name.startswith(b'TAG '):
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 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):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.ui.debug(b'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
Brodie Rao
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)...
r12717 def recode(self, s, encoding=None):
Gregory Szorc
py3: use str instead of pycompat.unicode...
r49789 if isinstance(s, str):
Brodie Rao
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)...
r12717 # XMLParser returns unicode objects for anything it can't
# encode into ASCII. We convert them back to str to get
# recode's normal conversion behavior.
s = s.encode('latin-1')
return super(darcs_source, self).recode(s, encoding)
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()
Brodie Rao
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)...
r12717 # While we are decoding the XML as latin-1 to be as liberal as
# possible, etree will still raise an exception if any
# non-printable characters are in the XML changelog.
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 parser = XMLParser(encoding='latin-1')
Patrick Mezard
convert: use subprocess for all commandline calls...
r17413 p = self._run(cmd, **kwargs)
etree.parse(p.stdout, parser=parser)
p.wait()
self.checkexit(p.returncode)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 return etree.getroot()
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 def format(self):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 output, status = self.run(b'show', b'repo', repodir=self.path)
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 self.checkexit(status)
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 m = re.search(br'^\s*Format:\s*(.*)$', output, re.MULTILINE)
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393 if not m:
return None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b','.join(sorted(f.strip() for f in m.group(1).split(b',')))
Patrick Mezard
convert/darcs: improve unsupported format detection (issue2172)
r12393
Patrick Mezard
convert/darcs: handle directory renaming
r9527 def manifest(self):
man = []
Augie Fackler
formatting: blacken the codebase...
r43346 output, status = self.run(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'show', b'files', no_directories=True, repodir=self.tmppath
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
convert/darcs: handle directory renaming
r9527 self.checkexit(status)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for line in output.split(b'\n'):
Patrick Mezard
convert/darcs: handle directory renaming
r9527 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]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 dateformat = b'%a %b %d %H:%M:%S %Z %Y'
Matt Harbison
convert: stop passing str to the dateutil API in darcs...
r50762 date = dateutil.strdate(self.recode(elt.get('local_date')), dateformat)
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 newdateformat = b'%Y-%m-%d %H:%M:%S %1%2'
Augie Fackler
formatting: blacken the codebase...
r43346 return common.commit(
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 author=self.recode(elt.get('author')),
Augie Fackler
formatting: blacken the codebase...
r43346 date=dateutil.datestr(date, newdateformat),
desc=self.recode(desc).strip(),
parents=self.parents[rev],
)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
def pull(self, rev):
Augie Fackler
formatting: blacken the codebase...
r43346 output, status = self.run(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'pull',
Augie Fackler
formatting: blacken the codebase...
r43346 self.path,
all=True,
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 match=b'hash %s' % self.recode(rev),
Augie Fackler
formatting: blacken the codebase...
r43346 no_test=True,
no_posthook=True,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 external_merge=b'/bin/false',
Augie Fackler
formatting: blacken the codebase...
r43346 repodir=self.tmppath,
)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 if status:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if output.find(b'We have conflicts in') == -1:
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 self.checkexit(status, output)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 output, status = self.run(b'revert', all=True, repodir=self.tmppath)
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 self.checkexit(status, output)
Mads Kiilerich
convert: introduce --full for converting all files...
r22300 def getchanges(self, rev, full):
if full:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"convert from darcs does not support --full"))
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 copies = {}
changes = []
Patrick Mezard
convert/darcs: handle directory renaming
r9527 man = None
Ian Moody
py3: stop using deprecated Element.getchildren() method in convert/darcs...
r50267 for elt in self.changes[rev].find('summary'):
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 if elt.tag in ('add_directory', 'remove_directory'):
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 continue
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 if elt.tag == 'move':
Patrick Mezard
convert/darcs: handle directory renaming
r9527 if man is None:
man = self.manifest()
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 source = self.recode(elt.get('from'))
dest = self.recode(elt.get('to'))
Patrick Mezard
convert/darcs: handle directory renaming
r9527 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
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 source = source + b'/'
Patrick Mezard
convert/darcs: handle directory renaming
r9527 for f in man:
if not f.startswith(source):
continue
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fdest = dest + b'/' + f[len(source) :]
Patrick Mezard
convert/darcs: handle directory renaming
r9527 changes.append((f, rev))
changes.append((fdest, rev))
copies[fdest] = f
Bryan O'Sullivan
convert: support darcs as a source repo
r5359 else:
Ian Moody
py3: fix bytes/unicode issues in convert/darcs...
r50266 changes.append((self.recode(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
Mads Kiilerich
convert: optimize convert of files that are unmodified from p2 in merges...
r24395 return sorted(changes), copies, set()
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
def getfile(self, name, rev):
if rev != self.lastrev:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'internal calling inconsistency'))
Patrick Mezard
convert: merge sources getmode() into getfile()
r11134 path = os.path.join(self.tmppath, name)
Mads Kiilerich
convert: use None value for missing files instead of overloading IOError...
r22296 try:
data = util.readfile(path)
mode = os.lstat(path).st_mode
Manuel Jacob
py3: catch FileNotFoundError instead of checking errno == ENOENT
r50201 except FileNotFoundError:
return None, None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 mode = (mode & 0o111) and b'x' or b''
Patrick Mezard
convert: merge sources getmode() into getfile()
r11134 return data, mode
Bryan O'Sullivan
convert: support darcs as a source repo
r5359
def gettags(self):
return self.tags