git-lfs/t/t-lock.sh
brian m. carlson 44fb9ecdc7
locking: add flag to control modification of ignored files
In a727fea2 ("locking: remove write permission for ignored files",
2018-08-20), we learned to set and clear the read-only attribute on
ignored files that match the lockable pattern, since "git lfs lock"
operates on pathspecs, not actual files.

However, in doing so, we caused a regression for people who have ignored
files (such as build files) which match the lockable pattern, but should
not have their permissions modified.  Since there is no easy way for us
to know if the user would like their files modified, add a config option
to control this behavior, and leave it at the historical (i.e.,
pre-a727fea2) default, off.  Add documentation accordingly.

Choosing the historical behavior is compatible with the most existing
use cases and preserves the behavior people expect with Git, which is
that it does not touch ignored files.
2019-01-25 15:02:48 +00:00

282 lines
6.5 KiB
Bash
Executable File

#!/usr/bin/env bash
. "$(dirname "$0")/testlib.sh"
begin_test "lock with good ref"
(
set -e
reponame="lock-master-branch-required"
setup_remote_repo_with_file "$reponame" "a.dat"
clone_repo "$reponame" "$reponame"
git lfs lock "a.dat" --json 2>&1 | tee lock.json
if [ "0" -ne "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected \'git lfs lock \'a.dat\'\' to succeed"
exit 1
fi
id=$(assert_lock lock.json a.dat)
assert_server_lock "$reponame" "$id" "refs/heads/master"
)
end_test
begin_test "lock with good tracked ref"
(
set -e
reponame="lock-tracked-branch-required"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
echo "a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
git config push.default upstream
git config branch.master.merge refs/heads/tracked
git push origin master
git lfs lock "a.dat" --json 2>&1 | tee lock.json
if [ "0" -ne "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected \'git lfs lock \'a.dat\'\' to succeed"
exit 1
fi
id=$(assert_lock lock.json a.dat)
assert_server_lock "$reponame" "$id" "refs/heads/tracked"
)
end_test
begin_test "lock with bad ref"
(
set -e
reponame="lock-other-branch-required"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
echo "a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
git push origin master:other
GIT_CURL_VERBOSE=1 git lfs lock "a.dat" 2>&1 | tee lock.json
if [ "0" -eq "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected \'git lfs lock \'a.dat\'\' to fail"
exit 1
fi
grep 'Lock failed: Expected ref "refs/heads/other", got "refs/heads/master"' lock.json
)
end_test
begin_test "create lock with server using client cert"
(
set -e
reponame="lock_create_client_cert"
setup_remote_repo_with_file "$reponame" "cc.dat"
git config lfs.url "$CLIENTCERTGITSERVER/$reponame.git/info/lfs"
git lfs lock --json "cc.dat" | tee lock.json
id=$(assert_lock lock.json cc.dat)
assert_server_lock "$reponame" "$id"
)
end_test
begin_test "creating a lock (with output)"
(
set -e
reponame="lock_create_simple_output"
setup_remote_repo_with_file "$reponame" "a_output.dat"
git lfs lock "a_output.dat" | tee lock.log
grep "Locked a_output.dat" lock.log
id=$(grep -oh "\((.*)\)" lock.log | tr -d \(\))
assert_server_lock "$reponame" "$id"
)
end_test
begin_test "locking a previously locked file"
(
set -e
reponame="lock_create_previously_created"
setup_remote_repo_with_file "$reponame" "b.dat"
git lfs lock --json "b.dat" | tee lock.json
id=$(assert_lock lock.json b.dat)
assert_server_lock "$reponame" "$id"
grep "lock already created" <(git lfs lock "b.dat" 2>&1)
)
end_test
begin_test "locking a directory"
(
set -e
reponame="locking_directories"
setup_remote_repo "remote_$reponame"
clone_repo "remote_$reponame" "clone_$reponame"
git lfs track "*.dat"
mkdir dir
echo "a" > dir/a.dat
git add dir/a.dat .gitattributes
git commit -m "add dir/a.dat" | tee commit.log
grep "master (root-commit)" commit.log
grep "2 files changed" commit.log
grep "create mode 100644 dir/a.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
git push origin master 2>&1 | tee push.log
grep "master -> master" push.log
git lfs lock ./dir/ 2>&1 | tee lock.log
grep "cannot lock directory" lock.log
)
end_test
begin_test "locking a nested file"
(
set -e
reponame="locking-nested-file"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" --lockable
git add .gitattributes
git commit -m "initial commit"
mkdir -p foo/bar/baz
contents="contents"
contents_oid="$(calc_oid "$contents")"
printf "%s" "$contents" > foo/bar/baz/a.dat
git add foo/bar/baz/a.dat
git commit -m "add a.dat"
git push origin master
assert_server_object "$reponame" "$contents_oid"
git lfs lock foo/bar/baz/a.dat 2>&1 | tee lock.log
grep "Locked foo/bar/baz/a.dat" lock.log
git lfs locks 2>&1 | tee locks.log
grep "foo/bar/baz/a.dat" locks.log
)
end_test
begin_test "creating a lock (within subdirectory)"
(
set -e
reponame="lock_create_within_subdirectory"
setup_remote_repo_with_file "$reponame" "sub/a.dat"
cd sub
git lfs lock --json "a.dat" | tee lock.json
if [ "0" -ne "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected \'git lfs lock \'a.dat\'\' to succeed"
exit 1
fi
id=$(assert_lock lock.json sub/a.dat)
assert_server_lock "$reponame" "$id"
)
end_test
begin_test "creating a lock (symlinked working directory)"
(
set -eo pipefail
if [[ $(uname) == *"MINGW"* ]]; then
echo >&2 "info: skipped on Windows ..."
exit 0
fi
reponame="lock-in-symlinked-working-directory"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track -l "*.dat"
mkdir -p folder1 folder2
printf "hello" > folder2/a.dat
add_symlink "../folder2" "folder1/folder2"
git add --all .
git commit -m "initial commit"
git push origin master
pushd "$TRASHDIR" > /dev/null
ln -s "$reponame" "$reponame-symlink"
cd "$reponame-symlink"
git lfs lock --json folder1/folder2/a.dat 2>&1 | tee lock.json
id="$(assert_lock lock.json folder1/folder2/a.dat)"
assert_server_lock "$reponame" "$id" master
popd > /dev/null
)
end_test
begin_test "lock with .gitignore"
(
set -e
reponame="lock-with-gitignore"
setup_remote_repo_with_file "$reponame" "a.txt"
clone_repo "$reponame" "$reponame"
echo "*.txt filter=lfs diff=lfs merge=lfs -text lockable" > .gitattributes
git add .gitattributes
git commit -m ".gitattributes: mark 'a.txt' as lockable"
rm -f a.txt && git checkout a.txt
refute_file_writeable a.txt
echo "*.txt" > .gitignore
git add .gitignore
git commit -m ".gitignore: ignore 'a.txt'"
rm -f a.txt && git checkout a.txt
assert_file_writeable a.txt
)
end_test
begin_test "lock with .gitignore and lfs.lockignoredfiles"
(
set -e
reponame="lock-with-gitignore-and-ignoredfiles"
setup_remote_repo_with_file "$reponame" "a.txt"
clone_repo "$reponame" "$reponame"
git config lfs.lockignoredfiles true
echo "*.txt filter=lfs diff=lfs merge=lfs -text lockable" > .gitattributes
git add .gitattributes
git commit -m ".gitattributes: mark 'a.txt' as lockable"
rm -f a.txt && git checkout a.txt
refute_file_writeable a.txt
echo "*.txt" > .gitignore
git add .gitignore
git commit -m ".gitignore: ignore 'a.txt'"
rm -f a.txt && git checkout a.txt
refute_file_writeable a.txt
)
end_test