File: test-copy.t

package info (click to toggle)
mercurial 7.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 45,080 kB
  • sloc: python: 208,589; ansic: 56,460; tcl: 3,715; sh: 1,839; lisp: 1,483; cpp: 864; makefile: 769; javascript: 649; xml: 36
file content (542 lines) | stat: -rw-r--r-- 14,742 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
#testcases parent-swap meta-flag

#if meta-flag
  $ cat << EOF >> $HGRCPATH
  > [format]
  > exp-use-hasmeta-flag=yes
  > EOF
#else
  $ cat << EOF >> $HGRCPATH
  > [format]
  > exp-use-hasmeta-flag=no
  > EOF
#endif

  $ mkdir part1
  $ cd part1

  $ hg init
  $ echo a > a
  $ hg add a
  $ hg commit -m "1"
  $ hg status
  $ hg copy a b
  $ hg --config ui.portablefilenames=abort copy a con.xml
  abort: filename contains 'con', which is reserved on Windows: con.xml
  [10]
  $ hg status
  A b
  $ hg sum
  parent: 0:c19d34741b0a tip
   1
  branch: default
  commit: 1 copied
  update: (current)
  phases: 1 draft
  $ hg --debug commit -m "2"
  committing files:
  b
   b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
  committing manifest
  committing changelog
  updating the branch cache
  committed changeset 1:93580a2c28a50a56f63526fb305067e6fbf739c4

we should see two history entries

  $ hg history -v
  changeset:   1:93580a2c28a5
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  files:       b
  description:
  2
  
  
  changeset:   0:c19d34741b0a
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  files:       a
  description:
  1
  
  

we should see one log entry for a

  $ hg log a
  changeset:   0:c19d34741b0a
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     1
  

this should show a revision linked to changeset 0

  $ hg debugindex a
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       0 b789fdd96dc2 000000000000 000000000000

we should see one log entry for b

  $ hg log b
  changeset:   1:93580a2c28a5
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     2
  

this should show a revision linked to changeset 1

  $ hg debugindex b
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       1 37d9b5d994ea 000000000000 000000000000

this should show the rename information in the metadata

  $ hg debugdata b 0 | head -3 | tail -2
  copy: a
  copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3

#if meta-flag
  $ md5sum.py .hg/store/data/b.i
  20472919b624970ca611b84700c72304  .hg/store/data/b.i
  $ hg debugrevlog b | grep flags
  flags  : inline, generaldelta, hasmeta
#else
  $ md5sum.py .hg/store/data/b.i
  44913824c8f5890ae218f9829535922e  .hg/store/data/b.i
  $ hg debugrevlog b | grep flags
  flags  : inline, generaldelta
#endif
  $ hg cat b > bsum
  $ md5sum.py bsum
  60b725f10c9c85c70d97880dfe8191b3  bsum
  $ hg cat a > asum
  $ md5sum.py asum
  60b725f10c9c85c70d97880dfe8191b3  asum
  $ hg verify -q

  $ cd ..


  $ mkdir part2
  $ cd part2

  $ hg init
  $ echo foo > foo
should fail - foo is not managed
  $ hg mv foo bar
  foo: not copying - file is not managed
  abort: no files to copy
  (maybe you meant to use --after --at-rev=.)
  [10]
  $ hg st -A
  ? foo
respects ui.relative-paths
  $ mkdir dir
  $ cd dir
  $ hg mv ../foo ../bar
  ../foo: not copying - file is not managed
  abort: no files to copy
  (maybe you meant to use --after --at-rev=.)
  [10]
  $ hg mv ../foo ../bar --config ui.relative-paths=yes
  ../foo: not copying - file is not managed
  abort: no files to copy
  (maybe you meant to use --after --at-rev=.)
  [10]
  $ hg mv ../foo ../bar --config ui.relative-paths=no
  foo: not copying - file is not managed
  abort: no files to copy
  (maybe you meant to use --after --at-rev=.)
  [10]
  $ cd ..
  $ rmdir dir
  $ hg add foo
dry-run; print a warning that this is not a real copy; foo is added
  $ hg mv --dry-run foo bar
  foo has not been committed yet, so no copy data will be stored for bar.
  $ hg st -A
  A foo
should print a warning that this is not a real copy; bar is added
  $ hg mv foo bar
  foo has not been committed yet, so no copy data will be stored for bar.
  $ hg st -A
  A bar
should print a warning that this is not a real copy; foo is added
  $ hg cp bar foo
  bar has not been committed yet, so no copy data will be stored for foo.
  $ hg rm -f bar
  $ rm bar
  $ hg st -A
  A foo
  $ hg commit -m1

