774ab58fa7
If during a migration operation a .gitattributes blob is found which needs to be modified by the migration, and it is a symbolic link rather than a regular blob object, we halt the migration with an error. We add tests for the import, export, and info sub-commands which exercise this new behaviour, including with and without the --fixup option for the import and info sub-commands. Note that this is an unexpected condition because .gitattributes files should never be symbolic links, as Git itself will complain about them with "Too many levels of symbolic links" warning messages.
157 lines
3.6 KiB
Bash
Executable File
157 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
. "$(dirname "$0")/fixtures/migrate.sh"
|
|
. "$(dirname "$0")/testlib.sh"
|
|
|
|
begin_test "migrate import (--fixup)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt
|
|
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
|
|
git lfs migrate import --everything --fixup --yes
|
|
|
|
assert_pointer "refs/heads/main" "a.txt" "$txt_oid" "120"
|
|
assert_local_object "$txt_oid" "120"
|
|
|
|
main="$(git rev-parse refs/heads/main)"
|
|
main_attrs="$(git cat-file -p "$main:.gitattributes")"
|
|
echo "$main_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup, complex nested)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_complex_tracked
|
|
|
|
a_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
b_oid="$(calc_oid "$(git cat-file -p :dir/b.txt)")"
|
|
|
|
git lfs migrate import --everything --fixup --yes
|
|
|
|
assert_pointer "refs/heads/main" "a.txt" "$a_oid" "1"
|
|
refute_pointer "refs/heads/main" "b.txt"
|
|
|
|
assert_local_object "$a_oid" "1"
|
|
refute_local_object "$b_oid" "1"
|
|
|
|
main="$(git rev-parse refs/heads/main)"
|
|
main_attrs="$(git cat-file -p "$main:.gitattributes")"
|
|
main_dir_attrs="$(git cat-file -p "$main:dir/.gitattributes")"
|
|
echo "$main_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
echo "$main_dir_attrs" | grep -q "*.txt !filter !diff !merge"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup, --include)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt
|
|
|
|
git lfs migrate import --everything --fixup --yes --include="*.txt" 2>&1 \
|
|
| tee migrate.log
|
|
|
|
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
|
|
echo >&2 "Expected 'git lfs migrate ...' to fail, didn't ..."
|
|
exit 1
|
|
fi
|
|
|
|
grep -q "Cannot use --fixup with --include, --exclude" migrate.log
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup, --exclude)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt
|
|
|
|
git lfs migrate import --everything --fixup --yes --exclude="*.txt" 2>&1 \
|
|
| tee migrate.log
|
|
|
|
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
|
|
echo >&2 "Expected 'git lfs migrate ...' to fail, didn't ..."
|
|
exit 1
|
|
fi
|
|
|
|
grep -q "Cannot use --fixup with --include, --exclude" migrate.log
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup, --no-rewrite)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt
|
|
|
|
git lfs migrate import --everything --fixup --yes --no-rewrite 2>&1 \
|
|
| tee migrate.log
|
|
|
|
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
|
|
echo >&2 "Expected 'git lfs migrate ...' to fail, didn't ..."
|
|
exit 1
|
|
fi
|
|
|
|
grep -qe "--no-rewrite and --fixup cannot be combined" migrate.log
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup with remote tags)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt
|
|
|
|
git lfs uninstall
|
|
|
|
base64 < /dev/urandom | head -c 120 > b.txt
|
|
git add b.txt
|
|
git commit -m "b.txt"
|
|
|
|
git tag -m tag1 -a tag1
|
|
git reset --hard HEAD^
|
|
|
|
git lfs install
|
|
|
|
cwd=$(pwd)
|
|
cd "$TRASHDIR"
|
|
|
|
git clone "$cwd" "$reponame-2"
|
|
cd "$reponame-2"
|
|
|
|
# We're checking here that this succeeds even though it does nothing in this
|
|
# case.
|
|
git lfs migrate import --fixup --yes main
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--fixup, .gitattributes symlink)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_tracked_corrupt link
|
|
|
|
git lfs migrate import --everything --fixup --yes 2>&1 | tee migrate.log
|
|
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
|
echo >&2 "fatal: expected git lfs migrate import to fail, didn't"
|
|
exit 1
|
|
fi
|
|
|
|
grep "migrate: expected '.gitattributes' to be a file, got a symbolic link" migrate.log
|
|
|
|
main="$(git rev-parse refs/heads/main)"
|
|
|
|
attrs_main_sha="$(git show $main:.gitattributes | git hash-object --stdin)"
|
|
|
|
diff -u <(git ls-tree $main -- .gitattributes) <(cat <<-EOF
|
|
120000 blob $attrs_main_sha .gitattributes
|
|
EOF
|
|
)
|
|
)
|
|
end_test
|