annotate hgext/convert/convcmd.py @ 50887:8edfd28a01d1

convert: stabilize subversion date sorter In case of tie, this provides unstable result on my system. So I am adding a couple of tie breaker to fix the test.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 29 Aug 2023 22:13:18 +0200
parents 02fe65f74be5
children 0eb515c7bec8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5621
badbefa55972 convert: move commands definition to ease demandload job (issue 860)
Patrick Mezard <pmezard@gmail.com>
parents: 5521
diff changeset
1 # convcmd - convert extension commands definition
3917
645e1dd4b8ae convert-repo: update usage information
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3911
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 45942
diff changeset
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7968
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: 9431
diff changeset
6 # GNU General Public License version 2 or any later version.
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
7
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
8 import collections
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
9 import heapq
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
10 import os
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
11 import shutil
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
12
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28900
diff changeset
13 from mercurial.i18n import _
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
14 from mercurial.pycompat import open
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
15 from mercurial import (
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
16 encoding,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
17 error,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
18 hg,
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
19 pycompat,
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35176
diff changeset
20 scmutil,
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
21 util,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
22 )
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36558
diff changeset
23 from mercurial.utils import dateutil
4536
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
24
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
25 from . import (
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
26 bzr,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
27 common,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
28 cvs,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
29 darcs,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
30 filemap,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
31 git,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
32 gnuarch,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
33 hg as hgconvert,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
34 monotone,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
35 p4,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
36 subversion,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
37 )
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
38
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
39 mapfile = common.mapfile
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
40 MissingTool = common.MissingTool
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
41 NoRepo = common.NoRepo
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
42 SKIPREV = common.SKIPREV
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
43
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
44 bzr_source = bzr.bzr_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
45 convert_cvs = cvs.convert_cvs
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
46 convert_git = git.convert_git
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
47 darcs_source = darcs.darcs_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
48 gnuarch_source = gnuarch.gnuarch_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
49 mercurial_sink = hgconvert.mercurial_sink
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
50 mercurial_source = hgconvert.mercurial_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
51 monotone_source = monotone.monotone_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
52 p4_source = p4.p4_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
53 svn_sink = subversion.svn_sink
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
54 svn_source = subversion.svn_source
3821
158fce02dc40 Teach convert-repo to deal with mixed charsets in git
Matt Mackall <mpm@selenic.com>
parents: 2657
diff changeset
55
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
56 orig_encoding = b'ascii'
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
58
44102
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
59 def readauthormap(ui, authorfile, authors=None):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
60 if authors is None:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
61 authors = {}
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
62 with open(authorfile, b'rb') as afile:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
63 for line in afile:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
64
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
65 line = line.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
66 if not line or line.startswith(b'#'):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
67 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
68
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
69 try:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
70 srcauthor, dstauthor = line.split(b'=', 1)
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
71 except ValueError:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
72 msg = _(b'ignoring bad line in author map file %s: %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
73 ui.warn(msg % (authorfile, line.rstrip()))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
74 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
75
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
76 srcauthor = srcauthor.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
77 dstauthor = dstauthor.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
78 if authors.get(srcauthor) in (None, dstauthor):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
79 msg = _(b'mapping author %s to %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
80 ui.debug(msg % (srcauthor, dstauthor))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
81 authors[srcauthor] = dstauthor
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
82 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
83
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
84 m = _(b'overriding mapping for author %s, was %s, will be %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
85 ui.status(m % (srcauthor, authors[srcauthor], dstauthor))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
86 return authors
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
87
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
88
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
89 def recode(s):
48934
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
90 if isinstance(s, str):
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
91 return s.encode(pycompat.sysstr(orig_encoding), 'replace')
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
92 else:
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
93 return s.decode('utf-8').encode(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
94 pycompat.sysstr(orig_encoding), 'replace'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
95 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
96
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
97
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
98 def mapbranch(branch, branchmap):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
99 """
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
100 >>> bmap = {b'default': b'branch1'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
101 >>> for i in [b'', None]:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
102 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
103 'branch1'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
104 'branch1'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
105 >>> bmap = {b'None': b'branch2'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
106 >>> for i in [b'', None]:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
107 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
108 'branch2'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
109 'branch2'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
110 >>> bmap = {b'None': b'branch3', b'default': b'branch4'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
111 >>> for i in [b'None', b'', None, b'default', b'branch5']:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
112 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
113 'branch3'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
114 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
115 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
116 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
117 'branch5'
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
118 """
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
119 # If branch is None or empty, this commit is coming from the source
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
120 # repository's default branch and destined for the default branch in the
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
121 # destination repository. For such commits, using a literal "default"
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
122 # in branchmap below allows the user to map "default" to an alternate
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
123 # default branch in the destination repository.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
124 branch = branchmap.get(branch or b'default', branch)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
125 # At some point we used "None" literal to denote the default branch,
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
126 # attempt to use that for backward compatibility.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
127 if not branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
128 branch = branchmap.get(b'None', branch)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
129 return branch
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
131
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
132 source_converters = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
133 (b'cvs', convert_cvs, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
134 (b'git', convert_git, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
135 (b'svn', svn_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
136 (b'hg', mercurial_source, b'sourcesort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
137 (b'darcs', darcs_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
138 (b'mtn', monotone_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
139 (b'gnuarch', gnuarch_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 (b'bzr', bzr_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
141 (b'p4', p4_source, b'branchsort'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
142 ]
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
143
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
144 sink_converters = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
145 (b'hg', mercurial_sink),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
146 (b'svn', svn_sink),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
147 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
148
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
149
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25741
diff changeset
150 def convertsource(ui, path, type, revs):
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
151 exceptions = []
9962
a7178eccf2dc convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
152 if type and type not in [s[0] for s in source_converters]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
153 raise error.Abort(_(b'%s: invalid source repository type') % type)
8692
827d4e807d57 convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
154 for name, source, sortmode in source_converters:
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
155 try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
156 if not type or name == type:
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34359
diff changeset
157 return source(ui, name, path, revs), sortmode
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
158 except (NoRepo, MissingTool) as inst:
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
159 exceptions.append(inst)
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
160 if not ui.quiet:
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
161 for inst in exceptions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
162 ui.write(b"%s\n" % pycompat.bytestr(inst.args[0]))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
163 raise error.Abort(_(b'%s: missing or unsupported repository') % path)
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
164
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
165
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
166 def convertsink(ui, path, type):
9962
a7178eccf2dc convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
167 if type and type not in [s[0] for s in sink_converters]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
168 raise error.Abort(_(b'%s: invalid destination repository type') % type)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
169 for name, sink in sink_converters:
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
170 try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
171 if not type or name == type:
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34359
diff changeset
172 return sink(ui, name, path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
173 except NoRepo as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
174 ui.note(_(b"convert: %s\n") % inst)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
175 except MissingTool as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 raise error.Abort(b'%s\n' % inst)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
177 raise error.Abort(_(b'%s: unknown repository type') % path)
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
178
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
179
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48941
diff changeset
180 class progresssource:
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
181 def __init__(self, ui, source, filecount):
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
182 self.ui = ui
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
183 self.source = source
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
184 self.progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
185 _(b'getting files'), unit=_(b'files'), total=filecount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
186 )
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
187
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
188 def getfile(self, file, rev):
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
189 self.progress.increment(item=file)
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
190 return self.source.getfile(file, rev)
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
191
26035
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
192 def targetfilebelongstosource(self, targetfilename):
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
193 return self.source.targetfilebelongstosource(targetfilename)
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
194
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
195 def lookuprev(self, rev):
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
196 return self.source.lookuprev(rev)
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
197
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
198 def close(self):
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
199 self.progress.complete()
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
200
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
201
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
202 # Sorters are used by the `toposort` function to maintain a set of revisions
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
203 # which can be converted immediately and pick one
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
204 class branchsorter:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
205 """If the previously converted revision has a child in the
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
206 eligible revisions list, pick it. Return the list head
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
207 otherwise. Branch sort attempts to minimize branch
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
208 switching, which is harmful for Mercurial backend
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
209 compression.
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
210 """
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
211
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
212 def __init__(self, parents):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
213 self.nodes = []
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
214 self.parents = parents
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
215 self.prev = None
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
216
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
217 def picknext(self):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
218 next = self.nodes[0]
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
219 for n in self.nodes:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
220 if self.prev in self.parents[n]:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
221 next = n
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
222 break
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
223 self.prev = next
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
224 self.nodes.remove(next)
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
225 return next
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
226
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
227 def insert(self, node):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
228 self.nodes.insert(0, node)
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
229
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
230 def __len__(self):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
231 return self.nodes.__len__()
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
232
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
233
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
234 class keysorter:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
235 """Key-based sort, ties broken by insertion order"""
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
236
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
237 def __init__(self, keyfn):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
238 self.heap = []
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
239 self.keyfn = keyfn
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
240 self.counter = 0
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
241
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
242 def picknext(self):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
243 return heapq.heappop(self.heap)[2]
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
244
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
245 def insert(self, node):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
246 counter = self.counter
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
247 self.counter = counter + 1
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
248 key = self.keyfn(node)
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
249 heapq.heappush(self.heap, (key, counter, node))
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
250
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
251 def __len__(self):
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
252 return self.heap.__len__()
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
253
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
254
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48941
diff changeset
255 class converter:
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
256 def __init__(self, ui, source, dest, revmapfile, opts):
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
257
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
258 self.source = source
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
259 self.dest = dest
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
260 self.ui = ui
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
261 self.opts = opts
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
262 self.commitcache = {}
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
263 self.authors = {}
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
264 self.authorfile = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
265
8444
057e96fe2955 convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents: 8377
diff changeset
266 # Record converted revisions persistently: maps source revision
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8693
diff changeset
267 # ID to target revision ID (both strings). (This is how
8444
057e96fe2955 convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents: 8377
diff changeset
268 # incremental conversions work.)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
269 self.map = mapfile(ui, revmapfile)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
270
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
271 # Read first the dst author map if any
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
272 authorfile = self.dest.authorfile()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
273 if authorfile and os.path.exists(authorfile):
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
274 self.readauthormap(authorfile)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
275 # Extend/Override with new author map if necessary
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
276 if opts.get(b'authormap'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
277 self.readauthormap(opts.get(b'authormap'))
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
278 self.authorfile = self.dest.authorfile()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
279
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
280 self.splicemap = self.parsesplicemap(opts.get(b'splicemap'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
281 self.branchmap = mapfile(ui, opts.get(b'branchmap'))
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
282
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
283 def parsesplicemap(self, path):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
284 """check and validate the splicemap format and
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
285 return a child/parents dictionary.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
286 Format checking has two parts.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
287 1. generic format which is same across all source types
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
288 2. specific format checking which may be different for
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
289 different source type. This logic is implemented in
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
290 checkrevformat function in source files like
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
291 hg.py, subversion.py etc.
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
292 """
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
293
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
294 if not path:
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
295 return {}
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
296 m = {}
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
297 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
298 fp = open(path, b'rb')
48941
fd5b8e696b75 py3: stop using util.iterfile()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48934
diff changeset
299 for i, line in enumerate(fp):
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
300 line = line.splitlines()[0].rstrip()
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
301 if not line:
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
302 # Ignore blank lines
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
303 continue
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
304 # split line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
305 lex = common.shlexer(data=line, whitespace=b',')
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
306 line = list(lex)
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
307 # check number of parents
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
308 if not (2 <= len(line) <= 3):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
309 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
310 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
311 b'syntax error in %s(%d): child parent1'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
312 b'[,parent2] expected'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
313 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
314 % (path, i + 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
315 )
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
316 for part in line:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
317 self.source.checkrevformat(part)
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
318 child, p1, p2 = line[0], line[1:2], line[2:]
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
319 if p1 == p2:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
320 m[child] = p1
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
321 else:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
322 m[child] = p1 + p2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
323 # if file does not exist or error reading, exit
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
324 except IOError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
325 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
326 _(b'splicemap file not found or error reading %s:') % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
327 )
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
328 return m
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
329
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
330 def walktree(self, heads):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
331 """Return a mapping that identifies the uncommitted parents of every
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
332 uncommitted changeset."""
37888
73ca1c5e65f8 convcmd: make a copy of heads before mutating it
Augie Fackler <augie@google.com>
parents: 36607
diff changeset
333 visit = list(heads)
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8444
diff changeset
334 known = set()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
335 parents = {}
22411
c497e39d81a3 convert: add support for deterministic progress bar on scanning phase
Augie Fackler <raf@durin42.com>
parents: 22300
diff changeset
336 numcommits = self.source.numcommits()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
337 progress = self.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
338 _(b'scanning'), unit=_(b'revisions'), total=numcommits
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
339 )
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
340 while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
341 n = visit.pop(0)
21636
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
342 if n in known:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
343 continue
21636
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
344 if n in self.map:
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
345 m = self.map[n]
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
346 if m == SKIPREV or self.dest.hascommitfrommap(m):
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
347 continue
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8444
diff changeset
348 known.add(n)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
349 progress.update(len(known))
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
350 commit = self.cachecommit(n)
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
351 parents[n] = []
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
352 for p in commit.parents:
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
353 parents[n].append(p)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
354 visit.append(p)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
355 progress.complete()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
356
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
357 return parents
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
358
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
359 def mergesplicemap(self, parents, splicemap):
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
360 """A splicemap redefines child/parent relationships. Check the
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
361 map contains valid revision identifiers and merge the new
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
362 links in the source graph.
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
363 """
18372
5965997b7023 convert: process splicemap in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
364 for c in sorted(splicemap):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
365 if c not in parents:
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21077
diff changeset
366 if not self.dest.hascommitforsplicemap(self.map.get(c, c)):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
367 # Could be in source but not converted during this run
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
368 self.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
369 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
370 b'splice map revision %s is not being '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 b'converted, ignoring\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
372 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
373 % c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
374 )
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
375 continue
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
376 pc = []
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
377 for p in splicemap[c]:
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
378 # We do not have to wait for nodes already in dest.
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21077
diff changeset
379 if self.dest.hascommitforsplicemap(self.map.get(p, p)):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
380 continue
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
381 # Parent is not in dest and not being converted, not good
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
382 if p not in parents:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
383 raise error.Abort(_(b'unknown splice map parent: %s') % p)
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
384 pc.append(p)
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
385 parents[c] = pc
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
386
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
387 def toposort(self, parents, sortmode):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
388 """Return an ordering such that every uncommitted changeset is
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44102
diff changeset
389 preceded by all its uncommitted ancestors."""
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
390
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
391 def mapchildren(parents):
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
392 """Return a (children, roots) tuple where 'children' maps parent
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
393 revision identifiers to children ones, and 'roots' is the list of
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
394 revisions without parents. 'parents' must be a mapping of revision
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
395 identifier to its parents ones.
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
396 """
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
397 visit = collections.deque(sorted(parents))
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
398 seen = set()
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
399 children = {}
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
400 roots = []
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
401
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
402 while visit:
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
403 n = visit.popleft()
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
404 if n in seen:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
405 continue
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
406 seen.add(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
407 # Ensure that nodes without parents are present in the
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
408 # 'children' mapping.
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
409 children.setdefault(n, [])
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
410 hasparent = False
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
411 for p in parents[n]:
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16106
diff changeset
412 if p not in self.map:
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
413 visit.append(p)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
414 hasparent = True
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
415 children.setdefault(p, []).append(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
416 if not hasparent:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
417 roots.append(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
418
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
419 return children, roots
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
420
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
421 def makesourcesorter():
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
422 """Source specific sort."""
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
423 keyfn = lambda n: self.commitcache[n].sortkey
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
424 return keysorter(keyfn)
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
425
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
426 def makeclosesorter():
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
427 """Close order sort."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
428 keyfn = lambda n: (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
429 b'close' not in self.commitcache[n].extra,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
430 self.commitcache[n].sortkey,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
431 )
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
432 return keysorter(keyfn)
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
433
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
434 def makedatesorter():
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
435 """Sort revisions by date."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
436
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
437 def getdate(n):
50887
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
438 commit = self.commitcache[n]
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
439 # The other entries are here as tie breaker for stability
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
440 return (
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
441 dateutil.parsedate(commit.date),
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
442 commit.rev,
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
443 commit.branch,
8edfd28a01d1 convert: stabilize subversion date sorter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50181
diff changeset
444 )
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
445
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
446 return keysorter(getdate)
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
447
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
448 if sortmode == b'branchsort':
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
449 sorter = branchsorter(parents)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
450 elif sortmode == b'datesort':
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
451 sorter = makedatesorter()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
452 elif sortmode == b'sourcesort':
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
453 sorter = makesourcesorter()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
454 elif sortmode == b'closesort':
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
455 sorter = makeclosesorter()
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
456 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
457 raise error.Abort(_(b'unknown sort mode: %s') % sortmode)
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
458
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
459 children, roots = mapchildren(parents)
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
460
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
461 for node in roots:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
462 sorter.insert(node)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
463
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
464 s = []
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
465 pendings = {}
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
466 while sorter:
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
467 n = sorter.picknext()
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
468 s.append(n)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
469
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
470 # Update dependents list
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
471 for c in children.get(n, []):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
472 if c not in pendings:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
473 pendings[c] = [p for p in parents[c] if p not in self.map]
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
474 try:
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
475 pendings[c].remove(n)
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
476 except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
477 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
478 _(b'cycle detected between %s and %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
479 % (recode(c), recode(n))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
480 )
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
481 if not pendings[c]:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
482 # Parents are converted, node is eligible
50181
02fe65f74be5 convert: use a priority queue for sorting commits, to make sorting faster
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48946
diff changeset
483 sorter.insert(c)
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
484 pendings[c] = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
485
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
486 if len(s) != len(parents):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
487 raise error.Abort(_(b"not all revisions were sorted"))
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
488
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
489 return s
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
490
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
491 def writeauthormap(self):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
492 authorfile = self.authorfile
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
493 if authorfile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
494 self.ui.status(_(b'writing author map file %s\n') % authorfile)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
495 ofile = open(authorfile, b'wb+')
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
496 for author in self.authors:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
497 ofile.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
498 util.tonativeeol(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
499 b"%s=%s\n" % (author, self.authors[author])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
500 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
501 )
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
502 ofile.close()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
503
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
504 def readauthormap(self, authorfile):
44102
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
505 self.authors = readauthormap(self.ui, authorfile, self.authors)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
506
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
507 def cachecommit(self, rev):
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
508 commit = self.source.getcommit(rev)
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
509 commit.author = self.authors.get(commit.author, commit.author)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
510 commit.branch = mapbranch(commit.branch, self.branchmap)
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
511 self.commitcache[rev] = commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
512 return commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
513
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
514 def copy(self, rev):
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
515 commit = self.commitcache[rev]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
516 full = self.opts.get(b'full')
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 21636
diff changeset
517 changes = self.source.getchanges(rev, full)
35197
bfd072c52e03 py3: use bytes in place of basestring
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35177
diff changeset
518 if isinstance(changes, bytes):
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
519 if changes == SKIPREV:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
520 dest = SKIPREV
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
521 else:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
522 dest = self.map[changes]
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
523 self.map[rev] = dest
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
524 return
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
525 files, copies, cleanp2 = changes
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
526 pbranches = []
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
527 if commit.parents:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
528 for prev in commit.parents:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
529 if prev not in self.commitcache:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
530 self.cachecommit(prev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
531 pbranches.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
532 (self.map[prev], self.commitcache[prev].branch)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
533 )
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
534 self.dest.setbranch(commit.branch, pbranches)
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
535 try:
16105
ebaa0aa749e2 convert: turn splicemap into a simple dictionary
Patrick Mezard <patrick@mezard.eu>
parents: 13745
diff changeset
536 parents = self.splicemap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
537 self.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
538 _(b'spliced in %s as parents of %s\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
539 % (_(b' and ').join(parents), rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
540 )
6143
5b159ebb19cf convert: document splicemap, allow setting of multiple parents
Bryan O'Sullivan <bos@serpentine.com>
parents: 6131
diff changeset
541 parents = [self.map.get(p, p) for p in parents]
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
542 except KeyError:
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
543 parents = [b[0] for b in pbranches]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
544 parents.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
545 self.map[x] for x in commit.optparents if x in self.map
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
546 )
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
547 if len(pbranches) != 2:
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
548 cleanp2 = set()
24328
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
549 if len(parents) < 3:
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
550 source = progresssource(self.ui, self.source, len(files))
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
551 else:
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
552 # For an octopus merge, we end up traversing the list of
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
553 # changed files N-1 times. This tweak to the number of
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
554 # files makes it so the progress bar doesn't overflow
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
555 # itself.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
556 source = progresssource(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
557 self.ui, self.source, len(files) * (len(parents) - 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
558 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
559 newnode = self.dest.putcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
560 files, copies, parents, commit, source, self.map, full, cleanp2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
561 )
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
562 source.close()
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5528
diff changeset
563 self.source.converted(rev, newnode)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
564 self.map[rev] = newnode
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
565
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
566 def convert(self, sortmode):
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
567 try:
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
568 self.source.before()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
569 self.dest.before()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
570 self.source.setrevmap(self.map)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
571 self.ui.status(_(b"scanning source...\n"))
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
572 heads = self.source.getheads()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
573 parents = self.walktree(heads)
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
574 self.mergesplicemap(parents, self.splicemap)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
575 self.ui.status(_(b"sorting...\n"))
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
576 t = self.toposort(parents, sortmode)
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
577 num = len(t)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
578 c = None
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
579
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
580 self.ui.status(_(b"converting...\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
581 progress = self.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
582 _(b'converting'), unit=_(b'revisions'), total=len(t)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
583 )
12769
daa8dc6e1f66 convert: kill trailing whitespace
timeless <timeless@gmail.com>
parents: 12768
diff changeset
584 for i, c in enumerate(t):
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
585 num -= 1
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
586 desc = self.commitcache[c].desc
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
587 if b"\n" in desc:
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
588 desc = desc.splitlines()[0]
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
589 # convert log message to local encoding without using
12768
c6b55be14461 convert: fix typo in comment
timeless <timeless@gmail.com>
parents: 12198
diff changeset
590 # tolocal() because the encoding.encoding convert()
c6b55be14461 convert: fix typo in comment
timeless <timeless@gmail.com>
parents: 12198
diff changeset
591 # uses is 'utf-8'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
592 self.ui.status(b"%d %s\n" % (num, recode(desc)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
593 self.ui.note(_(b"source: %s\n") % recode(c))
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
594 progress.update(i)
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
595 self.copy(c)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
596 progress.complete()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
597
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
598 if not self.ui.configbool(b'convert', b'skiptags'):
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
599 tags = self.source.gettags()
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
600 ctags = {}
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
601 for k in tags:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
602 v = tags[k]
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
603 if self.map.get(v, SKIPREV) != SKIPREV:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
604 ctags[k] = self.map[v]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
605
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
606 if c and ctags:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
607 nrev, tagsparent = self.dest.puttags(ctags)
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
608 if nrev and tagsparent:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
609 # write another hash correspondence to override the
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
610 # previous one so we don't end up with extra tag heads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
611 tagsparents = [
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
612 e for e in self.map.items() if e[1] == tagsparent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
613 ]
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
614 if tagsparents:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
615 self.map[tagsparents[0][0]] = nrev
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
616
13745
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
617 bookmarks = self.source.getbookmarks()
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
618 cbookmarks = {}
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
619 for k in bookmarks:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
620 v = bookmarks[k]
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
621 if self.map.get(v, SKIPREV) != SKIPREV:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
622 cbookmarks[k] = self.map[v]
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
623
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
624 if c and cbookmarks:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
625 self.dest.putbookmarks(cbookmarks)
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
626
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
627 self.writeauthormap()
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
628 finally:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
629 self.cleanup()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
630
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
631 def cleanup(self):
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
632 try:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
633 self.dest.after()
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
634 finally:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
635 self.source.after()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
636 self.map.close()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
637
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
638
5281
a176f9c8b26e convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5256
diff changeset
639 def convert(ui, src, dest=None, revmapfile=None, **opts):
36329
93943eef696f py3: use pycompat.byteskwargs in hgext/convert/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36148
diff changeset
640 opts = pycompat.byteskwargs(opts)
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
641 global orig_encoding
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7877
diff changeset
642 orig_encoding = encoding.encoding
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
643 encoding.encoding = b'UTF-8'
4895
fa6c9381d053 convert: manually set encoding to UTF-8
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4883
diff changeset
644
12198
0c67a58f0580 convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents: 11731
diff changeset
645 # support --authors as an alias for --authormap
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
646 if not opts.get(b'authormap'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
647 opts[b'authormap'] = opts.get(b'authors')
12198
0c67a58f0580 convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents: 11731
diff changeset
648
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
649 if not dest:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
650 dest = hg.defaultdest(src) + b"-hg"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
651 ui.status(_(b"assuming destination %s\n") % dest)
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
652
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
653 destc = convertsink(ui, dest, opts.get(b'dest_type'))
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35176
diff changeset
654 destc = scmutil.wrapconvertsink(destc)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
655
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
656 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
657 srcc, defaultsort = convertsource(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
658 ui, src, opts.get(b'source_type'), opts.get(b'rev')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
659 )
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
660 except Exception:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
661 for path in destc.created:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
662 shutil.rmtree(path, True)
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
663 raise
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
664
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
665 sortmodes = (b'branchsort', b'datesort', b'sourcesort', b'closesort')
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
666 sortmode = [m for m in sortmodes if opts.get(m)]
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
667 if len(sortmode) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
668 raise error.Abort(_(b'more than one sort mode specified'))
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
669 if sortmode:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
670 sortmode = sortmode[0]
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
671 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
672 sortmode = defaultsort
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
673
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
674 if sortmode == b'sourcesort' and not srcc.hasnativeorder():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
675 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
676 _(b'--sourcesort is not supported by this data source')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
677 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
678 if sortmode == b'closesort' and not srcc.hasnativeclose():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
679 raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
680 _(b'--closesort is not supported by this data source')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
681 )
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
682
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
683 fmap = opts.get(b'filemap')
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
684 if fmap:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
685 srcc = filemap.filemap_source(ui, srcc, fmap)
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
686 destc.setfilemapmode(True)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
687
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4958
diff changeset
688 if not revmapfile:
19889
3828b3e09462 convert: remove unused and incorrect default handling for revmapfile
Mads Kiilerich <madski@unity3d.com>
parents: 19181
diff changeset
689 revmapfile = destc.revmapfile()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
690
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
691 c = converter(ui, srcc, destc, revmapfile, opts)
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
692 c.convert(sortmode)