Show More
@@ -0,0 +1,78 b'' | |||
|
1 | #!/bin/bash | |
|
2 | ||
|
3 | "$TESTDIR/hghave" cvs || exit 80 | |
|
4 | ||
|
5 | cvscall() | |
|
6 | { | |
|
7 | cvs -f "$@" | |
|
8 | } | |
|
9 | ||
|
10 | hgcat() | |
|
11 | { | |
|
12 | hg --cwd src-hg cat -r tip "$1" | |
|
13 | } | |
|
14 | ||
|
15 | echo "[extensions]" >> $HGRCPATH | |
|
16 | echo "convert = " >> $HGRCPATH | |
|
17 | echo "graphlog = " >> $HGRCPATH | |
|
18 | echo "[convert]" >> $HGRCPATH | |
|
19 | echo "cvsps=builtin" >> $HGRCPATH | |
|
20 | ||
|
21 | echo % create cvs repository | |
|
22 | mkdir cvsmaster | |
|
23 | cd cvsmaster | |
|
24 | export CVSROOT=`pwd` | |
|
25 | export CVS_OPTIONS=-f | |
|
26 | cd .. | |
|
27 | ||
|
28 | cvscall -q -d "$CVSROOT" init | |
|
29 | ||
|
30 | cvscall -q checkout -d cvsworktmp . | |
|
31 | cd cvsworktmp | |
|
32 | mkdir foo | |
|
33 | cvscall -q add foo | sed -e 's/Directory .* added to the repository//g' | |
|
34 | cd foo | |
|
35 | echo foo > foo.txt | |
|
36 | cvscall -q add foo.txt | |
|
37 | cvscall -q ci -m "foo.txt" | sed 's/.*,v.*/checking in/g' | |
|
38 | ||
|
39 | cd ../.. | |
|
40 | rm -rf cvsworktmp | |
|
41 | ||
|
42 | cvscall -q checkout -d cvswork foo | |
|
43 | ||
|
44 | cd cvswork | |
|
45 | ||
|
46 | cvscall -q rtag -b -R MYBRANCH1 foo | |
|
47 | cvscall -q up -P -r MYBRANCH1 | |
|
48 | echo bar > foo.txt | |
|
49 | cvscall -q ci -m "bar" | sed 's/.*,v.*/checking in/g' | |
|
50 | echo baz > foo.txt | |
|
51 | cvscall -q ci -m "baz" | sed 's/.*,v.*/checking in/g' | |
|
52 | ||
|
53 | cvscall -q rtag -b -R -r MYBRANCH1 MYBRANCH1_2 foo | |
|
54 | cvscall -q up -P -r MYBRANCH1_2 | |
|
55 | ||
|
56 | echo bazzie > foo.txt | |
|
57 | cvscall -q ci -m "bazzie" | sed 's/.*,v.*/checking in/g' | |
|
58 | ||
|
59 | cvscall -q rtag -b -R MYBRANCH1_1 foo | |
|
60 | cvscall -q up -P -r MYBRANCH1_1 | |
|
61 | ||
|
62 | echo quux > foo.txt | |
|
63 | cvscall -q ci -m "quux" | sed 's/.*,v.*/checking in/g' | |
|
64 | cvscall -q up -P -jMYBRANCH1 | sed 's/RCS file: .*,v/merging MYBRANCH1/g' | |
|
65 | echo xyzzy > foo.txt | |
|
66 | cvscall -q ci -m "merge" | sed 's/.*,v.*/checking in/g' | |
|
67 | ||
|
68 | cvscall -q up -P -A | |
|
69 | ||
|
70 | cvscall -q up -P -jMYBRANCH1_2 | sed 's/RCS file: .*,v/merging MYBRANCH1_2/g' | |
|
71 | cvscall -q ci -m "merge" | sed 's/.*,v.*/checking in/g' | |
|
72 | ||
|
73 | REALCVS=`which cvs` | |
|
74 | echo "for x in \$*; do if [ \"\$x\" = \"rlog\" ]; then echo \"RCS file: $CVSROOT/foo/foo.txt,v\"; cat $TESTDIR/test-convert-cvs-builtincvsps-cvsnt-mergepoints.rlog; exit 0; fi; done; $REALCVS \$*" > cvs | |
|
75 | chmod +x cvs | |
|
76 | PATH=.:${PATH} hg debugcvsps --parents foo | sed -e 's/Author:.*/Author:/' -e 's/Date:.*/Date:/' | |
|
77 | ||
|
78 | cd .. |
@@ -0,0 +1,138 b'' | |||
|
1 | % create cvs repository | |
|
2 | U cvsworktmp/CVSROOT/checkoutlist | |
|
3 | U cvsworktmp/CVSROOT/commitinfo | |
|
4 | U cvsworktmp/CVSROOT/config | |
|
5 | U cvsworktmp/CVSROOT/cvswrappers | |
|
6 | U cvsworktmp/CVSROOT/loginfo | |
|
7 | U cvsworktmp/CVSROOT/modules | |
|
8 | U cvsworktmp/CVSROOT/notify | |
|
9 | U cvsworktmp/CVSROOT/postadmin | |
|
10 | U cvsworktmp/CVSROOT/postproxy | |
|
11 | U cvsworktmp/CVSROOT/posttag | |
|
12 | U cvsworktmp/CVSROOT/postwatch | |
|
13 | U cvsworktmp/CVSROOT/preproxy | |
|
14 | U cvsworktmp/CVSROOT/rcsinfo | |
|
15 | U cvsworktmp/CVSROOT/taginfo | |
|
16 | U cvsworktmp/CVSROOT/verifymsg | |
|
17 | ||
|
18 | cvs add: use `cvs commit' to add this file permanently | |
|
19 | checking in | |
|
20 | initial revision: 1.1 | |
|
21 | U cvswork/foo.txt | |
|
22 | checking in | |
|
23 | new revision: 1.1.2.1; previous revision: 1.1 | |
|
24 | checking in | |
|
25 | new revision: 1.1.2.2; previous revision: 1.1.2.1 | |
|
26 | checking in | |
|
27 | new revision: 1.1.2.2.2.1; previous revision: 1.1.2.2 | |
|
28 | U foo.txt | |
|
29 | checking in | |
|
30 | new revision: 1.1.4.1; previous revision: 1.1 | |
|
31 | rcsmerge: warning: conflicts during merge | |
|
32 | merging MYBRANCH1 | |
|
33 | retrieving revision 1.1 | |
|
34 | retrieving revision 1.1.2.2 | |
|
35 | Merging differences between 1.1 and 1.1.2.2 into foo.txt | |
|
36 | checking in | |
|
37 | new revision: 1.1.4.2; previous revision: 1.1.4.1 | |
|
38 | U foo.txt | |
|
39 | merging MYBRANCH1_2 | |
|
40 | retrieving revision 1.1 | |
|
41 | retrieving revision 1.1.2.2.2.1 | |
|
42 | Merging differences between 1.1 and 1.1.2.2.2.1 into foo.txt | |
|
43 | checking in | |
|
44 | new revision: 1.2; previous revision: 1.1 | |
|
45 | collecting CVS rlog | |
|
46 | 7 log entries | |
|
47 | creating changesets | |
|
48 | 7 changeset entries | |
|
49 | --------------------- | |
|
50 | PatchSet 1 | |
|
51 | Date: | |
|
52 | Author: | |
|
53 | Branch: HEAD | |
|
54 | Tag: (none) | |
|
55 | Log: | |
|
56 | foo.txt | |
|
57 | ||
|
58 | Members: | |
|
59 | foo.txt:INITIAL->1.1 | |
|
60 | ||
|
61 | --------------------- | |
|
62 | PatchSet 2 | |
|
63 | Date: | |
|
64 | Author: | |
|
65 | Branch: MYBRANCH1 | |
|
66 | Tag: (none) | |
|
67 | Parent: 1 | |
|
68 | Log: | |
|
69 | bar | |
|
70 | ||
|
71 | Members: | |
|
72 | foo.txt:1.1->1.1.2.1 | |
|
73 | ||
|
74 | --------------------- | |
|
75 | PatchSet 3 | |
|
76 | Date: | |
|
77 | Author: | |
|
78 | Branch: MYBRANCH1 | |
|
79 | Tag: (none) | |
|
80 | Parent: 2 | |
|
81 | Log: | |
|
82 | baz | |
|
83 | ||
|
84 | Members: | |
|
85 | foo.txt:1.1.2.1->1.1.2.2 | |
|
86 | ||
|
87 | --------------------- | |
|
88 | PatchSet 4 | |
|
89 | Date: | |
|
90 | Author: | |
|
91 | Branch: MYBRANCH1_1 | |
|
92 | Tag: (none) | |
|
93 | Parent: 1 | |
|
94 | Log: | |
|
95 | quux | |
|
96 | ||
|
97 | Members: | |
|
98 | foo.txt:1.1->1.1.4.1 | |
|
99 | ||
|
100 | --------------------- | |
|
101 | PatchSet 5 | |
|
102 | Date: | |
|
103 | Author: | |
|
104 | Branch: MYBRANCH1_2 | |
|
105 | Tag: (none) | |
|
106 | Parent: 3 | |
|
107 | Log: | |
|
108 | bazzie | |
|
109 | ||
|
110 | Members: | |
|
111 | foo.txt:1.1.2.2->1.1.2.2.2.1 | |
|
112 | ||
|
113 | --------------------- | |
|
114 | PatchSet 6 | |
|
115 | Date: | |
|
116 | Author: | |
|
117 | Branch: HEAD | |
|
118 | Tag: (none) | |
|
119 | Parents: 1,5 | |
|
120 | Log: | |
|
121 | merge | |
|
122 | ||
|
123 | Members: | |
|
124 | foo.txt:1.1->1.2 | |
|
125 | ||
|
126 | --------------------- | |
|
127 | PatchSet 7 | |
|
128 | Date: | |
|
129 | Author: | |
|
130 | Branch: MYBRANCH1_1 | |
|
131 | Tag: (none) | |
|
132 | Parents: 4,3 | |
|
133 | Log: | |
|
134 | merge | |
|
135 | ||
|
136 | Members: | |
|
137 | foo.txt:1.1.4.1->1.1.4.2 | |
|
138 |
@@ -0,0 +1,42 b'' | |||
|
1 | head: 1.2 | |
|
2 | branch: | |
|
3 | locks: strict | |
|
4 | access list: | |
|
5 | symbolic names: | |
|
6 | MYBRANCH1_2: 1.1.2.2.0.2 | |
|
7 | MYBRANCH1_1: 1.1.0.4 | |
|
8 | MYBRANCH1: 1.1.0.2 | |
|
9 | keyword substitution: kv | |
|
10 | total revisions: 8; selected revisions: 8 | |
|
11 | description: | |
|
12 | ---------------------------- | |
|
13 | revision 1.2 | |
|
14 | date: 2009/04/02 07:00:32; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 14d449d462903487; mergepoint: 1.1.2.2.2.1; filename: foo.txt; | |
|
15 | merge | |
|
16 | ---------------------------- | |
|
17 | revision 1.1 | |
|
18 | date: 2009/04/02 06:50:43; author: user; state: Exp; kopt: kv; commitid: 17ac49d460432d04; filename: foo.txt; | |
|
19 | branches: 1.1.2; 1.1.4; | |
|
20 | foo.txt | |
|
21 | ---------------------------- | |
|
22 | revision 1.1.4.2 | |
|
23 | date: 2009/04/02 07:02:51; author: user; state: Exp; lines: +1 -0; kopt: kv; commitid: 170049d4631b364d; mergepoint: 1.1.2.2; filename: foo.txt; | |
|
24 | merge | |
|
25 | ---------------------------- | |
|
26 | revision 1.1.4.1 | |
|
27 | date: 2009/04/02 06:53:42; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: dc849d460f52f49; filename: foo.txt; | |
|
28 | quux | |
|
29 | ---------------------------- | |
|
30 | revision 1.1.2.2 | |
|
31 | date: 2009/04/02 06:53:20; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 8ec49d460e02f04; filename: foo.txt; | |
|
32 | branches: 1.1.2.2.2; | |
|
33 | baz | |
|
34 | ---------------------------- | |
|
35 | revision 1.1.2.1 | |
|
36 | date: 2009/04/02 06:52:38; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: d5049d460b62e7b; filename: foo.txt; | |
|
37 | bar | |
|
38 | ---------------------------- | |
|
39 | revision 1.1.2.2.2.1 | |
|
40 | date: 2009/04/02 06:55:42; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 11c849d4616d30d1; filename: foo.txt; | |
|
41 | bazzie | |
|
42 | ============================================================================= |
@@ -34,6 +34,7 b' class logentry(object):' | |||
|
34 | 34 | .revision - revision number as tuple |
|
35 | 35 | .tags - list of tags on the file |
|
36 | 36 | .synthetic - is this a synthetic "file ... added on ..." revision? |
|
37 | .mergepoint- the branch that has been merged from (if present in rlog output) | |
|
37 | 38 | ''' |
|
38 | 39 | def __init__(self, **entries): |
|
39 | 40 | self.__dict__.update(entries) |
@@ -105,7 +106,7 b' def createlog(ui, directory=None, root="' | |||
|
105 | 106 | re_31 = re.compile('----------------------------$') |
|
106 | 107 | re_32 = re.compile('=============================================================================$') |
|
107 | 108 | re_50 = re.compile('revision ([\\d.]+)(\s+locked by:\s+.+;)?$') |
|
108 | re_60 = re.compile(r'date:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?') | |
|
109 | re_60 = re.compile(r'date:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?(.*mergepoint:\s+([^;]+);)?') | |
|
109 | 110 | re_70 = re.compile('branches: (.+);$') |
|
110 | 111 | |
|
111 | 112 | file_added_re = re.compile(r'file [^/]+ was (initially )?added on branch') |
@@ -187,6 +188,7 b' def createlog(ui, directory=None, root="' | |||
|
187 | 188 | |
|
188 | 189 | # state machine begins here |
|
189 | 190 | tags = {} # dictionary of revisions on current file with their tags |
|
191 | branchmap = {} # mapping between branch names and revision numbers | |
|
190 | 192 | state = 0 |
|
191 | 193 | store = False # set when a new record can be appended |
|
192 | 194 | |
@@ -244,6 +246,7 b' def createlog(ui, directory=None, root="' | |||
|
244 | 246 | elif state == 2: |
|
245 | 247 | # expect 'symbolic names' |
|
246 | 248 | if re_20.match(line): |
|
249 | branchmap = {} | |
|
247 | 250 | state = 3 |
|
248 | 251 | |
|
249 | 252 | elif state == 3: |
@@ -261,6 +264,7 b' def createlog(ui, directory=None, root="' | |||
|
261 | 264 | if rev not in tags: |
|
262 | 265 | tags[rev] = [] |
|
263 | 266 | tags[rev].append(match.group(1)) |
|
267 | branchmap[match.group(1)] = match.group(2) | |
|
264 | 268 | |
|
265 | 269 | elif re_31.match(line): |
|
266 | 270 | state = 5 |
@@ -311,6 +315,18 b' def createlog(ui, directory=None, root="' | |||
|
311 | 315 | e.lines = (0, int(match.group(6))) |
|
312 | 316 | else: |
|
313 | 317 | e.lines = None |
|
318 | ||
|
319 | if match.group(7): # cvsnt mergepoint | |
|
320 | myrev = match.group(8).split('.') | |
|
321 | if len(myrev) == 2: # head | |
|
322 | e.mergepoint = 'HEAD' | |
|
323 | else: | |
|
324 | myrev = '.'.join(myrev[:-2] + ['0', myrev[-2]]) | |
|
325 | branches = [b for b in branchmap if branchmap[b] == myrev] | |
|
326 | assert len(branches) == 1, 'unknown branch: %s' % e.mergepoint | |
|
327 | e.mergepoint = branches[0] | |
|
328 | else: | |
|
329 | e.mergepoint = None | |
|
314 | 330 | e.comment = [] |
|
315 | 331 | state = 7 |
|
316 | 332 | |
@@ -420,6 +436,7 b' class changeset(object):' | |||
|
420 | 436 | .parents - list of one or two parent changesets |
|
421 | 437 | .tags - list of tags on this changeset |
|
422 | 438 | .synthetic - from synthetic revision "file ... added on branch ..." |
|
439 | .mergepoint- the branch that has been merged from (if present in rlog output) | |
|
423 | 440 | ''' |
|
424 | 441 | def __init__(self, **entries): |
|
425 | 442 | self.__dict__.update(entries) |
@@ -448,7 +465,8 b' def createchangeset(ui, log, fuzz=60, me' | |||
|
448 | 465 | (c.date[0] + c.date[1]) + fuzz) and |
|
449 | 466 | e.file not in files): |
|
450 | 467 | c = changeset(comment=e.comment, author=e.author, |
|
451 |
branch=e.branch, date=e.date, entries=[] |
|
|
468 | branch=e.branch, date=e.date, entries=[], | |
|
469 | mergepoint=e.mergepoint) | |
|
452 | 470 | changesets.append(c) |
|
453 | 471 | files = {} |
|
454 | 472 | if len(changesets) % 100 == 0: |
@@ -595,6 +613,11 b' def createchangeset(ui, log, fuzz=60, me' | |||
|
595 | 613 | if p is not None: |
|
596 | 614 | c.parents.append(p) |
|
597 | 615 | |
|
616 | if c.mergepoint: | |
|
617 | if c.mergepoint == 'HEAD': | |
|
618 | c.mergepoint = None | |
|
619 | c.parents.append(changesets[branches[c.mergepoint]]) | |
|
620 | ||
|
598 | 621 | if mergefrom: |
|
599 | 622 | m = mergefrom.search(c.comment) |
|
600 | 623 | if m: |
General Comments 0
You need to be logged in to leave comments.
Login now