##// END OF EJS Templates
convert: display source revision id with --verbose
Patrick Mezard -
r5954:851402e5 default
parent child Browse files
Show More
@@ -1,317 +1,321 b''
1 # convcmd - convert extension commands definition
1 # convcmd - convert extension commands definition
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from common import NoRepo, SKIPREV, converter_source, converter_sink, mapfile
8 from common import NoRepo, SKIPREV, converter_source, converter_sink, mapfile
9 from cvs import convert_cvs
9 from cvs import convert_cvs
10 from darcs import darcs_source
10 from darcs import darcs_source
11 from git import convert_git
11 from git import convert_git
12 from hg import mercurial_source, mercurial_sink
12 from hg import mercurial_source, mercurial_sink
13 from subversion import debugsvnlog, svn_source, svn_sink
13 from subversion import debugsvnlog, svn_source, svn_sink
14 import filemap
14 import filemap
15
15
16 import os, shutil
16 import os, shutil
17 from mercurial import hg, util
17 from mercurial import hg, util
18 from mercurial.i18n import _
18 from mercurial.i18n import _
19
19
20 source_converters = [
20 source_converters = [
21 ('cvs', convert_cvs),
21 ('cvs', convert_cvs),
22 ('git', convert_git),
22 ('git', convert_git),
23 ('svn', svn_source),
23 ('svn', svn_source),
24 ('hg', mercurial_source),
24 ('hg', mercurial_source),
25 ('darcs', darcs_source),
25 ('darcs', darcs_source),
26 ]
26 ]
27
27
28 sink_converters = [
28 sink_converters = [
29 ('hg', mercurial_sink),
29 ('hg', mercurial_sink),
30 ('svn', svn_sink),
30 ('svn', svn_sink),
31 ]
31 ]
32
32
33 def convertsource(ui, path, type, rev):
33 def convertsource(ui, path, type, rev):
34 exceptions = []
34 exceptions = []
35 for name, source in source_converters:
35 for name, source in source_converters:
36 try:
36 try:
37 if not type or name == type:
37 if not type or name == type:
38 return source(ui, path, rev)
38 return source(ui, path, rev)
39 except NoRepo, inst:
39 except NoRepo, inst:
40 exceptions.append(inst)
40 exceptions.append(inst)
41 if not ui.quiet:
41 if not ui.quiet:
42 for inst in exceptions:
42 for inst in exceptions:
43 ui.write(_("%s\n") % inst)
43 ui.write(_("%s\n") % inst)
44 raise util.Abort('%s: unknown repository type' % path)
44 raise util.Abort('%s: unknown repository type' % path)
45
45
46 def convertsink(ui, path, type):
46 def convertsink(ui, path, type):
47 for name, sink in sink_converters:
47 for name, sink in sink_converters:
48 try:
48 try:
49 if not type or name == type:
49 if not type or name == type:
50 return sink(ui, path)
50 return sink(ui, path)
51 except NoRepo, inst:
51 except NoRepo, inst:
52 ui.note(_("convert: %s\n") % inst)
52 ui.note(_("convert: %s\n") % inst)
53 raise util.Abort('%s: unknown repository type' % path)
53 raise util.Abort('%s: unknown repository type' % path)
54
54
55 class converter(object):
55 class converter(object):
56 def __init__(self, ui, source, dest, revmapfile, opts):
56 def __init__(self, ui, source, dest, revmapfile, opts):
57
57
58 self.source = source
58 self.source = source
59 self.dest = dest
59 self.dest = dest
60 self.ui = ui
60 self.ui = ui
61 self.opts = opts
61 self.opts = opts
62 self.commitcache = {}
62 self.commitcache = {}
63 self.authors = {}
63 self.authors = {}
64 self.authorfile = None
64 self.authorfile = None
65
65
66 self.map = mapfile(ui, revmapfile)
66 self.map = mapfile(ui, revmapfile)
67
67
68 # Read first the dst author map if any
68 # Read first the dst author map if any
69 authorfile = self.dest.authorfile()
69 authorfile = self.dest.authorfile()
70 if authorfile and os.path.exists(authorfile):
70 if authorfile and os.path.exists(authorfile):
71 self.readauthormap(authorfile)
71 self.readauthormap(authorfile)
72 # Extend/Override with new author map if necessary
72 # Extend/Override with new author map if necessary
73 if opts.get('authors'):
73 if opts.get('authors'):
74 self.readauthormap(opts.get('authors'))
74 self.readauthormap(opts.get('authors'))
75 self.authorfile = self.dest.authorfile()
75 self.authorfile = self.dest.authorfile()
76
76
77 def walktree(self, heads):
77 def walktree(self, heads):
78 '''Return a mapping that identifies the uncommitted parents of every
78 '''Return a mapping that identifies the uncommitted parents of every
79 uncommitted changeset.'''
79 uncommitted changeset.'''
80 visit = heads
80 visit = heads
81 known = {}
81 known = {}
82 parents = {}
82 parents = {}
83 while visit:
83 while visit:
84 n = visit.pop(0)
84 n = visit.pop(0)
85 if n in known or n in self.map: continue
85 if n in known or n in self.map: continue
86 known[n] = 1
86 known[n] = 1
87 commit = self.cachecommit(n)
87 commit = self.cachecommit(n)
88 parents[n] = []
88 parents[n] = []
89 for p in commit.parents:
89 for p in commit.parents:
90 parents[n].append(p)
90 parents[n].append(p)
91 visit.append(p)
91 visit.append(p)
92
92
93 return parents
93 return parents
94
94
95 def toposort(self, parents):
95 def toposort(self, parents):
96 '''Return an ordering such that every uncommitted changeset is
96 '''Return an ordering such that every uncommitted changeset is
97 preceeded by all its uncommitted ancestors.'''
97 preceeded by all its uncommitted ancestors.'''
98 visit = parents.keys()
98 visit = parents.keys()
99 seen = {}
99 seen = {}
100 children = {}
100 children = {}
101
101
102 while visit:
102 while visit:
103 n = visit.pop(0)
103 n = visit.pop(0)
104 if n in seen: continue
104 if n in seen: continue
105 seen[n] = 1
105 seen[n] = 1
106 # Ensure that nodes without parents are present in the 'children'
106 # Ensure that nodes without parents are present in the 'children'
107 # mapping.
107 # mapping.
108 children.setdefault(n, [])
108 children.setdefault(n, [])
109 for p in parents[n]:
109 for p in parents[n]:
110 if not p in self.map:
110 if not p in self.map:
111 visit.append(p)
111 visit.append(p)
112 children.setdefault(p, []).append(n)
112 children.setdefault(p, []).append(n)
113
113
114 s = []
114 s = []
115 removed = {}
115 removed = {}
116 visit = children.keys()
116 visit = children.keys()
117 while visit:
117 while visit:
118 n = visit.pop(0)
118 n = visit.pop(0)
119 if n in removed: continue
119 if n in removed: continue
120 dep = 0
120 dep = 0
121 if n in parents:
121 if n in parents:
122 for p in parents[n]:
122 for p in parents[n]:
123 if p in self.map: continue
123 if p in self.map: continue
124 if p not in removed:
124 if p not in removed:
125 # we're still dependent
125 # we're still dependent
126 visit.append(n)
126 visit.append(n)
127 dep = 1
127 dep = 1
128 break
128 break
129
129
130 if not dep:
130 if not dep:
131 # all n's parents are in the list
131 # all n's parents are in the list
132 removed[n] = 1
132 removed[n] = 1
133 if n not in self.map:
133 if n not in self.map:
134 s.append(n)
134 s.append(n)
135 if n in children:
135 if n in children:
136 for c in children[n]:
136 for c in children[n]:
137 visit.insert(0, c)
137 visit.insert(0, c)
138
138
139 if self.opts.get('datesort'):
139 if self.opts.get('datesort'):
140 depth = {}
140 depth = {}
141 for n in s:
141 for n in s:
142 depth[n] = 0
142 depth[n] = 0
143 pl = [p for p in self.commitcache[n].parents
143 pl = [p for p in self.commitcache[n].parents
144 if p not in self.map]
144 if p not in self.map]
145 if pl:
145 if pl:
146 depth[n] = max([depth[p] for p in pl]) + 1
146 depth[n] = max([depth[p] for p in pl]) + 1
147
147
148 s = [(depth[n], util.parsedate(self.commitcache[n].date), n)
148 s = [(depth[n], util.parsedate(self.commitcache[n].date), n)
149 for n in s]
149 for n in s]
150 s.sort()
150 s.sort()
151 s = [e[2] for e in s]
151 s = [e[2] for e in s]
152
152
153 return s
153 return s
154
154
155 def writeauthormap(self):
155 def writeauthormap(self):
156 authorfile = self.authorfile
156 authorfile = self.authorfile
157 if authorfile:
157 if authorfile:
158 self.ui.status('Writing author map file %s\n' % authorfile)
158 self.ui.status('Writing author map file %s\n' % authorfile)
159 ofile = open(authorfile, 'w+')
159 ofile = open(authorfile, 'w+')
160 for author in self.authors:
160 for author in self.authors:
161 ofile.write("%s=%s\n" % (author, self.authors[author]))
161 ofile.write("%s=%s\n" % (author, self.authors[author]))
162 ofile.close()
162 ofile.close()
163
163
164 def readauthormap(self, authorfile):
164 def readauthormap(self, authorfile):
165 afile = open(authorfile, 'r')
165 afile = open(authorfile, 'r')
166 for line in afile:
166 for line in afile:
167 try:
167 try:
168 srcauthor = line.split('=')[0].strip()
168 srcauthor = line.split('=')[0].strip()
169 dstauthor = line.split('=')[1].strip()
169 dstauthor = line.split('=')[1].strip()
170 if srcauthor in self.authors and dstauthor != self.authors[srcauthor]:
170 if srcauthor in self.authors and dstauthor != self.authors[srcauthor]:
171 self.ui.status(
171 self.ui.status(
172 'Overriding mapping for author %s, was %s, will be %s\n'
172 'Overriding mapping for author %s, was %s, will be %s\n'
173 % (srcauthor, self.authors[srcauthor], dstauthor))
173 % (srcauthor, self.authors[srcauthor], dstauthor))
174 else:
174 else:
175 self.ui.debug('Mapping author %s to %s\n'
175 self.ui.debug('Mapping author %s to %s\n'
176 % (srcauthor, dstauthor))
176 % (srcauthor, dstauthor))
177 self.authors[srcauthor] = dstauthor
177 self.authors[srcauthor] = dstauthor
178 except IndexError:
178 except IndexError:
179 self.ui.warn(
179 self.ui.warn(
180 'Ignoring bad line in author file map %s: %s\n'
180 'Ignoring bad line in author file map %s: %s\n'
181 % (authorfile, line))
181 % (authorfile, line))
182 afile.close()
182 afile.close()
183
183
184 def cachecommit(self, rev):
184 def cachecommit(self, rev):
185 commit = self.source.getcommit(rev)
185 commit = self.source.getcommit(rev)
186 commit.author = self.authors.get(commit.author, commit.author)
186 commit.author = self.authors.get(commit.author, commit.author)
187 self.commitcache[rev] = commit
187 self.commitcache[rev] = commit
188 return commit
188 return commit
189
189
190 def copy(self, rev):
190 def copy(self, rev):
191 commit = self.commitcache[rev]
191 commit = self.commitcache[rev]
192 do_copies = hasattr(self.dest, 'copyfile')
192 do_copies = hasattr(self.dest, 'copyfile')
193 filenames = []
193 filenames = []
194
194
195 changes = self.source.getchanges(rev)
195 changes = self.source.getchanges(rev)
196 if isinstance(changes, basestring):
196 if isinstance(changes, basestring):
197 if changes == SKIPREV:
197 if changes == SKIPREV:
198 dest = SKIPREV
198 dest = SKIPREV
199 else:
199 else:
200 dest = self.map[changes]
200 dest = self.map[changes]
201 self.map[rev] = dest
201 self.map[rev] = dest
202 return
202 return
203 files, copies = changes
203 files, copies = changes
204 parents = [self.map[r] for r in commit.parents]
204 parents = [self.map[r] for r in commit.parents]
205 if commit.parents:
205 if commit.parents:
206 prev = commit.parents[0]
206 prev = commit.parents[0]
207 if prev not in self.commitcache:
207 if prev not in self.commitcache:
208 self.cachecommit(prev)
208 self.cachecommit(prev)
209 pbranch = self.commitcache[prev].branch
209 pbranch = self.commitcache[prev].branch
210 else:
210 else:
211 pbranch = None
211 pbranch = None
212 self.dest.setbranch(commit.branch, pbranch, parents)
212 self.dest.setbranch(commit.branch, pbranch, parents)
213 for f, v in files:
213 for f, v in files:
214 filenames.append(f)
214 filenames.append(f)
215 try:
215 try:
216 data = self.source.getfile(f, v)
216 data = self.source.getfile(f, v)
217 except IOError, inst:
217 except IOError, inst:
218 self.dest.delfile(f)
218 self.dest.delfile(f)
219 else:
219 else:
220 e = self.source.getmode(f, v)
220 e = self.source.getmode(f, v)
221 self.dest.putfile(f, e, data)
221 self.dest.putfile(f, e, data)
222 if do_copies:
222 if do_copies:
223 if f in copies:
223 if f in copies:
224 copyf = copies[f]
224 copyf = copies[f]
225 # Merely marks that a copy happened.
225 # Merely marks that a copy happened.
226 self.dest.copyfile(copyf, f)
226 self.dest.copyfile(copyf, f)
227
227
228 newnode = self.dest.putcommit(filenames, parents, commit)
228 newnode = self.dest.putcommit(filenames, parents, commit)
229 self.source.converted(rev, newnode)
229 self.source.converted(rev, newnode)
230 self.map[rev] = newnode
230 self.map[rev] = newnode
231
231
232 def convert(self):
232 def convert(self):
233
234 def recode(s):
235 return s.decode('utf-8').encode(orig_encoding, 'replace')
236
233 try:
237 try:
234 self.source.before()
238 self.source.before()
235 self.dest.before()
239 self.dest.before()
236 self.source.setrevmap(self.map)
240 self.source.setrevmap(self.map)
237 self.ui.status("scanning source...\n")
241 self.ui.status("scanning source...\n")
238 heads = self.source.getheads()
242 heads = self.source.getheads()
239 parents = self.walktree(heads)
243 parents = self.walktree(heads)
240 self.ui.status("sorting...\n")
244 self.ui.status("sorting...\n")
241 t = self.toposort(parents)
245 t = self.toposort(parents)
242 num = len(t)
246 num = len(t)
243 c = None
247 c = None
244
248
245 self.ui.status("converting...\n")
249 self.ui.status("converting...\n")
246 for c in t:
250 for c in t:
247 num -= 1
251 num -= 1
248 desc = self.commitcache[c].desc
252 desc = self.commitcache[c].desc
249 if "\n" in desc:
253 if "\n" in desc:
250 desc = desc.splitlines()[0]
254 desc = desc.splitlines()[0]
251 # convert log message to local encoding without using
255 # convert log message to local encoding without using
252 # tolocal() because util._encoding conver() use it as
256 # tolocal() because util._encoding conver() use it as
253 # 'utf-8'
257 # 'utf-8'
254 desc = desc.decode('utf-8').encode(orig_encoding, 'replace')
258 self.ui.status("%d %s\n" % (num, recode(desc)))
255 self.ui.status("%d %s\n" % (num, desc))
259 self.ui.note(_("source: %s\n" % recode(c)))
256 self.copy(c)
260 self.copy(c)
257
261
258 tags = self.source.gettags()
262 tags = self.source.gettags()
259 ctags = {}
263 ctags = {}
260 for k in tags:
264 for k in tags:
261 v = tags[k]
265 v = tags[k]
262 if self.map.get(v, SKIPREV) != SKIPREV:
266 if self.map.get(v, SKIPREV) != SKIPREV:
263 ctags[k] = self.map[v]
267 ctags[k] = self.map[v]
264
268
265 if c and ctags:
269 if c and ctags:
266 nrev = self.dest.puttags(ctags)
270 nrev = self.dest.puttags(ctags)
267 # write another hash correspondence to override the previous
271 # write another hash correspondence to override the previous
268 # one so we don't end up with extra tag heads
272 # one so we don't end up with extra tag heads
269 if nrev:
273 if nrev:
270 self.map[c] = nrev
274 self.map[c] = nrev
271
275
272 self.writeauthormap()
276 self.writeauthormap()
273 finally:
277 finally:
274 self.cleanup()
278 self.cleanup()
275
279
276 def cleanup(self):
280 def cleanup(self):
277 try:
281 try:
278 self.dest.after()
282 self.dest.after()
279 finally:
283 finally:
280 self.source.after()
284 self.source.after()
281 self.map.close()
285 self.map.close()
282
286
283 orig_encoding = 'ascii'
287 orig_encoding = 'ascii'
284
288
285 def convert(ui, src, dest=None, revmapfile=None, **opts):
289 def convert(ui, src, dest=None, revmapfile=None, **opts):
286 global orig_encoding
290 global orig_encoding
287 orig_encoding = util._encoding
291 orig_encoding = util._encoding
288 util._encoding = 'UTF-8'
292 util._encoding = 'UTF-8'
289
293
290 if not dest:
294 if not dest:
291 dest = hg.defaultdest(src) + "-hg"
295 dest = hg.defaultdest(src) + "-hg"
292 ui.status("assuming destination %s\n" % dest)
296 ui.status("assuming destination %s\n" % dest)
293
297
294 destc = convertsink(ui, dest, opts.get('dest_type'))
298 destc = convertsink(ui, dest, opts.get('dest_type'))
295
299
296 try:
300 try:
297 srcc = convertsource(ui, src, opts.get('source_type'),
301 srcc = convertsource(ui, src, opts.get('source_type'),
298 opts.get('rev'))
302 opts.get('rev'))
299 except Exception:
303 except Exception:
300 for path in destc.created:
304 for path in destc.created:
301 shutil.rmtree(path, True)
305 shutil.rmtree(path, True)
302 raise
306 raise
303
307
304 fmap = opts.get('filemap')
308 fmap = opts.get('filemap')
305 if fmap:
309 if fmap:
306 srcc = filemap.filemap_source(ui, srcc, fmap)
310 srcc = filemap.filemap_source(ui, srcc, fmap)
307 destc.setfilemapmode(True)
311 destc.setfilemapmode(True)
308
312
309 if not revmapfile:
313 if not revmapfile:
310 try:
314 try:
311 revmapfile = destc.revmapfile()
315 revmapfile = destc.revmapfile()
312 except:
316 except:
313 revmapfile = os.path.join(destc, "map")
317 revmapfile = os.path.join(destc, "map")
314
318
315 c = converter(ui, srcc, destc, revmapfile, opts)
319 c = converter(ui, srcc, destc, revmapfile, opts)
316 c.convert()
320 c.convert()
317
321
@@ -1,180 +1,180 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 "$TESTDIR/hghave" svn svn-bindings || exit 80
3 "$TESTDIR/hghave" svn svn-bindings || exit 80
4
4
5 fix_path()
5 fix_path()
6 {
6 {
7 tr '\\' /
7 tr '\\' /
8 }
8 }
9
9
10 echo "[extensions]" >> $HGRCPATH
10 echo "[extensions]" >> $HGRCPATH
11 echo "convert = " >> $HGRCPATH
11 echo "convert = " >> $HGRCPATH
12
12
13 svnadmin create svn-repo
13 svnadmin create svn-repo
14
14
15 echo % initial svn import
15 echo % initial svn import
16 mkdir t
16 mkdir t
17 cd t
17 cd t
18 echo a > a
18 echo a > a
19 cd ..
19 cd ..
20
20
21 svnpath=`pwd | fix_path`
21 svnpath=`pwd | fix_path`
22 # SVN wants all paths to start with a slash. Unfortunately,
22 # SVN wants all paths to start with a slash. Unfortunately,
23 # Windows ones don't. Handle that.
23 # Windows ones don't. Handle that.
24 expr $svnpath : "\/" > /dev/null
24 expr $svnpath : "\/" > /dev/null
25 if [ $? -ne 0 ]; then
25 if [ $? -ne 0 ]; then
26 svnpath='/'$svnpath
26 svnpath='/'$svnpath
27 fi
27 fi
28
28
29 svnurl=file://$svnpath/svn-repo/trunk/test
29 svnurl=file://$svnpath/svn-repo/trunk/test
30 svn import -m init t $svnurl | fix_path
30 svn import -m init t $svnurl | fix_path
31
31
32 echo % update svn repository
32 echo % update svn repository
33 svn co $svnurl t2 | fix_path
33 svn co $svnurl t2 | fix_path
34 cd t2
34 cd t2
35 echo b >> a
35 echo b >> a
36 echo b > b
36 echo b > b
37 svn add b
37 svn add b
38 svn ci -m changea
38 svn ci -m changea
39 cd ..
39 cd ..
40
40
41 echo % convert to hg once
41 echo % convert to hg once
42 hg convert $svnurl
42 hg convert $svnurl
43
43
44 echo % update svn repository again
44 echo % update svn repository again
45 cd t2
45 cd t2
46 echo c >> a
46 echo c >> a
47 echo c >> b
47 echo c >> b
48 svn ci -m changeb
48 svn ci -m changeb
49 cd ..
49 cd ..
50
50
51 echo % test incremental conversion
51 echo % test incremental conversion
52 hg convert $svnurl
52 hg convert -v $svnurl | sed 's/source:.*/source:/'
53
53
54 echo % test filemap
54 echo % test filemap
55 echo 'include b' > filemap
55 echo 'include b' > filemap
56 hg convert --filemap filemap $svnurl fmap
56 hg convert --filemap filemap $svnurl fmap
57 echo '[extensions]' >> $HGRCPATH
57 echo '[extensions]' >> $HGRCPATH
58 echo 'hgext.graphlog =' >> $HGRCPATH
58 echo 'hgext.graphlog =' >> $HGRCPATH
59 hg glog -R fmap --template '#rev# #desc|firstline# files: #files#\n'
59 hg glog -R fmap --template '#rev# #desc|firstline# files: #files#\n'
60
60
61 echo % test stop revision
61 echo % test stop revision
62 hg convert --rev 1 $svnurl stoprev
62 hg convert --rev 1 $svnurl stoprev
63 # Check convert_revision extra-records.
63 # Check convert_revision extra-records.
64 # This is also the only place testing more than one extra field
64 # This is also the only place testing more than one extra field
65 # in a revision.
65 # in a revision.
66 hg --cwd stoprev tip --debug | grep extra | sed 's/=.*/=/'
66 hg --cwd stoprev tip --debug | grep extra | sed 's/=.*/=/'
67
67
68 ########################################
68 ########################################
69
69
70 echo "# now tests that it works with trunk/branches/tags layout"
70 echo "# now tests that it works with trunk/branches/tags layout"
71 echo
71 echo
72 echo % initial svn import
72 echo % initial svn import
73 mkdir projA
73 mkdir projA
74 cd projA
74 cd projA
75 mkdir trunk
75 mkdir trunk
76 mkdir branches
76 mkdir branches
77 mkdir tags
77 mkdir tags
78 cd ..
78 cd ..
79
79
80 svnurl=file://$svnpath/svn-repo/projA
80 svnurl=file://$svnpath/svn-repo/projA
81 svn import -m "init projA" projA $svnurl | fix_path
81 svn import -m "init projA" projA $svnurl | fix_path
82
82
83
83
84 echo % update svn repository
84 echo % update svn repository
85 svn co $svnurl/trunk A | fix_path
85 svn co $svnurl/trunk A | fix_path
86 cd A
86 cd A
87 echo hello > letter.txt
87 echo hello > letter.txt
88 svn add letter.txt
88 svn add letter.txt
89 svn ci -m hello
89 svn ci -m hello
90
90
91 echo world >> letter.txt
91 echo world >> letter.txt
92 svn ci -m world
92 svn ci -m world
93
93
94 svn copy -m "tag v0.1" $svnurl/trunk $svnurl/tags/v0.1
94 svn copy -m "tag v0.1" $svnurl/trunk $svnurl/tags/v0.1
95
95
96 echo 'nice day today!' >> letter.txt
96 echo 'nice day today!' >> letter.txt
97 svn ci -m "nice day"
97 svn ci -m "nice day"
98 cd ..
98 cd ..
99
99
100 echo % convert to hg once
100 echo % convert to hg once
101 hg convert $svnurl A-hg
101 hg convert $svnurl A-hg
102
102
103 echo % update svn repository again
103 echo % update svn repository again
104 cd A
104 cd A
105 echo "see second letter" >> letter.txt
105 echo "see second letter" >> letter.txt
106 # Put it in a subdirectory to test duplicate file records
106 # Put it in a subdirectory to test duplicate file records
107 # from svn source (issue 714)
107 # from svn source (issue 714)
108 mkdir todo
108 mkdir todo
109 echo "nice to meet you" > todo/letter2.txt
109 echo "nice to meet you" > todo/letter2.txt
110 svn add todo
110 svn add todo
111 svn ci -m "second letter"
111 svn ci -m "second letter"
112
112
113 svn copy -m "tag v0.2" $svnurl/trunk $svnurl/tags/v0.2
113 svn copy -m "tag v0.2" $svnurl/trunk $svnurl/tags/v0.2
114
114
115 echo "blah-blah-blah" >> todo/letter2.txt
115 echo "blah-blah-blah" >> todo/letter2.txt
116 svn ci -m "work in progress"
116 svn ci -m "work in progress"
117 cd ..
117 cd ..
118
118
119 echo % test incremental conversion
119 echo % test incremental conversion
120 hg convert $svnurl A-hg
120 hg convert $svnurl A-hg
121
121
122 cd A-hg
122 cd A-hg
123 hg glog --template '#rev# #desc|firstline# files: #files#\n'
123 hg glog --template '#rev# #desc|firstline# files: #files#\n'
124 hg tags -q
124 hg tags -q
125 cd ..
125 cd ..
126
126
127 ########################################
127 ########################################
128
128
129 echo "# now tests that it works with trunk/tags layout, but no branches yet"
129 echo "# now tests that it works with trunk/tags layout, but no branches yet"
130 echo
130 echo
131 echo % initial svn import
131 echo % initial svn import
132 mkdir projB
132 mkdir projB
133 cd projB
133 cd projB
134 mkdir trunk
134 mkdir trunk
135 mkdir tags
135 mkdir tags
136 cd ..
136 cd ..
137
137
138 svnurl=file://$svnpath/svn-repo/projB
138 svnurl=file://$svnpath/svn-repo/projB
139 svn import -m "init projB" projB $svnurl | fix_path
139 svn import -m "init projB" projB $svnurl | fix_path
140
140
141
141
142 echo % update svn repository
142 echo % update svn repository
143 svn co $svnurl/trunk B | fix_path
143 svn co $svnurl/trunk B | fix_path
144 cd B
144 cd B
145 echo hello > letter.txt
145 echo hello > letter.txt
146 svn add letter.txt
146 svn add letter.txt
147 svn ci -m hello
147 svn ci -m hello
148
148
149 echo world >> letter.txt
149 echo world >> letter.txt
150 svn ci -m world
150 svn ci -m world
151
151
152 svn copy -m "tag v0.1" $svnurl/trunk $svnurl/tags/v0.1
152 svn copy -m "tag v0.1" $svnurl/trunk $svnurl/tags/v0.1
153
153
154 echo 'nice day today!' >> letter.txt
154 echo 'nice day today!' >> letter.txt
155 svn ci -m "nice day"
155 svn ci -m "nice day"
156 cd ..
156 cd ..
157
157
158 echo % convert to hg once
158 echo % convert to hg once
159 hg convert $svnurl B-hg
159 hg convert $svnurl B-hg
160
160
161 echo % update svn repository again
161 echo % update svn repository again
162 cd B
162 cd B
163 echo "see second letter" >> letter.txt
163 echo "see second letter" >> letter.txt
164 echo "nice to meet you" > letter2.txt
164 echo "nice to meet you" > letter2.txt
165 svn add letter2.txt
165 svn add letter2.txt
166 svn ci -m "second letter"
166 svn ci -m "second letter"
167
167
168 svn copy -m "tag v0.2" $svnurl/trunk $svnurl/tags/v0.2
168 svn copy -m "tag v0.2" $svnurl/trunk $svnurl/tags/v0.2
169
169
170 echo "blah-blah-blah" >> letter2.txt
170 echo "blah-blah-blah" >> letter2.txt
171 svn ci -m "work in progress"
171 svn ci -m "work in progress"
172 cd ..
172 cd ..
173
173
174 echo % test incremental conversion
174 echo % test incremental conversion
175 hg convert $svnurl B-hg
175 hg convert $svnurl B-hg
176
176
177 cd B-hg
177 cd B-hg
178 hg glog --template '#rev# #desc|firstline# files: #files#\n'
178 hg glog --template '#rev# #desc|firstline# files: #files#\n'
179 hg tags -q
179 hg tags -q
180 cd ..
180 cd ..
@@ -1,190 +1,195 b''
1 % initial svn import
1 % initial svn import
2 Adding t/a
2 Adding t/a
3
3
4 Committed revision 1.
4 Committed revision 1.
5 % update svn repository
5 % update svn repository
6 A t2/a
6 A t2/a
7 Checked out revision 1.
7 Checked out revision 1.
8 A b
8 A b
9 Sending a
9 Sending a
10 Adding b
10 Adding b
11 Transmitting file data ..
11 Transmitting file data ..
12 Committed revision 2.
12 Committed revision 2.
13 % convert to hg once
13 % convert to hg once
14 assuming destination test-hg
14 assuming destination test-hg
15 initializing destination test-hg repository
15 initializing destination test-hg repository
16 scanning source...
16 scanning source...
17 sorting...
17 sorting...
18 converting...
18 converting...
19 1 init
19 1 init
20 0 changea
20 0 changea
21 % update svn repository again
21 % update svn repository again
22 Sending a
22 Sending a
23 Sending b
23 Sending b
24 Transmitting file data ..
24 Transmitting file data ..
25 Committed revision 3.
25 Committed revision 3.
26 % test incremental conversion
26 % test incremental conversion
27 assuming destination test-hg
27 assuming destination test-hg
28 scanning source...
28 scanning source...
29 fetching revision log for "/trunk/test" from 3 to 2
29 sorting...
30 sorting...
30 converting...
31 converting...
31 0 changeb
32 0 changeb
33 source:
34 a
35 b
36 no tags found at revision 3
32 % test filemap
37 % test filemap
33 initializing destination fmap repository
38 initializing destination fmap repository
34 scanning source...
39 scanning source...
35 sorting...
40 sorting...
36 converting...
41 converting...
37 2 init
42 2 init
38 1 changea
43 1 changea
39 0 changeb
44 0 changeb
40 o 1 changeb files: b
45 o 1 changeb files: b
41 |
46 |
42 o 0 changea files: b
47 o 0 changea files: b
43
48
44 % test stop revision
49 % test stop revision
45 initializing destination stoprev repository
50 initializing destination stoprev repository
46 scanning source...
51 scanning source...
47 sorting...
52 sorting...
48 converting...
53 converting...
49 0 init
54 0 init
50 extra: branch=
55 extra: branch=
51 extra: convert_revision=
56 extra: convert_revision=
52 # now tests that it works with trunk/branches/tags layout
57 # now tests that it works with trunk/branches/tags layout
53
58
54 % initial svn import
59 % initial svn import
55 Adding projA/trunk
60 Adding projA/trunk
56 Adding projA/branches
61 Adding projA/branches
57 Adding projA/tags
62 Adding projA/tags
58
63
59 Committed revision 4.
64 Committed revision 4.
60 % update svn repository
65 % update svn repository
61 Checked out revision 4.
66 Checked out revision 4.
62 A letter.txt
67 A letter.txt
63 Adding letter.txt
68 Adding letter.txt
64 Transmitting file data .
69 Transmitting file data .
65 Committed revision 5.
70 Committed revision 5.
66 Sending letter.txt
71 Sending letter.txt
67 Transmitting file data .
72 Transmitting file data .
68 Committed revision 6.
73 Committed revision 6.
69
74
70 Committed revision 7.
75 Committed revision 7.
71 Sending letter.txt
76 Sending letter.txt
72 Transmitting file data .
77 Transmitting file data .
73 Committed revision 8.
78 Committed revision 8.
74 % convert to hg once
79 % convert to hg once
75 initializing destination A-hg repository
80 initializing destination A-hg repository
76 scanning source...
81 scanning source...
77 sorting...
82 sorting...
78 converting...
83 converting...
79 3 init projA
84 3 init projA
80 2 hello
85 2 hello
81 1 world
86 1 world
82 0 nice day
87 0 nice day
83 updating tags
88 updating tags
84 % update svn repository again
89 % update svn repository again
85 A todo
90 A todo
86 A todo/letter2.txt
91 A todo/letter2.txt
87 Sending letter.txt
92 Sending letter.txt
88 Adding todo
93 Adding todo
89 Adding todo/letter2.txt
94 Adding todo/letter2.txt
90 Transmitting file data ..
95 Transmitting file data ..
91 Committed revision 9.
96 Committed revision 9.
92
97
93 Committed revision 10.
98 Committed revision 10.
94 Sending todo/letter2.txt
99 Sending todo/letter2.txt
95 Transmitting file data .
100 Transmitting file data .
96 Committed revision 11.
101 Committed revision 11.
97 % test incremental conversion
102 % test incremental conversion
98 scanning source...
103 scanning source...
99 sorting...
104 sorting...
100 converting...
105 converting...
101 1 second letter
106 1 second letter
102 0 work in progress
107 0 work in progress
103 updating tags
108 updating tags
104 o 7 update tags files: .hgtags
109 o 7 update tags files: .hgtags
105 |
110 |
106 o 6 work in progress files: todo/letter2.txt
111 o 6 work in progress files: todo/letter2.txt
107 |
112 |
108 o 5 second letter files: letter.txt todo/letter2.txt
113 o 5 second letter files: letter.txt todo/letter2.txt
109 |
114 |
110 o 4 update tags files: .hgtags
115 o 4 update tags files: .hgtags
111 |
116 |
112 o 3 nice day files: letter.txt
117 o 3 nice day files: letter.txt
113 |
118 |
114 o 2 world files: letter.txt
119 o 2 world files: letter.txt
115 |
120 |
116 o 1 hello files: letter.txt
121 o 1 hello files: letter.txt
117 |
122 |
118 o 0 init projA files:
123 o 0 init projA files:
119
124
120 tip
125 tip
121 v0.2
126 v0.2
122 v0.1
127 v0.1
123 # now tests that it works with trunk/tags layout, but no branches yet
128 # now tests that it works with trunk/tags layout, but no branches yet
124
129
125 % initial svn import
130 % initial svn import
126 Adding projB/trunk
131 Adding projB/trunk
127 Adding projB/tags
132 Adding projB/tags
128
133
129 Committed revision 12.
134 Committed revision 12.
130 % update svn repository
135 % update svn repository
131 Checked out revision 12.
136 Checked out revision 12.
132 A letter.txt
137 A letter.txt
133 Adding letter.txt
138 Adding letter.txt
134 Transmitting file data .
139 Transmitting file data .
135 Committed revision 13.
140 Committed revision 13.
136 Sending letter.txt
141 Sending letter.txt
137 Transmitting file data .
142 Transmitting file data .
138 Committed revision 14.
143 Committed revision 14.
139
144
140 Committed revision 15.
145 Committed revision 15.
141 Sending letter.txt
146 Sending letter.txt
142 Transmitting file data .
147 Transmitting file data .
143 Committed revision 16.
148 Committed revision 16.
144 % convert to hg once
149 % convert to hg once
145 initializing destination B-hg repository
150 initializing destination B-hg repository
146 scanning source...
151 scanning source...
147 sorting...
152 sorting...
148 converting...
153 converting...
149 3 init projB
154 3 init projB
150 2 hello
155 2 hello
151 1 world
156 1 world
152 0 nice day
157 0 nice day
153 updating tags
158 updating tags
154 % update svn repository again
159 % update svn repository again
155 A letter2.txt
160 A letter2.txt
156 Sending letter.txt
161 Sending letter.txt
157 Adding letter2.txt
162 Adding letter2.txt
158 Transmitting file data ..
163 Transmitting file data ..
159 Committed revision 17.
164 Committed revision 17.
160
165
161 Committed revision 18.
166 Committed revision 18.
162 Sending letter2.txt
167 Sending letter2.txt
163 Transmitting file data .
168 Transmitting file data .
164 Committed revision 19.
169 Committed revision 19.
165 % test incremental conversion
170 % test incremental conversion
166 scanning source...
171 scanning source...
167 sorting...
172 sorting...
168 converting...
173 converting...
169 1 second letter
174 1 second letter
170 0 work in progress
175 0 work in progress
171 updating tags
176 updating tags
172 o 7 update tags files: .hgtags
177 o 7 update tags files: .hgtags
173 |
178 |
174 o 6 work in progress files: letter2.txt
179 o 6 work in progress files: letter2.txt
175 |
180 |
176 o 5 second letter files: letter.txt letter2.txt
181 o 5 second letter files: letter.txt letter2.txt
177 |
182 |
178 o 4 update tags files: .hgtags
183 o 4 update tags files: .hgtags
179 |
184 |
180 o 3 nice day files: letter.txt
185 o 3 nice day files: letter.txt
181 |
186 |
182 o 2 world files: letter.txt
187 o 2 world files: letter.txt
183 |
188 |
184 o 1 hello files: letter.txt
189 o 1 hello files: letter.txt
185 |
190 |
186 o 0 init projB files:
191 o 0 init projB files:
187
192
188 tip
193 tip
189 v0.2
194 v0.2
190 v0.1
195 v0.1
General Comments 0
You need to be logged in to leave comments. Login now