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

     1  #!/usr/bin/env bash
     2  
     3  . "$(dirname "$0")/testlib.sh"
     4  
     5  begin_test "smudge"
     6  (
     7    set -e
     8  
     9    reponame="$(basename "$0" ".sh")"
    10    setup_remote_repo "$reponame"
    11    clone_repo "$reponame" repo
    12  
    13    git lfs track "*.dat"
    14    echo "smudge a" > a.dat
    15    git add .gitattributes a.dat
    16    git commit -m "add a.dat"
    17  
    18    # smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
    19    output="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | git lfs smudge)"
    20    [ "smudge a" = "$output" ]
    21  
    22    git push origin master
    23  
    24    # download it from the git lfs server
    25    rm -rf .git/lfs/objects
    26    output="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | git lfs smudge)"
    27    [ "smudge a" = "$output" ]
    28  )
    29  end_test
    30  
    31  begin_test "smudge with temp file"
    32  (
    33    set -e
    34  
    35    cd repo
    36  
    37    rm -rf .git/lfs/objects
    38    mkdir -p .git/lfs/tmp/objects
    39    touch .git/lfs/tmp/objects/fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254-1
    40    pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | GIT_TRACE=5 git lfs smudge | tee smudge.log
    41    [ "smudge a" = "$(cat smudge.log)" ] || {
    42      rm -rf .git/lfs/tmp
    43      git lfs logs last
    44      exit 1
    45    }
    46  )
    47  end_test
    48  
    49  begin_test "smudge with invalid pointer"
    50  (
    51    set -e
    52  
    53    cd repo
    54    [ "wat" = "$(echo "wat" | git lfs smudge)" ]
    55    [ "not a git-lfs file" = "$(echo "not a git-lfs file" | git lfs smudge)" ]
    56    [ "version " = "$(echo "version " | git lfs smudge)" ]
    57  )
    58  end_test
    59  
    60  begin_test "smudge include/exclude"
    61  (
    62    set -e
    63  
    64    reponame="$(basename "$0" ".sh")-includeexclude"
    65    setup_remote_repo "$reponame"
    66    clone_repo "$reponame" includeexclude
    67  
    68    git lfs track "*.dat"
    69    echo "smudge a" > a.dat
    70    git add .gitattributes a.dat
    71    git commit -m "add a.dat"
    72  
    73    pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
    74  
    75    # smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
    76    [ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
    77  
    78    git push origin master
    79  
    80    # this WOULD download except we're going to prevent it with include/exclude
    81    rm -rf .git/lfs/objects
    82    git config "lfs.fetchexclude" "a*"
    83  
    84    [ "$pointer" = "$(echo "$pointer" | git lfs smudge a.dat)" ]
    85  )
    86  end_test
    87  
    88  begin_test "smudge with skip"
    89  (
    90    set -e
    91  
    92    reponame="$(basename "$0" ".sh")-skip"
    93    setup_remote_repo "$reponame"
    94    clone_repo "$reponame" "skip"
    95  
    96    git lfs track "*.dat"
    97    echo "smudge a" > a.dat
    98    git add .gitattributes a.dat
    99    git commit -m "add a.dat"
   100  
   101    pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
   102    [ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
   103  
   104    git push origin master
   105  
   106    # Must clear the cache because smudge will use
   107    # cached objects even with --skip/GIT_LFS_SKIP_SMUDGE
   108    # (--skip applies to whether or not it downloads).
   109    rm -rf .git/lfs/objects
   110  
   111    [ "$pointer" = "$(echo "$pointer" | GIT_LFS_SKIP_SMUDGE=1 git lfs smudge)" ]
   112  
   113    echo "test clone with env"
   114    export GIT_LFS_SKIP_SMUDGE=1
   115    env | grep LFS_SKIP
   116    clone_repo "$reponame" "skip-clone-env"
   117    [ "$pointer" = "$(cat a.dat)" ]
   118  
   119    git lfs pull
   120    [ "smudge a" = "$(cat a.dat)" ]
   121  
   122    echo "test clone without env"
   123    unset GIT_LFS_SKIP_SMUDGE
   124    [ "$(env | grep LFS_SKIP)" == "" ]
   125    clone_repo "$reponame" "no-skip"
   126    [ "smudge a" = "$(cat a.dat)" ]
   127  
   128    echo "test clone with init --skip-smudge"
   129    git lfs install --skip-smudge
   130    clone_repo "$reponame" "skip-clone-init"
   131    [ "$pointer" = "$(cat a.dat)" ]
   132  
   133    git lfs install --force
   134  )
   135  end_test
   136  
   137  begin_test "smudge clone with include/exclude"
   138  (
   139    set -e
   140  
   141    reponame="smudge_include_exclude"
   142    setup_remote_repo "$reponame"
   143  
   144    clone_repo "$reponame" "repo_$reponame"
   145  
   146    git lfs track "*.dat" 2>&1 | tee track.log
   147    grep "Tracking \"\*.dat\"" track.log
   148  
   149    contents="a"
   150    contents_oid=$(calc_oid "$contents")
   151  
   152    printf "$contents" > a.dat
   153    git add a.dat
   154    git add .gitattributes
   155    git commit -m "add a.dat" 2>&1 | tee commit.log
   156    grep "master (root-commit)" commit.log
   157    grep "2 files changed" commit.log
   158    grep "create mode 100644 a.dat" commit.log
   159    grep "create mode 100644 .gitattributes" commit.log
   160  
   161    [ "a" = "$(cat a.dat)" ]
   162  
   163    assert_local_object "$contents_oid" 1
   164  
   165    git push origin master 2>&1 | tee push.log
   166    grep "Uploading LFS objects: 100% (1/1), 1 B" push.log
   167    grep "master -> master" push.log
   168  
   169    assert_server_object "$reponame" "$contents_oid"
   170  
   171    clone="$TRASHDIR/clone_$reponame"
   172    git -c lfs.fetchexclude="a*" clone "$GITSERVER/$reponame" "$clone"
   173    cd "$clone"
   174  
   175    # Should have succeeded but not downloaded
   176    refute_local_object "$contents_oid"
   177  
   178  )
   179  end_test
   180  
   181  begin_test "smudge skip download failure"
   182  (
   183    set -e
   184  
   185    reponame="$(basename "$0" ".sh")-skipdownloadfail"
   186    setup_remote_repo "$reponame"
   187    clone_repo "$reponame" skipdownloadfail
   188  
   189    git lfs track "*.dat"
   190    echo "smudge a" > a.dat
   191    git add .gitattributes a.dat
   192    git commit -m "add a.dat"
   193  
   194    pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
   195  
   196    # smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
   197    [ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
   198  
   199    git push origin master
   200  
   201    # make it try to download but we're going to make it fail
   202    rm -rf .git/lfs/objects
   203    git remote set-url origin httpnope://nope.com/nope
   204  
   205    # this should fail
   206    set +e
   207    echo "$pointer" | git lfs smudge a.dat; test ${PIPESTATUS[1]} -ne 0
   208    set -e
   209  
   210    git config lfs.skipdownloaderrors true
   211    echo "$pointer" | git lfs smudge a.dat
   212  
   213    # check content too
   214    [ "$pointer" = "$(echo "$pointer" | git lfs smudge a.dat)" ]
   215  
   216    # now try env var
   217    git config --unset lfs.skipdownloaderrors
   218  
   219    echo "$pointer" | GIT_LFS_SKIP_DOWNLOAD_ERRORS=1 git lfs smudge a.dat
   220  
   221  )
   222  end_test