git-lfs/t/t-push.sh

875 lines
25 KiB
Bash
Raw Normal View History

2015-07-30 02:37:31 +00:00
#!/usr/bin/env bash
2015-05-26 21:09:24 +00:00
. "$(dirname "$0")/testlib.sh"
2015-05-26 21:09:24 +00:00
# sets up the repos for the first few push tests. The passed argument is the
# name of the repo to setup. The resuling repo will have a local file tracked
# with LFS and committed, but not yet pushed to the remote
push_repo_setup() {
reponame="$1"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" false
git lfs track "*.dat"
echo "push a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
}
begin_test "push with good ref"
(
set -e
push_repo_setup "push-main-branch-required"
git lfs push origin main
)
end_test
begin_test "push with tracked ref"
(
set -e
push_repo_setup "push-tracked-branch-required"
git config push.default upstream
git config branch.main.merge refs/heads/tracked
git lfs push origin main
)
end_test
begin_test "push with bad ref"
(
set -e
push_repo_setup "push-other-branch-required"
git lfs push origin main 2>&1 | tee push.log
if [ "0" -eq "${PIPESTATUS[0]}" ]; then
echo "expected command to fail"
exit 1
fi
grep 'batch response: Expected ref "refs/heads/other", got "refs/heads/main"' push.log
)
end_test
begin_test "push with given remote, configured pushRemote"
(
set -e
push_repo_setup "push-given-and-config"
git remote add bad-remote "invalid-url"
git config branch.main.pushRemote bad-remote
git lfs push --all origin
)
end_test
2015-05-26 21:09:24 +00:00
begin_test "push"
(
set -e
reponame="$(basename "$0" ".sh")"
setup_remote_repo "$reponame"
clone_repo "$reponame" repo
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" true
2015-05-26 21:09:24 +00:00
git lfs track "*.dat"
echo "push a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
git lfs push --dry-run origin main 2>&1 | tee push.log
grep "push 4c48d2a6991c9895bcddcf027e1e4907280bcf21975492b1afbade396d6a3340 => a.dat" push.log
[ $(grep -c "^push " push.log) -eq 1 ]
git lfs push origin main 2>&1 | tee push.log
2018-01-06 02:01:50 +00:00
grep "Uploading LFS objects: 100% (1/1), 7 B" push.log
2015-05-26 21:09:24 +00:00
git checkout -b push-b
echo "push b" > b.dat
git add b.dat
git commit -m "add b.dat"
git lfs push --dry-run origin push-b 2>&1 | tee push.log
grep "push 4c48d2a6991c9895bcddcf027e1e4907280bcf21975492b1afbade396d6a3340 => a.dat" push.log
grep "push 82be50ad35070a4ef3467a0a650c52d5b637035e7ad02c36652e59d01ba282b7 => b.dat" push.log
[ $(grep -c "^push " < push.log) -eq 2 ]
# simulate remote ref
mkdir -p .git/refs/remotes/origin
git rev-parse HEAD > .git/refs/remotes/origin/HEAD
git lfs push --dry-run origin push-b 2>&1 | tee push.log
[ $(grep -c "^push " push.log) -eq 0 ]
rm -rf .git/refs/remotes
2015-05-27 20:18:02 +00:00
git lfs push origin push-b 2>&1 | tee push.log
2018-01-06 02:01:50 +00:00
grep "Uploading LFS objects: 100% (2/2), 14 B" push.log
2015-05-26 21:09:24 +00:00
)
end_test
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
# helper used by the next few push --all tests to set up their repos
push_all_setup() {
suffix="$1"
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
reponame="$(basename "$0" ".sh")-all-$suffix"
content1="initial"
content2="update"
content3="branch"
content4="tagged"
content5="main"
extracontent="extra"
oid1=$(calc_oid "$content1")
oid2=$(calc_oid "$content2")
oid3=$(calc_oid "$content3")
oid4=$(calc_oid "$content4")
oid5=$(calc_oid "$content5")
extraoid=$(calc_oid "$extracontent")
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
clone_repo "$reponame" "push-all-$suffix"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" true
git lfs track "*.dat"
echo "[
{
\"CommitDate\":\"$(get_date -6m)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content1},\"Data\":\"$content1\"}
]
},
{
\"CommitDate\":\"$(get_date -5m)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content2},\"Data\":\"$content2\"}
]
},
{
\"CommitDate\":\"$(get_date -4m)\",
\"NewBranch\":\"branch\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content3},\"Data\":\"$content3\"}
]
},
{
\"CommitDate\":\"$(get_date -4m)\",
\"ParentBranches\":[\"main\"],
\"Tags\":[\"tag\"],
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content4},\"Data\":\"$content4\"}
]
},
{
\"CommitDate\":\"$(get_date -2m)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content5},\"Data\":\"$content5\"},
{\"Filename\":\"file2.dat\",\"Size\":${#extracontent},\"Data\":\"$extracontent\"}
]
}
]" | lfstest-testutils addcommits
git rm file2.dat
git commit -m "remove file2.dat"
# simulate remote ref
mkdir -p .git/refs/remotes/origin
git rev-parse HEAD > .git/refs/remotes/origin/HEAD
setup_alternate_remote "$reponame-$suffix"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame-$suffix").locksverify" true
}
begin_test "push --all (no ref args)"
(
set -e
push_all_setup "everything"
git lfs push --dry-run --all origin 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
grep "push $oid5 => file1.dat" push.log
grep "push $extraoid => file2.dat" push.log
[ $(grep -c "^push " < push.log) -eq 6 ]
git push --all origin 2>&1 | tee push.log
[ $(grep -c "Uploading LFS objects: 100% (6/6)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix" "$oid1"
assert_server_object "$reponame-$suffix" "$oid2"
assert_server_object "$reponame-$suffix" "$oid3"
assert_server_object "$reponame-$suffix" "$oid4"
assert_server_object "$reponame-$suffix" "$oid5"
assert_server_object "$reponame-$suffix" "$extraoid"
echo "push while missing old objects locally"
setup_alternate_remote "$reponame-$suffix-2"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame-$suffix-2").locksverify" true
git lfs push --object-id origin $oid1
assert_server_object "$reponame-$suffix-2" "$oid1"
refute_server_object "$reponame-$suffix-2" "$oid2"
refute_server_object "$reponame-$suffix-2" "$oid3"
refute_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
rm ".git/lfs/objects/${oid1:0:2}/${oid1:2:2}/$oid1"
echo "dry run missing local object that exists on server"
git lfs push --dry-run --all origin 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
grep "push $oid5 => file1.dat" push.log
grep "push $extraoid => file2.dat" push.log
[ $(grep -c "^push " push.log) -eq 6 ]
git push --all origin 2>&1 | tee push.log
grep "Uploading LFS objects: 100% (6/6)" push.log
assert_server_object "$reponame-$suffix-2" "$oid2"
assert_server_object "$reponame-$suffix-2" "$oid3"
assert_server_object "$reponame-$suffix-2" "$oid4"
assert_server_object "$reponame-$suffix-2" "$oid5"
assert_server_object "$reponame-$suffix-2" "$extraoid"
)
end_test
begin_test "push --all (1 ref arg)"
(
set -e
push_all_setup "ref"
git lfs push --dry-run --all origin branch 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
[ $(grep -c "^push " < push.log) -eq 3 ]
git lfs push --all origin branch 2>&1 | tee push.log
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
[ $(grep -c "Uploading LFS objects: 100% (3/3)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix" "$oid1"
assert_server_object "$reponame-$suffix" "$oid2"
assert_server_object "$reponame-$suffix" "$oid3"
refute_server_object "$reponame-$suffix" "$oid4" # in main and the tag
refute_server_object "$reponame-$suffix" "$oid5"
refute_server_object "$reponame-$suffix" "$extraoid"
echo "push while missing old objects locally"
setup_alternate_remote "$reponame-$suffix-2"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame-$suffix-2").locksverify" true
git lfs push --object-id origin $oid1
assert_server_object "$reponame-$suffix-2" "$oid1"
refute_server_object "$reponame-$suffix-2" "$oid2"
refute_server_object "$reponame-$suffix-2" "$oid3"
refute_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
rm ".git/lfs/objects/${oid1:0:2}/${oid1:2:2}/$oid1"
# dry run doesn't change
git lfs push --dry-run --all origin branch 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
[ $(grep -c "^push " push.log) -eq 3 ]
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
git push origin branch 2>&1 | tee push.log
[ $(grep -c "Uploading LFS objects: 100% (3/3)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix-2" "$oid2"
assert_server_object "$reponame-$suffix-2" "$oid3"
refute_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
)
end_test
begin_test "push --all (multiple ref args)"
(
set -e
push_all_setup "multiple-refs"
git lfs push --dry-run --all origin branch tag 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
[ $(grep -c "^push " push.log) -eq 4 ]
git lfs push --all origin branch tag 2>&1 | tee push.log
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
[ $(grep -c "Uploading LFS objects: 100% (4/4)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix" "$oid1"
assert_server_object "$reponame-$suffix" "$oid2"
assert_server_object "$reponame-$suffix" "$oid3"
assert_server_object "$reponame-$suffix" "$oid4"
refute_server_object "$reponame-$suffix" "$oid5" # only in main
refute_server_object "$reponame-$suffix" "$extraoid"
echo "push while missing old objects locally"
setup_alternate_remote "$reponame-$suffix-2"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame-$suffix-2").locksverify" true
git lfs push --object-id origin $oid1
assert_server_object "$reponame-$suffix-2" "$oid1"
refute_server_object "$reponame-$suffix-2" "$oid2"
refute_server_object "$reponame-$suffix-2" "$oid3"
refute_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
rm ".git/lfs/objects/${oid1:0:2}/${oid1:2:2}/$oid1"
# dry run doesn't change
git lfs push --dry-run --all origin branch tag 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid3 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
[ $(grep -c "^push " push.log) -eq 4 ]
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
git push origin branch refs/tags/tag 2>&1 | tee push.log
[ $(grep -c "Uploading LFS objects: 100% (4/4)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix-2" "$oid2"
assert_server_object "$reponame-$suffix-2" "$oid3"
assert_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
)
end_test
begin_test "push --all (ref with deleted files)"
(
set -e
push_all_setup "ref-with-deleted"
git lfs push --dry-run --all origin main 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
grep "push $oid5 => file1.dat" push.log
grep "push $extraoid => file2.dat" push.log
[ $(grep -c "^push " push.log) -eq 5 ]
git lfs push --all origin main 2>&1 | tee push.log
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
[ $(grep -c "Uploading LFS objects: 100% (5/5)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix" "$oid1"
assert_server_object "$reponame-$suffix" "$oid2"
refute_server_object "$reponame-$suffix" "$oid3" # only in the branch
assert_server_object "$reponame-$suffix" "$oid4"
assert_server_object "$reponame-$suffix" "$oid5"
assert_server_object "$reponame-$suffix" "$extraoid"
echo "push while missing old objects locally"
setup_alternate_remote "$reponame-$suffix-2"
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame-$suffix-2").locksverify" true
git lfs push --object-id origin $oid1
assert_server_object "$reponame-$suffix-2" "$oid1"
refute_server_object "$reponame-$suffix-2" "$oid2"
refute_server_object "$reponame-$suffix-2" "$oid3"
refute_server_object "$reponame-$suffix-2" "$oid4"
refute_server_object "$reponame-$suffix-2" "$oid5"
refute_server_object "$reponame-$suffix-2" "$extraoid"
rm ".git/lfs/objects/${oid1:0:2}/${oid1:2:2}/$oid1"
# dry run doesn't change
git lfs push --dry-run --all origin main 2>&1 | tee push.log
grep "push $oid1 => file1.dat" push.log
grep "push $oid2 => file1.dat" push.log
grep "push $oid4 => file1.dat" push.log
grep "push $oid5 => file1.dat" push.log
grep "push $extraoid => file2.dat" push.log
[ $(grep -c "^push " push.log) -eq 5 ]
t/t-push.sh: do not short-circuit --all tests Since commit df2007d81c7e5487c448e8d967707e5548bb10e3 in PR #646 it appears that the push_all_setup() helper function has accidentally short-circuited all but the first test calling it by exiting early with an exit code of 0 when the test repo exists. The calling tests thus appear to pass but are instead skipping all of their actual test logic. The original intent appears to have been to reuse a single test repo for the set of related tests of the --all push option. However, these tests do not leave the repo state in the same condition created by push_all_setup(), e.g., they replace the "origin" remote, and most importantly they each remove an LFS object file. Thus simply replacing "exit 0" with "return 0" in push_all_setup() is insufficient. To simplify matters, we no longer try to reuse the test repos between tests. Rather, we let push_all_setup() create a unique test repo for each caller by appending the distinct suffix argument provided by the caller to the name of the test repo. We then have to account for the fact that these tests have not fully run in some time, and therefore missed changes like commit db4e3b271d08da8110be0ee0ee091a2f9f212fbc in PR #2811 which updated the Git LFS progress meter output format. Several calls to "git push" also need adjustment to avoid errors such as "--all can't be combined with refspecs" and "tag shorthand without <tag>", and one short-circuited test had an incorrect count of "push ... => file1.dat" lines which we revise.
2020-11-17 06:31:44 +00:00
git push origin main 2>&1 | tee push.log
[ $(grep -c "Uploading LFS objects: 100% (5/5)" push.log) -eq 1 ]
assert_server_object "$reponame-$suffix-2" "$oid2"
refute_server_object "$reponame-$suffix-2" "$oid3"
assert_server_object "$reponame-$suffix-2" "$oid4"
assert_server_object "$reponame-$suffix-2" "$oid5"
assert_server_object "$reponame-$suffix-2" "$extraoid"
2015-05-26 21:09:24 +00:00
)
end_test
begin_test "push object id(s)"
(
set -e
reponame="$(basename "$0" ".sh")"
setup_remote_repo "$reponame"
clone_repo "$reponame" repo2
git config "lfs.$(repo_endpoint "$GITSERVER" "$reponame").locksverify" true
git lfs track "*.dat"
echo "push a" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat"
git lfs push --object-id origin \
4c48d2a6991c9895bcddcf027e1e4907280bcf21975492b1afbade396d6a3340 \
2>&1 | tee push.log
2018-01-06 02:01:50 +00:00
grep "Uploading LFS objects: 100% (1/1), 7 B" push.log
echo "push b" > b.dat
git add b.dat
git commit -m "add b.dat"
git lfs push --object-id origin \
4c48d2a6991c9895bcddcf027e1e4907280bcf21975492b1afbade396d6a3340 \
82be50ad35070a4ef3467a0a650c52d5b637035e7ad02c36652e59d01ba282b7 \
2>&1 | tee push.log
2018-01-06 02:01:50 +00:00
grep "Uploading LFS objects: 100% (2/2), 14 B" push.log
)
end_test
begin_test "push modified files"
(
set -e
reponame="$(basename "$0" ".sh")-modified"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
# generate content we'll use
content1="filecontent1"
content2="filecontent2"
content3="filecontent3"
content4="filecontent4"
content5="filecontent5"
oid1=$(calc_oid "$content1")
oid2=$(calc_oid "$content2")
oid3=$(calc_oid "$content3")
oid4=$(calc_oid "$content4")
oid5=$(calc_oid "$content5")
echo "[
{
\"CommitDate\":\"$(get_date -6m)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content1}, \"Data\":\"$content1\"}]
},
{
\"CommitDate\":\"$(get_date -3m)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content2}, \"Data\":\"$content2\"}]
},
{
\"CommitDate\":\"$(get_date -1m)\",
\"NewBranch\":\"other_branch\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content5}, \"Data\":\"$content5\"}]
},
{
\"CommitDate\":\"$(get_date -1m)\",
\"ParentBranches\":[\"main\"],
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content3}, \"Data\":\"$content3\"},
{\"Filename\":\"file2.dat\",\"Size\":${#content4}, \"Data\":\"$content4\"}]
}
]" | lfstest-testutils addcommits
git lfs push origin main
git lfs push origin other_branch
assert_server_object "$reponame" "$oid1"
assert_server_object "$reponame" "$oid2"
assert_server_object "$reponame" "$oid3"
assert_server_object "$reponame" "$oid4"
assert_server_object "$reponame" "$oid5"
)
end_test
begin_test "push with invalid remote"
(
set -e
cd repo
git lfs push not-a-remote 2>&1 | tee push.log
grep "Invalid remote name" push.log
)
end_test
begin_test "push ambiguous branch name"
(
set -e
reponame="$(basename "$0" ".sh")-ambiguous-branch"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \"\*.dat\"" track.log
NUMFILES=5
# generate content we'll use
for ((a=0; a < NUMFILES ; a++))
do
content[$a]="filecontent$a"
oid[$a]=$(calc_oid "${content[$a]}")
done
echo "[
{
\"CommitDate\":\"$(get_date -10d)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content[0]}, \"Data\":\"${content[0]}\"},
{\"Filename\":\"file2.dat\",\"Size\":${#content[1]}, \"Data\":\"${content[1]}\"}]
},
{
\"NewBranch\":\"ambiguous\",
\"CommitDate\":\"$(get_date -5d)\",
\"Files\":[
{\"Filename\":\"file3.dat\",\"Size\":${#content[2]}, \"Data\":\"${content[2]}\"}]
},
{
\"CommitDate\":\"$(get_date -2d)\",
\"Files\":[
{\"Filename\":\"file4.dat\",\"Size\":${#content[3]}, \"Data\":\"${content[3]}\"}]
},
{
\"ParentBranches\":[\"main\"],
\"CommitDate\":\"$(get_date -1d)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content[4]}, \"Data\":\"${content[4]}\"}]
}
]" | lfstest-testutils addcommits
# create tag with same name as branch
git tag ambiguous
# lfs push main, should work
git lfs push origin main
# push ambiguous, does not fail since lfs scans git with sha, not ref name
git lfs push origin ambiguous
)
end_test
begin_test "push (retry with expired actions)"
(
set -e
reponame="push_retry_expired_action"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
contents="return-expired-action"
contents_oid="$(calc_oid "$contents")"
contents_size="$(printf "%s" "$contents" | wc -c | awk '{ print $1 }')"
printf "%s" "$contents" > a.dat
git add .gitattributes a.dat
git commit -m "add a.dat, .gitattributes" 2>&1 | tee commit.log
grep "main (root-commit)" commit.log
grep "2 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
GIT_TRACE=1 git push origin main 2>&1 | tee push.log
expected="enqueue retry #1 after 0.25s for \"$contents_oid\" (size: $contents_size): LFS: tq: action \"upload\" expires at"
grep "$expected" push.log
2018-01-06 02:01:50 +00:00
grep "Uploading LFS objects: 100% (1/1), 21 B" push.log
)
end_test
begin_test "push to raw remote url"
(
set -e
setup_remote_repo "push-raw"
mkdir push-raw
cd push-raw
git init
git lfs track "*.dat"
contents="raw"
contents_oid=$(calc_oid "$contents")
printf "%s" "$contents" > raw.dat
git add raw.dat .gitattributes
git commit -m "add" 2>&1 | tee commit.log
grep "main (root-commit)" commit.log
grep "2 files changed" commit.log
grep "create mode 100644 raw.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
refute_server_object push-raw "$contents_oid"
git lfs push $GITSERVER/push-raw main
assert_server_object push-raw "$contents_oid"
)
end_test
begin_test "push (with invalid object size)"
(
set -e
reponame="push-invalid-object-size"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
contents="return-invalid-size"
printf "%s" "$contents" > a.dat
git add a.dat .gitattributes
git commit -m "add a.dat, .gitattributes" 2>&1 | tee commit.log
grep "main (root-commit)" commit.log
grep "2 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
set +e
git push origin main 2>&1 2> push.log
res="$?"
set -e
grep "invalid size (got: -1)" push.log
[ "0" -eq "$(grep -c "panic" push.log)" ]
[ "0" -ne "$res" ]
refute_server_object "$reponame" "$(calc_oid "$contents")"
)
end_test
begin_test "push with deprecated _links"
(
set -e
reponame="$(basename "$0" ".sh")-deprecated"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
git add .gitattributes
git commit -m "initial commit"
contents="send-deprecated-links"
contents_oid="$(calc_oid "$contents")"
printf "%s" "$contents" > a.dat
git add a.dat
git commit -m "add a.dat"
git push origin main
assert_server_object "$reponame" "$contents_oid"
)
end_test
begin_test "push with invalid pushInsteadof"
(
set -e
push_repo_setup "push-invalid-pushinsteadof"
# set pushInsteadOf to rewrite the href of uploading LFS object.
git config url."$GITSERVER/storage/invalid".pushInsteadOf "$GITSERVER/storage/"
# Enable href rewriting explicitly.
git config lfs.transfer.enablehrefrewrite true
set +e
git lfs push origin main > push.log 2>&1
res=$?
set -e
[ "$res" = "2" ]
# check rewritten href is used to upload LFS object.
grep "LFS: Authorization error: $GITSERVER/storage/invalid" push.log
# lfs-push succeed after unsetting enableHrefRewrite config
git config --unset lfs.transfer.enablehrefrewrite
git lfs push origin main
)
end_test
begin_test 'push with data the server already has'
(
set -e
reponame="push-server-data"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
git add .gitattributes
git commit -m "initial commit"
contents="abc123"
contents_oid="$(calc_oid "$contents")"
printf "%s" "$contents" > a.dat
git add a.dat
git commit -m "add a.dat"
git push origin main
assert_server_object "$reponame" "$contents_oid"
git checkout -b side
# Use a different file name for the second file; otherwise, this test
# unexpectedly passes with the old code, since we fail to notice that the
# object we run through the clean filter is not the object we wanted.
contents2="def456"
contents2_oid="$(calc_oid "$contents2")"
printf "%s" "$contents2" > b.dat
git add b.dat
git commit -m "add b.dat"
# We remove the original object. The server already has this.
delete_local_object "$contents_oid"
# We use the URL so that we cannot take advantage of the existing "origin/*"
# refs that we know the server must have. We will traverse the entire history
# for this push, and we should not fail because the server already has the
# object we deleted above.
git push "$(git config remote.origin.url)" side
assert_server_object "$reponame" "$contents2_oid"
)
end_test
begin_test 'push with multiple refs and data the server already has'
(
set -e
reponame="push-multi-ref-server-data"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
git add .gitattributes
git commit -m "initial commit"
contents="abc123"
contents_oid="$(calc_oid "$contents")"
printf "%s" "$contents" > a.dat
git add a.dat
git commit -m "add a.dat"
git push origin main
assert_server_object "$reponame" "$contents_oid"
contents2="def456"
contents2_oid="$(calc_oid "$contents2")"
printf "%s" "$contents2" > b.dat
git add b.dat
git commit -m "add b.dat"
# Create a tag. Normally this would cause the entire history to be traversed
# since it's a new ref, but we no longer do that since we're pushing multiple
# refs.
git tag -m v1.0.0 -a v1.0.0
# We remove the original object. The server already has this.
delete_local_object "$contents_oid"
# We use the URL so that we cannot take advantage of the existing "origin/*"
# refs that we know the server must have.
GIT_TRACE=1 GIT_TRANSFER_TRACE=1 GIT_CURL_VERBOSE=1 \
git push "$(git config remote.origin.url)" main v1.0.0 2>&1 | tee push.log
# We should not find a batch request for the object which is in the earlier
# version of main, since we know the remote side has it.
[ "$(grep -c "$contents_oid" push.log)" = 0 ]
# Yet we should have pushed the new object successfully.
assert_server_object "$reponame" "$contents2_oid"
)
end_test
begin_test "push custom reference"
(
set -e
reponame="push-custom-reference"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat"
# generate content we'll use
content="filecontent"
oid=$(calc_oid "$content")
echo "[
{
\"CommitDate\":\"$(get_date -6m)\",
\"Files\":[
{\"Filename\":\"file.dat\",\"Size\":${#content}, \"Data\":\"$content\"}]
}
]" | lfstest-testutils addcommits
# Create and try pushing a reference in a nonstandard namespace, that is,
# outside of refs/heads, refs/tags, and refs/remotes.
git update-ref refs/custom/remote/heads/main refs/heads/main
git lfs push origin refs/custom/remote/heads/main
assert_server_object "$reponame" "$oid"
)
end_test
begin_test "push --object-id (invalid value)"
(
set -e
push_all_setup "push-invalid-oid"
git lfs push --object-id origin '' 2>&1 | tee push.log
git lfs push --object-id origin "${oid1:0:3}" 2>&1 | tee -a push.log
[ "$(grep -c 'too short object ID' push.log)" -eq 2 ]
)
end_test
begin_test "storage upload with compression"
(
set -e
reponame="storage-compress"
setup_remote_repo "$reponame"
clone_repo "$reponame" storage-compress
contents="storage-compress"
oid="$(calc_oid "$contents")"
printf "%s" "$contents" > a.dat
git lfs track "*.dat"
git add .gitattributes a.dat
git commit -m "initial commit"
GIT_CURL_VERBOSE=1 git push origin main | tee push.log
assert_server_object "$reponame" "$oid"
pushd ..
git \
-c "filter.lfs.process=" \
-c "filter.lfs.smudge=cat" \
-c "filter.lfs.required=false" \
clone "$GITSERVER/$reponame" "$reponame-assert"
cd "$reponame-assert"
git config credential.helper lfstest
GIT_TRACE=1 git lfs pull origin main 2>&1 | tee pull.log
if [ "0" -ne "${PIPESTATUS[0]}" ]; then
echo >&2 "fatal: expected \`git lfs pull origin main\` to succeed ..."
exit 1
fi
grep "decompressed gzipped response" pull.log
assert_local_object "$oid" "${#contents}"
popd
)
end_test