git-lfs/test/test-fetch.sh
Steve Streeting 7519896f98 Change default fetch recent to include remote refs from current remote
Previously only local branches were included by default. However this
way is more useful in practice; otherwise when you needed to checkout
or pull new commits from the remote you were forced to fetch on demand;
fetch --recent wouldn't pick them up without including the remote
branches. While you *can* create / update local branches without
checking out manually (e.g. git reset to manually fast-forward) to make
fetch --recent then pickup the changes from local branches, it's
too cumbersome. Including remote refs by default makes more sense for
most people, respecting the idea that you do this as an optimistic fetch
to save time at checkout/pull. However, limit the operation to the
current remote only (which makes sense anyway).
2015-09-01 12:37:24 +01:00

278 lines
8.3 KiB
Bash
Executable File

#!/usr/bin/env bash
. "test/testlib.sh"
begin_test "fetch"
(
set -e
reponame="$(basename "$0" ".sh")"
setup_remote_repo "$reponame"
clone_repo "$reponame" clone
clone_repo "$reponame" repo
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
contents="a"
contents_oid=$(printf "$contents" | shasum -a 256 | cut -f 1 -d " ")
printf "$contents" > a.dat
git add a.dat
git add .gitattributes
git commit -m "add a.dat" 2>&1 | tee commit.log
grep "master (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
[ "a" = "$(cat a.dat)" ]
assert_local_object "$contents_oid" 1
refute_server_object "$reponame" "$contents_oid"
git push origin master 2>&1 | tee push.log
grep "(1 of 1 files)" push.log
grep "master -> master" push.log
assert_server_object "$reponame" "$contents_oid"
# Add a file in a different branch
git checkout -b newbranch
b="b"
b_oid=$(printf "$b" | shasum -a 256 | cut -f 1 -d " ")
printf "$b" > b.dat
git add b.dat
git commit -m "add b.dat"
assert_local_object "$b_oid" 1
git push origin newbranch
assert_server_object "$reponame" "$b_oid"
# change to the clone's working directory
cd ../clone
git pull 2>&1 | grep "Downloading a.dat (1 B)"
[ "a" = "$(cat a.dat)" ]
assert_local_object "$contents_oid" 1
# Remove the working directory and lfs files
rm -rf .git/lfs/objects
git lfs fetch 2>&1 | grep "(1 of 1 files)"
assert_local_object "$contents_oid" 1
# test with just remote specified
rm -rf .git/lfs/objects
git lfs fetch origin 2>&1 | grep "(1 of 1 files)"
assert_local_object "$contents_oid" 1
git checkout newbranch
git checkout master
rm -rf .git/lfs/objects
git lfs fetch origin master newbranch
assert_local_object "$contents_oid" 1
assert_local_object "$b_oid" 1
# Test include / exclude filters supplied in gitconfig
rm -rf .git/lfs/objects
git config "lfs.fetchinclude" "a*"
git lfs fetch origin master newbranch
assert_local_object "$contents_oid" 1
refute_local_object "$b_oid"
rm -rf .git/lfs/objects
git config --unset "lfs.fetchinclude"
git config "lfs.fetchexclude" "a*"
git lfs fetch origin master newbranch
refute_local_object "$contents_oid"
assert_local_object "$b_oid" 1
rm -rf .git/lfs/objects
git config "lfs.fetchinclude" "a*,b*"
git config "lfs.fetchexclude" "c*,d*"
git lfs fetch origin master newbranch
assert_local_object "$contents_oid" 1
assert_local_object "$b_oid" 1
rm -rf .git/lfs/objects
git config "lfs.fetchinclude" "c*,d*"
git config "lfs.fetchexclude" "a*,b*"
git lfs fetch origin master newbranch
refute_local_object "$contents_oid"
refute_local_object "$b_oid"
# Test include / exclude filters supplied on the command line
git config --unset "lfs.fetchinclude"
git config --unset "lfs.fetchexclude"
rm -rf .git/lfs/objects
git lfs fetch --include="a*" origin master newbranch
assert_local_object "$contents_oid" 1
refute_local_object "$b_oid"
rm -rf .git/lfs/objects
git lfs fetch --exclude="a*" origin master newbranch
refute_local_object "$contents_oid"
assert_local_object "$b_oid" 1
rm -rf .git/lfs/objects
git lfs fetch -I "a*,b*" -X "c*,d*" origin master newbranch
assert_local_object "$contents_oid" 1
assert_local_object "$b_oid" 1
rm -rf .git/lfs/objects
git lfs fetch --include="c*,d*" --exclude="a*,b*" origin master newbranch
refute_local_object "$contents_oid"
refute_local_object "$b_oid"
)
end_test
begin_test "fetch-recent"
(
set -e
reponame="fetch-recent"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
# generate content we'll use
content0="filecontent0"
content1="filecontent1"
content2="filecontent2"
content3="filecontent3"
content4="filecontent4"
content5="filecontent5"
oid0=$(printf "$content0" | shasum -a 256 | cut -f 1 -d " ")
oid1=$(printf "$content1" | shasum -a 256 | cut -f 1 -d " ")
oid2=$(printf "$content2" | shasum -a 256 | cut -f 1 -d " ")
oid3=$(printf "$content3" | shasum -a 256 | cut -f 1 -d " ")
oid4=$(printf "$content4" | shasum -a 256 | cut -f 1 -d " ")
oid5=$(printf "$content5" | shasum -a 256 | cut -f 1 -d " ")
echo "[
{
\"CommitDate\":\"$(get_date -18d)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content0}, \"Data\":\"$content0\"},
{\"Filename\":\"file3.dat\",\"Size\":${#content5}, \"Data\":\"$content5\"}]
},
{
\"CommitDate\":\"$(get_date -14d)\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content1}, \"Data\":\"$content1\"}]
},
{
\"CommitDate\":\"$(get_date -5d)\",
\"NewBranch\":\"other_branch\",
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content4}, \"Data\":\"$content4\"}]
},
{
\"CommitDate\":\"$(get_date -1d)\",
\"ParentBranches\":[\"master\"],
\"Files\":[
{\"Filename\":\"file1.dat\",\"Size\":${#content2}, \"Data\":\"$content2\"},
{\"Filename\":\"file2.dat\",\"Size\":${#content3}, \"Data\":\"$content3\"}]
}
]" | lfstest-testutils addcommits
git push origin master
git push origin other_branch
assert_server_object "$reponame" "$oid0"
assert_server_object "$reponame" "$oid1"
assert_server_object "$reponame" "$oid2"
assert_server_object "$reponame" "$oid3"
assert_server_object "$reponame" "$oid4"
rm -rf .git/lfs/objects
git config lfs.fetchrecentalways false
git config lfs.fetchrecentrefsdays 0
git config lfs.fetchrecentremoterefs false
git config lfs.fetchrecentcommitsdays 7
# fetch normally, should just get the last state for file1/2
git lfs fetch origin master
assert_local_object "$oid2" "${#content2}"
assert_local_object "$oid3" "${#content3}"
assert_local_object "$oid5" "${#content5}"
refute_local_object "$oid0"
refute_local_object "$oid1"
refute_local_object "$oid4"
rm -rf .git/lfs/objects
# now fetch recent - just commits for now
git config lfs.fetchrecentrefsdays 0
git config lfs.fetchrecentremoterefs false
git config lfs.fetchrecentcommitsdays 7
git lfs fetch --recent origin
# that should have fetched master plus previous state needed within 7 days
# current state
assert_local_object "$oid2" "${#content2}"
assert_local_object "$oid3" "${#content3}"
# previous state is the 'before' state of any commits made in last 7 days
# ie you can check out anything in last 7 days (may have non-LFS commits in between)
assert_local_object "$oid1" "${#content1}"
refute_local_object "$oid0"
refute_local_object "$oid4"
rm -rf .git/lfs/objects
# now fetch other_branch as well
git config lfs.fetchrecentrefsdays 6
git config lfs.fetchrecentremoterefs false
git config lfs.fetchrecentcommitsdays 7
git lfs fetch --recent origin
# that should have fetched master plus previous state needed within 7 days
# current state PLUS refs within 6 days (& their commits within 7)
assert_local_object "$oid2" "${#content2}"
assert_local_object "$oid3" "${#content3}"
assert_local_object "$oid1" "${#content1}"
assert_local_object "$oid4" "${#content4}"
# still omits oid0 since that's at best 13 days prior to other_branch tip
refute_local_object "$oid0"
# now test that a 14 day limit picks oid0 up from other_branch
# because other_branch was itself 5 days ago, 5+14=19 day search limit
git config lfs.fetchrecentcommitsdays 14
git lfs fetch --recent origin
assert_local_object "$oid0" "${#content0}"
# push branch & test remote branch recent
git push origin other_branch
git branch -D other_branch
rm -rf .git/lfs/objects
git config lfs.fetchrecentcommitsdays 0
git config lfs.fetchrecentremoterefs false
git config lfs.fetchrecentrefsdays 6
git lfs fetch --recent origin
# should miss #4 until we include remote branches (#1 will always be missing commitdays=0)
assert_local_object "$oid2" "${#content2}"
assert_local_object "$oid3" "${#content3}"
refute_local_object "$oid1"
refute_local_object "$oid0"
refute_local_object "$oid4"
# pick up just snapshot at remote ref, ie #4
git config lfs.fetchrecentremoterefs true
git lfs fetch --recent origin
assert_local_object "$oid4" "${#content4}"
refute_local_object "$oid0"
refute_local_object "$oid1"
)
end_test