write fsck results to stdout instead of logging an error

This commit is contained in:
Rick Olson 2015-05-08 10:20:02 -06:00 committed by Michael Käufl
parent c6ee2e2e3f
commit 0fb75eddfb
2 changed files with 18 additions and 21 deletions

@ -12,14 +12,6 @@ import (
"github.com/github/git-lfs/vendor/_nuts/github.com/spf13/cobra" "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 ( var (
fsckCmd = &cobra.Command{ fsckCmd = &cobra.Command{
Use: "fsck", Use: "fsck",
@ -28,26 +20,28 @@ var (
} }
) )
func doFsck(localGitDir string) error { func doFsck(localGitDir string) (bool, error) {
ref, err := git.CurrentRef() ref, err := git.CurrentRef()
if err != nil { if err != nil {
return err return false, err
} }
pointers, err := lfs.ScanRefs(ref, "") pointers, err := lfs.ScanRefs(ref, "")
if err != nil { if err != nil {
return err return false, err
} }
// TODO(zeroshirts): do we want to look for LFS stuff in past commits? // TODO(zeroshirts): do we want to look for LFS stuff in past commits?
p2, err := lfs.ScanIndex() p2, err := lfs.ScanIndex()
if err != nil { if err != nil {
return err return false, err
} }
// zeroshirts: assuming no duplicates... // zeroshirts: assuming no duplicates...
pointers = append(pointers, p2...) pointers = append(pointers, p2...)
ok := true
for _, p := range pointers { for _, p := range pointers {
path := filepath.Join(localGitDir, "lfs", "objects", p.Pointer.Oid[0:2], p.Pointer.Oid[2:4], p.Pointer.Oid) 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) f, err := os.Open(path)
if err != nil { if err != nil {
return err return false, err
} }
oidHash := sha256.New() oidHash := sha256.New()
_, err = io.Copy(oidHash, f) _, err = io.Copy(oidHash, f)
f.Close() f.Close()
if err != nil { if err != nil {
return err return false, err
} }
recalculatedOid := hex.EncodeToString(oidHash.Sum(nil)) recalculatedOid := hex.EncodeToString(oidHash.Sum(nil))
if recalculatedOid != p.Pointer.Oid { 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 // 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) { func fsckCommand(cmd *cobra.Command, args []string) {
lfs.InstallHooks(false) lfs.InstallHooks(false)
err := doFsck(lfs.LocalGitDir) ok, err := doFsck(lfs.LocalGitDir)
if err != nil { 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() { func init() {

@ -13,7 +13,7 @@ func TestFsck(t *testing.T) {
defer repo.Test() defer repo.Test()
cmd := repo.Command("fsck") cmd := repo.Command("fsck")
cmd.Output = "Could not fsck Git LFS files" cmd.Output = "Object a.dat (916f0027a575074ce72a331777c3478d6513f786a591bd892da1a577bf2335f9) is corrupt"
testFileContent := "test data" testFileContent := "test data"
h := sha256.New() h := sha256.New()