moving a missing file
  $ rm foo
  $ hg mv foo foo3
  foo: deleted in working directory
  foo3 does not exist!
  $ hg up -qC .

copy --after to a nonexistent target filename
  $ hg cp -A foo dummy
  foo: not recording copy - dummy does not exist
  [1]

dry-run; should show that foo is clean
  $ hg copy --dry-run foo bar
  $ hg st -A
  C foo
should show copy
  $ hg copy foo bar
  $ hg st -C
  A bar
    foo

shouldn't show copy
  $ hg commit -m2
  $ hg st -C

should match
  $ hg debugindex foo
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       0 2ed2a3912a0b 000000000000 000000000000
  $ hg debugrename bar
  bar renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd

  $ echo bleah > foo
  $ echo quux > bar
  $ hg commit -m3

should not be renamed
  $ hg debugrename bar
  bar not renamed

  $ hg copy -f foo bar
should show copy
  $ hg st -C
  M bar
    foo

XXX: filtering lfilesrepo.status() in 3.3-rc causes the copy source to not be
displayed.
  $ hg st -C --config extensions.largefiles=
  The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
  M bar
    foo

  $ hg commit -m3

should show no parents for tip
  $ hg debugindex bar
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       1 7711d36246cc 000000000000 000000000000
       1       2 bdf70a2b8d03 7711d36246cc 000000000000
       2       3 b2558327ea8d 000000000000 000000000000
should match
  $ hg debugindex foo
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       0 2ed2a3912a0b 000000000000 000000000000
       1       2 dd12c926cf16 2ed2a3912a0b 000000000000
  $ hg debugrename bar
  bar renamed from foo:dd12c926cf165e3eb4cf87b084955cb617221c17

should show no copies
  $ hg st -C

note: since filelog based copy tracing only trace copy for new file, the copy information here is not displayed.

  $ hg status --copies --change .
  M bar

They are a devel option to walk all file and fine this information anyway.

  $ hg status --copies --change . --config devel.copy-tracing.trace-all-files=yes
  M bar
    foo

copy --after on an added file
  $ cp bar baz
  $ hg add baz
  $ hg cp -A bar baz
  $ hg st -C
  A baz
    bar

foo was clean:
  $ hg st -AC foo
  C foo
Trying to copy on top of an existing file fails,
  $ hg copy -A bar foo
  foo: not overwriting - file already committed
  ('hg copy --after --force' to replace the file by recording a copy)
  [1]
same error without the --after, so the user doesn't have to go through
two hints:
  $ hg copy bar foo
  foo: not overwriting - file already committed
  ('hg copy --force' to replace the file by recording a copy)
  [1]
but it's considered modified after a copy --after --force
  $ hg copy -Af bar foo
  $ hg st -AC foo
  M foo
    bar
The hint for a file that exists but is not in file history doesn't
mention --force:
  $ touch xyzzy
  $ hg cp bar xyzzy
  xyzzy: not overwriting - file exists
  ('hg copy --after' to record the copy)
  [1]
  $ hg co -qC .
  $ rm baz xyzzy


Test unmarking copy/rename of a single file

# Set up by creating a copy
  $ hg cp bar baz
# Test unmarking as copy a non-existent file
  $ hg copy --forget non-existent
  non-existent: $ENOENT$
  $ hg rename --forget non-existent
  non-existent: $ENOENT$
# Test unmarking as copy an tracked but unrelated file
  $ hg copy --forget foo
  foo: not unmarking as copy - file is not marked as copied
  $ hg rename --forget foo
  foo: not unmarking as copy - file is not marked as copied
# Test unmarking as copy a copy source
  $ hg copy --forget bar
  bar: not unmarking as copy - file is not marked as copied
  $ hg rename --forget bar
  bar: not unmarking as copy - file is not marked as copied
# baz should still be marked as a copy
  $ hg st -C
  A baz
    bar
# Test the normal case
  $ hg copy --forget baz
  $ hg st -C
  A baz
  $ rm bar
  $ hg rename --after bar baz
  $ hg st -C
  A baz
    bar
  R bar
  $ hg rename --forget baz
  $ hg st -C
  A baz
  R bar
  $ hg revert bar
# Test unmarking as copy with matching an non-matching patterns
  $ hg cp bar baz --after
  $ hg copy --forget bar baz
  bar: not unmarking as copy - file is not marked as copied
  $ hg cp bar baz --after
  $ hg rename --forget bar baz
  bar: not unmarking as copy - file is not marked as copied
  $ hg st -C
  A baz
