annotate hgext/convert/__init__.py @ 4758:b6a1f2c46c6c

convert extension: Add SVN converter
author Daniel Holth <dholth@fastmail.fm>
date Sun, 01 Jul 2007 23:56:11 +0200
parents 8e9d3faec270
children 95cbb6b74790
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
1 # convert.py Foreign SCM converter
3916
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 #
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
5 # This software may be used and distributed according to the terms
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
7
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
8 from common import NoRepo, converter_source, converter_sink
4534
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
9 from cvs import convert_cvs
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
10 from git import convert_git
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
11 from hg import convert_mercurial
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
12
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
13 import os, shutil
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
14 from mercurial import hg, ui, util, commands
3825
158fce02dc40 Teach convert-repo to deal with mixed charsets in git
Matt Mackall <mpm@selenic.com>
parents: 2649
diff changeset
15
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
16 commands.norepo += " convert"
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
17
3954
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3948
diff changeset
18 converters = [convert_cvs, convert_git, convert_mercurial]
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
19
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
20 def convertsource(ui, path, rev=None):
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
21 for c in converters:
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
22 try:
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
23 converter = c(ui, path, rev=rev)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
24 if not isinstance(converter, converter_source):
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
25 raise util.Abort('%s: cannot read from this repository type' % path)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
26 return converter
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
27 except NoRepo:
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
28 pass
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
29 raise util.Abort('%s: unknown repository type' % path)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
30
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
31 def convertsink(ui, path):
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
32 if not os.path.isdir(path):
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
33 raise util.Abort("%s: not a directory" % path)
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
34 for c in converters:
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
35 try:
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
36 converter = c(ui, path)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
37 if not isinstance(converter, converter_sink):
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
38 raise util.Abort('%s: cannot write to this repository type' % path)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
39 return converter
3954
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3948
diff changeset
40 except NoRepo:
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
41 pass
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
42 raise util.Abort('%s: unknown repository type' % path)
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
43
4447
af013ae3ca10 use documented convert-repo interface
Daniel Holth <dholth@fastmail.fm>
parents: 4446
diff changeset
44 class convert(object):
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
45 def __init__(self, ui, source, dest, mapfile, opts):
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
46
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
47 self.source = source
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
48 self.dest = dest
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
49 self.ui = ui
3958
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
50 self.opts = opts
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
51 self.commitcache = {}
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
52 self.mapfile = mapfile
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
53 self.mapfilefd = None
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
54 self.authors = {}
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
55 self.authorfile = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
56
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
57 self.map = {}
1655
7bfd4724932a convert-repo: automatically create empty map file
Matt Mackall <mpm@selenic.com>
parents: 1389
diff changeset
58 try:
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
59 origmapfile = open(self.mapfile, 'r')
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
60 for l in origmapfile:
1655
7bfd4724932a convert-repo: automatically create empty map file
Matt Mackall <mpm@selenic.com>
parents: 1389
diff changeset
61 sv, dv = l[:-1].split()
7bfd4724932a convert-repo: automatically create empty map file
Matt Mackall <mpm@selenic.com>
parents: 1389
diff changeset
62 self.map[sv] = dv
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
63 origmapfile.close()
1655
7bfd4724932a convert-repo: automatically create empty map file
Matt Mackall <mpm@selenic.com>
parents: 1389
diff changeset
64 except IOError:
7bfd4724932a convert-repo: automatically create empty map file
Matt Mackall <mpm@selenic.com>
parents: 1389
diff changeset
65 pass
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
66
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
67 # 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
68 authorfile = self.dest.authorfile()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
69 if authorfile and os.path.exists(authorfile):
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
70 self.readauthormap(authorfile)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
71 # Extend/Override with new author map if necessary
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
72 if opts.get('authors'):
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
73 self.readauthormap(opts.get('authors'))
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
74 self.authorfile = self.dest.authorfile()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
75
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
76 def walktree(self, heads):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
77 '''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
78 uncommitted changeset.'''
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
79 visit = heads
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
80 known = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
81 parents = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
82 while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
83 n = visit.pop(0)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
84 if n in known or n in self.map: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
85 known[n] = 1
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
86 self.commitcache[n] = self.source.getcommit(n)
3955
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3954
diff changeset
87 cp = self.commitcache[n].parents
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
88 parents[n] = []
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
89 for p in cp:
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
90 parents[n].append(p)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
91 visit.append(p)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
92
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
93 return parents
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
94
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
95 def toposort(self, parents):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
96 '''Return an ordering such that every uncommitted changeset is
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
97 preceeded by all its uncommitted ancestors.'''
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
98 visit = parents.keys()
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
99 seen = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
100 children = {}
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
101
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
102 while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
103 n = visit.pop(0)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
104 if n in seen: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
105 seen[n] = 1
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
106 # Ensure that nodes without parents are present in the 'children'
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
107 # mapping.
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
108 children.setdefault(n, [])
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
109 for p in parents[n]:
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
110 if not p in self.map:
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
111 visit.append(p)
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
112 children.setdefault(p, []).append(n)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
113
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
114 s = []
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
115 removed = {}
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
116 visit = children.keys()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
117 while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
118 n = visit.pop(0)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
119 if n in removed: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
120 dep = 0
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
121 if n in parents:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
122 for p in parents[n]:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
123 if p in self.map: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
124 if p not in removed:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
125 # we're still dependent
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
126 visit.append(n)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
127 dep = 1
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
128 break
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
129
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
130 if not dep:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
131 # all n's parents are in the list
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
132 removed[n] = 1
3958
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
133 if n not in self.map:
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
134 s.append(n)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
135 if n in children:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
136 for c in children[n]:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
137 visit.insert(0, c)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
138
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
139 if self.opts.get('datesort'):
3958
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
140 depth = {}
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
141 for n in s:
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
142 depth[n] = 0
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
143 pl = [p for p in self.commitcache[n].parents
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
144 if p not in self.map]
3958
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
145 if pl:
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
146 depth[n] = max([depth[p] for p in pl]) + 1
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
147
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
148 s = [(depth[n], self.commitcache[n].date, n) for n in s]
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
149 s.sort()
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
150 s = [e[2] for e in s]
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3957
diff changeset
151
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
152 return s
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
153
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
154 def mapentry(self, src, dst):
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
155 if self.mapfilefd is None:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
156 try:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
157 self.mapfilefd = open(self.mapfile, "a")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
158 except IOError, (errno, strerror):
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
159 raise util.Abort("Could not open map file %s: %s, %s\n" % (self.mapfile, errno, strerror))
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
160 self.map[src] = dst
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
161 self.mapfilefd.write("%s %s\n" % (src, dst))
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
162 self.mapfilefd.flush()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
163
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
164 def writeauthormap(self):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
165 authorfile = self.authorfile
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
166 if authorfile:
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
167 self.ui.status('Writing author map file %s\n' % authorfile)
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
168 ofile = open(authorfile, 'w+')
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
169 for author in self.authors:
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
170 ofile.write("%s=%s\n" % (author, self.authors[author]))
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
171 ofile.close()
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
172
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
173 def readauthormap(self, authorfile):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
174 afile = open(authorfile, 'r')
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
175 for line in afile:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
176 try:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
177 srcauthor = line.split('=')[0].strip()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
178 dstauthor = line.split('=')[1].strip()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
179 if srcauthor in self.authors and dstauthor != self.authors[srcauthor]:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
180 self.ui.status(
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
181 'Overriding mapping for author %s, was %s, will be %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
182 % (srcauthor, self.authors[srcauthor], dstauthor))
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
183 else:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
184 self.ui.debug('Mapping author %s to %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
185 % (srcauthor, dstauthor))
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
186 self.authors[srcauthor] = dstauthor
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
187 except IndexError:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
188 self.ui.warn(
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
189 'Ignoring bad line in author file map %s: %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
190 % (authorfile, line))
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
191 afile.close()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
192
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
193 def copy(self, rev):
3955
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3954
diff changeset
194 c = self.commitcache[rev]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
195 files = self.source.getchanges(rev)
4758
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
196
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
197 do_copies = (hasattr(c, 'copies') and hasattr(self.dest, 'copyfile'))
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
198
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
199 for f, v in files:
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
200 try:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
201 data = self.source.getfile(f, v)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
202 except IOError, inst:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
203 self.dest.delfile(f)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
204 else:
3957
558f52943cd2 convert-repo: add CVS exec bit support
Matt Mackall <mpm@selenic.com>
parents: 3955
diff changeset
205 e = self.source.getmode(f, v)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
206 self.dest.putfile(f, e, data)
4758
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
207 if do_copies:
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
208 if f in c.copies:
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
209 # Merely marks that a copy happened.
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
210 self.dest.copyfile(c.copies[f], f)
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
211
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
212
3955
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3954
diff changeset
213 r = [self.map[v] for v in c.parents]
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
214 f = [f for f, v in files]
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
215 newnode = self.dest.putcommit(f, r, c)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
216 self.mapentry(rev, newnode)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
217
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
218 def convert(self):
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
219 try:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
220 self.ui.status("scanning source...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
221 heads = self.source.getheads()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
222 parents = self.walktree(heads)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
223 self.ui.status("sorting...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
224 t = self.toposort(parents)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
225 num = len(t)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
226 c = None
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
227
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
228 self.ui.status("converting...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
229 for c in t:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
230 num -= 1
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
231 desc = self.commitcache[c].desc
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
232 if "\n" in desc:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
233 desc = desc.splitlines()[0]
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
234 author = self.commitcache[c].author
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
235 author = self.authors.get(author, author)
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
236 self.commitcache[c].author = author
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
237 self.ui.status("%d %s\n" % (num, desc))
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
238 self.copy(c)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
239
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
240 tags = self.source.gettags()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
241 ctags = {}
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
242 for k in tags:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
243 v = tags[k]
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
244 if v in self.map:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
245 ctags[k] = self.map[v]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
246
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
247 if c and ctags:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
248 nrev = self.dest.puttags(ctags)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
249 # write another hash correspondence to override the previous
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
250 # one so we don't end up with extra tag heads
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
251 if nrev:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
252 self.mapentry(c, nrev)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
253
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
254 self.writeauthormap()
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
255 finally:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
256 self.cleanup()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
257
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
258 def cleanup(self):
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
259 if self.mapfilefd:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4534
diff changeset
260 self.mapfilefd.close()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
261
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
262 def _convert(ui, src, dest=None, mapfile=None, **opts):
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
263 '''Convert a foreign SCM repository to a Mercurial one.
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
264
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
265 Accepted source formats:
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
266 - GIT
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
267 - CVS
4758
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4756
diff changeset
268 - SVN
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
269
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
270 Accepted destination formats:
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
271 - Mercurial
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
272
4753
07efcce17d28 convert: add -r argument specifying latest revision to convert
Brendan Cully <brendan@kublai.com>
parents: 4719
diff changeset
273 If no revision is given, all revisions will be converted. Otherwise,
07efcce17d28 convert: add -r argument specifying latest revision to convert
Brendan Cully <brendan@kublai.com>
parents: 4719
diff changeset
274 convert will only import up to the named revision (given in a format
07efcce17d28 convert: add -r argument specifying latest revision to convert
Brendan Cully <brendan@kublai.com>
parents: 4719
diff changeset
275 understood by the source).
07efcce17d28 convert: add -r argument specifying latest revision to convert
Brendan Cully <brendan@kublai.com>
parents: 4719
diff changeset
276
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
277 If destination isn't given, a new Mercurial repo named <src>-hg will
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
278 be created. If <mapfile> isn't given, it will be put in a default
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
279 location (<dest>/.hg/shamap by default)
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
280
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
281 The <mapfile> is a simple text file that maps each source commit ID to
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
282 the destination ID for that revision, like so:
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
283 <source ID> <destination ID>
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
284
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
285 If the file doesn't exist, it's automatically created. It's updated
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
286 on each commit copied, so convert-repo can be interrupted and can
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
287 be run repeatedly to copy new commits.
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
288
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
289 The [username mapping] file is a simple text file that maps each source
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
290 commit author to a destination commit author. It is handy for source SCMs
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
291 that use unix logins to identify authors (eg: CVS). One line per author
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
292 mapping and the line format is:
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
293 srcauthor=whatever string you want
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
294 '''
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
295
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
296 if not dest:
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
297 dest = src + "-hg"
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
298 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
299
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
300 # Try to be smart and initalize things when required
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
301 created = False
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
302 if os.path.isdir(dest):
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
303 if len(os.listdir(dest)) > 0:
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
304 try:
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
305 hg.repository(ui, dest)
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
306 ui.status("destination %s is a Mercurial repository\n" % dest)
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
307 except hg.RepoError:
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
308 raise util.Abort(
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
309 "destination directory %s is not empty.\n"
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
310 "Please specify an empty directory to be initialized\n"
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
311 "or an already initialized mercurial repository"
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
312 % dest)
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
313 else:
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
314 ui.status("initializing destination %s repository\n" % dest)
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
315 hg.repository(ui, dest, create=True)
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
316 created = True
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
317 elif os.path.exists(dest):
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
318 raise util.Abort("destination %s exists and is not a directory" % dest)
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
319 else:
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
320 ui.status("initializing destination %s repository\n" % dest)
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
321 hg.repository(ui, dest, create=True)
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
322 created = True
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
323
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
324 destc = convertsink(ui, dest)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
325
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
326 try:
4756
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4754
diff changeset
327 srcc = convertsource(ui, src, rev=opts.get('rev'))
4754
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
328 except Exception:
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
329 if created:
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
330 shutil.rmtree(dest, True)
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
331 raise
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4753
diff changeset
332
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
333 if not mapfile:
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
334 try:
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
335 mapfile = destc.mapfile()
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
336 except:
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
337 mapfile = os.path.join(destc, "map")
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
338
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
339 c = convert(ui, srcc, destc, mapfile, opts)
3947
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
340 c.convert()
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3916
diff changeset
341
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
342 cmdtable = {
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
343 "convert":
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
344 (_convert,
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
345 [('A', 'authors', '', 'username mapping filename'),
4753
07efcce17d28 convert: add -r argument specifying latest revision to convert
Brendan Cully <brendan@kublai.com>
parents: 4719
diff changeset
346 ('r', 'rev', '', 'import up to target revision REV'),
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
347 ('', 'datesort', None, 'try to sort changesets by date')],
4532
c3a78a49d7f0 Some small cleanups for convert extension:
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4521
diff changeset
348 'hg convert [OPTION]... SOURCE [DEST [MAPFILE]]'),
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
349 }