|
1 #require hardlink |
|
2 #require hardlink-whitelisted |
|
3 |
|
4 This test is similar to test-hardlinks.t, but will only run on some filesystems |
|
5 that we are sure to have known good hardlink supports (see issue4546 for an |
|
6 example where the filesystem claims hardlink support but is actually |
|
7 problematic). |
|
8 |
|
9 $ cat > nlinks.py <<EOF |
|
10 > import sys |
|
11 > from mercurial import util |
|
12 > for f in sorted(sys.stdin.readlines()): |
|
13 > f = f[:-1] |
|
14 > print util.nlinks(f), f |
|
15 > EOF |
|
16 |
|
17 $ nlinksdir() |
|
18 > { |
|
19 > find $1 -type f | python $TESTTMP/nlinks.py |
|
20 > } |
|
21 |
|
22 Some implementations of cp can't create hardlinks (replaces 'cp -al' on Linux): |
|
23 |
|
24 $ cat > linkcp.py <<EOF |
|
25 > from mercurial import util |
|
26 > import sys |
|
27 > util.copyfiles(sys.argv[1], sys.argv[2], hardlink=True) |
|
28 > EOF |
|
29 |
|
30 $ linkcp() |
|
31 > { |
|
32 > python $TESTTMP/linkcp.py $1 $2 |
|
33 > } |
|
34 |
|
35 Prepare repo r1: |
|
36 |
|
37 $ hg init r1 |
|
38 $ cd r1 |
|
39 |
|
40 $ echo c1 > f1 |
|
41 $ hg add f1 |
|
42 $ hg ci -m0 |
|
43 |
|
44 $ mkdir d1 |
|
45 $ cd d1 |
|
46 $ echo c2 > f2 |
|
47 $ hg add f2 |
|
48 $ hg ci -m1 |
|
49 $ cd ../.. |
|
50 |
|
51 $ nlinksdir r1/.hg/store |
|
52 1 r1/.hg/store/00changelog.i |
|
53 1 r1/.hg/store/00manifest.i |
|
54 1 r1/.hg/store/data/d1/f2.i |
|
55 1 r1/.hg/store/data/f1.i |
|
56 1 r1/.hg/store/fncache |
|
57 1 r1/.hg/store/phaseroots |
|
58 1 r1/.hg/store/undo |
|
59 1 r1/.hg/store/undo.backup.fncache |
|
60 1 r1/.hg/store/undo.backupfiles |
|
61 1 r1/.hg/store/undo.phaseroots |
|
62 |
|
63 |
|
64 Create hardlinked clone r2: |
|
65 |
|
66 $ hg clone -U --debug r1 r2 --config progress.debug=true |
|
67 linking: 1 |
|
68 linking: 2 |
|
69 linking: 3 |
|
70 linking: 4 |
|
71 linking: 5 |
|
72 linking: 6 |
|
73 linking: 7 |
|
74 linked 7 files |
|
75 |
|
76 Create non-hardlinked clone r3: |
|
77 |
|
78 $ hg clone --pull r1 r3 |
|
79 requesting all changes |
|
80 adding changesets |
|
81 adding manifests |
|
82 adding file changes |
|
83 added 2 changesets with 2 changes to 2 files |
|
84 updating to branch default |
|
85 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
86 |
|
87 |
|
88 Repos r1 and r2 should now contain hardlinked files: |
|
89 |
|
90 $ nlinksdir r1/.hg/store |
|
91 2 r1/.hg/store/00changelog.i |
|
92 2 r1/.hg/store/00manifest.i |
|
93 2 r1/.hg/store/data/d1/f2.i |
|
94 2 r1/.hg/store/data/f1.i |
|
95 2 r1/.hg/store/fncache |
|
96 1 r1/.hg/store/phaseroots |
|
97 1 r1/.hg/store/undo |
|
98 1 r1/.hg/store/undo.backup.fncache |
|
99 1 r1/.hg/store/undo.backupfiles |
|
100 1 r1/.hg/store/undo.phaseroots |
|
101 |
|
102 $ nlinksdir r2/.hg/store |
|
103 2 r2/.hg/store/00changelog.i |
|
104 2 r2/.hg/store/00manifest.i |
|
105 2 r2/.hg/store/data/d1/f2.i |
|
106 2 r2/.hg/store/data/f1.i |
|
107 2 r2/.hg/store/fncache |
|
108 |
|
109 Repo r3 should not be hardlinked: |
|
110 |
|
111 $ nlinksdir r3/.hg/store |
|
112 1 r3/.hg/store/00changelog.i |
|
113 1 r3/.hg/store/00manifest.i |
|
114 1 r3/.hg/store/data/d1/f2.i |
|
115 1 r3/.hg/store/data/f1.i |
|
116 1 r3/.hg/store/fncache |
|
117 1 r3/.hg/store/phaseroots |
|
118 1 r3/.hg/store/undo |
|
119 1 r3/.hg/store/undo.backupfiles |
|
120 1 r3/.hg/store/undo.phaseroots |
|
121 |
|
122 |
|
123 Create a non-inlined filelog in r3: |
|
124 |
|
125 $ cd r3/d1 |
|
126 >>> f = open('data1', 'wb') |
|
127 >>> for x in range(10000): |
|
128 ... f.write("%s\n" % str(x)) |
|
129 >>> f.close() |
|
130 $ for j in 0 1 2 3 4 5 6 7 8 9; do |
|
131 > cat data1 >> f2 |
|
132 > hg commit -m$j |
|
133 > done |
|
134 $ cd ../.. |
|
135 |
|
136 $ nlinksdir r3/.hg/store |
|
137 1 r3/.hg/store/00changelog.i |
|
138 1 r3/.hg/store/00manifest.i |
|
139 1 r3/.hg/store/data/d1/f2.d |
|
140 1 r3/.hg/store/data/d1/f2.i |
|
141 1 r3/.hg/store/data/f1.i |
|
142 1 r3/.hg/store/fncache |
|
143 1 r3/.hg/store/phaseroots |
|
144 1 r3/.hg/store/undo |
|
145 1 r3/.hg/store/undo.backup.fncache |
|
146 1 r3/.hg/store/undo.backup.phaseroots |
|
147 1 r3/.hg/store/undo.backupfiles |
|
148 1 r3/.hg/store/undo.phaseroots |
|
149 |
|
150 Push to repo r1 should break up most hardlinks in r2: |
|
151 |
|
152 $ hg -R r2 verify |
|
153 checking changesets |
|
154 checking manifests |
|
155 crosschecking files in changesets and manifests |
|
156 checking files |
|
157 2 files, 2 changesets, 2 total revisions |
|
158 |
|
159 $ cd r3 |
|
160 $ hg push |
|
161 pushing to $TESTTMP/r1 (glob) |
|
162 searching for changes |
|
163 adding changesets |
|
164 adding manifests |
|
165 adding file changes |
|
166 added 10 changesets with 10 changes to 1 files |
|
167 |
|
168 $ cd .. |
|
169 |
|
170 $ nlinksdir r2/.hg/store |
|
171 1 r2/.hg/store/00changelog.i |
|
172 1 r2/.hg/store/00manifest.i |
|
173 1 r2/.hg/store/data/d1/f2.i |
|
174 2 r2/.hg/store/data/f1.i |
|
175 2 r2/.hg/store/fncache |
|
176 |
|
177 $ hg -R r2 verify |
|
178 checking changesets |
|
179 checking manifests |
|
180 crosschecking files in changesets and manifests |
|
181 checking files |
|
182 2 files, 2 changesets, 2 total revisions |
|
183 |
|
184 |
|
185 $ cd r1 |
|
186 $ hg up |
|
187 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
188 |
|
189 Committing a change to f1 in r1 must break up hardlink f1.i in r2: |
|
190 |
|
191 $ echo c1c1 >> f1 |
|
192 $ hg ci -m00 |
|
193 $ cd .. |
|
194 |
|
195 $ nlinksdir r2/.hg/store |
|
196 1 r2/.hg/store/00changelog.i |
|
197 1 r2/.hg/store/00manifest.i |
|
198 1 r2/.hg/store/data/d1/f2.i |
|
199 1 r2/.hg/store/data/f1.i |
|
200 2 r2/.hg/store/fncache |
|
201 |
|
202 |
|
203 $ cd r3 |
|
204 $ hg tip --template '{rev}:{node|short}\n' |
|
205 11:a6451b6bc41f |
|
206 $ echo bla > f1 |
|
207 $ hg ci -m1 |
|
208 $ cd .. |
|
209 |
|
210 Create hardlinked copy r4 of r3 (on Linux, we would call 'cp -al'): |
|
211 |
|
212 $ linkcp r3 r4 |
|
213 |
|
214 r4 has hardlinks in the working dir (not just inside .hg): |
|
215 |
|
216 $ nlinksdir r4 |
|
217 2 r4/.hg/00changelog.i |
|
218 2 r4/.hg/branch |
|
219 2 r4/.hg/cache/branch2-served |
|
220 2 r4/.hg/cache/checkisexec |
|
221 3 r4/.hg/cache/checklink (?) |
|
222 ? r4/.hg/cache/checklink-target (glob) |
|
223 2 r4/.hg/cache/checknoexec |
|
224 2 r4/.hg/cache/rbc-names-v1 |
|
225 2 r4/.hg/cache/rbc-revs-v1 |
|
226 2 r4/.hg/dirstate |
|
227 2 r4/.hg/hgrc |
|
228 2 r4/.hg/last-message.txt |
|
229 2 r4/.hg/requires |
|
230 2 r4/.hg/store/00changelog.i |
|
231 2 r4/.hg/store/00manifest.i |
|
232 2 r4/.hg/store/data/d1/f2.d |
|
233 2 r4/.hg/store/data/d1/f2.i |
|
234 2 r4/.hg/store/data/f1.i |
|
235 2 r4/.hg/store/fncache |
|
236 2 r4/.hg/store/phaseroots |
|
237 2 r4/.hg/store/undo |
|
238 2 r4/.hg/store/undo.backup.fncache |
|
239 2 r4/.hg/store/undo.backup.phaseroots |
|
240 2 r4/.hg/store/undo.backupfiles |
|
241 2 r4/.hg/store/undo.phaseroots |
|
242 4 r4/.hg/undo.backup.dirstate |
|
243 2 r4/.hg/undo.bookmarks |
|
244 2 r4/.hg/undo.branch |
|
245 2 r4/.hg/undo.desc |
|
246 4 r4/.hg/undo.dirstate |
|
247 2 r4/d1/data1 |
|
248 2 r4/d1/f2 |
|
249 2 r4/f1 |
|
250 |
|
251 Update back to revision 11 in r4 should break hardlink of file f1: |
|
252 |
|
253 $ hg -R r4 up 11 |
|
254 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
255 |
|
256 $ nlinksdir r4 |
|
257 2 r4/.hg/00changelog.i |
|
258 1 r4/.hg/branch |
|
259 2 r4/.hg/cache/branch2-served |
|
260 2 r4/.hg/cache/checkisexec |
|
261 2 r4/.hg/cache/checklink-target |
|
262 2 r4/.hg/cache/checknoexec |
|
263 2 r4/.hg/cache/rbc-names-v1 |
|
264 2 r4/.hg/cache/rbc-revs-v1 |
|
265 1 r4/.hg/dirstate |
|
266 2 r4/.hg/hgrc |
|
267 2 r4/.hg/last-message.txt |
|
268 2 r4/.hg/requires |
|
269 2 r4/.hg/store/00changelog.i |
|
270 2 r4/.hg/store/00manifest.i |
|
271 2 r4/.hg/store/data/d1/f2.d |
|
272 2 r4/.hg/store/data/d1/f2.i |
|
273 2 r4/.hg/store/data/f1.i |
|
274 2 r4/.hg/store/fncache |
|
275 2 r4/.hg/store/phaseroots |
|
276 2 r4/.hg/store/undo |
|
277 2 r4/.hg/store/undo.backup.fncache |
|
278 2 r4/.hg/store/undo.backup.phaseroots |
|
279 2 r4/.hg/store/undo.backupfiles |
|
280 2 r4/.hg/store/undo.phaseroots |
|
281 4 r4/.hg/undo.backup.dirstate |
|
282 2 r4/.hg/undo.bookmarks |
|
283 2 r4/.hg/undo.branch |
|
284 2 r4/.hg/undo.desc |
|
285 4 r4/.hg/undo.dirstate |
|
286 2 r4/d1/data1 |
|
287 2 r4/d1/f2 |
|
288 1 r4/f1 |
|
289 |
|
290 |
|
291 Test hardlinking outside hg: |
|
292 |
|
293 $ mkdir x |
|
294 $ echo foo > x/a |
|
295 |
|
296 $ linkcp x y |
|
297 $ echo bar >> y/a |
|
298 |
|
299 No diff if hardlink: |
|
300 |
|
301 $ diff x/a y/a |
|
302 |
|
303 Test mq hardlinking: |
|
304 |
|
305 $ echo "[extensions]" >> $HGRCPATH |
|
306 $ echo "mq=" >> $HGRCPATH |
|
307 |
|
308 $ hg init a |
|
309 $ cd a |
|
310 |
|
311 $ hg qimport -n foo - << EOF |
|
312 > # HG changeset patch |
|
313 > # Date 1 0 |
|
314 > diff -r 2588a8b53d66 a |
|
315 > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 |
|
316 > +++ b/a Wed Jul 23 15:54:29 2008 +0200 |
|
317 > @@ -0,0 +1,1 @@ |
|
318 > +a |
|
319 > EOF |
|
320 adding foo to series file |
|
321 |
|
322 $ hg qpush |
|
323 applying foo |
|
324 now at: foo |
|
325 |
|
326 $ cd .. |
|
327 $ linkcp a b |
|
328 $ cd b |
|
329 |
|
330 $ hg qimport -n bar - << EOF |
|
331 > # HG changeset patch |
|
332 > # Date 2 0 |
|
333 > diff -r 2588a8b53d66 a |
|
334 > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 |
|
335 > +++ b/b Wed Jul 23 15:54:29 2008 +0200 |
|
336 > @@ -0,0 +1,1 @@ |
|
337 > +b |
|
338 > EOF |
|
339 adding bar to series file |
|
340 |
|
341 $ hg qpush |
|
342 applying bar |
|
343 now at: bar |
|
344 |
|
345 $ cat .hg/patches/status |
|
346 430ed4828a74fa4047bc816a25500f7472ab4bfe:foo |
|
347 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c:bar |
|
348 |
|
349 $ cat .hg/patches/series |
|
350 foo |
|
351 bar |
|
352 |
|
353 $ cat ../a/.hg/patches/status |
|
354 430ed4828a74fa4047bc816a25500f7472ab4bfe:foo |
|
355 |
|
356 $ cat ../a/.hg/patches/series |
|
357 foo |
|
358 |
|
359 Test tags hardlinking: |
|
360 |
|
361 $ hg qdel -r qbase:qtip |
|
362 patch foo finalized without changeset message |
|
363 patch bar finalized without changeset message |
|
364 |
|
365 $ hg tag -l lfoo |
|
366 $ hg tag foo |
|
367 |
|
368 $ cd .. |
|
369 $ linkcp b c |
|
370 $ cd c |
|
371 |
|
372 $ hg tag -l -r 0 lbar |
|
373 $ hg tag -r 0 bar |
|
374 |
|
375 $ cat .hgtags |
|
376 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo |
|
377 430ed4828a74fa4047bc816a25500f7472ab4bfe bar |
|
378 |
|
379 $ cat .hg/localtags |
|
380 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo |
|
381 430ed4828a74fa4047bc816a25500f7472ab4bfe lbar |
|
382 |
|
383 $ cat ../b/.hgtags |
|
384 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo |
|
385 |
|
386 $ cat ../b/.hg/localtags |
|
387 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo |
|
388 |
|
389 $ cd .. |