Mercurial > hg
annotate hgext/convert/darcs.py @ 51316:178e50edb4f8
changelog: stop useless enforcing split at the end of transaction
Changelogs are no longer created inline, and existing changelogs are
automatically split. Since we now enforce splitting at the start of any write,
we don't need to enforce splitting at the end of the transaction.
This has the nice side effect of killing the only user of "side_write".
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 11 Jan 2024 16:35:52 +0100 |
parents | 668fb0dcb179 |
children | f4733654f144 |
rev | line source |
---|---|
8250
1b60efdb8bc5
convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
1 # darcs.py - darcs support for the convert extension |
1b60efdb8bc5
convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
43077
diff
changeset
|
3 # Copyright 2007-2009 Olivia Mackall <olivia@selenic.com> and others |
8250
1b60efdb8bc5
convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
4 # |
1b60efdb8bc5
convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
7 |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
8 import os |
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
9 import re |
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
10 import shutil |
49370
1572f790ee5e
convert: remove old ElementTree import cruft from darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49306
diff
changeset
|
11 from xml.etree.ElementTree import ( |
1572f790ee5e
convert: remove old ElementTree import cruft from darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49306
diff
changeset
|
12 ElementTree, |
1572f790ee5e
convert: remove old ElementTree import cruft from darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49306
diff
changeset
|
13 XMLParser, |
1572f790ee5e
convert: remove old ElementTree import cruft from darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49306
diff
changeset
|
14 ) |
38165
2ce60954b1b7
py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
15 |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
16 from mercurial.i18n import _ |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
17 from mercurial import ( |
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
18 error, |
38165
2ce60954b1b7
py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
19 pycompat, |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
20 util, |
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
21 ) |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
35176
diff
changeset
|
22 from mercurial.utils import dateutil |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
23 from . import common |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
24 |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
25 NoRepo = common.NoRepo |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
26 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
27 |
28368
b9296b330a54
convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents:
26779
diff
changeset
|
28 class darcs_source(common.converter_source, common.commandline): |
35176
671aba341d90
convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents:
28368
diff
changeset
|
29 def __init__(self, ui, repotype, path, revs=None): |
671aba341d90
convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents:
28368
diff
changeset
|
30 common.converter_source.__init__(self, ui, repotype, path, revs=revs) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
31 common.commandline.__init__(self, ui, b'darcs') |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
32 |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
33 # check for _darcs, ElementTree so that we can easily skip |
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
34 # test-convert-darcs if ElementTree is not around |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
35 if not os.path.exists(os.path.join(path, b'_darcs')): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
36 raise NoRepo(_(b"%s does not look like a darcs repository") % path) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
37 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
38 common.checktool(b'darcs') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
39 version = self.run0(b'--version').splitlines()[0].strip() |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
40 if version < b'2.1': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
41 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
42 _(b'darcs version 2.1 or newer needed (found %r)') % version |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
43 ) |
5497
f0a3918abd42
convert: fail if an external required tool is not found
Patrick Mezard <pmezard@gmail.com>
parents:
5412
diff
changeset
|
44 |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
45 if "ElementTree" not in globals(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
46 raise error.Abort(_(b"Python ElementTree module is not available")) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
47 |
15381
c519cd8f0169
backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents:
15355
diff
changeset
|
48 self.path = os.path.realpath(path) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
49 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
50 self.lastrev = None |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
51 self.changes = {} |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
52 self.parents = {} |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
53 self.tags = {} |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
54 |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
55 # Check darcs repository format |
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
56 format = self.format() |
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
57 if format: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 if format in (b'darcs-1.0', b'hashed'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
59 raise NoRepo( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
60 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
61 b"%s repository format is unsupported, " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
62 b"please upgrade" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
63 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
64 % format |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
65 ) |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
66 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
67 self.ui.warn(_(b'failed to detect repository format!')) |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
68 |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
69 def before(self): |
38165
2ce60954b1b7
py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
70 self.tmppath = pycompat.mkdtemp( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 prefix=b'convert-' + os.path.basename(self.path) + b'-' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
72 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 output, status = self.run(b'init', repodir=self.tmppath) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
74 self.checkexit(status) |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
75 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
76 tree = self.xml( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
77 b'changes', xml_output=True, summary=True, repodir=self.path |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
78 ) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
79 tagname = None |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
80 child = None |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
81 for elt in tree.findall('patch'): |
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
82 node = self.recode(elt.get('hash')) |
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
83 name = self.recode(elt.findtext('name', '')) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
84 if name.startswith(b'TAG '): |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
85 tagname = name[4:].strip() |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
86 elif tagname is not None: |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
87 self.tags[tagname] = node |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
88 tagname = None |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
89 self.changes[node] = elt |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
90 self.parents[child] = [node] |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
91 child = node |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
92 self.parents[child] = [] |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
93 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
94 def after(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
95 self.ui.debug(b'cleaning up %s\n' % self.tmppath) |
5362
4ad2a18aff42
convert: fix a few residual bugs in darcs importer
Bryan O'Sullivan <bos@serpentine.com>
parents:
5359
diff
changeset
|
96 shutil.rmtree(self.tmppath, ignore_errors=True) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
97 |
12717
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
98 def recode(self, s, encoding=None): |
48934
06de08b36c82
py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
99 if isinstance(s, str): |
12717
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
100 # XMLParser returns unicode objects for anything it can't |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
101 # encode into ASCII. We convert them back to str to get |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
102 # recode's normal conversion behavior. |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
103 s = s.encode('latin-1') |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
104 return super(darcs_source, self).recode(s, encoding) |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
105 |
5512
8cd26ccc68f8
convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents:
5498
diff
changeset
|
106 def xml(self, cmd, **kwargs): |
12252
4481f8a93c7a
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)
Brodie Rao <brodie@bitheap.org>
parents:
11134
diff
changeset
|
107 # NOTE: darcs is currently encoding agnostic and will print |
4481f8a93c7a
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)
Brodie Rao <brodie@bitheap.org>
parents:
11134
diff
changeset
|
108 # patch metadata byte-for-byte, even in the XML changelog. |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
109 etree = ElementTree() |
12717
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
110 # While we are decoding the XML as latin-1 to be as liberal as |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
111 # possible, etree will still raise an exception if any |
89df79b3c011
convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents:
12393
diff
changeset
|
112 # non-printable characters are in the XML changelog. |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
113 parser = XMLParser(encoding='latin-1') |
17413
97f1f22c2dba
convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents:
16514
diff
changeset
|
114 p = self._run(cmd, **kwargs) |
97f1f22c2dba
convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents:
16514
diff
changeset
|
115 etree.parse(p.stdout, parser=parser) |
97f1f22c2dba
convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents:
16514
diff
changeset
|
116 p.wait() |
97f1f22c2dba
convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents:
16514
diff
changeset
|
117 self.checkexit(p.returncode) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
118 return etree.getroot() |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
119 |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
120 def format(self): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
121 output, status = self.run(b'show', b'repo', repodir=self.path) |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
122 self.checkexit(status) |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
123 m = re.search(br'^\s*Format:\s*(.*)$', output, re.MULTILINE) |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
124 if not m: |
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
125 return None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
126 return b','.join(sorted(f.strip() for f in m.group(1).split(b','))) |
12393
84ceedcfeb6a
convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents:
12252
diff
changeset
|
127 |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
128 def manifest(self): |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
129 man = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
130 output, status = self.run( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
131 b'show', b'files', no_directories=True, repodir=self.tmppath |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
132 ) |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
133 self.checkexit(status) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
134 for line in output.split(b'\n'): |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
135 path = line[2:] |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
136 if path: |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
137 man.append(path) |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
138 return man |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
139 |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
140 def getheads(self): |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
141 return self.parents[None] |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
142 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
143 def getcommit(self, rev): |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
144 elt = self.changes[rev] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
145 dateformat = b'%a %b %d %H:%M:%S %Z %Y' |
49867
668fb0dcb179
convert: stop passing str to the dateutil API in darcs
Matt Harbison <matt_harbison@yahoo.com>
parents:
49372
diff
changeset
|
146 date = dateutil.strdate(self.recode(elt.get('local_date')), dateformat) |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
147 desc = elt.findtext('name') + '\n' + elt.findtext('comment', '') |
12252
4481f8a93c7a
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)
Brodie Rao <brodie@bitheap.org>
parents:
11134
diff
changeset
|
148 # etree can return unicode objects for name, comment, and author, |
4481f8a93c7a
convert/darcs: handle non-ASCII metadata in darcs changelog (issue2354)
Brodie Rao <brodie@bitheap.org>
parents:
11134
diff
changeset
|
149 # so recode() is used to ensure str objects are emitted. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
150 newdateformat = b'%Y-%m-%d %H:%M:%S %1%2' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
151 return common.commit( |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
152 author=self.recode(elt.get('author')), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
153 date=dateutil.datestr(date, newdateformat), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
154 desc=self.recode(desc).strip(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
155 parents=self.parents[rev], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
156 ) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
157 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
158 def pull(self, rev): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
159 output, status = self.run( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
160 b'pull', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
161 self.path, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
162 all=True, |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
163 match=b'hash %s' % self.recode(rev), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
164 no_test=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
165 no_posthook=True, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
166 external_merge=b'/bin/false', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
167 repodir=self.tmppath, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38466
diff
changeset
|
168 ) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
169 if status: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
170 if output.find(b'We have conflicts in') == -1: |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
171 self.checkexit(status, output) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
172 output, status = self.run(b'revert', all=True, repodir=self.tmppath) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
173 self.checkexit(status, output) |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
174 |
22300
35ab037de989
convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents:
22296
diff
changeset
|
175 def getchanges(self, rev, full): |
35ab037de989
convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents:
22296
diff
changeset
|
176 if full: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
177 raise error.Abort(_(b"convert from darcs does not support --full")) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
178 copies = {} |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
179 changes = [] |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
180 man = None |
49372
270f8e89ff32
py3: stop using deprecated Element.getchildren() method in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49371
diff
changeset
|
181 for elt in self.changes[rev].find('summary'): |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
182 if elt.tag in ('add_directory', 'remove_directory'): |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
183 continue |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
184 if elt.tag == 'move': |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
185 if man is None: |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
186 man = self.manifest() |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
187 source = self.recode(elt.get('from')) |
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
188 dest = self.recode(elt.get('to')) |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
189 if source in man: |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
190 # File move |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
191 changes.append((source, rev)) |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
192 changes.append((dest, rev)) |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
193 copies[dest] = source |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
194 else: |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
195 # Directory move, deduce file moves from manifest |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 source = source + b'/' |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
197 for f in man: |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
198 if not f.startswith(source): |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
199 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
200 fdest = dest + b'/' + f[len(source) :] |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
201 changes.append((f, rev)) |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
202 changes.append((fdest, rev)) |
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
203 copies[fdest] = f |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
204 else: |
49371
6833ccc5e74e
py3: fix bytes/unicode issues in convert/darcs
Ian Moody <moz-ian@perix.co.uk>
parents:
49370
diff
changeset
|
205 changes.append((self.recode(elt.text.strip()), rev)) |
9527
b3c13e721593
convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents:
9526
diff
changeset
|
206 self.pull(rev) |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
207 self.lastrev = rev |
24395
216fa1ba9993
convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents:
22300
diff
changeset
|
208 return sorted(changes), copies, set() |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
209 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
210 def getfile(self, name, rev): |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
211 if rev != self.lastrev: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 raise error.Abort(_(b'internal calling inconsistency')) |
11134
33010ff1fd6f
convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents:
10939
diff
changeset
|
213 path = os.path.join(self.tmppath, name) |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
17413
diff
changeset
|
214 try: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
17413
diff
changeset
|
215 data = util.readfile(path) |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
17413
diff
changeset
|
216 mode = os.lstat(path).st_mode |
49306
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48934
diff
changeset
|
217 except FileNotFoundError: |
2e726c934fcd
py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents:
48934
diff
changeset
|
218 return None, None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
219 mode = (mode & 0o111) and b'x' or b'' |
11134
33010ff1fd6f
convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents:
10939
diff
changeset
|
220 return data, mode |
5359
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
221 |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
222 def gettags(self): |
6b6104430964
convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff
changeset
|
223 return self.tags |