Merge pull request #4973 from chrisd8088/prune-scan-refs-tree
Avoid pruning when identical files both match and do not match `lfs.fetchexclude`
This commit is contained in:
commit
33ad48cbec
@ -73,7 +73,7 @@ func checkoutCommand(cmd *cobra.Command, args []string) {
|
||||
|
||||
chgitscanner.Filter = filepathfilter.New(rootedPaths(args), nil, filepathfilter.GitIgnore)
|
||||
|
||||
if err := chgitscanner.ScanTree(ref.Sha); err != nil {
|
||||
if err := chgitscanner.ScanTree(ref.Sha, nil); err != nil {
|
||||
ExitWithError(err)
|
||||
}
|
||||
chgitscanner.Close()
|
||||
|
@ -87,7 +87,7 @@ func dedupCommand(cmd *cobra.Command, args []string) {
|
||||
})
|
||||
defer gitScanner.Close()
|
||||
|
||||
if err := gitScanner.ScanTree("HEAD"); err != nil {
|
||||
if err := gitScanner.ScanTree("HEAD", nil); err != nil {
|
||||
ExitWithError(err)
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,7 @@ func pointersToFetchForRef(ref string, filter *filepathfilter.Filter) ([]*lfs.Wr
|
||||
|
||||
tempgitscanner.Filter = filter
|
||||
|
||||
if err := tempgitscanner.ScanTree(ref); err != nil {
|
||||
if err := tempgitscanner.ScanTree(ref, nil); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -137,7 +137,7 @@ func lsFilesCommand(cmd *cobra.Command, args []string) {
|
||||
} else if scanRange {
|
||||
err = gitscanner.ScanRefRange(includeRef, ref, nil)
|
||||
} else {
|
||||
err = gitscanner.ScanTree(ref)
|
||||
err = gitscanner.ScanTree(ref, nil)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
@ -352,7 +352,7 @@ func pruneTaskGetRetainedAtRef(gitscanner *lfs.GitScanner, ref string, retainCha
|
||||
defer sem.Release(1)
|
||||
defer waitg.Done()
|
||||
|
||||
err := gitscanner.ScanRef(ref, func(p *lfs.WrappedPointer, err error) {
|
||||
err := gitscanner.ScanTree(ref, func(p *lfs.WrappedPointer, err error) {
|
||||
if err != nil {
|
||||
errorChan <- err
|
||||
return
|
||||
|
@ -87,7 +87,7 @@ func pull(filter *filepathfilter.Filter) {
|
||||
}()
|
||||
|
||||
processQueue := time.Now()
|
||||
if err := gitscanner.ScanTree(ref.Sha); err != nil {
|
||||
if err := gitscanner.ScanTree(ref.Sha, nil); err != nil {
|
||||
singleCheckout.Close()
|
||||
ExitWithError(err)
|
||||
}
|
||||
|
@ -208,8 +208,8 @@ func (s *GitScanner) ScanAll(cb GitScannerFoundPointer) error {
|
||||
// ScanTree takes a ref and returns WrappedPointer objects in the tree at that
|
||||
// ref. Differs from ScanRefs in that multiple files in the tree with the same
|
||||
// content are all reported.
|
||||
func (s *GitScanner) ScanTree(ref string) error {
|
||||
callback, err := firstGitScannerCallback(s.FoundPointer)
|
||||
func (s *GitScanner) ScanTree(ref string, cb GitScannerFoundPointer) error {
|
||||
callback, err := firstGitScannerCallback(cb, s.FoundPointer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
26
t/t-prune.sh
26
t/t-prune.sh
@ -112,10 +112,14 @@ begin_test "prune all excluded paths"
|
||||
content_oldandexcluded="To delete: pushed and too old and excluded by filter"
|
||||
content_oldandunchanged="Keep: pushed and created a while ago, but still current"
|
||||
content_prevandexcluded="To delete: pushed and in previous commit to HEAD but excluded by filter"
|
||||
content_unreferencedandexcluded="To delete: unreferenced in deleted branch and pushed and excluded by filter"
|
||||
content_includedandexcluded="Keep: pushed and both excluded by filter and included by another path"
|
||||
content_excluded="To delete: pushed and in HEAD but excluded by filter"
|
||||
oid_oldandexcluded=$(calc_oid "$content_oldandexcluded")
|
||||
oid_oldandunchanged=$(calc_oid "$content_oldandunchanged")
|
||||
oid_prevandexcluded=$(calc_oid "$content_prevandexcluded")
|
||||
oid_unreferencedandexcluded=$(calc_oid "$content_unreferencedandexcluded")
|
||||
oid_includedandexcluded=$(calc_oid "$content_includedandexcluded")
|
||||
oid_excluded=$(calc_oid "$content_excluded")
|
||||
|
||||
echo "[
|
||||
@ -131,12 +135,23 @@ begin_test "prune all excluded paths"
|
||||
{\"Filename\":\"foo/oldandexcluded.dat\",\"Size\":${#content_prevandexcluded}, \"Data\":\"$content_prevandexcluded\"}]
|
||||
},
|
||||
{
|
||||
\"CommitDate\":\"$(get_date -4d)\",
|
||||
\"NewBranch\":\"branch_to_delete\",
|
||||
\"Files\":[
|
||||
{\"Filename\":\"unreferenced.dat\",\"Size\":${#content_unreferencedandexcluded}, \"Data\":\"$content_unreferencedandexcluded\"}]
|
||||
},
|
||||
{
|
||||
\"ParentBranches\":[\"main\"],
|
||||
\"Files\":[
|
||||
{\"Filename\":\"foo/unreferencedandexcluded.dat\",\"Size\":${#content_unreferencedandexcluded}, \"Data\":\"$content_unreferencedandexcluded\"},
|
||||
{\"Filename\":\"foo/includedandexcluded.dat\",\"Size\":${#content_includedandexcluded}, \"Data\":\"$content_includedandexcluded\"},
|
||||
{\"Filename\":\"included.dat\",\"Size\":${#content_includedandexcluded}, \"Data\":\"$content_includedandexcluded\"},
|
||||
{\"Filename\":\"foo/oldandexcluded.dat\",\"Size\":${#content_excluded}, \"Data\":\"$content_excluded\"}]
|
||||
}
|
||||
]" | lfstest-testutils addcommits
|
||||
|
||||
git push origin main
|
||||
git branch -D branch_to_delete
|
||||
|
||||
git config lfs.fetchrecentrefsdays 5
|
||||
git config lfs.fetchrecentremoterefs true
|
||||
@ -148,16 +163,23 @@ begin_test "prune all excluded paths"
|
||||
|
||||
git lfs prune --dry-run --verbose 2>&1 | tee prune.log
|
||||
|
||||
grep "prune: 4 local objects, 1 retained" prune.log
|
||||
grep "prune: 3 files would be pruned" prune.log
|
||||
grep "prune: 6 local objects, 2 retained" prune.log
|
||||
grep "prune: 4 files would be pruned" prune.log
|
||||
grep "$oid_oldandexcluded" prune.log
|
||||
grep "$oid_prevandexcluded" prune.log
|
||||
grep "$oid_unreferencedandexcluded" prune.log
|
||||
grep "$oid_excluded" prune.log
|
||||
|
||||
assert_local_object "$oid_oldandexcluded" "${#content_oldandexcluded}"
|
||||
assert_local_object "$oid_prevandexcluded" "${#content_prevandexcluded}"
|
||||
assert_local_object "$oid_unreferencedandexcluded" "${#content_unreferencedandexcluded}"
|
||||
assert_local_object "$oid_excluded" "${#content_excluded}"
|
||||
git lfs prune
|
||||
refute_local_object "$oid_oldandexcluded" "${#content_oldandexcluded}"
|
||||
assert_local_object "$oid_oldandunchanged" "${#content_oldandunchanged}"
|
||||
refute_local_object "$oid_prevandexcluded" "${#content_prevandexcluded}"
|
||||
refute_local_object "$oid_unreferencedandexcluded" "${#content_unreferencedandexcluded}"
|
||||
assert_local_object "$oid_includedandexcluded" "${#content_includedandexcluded}"
|
||||
refute_local_object "$oid_excluded" "${#content_excluded}"
|
||||
)
|
||||
end_test
|
||||
|
Loading…
Reference in New Issue
Block a user