github.com/git-lfs/git-lfs@v2.5.2+incompatible/t/t-migrate-import.sh (about)

     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