annotate hgext/convert/convcmd.py @ 29946:285a8c3e53f2

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