git-lfs/t/t-pointer.sh
Taylor Blau c5bfafb83d commands/command_pointer.go: introduce --check option
We have used the 'git-lfs-pointer(1)' command historically to compare
varying implementation of the Git LFS protocol. This has been done by
passing both `--file` and `--stdin` to the command, which will in turn
compare the contents of both handles and return appropriately whether
they are the same or different.

One use case that Git LFS pointer does not yet support directly is
_checking_ to see whether a given file is a valid Git LFS pointer. This
is a different use-case than before, since we aren't doing any
comparison, we're simply checking whether the official implementation of
Git LFS can parse a given stream as a pointer.

As an aside, one way to do this today is the following:

  $ git lfs clean < a.txt | git lfs pointer --stdin --file my.ptr

Where we first generate a pointer of the file 'a.txt' (via
`git-lfs-clean(1)`), and then redirect that to `git-lfs-pointer(1)`
against our own file.

Let's make this above incantation easier to execute by providing a
functionally equivalent `--check` option. Running `git lfs pointer
--check` (and passing either `--file`, or `--stdin`) will return either
1 or 0 depending on whether or not the given pointer file was invalid or
not.
2019-01-31 19:36:01 -08:00

358 lines
7.9 KiB
Bash
Executable File

#!/usr/bin/env bash
. "$(dirname "$0")/testlib.sh"
begin_test "pointer --file --stdin"
(
set -e
echo "simple" > some-file
input="version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7"
expected="Git LFS pointer for some-file
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee
Pointer from STDIN
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee"
[ "$expected" = "$(echo "$input" | git lfs pointer --file=some-file --stdin 2>&1)" ]
)
end_test
begin_test "pointer --file --stdin mismatch"
(
set -e
echo "simple" > some-file
input="version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 123"
set +e
output=$(echo "$input" | git lfs pointer --file=some-file --stdin 2>&1)
status=$?
set -e
[ "1" = "$status" ]
expected="Git LFS pointer for some-file
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee
Pointer from STDIN
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 123
Git blob OID: 905bcc24b5dc074ab870f9944178e398eec3b470
Pointers do not match"
[ "$expected" = "$output" ]
)
end_test
begin_test "pointer --stdin"
(
set -e
echo "version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7" > valid-pointer
output=$(cat valid-pointer | git lfs pointer --stdin 2>&1)
expected="Pointer from STDIN
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7"
[ "$expected" = "$output" ]
)
end_test
begin_test "pointer --stdin without stdin"
(
# this test doesn't work on Windows, it just operates like 'bad pointer' case
# stdin isn't detectable as detached, it just times out with no content
if [[ "$(is_stdin_attached)" == "0" ]]; then
echo "Skipping pointer without stdin because STDIN attached"
exit 0
fi
output=$(echo "" | git lfs pointer --stdin 2>&1)
status=$?
set -e
expected="Cannot read from STDIN. The --stdin flag expects a pointer file from STDIN."
[ "$expected" = "$output" ]
[ "1" = "$status" ]
)
end_test
begin_test "pointer --stdin with bad pointer"
(
output=$(echo "not a pointer" | git lfs pointer --stdin 2>&1)
status=$?
set -e
expected="Pointer from STDIN
Pointer file error: invalid header"
diff -u <(printf "%s" "$expected") <(printf "%s" "$output")
[ "1" = "$status" ]
)
end_test
begin_test "pointer --file --pointer mismatch"
(
set -e
echo "simple" > some-file
echo "version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 123" > invalid-pointer
expected="Git LFS pointer for some-file
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee
Pointer from invalid-pointer
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 123
Git blob OID: 905bcc24b5dc074ab870f9944178e398eec3b470
Pointers do not match"
set +e
output=$(git lfs pointer --file=some-file --pointer=invalid-pointer 2>&1)
status=$?
set -e
[ "1" = "$status" ]
[ "$expected" = "$output" ]
)
end_test
begin_test "pointer --file --pointer"
(
set -e
echo "simple" > some-file
echo "version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7" > valid-pointer
expected="Git LFS pointer for some-file
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee
Pointer from valid-pointer
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7
Git blob OID: e18acd45d7e3ce0451d1d637f9697aa508e07dee"
[ "$expected" = "$(git lfs pointer --file=some-file --pointer=valid-pointer 2>&1)" ]
)
end_test
begin_test "pointer --pointer"
(
set -e
echo "version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7" > valid-pointer
expected="Pointer from valid-pointer
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7"
[ "$expected" = "$(git lfs pointer --pointer=valid-pointer 2>&1)" ]
)
end_test
begin_test "pointer missing --pointer"
(
output=$(git lfs pointer --pointer=missing-pointer 2>&1)
status=$?
set -e
[ "1" = "$status" ]
echo "$output"
echo "$output" | grep "open missing-pointer:"
)
end_test
begin_test "pointer invalid --pointer"
(
set -e
echo "not a pointer" > some-pointer
set +e
output=$(git lfs pointer --pointer=some-pointer 2>&1)
status=$?
set -e
[ "1" = "$status" ]
expected="Pointer from some-pointer
Pointer file error: invalid header"
diff -u <(printf "%s" "$expected") <(printf "%s" "$output")
[ "$expected" = "$output" ]
)
end_test
begin_test "pointer --file"
(
set -e
echo "simple" > some-file
expected="Git LFS pointer for some-file
version https://git-lfs.github.com/spec/v1
oid sha256:6c17f2007cbe934aee6e309b28b2dba3c119c5dff2ef813ed124699efe319868
size 7"
[ "$expected" = "$(git lfs pointer --file=some-file 2>&1)" ]
)
end_test
begin_test "pointer without args"
(
output=$(git lfs pointer 2>&1)
status=$?
set -e
[ "Nothing to do!" = "$output" ]
[ "1" = "$status" ]
)
end_test
begin_test "pointer stdout/stderr"
(
set -e
echo "pointer-stdout-test" > pointer-stdout-test.txt
git lfs pointer --file=pointer-stdout-test.txt > stdout.txt 2> stderr.txt
echo "stdout:"
cat stdout.txt
[ $(wc -l stdout.txt | sed -e 's/^[[:space:]]*//' | cut -f1 -d' ') -eq 3 ]
grep "oid sha256:e96ec1bd71eea8df78b24c64a7ab9d42dd7f821c4e503f0e2288273b9bff6c16" stdout.txt
[ $(grep -c "Git LFS pointer" stdout.txt) -eq 0 ]
echo "stderr:"
cat stderr.txt
grep "Git LFS pointer" stderr.txt
[ $(grep -c "oid sha256:" stderr.txt) -eq 0 ]
)
end_test
begin_test "pointer to console"
(
set -e
echo "pointer-stdout-test" > pointer-stdout-test.txt
git lfs pointer --file=pointer-stdout-test.txt 2>&1 | tee pointer.txt
grep "Git LFS pointer" pointer.txt
grep "oid sha256:e96ec1bd71eea8df78b24c64a7ab9d42dd7f821c4e503f0e2288273b9bff6c16" pointer.txt
)
end_test
begin_test "pointer --check (with valid pointer)"
(
set -e
reponame="pointer---check-valid-pointer"
git init "$reponame"
cd "$reponame"
echo "contents" > good.txt
git lfs pointer --file good.txt > good.ptr
cat good.ptr
git lfs pointer --check --file good.ptr
git lfs pointer --check --stdin < good.ptr
)
end_test
begin_test "pointer --check (with invalid pointer)"
(
set -e
reponame="pointer---check-invalid-pointer"
git init "$reponame"
cd "$reponame"
echo "not-a-pointer" > bad.ptr
! git lfs pointer --check --file bad.ptr
! git lfs pointer --check --stdin < bad.ptr
)
end_test
begin_test "pointer --check (with invalid arguments)"
(
set -e
reponame="pointer---check-invalid-pointer"
git init "$reponame"
cd "$reponame"
touch a.txt
# git-lfs-pointer(1) --check with invalid combination --compare
! git lfs pointer --check --compare
# git-lfs-pointer(1) --check without --file or --stdin
! git lfs pointer --check
# git-lfs-pointer(1) --check with --file and --stdin
! git lfs pointer --check --file a.txt --stdin
)
end_test