Show More
@@ -110,10 +110,18 b' def _checkcollision(mctx, wctx):' | |||
|
110 | 110 | folded[fold] = fn |
|
111 | 111 | |
|
112 | 112 | if wctx: |
|
113 | # class to delay looking up copy mapping | |
|
114 | class pathcopies(object): | |
|
115 | @util.propertycache | |
|
116 | def map(self): | |
|
117 | # {dst@mctx: src@wctx} copy mapping | |
|
118 | return copies.pathcopies(wctx, mctx) | |
|
119 | pc = pathcopies() | |
|
120 | ||
|
113 | 121 | for fn in wctx: |
|
114 | 122 | fold = util.normcase(fn) |
|
115 | 123 | mfn = folded.get(fold, None) |
|
116 |
if mfn and |
|
|
124 | if mfn and mfn != fn and pc.map.get(mfn) != fn: | |
|
117 | 125 | raise util.Abort(_("case-folding collision between %s and %s") |
|
118 | 126 | % (mfn, fn)) |
|
119 | 127 | |
@@ -568,7 +576,11 b' def update(repo, node, branchmerge, forc' | |||
|
568 | 576 | action = [] |
|
569 | 577 | folding = not util.checkcase(repo.path) |
|
570 | 578 | if folding: |
|
571 | _checkcollision(p2, branchmerge and p1) | |
|
579 | # collision check is not needed for clean update | |
|
580 | if not branchmerge and force: | |
|
581 | _checkcollision(p2, None) | |
|
582 | else: | |
|
583 | _checkcollision(p2, wc) | |
|
572 | 584 | if not force: |
|
573 | 585 | _checkunknown(repo, wc, p2) |
|
574 | 586 | action += _forgetremoved(wc, p2, branchmerge) |
@@ -6,104 +6,204 b' run only on case-insensitive filesystems' | |||
|
6 | 6 | test for branch merging |
|
7 | 7 | ################################ |
|
8 | 8 | |
|
9 | $ hg init repo1 | |
|
10 | $ cd repo1 | |
|
11 | ||
|
12 | create base revision | |
|
9 | test for rename awareness of case-folding collision check: | |
|
13 | 10 | |
|
14 | $ echo base > base.txt | |
|
15 | $ hg add base.txt | |
|
16 | $ hg commit -m 'base' | |
|
11 | (1) colliding file is one renamed from collided file: | |
|
12 | this is also case for issue3370. | |
|
17 | 13 | |
|
18 | add same file in different case on both heads | |
|
14 | $ hg init merge_renameaware_1 | |
|
15 | $ cd merge_renameaware_1 | |
|
19 | 16 | |
|
20 |
$ echo a > a |
|
|
21 |
$ hg add a |
|
|
22 |
$ hg commit -m ' |
|
|
23 | ||
|
17 | $ echo a > a | |
|
18 | $ hg add a | |
|
19 | $ hg commit -m '#0' | |
|
20 | $ hg rename a tmp | |
|
21 | $ hg rename tmp A | |
|
22 | $ hg commit -m '#1' | |
|
24 | 23 | $ hg update 0 |
|
25 |
|
|
|
26 | ||
|
27 | $ echo A > A.TXT | |
|
28 | $ hg add A.TXT | |
|
29 | $ hg commit -m 'add A.TXT' | |
|
24 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
25 | $ echo 'modified at #2' > a | |
|
26 | $ hg commit -m '#2' | |
|
30 | 27 | created new head |
|
31 | 28 | |
|
32 | merge another, and fail with case-folding collision | |
|
29 | $ hg merge | |
|
30 | merging a and A to A | |
|
31 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
|
32 | (branch merge, don't forget to commit) | |
|
33 | $ hg status -A | |
|
34 | M A | |
|
35 | a | |
|
36 | R a | |
|
37 | $ cat A | |
|
38 | modified at #2 | |
|
39 | ||
|
40 | $ hg update --clean 1 | |
|
41 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
|
42 | $ hg merge | |
|
43 | merging A and a to A | |
|
44 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
|
45 | (branch merge, don't forget to commit) | |
|
46 | $ hg status -A | |
|
47 | M A | |
|
48 | a | |
|
49 | $ cat A | |
|
50 | modified at #2 | |
|
51 | ||
|
52 | $ cd .. | |
|
53 | ||
|
54 | (2) colliding file is not related to collided file | |
|
55 | ||
|
56 | $ hg init merge_renameaware_2 | |
|
57 | $ cd merge_renameaware_2 | |
|
58 | ||
|
59 | $ echo a > a | |
|
60 | $ hg add a | |
|
61 | $ hg commit -m '#0' | |
|
62 | $ hg remove a | |
|
63 | $ hg commit -m '#1' | |
|
64 | $ echo A > A | |
|
65 | $ hg add A | |
|
66 | $ hg commit -m '#2' | |
|
67 | $ hg update --clean 0 | |
|
68 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
69 | $ echo 'modified at #3' > a | |
|
70 | $ hg commit -m '#3' | |
|
71 | created new head | |
|
33 | 72 | |
|
34 | 73 | $ hg merge |
|
35 |
abort: case-folding collision between |
|
|
74 | abort: case-folding collision between A and a | |
|
36 | 75 | [255] |
|
76 | $ hg parents --template '{rev}\n' | |
|
77 | 3 | |
|
78 | $ hg status -A | |
|
79 | C a | |
|
80 | $ cat a | |
|
81 | modified at #3 | |
|
37 | 82 | |
|
38 | check clean-ness of working directory | |
|
39 | ||
|
40 | $ hg status | |
|
83 | $ hg update --clean 2 | |
|
84 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
85 | $ hg merge | |
|
86 | abort: case-folding collision between a and A | |
|
87 | [255] | |
|
41 | 88 | $ hg parents --template '{rev}\n' |
|
42 | 89 | 2 |
|
90 | $ hg status -A | |
|
91 | C A | |
|
92 | $ cat A | |
|
93 | A | |
|
94 | ||
|
43 | 95 | $ cd .. |
|
44 | 96 | |
|
97 | ||
|
45 | 98 | ################################ |
|
46 | 99 | test for linear updates |
|
47 | 100 | ################################ |
|
48 | 101 | |
|
49 | $ hg init repo2 | |
|
50 | $ cd repo2 | |
|
102 | test for rename awareness of case-folding collision check: | |
|
51 | 103 | |
|
52 | create base revision (rev:0) | |
|
104 | (1) colliding file is one renamed from collided file | |
|
105 | ||
|
106 | $ hg init linearupdate_renameaware_1 | |
|
107 | $ cd linearupdate_renameaware_1 | |
|
53 | 108 | |
|
54 | $ hg import --bypass --exact - <<EOF | |
|
55 | > # HG changeset patch | |
|
56 | > # User null | |
|
57 | > # Date 1 0 | |
|
58 | > # Node ID e1bdf414b0ea9c831fd3a14e94a0a18e1410f98b | |
|
59 | > # Parent 0000000000000000000000000000000000000000 | |
|
60 | > add a | |
|
61 | > | |
|
62 | > diff --git a/a b/a | |
|
63 | > new file mode 100644 | |
|
64 | > --- /dev/null | |
|
65 | > +++ b/a | |
|
66 | > @@ -0,0 +1,3 @@ | |
|
67 | > +this is line 1 | |
|
68 | > +this is line 2 | |
|
69 | > +this is line 3 | |
|
70 | > EOF | |
|
71 | applying patch from stdin | |
|
72 | ||
|
73 | create rename revision (rev:1) | |
|
74 | ||
|
75 | $ hg import --bypass --exact - <<EOF | |
|
76 | > # HG changeset patch | |
|
77 | > # User null | |
|
78 | > # Date 1 0 | |
|
79 | > # Node ID 9dca9f19bb91851bc693544b598b0740629edfad | |
|
80 | > # Parent e1bdf414b0ea9c831fd3a14e94a0a18e1410f98b | |
|
81 | > rename a to A | |
|
82 | > | |
|
83 | > diff --git a/a b/A | |
|
84 | > rename from a | |
|
85 | > rename to A | |
|
86 | > EOF | |
|
87 | applying patch from stdin | |
|
88 | ||
|
89 | update to base revision, and modify 'a' | |
|
109 | $ echo a > a | |
|
110 | $ hg add a | |
|
111 | $ hg commit -m '#0' | |
|
112 | $ hg rename a tmp | |
|
113 | $ hg rename tmp A | |
|
114 | $ hg commit -m '#1' | |
|
90 | 115 | |
|
91 | 116 | $ hg update 0 |
|
92 |
1 files updated, 0 files merged, |
|
|
93 | $ echo 'this is added line' >> a | |
|
117 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
94 | 118 | |
|
95 | update to current tip linearly | |
|
96 | ||
|
119 | $ echo 'this is added line' >> a | |
|
97 | 120 | $ hg update 1 |
|
98 | 121 | merging a and A to A |
|
99 | 122 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved |
|
100 | ||
|
101 | check status and contents of file | |
|
102 | ||
|
103 | 123 | $ hg status -A |
|
104 | 124 | M A |
|
105 | 125 | $ cat A |
|
106 | this is line 1 | |
|
107 | this is line 2 | |
|
108 | this is line 3 | |
|
126 | a | |
|
109 | 127 | this is added line |
|
128 | ||
|
129 | $ cd .. | |
|
130 | ||
|
131 | (2) colliding file is not related to collided file | |
|
132 | ||
|
133 | $ hg init linearupdate_renameaware_2 | |
|
134 | $ cd linearupdate_renameaware_2 | |
|
135 | ||
|
136 | $ echo a > a | |
|
137 | $ hg add a | |
|
138 | $ hg commit -m '#0' | |
|
139 | $ hg remove a | |
|
140 | $ hg commit -m '#1' | |
|
141 | $ echo A > A | |
|
142 | $ hg add A | |
|
143 | $ hg commit -m '#2' | |
|
144 | ||
|
145 | $ hg update 0 | |
|
146 | abort: case-folding collision between a and A | |
|
147 | [255] | |
|
148 | $ hg parents --template '{rev}\n' | |
|
149 | 2 | |
|
150 | $ hg status -A | |
|
151 | C A | |
|
152 | $ cat A | |
|
153 | A | |
|
154 | ||
|
155 | $ hg update --check 0 | |
|
156 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
157 | $ hg parents --template '{rev}\n' | |
|
158 | 0 | |
|
159 | $ hg status -A | |
|
160 | C a | |
|
161 | $ cat a | |
|
162 | a | |
|
163 | ||
|
164 | $ hg update --clean 2 | |
|
165 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
166 | $ hg parents --template '{rev}\n' | |
|
167 | 2 | |
|
168 | $ hg status -A | |
|
169 | C A | |
|
170 | $ cat A | |
|
171 | A | |
|
172 | ||
|
173 | $ cd .. | |
|
174 | ||
|
175 | (3) colliding file is not related to collided file: added in working dir | |
|
176 | ||
|
177 | $ hg init linearupdate_renameaware_3 | |
|
178 | $ cd linearupdate_renameaware_3 | |
|
179 | ||
|
180 | $ echo a > a | |
|
181 | $ hg add a | |
|
182 | $ hg commit -m '#0' | |
|
183 | $ hg rename a b | |
|
184 | $ hg commit -m '#1' | |
|
185 | $ hg update 0 | |
|
186 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
187 | ||
|
188 | $ echo B > B | |
|
189 | $ hg add B | |
|
190 | $ hg status | |
|
191 | A B | |
|
192 | $ hg update | |
|
193 | abort: case-folding collision between b and B | |
|
194 | [255] | |
|
195 | ||
|
196 | $ hg update --check | |
|
197 | abort: uncommitted local changes | |
|
198 | [255] | |
|
199 | ||
|
200 | $ hg update --clean | |
|
201 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |
|
202 | $ hg parents --template '{rev}\n' | |
|
203 | 1 | |
|
204 | $ hg status -A | |
|
205 | C b | |
|
206 | $ cat b | |
|
207 | a | |
|
208 | ||
|
209 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now