git-lfs/t/t-smudge.sh
brian m. carlson f6f4f6a8e4
Fix remote autoselection when not on a branch
We currently have code that determines which remote to us automatically.
For example, if there is only one remote, we want to use it, no matter
what it's named, because there's no other logical choice.

However, if we were not on any branch, we'd always end up picking
"origin", even if that remote didn't exist. This appears to have been
because we wanted to avoid a lookup with an empty branch name in the
configuration. Doing so is harmless, though, so let's simply check that
the branch name isn't empty before we execute that condition, and fall
back to the rest of the checks if it is. This ensures that we always
pick the only remote when there's just one.
2019-08-07 15:49:37 +00:00

253 lines
6.2 KiB
Bash
Executable File

#!/usr/bin/env bash
. "$(dirname "$0")/testlib.sh"
begin_test "smudge"
(
set -e
reponame="$(basename "$0" ".sh")"
setup_remote_repo "$reponame"
clone_repo "$reponame" repo
git lfs track "*.dat"
echo "smudge a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
# smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
output="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | git lfs smudge)"
[ "smudge a" = "$output" ]
git push origin master
# download it from the git lfs server
rm -rf .git/lfs/objects
output="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | git lfs smudge)"
[ "smudge a" = "$output" ]
)
end_test
begin_test "smudge with temp file"
(
set -e
cd repo
rm -rf .git/lfs/objects
mkdir -p .git/lfs/tmp/objects
touch .git/lfs/tmp/objects/fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254-1
pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9 | GIT_TRACE=5 git lfs smudge | tee smudge.log
[ "smudge a" = "$(cat smudge.log)" ] || {
rm -rf .git/lfs/tmp
git lfs logs last
exit 1
}
)
end_test
begin_test "smudge with invalid pointer"
(
set -e
cd repo
[ "wat" = "$(echo "wat" | git lfs smudge)" ]
[ "not a git-lfs file" = "$(echo "not a git-lfs file" | git lfs smudge)" ]
[ "version " = "$(echo "version " | git lfs smudge)" ]
)
end_test
begin_test "smudge include/exclude"
(
set -e
reponame="$(basename "$0" ".sh")-includeexclude"
setup_remote_repo "$reponame"
clone_repo "$reponame" includeexclude
git lfs track "*.dat"
echo "smudge a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
# smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
[ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
git push origin master
# this WOULD download except we're going to prevent it with include/exclude
rm -rf .git/lfs/objects
git config "lfs.fetchexclude" "a*"
[ "$pointer" = "$(echo "$pointer" | git lfs smudge a.dat)" ]
)
end_test
begin_test "smudge with skip"
(
set -e
reponame="$(basename "$0" ".sh")-skip"
setup_remote_repo "$reponame"
clone_repo "$reponame" "skip"
git lfs track "*.dat"
echo "smudge a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
[ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
git push origin master
# Must clear the cache because smudge will use
# cached objects even with --skip/GIT_LFS_SKIP_SMUDGE
# (--skip applies to whether or not it downloads).
rm -rf .git/lfs/objects
[ "$pointer" = "$(echo "$pointer" | GIT_LFS_SKIP_SMUDGE=1 git lfs smudge)" ]
echo "test clone with env"
export GIT_LFS_SKIP_SMUDGE=1
env | grep LFS_SKIP
clone_repo "$reponame" "skip-clone-env"
[ "$pointer" = "$(cat a.dat)" ]
git lfs pull
[ "smudge a" = "$(cat a.dat)" ]
echo "test clone without env"
unset GIT_LFS_SKIP_SMUDGE
clone_repo "$reponame" "no-skip"
[ "smudge a" = "$(cat a.dat)" ]
echo "test clone with init --skip-smudge"
git lfs install --skip-smudge
clone_repo "$reponame" "skip-clone-init"
[ "$pointer" = "$(cat a.dat)" ]
git lfs install --force
)
end_test
begin_test "smudge clone with include/exclude"
(
set -e
reponame="smudge_include_exclude"
setup_remote_repo "$reponame"
clone_repo "$reponame" "repo_$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \"\*.dat\"" track.log
contents="a"
contents_oid=$(calc_oid "$contents")
printf "%s" "$contents" > a.dat
git add a.dat
git add .gitattributes
git commit -m "add a.dat" 2>&1 | tee commit.log
grep "master (root-commit)" commit.log
grep "2 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
[ "a" = "$(cat a.dat)" ]
assert_local_object "$contents_oid" 1
git push origin master 2>&1 | tee push.log
grep "Uploading LFS objects: 100% (1/1), 1 B" push.log
grep "master -> master" push.log
assert_server_object "$reponame" "$contents_oid"
clone="$TRASHDIR/clone_$reponame"
git -c lfs.fetchexclude="a*" clone "$GITSERVER/$reponame" "$clone"
cd "$clone"
# Should have succeeded but not downloaded
refute_local_object "$contents_oid"
)
end_test
begin_test "smudge skip download failure"
(
set -e
reponame="$(basename "$0" ".sh")-skipdownloadfail"
setup_remote_repo "$reponame"
clone_repo "$reponame" skipdownloadfail
git lfs track "*.dat"
echo "smudge a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
pointer="$(pointer fcf5015df7a9089a7aa7fe74139d4b8f7d62e52d5a34f9a87aeffc8e8c668254 9)"
# smudge works even though it hasn't been pushed, by reading from .git/lfs/objects
[ "smudge a" = "$(echo "$pointer" | git lfs smudge)" ]
git push origin master
# make it try to download but we're going to make it fail
rm -rf .git/lfs/objects
git remote set-url origin httpnope://nope.com/nope
# this should fail
set +e
echo "$pointer" | git lfs smudge a.dat; test ${PIPESTATUS[1]} -ne 0
set -e
git config lfs.skipdownloaderrors true
echo "$pointer" | git lfs smudge a.dat
# check content too
[ "$pointer" = "$(echo "$pointer" | git lfs smudge a.dat)" ]
# now try env var
git config --unset lfs.skipdownloaderrors
echo "$pointer" | GIT_LFS_SKIP_DOWNLOAD_ERRORS=1 git lfs smudge a.dat
)
end_test
begin_test "smudge no ref, non-origin"
(
set -e
reponame="$(basename "$0" ".sh")-no-ref-non-origin"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame-1"
git lfs track "*.dat"
echo "smudge a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
git push origin master
master=$(git rev-parse master)
cd ..
git init "$reponame"
cd "$reponame"
# We intentionally pick a name that is not origin to exercise the remote
# selection code path. Since there is only one remote, we should use it
# regardless of its name
git config remote.random.url "$GITSERVER/$reponame"
git fetch "$GITSERVER/$reponame"
git checkout "$master"
[ "smudge a" = "$(cat a.dat)" ]
)
end_test