git-lfs/t/t-clean.sh
Chris Darroch fef4c0ff98 t: pipe data to base64 to be compatible with macOS
The base64(1) binary provided with macOS does not accept a bare input
file name, unlike any of the GNU coreutils implementations of base64(1)
or either the older Fourmilab or newer bintrans(1) BSD implementations.
Instead, it appears to be a version unique to OS X which requires an -i
option before a file name to be used for input.  See, for reference:

  https://www.unix.com/man-page/osx/1/base64/
  https://man7.org/linux/man-pages/man1/base64.1.html
  https://www.fourmilab.ch/webtools/base64/
  https://man.freebsd.org/cgi/man.cgi?query=base64&manpath=FreeBSD+15.0-CURRENT

With the Xcode developer tools for macOS installed, along with Go, Git,
etc., our test suite mostly succeeds, but several tests fail because
they expect to call base64(1) and pass the bare /dev/urandom file name.

We can resolve this inconvenience for developers by adjusting those
tests to use the technique we already use in the t/t-migrate-*.sh
test suites where we redirect /dev/urandom into base64 as its
standard input.  This allows the test suites to function on both
macOS as well as Linux systems which use one of the other base64(1)
implementations.
2024-01-10 20:29:43 -08:00

90 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
. "$(dirname "$0")/testlib.sh"
clean_setup () {
mkdir "$1"
cd "$1"
git init
}
begin_test "clean simple file"
(
set -e
clean_setup "simple"
echo "whatever" | git lfs clean | tee clean.log
[ "$(pointer cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411 9)" = "$(cat clean.log)" ]
)
end_test
begin_test "clean a pointer"
(
set -e
clean_setup "pointer"
pointer cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411 9 | git lfs clean | tee clean.log
[ "$(pointer cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411 9)" = "$(cat clean.log)" ]
)
end_test
begin_test "clean pseudo pointer"
(
set -e
clean_setup "pseudo"
echo "version https://git-lfs.github.com/spec/v1
oid sha256:7cd8be1d2cd0dd22cd9d229bb6b5785009a05e8b39d405615d882caac56562b5
size 1024
This is my test pointer. There are many like it, but this one is mine." | git lfs clean | tee clean.log
[ "$(pointer f492acbebb5faa22da4c1501c022af035469f624f426631f31936575873fefe1 202)" = "$(cat clean.log)" ]
)
end_test
begin_test "clean pseudo pointer with extra data"
(
set -e
clean_setup "extra-data"
# pointer includes enough extra data to fill the 'git lfs clean' buffer
printf "version https://git-lfs.github.com/spec/v1
oid sha256:7cd8be1d2cd0dd22cd9d229bb6b5785009a05e8b39d405615d882caac56562b5
size 1024
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
This is my test pointer. There are many like it, but this one is mine.\n" | git lfs clean | tee clean.log
[ "$(pointer c2f909f6961bf85a92e2942ef3ed80c938a3d0ebaee6e72940692581052333be 586)" = "$(cat clean.log)" ]
)
end_test
begin_test "clean stdin"
(
set -e
# git-lfs-clean(1) writes to .git/lfs/objects, and therefore must be executed
# within a repository.
reponame="clean-over-stdin"
git init "$reponame"
cd "$reponame"
base64 < /dev/urandom | head -c 1024 > small.dat
base64 < /dev/urandom | head -c 2048 > large.dat
expected_small="$(calc_oid_file "small.dat")"
expected_large="$(calc_oid_file "large.dat")"
actual_small="$(git lfs clean < "small.dat" | grep "oid" | cut -d ':' -f 2)"
actual_large="$(git lfs clean < "large.dat" | grep "oid" | cut -d ':' -f 2)"
if [ "$expected_small" != "$actual_small" ]; then
echo >&2 "fatal: expected small OID of: $expected_small, got: $actual_small"
exit 1
fi
if [ "$expected_large" != "$actual_large" ]; then
echo >&2 "fatal: expected large OID of: $expected_large, got: $actual_large"
exit 1
fi
)
end_test