git-lfs/t/t-migrate-import.sh

796 lines
24 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
. "$(dirname "$0")/fixtures/migrate.sh"
. "$(dirname "$0")/testlib.sh"
begin_test "migrate import (default branch)"
(
set -e
setup_multiple_local_branches
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
git lfs migrate import
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
assert_local_object "$md_oid" "140"
assert_local_object "$txt_oid" "120"
refute_local_object "$md_feature_oid" "30"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
[ ! $(git cat-file -p "$feature:.gitattributes") ]
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
# Ensure that hooks are installed. If we find 'git-lfs' somewhere in
# .git/hooks/pre-push we assume that the rest went correctly, too.
grep -q "git-lfs" .git/hooks/pre-push
)
end_test
begin_test "migrate import (bare repository)"
(
set -e
setup_multiple_remote_branches
git lfs migrate import --everything
)
end_test
begin_test "migrate import (given branch)"
(
set -e
setup_multiple_local_branches
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
git lfs migrate import my-feature
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
assert_local_object "$md_oid" "140"
assert_local_object "$md_feature_oid" "30"
assert_local_object "$txt_oid" "120"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (default branch with filter)"
(
set -e
setup_multiple_local_branches
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
git lfs migrate import --include "*.md"
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
assert_local_object "$md_oid" "140"
refute_local_object "$txt_oid" "120"
refute_local_object "$md_feature_oid" "30"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
[ ! $(git cat-file -p "$feature:.gitattributes") ]
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (given branch with filter)"
(
set -e
setup_multiple_local_branches
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
git lfs migrate import --include "*.md" my-feature
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
assert_pointer "refs/heads/my-feature~1" "a.md" "$md_oid" "140"
assert_local_object "$md_oid" "140"
assert_local_object "$md_feature_oid" "30"
refute_local_object "$txt_oid" "120"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (default branch, exclude remote refs)"
(
set -e
setup_single_remote_branch
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
md_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
txt_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
git lfs migrate import
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
assert_local_object "$md_oid" "50"
assert_local_object "$txt_oid" "30"
refute_local_object "$md_remote_oid" "140"
refute_local_object "$txt_remote_oid" "120"
master="$(git rev-parse refs/heads/master)"
remote="$(git rev-parse refs/remotes/origin/master)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
[ ! $(git cat-file -p "$remote:.gitattributes") ]
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (given branch, exclude remote refs)"
(
set -e
setup_multiple_remote_branches
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
git lfs migrate import my-feature
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "21"
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "20"
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
assert_local_object "$md_feature_oid" "31"
assert_local_object "$md_master_oid" "21"
assert_local_object "$txt_feature_oid" "30"
assert_local_object "$txt_master_oid" "20"
refute_local_object "$md_remote_oid" "11"
refute_local_object "$txt_remote_oid" "10"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
remote="$(git rev-parse refs/remotes/origin/master)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
[ ! $(git cat-file -p "$remote:.gitattributes") ]
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (given ref, --skip-fetch)"
(
set -e
setup_single_remote_branch
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
git tag pseudo-remote "$(git rev-parse refs/remotes/origin/master)"
# Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to
# not fetch it.
git update-ref -d refs/remotes/origin/master
git lfs migrate import --skip-fetch
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50"
assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140"
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30"
assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120"
assert_local_object "$md_master_oid" "50"
assert_local_object "$txt_master_oid" "30"
assert_local_object "$md_remote_oid" "140"
assert_local_object "$txt_remote_oid" "120"
master="$(git rev-parse refs/heads/master)"
remote="$(git rev-parse pseudo-remote)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
echo "$remote_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$remote_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (un-annotated tags)"
(
set -e
setup_single_local_branch_with_tags
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
git lfs migrate import --everything
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
assert_local_object "$txt_master_oid" "2"
git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
)
end_test
begin_test "migrate import (annotated tags)"
(
set -e
setup_single_local_branch_with_annotated_tags
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
git lfs migrate import --everything
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
assert_local_object "$txt_master_oid" "2"
git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
)
end_test
begin_test "migrate import (include/exclude ref)"
(
set -e
setup_multiple_remote_branches
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
git lfs migrate import \
--include-ref=refs/heads/my-feature \
--exclude-ref=refs/heads/master
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
assert_local_object "$md_feature_oid" "31"
refute_local_object "$md_master_oid" "21"
assert_local_object "$txt_feature_oid" "30"
refute_local_object "$txt_master_oid" "20"
refute_local_object "$md_remote_oid" "11"
refute_local_object "$txt_remote_oid" "10"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
remote="$(git rev-parse refs/remotes/origin/master)"
[ ! $(git cat-file -p "$master:.gitattributes") ]
[ ! $(git cat-file -p "$remote:.gitattributes") ]
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (include/exclude ref args)"
(
set -e
setup_multiple_remote_branches
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
git lfs migrate import my-feature ^master
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
assert_local_object "$md_feature_oid" "31"
refute_local_object "$md_master_oid" "21"
assert_local_object "$txt_feature_oid" "30"
refute_local_object "$txt_master_oid" "20"
refute_local_object "$md_remote_oid" "11"
refute_local_object "$txt_remote_oid" "10"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
remote="$(git rev-parse refs/remotes/origin/master)"
[ ! $(git cat-file -p "$master:.gitattributes") ]
[ ! $(git cat-file -p "$remote:.gitattributes") ]
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (include/exclude ref with filter)"
(
set -e
setup_multiple_remote_branches
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
git lfs migrate import \
--include="*.txt" \
--include-ref=refs/heads/my-feature \
--exclude-ref=refs/heads/master
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
refute_local_object "$md_feature_oid" "31"
refute_local_object "$md_master_oid" "21"
assert_local_object "$txt_feature_oid" "30"
refute_local_object "$txt_master_oid" "20"
refute_local_object "$md_remote_oid" "11"
refute_local_object "$txt_remote_oid" "10"
master="$(git rev-parse refs/heads/master)"
feature="$(git rev-parse refs/heads/my-feature)"
remote="$(git rev-parse refs/remotes/origin/master)"
[ ! $(git cat-file -p "$master:.gitattributes") ]
[ ! $(git cat-file -p "$remote:.gitattributes") ]
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
echo "$feature_attrs" | grep -vq "*.md filter=lfs diff=lfs merge=lfs"
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (existing .gitattributes)"
(
set -e
setup_local_branch_with_gitattrs
pwd
master="$(git rev-parse refs/heads/master)"
txt_master_oid="$(calc_oid "$(git cat-file -p "$master:a.txt")")"
git lfs migrate import --yes --include-ref=refs/heads/master --include="*.txt"
assert_local_object "$txt_master_oid" "120"
master="$(git rev-parse refs/heads/master)"
prev="$(git rev-parse refs/heads/master^1)"
diff -u <(git cat-file -p $master:.gitattributes) <(cat <<-EOF
*.txt filter=lfs diff=lfs merge=lfs -text
*.other filter=lfs diff=lfs merge=lfs -text
EOF)
diff -u <(git cat-file -p $prev:.gitattributes) <(cat <<-EOF
*.txt filter=lfs diff=lfs merge=lfs -text
EOF)
)
end_test
begin_test "migrate import (bare repository)"
(
set -e
2017-07-05 16:53:09 +00:00
setup_multiple_local_branches
make_bare
git lfs migrate import \
--include-ref=master
)
end_test
begin_test "migrate import (nested sub-trees, no filter)"
(
set -e
setup_single_local_branch_deep_trees
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
git lfs migrate import --everything
assert_local_object "$oid" "$size"
)
end_test
begin_test "migrate import (prefix include(s))"
(
set -e
2018-02-19 21:37:20 +00:00
includes="foo/bar/baz foo/**/baz/a.txt *.txt"
for include in $includes; do
setup_single_local_branch_deep_trees
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
git lfs migrate import --include="$include"
assert_local_object "$oid" 120
cd ..
done
)
end_test
begin_test "migrate import (--everything)"
(
set -e
setup_multiple_local_branches
git checkout master
master_txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
master_md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
feature_md_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
master_txt_size="$(git cat-file -p :a.txt | wc -c | awk '{ print $1 }')"
master_md_size="$(git cat-file -p :a.md | wc -c | awk '{ print $1 }')"
feature_md_size="$(git cat-file -p my-feature:a.md | wc -c | awk '{ print $1 }')"
git lfs migrate import --everything
assert_pointer "master" "a.txt" "$master_txt_oid" "$master_txt_size"
assert_pointer "master" "a.md" "$master_md_oid" "$master_md_size"
assert_pointer "my-feature" "a.md" "$feature_md_oid" "$feature_md_size"
)
end_test
begin_test "migrate import (ambiguous reference)"
(
set -e
setup_multiple_local_branches
# Create an ambiguously named reference sharing the name as the SHA-1 of
# "HEAD".
2017-11-17 16:11:17 +00:00
sha="$(git rev-parse HEAD)"
git tag "$sha"
git lfs migrate import --everything
)
end_test
begin_test "migrate import (--everything with args)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything master 2>&1)" = \
"fatal: cannot use --everything with explicit reference arguments" ]
)
end_test
begin_test "migrate import (--everything with --include-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything --include-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test
begin_test "migrate import (--everything with --exclude-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything --exclude-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test
begin_test "migrate import (--everything and --include with glob pattern)"
(
set -e
setup_multiple_local_branches
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
git lfs migrate import --verbose --everything --include='*.[mM][dD]'
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "140"
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
assert_local_object "$md_master_oid" "140"
assert_local_object "$md_feature_oid" "30"
refute_local_object "$txt_master_oid"
refute_local_object "$txt_feature_oid"
)
end_test
begin_test "migrate import (nested sub-trees and --include with wildcard)"
(
set -e
setup_single_local_branch_deep_trees
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
git lfs migrate import --include="**/*ar/**"
assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid" "$size"
assert_local_object "$oid" "$size"
)
end_test
begin_test "migrate import (handle copies of files)"
(
set -e
setup_single_local_branch_deep_trees
# add the object from the sub-tree to the root directory
cp foo/bar/baz/a.txt a.txt
git add a.txt
git commit -m "duplicated file"
oid_root="$(calc_oid "$(git cat-file -p :a.txt)")"
oid_tree="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
# only import objects under "foo"
git lfs migrate import --include="foo/**"
assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid_tree" "$size"
assert_local_object "$oid_tree" "$size"
# "a.txt" is not under "foo" and therefore should not be in LFS
oid_root_after_migration="$(calc_oid "$(git cat-file -p :a.txt)")"
[ "$oid_root" = "$oid_root_after_migration" ]
)
end_test
begin_test "migrate import (--object-map)"
(
set -e
setup_multiple_local_branches
output_dir=$(mktemp -d)
git log --all --pretty='format:%H' > "${output_dir}/old_sha.txt"
git lfs migrate import --everything --object-map "${output_dir}/object-map.txt"
git log --all --pretty='format:%H' > "${output_dir}/new_sha.txt"
paste -d',' "${output_dir}/old_sha.txt" "${output_dir}/new_sha.txt" > "${output_dir}/expected-map.txt"
diff -u <(sort "${output_dir}/expected-map.txt") <(sort "${output_dir}/object-map.txt")
)
end_test
begin_test "migrate import (--include with space)"
(
set -e
setup_local_branch_with_space
oid="$(calc_oid "$(git cat-file -p :"a file.txt")")"
git lfs migrate import --include "a file.txt"
assert_pointer "refs/heads/master" "a file.txt" "$oid" 50
cat .gitattributes
if [ 1 -ne "$(grep -c "a\[\[:space:\]\]file.txt" .gitattributes)" ]; then
echo >&2 "fatal: expected \"a[[:space:]]file.txt\" to appear in .gitattributes"
echo >&2 "fatal: got"
sed -e 's/^/ /g' < .gitattributes >&2
exit 1
fi
)
end_test
begin_test "migrate import (handle symbolic link)"
(
set -e
setup_local_branch_with_symlink
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
link_oid="$(calc_oid "$(git cat-file -p :link.txt)")"
git lfs migrate import --include="*.txt"
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
assert_local_object "$txt_oid" "120"
# "link.txt" is a symbolic link so it should be not in LFS
refute_local_object "$link_oid" "5"
)
end_test
begin_test "migrate import (commit --allow-empty)"
(
set -e
reponame="migrate---allow-empty"
git init "$reponame"
cd "$reponame"
git commit --allow-empty -m "initial commit"
original_head="$(git rev-parse HEAD)"
git lfs migrate import --everything
migrated_head="$(git rev-parse HEAD)"
assert_ref_unmoved "HEAD" "$original_head" "$migrated_head"
)
end_test
begin_test "migrate import (multiple remotes)"
(
set -e
setup_multiple_remotes
original_master="$(git rev-parse master)"
git lfs migrate import
migrated_master="$(git rev-parse master)"
assert_ref_unmoved "master" "$original_master" "$migrated_master"
)
end_test
begin_test "migrate import (dirty copy, negative answer)"
(
set -e
setup_local_branch_with_dirty_copy
original_master="$(git rev-parse master)"
echo "n" | git lfs migrate import --everything 2>&1 | tee migrate.log
grep "migrate: working copy must not be dirty" migrate.log
migrated_master="$(git rev-parse master)"
assert_ref_unmoved "master" "$original_master" "$migrated_master"
)
end_test
begin_test "migrate import (dirty copy, unknown then negative answer)"
(
set -e
setup_local_branch_with_dirty_copy
original_master="$(git rev-parse master)"
echo "x\nn" | git lfs migrate import --everything 2>&1 | tee migrate.log
cat migrate.log
[ "2" -eq "$(grep -o "override changes in your working copy" migrate.log \
| wc -l | awk '{ print $1 }')" ]
grep "migrate: working copy must not be dirty" migrate.log
migrated_master="$(git rev-parse master)"
assert_ref_unmoved "master" "$original_master" "$migrated_master"
)
end_test
begin_test "migrate import (dirty copy, positive answer)"
(
set -e
setup_local_branch_with_dirty_copy
oid="$(calc_oid "$(git cat-file -p :a.txt)")"
echo "y" | git lfs migrate import --everything 2>&1 | tee migrate.log
grep "migrate: changes in your working copy will be overridden ..." \
migrate.log
assert_pointer "refs/heads/master" "a.txt" "$oid" "5"
assert_local_object "$oid" "5"
)
end_test
begin_test "migrate import (non-standard refs)"
(
set -e
setup_multiple_local_branches_non_standard
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
git lfs migrate import --everything
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
assert_pointer "refs/pull/1/base" "a.md" "$md_oid" "140"
assert_pointer "refs/pull/1/base" "a.txt" "$txt_oid" "120"
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
assert_pointer "refs/pull/1/head" "a.txt" "$txt_oid" "120"
assert_local_object "$md_oid" "140"
assert_local_object "$txt_oid" "120"
assert_local_object "$md_feature_oid" "30"
)
end_test