lean into pkg/errors philosophy on wrappin'

This commit is contained in:
risk danger olson 2016-08-18 15:24:11 -06:00
parent 311cc7a2af
commit 69acb28d61
8 changed files with 19 additions and 67 deletions

@ -140,34 +140,6 @@ func IsAuthError(err error) bool {
return false return false
} }
// IsInvalidPointerError indicates an attempt to parse data that was not a
// valid pointer.
func IsInvalidPointerError(err error) bool {
if e, ok := err.(interface {
InvalidPointer() bool
}); ok {
return e.InvalidPointer()
}
if parent := parentOf(err); parent != nil {
return IsInvalidPointerError(parent)
}
return false
}
// IsInvalidRepoError indicates an operation was attempted from outside a git
// repository.
func IsInvalidRepoError(err error) bool {
if e, ok := err.(interface {
InvalidRepo() bool
}); ok {
return e.InvalidRepo()
}
if parent := parentOf(err); parent != nil {
return IsInvalidRepoError(parent)
}
return false
}
// IsSmudgeError indicates an error while smudging a files. // IsSmudgeError indicates an error while smudging a files.
func IsSmudgeError(err error) bool { func IsSmudgeError(err error) bool {
if e, ok := err.(interface { if e, ok := err.(interface {
@ -398,34 +370,6 @@ func NewAuthError(err error) error {
return authError{newWrappedError(err, "Authentication required")} return authError{newWrappedError(err, "Authentication required")}
} }
// Definitions for IsInvalidPointerError()
type invalidPointerError struct {
errorWrapper
}
func (e invalidPointerError) InvalidPointer() bool {
return true
}
func NewInvalidPointerError(err error) error {
return invalidPointerError{newWrappedError(err, "Invalid pointer")}
}
// Definitions for IsInvalidRepoError()
type invalidRepoError struct {
errorWrapper
}
func (e invalidRepoError) InvalidRepo() bool {
return true
}
func NewInvalidRepoError(err error) error {
return invalidRepoError{newWrappedError(err, "Not in a git repository")}
}
// Definitions for IsSmudgeError() // Definitions for IsSmudgeError()
type smudgeError struct { type smudgeError struct {
@ -453,8 +397,9 @@ func (e cleanPointerError) CleanPointerError() bool {
return true return true
} }
func NewCleanPointerError(err error, pointer interface{}, bytes []byte) error { func NewCleanPointerError(pointer interface{}, bytes []byte) error {
e := cleanPointerError{newWrappedError(err, "Clean pointer error")} err := New("pointer error")
e := cleanPointerError{newWrappedError(err, "clean")}
ErrorSetContext(e, "pointer", pointer) ErrorSetContext(e, "pointer", pointer)
ErrorSetContext(e, "bytes", bytes) ErrorSetContext(e, "bytes", bytes)
return e return e
@ -486,8 +431,8 @@ func (e badPointerKeyError) BadPointerKeyError() bool {
} }
func NewBadPointerKeyError(expected, actual string) error { func NewBadPointerKeyError(expected, actual string) error {
err := fmt.Errorf("Error parsing LFS Pointer. Expected key %s, got %s", expected, actual) err := Errorf("Expected key %s, got %s", expected, actual)
return badPointerKeyError{expected, actual, newWrappedError(err, "")} return badPointerKeyError{expected, actual, newWrappedError(err, "pointer parsing")}
} }
// Definitions for IsDownloadDeclinedError() // Definitions for IsDownloadDeclinedError()
@ -500,8 +445,8 @@ func (e downloadDeclinedError) DownloadDeclinedError() bool {
return true return true
} }
func NewDownloadDeclinedError(err error) error { func NewDownloadDeclinedError(err error, msg string) error {
return downloadDeclinedError{newWrappedError(err, "File missing and download is not allowed")} return downloadDeclinedError{newWrappedError(err, msg)}
} }
// Definitions for IsRetriableError() // Definitions for IsRetriableError()

@ -79,10 +79,16 @@ func handleResponse(cfg *config.Configuration, res *http.Response, creds auth.Cr
} }
if res.StatusCode == 401 { if res.StatusCode == 401 {
if err == nil {
err = errors.New("api: received status 401")
}
return errors.NewAuthError(err) return errors.NewAuthError(err)
} }
if res.StatusCode > 499 && res.StatusCode != 501 && res.StatusCode != 509 { if res.StatusCode > 499 && res.StatusCode != 501 && res.StatusCode != 509 {
if err == nil {
err = errors.Errorf("api: received status %d", res.StatusCode)
}
return errors.NewFatalError(err) return errors.NewFatalError(err)
} }

@ -90,7 +90,7 @@ func (h *Hook) Upgrade() error {
// or any of the past versions of this hook. // or any of the past versions of this hook.
func (h *Hook) Uninstall() error { func (h *Hook) Uninstall() error {
if !InRepo() { if !InRepo() {
return errors.NewInvalidRepoError(nil) return errors.New("Not in a git repository")
} }
match, err := h.matchesCurrent() match, err := h.matchesCurrent()

@ -78,7 +78,7 @@ func copyToTemp(reader io.Reader, fileSize int64, cb progress.CopyCallback) (oid
by, ptr, err := DecodeFrom(reader) by, ptr, err := DecodeFrom(reader)
if err == nil && len(by) < 512 { if err == nil && len(by) < 512 {
err = errors.NewCleanPointerError(err, ptr, by) err = errors.NewCleanPointerError(ptr, by)
return return
} }

@ -46,7 +46,6 @@ func PointerSmudge(writer io.Writer, ptr *Pointer, workingfile string, download
LinkOrCopyFromReference(ptr.Oid, ptr.Size) LinkOrCopyFromReference(ptr.Oid, ptr.Size)
stat, statErr := os.Stat(mediafile) stat, statErr := os.Stat(mediafile)
if statErr == nil && stat != nil { if statErr == nil && stat != nil {
fileSize := stat.Size() fileSize := stat.Size()
if fileSize == 0 || fileSize != ptr.Size { if fileSize == 0 || fileSize != ptr.Size {
@ -60,7 +59,7 @@ func PointerSmudge(writer io.Writer, ptr *Pointer, workingfile string, download
if download { if download {
err = downloadFile(writer, ptr, workingfile, mediafile, manifest, cb) err = downloadFile(writer, ptr, workingfile, mediafile, manifest, cb)
} else { } else {
return errors.NewDownloadDeclinedError(nil) return errors.NewDownloadDeclinedError(statErr, "smudge")
} }
} else { } else {
err = readLocalFile(writer, ptr, mediafile, workingfile, cb) err = readLocalFile(writer, ptr, mediafile, workingfile, cb)

@ -128,7 +128,7 @@ func (a *adapterBase) worker(workerNum int, ctx interface{}) {
var err error var err error
if t.Object.IsExpired(time.Now().Add(objectExpirationGracePeriod)) { if t.Object.IsExpired(time.Now().Add(objectExpirationGracePeriod)) {
tracerx.Printf("xfer: adapter %q worker %d found job for %q expired, retrying...", a.Name(), workerNum, t.Object.Oid) tracerx.Printf("xfer: adapter %q worker %d found job for %q expired, retrying...", a.Name(), workerNum, t.Object.Oid)
err = errors.NewRetriableError(fmt.Errorf("lfs/transfer: object %q has expired", t.Object.Oid)) err = errors.NewRetriableError(errors.Errorf("lfs/transfer: object %q has expired", t.Object.Oid))
} else if t.Object.Size < 0 { } else if t.Object.Size < 0 {
tracerx.Printf("xfer: adapter %q worker %d found invalid size for %q (got: %d), retrying...", a.Name(), workerNum, t.Object.Oid, t.Object.Size) tracerx.Printf("xfer: adapter %q worker %d found invalid size for %q (got: %d), retrying...", a.Name(), workerNum, t.Object.Oid, t.Object.Size)
err = fmt.Errorf("Git LFS: object %q has invalid size (got: %d)", t.Object.Oid, t.Object.Size) err = fmt.Errorf("Git LFS: object %q has invalid size (got: %d)", t.Object.Oid, t.Object.Size)

@ -106,6 +106,7 @@ func (a *basicUploadAdapter) DoTransfer(ctx interface{}, t *Transfer, cb Transfe
// A status code of 403 likely means that an authentication token for the // A status code of 403 likely means that an authentication token for the
// upload has expired. This can be safely retried. // upload has expired. This can be safely retried.
if res.StatusCode == 403 { if res.StatusCode == 403 {
err = errors.New("http: received status 403")
return errors.NewRetriableError(err) return errors.NewRetriableError(err)
} }

@ -143,6 +143,7 @@ func (a *tusUploadAdapter) DoTransfer(ctx interface{}, t *Transfer, cb TransferP
// A status code of 403 likely means that an authentication token for the // A status code of 403 likely means that an authentication token for the
// upload has expired. This can be safely retried. // upload has expired. This can be safely retried.
if res.StatusCode == 403 { if res.StatusCode == 403 {
err = errors.New("http: received status 403")
return errors.NewRetriableError(err) return errors.NewRetriableError(err)
} }