diff --git a/remote.go b/remote.go index 89b305157..d88e8e6ff 100644 --- a/remote.go +++ b/remote.go @@ -32,6 +32,19 @@ var ( ErrExactSHA1NotSupported = errors.New("server does not support exact SHA1 refspec") ) +type NoMatchingRefSpecError struct { + refSpec config.RefSpec +} + +func (e NoMatchingRefSpecError) Error() string { + return fmt.Sprintf("couldn't find remote ref %q", e.refSpec.Src()) +} + +func (e NoMatchingRefSpecError) Is(target error) bool { + _, ok := target.(NoMatchingRefSpecError) + return ok +} + const ( // This describes the maximum number of commits to walk when // computing the haves to send to a server, for each ref in the @@ -751,7 +764,7 @@ func doCalculateRefs( }) if !matched && !s.IsWildcard() { - return fmt.Errorf("couldn't find remote ref %q", s.Src()) + return NoMatchingRefSpecError{refSpec: s} } return err diff --git a/remote_test.go b/remote_test.go index c6ea9eaf3..3446f1a86 100644 --- a/remote_test.go +++ b/remote_test.go @@ -3,6 +3,7 @@ package git import ( "bytes" "context" + "errors" "io" "io/ioutil" "os" @@ -145,6 +146,7 @@ func (s *RemoteSuite) TestFetchNonExistantReference(c *C) { }) c.Assert(err, ErrorMatches, "couldn't find remote ref.*") + c.Assert(errors.Is(err, NoMatchingRefSpecError{}), Equals, true) } func (s *RemoteSuite) TestFetchContext(c *C) {