115 lines
3.5 KiB
Bash
Executable File
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
|