# Test unmarking as copy with no exact matches
  $ hg cp bar baz --after
  $ hg copy --forget .
  $ hg st -C
  A baz
  $ hg cp bar baz --after
  $ hg st -C
  A baz
    bar
  $ hg rename --forget .
  $ hg st -C
  A baz
  $ hg forget baz
  $ rm baz

Test unmarking copy of a directory

  $ mkdir dir
  $ echo foo > dir/foo
  $ echo bar > dir/bar
  $ hg add dir
  adding dir/bar
  adding dir/foo
  $ hg ci -m 'add dir/'
  $ hg cp dir dir2
  copying dir/bar to dir2/bar
  copying dir/foo to dir2/foo
  $ touch dir2/untracked
  $ hg copy --forget dir2
  $ hg st -C
  A dir2/bar
  A dir2/foo
  ? dir2/untracked
# Clean up for next test
  $ hg forget dir2
  removing dir2/bar
  removing dir2/foo
  $ rm -r dir2

Test uncopy on committed copies

# Commit some copies
  $ hg cp bar baz
  $ hg cp bar qux
  $ hg ci -m copies
  $ hg st -C --change .
  A baz
    bar
  A qux
    bar
  $ base=$(hg log -r '.^' -T '{rev}')
  $ hg log -G -T '{rev}:{node|short} {desc}\n' -r $base:
  @  5:a612dc2edfda copies
  |
  o  4:4800b1f1f38e add dir/
  |
  ~
# Add a dirty change on top to show that it's unaffected
  $ echo dirty >> baz
  $ hg st
  M baz
  $ cat baz
  bleah
  dirty
  $ hg copy --forget --at-rev . baz
  saved backup bundle to $TESTTMP/part2/.hg/strip-backup/a612dc2edfda-e36b4448-uncopy.hg
# The unwanted copy is no longer recorded, but the unrelated one is
  $ hg st -C --change .
  A baz
  A qux
    bar
# The old commit is gone and we have updated to the new commit
  $ hg log -G -T '{rev}:{node|short} {desc}\n' -r $base:
  @  5:c45090e5effe copies
  |
  o  4:4800b1f1f38e add dir/
  |
  ~
# Working copy still has the uncommitted change
  $ hg st
  M baz
  $ cat baz
  bleah
  dirty

  $ hg root
  $TESTTMP/part2
  $ cd ..

# This should survive push and pull with both changegroup3 and changegroup 4

  $ hg clone --pull part1 clone1-cg3 --quiet --config experimental.changegroup4=no
  $ hg -R clone1-cg3 status --copies --change 0
  A a
  $ hg -R clone1-cg3 status --copies --change 1
  A b
    a

  $ hg clone --pull part2 clone2-cg3 --quiet --config experimental.changegroup4=no
  $ hg -R clone2-cg3 status --copies --change 5
  A baz
  A qux
    bar
  $ hg -R clone2-cg3 status --copies --change 4
  A dir/bar
  A dir/foo
  $ hg -R clone2-cg3 status --copies --change 3
  M bar
  $ hg -R clone2-cg3 status --copies --change 2
  M bar
  M foo
  $ hg -R clone2-cg3 status --copies --change 1
  A bar
    foo
  $ hg -R clone2-cg3 status --copies --change 0
  A foo

  $ hg clone --pull part1 clone1-cg4 --config experimental.changegroup4=yes --quiet
  $ hg -R clone1-cg4 status --copies --change 0
  A a
  $ hg -R clone1-cg4 status --copies --change 1
  A b
    a

  $ hg clone --pull part2 clone2-cg4 --config experimental.changegroup4=yes --quiet
  $ hg -R clone2-cg4 status --copies --change 5
  A baz
  A qux
    bar
  $ hg -R clone2-cg4 status --copies --change 4
  A dir/bar
  A dir/foo
  $ hg -R clone2-cg4 status --copies --change 3
  M bar
  $ hg -R clone2-cg4 status --copies --change 2
  M bar
  M foo
  $ hg -R clone2-cg4 status --copies --change 1
  A bar
    foo
  $ hg -R clone2-cg4 status --copies --change 0
  A foo

