replace Readdirnames() with FastWalkGitRepo()

This commit is contained in:
rick olson 2017-10-25 09:31:50 -06:00
parent 10dc9749f4
commit cdc7946740
2 changed files with 33 additions and 44 deletions

@ -6,6 +6,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/git-lfs/git-lfs/tools"
"github.com/rubyist/tracerx" "github.com/rubyist/tracerx"
) )
@ -15,50 +16,36 @@ func (f *Filesystem) cleanupTmp() error {
return nil return nil
} }
d, err := os.Open(tmpdir) var walkErr error
if err != nil { tools.FastWalkGitRepo(tmpdir, func(parentDir string, info os.FileInfo, err error) {
return err if err != nil {
} walkErr = err
}
filenames, _ := d.Readdirnames(-1) if walkErr != nil || info.IsDir() {
for _, filename := range filenames { return
path := filepath.Join(tmpdir, filename) }
if f.shouldDeleteTempObject(path) { path := filepath.Join(parentDir, info.Name())
os.RemoveAll(path) parts := strings.SplitN(info.Name(), "-", 2)
oid := parts[0]
if len(parts) < 2 || len(oid) != 64 {
tracerx.Printf("Removing invalid tmp object file: %s", path)
os.RemoveAll(path)
return
} }
}
return nil fi, err := os.Stat(f.ObjectPath(oid))
} if err == nil && !fi.IsDir() {
tracerx.Printf("Removing existing tmp object file: %s", path)
func (f *Filesystem) shouldDeleteTempObject(path string) bool { os.RemoveAll(path)
info, err := os.Stat(path) return
if err != nil { }
return false
} if time.Since(info.ModTime()) > time.Hour {
tracerx.Printf("Removing old tmp object file: %s", path)
if info.IsDir() { os.RemoveAll(path)
return false return
} }
})
base := filepath.Base(path)
parts := strings.SplitN(base, "-", 2) return walkErr
oid := parts[0]
if len(parts) < 2 || len(oid) != 64 {
tracerx.Printf("Removing invalid tmp object file: %s", path)
return true
}
fi, err := os.Stat(f.ObjectPath(oid))
if err == nil && !fi.IsDir() {
tracerx.Printf("Removing existing tmp object file: %s", path)
return true
}
if time.Since(info.ModTime()) > time.Hour {
tracerx.Printf("Removing old tmp object file: %s", path)
return true
}
return false
} }

@ -82,6 +82,8 @@ begin_test "clears local temp objects"
touch .git/lfs/tmp/objects/badabcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxy-rand123 touch .git/lfs/tmp/objects/badabcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxy-rand123
touch .git/lfs/tmp/objects/badabcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxy-rand456 touch .git/lfs/tmp/objects/badabcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxy-rand456
tree .git/lfs/tmp/objects
GIT_TRACE=5 git lfs env GIT_TRACE=5 git lfs env
# object file exists # object file exists