annotate hgext/convert/darcs.py @ 35455:02ea370c2baa

split: new extension to split changesets This diff introduces an experimental split extension to split changesets. The implementation is largely inspired by Laurent Charignon's implementation for mutable-history (changeset 9603aa1ecdfd54b0d86e262318a72e0a2ffeb6cc [1]) This version contains various improvements: - Rebase by default. This is more friendly for new users. Split won't lead to merge conflicts so a rebase won't give the user more trouble. This has been on by default at Facebook for months now and seems to be a good UX improvement. The rebase skips obsoleted or orphaned changesets, which can avoid issues like allowdivergence, merge conflicts, etc. This is more flexible because the user can decide what to do next (see the last test case in test-split.t) - Remove "Done split? [y/n]" prompt. That could be detected by checking `repo.status()` instead. - Works with obsstore disabled. Without obsstore, split uses strip to clean up old nodes, and it can even handle split a non-head changeset with "allowunstable" disabled, since it runs a rebase to solve the "unstable" issue in a same transaction. - More friendly editor text. Put what has been already split into the editor text so users won't lost track about where they are. [1]: https://bitbucket.org/marmoute/mutable-history/commits/9603aa1ecdfd54b Differential Revision: https://phab.mercurial-scm.org/D1082
author Jun Wu <quark@fb.com>
date Sat, 24 Jun 2017 23:03:41 -0700
parents 671aba341d90
children c6061cadb400
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 #
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
3 # Copyright 2007-2009 Matt Mackall <mpm@selenic.com> and others
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9712
diff changeset
6 # GNU General Public License version 2 or any later version.
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
7 from __future__ import absolute_import
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
8
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
9 import errno
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
10 import os
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
11 import re
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
12 import shutil
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
13 import tempfile
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
14 from mercurial.i18n import _
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
15 from mercurial import (
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
16 error,
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
17 util,
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
18 )
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
19 from . import common
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
20 NoRepo = common.NoRepo
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
21
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
22 # The naming drift of ElementTree is fun!
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
23
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
24 try:
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
25 import xml.etree.cElementTree.ElementTree as ElementTree
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
26 import xml.etree.cElementTree.XMLParser as XMLParser
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
27 except ImportError:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
28 try:
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
29 import xml.etree.ElementTree.ElementTree as ElementTree
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
30 import xml.etree.ElementTree.XMLParser as XMLParser
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
31 except ImportError:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
32 try:
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
33 import elementtree.cElementTree.ElementTree as ElementTree
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
34 import elementtree.cElementTree.XMLParser as XMLParser
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
35 except ImportError:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
36 try:
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
37 import elementtree.ElementTree.ElementTree as ElementTree
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
38 import elementtree.ElementTree.XMLParser as XMLParser
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
39 except ImportError:
15457
1470f8b00694 check-code: enable camelcase check, fix up problems
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
40 pass
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
41
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
42 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
43 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
44 common.converter_source.__init__(self, ui, repotype, path, revs=revs)
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
45 common.commandline.__init__(self, ui, 'darcs')
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
46
12393
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
47 # 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
48 # test-convert-darcs if ElementTree is not around
5520
cc3af86ab6fe test-convert-darcs: skip if we can't find the elementtree module
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5481
diff changeset
49 if not os.path.exists(os.path.join(path, '_darcs')):
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
50 raise NoRepo(_("%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
51
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
52 common.checktool('darcs')
9242
6fd3f795e908 issue1251: bail if darcs version is too old
Bryan O'Sullivan <bos@serpentine.com>
parents: 8250
diff changeset
53 version = self.run0('--version').splitlines()[0].strip()
6fd3f795e908 issue1251: bail if darcs version is too old
Bryan O'Sullivan <bos@serpentine.com>
parents: 8250
diff changeset
54 if version < '2.1':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
55 raise error.Abort(_('darcs version 2.1 or newer needed (found %r)')
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
56 % version)
5497
f0a3918abd42 convert: fail if an external required tool is not found
Patrick Mezard <pmezard@gmail.com>
parents: 5412
diff changeset
57
15457
1470f8b00694 check-code: enable camelcase check, fix up problems
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
58 if "ElementTree" not in globals():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
59 raise error.Abort(_("Python ElementTree module is not available"))
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
60
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
61 self.path = os.path.realpath(path)
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
62
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
63 self.lastrev = None
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
64 self.changes = {}
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
65 self.parents = {}
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
66 self.tags = {}
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
67
12393
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
68 # Check darcs repository format
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
69 format = self.format()
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
70 if format:
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
71 if format in ('darcs-1.0', 'hashed'):
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
72 raise NoRepo(_("%s repository format is unsupported, "
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
73 "please upgrade") % format)
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
74 else:
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
75 self.ui.warn(_('failed to detect repository format!'))
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
76
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
77 def before(self):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
78 self.tmppath = tempfile.mkdtemp(
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
79 prefix='convert-' + os.path.basename(self.path) + '-')
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
80 output, status = self.run('init', repodir=self.tmppath)
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
81 self.checkexit(status)
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
82
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
83 tree = self.xml('changes', xml_output=True, summary=True,
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
84 repodir=self.path)
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
85 tagname = None
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
86 child = None
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
87 for elt in tree.findall('patch'):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
88 node = elt.get('hash')
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
89 name = elt.findtext('name', '')
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
90 if name.startswith('TAG '):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
91 tagname = name[4:].strip()
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
92 elif tagname is not None:
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
93 self.tags[tagname] = node
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
94 tagname = None
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
95 self.changes[node] = elt
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
96 self.parents[child] = [node]
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
97 child = node
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
98 self.parents[child] = []
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
99
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
100 def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9242
diff changeset
101 self.ui.debug('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
102 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
103
12717
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
104 def recode(self, s, encoding=None):
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
105 if isinstance(s, unicode):
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
106 # 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
107 # 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
108 # recode's normal conversion behavior.
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
109 s = s.encode('latin-1')
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
110 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
111
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
112 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
113 # 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
114 # 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
115 etree = ElementTree()
12717
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
116 # 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
117 # 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
118 # non-printable characters are in the XML changelog.
89df79b3c011 convert/darcs: support changelogs with bytes 0x7F-0xFF (issue2411)
Brodie Rao <brodie@bitheap.org>
parents: 12393
diff changeset
119 parser = XMLParser(encoding='latin-1')
17413
97f1f22c2dba convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents: 16514
diff changeset
120 p = self._run(cmd, **kwargs)
97f1f22c2dba convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents: 16514
diff changeset
121 etree.parse(p.stdout, parser=parser)
97f1f22c2dba convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents: 16514
diff changeset
122 p.wait()
97f1f22c2dba convert: use subprocess for all commandline calls
Patrick Mezard <patrick@mezard.eu>
parents: 16514
diff changeset
123 self.checkexit(p.returncode)
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
124 return etree.getroot()
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
125
12393
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
126 def format(self):
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
127 output, status = self.run('show', 'repo', no_files=True,
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
128 repodir=self.path)
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
129 self.checkexit(status)
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
130 m = re.search(r'^\s*Format:\s*(.*)$', output, re.MULTILINE)
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
131 if not m:
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
132 return None
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
133 return ','.join(sorted(f.strip() for f in m.group(1).split(',')))
84ceedcfeb6a convert/darcs: improve unsupported format detection (issue2172)
Patrick Mezard <pmezard@gmail.com>
parents: 12252
diff changeset
134
9527
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
135 def manifest(self):
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
136 man = []
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
137 output, status = self.run('show', 'files', no_directories=True,
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
138 repodir=self.tmppath)
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
139 self.checkexit(status)
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
140 for line in output.split('\n'):
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
141 path = line[2:]
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
142 if path:
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
143 man.append(path)
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
144 return man
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
145
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
146 def getheads(self):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
147 return self.parents[None]
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
148
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
149 def getcommit(self, rev):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
150 elt = self.changes[rev]
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
151 date = util.strdate(elt.get('local_date'), '%a %b %d %H:%M:%S %Z %Y')
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
152 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
153 # 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
154 # so recode() is used to ensure str objects are emitted.
28368
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
155 return common.commit(author=self.recode(elt.get('author')),
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
156 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
157 desc=self.recode(desc).strip(),
b9296b330a54 convert: darcs use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
158 parents=self.parents[rev])
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
159
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
160 def pull(self, rev):
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
161 output, status = self.run('pull', self.path, all=True,
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
162 match='hash %s' % rev,
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
163 no_test=True, no_posthook=True,
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
164 external_merge='/bin/false',
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
165 repodir=self.tmppath)
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
166 if status:
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
167 if output.find('We have conflicts in') == -1:
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
168 self.checkexit(status, output)
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5498
diff changeset
169 output, status = self.run('revert', all=True, repodir=self.tmppath)
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
170 self.checkexit(status, output)
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
171
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
172 def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
173 if full:
26779
aaa33ec3c951 grammar: use does instead of do where appropriate
timeless@mozdev.org
parents: 26587
diff changeset
174 raise error.Abort(_("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
175 copies = {}
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
176 changes = []
9527
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
177 man = None
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
178 for elt in self.changes[rev].find('summary').getchildren():
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
179 if elt.tag in ('add_directory', 'remove_directory'):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
180 continue
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
181 if elt.tag == 'move':
9527
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
182 if man is None:
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
183 man = self.manifest()
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
184 source, dest = elt.get('from'), elt.get('to')
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
185 if source in man:
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
186 # File move
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
187 changes.append((source, rev))
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
188 changes.append((dest, rev))
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
189 copies[dest] = source
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
190 else:
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
191 # Directory move, deduce file moves from manifest
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
192 source = source + '/'
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
193 for f in man:
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
194 if not f.startswith(source):
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
195 continue
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
196 fdest = dest + '/' + f[len(source):]
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
197 changes.append((f, rev))
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
198 changes.append((fdest, rev))
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
199 copies[fdest] = f
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
200 else:
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
201 changes.append((elt.text.strip(), rev))
9527
b3c13e721593 convert/darcs: handle directory renaming
Patrick Mezard <pmezard@gmail.com>
parents: 9526
diff changeset
202 self.pull(rev)
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
203 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
204 return sorted(changes), copies, set()
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
205
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
206 def getfile(self, name, rev):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
207 if rev != self.lastrev:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
208 raise error.Abort(_('internal calling inconsistency'))
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
209 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
210 try:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 17413
diff changeset
211 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
212 mode = os.lstat(path).st_mode
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
213 except IOError as inst:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 17413
diff changeset
214 if inst.errno == errno.ENOENT:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 17413
diff changeset
215 return None, None
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 17413
diff changeset
216 raise
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
217 mode = (mode & 0o111) and 'x' or ''
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
218 return data, mode
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
219
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
220 def gettags(self):
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
221 return self.tags