git-lfs/t/t-checkout.sh

275 lines
7.5 KiB
Bash
Raw Normal View History

2015-07-30 02:37:31 +00:00
#!/usr/bin/env bash
2015-07-27 16:26:55 +00:00
. "$(dirname "$0")/testlib.sh"
2015-07-27 16:26:55 +00:00
begin_test "checkout"
(
set -e
reponame="$(basename "$0" ".sh")"
setup_remote_repo "$reponame"
clone_repo "$reponame" repo
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \"\*.dat\"" track.log
2015-07-27 16:26:55 +00:00
contents="something something"
contentsize=19
contents_oid=$(calc_oid "$contents")
2015-07-27 16:26:55 +00:00
# Same content everywhere is ok, just one object in lfs db
printf "%s" "$contents" > file1.dat
printf "%s" "$contents" > file2.dat
printf "%s" "$contents" > file3.dat
2015-07-27 16:26:55 +00:00
mkdir folder1 folder2
printf "%s" "$contents" > folder1/nested.dat
printf "%s" "$contents" > folder2/nested.dat
2015-07-27 16:26:55 +00:00
git add file1.dat file2.dat file3.dat folder1/nested.dat folder2/nested.dat
git add .gitattributes
git commit -m "add files"
[ "$contents" = "$(cat file1.dat)" ]
[ "$contents" = "$(cat file2.dat)" ]
[ "$contents" = "$(cat file3.dat)" ]
[ "$contents" = "$(cat folder1/nested.dat)" ]
[ "$contents" = "$(cat folder2/nested.dat)" ]
assert_pointer "main" "file1.dat" "$contents_oid" $contentsize
2015-07-27 16:26:55 +00:00
# Remove the working directory
rm -rf file1.dat file2.dat file3.dat folder1/nested.dat folder2/nested.dat
echo "checkout should replace all"
GIT_TRACE=1 git lfs checkout 2>&1 | tee checkout.log
2015-07-27 16:26:55 +00:00
[ "$contents" = "$(cat file1.dat)" ]
[ "$contents" = "$(cat file2.dat)" ]
[ "$contents" = "$(cat file3.dat)" ]
[ "$contents" = "$(cat folder1/nested.dat)" ]
[ "$contents" = "$(cat folder2/nested.dat)" ]
grep "Checking out LFS objects: 100% (5/5), 95 B" checkout.log
grep 'accepting "file1.dat"' checkout.log
! grep 'rejecting "file1.dat"' checkout.log
2015-07-27 16:26:55 +00:00
# Remove the working directory
rm -rf file1.dat file2.dat file3.dat folder1/nested.dat folder2/nested.dat
echo "checkout with filters"
git lfs checkout file2.dat
[ "$contents" = "$(cat file2.dat)" ]
[ ! -f file1.dat ]
[ ! -f file3.dat ]
[ ! -f folder1/nested.dat ]
[ ! -f folder2/nested.dat ]
echo "quotes to avoid shell globbing"
git lfs checkout "file*.dat"
[ "$contents" = "$(cat file1.dat)" ]
[ "$contents" = "$(cat file3.dat)" ]
[ ! -f folder1/nested.dat ]
[ ! -f folder2/nested.dat ]
echo "test subdir context"
pushd folder1
git lfs checkout nested.dat
[ "$contents" = "$(cat nested.dat)" ]
[ ! -f ../folder2/nested.dat ]
# test '.' in current dir
rm nested.dat
git lfs checkout . 2>&1 | tee checkout.log
[ "$contents" = "$(cat nested.dat)" ]
popd
echo "test folder param"
git lfs checkout folder2
[ "$contents" = "$(cat folder2/nested.dat)" ]
echo "test '.' in current dir"
rm -rf file1.dat file2.dat file3.dat folder1/nested.dat folder2/nested.dat
git lfs checkout .
[ "$contents" = "$(cat file1.dat)" ]
[ "$contents" = "$(cat file2.dat)" ]
[ "$contents" = "$(cat file3.dat)" ]
[ "$contents" = "$(cat folder1/nested.dat)" ]
[ "$contents" = "$(cat folder2/nested.dat)" ]
echo "test checkout with missing data doesn't fail"
git push origin main
rm -rf .git/lfs/objects
rm file*.dat
git lfs checkout
[ "$(pointer $contents_oid $contentsize)" = "$(cat file1.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat file2.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat file3.dat)" ]
[ "$contents" = "$(cat folder1/nested.dat)" ]
[ "$contents" = "$(cat folder2/nested.dat)" ]
)
end_test
begin_test "checkout: without clean filter"
(
set -e
reponame="$(basename "$0" ".sh")"
git lfs uninstall
git clone "$GITSERVER/$reponame" checkout-without-clean
cd checkout-without-clean
echo "checkout without clean filter"
git lfs uninstall
git config --list > config.txt
grep "filter.lfs.clean" config.txt && {
echo "clean filter still configured:"
cat config.txt
exit 1
}
ls -al
git lfs checkout | tee checkout.txt
grep "Git LFS is not installed" checkout.txt
if [ "0" -ne "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected checkout to succeed ..."
exit 1
fi
contentsize=19
contents_oid=$(calc_oid "something something")
[ "$(pointer $contents_oid $contentsize)" = "$(cat file1.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat file2.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat file3.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat folder1/nested.dat)" ]
[ "$(pointer $contents_oid $contentsize)" = "$(cat folder2/nested.dat)" ]
2015-07-27 16:26:55 +00:00
)
end_test
begin_test "checkout: outside git repository"
(
2015-09-08 16:20:52 +00:00
set +e
git lfs checkout 2>&1 > checkout.log
res=$?
set -e
if [ "$res" = "0" ]; then
echo "Passes because $GIT_LFS_TEST_DIR is unset."
exit 0
fi
2015-09-08 16:20:52 +00:00
[ "$res" = "128" ]
grep "Not in a git repository" checkout.log
)
end_test
begin_test "checkout: write-only file"
(
set -e
reponame="checkout-locked"
filename="a.txt"
setup_remote_repo_with_file "$reponame" "$filename"
pushd "$TRASHDIR" > /dev/null
GIT_LFS_SKIP_SMUDGE=1 clone_repo "$reponame" "${reponame}_checkout"
chmod -w "$filename"
refute_file_writeable "$filename"
assert_pointer "refs/heads/main" "$filename" "$(calc_oid "$filename\n")" 6
git lfs fetch
git lfs checkout "$filename"
refute_file_writeable "$filename"
[ "$filename" = "$(cat "$filename")" ]
popd > /dev/null
)
end_test
begin_test "checkout: conflicts"
(
set -e
reponame="checkout-conflicts"
filename="file1.dat"
setup_remote_repo_with_file "$reponame" "$filename"
pushd "$TRASHDIR" > /dev/null
clone_repo "$reponame" "${reponame}_checkout"
git tag base
git checkout -b first
echo "abc123" > file1.dat
git add -u
echo "first" > other.txt
git add other.txt
git commit -m "first"
git lfs checkout --to base.txt 2>&1 | tee output.txt
grep -- '--to and exactly one of --theirs, --ours, and --base must be used together' output.txt
git lfs checkout --base 2>&1 | tee output.txt
grep -- '--to and exactly one of --theirs, --ours, and --base must be used together' output.txt
git lfs checkout --to base.txt --ours --theirs 2>&1 | tee output.txt
grep -- 'at most one of --base, --theirs, and --ours is allowed' output.txt
git lfs checkout --to base.txt --base 2>&1 | tee output.txt
grep -- '--to requires exactly one Git LFS object file path' output.txt
git lfs checkout --to base.txt --base 2>&1 abc def | tee output.txt
grep -- '--to requires exactly one Git LFS object file path' output.txt
git lfs checkout --to base.txt --base file1.dat 2>&1 | tee output.txt
grep 'Could not checkout.*not in the middle of a merge' output.txt
git checkout -b second main
echo "def456" > file1.dat
git add -u
echo "second" > other.txt
git add other.txt
git commit -m "second"
# This will cause a conflict.
! git merge first
git lfs checkout --to base.txt --base file1.dat
git lfs checkout --to ours.txt --ours file1.dat
git lfs checkout --to theirs.txt --theirs file1.dat
echo "file1.dat" | cmp - base.txt
echo "abc123" | cmp - theirs.txt
echo "def456" | cmp - ours.txt
git lfs checkout --to base.txt --ours other.txt 2>&1 | tee output.txt
grep 'Could not find decoder pointer for object' output.txt
popd > /dev/null
)
end_test
begin_test "checkout: GIT_WORK_TREE"
(
set -e
reponame="checkout-work-tree"
remotename="$(basename "$0" ".sh")"
export GIT_WORK_TREE="$reponame" GIT_DIR="$reponame-git"
mkdir "$GIT_WORK_TREE" "$GIT_DIR"
git init
git remote add origin "$GITSERVER/$remotename"
git lfs uninstall --skip-repo
git fetch origin
git checkout -B main origin/main
git lfs install
git lfs fetch
git lfs checkout
contents="something something"
[ "$contents" = "$(cat "$reponame/file1.dat")" ]
)
end_test