summaryrefslogtreecommitdiff
path: root/git.go
diff options
context:
space:
mode:
Diffstat (limited to 'git.go')
-rw-r--r--git.go121
1 files changed, 105 insertions, 16 deletions
diff --git a/git.go b/git.go
index 8159244..2afbfaa 100644
--- a/git.go
+++ b/git.go
@@ -15,14 +15,78 @@ import (
"unsafe"
)
+type ErrorClass int
+
const (
- ITEROVER = C.GIT_ITEROVER
- EEXISTS = C.GIT_EEXISTS
- ENOTFOUND = C.GIT_ENOTFOUND
+ ErrClassNone ErrorClass = C.GITERR_NONE
+ ErrClassNoMemory = C.GITERR_NOMEMORY
+ ErrClassOs = C.GITERR_OS
+ ErrClassInvalid = C.GITERR_INVALID
+ ErrClassReference = C.GITERR_REFERENCE
+ ErrClassZlib = C.GITERR_ZLIB
+ ErrClassRepository = C.GITERR_REPOSITORY
+ ErrClassConfig = C.GITERR_CONFIG
+ ErrClassRegex = C.GITERR_REGEX
+ ErrClassOdb = C.GITERR_ODB
+ ErrClassIndex = C.GITERR_INDEX
+ ErrClassObject = C.GITERR_OBJECT
+ ErrClassNet = C.GITERR_NET
+ ErrClassTag = C.GITERR_TAG
+ ErrClassTree = C.GITERR_TREE
+ ErrClassIndexer = C.GITERR_INDEXER
+ ErrClassSSL = C.GITERR_SSL
+ ErrClassSubmodule = C.GITERR_SUBMODULE
+ ErrClassThread = C.GITERR_THREAD
+ ErrClassStash = C.GITERR_STASH
+ ErrClassCheckout = C.GITERR_CHECKOUT
+ ErrClassFetchHead = C.GITERR_FETCHHEAD
+ ErrClassMerge = C.GITERR_MERGE
+ ErrClassSsh = C.GITERR_SSH
+ ErrClassFilter = C.GITERR_FILTER
+ ErrClassRevert = C.GITERR_REVERT
+ ErrClassCallback = C.GITERR_CALLBACK
)
-var (
- ErrIterOver = errors.New("Iteration is over")
+type ErrorCode int
+
+const (
+
+ // No error
+ ErrOk ErrorCode = C.GIT_OK
+ // Generic error
+ ErrGeneric = C.GIT_ERROR
+ // Requested object could not be found
+ ErrNotFound = C.GIT_ENOTFOUND
+ // Object exists preventing operation
+ ErrExists = C.GIT_EEXISTS
+ // More than one object matches
+ ErrAmbigious = C.GIT_EAMBIGUOUS
+ // Output buffer too short to hold data
+ ErrBuffs = C.GIT_EBUFS
+ // GIT_EUSER is a special error that is never generated by libgit2
+ // code. You can return it from a callback (e.g to stop an iteration)
+ // to know that it was generated by the callback and not by libgit2.
+ ErrUser = C.GIT_EUSER
+ // Operation not allowed on bare repository
+ ErrBareRepo = C.GIT_EBAREREPO
+ // HEAD refers to branch with no commits
+ ErrUnbornBranch = C.GIT_EUNBORNBRANCH
+ // Merge in progress prevented operation
+ ErrUnmerged = C.GIT_EUNMERGED
+ // Reference was not fast-forwardable
+ ErrNonFastForward = C.GIT_ENONFASTFORWARD
+ // Name/ref spec was not in a valid format
+ ErrInvalidSpec = C.GIT_EINVALIDSPEC
+ // Merge conflicts prevented operation
+ ErrMergeConflict = C.GIT_EMERGECONFLICT
+ // Lock file prevented operation
+ ErrLocked = C.GIT_ELOCKED
+ // Reference value does not match expected
+ ErrModified = C.GIT_EMODIFIED
+ // Internal only
+ ErrPassthrough = C.GIT_PASSTHROUGH
+ // Signals end of iteration with iterator
+ ErrIterOver = C.GIT_ITEROVER
)
func init() {
@@ -64,6 +128,10 @@ func NewOid(s string) (*Oid, error) {
return nil, error
}
+ if len(slice) != 20 {
+ return nil, &GitError{"Invalid Oid", ErrClassNone, ErrGeneric}
+ }
+
copy(o[:], slice[:20])
return o, nil
}
@@ -124,29 +192,50 @@ func ShortenOids(ids []*Oid, minlen int) (int, error) {
}
type GitError struct {
- Message string
- Class int
- ErrorCode int
+ Message string
+ Class ErrorClass
+ Code ErrorCode
}
func (e GitError) Error() string {
return e.Message
}
-func IsNotExist(err error) bool {
- return err.(*GitError).ErrorCode == C.GIT_ENOTFOUND
+func IsErrorClass(err error, c ErrorClass) bool {
+
+ if err == nil {
+ return false
+ }
+ if gitError, ok := err.(*GitError); ok {
+ return gitError.Class == c
+ }
+ return false
}
-func IsExist(err error) bool {
- return err.(*GitError).ErrorCode == C.GIT_EEXISTS
+func IsErrorCode(err error, c ErrorCode) bool {
+ if err == nil {
+ return false
+ }
+ if gitError, ok := err.(*GitError); ok {
+ return gitError.Code == c
+ }
+ return false
}
func MakeGitError(errorCode C.int) error {
- err := C.giterr_last()
- if err == nil {
- return &GitError{"No message", C.GITERR_INVALID, C.GIT_ERROR}
+
+ var errMessage string
+ var errClass ErrorClass
+ if errorCode != ErrIterOver {
+ err := C.giterr_last()
+ if err != nil {
+ errMessage = C.GoString(err.message)
+ errClass = ErrorClass(err.klass)
+ } else {
+ errClass = ErrClassInvalid
+ }
}
- return &GitError{C.GoString(err.message), int(err.klass), int(errorCode)}
+ return &GitError{errMessage, errClass, ErrorCode(errorCode)}
}
func MakeGitError2(err int) error {