##// END OF EJS Templates
convert: better feedback when filtering out empty revisions...
Patrick Mezard -
r8611:ba42e3c6 default
parent child Browse files
Show More
@@ -1,338 +1,339 b''
1 # hg.py - hg backend for convert extension
1 # hg.py - hg backend for convert extension
2 #
2 #
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference.
6 # GNU General Public License version 2, incorporated herein by reference.
7
7
8 # Notes for hg->hg conversion:
8 # Notes for hg->hg conversion:
9 #
9 #
10 # * Old versions of Mercurial didn't trim the whitespace from the ends
10 # * Old versions of Mercurial didn't trim the whitespace from the ends
11 # of commit messages, but new versions do. Changesets created by
11 # of commit messages, but new versions do. Changesets created by
12 # those older versions, then converted, may thus have different
12 # those older versions, then converted, may thus have different
13 # hashes for changesets that are otherwise identical.
13 # hashes for changesets that are otherwise identical.
14 #
14 #
15 # * Using "--config convert.hg.saverev=true" will make the source
15 # * Using "--config convert.hg.saverev=true" will make the source
16 # identifier to be stored in the converted revision. This will cause
16 # identifier to be stored in the converted revision. This will cause
17 # the converted revision to have a different identity than the
17 # the converted revision to have a different identity than the
18 # source.
18 # source.
19
19
20
20
21 import os, time
21 import os, time
22 from mercurial.i18n import _
22 from mercurial.i18n import _
23 from mercurial.node import bin, hex, nullid
23 from mercurial.node import bin, hex, nullid
24 from mercurial import hg, util, context, error
24 from mercurial import hg, util, context, error
25
25
26 from common import NoRepo, commit, converter_source, converter_sink
26 from common import NoRepo, commit, converter_source, converter_sink
27
27
28 class mercurial_sink(converter_sink):
28 class mercurial_sink(converter_sink):
29 def __init__(self, ui, path):
29 def __init__(self, ui, path):
30 converter_sink.__init__(self, ui, path)
30 converter_sink.__init__(self, ui, path)
31 self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
31 self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
32 self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
32 self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
33 self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
33 self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
34 self.lastbranch = None
34 self.lastbranch = None
35 if os.path.isdir(path) and len(os.listdir(path)) > 0:
35 if os.path.isdir(path) and len(os.listdir(path)) > 0:
36 try:
36 try:
37 self.repo = hg.repository(self.ui, path)
37 self.repo = hg.repository(self.ui, path)
38 if not self.repo.local():
38 if not self.repo.local():
39 raise NoRepo(_('%s is not a local Mercurial repo') % path)
39 raise NoRepo(_('%s is not a local Mercurial repo') % path)
40 except error.RepoError, err:
40 except error.RepoError, err:
41 ui.traceback()
41 ui.traceback()
42 raise NoRepo(err.args[0])
42 raise NoRepo(err.args[0])
43 else:
43 else:
44 try:
44 try:
45 ui.status(_('initializing destination %s repository\n') % path)
45 ui.status(_('initializing destination %s repository\n') % path)
46 self.repo = hg.repository(self.ui, path, create=True)
46 self.repo = hg.repository(self.ui, path, create=True)
47 if not self.repo.local():
47 if not self.repo.local():
48 raise NoRepo(_('%s is not a local Mercurial repo') % path)
48 raise NoRepo(_('%s is not a local Mercurial repo') % path)
49 self.created.append(path)
49 self.created.append(path)
50 except error.RepoError:
50 except error.RepoError:
51 ui.traceback()
51 ui.traceback()
52 raise NoRepo("could not create hg repo %s as sink" % path)
52 raise NoRepo("could not create hg repo %s as sink" % path)
53 self.lock = None
53 self.lock = None
54 self.wlock = None
54 self.wlock = None
55 self.filemapmode = False
55 self.filemapmode = False
56
56
57 def before(self):
57 def before(self):
58 self.ui.debug(_('run hg sink pre-conversion action\n'))
58 self.ui.debug(_('run hg sink pre-conversion action\n'))
59 self.wlock = self.repo.wlock()
59 self.wlock = self.repo.wlock()
60 self.lock = self.repo.lock()
60 self.lock = self.repo.lock()
61
61
62 def after(self):
62 def after(self):
63 self.ui.debug(_('run hg sink post-conversion action\n'))
63 self.ui.debug(_('run hg sink post-conversion action\n'))
64 self.lock.release()
64 self.lock.release()
65 self.wlock.release()
65 self.wlock.release()
66
66
67 def revmapfile(self):
67 def revmapfile(self):
68 return os.path.join(self.path, ".hg", "shamap")
68 return os.path.join(self.path, ".hg", "shamap")
69
69
70 def authorfile(self):
70 def authorfile(self):
71 return os.path.join(self.path, ".hg", "authormap")
71 return os.path.join(self.path, ".hg", "authormap")
72
72
73 def getheads(self):
73 def getheads(self):
74 h = self.repo.changelog.heads()
74 h = self.repo.changelog.heads()
75 return [ hex(x) for x in h ]
75 return [ hex(x) for x in h ]
76
76
77 def setbranch(self, branch, pbranches):
77 def setbranch(self, branch, pbranches):
78 if not self.clonebranches:
78 if not self.clonebranches:
79 return
79 return
80
80
81 setbranch = (branch != self.lastbranch)
81 setbranch = (branch != self.lastbranch)
82 self.lastbranch = branch
82 self.lastbranch = branch
83 if not branch:
83 if not branch:
84 branch = 'default'
84 branch = 'default'
85 pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
85 pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
86 pbranch = pbranches and pbranches[0][1] or 'default'
86 pbranch = pbranches and pbranches[0][1] or 'default'
87
87
88 branchpath = os.path.join(self.path, branch)
88 branchpath = os.path.join(self.path, branch)
89 if setbranch:
89 if setbranch:
90 self.after()
90 self.after()
91 try:
91 try:
92 self.repo = hg.repository(self.ui, branchpath)
92 self.repo = hg.repository(self.ui, branchpath)
93 except:
93 except:
94 self.repo = hg.repository(self.ui, branchpath, create=True)
94 self.repo = hg.repository(self.ui, branchpath, create=True)
95 self.before()
95 self.before()
96
96
97 # pbranches may bring revisions from other branches (merge parents)
97 # pbranches may bring revisions from other branches (merge parents)
98 # Make sure we have them, or pull them.
98 # Make sure we have them, or pull them.
99 missings = {}
99 missings = {}
100 for b in pbranches:
100 for b in pbranches:
101 try:
101 try:
102 self.repo.lookup(b[0])
102 self.repo.lookup(b[0])
103 except:
103 except:
104 missings.setdefault(b[1], []).append(b[0])
104 missings.setdefault(b[1], []).append(b[0])
105
105
106 if missings:
106 if missings:
107 self.after()
107 self.after()
108 for pbranch, heads in missings.iteritems():
108 for pbranch, heads in missings.iteritems():
109 pbranchpath = os.path.join(self.path, pbranch)
109 pbranchpath = os.path.join(self.path, pbranch)
110 prepo = hg.repository(self.ui, pbranchpath)
110 prepo = hg.repository(self.ui, pbranchpath)
111 self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch))
111 self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch))
112 self.repo.pull(prepo, [prepo.lookup(h) for h in heads])
112 self.repo.pull(prepo, [prepo.lookup(h) for h in heads])
113 self.before()
113 self.before()
114
114
115 def putcommit(self, files, copies, parents, commit, source):
115 def putcommit(self, files, copies, parents, commit, source):
116
116
117 files = dict(files)
117 files = dict(files)
118 def getfilectx(repo, memctx, f):
118 def getfilectx(repo, memctx, f):
119 v = files[f]
119 v = files[f]
120 data = source.getfile(f, v)
120 data = source.getfile(f, v)
121 e = source.getmode(f, v)
121 e = source.getmode(f, v)
122 return context.memfilectx(f, data, 'l' in e, 'x' in e, copies.get(f))
122 return context.memfilectx(f, data, 'l' in e, 'x' in e, copies.get(f))
123
123
124 pl = []
124 pl = []
125 for p in parents:
125 for p in parents:
126 if p not in pl:
126 if p not in pl:
127 pl.append(p)
127 pl.append(p)
128 parents = pl
128 parents = pl
129 nparents = len(parents)
129 nparents = len(parents)
130 if self.filemapmode and nparents == 1:
130 if self.filemapmode and nparents == 1:
131 m1node = self.repo.changelog.read(bin(parents[0]))[0]
131 m1node = self.repo.changelog.read(bin(parents[0]))[0]
132 parent = parents[0]
132 parent = parents[0]
133
133
134 if len(parents) < 2: parents.append(nullid)
134 if len(parents) < 2: parents.append(nullid)
135 if len(parents) < 2: parents.append(nullid)
135 if len(parents) < 2: parents.append(nullid)
136 p2 = parents.pop(0)
136 p2 = parents.pop(0)
137
137
138 text = commit.desc
138 text = commit.desc
139 extra = commit.extra.copy()
139 extra = commit.extra.copy()
140 if self.branchnames and commit.branch:
140 if self.branchnames and commit.branch:
141 extra['branch'] = commit.branch
141 extra['branch'] = commit.branch
142 if commit.rev:
142 if commit.rev:
143 extra['convert_revision'] = commit.rev
143 extra['convert_revision'] = commit.rev
144
144
145 while parents:
145 while parents:
146 p1 = p2
146 p1 = p2
147 p2 = parents.pop(0)
147 p2 = parents.pop(0)
148 ctx = context.memctx(self.repo, (p1, p2), text, files.keys(), getfilectx,
148 ctx = context.memctx(self.repo, (p1, p2), text, files.keys(), getfilectx,
149 commit.author, commit.date, extra)
149 commit.author, commit.date, extra)
150 self.repo.commitctx(ctx)
150 self.repo.commitctx(ctx)
151 text = "(octopus merge fixup)\n"
151 text = "(octopus merge fixup)\n"
152 p2 = hex(self.repo.changelog.tip())
152 p2 = hex(self.repo.changelog.tip())
153
153
154 if self.filemapmode and nparents == 1:
154 if self.filemapmode and nparents == 1:
155 man = self.repo.manifest
155 man = self.repo.manifest
156 mnode = self.repo.changelog.read(bin(p2))[0]
156 mnode = self.repo.changelog.read(bin(p2))[0]
157 if not man.cmp(m1node, man.revision(mnode)):
157 if not man.cmp(m1node, man.revision(mnode)):
158 self.ui.status(_("filtering out empty revision\n"))
158 self.repo.rollback()
159 self.repo.rollback()
159 return parent
160 return parent
160 return p2
161 return p2
161
162
162 def puttags(self, tags):
163 def puttags(self, tags):
163 try:
164 try:
164 parentctx = self.repo[self.tagsbranch]
165 parentctx = self.repo[self.tagsbranch]
165 tagparent = parentctx.node()
166 tagparent = parentctx.node()
166 except error.RepoError:
167 except error.RepoError:
167 parentctx = None
168 parentctx = None
168 tagparent = nullid
169 tagparent = nullid
169
170
170 try:
171 try:
171 oldlines = sorted(parentctx['.hgtags'].data().splitlines(1))
172 oldlines = sorted(parentctx['.hgtags'].data().splitlines(1))
172 except:
173 except:
173 oldlines = []
174 oldlines = []
174
175
175 newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags])
176 newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags])
176 if newlines == oldlines:
177 if newlines == oldlines:
177 return None
178 return None
178 data = "".join(newlines)
179 data = "".join(newlines)
179 def getfilectx(repo, memctx, f):
180 def getfilectx(repo, memctx, f):
180 return context.memfilectx(f, data, False, False, None)
181 return context.memfilectx(f, data, False, False, None)
181
182
182 self.ui.status(_("updating tags\n"))
183 self.ui.status(_("updating tags\n"))
183 date = "%s 0" % int(time.mktime(time.gmtime()))
184 date = "%s 0" % int(time.mktime(time.gmtime()))
184 extra = {'branch': self.tagsbranch}
185 extra = {'branch': self.tagsbranch}
185 ctx = context.memctx(self.repo, (tagparent, None), "update tags",
186 ctx = context.memctx(self.repo, (tagparent, None), "update tags",
186 [".hgtags"], getfilectx, "convert-repo", date,
187 [".hgtags"], getfilectx, "convert-repo", date,
187 extra)
188 extra)
188 self.repo.commitctx(ctx)
189 self.repo.commitctx(ctx)
189 return hex(self.repo.changelog.tip())
190 return hex(self.repo.changelog.tip())
190
191
191 def setfilemapmode(self, active):
192 def setfilemapmode(self, active):
192 self.filemapmode = active
193 self.filemapmode = active
193
194
194 class mercurial_source(converter_source):
195 class mercurial_source(converter_source):
195 def __init__(self, ui, path, rev=None):
196 def __init__(self, ui, path, rev=None):
196 converter_source.__init__(self, ui, path, rev)
197 converter_source.__init__(self, ui, path, rev)
197 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False)
198 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False)
198 self.ignored = set()
199 self.ignored = set()
199 self.saverev = ui.configbool('convert', 'hg.saverev', False)
200 self.saverev = ui.configbool('convert', 'hg.saverev', False)
200 try:
201 try:
201 self.repo = hg.repository(self.ui, path)
202 self.repo = hg.repository(self.ui, path)
202 # try to provoke an exception if this isn't really a hg
203 # try to provoke an exception if this isn't really a hg
203 # repo, but some other bogus compatible-looking url
204 # repo, but some other bogus compatible-looking url
204 if not self.repo.local():
205 if not self.repo.local():
205 raise error.RepoError()
206 raise error.RepoError()
206 except error.RepoError:
207 except error.RepoError:
207 ui.traceback()
208 ui.traceback()
208 raise NoRepo("%s is not a local Mercurial repo" % path)
209 raise NoRepo("%s is not a local Mercurial repo" % path)
209 self.lastrev = None
210 self.lastrev = None
210 self.lastctx = None
211 self.lastctx = None
211 self._changescache = None
212 self._changescache = None
212 self.convertfp = None
213 self.convertfp = None
213 # Restrict converted revisions to startrev descendants
214 # Restrict converted revisions to startrev descendants
214 startnode = ui.config('convert', 'hg.startrev')
215 startnode = ui.config('convert', 'hg.startrev')
215 if startnode is not None:
216 if startnode is not None:
216 try:
217 try:
217 startnode = self.repo.lookup(startnode)
218 startnode = self.repo.lookup(startnode)
218 except error.RepoError:
219 except error.RepoError:
219 raise util.Abort(_('%s is not a valid start revision')
220 raise util.Abort(_('%s is not a valid start revision')
220 % startnode)
221 % startnode)
221 startrev = self.repo.changelog.rev(startnode)
222 startrev = self.repo.changelog.rev(startnode)
222 children = {startnode: 1}
223 children = {startnode: 1}
223 for rev in self.repo.changelog.descendants(startrev):
224 for rev in self.repo.changelog.descendants(startrev):
224 children[self.repo.changelog.node(rev)] = 1
225 children[self.repo.changelog.node(rev)] = 1
225 self.keep = children.__contains__
226 self.keep = children.__contains__
226 else:
227 else:
227 self.keep = util.always
228 self.keep = util.always
228
229
229 def changectx(self, rev):
230 def changectx(self, rev):
230 if self.lastrev != rev:
231 if self.lastrev != rev:
231 self.lastctx = self.repo[rev]
232 self.lastctx = self.repo[rev]
232 self.lastrev = rev
233 self.lastrev = rev
233 return self.lastctx
234 return self.lastctx
234
235
235 def parents(self, ctx):
236 def parents(self, ctx):
236 return [p.node() for p in ctx.parents()
237 return [p.node() for p in ctx.parents()
237 if p and self.keep(p.node())]
238 if p and self.keep(p.node())]
238
239
239 def getheads(self):
240 def getheads(self):
240 if self.rev:
241 if self.rev:
241 heads = [self.repo[self.rev].node()]
242 heads = [self.repo[self.rev].node()]
242 else:
243 else:
243 heads = self.repo.heads()
244 heads = self.repo.heads()
244 return [hex(h) for h in heads if self.keep(h)]
245 return [hex(h) for h in heads if self.keep(h)]
245
246
246 def getfile(self, name, rev):
247 def getfile(self, name, rev):
247 try:
248 try:
248 return self.changectx(rev)[name].data()
249 return self.changectx(rev)[name].data()
249 except error.LookupError, err:
250 except error.LookupError, err:
250 raise IOError(err)
251 raise IOError(err)
251
252
252 def getmode(self, name, rev):
253 def getmode(self, name, rev):
253 return self.changectx(rev).manifest().flags(name)
254 return self.changectx(rev).manifest().flags(name)
254
255
255 def getchanges(self, rev):
256 def getchanges(self, rev):
256 ctx = self.changectx(rev)
257 ctx = self.changectx(rev)
257 parents = self.parents(ctx)
258 parents = self.parents(ctx)
258 if not parents:
259 if not parents:
259 files = sorted(ctx.manifest())
260 files = sorted(ctx.manifest())
260 if self.ignoreerrors:
261 if self.ignoreerrors:
261 # calling getcopies() is a simple way to detect missing
262 # calling getcopies() is a simple way to detect missing
262 # revlogs and populate self.ignored
263 # revlogs and populate self.ignored
263 self.getcopies(ctx, files)
264 self.getcopies(ctx, files)
264 return [(f, rev) for f in files if f not in self.ignored], {}
265 return [(f, rev) for f in files if f not in self.ignored], {}
265 if self._changescache and self._changescache[0] == rev:
266 if self._changescache and self._changescache[0] == rev:
266 m, a, r = self._changescache[1]
267 m, a, r = self._changescache[1]
267 else:
268 else:
268 m, a, r = self.repo.status(parents[0], ctx.node())[:3]
269 m, a, r = self.repo.status(parents[0], ctx.node())[:3]
269 # getcopies() detects missing revlogs early, run it before
270 # getcopies() detects missing revlogs early, run it before
270 # filtering the changes.
271 # filtering the changes.
271 copies = self.getcopies(ctx, m + a)
272 copies = self.getcopies(ctx, m + a)
272 changes = [(name, rev) for name in m + a + r
273 changes = [(name, rev) for name in m + a + r
273 if name not in self.ignored]
274 if name not in self.ignored]
274 return sorted(changes), copies
275 return sorted(changes), copies
275
276
276 def getcopies(self, ctx, files):
277 def getcopies(self, ctx, files):
277 copies = {}
278 copies = {}
278 for name in files:
279 for name in files:
279 if name in self.ignored:
280 if name in self.ignored:
280 continue
281 continue
281 try:
282 try:
282 copysource, copynode = ctx.filectx(name).renamed()
283 copysource, copynode = ctx.filectx(name).renamed()
283 if copysource in self.ignored or not self.keep(copynode):
284 if copysource in self.ignored or not self.keep(copynode):
284 continue
285 continue
285 copies[name] = copysource
286 copies[name] = copysource
286 except TypeError:
287 except TypeError:
287 pass
288 pass
288 except error.LookupError, e:
289 except error.LookupError, e:
289 if not self.ignoreerrors:
290 if not self.ignoreerrors:
290 raise
291 raise
291 self.ignored.add(name)
292 self.ignored.add(name)
292 self.ui.warn(_('ignoring: %s\n') % e)
293 self.ui.warn(_('ignoring: %s\n') % e)
293 return copies
294 return copies
294
295
295 def getcommit(self, rev):
296 def getcommit(self, rev):
296 ctx = self.changectx(rev)
297 ctx = self.changectx(rev)
297 parents = [hex(p) for p in self.parents(ctx)]
298 parents = [hex(p) for p in self.parents(ctx)]
298 if self.saverev:
299 if self.saverev:
299 crev = rev
300 crev = rev
300 else:
301 else:
301 crev = None
302 crev = None
302 return commit(author=ctx.user(), date=util.datestr(ctx.date()),
303 return commit(author=ctx.user(), date=util.datestr(ctx.date()),
303 desc=ctx.description(), rev=crev, parents=parents,
304 desc=ctx.description(), rev=crev, parents=parents,
304 branch=ctx.branch(), extra=ctx.extra())
305 branch=ctx.branch(), extra=ctx.extra())
305
306
306 def gettags(self):
307 def gettags(self):
307 tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
308 tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
308 return dict([(name, hex(node)) for name, node in tags
309 return dict([(name, hex(node)) for name, node in tags
309 if self.keep(node)])
310 if self.keep(node)])
310
311
311 def getchangedfiles(self, rev, i):
312 def getchangedfiles(self, rev, i):
312 ctx = self.changectx(rev)
313 ctx = self.changectx(rev)
313 parents = self.parents(ctx)
314 parents = self.parents(ctx)
314 if not parents and i is None:
315 if not parents and i is None:
315 i = 0
316 i = 0
316 changes = [], ctx.manifest().keys(), []
317 changes = [], ctx.manifest().keys(), []
317 else:
318 else:
318 i = i or 0
319 i = i or 0
319 changes = self.repo.status(parents[i], ctx.node())[:3]
320 changes = self.repo.status(parents[i], ctx.node())[:3]
320 changes = [[f for f in l if f not in self.ignored] for l in changes]
321 changes = [[f for f in l if f not in self.ignored] for l in changes]
321
322
322 if i == 0:
323 if i == 0:
323 self._changescache = (rev, changes)
324 self._changescache = (rev, changes)
324
325
325 return changes[0] + changes[1] + changes[2]
326 return changes[0] + changes[1] + changes[2]
326
327
327 def converted(self, rev, destrev):
328 def converted(self, rev, destrev):
328 if self.convertfp is None:
329 if self.convertfp is None:
329 self.convertfp = open(os.path.join(self.path, '.hg', 'shamap'),
330 self.convertfp = open(os.path.join(self.path, '.hg', 'shamap'),
330 'a')
331 'a')
331 self.convertfp.write('%s %s\n' % (destrev, rev))
332 self.convertfp.write('%s %s\n' % (destrev, rev))
332 self.convertfp.flush()
333 self.convertfp.flush()
333
334
334 def before(self):
335 def before(self):
335 self.ui.debug(_('run hg source pre-conversion action\n'))
336 self.ui.debug(_('run hg source pre-conversion action\n'))
336
337
337 def after(self):
338 def after(self):
338 self.ui.debug(_('run hg source post-conversion action\n'))
339 self.ui.debug(_('run hg source post-conversion action\n'))
@@ -1,236 +1,237 b''
1 % create cvs repository
1 % create cvs repository
2 % create source directory
2 % create source directory
3 % import source directory
3 % import source directory
4 N src/a
4 N src/a
5 N src/b/c
5 N src/b/c
6
6
7 No conflicts created by this import
7 No conflicts created by this import
8
8
9 % checkout source directory
9 % checkout source directory
10 U src/a
10 U src/a
11 U src/b/c
11 U src/b/c
12 % commit a new revision changing b/c
12 % commit a new revision changing b/c
13 checking in src/b/c,v
13 checking in src/b/c,v
14 % convert fresh repo
14 % convert fresh repo
15 initializing destination src-hg repository
15 initializing destination src-hg repository
16 connecting to cvsrepo
16 connecting to cvsrepo
17 scanning source...
17 scanning source...
18 using builtin cvsps
18 using builtin cvsps
19 collecting CVS rlog
19 collecting CVS rlog
20 5 log entries
20 5 log entries
21 creating changesets
21 creating changesets
22 3 changeset entries
22 3 changeset entries
23 sorting...
23 sorting...
24 converting...
24 converting...
25 2 Initial revision
25 2 Initial revision
26 1 import
26 1 import
27 0 ci0
27 0 ci0
28 updating tags
28 updating tags
29 a
29 a
30 c
30 c
31 c
31 c
32 % convert fresh repo with --filemap
32 % convert fresh repo with --filemap
33 initializing destination src-filemap repository
33 initializing destination src-filemap repository
34 connecting to cvsrepo
34 connecting to cvsrepo
35 scanning source...
35 scanning source...
36 using builtin cvsps
36 using builtin cvsps
37 collecting CVS rlog
37 collecting CVS rlog
38 5 log entries
38 5 log entries
39 creating changesets
39 creating changesets
40 3 changeset entries
40 3 changeset entries
41 sorting...
41 sorting...
42 converting...
42 converting...
43 2 Initial revision
43 2 Initial revision
44 1 import
44 1 import
45 filtering out empty revision
45 rolling back last transaction
46 rolling back last transaction
46 0 ci0
47 0 ci0
47 updating tags
48 updating tags
48 c
49 c
49 c
50 c
50 2 update tags files: .hgtags
51 2 update tags files: .hgtags
51 1 ci0 files: b/c
52 1 ci0 files: b/c
52 0 Initial revision files: b/c
53 0 Initial revision files: b/c
53 % commit new file revisions
54 % commit new file revisions
54 checking in src/a,v
55 checking in src/a,v
55 checking in src/b/c,v
56 checking in src/b/c,v
56 % convert again
57 % convert again
57 connecting to cvsrepo
58 connecting to cvsrepo
58 scanning source...
59 scanning source...
59 using builtin cvsps
60 using builtin cvsps
60 collecting CVS rlog
61 collecting CVS rlog
61 7 log entries
62 7 log entries
62 creating changesets
63 creating changesets
63 4 changeset entries
64 4 changeset entries
64 sorting...
65 sorting...
65 converting...
66 converting...
66 0 ci1
67 0 ci1
67 a
68 a
68 a
69 a
69 c
70 c
70 c
71 c
71 c
72 c
72 % convert again with --filemap
73 % convert again with --filemap
73 connecting to cvsrepo
74 connecting to cvsrepo
74 scanning source...
75 scanning source...
75 using builtin cvsps
76 using builtin cvsps
76 collecting CVS rlog
77 collecting CVS rlog
77 7 log entries
78 7 log entries
78 creating changesets
79 creating changesets
79 4 changeset entries
80 4 changeset entries
80 sorting...
81 sorting...
81 converting...
82 converting...
82 0 ci1
83 0 ci1
83 c
84 c
84 c
85 c
85 c
86 c
86 3 ci1 files: b/c
87 3 ci1 files: b/c
87 2 update tags files: .hgtags
88 2 update tags files: .hgtags
88 1 ci0 files: b/c
89 1 ci0 files: b/c
89 0 Initial revision files: b/c
90 0 Initial revision files: b/c
90 % commit branch
91 % commit branch
91 U b/c
92 U b/c
92 T a
93 T a
93 T b/c
94 T b/c
94 checking in src/b/c,v
95 checking in src/b/c,v
95 % convert again
96 % convert again
96 connecting to cvsrepo
97 connecting to cvsrepo
97 scanning source...
98 scanning source...
98 using builtin cvsps
99 using builtin cvsps
99 collecting CVS rlog
100 collecting CVS rlog
100 8 log entries
101 8 log entries
101 creating changesets
102 creating changesets
102 5 changeset entries
103 5 changeset entries
103 sorting...
104 sorting...
104 converting...
105 converting...
105 0 ci2
106 0 ci2
106 a
107 a
107 c
108 c
108 d
109 d
109 % convert again with --filemap
110 % convert again with --filemap
110 connecting to cvsrepo
111 connecting to cvsrepo
111 scanning source...
112 scanning source...
112 using builtin cvsps
113 using builtin cvsps
113 collecting CVS rlog
114 collecting CVS rlog
114 8 log entries
115 8 log entries
115 creating changesets
116 creating changesets
116 5 changeset entries
117 5 changeset entries
117 sorting...
118 sorting...
118 converting...
119 converting...
119 0 ci2
120 0 ci2
120 c
121 c
121 d
122 d
122 4 ci2 files: b/c
123 4 ci2 files: b/c
123 3 ci1 files: b/c
124 3 ci1 files: b/c
124 2 update tags files: .hgtags
125 2 update tags files: .hgtags
125 1 ci0 files: b/c
126 1 ci0 files: b/c
126 0 Initial revision files: b/c
127 0 Initial revision files: b/c
127 % commit a new revision with funny log message
128 % commit a new revision with funny log message
128 checking in src/a,v
129 checking in src/a,v
129 % convert again
130 % convert again
130 connecting to cvsrepo
131 connecting to cvsrepo
131 scanning source...
132 scanning source...
132 using builtin cvsps
133 using builtin cvsps
133 collecting CVS rlog
134 collecting CVS rlog
134 9 log entries
135 9 log entries
135 creating changesets
136 creating changesets
136 6 changeset entries
137 6 changeset entries
137 sorting...
138 sorting...
138 converting...
139 converting...
139 0 funny
140 0 funny
140 o 6 (branch) funny
141 o 6 (branch) funny
141 | ----------------------------
142 | ----------------------------
142 | log message files: a
143 | log message files: a
143 o 5 (branch) ci2 files: b/c
144 o 5 (branch) ci2 files: b/c
144 |
145 |
145 | o 4 () ci1 files: a b/c
146 | o 4 () ci1 files: a b/c
146 | |
147 | |
147 | o 3 () update tags files: .hgtags
148 | o 3 () update tags files: .hgtags
148 | |
149 | |
149 | o 2 () ci0 files: b/c
150 | o 2 () ci0 files: b/c
150 |/
151 |/
151 | o 1 (INITIAL) import files:
152 | o 1 (INITIAL) import files:
152 |/
153 |/
153 o 0 () Initial revision files: a b/c
154 o 0 () Initial revision files: a b/c
154
155
155 % testing debugcvsps
156 % testing debugcvsps
156 collecting CVS rlog
157 collecting CVS rlog
157 9 log entries
158 9 log entries
158 creating changesets
159 creating changesets
159 6 changeset entries
160 6 changeset entries
160 ---------------------
161 ---------------------
161 PatchSet 1
162 PatchSet 1
162 Date:
163 Date:
163 Author:
164 Author:
164 Branch: HEAD
165 Branch: HEAD
165 Tag: (none)
166 Tag: (none)
166 Log:
167 Log:
167 Initial revision
168 Initial revision
168
169
169 Members:
170 Members:
170 a:INITIAL->1.1
171 a:INITIAL->1.1
171 b/c:INITIAL->1.1
172 b/c:INITIAL->1.1
172
173
173 ---------------------
174 ---------------------
174 PatchSet 2
175 PatchSet 2
175 Date:
176 Date:
176 Author:
177 Author:
177 Branch: INITIAL
178 Branch: INITIAL
178 Tag: start
179 Tag: start
179 Log:
180 Log:
180 import
181 import
181
182
182 Members:
183 Members:
183 a:1.1->1.1.1.1
184 a:1.1->1.1.1.1
184 b/c:1.1->1.1.1.1
185 b/c:1.1->1.1.1.1
185
186
186 ---------------------
187 ---------------------
187 PatchSet 3
188 PatchSet 3
188 Date:
189 Date:
189 Author:
190 Author:
190 Branch: HEAD
191 Branch: HEAD
191 Tag: (none)
192 Tag: (none)
192 Log:
193 Log:
193 ci0
194 ci0
194
195
195 Members:
196 Members:
196 b/c:1.1->1.2
197 b/c:1.1->1.2
197
198
198 ---------------------
199 ---------------------
199 PatchSet 4
200 PatchSet 4
200 Date:
201 Date:
201 Author:
202 Author:
202 Branch: HEAD
203 Branch: HEAD
203 Tag: (none)
204 Tag: (none)
204 Log:
205 Log:
205 ci1
206 ci1
206
207
207 Members:
208 Members:
208 a:1.1->1.2
209 a:1.1->1.2
209 b/c:1.2->1.3
210 b/c:1.2->1.3
210
211
211 ---------------------
212 ---------------------
212 PatchSet 5
213 PatchSet 5
213 Date:
214 Date:
214 Author:
215 Author:
215 Branch: branch
216 Branch: branch
216 Tag: (none)
217 Tag: (none)
217 Log:
218 Log:
218 ci2
219 ci2
219
220
220 Members:
221 Members:
221 b/c:1.1->1.1.2.1
222 b/c:1.1->1.1.2.1
222
223
223 ---------------------
224 ---------------------
224 PatchSet 6
225 PatchSet 6
225 Date:
226 Date:
226 Author:
227 Author:
227 Branch: branch
228 Branch: branch
228 Tag: (none)
229 Tag: (none)
229 Log:
230 Log:
230 funny
231 funny
231 ----------------------------
232 ----------------------------
232 log message
233 log message
233
234
234 Members:
235 Members:
235 a:1.2->1.2.2.1
236 a:1.2->1.2.2.1
236
237
@@ -1,114 +1,115 b''
1 % create cvs repository
1 % create cvs repository
2 % create source directory
2 % create source directory
3 % import source directory
3 % import source directory
4 N src/a
4 N src/a
5 N src/b/c
5 N src/b/c
6
6
7 No conflicts created by this import
7 No conflicts created by this import
8
8
9 % checkout source directory
9 % checkout source directory
10 U src/a
10 U src/a
11 U src/b/c
11 U src/b/c
12 % commit a new revision changing b/c
12 % commit a new revision changing b/c
13 checking in src/b/c,v
13 checking in src/b/c,v
14 % convert fresh repo
14 % convert fresh repo
15 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
15 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
16 initializing destination src-hg repository
16 initializing destination src-hg repository
17 connecting to cvsrepo
17 connecting to cvsrepo
18 scanning source...
18 scanning source...
19 sorting...
19 sorting...
20 converting...
20 converting...
21 2 Initial revision
21 2 Initial revision
22 1 import
22 1 import
23 0 ci0
23 0 ci0
24 updating tags
24 updating tags
25 a
25 a
26 c
26 c
27 c
27 c
28 % convert fresh repo with --filemap
28 % convert fresh repo with --filemap
29 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
29 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
30 initializing destination src-filemap repository
30 initializing destination src-filemap repository
31 connecting to cvsrepo
31 connecting to cvsrepo
32 scanning source...
32 scanning source...
33 sorting...
33 sorting...
34 converting...
34 converting...
35 2 Initial revision
35 2 Initial revision
36 1 import
36 1 import
37 filtering out empty revision
37 rolling back last transaction
38 rolling back last transaction
38 0 ci0
39 0 ci0
39 updating tags
40 updating tags
40 c
41 c
41 c
42 c
42 2 update tags files: .hgtags
43 2 update tags files: .hgtags
43 1 ci0 files: b/c
44 1 ci0 files: b/c
44 0 Initial revision files: b/c
45 0 Initial revision files: b/c
45 % commit new file revisions
46 % commit new file revisions
46 checking in src/a,v
47 checking in src/a,v
47 checking in src/b/c,v
48 checking in src/b/c,v
48 % convert again
49 % convert again
49 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
50 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
50 connecting to cvsrepo
51 connecting to cvsrepo
51 scanning source...
52 scanning source...
52 sorting...
53 sorting...
53 converting...
54 converting...
54 0 ci1
55 0 ci1
55 a
56 a
56 a
57 a
57 c
58 c
58 c
59 c
59 c
60 c
60 % convert again with --filemap
61 % convert again with --filemap
61 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
62 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
62 connecting to cvsrepo
63 connecting to cvsrepo
63 scanning source...
64 scanning source...
64 sorting...
65 sorting...
65 converting...
66 converting...
66 0 ci1
67 0 ci1
67 c
68 c
68 c
69 c
69 c
70 c
70 3 ci1 files: b/c
71 3 ci1 files: b/c
71 2 update tags files: .hgtags
72 2 update tags files: .hgtags
72 1 ci0 files: b/c
73 1 ci0 files: b/c
73 0 Initial revision files: b/c
74 0 Initial revision files: b/c
74 % commit branch
75 % commit branch
75 U b/c
76 U b/c
76 T a
77 T a
77 T b/c
78 T b/c
78 checking in src/b/c,v
79 checking in src/b/c,v
79 % convert again
80 % convert again
80 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
81 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
81 connecting to cvsrepo
82 connecting to cvsrepo
82 scanning source...
83 scanning source...
83 sorting...
84 sorting...
84 converting...
85 converting...
85 0 ci2
86 0 ci2
86 a
87 a
87 c
88 c
88 d
89 d
89 % convert again with --filemap
90 % convert again with --filemap
90 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
91 warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4
91 connecting to cvsrepo
92 connecting to cvsrepo
92 scanning source...
93 scanning source...
93 sorting...
94 sorting...
94 converting...
95 converting...
95 0 ci2
96 0 ci2
96 c
97 c
97 d
98 d
98 4 ci2 files: b/c
99 4 ci2 files: b/c
99 3 ci1 files: b/c
100 3 ci1 files: b/c
100 2 update tags files: .hgtags
101 2 update tags files: .hgtags
101 1 ci0 files: b/c
102 1 ci0 files: b/c
102 0 Initial revision files: b/c
103 0 Initial revision files: b/c
103 o 5 (branch) ci2 files: b/c
104 o 5 (branch) ci2 files: b/c
104 |
105 |
105 | o 4 () ci1 files: a b/c
106 | o 4 () ci1 files: a b/c
106 | |
107 | |
107 | o 3 () update tags files: .hgtags
108 | o 3 () update tags files: .hgtags
108 | |
109 | |
109 | o 2 () ci0 files: b/c
110 | o 2 () ci0 files: b/c
110 |/
111 |/
111 | o 1 (INITIAL) import files:
112 | o 1 (INITIAL) import files:
112 |/
113 |/
113 o 0 () Initial revision files: a b/c
114 o 0 () Initial revision files: a b/c
114
115
General Comments 0
You need to be logged in to leave comments. Login now