git-lfs/test/test-prune.sh

115 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
. "test/testlib.sh"
begin_test "prune unreferenced and old"
(
set -e
reponame="prune_unref_old"
setup_remote_repo "remote_$reponame"
clone_repo "remote_$reponame" "clone_$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
# generate content we'll use
content_unreferenced="To delete: unreferenced"
content_oldandpushed="To delete: pushed and too old"
content_oldandunchanged="Keep: pushed and created a while ago, but still current"
oid_unreferenced=$(calc_oid "$content_unreferenced")
oid_oldandpushed=$(calc_oid "$content_oldandpushed")
oid_oldandunchanged=$(calc_oid "$content_oldandunchanged")
content_retain1="Retained content 1"
content_retain2="Retained content 2"
oid_retain1=$(calc_oid "$content_retain1")
oid_retain2=$(calc_oid "$content_retain2")
# Remember for something to be 'too old' it has to appear on the MINUS side
# of the diff outside the prune window, i.e. it's not when it was introduced
# but when it disappeared from relevance. That's why changes to file1.dat on master
# from 7d ago are included even though the commit itself is outside of the window,
# that content of file1.dat was relevant until it was removed with a commit, inside the window
# think of it as windows of relevance that overlap until the content is replaced
# we also make sure we commit today on master so that the recent commits measured
# from latest commit on master tracks back from there
echo "[
{
\"CommitDate\":\"$(get_date -20d)\",
\"Files\":[
{\"Filename\":\"old.dat\",\"Size\":${#content_oldandpushed}, \"Data\":\"$content_oldandpushed\"},
{\"Filename\":\"stillcurrent.dat\",\"Size\":${#content_oldandunchanged}, \"Data\":\"$content_oldandunchanged\"}]
},
{
\"CommitDate\":\"$(get_date -7d)\",
\"Files\":[
{\"Filename\":\"old.dat\",\"Size\":${#content_retain1}, \"Data\":\"$content_retain1\"}]
},
{
\"CommitDate\":\"$(get_date -4d)\",
\"NewBranch\":\"branch_to_delete\",
\"Files\":[
{\"Filename\":\"unreferenced.dat\",\"Size\":${#content_unreferenced}, \"Data\":\"$content_unreferenced\"}]
},
{
\"ParentBranches\":[\"master\"],
\"Files\":[
{\"Filename\":\"old.dat\",\"Size\":${#content_retain2}, \"Data\":\"$content_retain2\"}]
}
]" | lfstest-testutils addcommits
git push origin master
git branch -D branch_to_delete
git config lfs.fetchrecentrefsdays 5
git config lfs.fetchrecentremoterefs true
git config lfs.fetchrecentcommitsdays 3
git config lfs.pruneoffset 2
git lfs prune --dry-run --verbose 2>&1 | tee prune.log
cat prune.log
grep "5 local objects, 3 retained" prune.log
grep "2 files would be pruned" prune.log
grep "$oid_oldandpushed" prune.log
grep "$oid_unreferenced" prune.log
assert_local_object "$oid_oldandpushed" "${#content_oldandpushed}"
assert_local_object "$oid_unreferenced" "${#content_unreferenced}"
git lfs prune
refute_local_object "$oid_oldandpushed" "${#content_oldandpushed}"
refute_local_object "$oid_unreferenced" "${#content_unreferenced}"
assert_local_object "$oid_retain1" "${#content_retain1}"
assert_local_object "$oid_retain2" "${#content_retain2}"
)
end_test
begin_test "prune unpushed HEAD"
(
# old commits on HEAD but latest few are not pushed so keep those
# even changes pre-HEAD
)
end_test
begin_test "prune worktree"
(
# old commits on HEAD but latest few are not pushed so keep those
# even changes pre-HEAD
)
end_test
begin_test "prune no remote"
(
)
end_test
begin_test "prune specify remote"
(
)
end_test