Imported Upstream version 2.5.1
[scm/test.git] / t / t-migrate-import.sh
1 #!/usr/bin/env bash
2
3 . "$(dirname "$0")/fixtures/migrate.sh"
4 . "$(dirname "$0")/testlib.sh"
5
6 begin_test "migrate import (default branch)"
7 (
8   set -e
9
10   setup_multiple_local_branches
11
12   md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
13   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
14   md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
15
16   git lfs migrate import
17
18   assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
19   assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
20
21   assert_local_object "$md_oid" "140"
22   assert_local_object "$txt_oid" "120"
23   refute_local_object "$md_feature_oid" "30"
24
25   master="$(git rev-parse refs/heads/master)"
26   feature="$(git rev-parse refs/heads/my-feature)"
27
28   master_attrs="$(git cat-file -p "$master:.gitattributes")"
29   [ ! $(git cat-file -p "$feature:.gitattributes") ]
30
31   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
32   echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
33 )
34 end_test
35
36 begin_test "migrate import (bare repository)"
37 (
38   set -e
39
40   setup_multiple_remote_branches
41
42   git lfs migrate import --everything
43 )
44 end_test
45
46 begin_test "migrate import (given branch)"
47 (
48   set -e
49
50   setup_multiple_local_branches
51
52   md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
53   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
54   md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
55
56   git lfs migrate import my-feature
57
58   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
59   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
60   assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
61   assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
62
63   assert_local_object "$md_oid" "140"
64   assert_local_object "$md_feature_oid" "30"
65   assert_local_object "$txt_oid" "120"
66
67   master="$(git rev-parse refs/heads/master)"
68   feature="$(git rev-parse refs/heads/my-feature)"
69
70   master_attrs="$(git cat-file -p "$master:.gitattributes")"
71   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
72
73   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
74   echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
75   echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
76   echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
77 )
78 end_test
79
80 begin_test "migrate import (default branch with filter)"
81 (
82   set -e
83
84   setup_multiple_local_branches
85
86   md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
87   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
88   md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
89
90   git lfs migrate import --include "*.md"
91
92   assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
93
94   assert_local_object "$md_oid" "140"
95   refute_local_object "$txt_oid" "120"
96   refute_local_object "$md_feature_oid" "30"
97
98   master="$(git rev-parse refs/heads/master)"
99   feature="$(git rev-parse refs/heads/my-feature)"
100
101   master_attrs="$(git cat-file -p "$master:.gitattributes")"
102   [ ! $(git cat-file -p "$feature:.gitattributes") ]
103
104   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
105   echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
106 )
107 end_test
108
109 begin_test "migrate import (given branch with filter)"
110 (
111   set -e
112
113   setup_multiple_local_branches
114
115   md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
116   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
117   md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
118
119   git lfs migrate import --include "*.md" my-feature
120
121   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
122   assert_pointer "refs/heads/my-feature~1" "a.md" "$md_oid" "140"
123
124   assert_local_object "$md_oid" "140"
125   assert_local_object "$md_feature_oid" "30"
126   refute_local_object "$txt_oid" "120"
127
128   master="$(git rev-parse refs/heads/master)"
129   feature="$(git rev-parse refs/heads/my-feature)"
130
131   master_attrs="$(git cat-file -p "$master:.gitattributes")"
132   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
133
134   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
135   echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
136   echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
137   echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
138 )
139 end_test
140
141 begin_test "migrate import (default branch, exclude remote refs)"
142 (
143   set -e
144
145   setup_single_remote_branch
146
147   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
148   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
149   md_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
150   txt_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
151
152   git lfs migrate import
153
154   assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
155   assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
156
157   assert_local_object "$md_oid" "50"
158   assert_local_object "$txt_oid" "30"
159   refute_local_object "$md_remote_oid" "140"
160   refute_local_object "$txt_remote_oid" "120"
161
162   master="$(git rev-parse refs/heads/master)"
163   remote="$(git rev-parse refs/remotes/origin/master)"
164
165   master_attrs="$(git cat-file -p "$master:.gitattributes")"
166   [ ! $(git cat-file -p "$remote:.gitattributes") ]
167
168   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
169   echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
170 )
171 end_test
172
173 begin_test "migrate import (given branch, exclude remote refs)"
174 (
175   set -e
176
177   setup_multiple_remote_branches
178
179   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
180   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
181   md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
182   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
183   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
184   txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
185
186   git lfs migrate import my-feature
187
188   assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "21"
189   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
190   assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "20"
191   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
192
193   assert_local_object "$md_feature_oid" "31"
194   assert_local_object "$md_master_oid" "21"
195   assert_local_object "$txt_feature_oid" "30"
196   assert_local_object "$txt_master_oid" "20"
197   refute_local_object "$md_remote_oid" "11"
198   refute_local_object "$txt_remote_oid" "10"
199
200   master="$(git rev-parse refs/heads/master)"
201   feature="$(git rev-parse refs/heads/my-feature)"
202   remote="$(git rev-parse refs/remotes/origin/master)"
203
204   master_attrs="$(git cat-file -p "$master:.gitattributes")"
205   [ ! $(git cat-file -p "$remote:.gitattributes") ]
206   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
207
208   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
209   echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
210   echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
211   echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
212 )
213 end_test
214
215 begin_test "migrate import (given ref, --skip-fetch)"
216 (
217   set -e
218
219   setup_single_remote_branch
220
221   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
222   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
223   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
224   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
225
226   git tag pseudo-remote "$(git rev-parse refs/remotes/origin/master)"
227   # Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to
228   # not fetch it.
229   git update-ref -d refs/remotes/origin/master
230
231   git lfs migrate import --skip-fetch
232
233   assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50"
234   assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140"
235   assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30"
236   assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120"
237
238   assert_local_object "$md_master_oid" "50"
239   assert_local_object "$txt_master_oid" "30"
240   assert_local_object "$md_remote_oid" "140"
241   assert_local_object "$txt_remote_oid" "120"
242
243   master="$(git rev-parse refs/heads/master)"
244   remote="$(git rev-parse pseudo-remote)"
245
246   master_attrs="$(git cat-file -p "$master:.gitattributes")"
247   remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
248
249   echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
250   echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
251   echo "$remote_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
252   echo "$remote_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
253 )
254 end_test
255
256 begin_test "migrate import (un-annotated tags)"
257 (
258   set -e
259
260   setup_single_local_branch_with_tags
261
262   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
263
264   git lfs migrate import --everything
265
266   assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
267   assert_local_object "$txt_master_oid" "2"
268
269   git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
270 )
271 end_test
272
273 begin_test "migrate import (annotated tags)"
274 (
275   set -e
276
277   setup_single_local_branch_with_annotated_tags
278
279   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
280
281   git lfs migrate import --everything
282
283   assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
284   assert_local_object "$txt_master_oid" "2"
285
286   git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
287 )
288 end_test
289
290 begin_test "migrate import (include/exclude ref)"
291 (
292   set -e
293
294   setup_multiple_remote_branches
295
296   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
297   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
298   md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
299   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
300   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
301   txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
302
303   git lfs migrate import \
304     --include-ref=refs/heads/my-feature \
305     --exclude-ref=refs/heads/master
306
307   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
308   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
309
310   assert_local_object "$md_feature_oid" "31"
311   refute_local_object "$md_master_oid" "21"
312   assert_local_object "$txt_feature_oid" "30"
313   refute_local_object "$txt_master_oid" "20"
314   refute_local_object "$md_remote_oid" "11"
315   refute_local_object "$txt_remote_oid" "10"
316
317   master="$(git rev-parse refs/heads/master)"
318   feature="$(git rev-parse refs/heads/my-feature)"
319   remote="$(git rev-parse refs/remotes/origin/master)"
320
321   [ ! $(git cat-file -p "$master:.gitattributes") ]
322   [ ! $(git cat-file -p "$remote:.gitattributes") ]
323   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
324
325   echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
326   echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
327 )
328 end_test
329
330 begin_test "migrate import (include/exclude ref args)"
331 (
332   set -e
333
334   setup_multiple_remote_branches
335
336   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
337   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
338   md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
339   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
340   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
341   txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
342
343   git lfs migrate import my-feature ^master
344
345   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
346   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
347
348   assert_local_object "$md_feature_oid" "31"
349   refute_local_object "$md_master_oid" "21"
350   assert_local_object "$txt_feature_oid" "30"
351   refute_local_object "$txt_master_oid" "20"
352   refute_local_object "$md_remote_oid" "11"
353   refute_local_object "$txt_remote_oid" "10"
354
355   master="$(git rev-parse refs/heads/master)"
356   feature="$(git rev-parse refs/heads/my-feature)"
357   remote="$(git rev-parse refs/remotes/origin/master)"
358
359   [ ! $(git cat-file -p "$master:.gitattributes") ]
360   [ ! $(git cat-file -p "$remote:.gitattributes") ]
361   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
362
363   echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
364   echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
365 )
366 end_test
367
368 begin_test "migrate import (include/exclude ref with filter)"
369 (
370   set -e
371
372   setup_multiple_remote_branches
373
374   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
375   md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
376   md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
377   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
378   txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
379   txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
380
381   git lfs migrate import \
382     --include="*.txt" \
383     --include-ref=refs/heads/my-feature \
384     --exclude-ref=refs/heads/master
385
386   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
387
388   refute_local_object "$md_feature_oid" "31"
389   refute_local_object "$md_master_oid" "21"
390   assert_local_object "$txt_feature_oid" "30"
391   refute_local_object "$txt_master_oid" "20"
392   refute_local_object "$md_remote_oid" "11"
393   refute_local_object "$txt_remote_oid" "10"
394
395   master="$(git rev-parse refs/heads/master)"
396   feature="$(git rev-parse refs/heads/my-feature)"
397   remote="$(git rev-parse refs/remotes/origin/master)"
398
399   [ ! $(git cat-file -p "$master:.gitattributes") ]
400   [ ! $(git cat-file -p "$remote:.gitattributes") ]
401   feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
402
403   echo "$feature_attrs" | grep -vq "*.md filter=lfs diff=lfs merge=lfs"
404   echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
405 )
406 end_test
407
408 begin_test "migrate import (existing .gitattributes)"
409 (
410   set -e
411
412   setup_local_branch_with_gitattrs
413
414   pwd
415
416   master="$(git rev-parse refs/heads/master)"
417
418   txt_master_oid="$(calc_oid "$(git cat-file -p "$master:a.txt")")"
419
420   git lfs migrate import --yes --include-ref=refs/heads/master --include="*.txt"
421
422   assert_local_object "$txt_master_oid" "120"
423
424   master="$(git rev-parse refs/heads/master)"
425   prev="$(git rev-parse refs/heads/master^1)"
426
427   diff -u <(git cat-file -p $master:.gitattributes) <(cat <<-EOF
428 *.txt filter=lfs diff=lfs merge=lfs -text
429 *.other filter=lfs diff=lfs merge=lfs -text
430 EOF)
431
432   diff -u <(git cat-file -p $prev:.gitattributes) <(cat <<-EOF
433 *.txt filter=lfs diff=lfs merge=lfs -text
434 EOF)
435 )
436 end_test
437
438 begin_test "migrate import (bare repository)"
439 (
440   set -e
441
442   setup_multiple_local_branches
443   make_bare
444
445   git lfs migrate import \
446     --include-ref=master
447 )
448 end_test
449
450 begin_test "migrate import (nested sub-trees, no filter)"
451 (
452   set -e
453
454   setup_single_local_branch_deep_trees
455
456   oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
457   size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
458
459   git lfs migrate import --everything
460
461   assert_local_object "$oid" "$size"
462 )
463 end_test
464
465 begin_test "migrate import (prefix include(s))"
466 (
467   set -e
468
469   includes="foo/bar/baz foo/**/baz/a.txt *.txt"
470   for include in $includes; do
471     setup_single_local_branch_deep_trees
472
473     oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
474
475     git lfs migrate import --include="$include"
476
477     assert_local_object "$oid" 120
478
479     cd ..
480   done
481 )
482 end_test
483
484 begin_test "migrate import (--everything)"
485 (
486   set -e
487
488   setup_multiple_local_branches
489   git checkout master
490
491   master_txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
492   master_md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
493   feature_md_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
494   master_txt_size="$(git cat-file -p :a.txt | wc -c | awk '{ print $1 }')"
495   master_md_size="$(git cat-file -p :a.md | wc -c | awk '{ print $1 }')"
496   feature_md_size="$(git cat-file -p my-feature:a.md | wc -c | awk '{ print $1 }')"
497
498   git lfs migrate import --everything
499
500   assert_pointer "master" "a.txt" "$master_txt_oid" "$master_txt_size"
501   assert_pointer "master" "a.md" "$master_md_oid" "$master_md_size"
502   assert_pointer "my-feature" "a.md" "$feature_md_oid" "$feature_md_size"
503 )
504 end_test
505
506 begin_test "migrate import (ambiguous reference)"
507 (
508   set -e
509
510   setup_multiple_local_branches
511
512   # Create an ambiguously named reference sharing the name as the SHA-1 of
513   # "HEAD".
514   sha="$(git rev-parse HEAD)"
515   git tag "$sha"
516
517   git lfs migrate import --everything
518 )
519 end_test
520
521 begin_test "migrate import (--everything with args)"
522 (
523   set -e
524
525   setup_multiple_local_branches
526
527   [ "$(git lfs migrate import --everything master 2>&1)" = \
528     "fatal: cannot use --everything with explicit reference arguments" ]
529 )
530 end_test
531
532 begin_test "migrate import (--everything with --include-ref)"
533 (
534   set -e
535
536   setup_multiple_local_branches
537
538   [ "$(git lfs migrate import --everything --include-ref=refs/heads/master 2>&1)" = \
539     "fatal: cannot use --everything with --include-ref or --exclude-ref" ]
540 )
541 end_test
542
543 begin_test "migrate import (--everything with --exclude-ref)"
544 (
545   set -e
546
547   setup_multiple_local_branches
548
549   [ "$(git lfs migrate import --everything --exclude-ref=refs/heads/master 2>&1)" = \
550     "fatal: cannot use --everything with --include-ref or --exclude-ref" ]
551 )
552 end_test
553
554 begin_test "migrate import (--everything and --include with glob pattern)"
555 (
556   set -e
557
558   setup_multiple_local_branches
559
560   md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
561   txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
562   md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
563   txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
564
565   git lfs migrate import --verbose --everything --include='*.[mM][dD]'
566
567   assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "140"
568   assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
569
570   assert_local_object "$md_master_oid" "140"
571   assert_local_object "$md_feature_oid" "30"
572   refute_local_object "$txt_master_oid"
573   refute_local_object "$txt_feature_oid"
574 )
575 end_test
576
577 begin_test "migrate import (nested sub-trees and --include with wildcard)"
578 (
579   set -e
580
581   setup_single_local_branch_deep_trees
582
583   oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
584   size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
585
586   git lfs migrate import --include="**/*ar/**"
587
588   assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid" "$size"
589   assert_local_object "$oid" "$size"
590 )
591 end_test
592
593 begin_test "migrate import (handle copies of files)"
594 (
595   set -e
596
597   setup_single_local_branch_deep_trees
598
599   # add the object from the sub-tree to the root directory
600   cp foo/bar/baz/a.txt a.txt
601   git add a.txt
602   git commit -m "duplicated file"
603
604   oid_root="$(calc_oid "$(git cat-file -p :a.txt)")"
605   oid_tree="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
606   size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
607
608   # only import objects under "foo"
609   git lfs migrate import --include="foo/**"
610
611   assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid_tree" "$size"
612   assert_local_object "$oid_tree" "$size"
613
614   # "a.txt" is not under "foo" and therefore should not be in LFS
615   oid_root_after_migration="$(calc_oid "$(git cat-file -p :a.txt)")"
616   [ "$oid_root" = "$oid_root_after_migration" ]
617 )
618 end_test
619
620 begin_test "migrate import (--object-map)"
621 (
622   set -e
623
624   setup_multiple_local_branches
625
626   output_dir=$(mktemp -d)
627
628   git log --all --pretty='format:%H' > "${output_dir}/old_sha.txt"
629   git lfs migrate import --everything --object-map "${output_dir}/object-map.txt"
630   git log --all --pretty='format:%H' > "${output_dir}/new_sha.txt"
631   paste -d',' "${output_dir}/old_sha.txt" "${output_dir}/new_sha.txt" > "${output_dir}/expected-map.txt"
632
633   diff -u <(sort "${output_dir}/expected-map.txt") <(sort "${output_dir}/object-map.txt")
634 )
635 end_test
636
637 begin_test "migrate import (--include with space)"
638 (
639   set -e
640
641   setup_local_branch_with_space
642
643   oid="$(calc_oid "$(git cat-file -p :"a file.txt")")"
644
645   git lfs migrate import --include "a file.txt"
646
647   assert_pointer "refs/heads/master" "a file.txt" "$oid" 50
648   cat .gitattributes
649   if [ 1 -ne "$(grep -c "a\[\[:space:\]\]file.txt" .gitattributes)" ]; then
650     echo >&2 "fatal: expected \"a[[:space:]]file.txt\" to appear in .gitattributes"
651     echo >&2 "fatal: got"
652     sed -e 's/^/  /g' < .gitattributes >&2
653     exit 1
654   fi
655 )
656 end_test
657
658 begin_test "migrate import (handle symbolic link)"
659 (
660   set -e
661
662   setup_local_branch_with_symlink
663
664   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
665   link_oid="$(calc_oid "$(git cat-file -p :link.txt)")"
666
667   git lfs migrate import --include="*.txt"
668
669   assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
670
671   assert_local_object "$txt_oid" "120"
672   # "link.txt" is a symbolic link so it should be not in LFS
673   refute_local_object "$link_oid" "5"
674 )
675 end_test
676
677 begin_test "migrate import (commit --allow-empty)"
678 (
679   set -e
680
681   reponame="migrate---allow-empty"
682   git init "$reponame"
683   cd "$reponame"
684
685   git commit --allow-empty -m "initial commit"
686
687   original_head="$(git rev-parse HEAD)"
688   git lfs migrate import --everything
689   migrated_head="$(git rev-parse HEAD)"
690
691   assert_ref_unmoved "HEAD" "$original_head" "$migrated_head"
692 )
693 end_test
694
695 begin_test "migrate import (multiple remotes)"
696 (
697   set -e
698
699   setup_multiple_remotes
700
701   original_master="$(git rev-parse master)"
702
703   git lfs migrate import
704
705   migrated_master="$(git rev-parse master)"
706
707   assert_ref_unmoved "master" "$original_master" "$migrated_master"
708 )
709 end_test
710
711 begin_test "migrate import (dirty copy, negative answer)"
712 (
713   set -e
714
715   setup_local_branch_with_dirty_copy
716
717   original_master="$(git rev-parse master)"
718
719   echo "n" | git lfs migrate import --everything 2>&1 | tee migrate.log
720   grep "migrate: working copy must not be dirty" migrate.log
721
722   migrated_master="$(git rev-parse master)"
723
724   assert_ref_unmoved "master" "$original_master" "$migrated_master"
725 )
726 end_test
727
728 begin_test "migrate import (dirty copy, unknown then negative answer)"
729 (
730   set -e
731
732   setup_local_branch_with_dirty_copy
733
734   original_master="$(git rev-parse master)"
735
736   echo "x\nn" | git lfs migrate import --everything 2>&1 | tee migrate.log
737
738   cat migrate.log
739
740   [ "2" -eq "$(grep -o "override changes in your working copy" migrate.log \
741     | wc -l | awk '{ print $1 }')" ]
742   grep "migrate: working copy must not be dirty" migrate.log
743
744   migrated_master="$(git rev-parse master)"
745
746   assert_ref_unmoved "master" "$original_master" "$migrated_master"
747 )
748 end_test
749
750 begin_test "migrate import (dirty copy, positive answer)"
751 (
752   set -e
753
754   setup_local_branch_with_dirty_copy
755
756   oid="$(calc_oid "$(git cat-file -p :a.txt)")"
757
758   echo "y" | git lfs migrate import --everything 2>&1 | tee migrate.log
759   grep "migrate: changes in your working copy will be overridden ..." \
760     migrate.log
761
762   assert_pointer "refs/heads/master" "a.txt" "$oid" "5"
763   assert_local_object "$oid" "5"
764 )
765 end_test
766
767 begin_test "migrate import (non-standard refs)"
768 (
769   set -e
770
771   setup_multiple_local_branches_non_standard
772
773   md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
774   txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
775   md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
776
777   git lfs migrate import --everything
778
779   assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
780   assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
781   assert_pointer "refs/pull/1/base" "a.md" "$md_oid" "140"
782   assert_pointer "refs/pull/1/base" "a.txt" "$txt_oid" "120"
783
784   assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
785   assert_pointer "refs/pull/1/head" "a.txt" "$txt_oid" "120"
786
787   assert_local_object "$md_oid" "140"
788   assert_local_object "$txt_oid" "120"
789   assert_local_object "$md_feature_oid" "30"
790 )
791 end_test