##// END OF EJS Templates
convert: better support for CVS branchpoints (issue1447)...
Henrik Stuart -
r8756:6019e651 default
parent child Browse files
Show More
@@ -36,6 +36,7 b' class logentry(object):'
36 .synthetic - is this a synthetic "file ... added on ..." revision?
36 .synthetic - is this a synthetic "file ... added on ..." revision?
37 .mergepoint- the branch that has been merged from
37 .mergepoint- the branch that has been merged from
38 (if present in rlog output)
38 (if present in rlog output)
39 .branchpoints- the branches that start at the current entry
39 '''
40 '''
40 def __init__(self, **entries):
41 def __init__(self, **entries):
41 self.__dict__.update(entries)
42 self.__dict__.update(entries)
@@ -400,6 +401,19 b' def createlog(ui, directory=None, root="'
400 else:
401 else:
401 e.branch = None
402 e.branch = None
402
403
404 # find the branches starting from this revision
405 branchpoints = set()
406 for branch, revision in branchmap.iteritems():
407 revparts = tuple([int(i) for i in revision.split('.')])
408 if revparts[-2] == 0 and revparts[-1] % 2 == 0:
409 # normal branch
410 if revparts[:-2] == e.revision:
411 branchpoints.add(branch)
412 elif revparts == (1,1,1): # vendor branch
413 if revparts in e.branches:
414 branchpoints.add(branch)
415 e.branchpoints = branchpoints
416
403 log.append(e)
417 log.append(e)
404
418
405 if len(log) % 100 == 0:
419 if len(log) % 100 == 0:
@@ -453,6 +467,7 b' class changeset(object):'
453 .synthetic - from synthetic revision "file ... added on branch ..."
467 .synthetic - from synthetic revision "file ... added on branch ..."
454 .mergepoint- the branch that has been merged from
468 .mergepoint- the branch that has been merged from
455 (if present in rlog output)
469 (if present in rlog output)
470 .branchpoints- the branches that start at the current entry
456 '''
471 '''
457 def __init__(self, **entries):
472 def __init__(self, **entries):
458 self.__dict__.update(entries)
473 self.__dict__.update(entries)
@@ -477,17 +492,34 b' def createchangeset(ui, log, fuzz=60, me'
477 for i, e in enumerate(log):
492 for i, e in enumerate(log):
478
493
479 # Check if log entry belongs to the current changeset or not.
494 # Check if log entry belongs to the current changeset or not.
495
496 # Since CVS is file centric, two different file revisions with
497 # different branchpoints should be treated as belonging to two
498 # different changesets (and the ordering is important and not
499 # honoured by cvsps at this point).
500 #
501 # Consider the following case:
502 # foo 1.1 branchpoints: [MYBRANCH]
503 # bar 1.1 branchpoints: [MYBRANCH, MYBRANCH2]
504 #
505 # Here foo is part only of MYBRANCH, but not MYBRANCH2, e.g. a
506 # later version of foo may be in MYBRANCH2, so foo should be the
507 # first changeset and bar the next and MYBRANCH and MYBRANCH2
508 # should both start off of the bar changeset. No provisions are
509 # made to ensure that this is, in fact, what happens.
480 if not (c and
510 if not (c and
481 e.comment == c.comment and
511 e.comment == c.comment and
482 e.author == c.author and
512 e.author == c.author and
483 e.branch == c.branch and
513 e.branch == c.branch and
514 e.branchpoints == c.branchpoints and
484 ((c.date[0] + c.date[1]) <=
515 ((c.date[0] + c.date[1]) <=
485 (e.date[0] + e.date[1]) <=
516 (e.date[0] + e.date[1]) <=
486 (c.date[0] + c.date[1]) + fuzz) and
517 (c.date[0] + c.date[1]) + fuzz) and
487 e.file not in files):
518 e.file not in files):
488 c = changeset(comment=e.comment, author=e.author,
519 c = changeset(comment=e.comment, author=e.author,
489 branch=e.branch, date=e.date, entries=[],
520 branch=e.branch, date=e.date, entries=[],
490 mergepoint=getattr(e, 'mergepoint', None))
521 mergepoint=getattr(e, 'mergepoint', None),
522 branchpoints=getattr(e, 'branchpoints', set()))
491 changesets.append(c)
523 changesets.append(c)
492 files = set()
524 files = set()
493 if len(changesets) % 100 == 0:
525 if len(changesets) % 100 == 0:
@@ -613,8 +645,17 b' def createchangeset(ui, log, fuzz=60, me'
613 if c.branch in branches:
645 if c.branch in branches:
614 p = branches[c.branch]
646 p = branches[c.branch]
615 else:
647 else:
616 for f in c.entries:
648 # first changeset on a new branch
617 p = max(p, versions.get((f.rcs, f.parent), None))
649 # the parent is a changeset with the branch in its
650 # branchpoints such that it is the latest possible
651 # commit without any intervening, unrelated commits.
652
653 for candidate in xrange(i):
654 if c.branch not in changesets[candidate].branchpoints:
655 if p is not None:
656 break
657 continue
658 p = candidate
618
659
619 c.parents = []
660 c.parents = []
620 if p is not None:
661 if p is not None:
@@ -753,6 +794,9 b' def debugcvsps(ui, *args, **opts):'
753 ui.write('Branch: %s\n' % (cs.branch or 'HEAD'))
794 ui.write('Branch: %s\n' % (cs.branch or 'HEAD'))
754 ui.write('Tag%s: %s \n' % (['', 's'][len(cs.tags)>1],
795 ui.write('Tag%s: %s \n' % (['', 's'][len(cs.tags)>1],
755 ','.join(cs.tags) or '(none)'))
796 ','.join(cs.tags) or '(none)'))
797 branchpoints = getattr(cs, 'branchpoints', None)
798 if branchpoints:
799 ui.write('Branchpoints: %s \n' % ', '.join(branchpoints))
756 if opts["parents"] and cs.parents:
800 if opts["parents"] and cs.parents:
757 if len(cs.parents)>1:
801 if len(cs.parents)>1:
758 ui.write('Parents: %s\n' % (','.join([str(p.id) for p in cs.parents])))
802 ui.write('Parents: %s\n' % (','.join([str(p.id) for p in cs.parents])))
@@ -1,6 +1,7 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 # This is http://www.selenic.com/mercurial/bts/issue1148
3 # This is http://www.selenic.com/mercurial/bts/issue1148
4 # and http://www.selenic.com/mercurial/bts/issue1447
4
5
5 "$TESTDIR/hghave" cvs || exit 80
6 "$TESTDIR/hghave" cvs || exit 80
6
7
@@ -62,3 +63,50 b" hg convert src | sed -e 's/connecting to"
62 echo % Check the result
63 echo % Check the result
63
64
64 hg -R src-hg glog --template '{rev} ({branches}) {desc} files: {files}\n'
65 hg -R src-hg glog --template '{rev} ({branches}) {desc} files: {files}\n'
66
67 echo ""
68
69 echo % issue 1447
70 cvscall()
71 {
72 echo cvs -f "$@"
73 cvs -f "$@"
74 sleep 1
75 }
76
77 cvsci()
78 {
79 echo cvs -f ci "$@"
80 cvs -f ci "$@" >/dev/null 2>&1
81 sleep 1
82 }
83
84 cvscall -Q -d `pwd`/cvsmaster2 init >/dev/null 2>&1
85 cd cvsmaster2
86 export CVSROOT=`pwd`
87 mkdir foo
88 cd ..
89 cvscall -Q co -d cvswork2 foo
90
91 cd cvswork2
92 echo foo > a.txt
93 echo bar > b.txt
94 cvscall -Q add a.txt b.txt
95 cvsci -m "Initial commit"
96
97 echo foo > b.txt
98 cvsci -m "Fix b on HEAD"
99
100 echo bar > a.txt
101 cvsci -m "Small fix in a on HEAD"
102
103 cvscall -Q tag -b BRANCH
104 cvscall -Q up -P -rBRANCH
105
106 echo baz > b.txt
107 cvsci -m "Change on BRANCH in b"
108
109 hg debugcvsps -x --parents foo | sed -e 's/Author:.*/Author:/' -e 's/Date:.*/Date:/'
110
111 cd ..
112
@@ -51,3 +51,71 b' o 5 () update tags files: .hgtags'
51 |/
51 |/
52 o 0 () Initial revision files: a b
52 o 0 () Initial revision files: a b
53
53
54
55 % issue 1447
56 cvs -f -Q co -d cvswork2 foo
57 cvs -f -Q add a.txt b.txt
58 cvs -f ci -m Initial commit
59 cvs -f ci -m Fix b on HEAD
60 cvs -f ci -m Small fix in a on HEAD
61 cvs -f -Q tag -b BRANCH
62 cvs -f -Q up -P -rBRANCH
63 cvs -f ci -m Change on BRANCH in b
64 collecting CVS rlog
65 5 log entries
66 creating changesets
67 4 changeset entries
68 ---------------------
69 PatchSet 1
70 Date:
71 Author:
72 Branch: HEAD
73 Tag: (none)
74 Log:
75 Initial commit
76
77 Members:
78 a.txt:INITIAL->1.1
79 b.txt:INITIAL->1.1
80
81 ---------------------
82 PatchSet 2
83 Date:
84 Author:
85 Branch: HEAD
86 Tag: (none)
87 Branchpoints: BRANCH
88 Parent: 1
89 Log:
90 Fix b on HEAD
91
92 Members:
93 b.txt:1.1->1.2
94
95 ---------------------
96 PatchSet 3
97 Date:
98 Author:
99 Branch: HEAD
100 Tag: (none)
101 Branchpoints: BRANCH
102 Parent: 2
103 Log:
104 Small fix in a on HEAD
105
106 Members:
107 a.txt:1.1->1.2
108
109 ---------------------
110 PatchSet 4
111 Date:
112 Author:
113 Branch: BRANCH
114 Tag: (none)
115 Parent: 3
116 Log:
117 Change on BRANCH in b
118
119 Members:
120 b.txt:1.2->1.2.2.1
121
@@ -94,7 +94,6 b' cd ..'
94
94
95 echo % convert again
95 echo % convert again
96 hg convert src src-hg | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
96 hg convert src src-hg | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
97 hgcat a
98 hgcat b/c
97 hgcat b/c
99
98
100 echo % convert again with --filemap
99 echo % convert again with --filemap
@@ -104,7 +104,6 b' 5 changeset entries'
104 sorting...
104 sorting...
105 converting...
105 converting...
106 0 ci2
106 0 ci2
107 a
108 c
107 c
109 d
108 d
110 % convert again with --filemap
109 % convert again with --filemap
@@ -142,13 +141,13 b' o 6 (branch) funny'
142 | ----------------------------
141 | ----------------------------
143 | log message files: a
142 | log message files: a
144 o 5 (branch) ci2 files: b/c
143 o 5 (branch) ci2 files: b/c
144
145 o 4 () ci1 files: a b/c
145 |
146 |
146 | o 4 () ci1 files: a b/c
147 o 3 () update tags files: .hgtags
147 | |
148 |
148 | o 3 () update tags files: .hgtags
149 o 2 () ci0 files: b/c
149 | |
150 |
150 | o 2 () ci0 files: b/c
151 |/
152 | o 1 (INITIAL) import files:
151 | o 1 (INITIAL) import files:
153 |/
152 |/
154 o 0 () Initial revision files: a b/c
153 o 0 () Initial revision files: a b/c
@@ -157,22 +156,35 b' o 0 () Initial revision files: a b/c'
157 collecting CVS rlog
156 collecting CVS rlog
158 9 log entries
157 9 log entries
159 creating changesets
158 creating changesets
160 6 changeset entries
159 8 changeset entries
161 ---------------------
160 ---------------------
162 PatchSet 1
161 PatchSet 1
163 Date:
162 Date:
164 Author:
163 Author:
165 Branch: HEAD
164 Branch: HEAD
166 Tag: (none)
165 Tag: (none)
166 Branchpoints: INITIAL
167 Log:
167 Log:
168 Initial revision
168 Initial revision
169
169
170 Members:
170 Members:
171 a:INITIAL->1.1
171 a:INITIAL->1.1
172
173 ---------------------
174 PatchSet 2
175 Date:
176 Author:
177 Branch: HEAD
178 Tag: (none)
179 Branchpoints: INITIAL, branch
180 Log:
181 Initial revision
182
183 Members:
172 b/c:INITIAL->1.1
184 b/c:INITIAL->1.1
173
185
174 ---------------------
186 ---------------------
175 PatchSet 2
187 PatchSet 3
176 Date:
188 Date:
177 Author:
189 Author:
178 Branch: INITIAL
190 Branch: INITIAL
@@ -185,7 +197,7 b' Members:'
185 b/c:1.1->1.1.1.1
197 b/c:1.1->1.1.1.1
186
198
187 ---------------------
199 ---------------------
188 PatchSet 3
200 PatchSet 4
189 Date:
201 Date:
190 Author:
202 Author:
191 Branch: HEAD
203 Branch: HEAD
@@ -197,7 +209,20 b' Members:'
197 b/c:1.1->1.2
209 b/c:1.1->1.2
198
210
199 ---------------------
211 ---------------------
200 PatchSet 4
212 PatchSet 5
213 Date:
214 Author:
215 Branch: HEAD
216 Tag: (none)
217 Branchpoints: branch
218 Log:
219 ci1
220
221 Members:
222 a:1.1->1.2
223
224 ---------------------
225 PatchSet 6
201 Date:
226 Date:
202 Author:
227 Author:
203 Branch: HEAD
228 Branch: HEAD
@@ -206,11 +231,10 b' Log:'
206 ci1
231 ci1
207
232
208 Members:
233 Members:
209 a:1.1->1.2
210 b/c:1.2->1.3
234 b/c:1.2->1.3
211
235
212 ---------------------
236 ---------------------
213 PatchSet 5
237 PatchSet 7
214 Date:
238 Date:
215 Author:
239 Author:
216 Branch: branch
240 Branch: branch
@@ -222,7 +246,7 b' Members:'
222 b/c:1.1->1.1.2.1
246 b/c:1.1->1.1.2.1
223
247
224 ---------------------
248 ---------------------
225 PatchSet 6
249 PatchSet 8
226 Date:
250 Date:
227 Author:
251 Author:
228 Branch: branch
252 Branch: branch
General Comments 0
You need to be logged in to leave comments. Login now