Mercurial > hg
annotate hgext/convert/convcmd.py @ 37888:73ca1c5e65f8
convcmd: make a copy of heads before mutating it
Differential Revision: https://phab.mercurial-scm.org/D3486
author | Augie Fackler <augie@google.com> |
---|---|
date | Fri, 27 Apr 2018 01:27:22 -0400 |
parents | c6061cadb400 |
children | 79dd61a4554f |
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 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4591
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
316 | 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 | 6 # GNU General Public License version 2 or any later version. |
28409
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
7 from __future__ import absolute_import |
316 | 8 |
35779
eefabd9ed3e1
convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35197
diff
changeset
|
9 import collections |
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 _ |
28409
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
14 from mercurial import ( |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
15 encoding, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
16 error, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
17 hg, |
36133
6df206ef4b10
convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents:
36132
diff
changeset
|
18 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
|
19 scmutil, |
28409
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
20 util, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
21 ) |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36558
diff
changeset
|
22 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
|
23 |
28409
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
24 from . import ( |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
25 bzr, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
26 common, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
27 cvs, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
28 darcs, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
29 filemap, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
30 git, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
31 gnuarch, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
32 hg as hgconvert, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
33 monotone, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
34 p4, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
35 subversion, |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
36 ) |
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 mapfile = common.mapfile |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
39 MissingTool = common.MissingTool |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
40 NoRepo = common.NoRepo |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
41 SKIPREV = common.SKIPREV |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
42 |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
43 bzr_source = bzr.bzr_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
44 convert_cvs = cvs.convert_cvs |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
45 convert_git = git.convert_git |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
46 darcs_source = darcs.darcs_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
47 gnuarch_source = gnuarch.gnuarch_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
48 mercurial_sink = hgconvert.mercurial_sink |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
49 mercurial_source = hgconvert.mercurial_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
50 monotone_source = monotone.monotone_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
51 p4_source = p4.p4_source |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
52 svn_sink = subversion.svn_sink |
c43c5e7167a2
convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents:
26812
diff
changeset
|
53 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
|
54 |
6131
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
55 orig_encoding = 'ascii' |
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
56 |
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
57 def recode(s): |
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
58 if isinstance(s, unicode): |
36133
6df206ef4b10
convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents:
36132
diff
changeset
|
59 return s.encode(pycompat.sysstr(orig_encoding), 'replace') |
6131
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
60 else: |
36133
6df206ef4b10
convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents:
36132
diff
changeset
|
61 return s.decode('utf-8').encode( |
6df206ef4b10
convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents:
36132
diff
changeset
|
62 pycompat.sysstr(orig_encoding), 'replace') |
6131
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
63 |
25805
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
64 def mapbranch(branch, branchmap): |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
65 ''' |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
30400
diff
changeset
|
66 >>> 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
|
67 >>> 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
|
68 ... mapbranch(i, bmap) |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
69 'branch1' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
70 'branch1' |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
30400
diff
changeset
|
71 >>> 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
|
72 >>> 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
|
73 ... mapbranch(i, bmap) |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
74 'branch2' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
75 'branch2' |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
30400
diff
changeset
|
76 >>> 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
|
77 >>> 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
|
78 ... mapbranch(i, bmap) |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
79 'branch3' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
80 'branch4' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
81 'branch4' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
82 'branch4' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
83 'branch5' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
84 ''' |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
85 # 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
|
86 # 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
|
87 # 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
|
88 # 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
|
89 # default branch in the destination repository. |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
90 branch = branchmap.get(branch or 'default', branch) |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
91 # 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
|
92 # attempt to use that for backward compatibility. |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
93 if (not branch): |
34359
ee10eb665036
py3: replace str(None) with literal in convcmd.py
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
94 branch = branchmap.get('None', branch) |
25805
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
95 return branch |
584044e5ad57
convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents:
25748
diff
changeset
|
96 |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
97 source_converters = [ |
8692
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
98 ('cvs', convert_cvs, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
99 ('git', convert_git, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
100 ('svn', svn_source, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
101 ('hg', mercurial_source, 'sourcesort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
102 ('darcs', darcs_source, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
103 ('mtn', monotone_source, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
104 ('gnuarch', gnuarch_source, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
105 ('bzr', bzr_source, 'branchsort'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
106 ('p4', p4_source, 'branchsort'), |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
107 ] |
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
108 |
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
109 sink_converters = [ |
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
110 ('hg', mercurial_sink), |
5513
f0c58fd4b798
convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents:
5510
diff
changeset
|
111 ('svn', svn_sink), |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
112 ] |
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
113 |
25748
baea47cafe75
convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents:
25741
diff
changeset
|
114 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
|
115 exceptions = [] |
9962
a7178eccf2dc
convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents:
9431
diff
changeset
|
116 if type and type not in [s[0] for s in source_converters]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
117 raise error.Abort(_('%s: invalid source repository type') % type) |
8692
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
118 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
|
119 try: |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
120 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
|
121 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
|
122 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
|
123 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
|
124 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
|
125 for inst in exceptions: |
6913
580d5e6bfc1f
move % out of translatable strings
Martin Geisler <mg@daimi.au.dk>
parents:
6716
diff
changeset
|
126 ui.write("%s\n" % inst) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
127 raise error.Abort(_('%s: missing or unsupported repository') % path) |
4763
8e9d3faec270
convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents:
4761
diff
changeset
|
128 |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
129 def convertsink(ui, path, type): |
9962
a7178eccf2dc
convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents:
9431
diff
changeset
|
130 if type and type not in [s[0] for s in sink_converters]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
131 raise error.Abort(_('%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
|
132 for name, sink in sink_converters: |
3938
0fab73b3f453
convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents:
3917
diff
changeset
|
133 try: |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
134 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
|
135 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
|
136 except NoRepo as inst: |
5415
1d53a75ea0fc
convert: do not output when trying to load svn bindings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5414
diff
changeset
|
137 ui.note(_("convert: %s\n") % inst) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24395
diff
changeset
|
138 except MissingTool as inst: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
139 raise error.Abort('%s\n' % inst) |
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
140 raise error.Abort(_('%s: unknown repository type') % path) |
3938
0fab73b3f453
convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents:
3917
diff
changeset
|
141 |
11136
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
142 class progresssource(object): |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
143 def __init__(self, ui, source, filecount): |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
144 self.ui = ui |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
145 self.source = source |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
146 self.filecount = filecount |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
147 self.retrieved = 0 |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
148 |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
149 def getfile(self, file, rev): |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
150 self.retrieved += 1 |
11731
87dcf758309d
convert/progress: use plural and avoid retrieving
timeless <timeless@gmail.com>
parents:
11136
diff
changeset
|
151 self.ui.progress(_('getting files'), self.retrieved, |
28470
80bd110dbf5e
convert: specify unit for ui.progress when operating on files
Anton Shestakov <av6@dwimlabs.net>
parents:
28409
diff
changeset
|
152 item=file, total=self.filecount, unit=_('files')) |
11136
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
153 return self.source.getfile(file, rev) |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
154 |
26035
86598f4fe1cf
convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents:
25805
diff
changeset
|
155 def targetfilebelongstosource(self, targetfilename): |
86598f4fe1cf
convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents:
25805
diff
changeset
|
156 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
|
157 |
11136
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
158 def lookuprev(self, rev): |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
159 return self.source.lookuprev(rev) |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
160 |
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
161 def close(self): |
11731
87dcf758309d
convert/progress: use plural and avoid retrieving
timeless <timeless@gmail.com>
parents:
11136
diff
changeset
|
162 self.ui.progress(_('getting files'), None) |
11136
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
163 |
5281
a176f9c8b26e
convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5256
diff
changeset
|
164 class converter(object): |
5375
dae323e453aa
convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5374
diff
changeset
|
165 def __init__(self, ui, source, dest, revmapfile, opts): |
3938
0fab73b3f453
convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents:
3917
diff
changeset
|
166 |
316 | 167 self.source = source |
168 self.dest = dest | |
4513
ac2fe196ac9b
Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents:
4512
diff
changeset
|
169 self.ui = ui |
3957
2b87d3c5ab8e
convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents:
3956
diff
changeset
|
170 self.opts = opts |
316 | 171 self.commitcache = {} |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
172 self.authors = {} |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
173 self.authorfile = None |
316 | 174 |
8444
057e96fe2955
convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents:
8377
diff
changeset
|
175 # Record converted revisions persistently: maps source revision |
8843
eb7b247a98ea
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8693
diff
changeset
|
176 # 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
|
177 # incremental conversions work.) |
5510
11d7908a3ea8
convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents:
5488
diff
changeset
|
178 self.map = mapfile(ui, revmapfile) |
316 | 179 |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
180 # 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
|
181 authorfile = self.dest.authorfile() |
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
182 if authorfile and os.path.exists(authorfile): |
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
183 self.readauthormap(authorfile) |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
184 # Extend/Override with new author map if necessary |
12198
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
185 if opts.get('authormap'): |
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
186 self.readauthormap(opts.get('authormap')) |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
187 self.authorfile = self.dest.authorfile() |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
188 |
19119
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
189 self.splicemap = self.parsesplicemap(opts.get('splicemap')) |
8377
29f4f0d66cd5
convert: adding branchmap functionality to convert extension
Michael J. Pedersen <m.pedersen@icelus.org>
parents:
8225
diff
changeset
|
190 self.branchmap = mapfile(ui, opts.get('branchmap')) |
5996
3f9ce63da18c
convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5959
diff
changeset
|
191 |
19120
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
192 def parsesplicemap(self, path): |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
193 """ check and validate the splicemap format and |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
194 return a child/parents dictionary. |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
195 Format checking has two parts. |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
196 1. generic format which is same across all source types |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
197 2. specific format checking which may be different for |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
198 different source type. This logic is implemented in |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
199 checkrevformat function in source files like |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
200 hg.py, subversion.py etc. |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
201 """ |
19119
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
202 |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
203 if not path: |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
204 return {} |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
205 m = {} |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
206 try: |
36132
42a393ea56d2
convert: open all files in binary mode
Augie Fackler <augie@google.com>
parents:
35779
diff
changeset
|
207 fp = open(path, 'rb') |
30400 | 208 for i, line in enumerate(util.iterfile(fp)): |
19119
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
209 line = line.splitlines()[0].rstrip() |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
210 if not line: |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
211 # Ignore blank lines |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
212 continue |
19181
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
213 # split line |
36558
d4c98b6724e1
convcmd: use our shlex wrapper to avoid Python 3 tracebacks
Augie Fackler <augie@google.com>
parents:
36329
diff
changeset
|
214 lex = common.shlexer(data=line, whitespace=',') |
19181
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
215 line = list(lex) |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
216 # check number of parents |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
217 if not (2 <= len(line) <= 3): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
218 raise error.Abort(_('syntax error in %s(%d): child parent1' |
19181
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
219 '[,parent2] expected') % (path, i + 1)) |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
220 for part in line: |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
221 self.source.checkrevformat(part) |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
222 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
|
223 if p1 == p2: |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
224 m[child] = p1 |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
225 else: |
8c2fdf7d5645
splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents:
19120
diff
changeset
|
226 m[child] = p1 + p2 |
19120
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
227 # if file does not exist or error reading, exit |
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
228 except IOError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
229 raise error.Abort(_('splicemap file not found or error reading %s:') |
19120
58e782f076e7
splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
19119
diff
changeset
|
230 % path) |
19119
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
231 return m |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
232 |
61f1223ab358
splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents:
18819
diff
changeset
|
233 |
316 | 234 def walktree(self, heads): |
4719
1069205a8894
fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4635
diff
changeset
|
235 '''Return a mapping that identifies the uncommitted parents of every |
1069205a8894
fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4635
diff
changeset
|
236 uncommitted changeset.''' |
37888
73ca1c5e65f8
convcmd: make a copy of heads before mutating it
Augie Fackler <augie@google.com>
parents:
36607
diff
changeset
|
237 visit = list(heads) |
8456
e9e2a2c9b294
convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8444
diff
changeset
|
238 known = set() |
316 | 239 parents = {} |
22411
c497e39d81a3
convert: add support for deterministic progress bar on scanning phase
Augie Fackler <raf@durin42.com>
parents:
22300
diff
changeset
|
240 numcommits = self.source.numcommits() |
316 | 241 while visit: |
242 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
|
243 if n in known: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
244 continue |
21636
3de9f2c4900c
convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents:
21634
diff
changeset
|
245 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
|
246 m = self.map[n] |
3de9f2c4900c
convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents:
21634
diff
changeset
|
247 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
|
248 continue |
8456
e9e2a2c9b294
convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8444
diff
changeset
|
249 known.add(n) |
22411
c497e39d81a3
convert: add support for deterministic progress bar on scanning phase
Augie Fackler <raf@durin42.com>
parents:
22300
diff
changeset
|
250 self.ui.progress(_('scanning'), len(known), unit=_('revisions'), |
c497e39d81a3
convert: add support for deterministic progress bar on scanning phase
Augie Fackler <raf@durin42.com>
parents:
22300
diff
changeset
|
251 total=numcommits) |
5203
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
252 commit = self.cachecommit(n) |
4719
1069205a8894
fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4635
diff
changeset
|
253 parents[n] = [] |
5203
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
254 for p in commit.parents: |
4719
1069205a8894
fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4635
diff
changeset
|
255 parents[n].append(p) |
316 | 256 visit.append(p) |
11135
73a4ed3bfef8
convert: add progress support
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
257 self.ui.progress(_('scanning'), None) |
316 | 258 |
259 return parents | |
260 | |
16106
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
261 def mergesplicemap(self, parents, splicemap): |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
262 """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
|
263 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
|
264 links in the source graph. |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
265 """ |
18372
5965997b7023
convert: process splicemap in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
266 for c in sorted(splicemap): |
16106
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
267 if c not in parents: |
21634
23b24d6a70c8
convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents:
21077
diff
changeset
|
268 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
|
269 # Could be in source but not converted during this run |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
270 self.ui.warn(_('splice map revision %s is not being ' |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
271 'converted, ignoring\n') % c) |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
272 continue |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
273 pc = [] |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
274 for p in splicemap[c]: |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
275 # 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
|
276 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
|
277 continue |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
278 # 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
|
279 if p not in parents: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
280 raise error.Abort(_('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
|
281 pc.append(p) |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
282 parents[c] = pc |
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
283 |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
284 def toposort(self, parents, sortmode): |
4719
1069205a8894
fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents:
4635
diff
changeset
|
285 '''Return an ordering such that every uncommitted changeset is |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
16925
diff
changeset
|
286 preceded by all its uncommitted ancestors.''' |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
287 |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
288 def mapchildren(parents): |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
289 """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
|
290 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
|
291 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
|
292 identifier to its parents ones. |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
293 """ |
35779
eefabd9ed3e1
convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35197
diff
changeset
|
294 visit = collections.deque(sorted(parents)) |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
295 seen = set() |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
296 children = {} |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
297 roots = [] |
692
695dd9a491da
convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents:
450
diff
changeset
|
298 |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
299 while visit: |
35779
eefabd9ed3e1
convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35197
diff
changeset
|
300 n = visit.popleft() |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
301 if n in seen: |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
302 continue |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
303 seen.add(n) |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
304 # 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
|
305 # 'children' mapping. |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
306 children.setdefault(n, []) |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
307 hasparent = False |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
308 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
|
309 if p not in self.map: |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
310 visit.append(p) |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
311 hasparent = True |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
312 children.setdefault(p, []).append(n) |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
313 if not hasparent: |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
314 roots.append(n) |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
315 |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
316 return children, roots |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
317 |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
318 # Sort functions are supposed to take a list of revisions which |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
319 # can be converted immediately and pick one |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
320 |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
321 def makebranchsorter(): |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
322 """If the previously converted revision has a child in the |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
323 eligible revisions list, pick it. Return the list head |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
324 otherwise. Branch sort attempts to minimize branch |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
325 switching, which is harmful for Mercurial backend |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
326 compression. |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
327 """ |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
328 prev = [None] |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
329 def picknext(nodes): |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
330 next = nodes[0] |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
331 for n in nodes: |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
332 if prev[0] in parents[n]: |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
333 next = n |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
334 break |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
335 prev[0] = next |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
336 return next |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
337 return picknext |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
338 |
8690
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
339 def makesourcesorter(): |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
340 """Source specific sort.""" |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
341 keyfn = lambda n: self.commitcache[n].sortkey |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
342 def picknext(nodes): |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
343 return sorted(nodes, key=keyfn)[0] |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
344 return picknext |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
345 |
18819
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
346 def makeclosesorter(): |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
347 """Close order sort.""" |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
348 keyfn = lambda n: ('close' not in self.commitcache[n].extra, |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
349 self.commitcache[n].sortkey) |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
350 def picknext(nodes): |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
351 return sorted(nodes, key=keyfn)[0] |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
352 return picknext |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
353 |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
354 def makedatesorter(): |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
355 """Sort revisions by date.""" |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
356 dates = {} |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
357 def getdate(n): |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
358 if n not in dates: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36558
diff
changeset
|
359 dates[n] = dateutil.parsedate(self.commitcache[n].date) |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
360 return dates[n] |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
361 |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
362 def picknext(nodes): |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
363 return min([(getdate(n), n) for n in nodes])[1] |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
364 |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
365 return picknext |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
366 |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
367 if sortmode == 'branchsort': |
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
368 picknext = makebranchsorter() |
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
369 elif sortmode == 'datesort': |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
370 picknext = makedatesorter() |
8690
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
371 elif sortmode == 'sourcesort': |
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
372 picknext = makesourcesorter() |
18819
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
373 elif sortmode == 'closesort': |
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
374 picknext = makeclosesorter() |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
375 else: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
376 raise error.Abort(_('unknown sort mode: %s') % sortmode) |
8688
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
377 |
31e613a89750
convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents:
8456
diff
changeset
|
378 children, actives = mapchildren(parents) |
316 | 379 |
380 s = [] | |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
381 pendings = {} |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
382 while actives: |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
383 n = picknext(actives) |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
384 actives.remove(n) |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
385 s.append(n) |
316 | 386 |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
387 # Update dependents list |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
388 for c in children.get(n, []): |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
389 if c not in pendings: |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
390 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
|
391 try: |
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
392 pendings[c].remove(n) |
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
393 except ValueError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
394 raise error.Abort(_('cycle detected between %s and %s') |
6131
fddeeb00f8d1
convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents:
6130
diff
changeset
|
395 % (recode(c), recode(n))) |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
396 if not pendings[c]: |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
397 # Parents are converted, node is eligible |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
398 actives.insert(0, c) |
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
399 pendings[c] = None |
316 | 400 |
6100
49c69e1e4aa2
convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents:
6099
diff
changeset
|
401 if len(s) != len(parents): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
402 raise error.Abort(_("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
|
403 |
316 | 404 return s |
405 | |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
406 def writeauthormap(self): |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
407 authorfile = self.authorfile |
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
408 if authorfile: |
16925
eaf6a6d7f015
convert: lowercase status and abort messages
Martin Geisler <mg@aragost.com>
parents:
16689
diff
changeset
|
409 self.ui.status(_('writing author map file %s\n') % authorfile) |
36132
42a393ea56d2
convert: open all files in binary mode
Augie Fackler <augie@google.com>
parents:
35779
diff
changeset
|
410 ofile = open(authorfile, 'wb+') |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
411 for author in self.authors: |
36148
0f9e52f900c4
convert: fix line ending of mapfile and commit.desc file
Yuya Nishihara <yuya@tcha.org>
parents:
36133
diff
changeset
|
412 ofile.write(util.tonativeeol("%s=%s\n" |
0f9e52f900c4
convert: fix line ending of mapfile and commit.desc file
Yuya Nishihara <yuya@tcha.org>
parents:
36133
diff
changeset
|
413 % (author, self.authors[author]))) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7873
diff
changeset
|
414 ofile.close() |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
415 |
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
416 def readauthormap(self, authorfile): |
36132
42a393ea56d2
convert: open all files in binary mode
Augie Fackler <augie@google.com>
parents:
35779
diff
changeset
|
417 afile = open(authorfile, 'rb') |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
418 for line in afile: |
7962
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
419 |
7968
43b70a964e0d
convert: handle comments starting with '#' in authormap files
Marti Raudsepp <marti@juffo.org>
parents:
7962
diff
changeset
|
420 line = line.strip() |
43b70a964e0d
convert: handle comments starting with '#' in authormap files
Marti Raudsepp <marti@juffo.org>
parents:
7962
diff
changeset
|
421 if not line or line.startswith('#'): |
6184
9d13e7129423
convert: Ignore empty lines in authormap file.
Marti Raudsepp <marti@juffo.org>
parents:
6143
diff
changeset
|
422 continue |
7962
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
423 |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
424 try: |
6186
aae4eb2f40b0
convert: Clean up authormap key=value splitting.
Marti Raudsepp <marti@juffo.org>
parents:
6185
diff
changeset
|
425 srcauthor, dstauthor = line.split('=', 1) |
7962
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
426 except ValueError: |
16925
eaf6a6d7f015
convert: lowercase status and abort messages
Martin Geisler <mg@aragost.com>
parents:
16689
diff
changeset
|
427 msg = _('ignoring bad line in author map file %s: %s\n') |
7962
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
428 self.ui.warn(msg % (authorfile, line.rstrip())) |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
429 continue |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
430 |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
431 srcauthor = srcauthor.strip() |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
432 dstauthor = dstauthor.strip() |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
433 if self.authors.get(srcauthor) in (None, dstauthor): |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
434 msg = _('mapping author %s to %s\n') |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
435 self.ui.debug(msg % (srcauthor, dstauthor)) |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
436 self.authors[srcauthor] = dstauthor |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
437 continue |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
438 |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
439 m = _('overriding mapping for author %s, was %s, will be %s\n') |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
440 self.ui.status(m % (srcauthor, self.authors[srcauthor], dstauthor)) |
62154415821f
convert: fix authormap handling of lines without '='
Marti Raudsepp <marti@juffo.org>
parents:
7948
diff
changeset
|
441 |
4590
80fb4ec512b5
convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents:
4589
diff
changeset
|
442 afile.close() |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
443 |
5203
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
444 def cachecommit(self, rev): |
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
445 commit = self.source.getcommit(rev) |
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
446 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
|
447 commit.branch = mapbranch(commit.branch, self.branchmap) |
5203
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
448 self.commitcache[rev] = commit |
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
449 return commit |
653790c2fa52
convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents:
5195
diff
changeset
|
450 |
316 | 451 def copy(self, rev): |
5016
4ebc8693ce72
convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents:
5014
diff
changeset
|
452 commit = self.commitcache[rev] |
22300
35ab037de989
convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents:
21636
diff
changeset
|
453 full = self.opts.get('full') |
35ab037de989
convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents:
21636
diff
changeset
|
454 changes = self.source.getchanges(rev, full) |
35197
bfd072c52e03
py3: use bytes in place of basestring
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35177
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 else: |
e710874247d1
convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5373
diff
changeset
|
459 dest = self.map[changes] |
5510
11d7908a3ea8
convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents:
5488
diff
changeset
|
460 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
|
461 return |
24395
216fa1ba9993
convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents:
24328
diff
changeset
|
462 files, copies, cleanp2 = changes |
5934
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
463 pbranches = [] |
5173
6b4c332f241b
convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents:
5143
diff
changeset
|
464 if commit.parents: |
5934
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
465 for prev in commit.parents: |
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
466 if prev not in self.commitcache: |
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
467 self.cachecommit(prev) |
6210
942287cb1f57
Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6186
diff
changeset
|
468 pbranches.append((self.map[prev], |
5934
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
469 self.commitcache[prev].branch)) |
e495f3f35b2d
convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents:
5621
diff
changeset
|
470 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
|
471 try: |
16105
ebaa0aa749e2
convert: turn splicemap into a simple dictionary
Patrick Mezard <patrick@mezard.eu>
parents:
13745
diff
changeset
|
472 parents = self.splicemap[rev] |
6956
12472a240398
i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents:
6913
diff
changeset
|
473 self.ui.status(_('spliced in %s as parents of %s\n') % |
26812
58a309e9cf80
convert: fix Python syntax in 'splice in' message
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
474 (_(' and ').join(parents), rev)) |
6143
5b159ebb19cf
convert: document splicemap, allow setting of multiple parents
Bryan O'Sullivan <bos@serpentine.com>
parents:
6131
diff
changeset
|
475 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
|
476 except KeyError: |
3f9ce63da18c
convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5959
diff
changeset
|
477 parents = [b[0] for b in pbranches] |
28900
b65966f50058
convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents:
28470
diff
changeset
|
478 parents.extend(self.map[x] |
b65966f50058
convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents:
28470
diff
changeset
|
479 for x in commit.optparents |
b65966f50058
convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents:
28470
diff
changeset
|
480 if x in self.map) |
24395
216fa1ba9993
convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents:
24328
diff
changeset
|
481 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
|
482 cleanp2 = set() |
24328
603a8d09e12d
convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
483 if len(parents) < 3: |
603a8d09e12d
convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
484 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
|
485 else: |
603a8d09e12d
convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
486 # 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
|
487 # 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
|
488 # 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
|
489 # itself. |
603a8d09e12d
convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
490 source = progresssource(self.ui, self.source, |
603a8d09e12d
convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents:
24306
diff
changeset
|
491 len(files) * (len(parents) - 1)) |
8843
eb7b247a98ea
kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8693
diff
changeset
|
492 newnode = self.dest.putcommit(files, copies, parents, commit, |
24395
216fa1ba9993
convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents:
24328
diff
changeset
|
493 source, self.map, full, cleanp2) |
11136
ecc8b18736da
convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents:
11135
diff
changeset
|
494 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
|
495 self.source.converted(rev, newnode) |
5510
11d7908a3ea8
convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents:
5488
diff
changeset
|
496 self.map[rev] = newnode |
316 | 497 |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
498 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
|
499 try: |
5356
f0931c0240b4
convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents:
5281
diff
changeset
|
500 self.source.before() |
5014
914054ca532e
convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents:
5013
diff
changeset
|
501 self.dest.before() |
5510
11d7908a3ea8
convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents:
5488
diff
changeset
|
502 self.source.setrevmap(self.map) |
6956
12472a240398
i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents:
6913
diff
changeset
|
503 self.ui.status(_("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
|
504 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
|
505 parents = self.walktree(heads) |
16106
d75aa756149b
convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents:
16105
diff
changeset
|
506 self.mergesplicemap(parents, self.splicemap) |
6956
12472a240398
i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents:
6913
diff
changeset
|
507 self.ui.status(_("sorting...\n")) |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
508 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
|
509 num = len(t) |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
510 c = None |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
511 |
6956
12472a240398
i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents:
6913
diff
changeset
|
512 self.ui.status(_("converting...\n")) |
12769
daa8dc6e1f66
convert: kill trailing whitespace
timeless <timeless@gmail.com>
parents:
12768
diff
changeset
|
513 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
|
514 num -= 1 |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
515 desc = self.commitcache[c].desc |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
516 if "\n" in desc: |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
517 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
|
518 # convert log message to local encoding without using |
12768
c6b55be14461
convert: fix typo in comment
timeless <timeless@gmail.com>
parents:
12198
diff
changeset
|
519 # tolocal() because the encoding.encoding convert() |
c6b55be14461
convert: fix typo in comment
timeless <timeless@gmail.com>
parents:
12198
diff
changeset
|
520 # uses is 'utf-8' |
5954
851402e53337
convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents:
5794
diff
changeset
|
521 self.ui.status("%d %s\n" % (num, recode(desc))) |
6913
580d5e6bfc1f
move % out of translatable strings
Martin Geisler <mg@daimi.au.dk>
parents:
6716
diff
changeset
|
522 self.ui.note(_("source: %s\n") % recode(c)) |
11135
73a4ed3bfef8
convert: add progress support
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
523 self.ui.progress(_('converting'), i, unit=_('revisions'), |
73a4ed3bfef8
convert: add progress support
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
524 total=len(t)) |
4588
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
525 self.copy(c) |
11135
73a4ed3bfef8
convert: add progress support
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
526 self.ui.progress(_('converting'), None) |
316 | 527 |
25741
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
528 if not self.ui.configbool('convert', 'skiptags'): |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
529 tags = self.source.gettags() |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
530 ctags = {} |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
531 for k in tags: |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
532 v = tags[k] |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
533 if self.map.get(v, SKIPREV) != SKIPREV: |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
534 ctags[k] = self.map[v] |
316 | 535 |
25741
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
536 if c and ctags: |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
537 nrev, tagsparent = self.dest.puttags(ctags) |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
538 if nrev and tagsparent: |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
539 # write another hash correspondence to override the |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
540 # previous one so we don't end up with extra tag heads |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
541 tagsparents = [e for e in self.map.iteritems() |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
542 if e[1] == tagsparent] |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
543 if tagsparents: |
86fe3c404c1e
convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents:
25660
diff
changeset
|
544 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
|
545 |
13745
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
546 bookmarks = self.source.getbookmarks() |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
547 cbookmarks = {} |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
548 for k in bookmarks: |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
549 v = bookmarks[k] |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
550 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
|
551 cbookmarks[k] = self.map[v] |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
552 |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
553 if c and cbookmarks: |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
554 self.dest.putbookmarks(cbookmarks) |
9ff22f600c6c
convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents:
13685
diff
changeset
|
555 |
4589
451e91ed535e
convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents:
4588
diff
changeset
|
556 self.writeauthormap() |
4588
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
557 finally: |
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
558 self.cleanup() |
694 | 559 |
4588
9855939d0c82
convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents:
4536
diff
changeset
|
560 def cleanup(self): |
5356
f0931c0240b4
convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents:
5281
diff
changeset
|
561 try: |
f0931c0240b4
convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents:
5281
diff
changeset
|
562 self.dest.after() |
f0931c0240b4
convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents:
5281
diff
changeset
|
563 finally: |
f0931c0240b4
convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents:
5281
diff
changeset
|
564 self.source.after() |
5510
11d7908a3ea8
convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents:
5488
diff
changeset
|
565 self.map.close() |
694 | 566 |
5281
a176f9c8b26e
convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5256
diff
changeset
|
567 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
|
568 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
|
569 global orig_encoding |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7877
diff
changeset
|
570 orig_encoding = encoding.encoding |
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7877
diff
changeset
|
571 encoding.encoding = 'UTF-8' |
4895
fa6c9381d053
convert: manually set encoding to UTF-8
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4883
diff
changeset
|
572 |
12198
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
573 # support --authors as an alias for --authormap |
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
574 if not opts.get('authormap'): |
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
575 opts['authormap'] = opts.get('authors') |
0c67a58f0580
convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents:
11731
diff
changeset
|
576 |
3938
0fab73b3f453
convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents:
3917
diff
changeset
|
577 if not dest: |
4883
72ac66e88c43
convert: Use clone's behaviour for the default destionation name.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4719
diff
changeset
|
578 dest = hg.defaultdest(src) + "-hg" |
6956
12472a240398
i18n: mark strings for translation in convert extension
Martin Geisler <mg@daimi.au.dk>
parents:
6913
diff
changeset
|
579 ui.status(_("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
|
580 |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
581 destc = convertsink(ui, dest, opts.get('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
|
582 destc = scmutil.wrapconvertsink(destc) |
316 | 583 |
4761
7c8cd400e86a
convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents:
4760
diff
changeset
|
584 try: |
8692
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
585 srcc, defaultsort = convertsource(ui, src, opts.get('source_type'), |
827d4e807d57
convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents:
8691
diff
changeset
|
586 opts.get('rev')) |
4761
7c8cd400e86a
convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents:
4760
diff
changeset
|
587 except Exception: |
5441
71e7c86adcb7
convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents:
5438
diff
changeset
|
588 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
|
589 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
|
590 raise |
316 | 591 |
18819
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
592 sortmodes = ('branchsort', 'datesort', 'sourcesort', 'closesort') |
8690
c5b4f662109f
convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents:
8689
diff
changeset
|
593 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
|
594 if len(sortmode) > 1: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
595 raise error.Abort(_('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
|
596 if sortmode: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22411
diff
changeset
|
597 sortmode = sortmode[0] |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22411
diff
changeset
|
598 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22411
diff
changeset
|
599 sortmode = defaultsort |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22411
diff
changeset
|
600 |
8691
a0a541d6fed6
convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents:
8690
diff
changeset
|
601 if sortmode == 'sourcesort' and not srcc.hasnativeorder(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
602 raise error.Abort(_('--sourcesort is not supported by this data source') |
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
603 ) |
18819
05acdf8e1f23
convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents:
18376
diff
changeset
|
604 if sortmode == 'closesort' and not srcc.hasnativeclose(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26035
diff
changeset
|
605 raise error.Abort(_('--closesort is not supported by this data source')) |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
606 |
5377
756a43a30e34
convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5376
diff
changeset
|
607 fmap = opts.get('filemap') |
756a43a30e34
convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5376
diff
changeset
|
608 if fmap: |
756a43a30e34
convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5376
diff
changeset
|
609 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
|
610 destc.setfilemapmode(True) |
5377
756a43a30e34
convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5376
diff
changeset
|
611 |
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
|
612 if not revmapfile: |
19889
3828b3e09462
convert: remove unused and incorrect default handling for revmapfile
Mads Kiilerich <madski@unity3d.com>
parents:
19181
diff
changeset
|
613 revmapfile = destc.revmapfile() |
3938
0fab73b3f453
convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents:
3917
diff
changeset
|
614 |
5375
dae323e453aa
convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5374
diff
changeset
|
615 c = converter(ui, srcc, destc, revmapfile, opts) |
8689
9bc95f8eb018
convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents:
8688
diff
changeset
|
616 c.convert(sortmode) |