#if meta-flag
  $ md5sum.py part1/.hg/store/data/b.i clone1*/.hg/store/data/b.i
  20472919b624970ca611b84700c72304  part1/.hg/store/data/b.i
  20472919b624970ca611b84700c72304  clone1-cg3/.hg/store/data/b.i
  20472919b624970ca611b84700c72304  clone1-cg4/.hg/store/data/b.i
  $ md5sum.py part1/.hg/store/data/a.i clone1*/.hg/store/data/a.i
  24d79f4139052e75e98742bd9e9c774a  part1/.hg/store/data/a.i
  24d79f4139052e75e98742bd9e9c774a  clone1-cg3/.hg/store/data/a.i
  24d79f4139052e75e98742bd9e9c774a  clone1-cg4/.hg/store/data/a.i

  $ md5sum.py part2/.hg/store/data/foo.i clone2*/.hg/store/data/foo.i
  651dc40f4d89883b9d0bfb1ffaa3d617  part2/.hg/store/data/foo.i
  651dc40f4d89883b9d0bfb1ffaa3d617  clone2-cg3/.hg/store/data/foo.i
  651dc40f4d89883b9d0bfb1ffaa3d617  clone2-cg4/.hg/store/data/foo.i
  $ md5sum.py part2/.hg/store/data/bar.i clone2*/.hg/store/data/bar.i
  b52f445dd407671a6277ce4dbcffb992  part2/.hg/store/data/bar.i
  b52f445dd407671a6277ce4dbcffb992  clone2-cg3/.hg/store/data/bar.i
  b52f445dd407671a6277ce4dbcffb992  clone2-cg4/.hg/store/data/bar.i
  $ md5sum.py part2/.hg/store/data/baz.i clone2*/.hg/store/data/baz.i
  525c4d70b3f86d77993391629985e62b  part2/.hg/store/data/baz.i
  525c4d70b3f86d77993391629985e62b  clone2-cg3/.hg/store/data/baz.i
  525c4d70b3f86d77993391629985e62b  clone2-cg4/.hg/store/data/baz.i
  $ md5sum.py part2/.hg/store/data/qux.i clone2*/.hg/store/data/qux.i
  003ccc7043b63c06e93fdce109b10417  part2/.hg/store/data/qux.i
  003ccc7043b63c06e93fdce109b10417  clone2-cg3/.hg/store/data/qux.i
  003ccc7043b63c06e93fdce109b10417  clone2-cg4/.hg/store/data/qux.i
#else
  $ md5sum.py part1/.hg/store/data/b.i clone1*/.hg/store/data/b.i
  44913824c8f5890ae218f9829535922e  part1/.hg/store/data/b.i
  44913824c8f5890ae218f9829535922e  clone1-cg3/.hg/store/data/b.i
  44913824c8f5890ae218f9829535922e  clone1-cg4/.hg/store/data/b.i
  $ md5sum.py part1/.hg/store/data/a.i clone1*/.hg/store/data/a.i
  c517d297466f14512660b97fb67ef39d  part1/.hg/store/data/a.i
  c517d297466f14512660b97fb67ef39d  clone1-cg3/.hg/store/data/a.i
  c517d297466f14512660b97fb67ef39d  clone1-cg4/.hg/store/data/a.i

  $ md5sum.py part2/.hg/store/data/foo.i clone2*/.hg/store/data/foo.i
  9fccff6dee6685292e72152627c295cb  part2/.hg/store/data/foo.i
  9fccff6dee6685292e72152627c295cb  clone2-cg3/.hg/store/data/foo.i
  9fccff6dee6685292e72152627c295cb  clone2-cg4/.hg/store/data/foo.i
  $ md5sum.py part2/.hg/store/data/bar.i clone2*/.hg/store/data/bar.i
  0eb3d23b50f1ccba7d6ec7212c4e4e64  part2/.hg/store/data/bar.i
  0eb3d23b50f1ccba7d6ec7212c4e4e64  clone2-cg3/.hg/store/data/bar.i
  0eb3d23b50f1ccba7d6ec7212c4e4e64  clone2-cg4/.hg/store/data/bar.i
  $ md5sum.py part2/.hg/store/data/baz.i clone2*/.hg/store/data/baz.i
  8a22e288ffd74c0d1fead0cb2ddd7bb0  part2/.hg/store/data/baz.i
  8a22e288ffd74c0d1fead0cb2ddd7bb0  clone2-cg3/.hg/store/data/baz.i
  8a22e288ffd74c0d1fead0cb2ddd7bb0  clone2-cg4/.hg/store/data/baz.i
  $ md5sum.py part2/.hg/store/data/qux.i clone2*/.hg/store/data/qux.i
  e106cd025269f85a938d68b6734822c2  part2/.hg/store/data/qux.i
  e106cd025269f85a938d68b6734822c2  clone2-cg3/.hg/store/data/qux.i
  e106cd025269f85a938d68b6734822c2  clone2-cg4/.hg/store/data/qux.i
#endif