write fsck results to stdout instead of logging an error
This commit is contained in:
parent
c6ee2e2e3f
commit
0fb75eddfb
@ -12,14 +12,6 @@ import (
|
||||
"github.com/github/git-lfs/vendor/_nuts/github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type fsckError struct {
|
||||
name, oid string
|
||||
}
|
||||
|
||||
func (e *fsckError) Error() string {
|
||||
return "Object " + e.name + " (" + e.oid + ") is corrupt"
|
||||
}
|
||||
|
||||
var (
|
||||
fsckCmd = &cobra.Command{
|
||||
Use: "fsck",
|
||||
@ -28,26 +20,28 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func doFsck(localGitDir string) error {
|
||||
func doFsck(localGitDir string) (bool, error) {
|
||||
ref, err := git.CurrentRef()
|
||||
if err != nil {
|
||||
return err
|
||||
return false, err
|
||||
}
|
||||
|
||||
pointers, err := lfs.ScanRefs(ref, "")
|
||||
if err != nil {
|
||||
return err
|
||||
return false, err
|
||||
}
|
||||
|
||||
// TODO(zeroshirts): do we want to look for LFS stuff in past commits?
|
||||
p2, err := lfs.ScanIndex()
|
||||
if err != nil {
|
||||
return err
|
||||
return false, err
|
||||
}
|
||||
|
||||
// zeroshirts: assuming no duplicates...
|
||||
pointers = append(pointers, p2...)
|
||||
|
||||
ok := true
|
||||
|
||||
for _, p := range pointers {
|
||||
path := filepath.Join(localGitDir, "lfs", "objects", p.Pointer.Oid[0:2], p.Pointer.Oid[2:4], p.Pointer.Oid)
|
||||
|
||||
@ -55,23 +49,23 @@ func doFsck(localGitDir string) error {
|
||||
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
return false, err
|
||||
}
|
||||
|
||||
oidHash := sha256.New()
|
||||
_, err = io.Copy(oidHash, f)
|
||||
f.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
return false, err
|
||||
}
|
||||
|
||||
recalculatedOid := hex.EncodeToString(oidHash.Sum(nil))
|
||||
if recalculatedOid != p.Pointer.Oid {
|
||||
return &fsckError{p.Name, p.Pointer.Oid}
|
||||
ok = false
|
||||
Print("Object %s (%s) is corrupt", p.Name, p.Oid)
|
||||
}
|
||||
Debug("%v (%v) intact", p.Name, path)
|
||||
}
|
||||
return nil
|
||||
return ok, nil
|
||||
}
|
||||
|
||||
// TODO(zeroshirts): 'git fsck' reports status (percentage, current#/total) as
|
||||
@ -83,11 +77,14 @@ func doFsck(localGitDir string) error {
|
||||
func fsckCommand(cmd *cobra.Command, args []string) {
|
||||
lfs.InstallHooks(false)
|
||||
|
||||
err := doFsck(lfs.LocalGitDir)
|
||||
ok, err := doFsck(lfs.LocalGitDir)
|
||||
if err != nil {
|
||||
Panic(err, "Could not fsck Git LFS files")
|
||||
Panic(err, "Error checking Git LFS files")
|
||||
}
|
||||
|
||||
if ok {
|
||||
Print("Git LFS fsck OK")
|
||||
}
|
||||
Print("Git LFS fsck OK")
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
@ -13,7 +13,7 @@ func TestFsck(t *testing.T) {
|
||||
defer repo.Test()
|
||||
|
||||
cmd := repo.Command("fsck")
|
||||
cmd.Output = "Could not fsck Git LFS files"
|
||||
cmd.Output = "Object a.dat (916f0027a575074ce72a331777c3478d6513f786a591bd892da1a577bf2335f9) is corrupt"
|
||||
|
||||
testFileContent := "test data"
|
||||
h := sha256.New()
|
||||
|
Loading…
Reference in New Issue
Block a user