summaryrefslogtreecommitdiff
path: root/git.go
diff options
context:
space:
mode:
Diffstat (limited to 'git.go')
-rw-r--r--git.go46
1 files changed, 41 insertions, 5 deletions
diff --git a/git.go b/git.go
index a44459f..c032b0a 100644
--- a/git.go
+++ b/git.go
@@ -1,9 +1,17 @@
package git
/*
+#cgo CFLAGS: -I${SRCDIR}/vendor/libgit2/include
+#cgo LDFLAGS: -L${SRCDIR}/vendor/libgit2/build/ -lgit2
+#cgo windows LDFLAGS: -lwinhttp
+#cgo !windows pkg-config: --static ${SRCDIR}/vendor/libgit2/build/libgit2.pc
#include <git2.h>
#include <git2/sys/openssl.h>
-#cgo pkg-config: libgit2
+
+#if LIBGIT2_VER_MAJOR != 0 || LIBGIT2_VER_MINOR != 25
+# error "Invalid libgit2 version; this git2go supports libgit2 v0.25"
+#endif
+
*/
import "C"
import (
@@ -45,6 +53,7 @@ const (
ErrClassFilter ErrorClass = C.GITERR_FILTER
ErrClassRevert ErrorClass = C.GITERR_REVERT
ErrClassCallback ErrorClass = C.GITERR_CALLBACK
+ ErrClassRebase ErrorClass = C.GITERR_REBASE
)
type ErrorCode int
@@ -53,6 +62,7 @@ const (
// No error
ErrOk ErrorCode = C.GIT_OK
+
// Generic error
ErrGeneric ErrorCode = C.GIT_ERROR
// Requested object could not be found
@@ -63,10 +73,12 @@ const (
ErrAmbigious ErrorCode = C.GIT_EAMBIGUOUS
// Output buffer too short to hold data
ErrBuffs ErrorCode = 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 ErrorCode = C.GIT_EUSER
+
// Operation not allowed on bare repository
ErrBareRepo ErrorCode = C.GIT_EBAREREPO
// HEAD refers to branch with no commits
@@ -77,18 +89,33 @@ const (
ErrNonFastForward ErrorCode = C.GIT_ENONFASTFORWARD
// Name/ref spec was not in a valid format
ErrInvalidSpec ErrorCode = C.GIT_EINVALIDSPEC
- // Merge conflicts prevented operation
- ErrMergeConflict ErrorCode = C.GIT_EMERGECONFLICT
+ // Checkout conflicts prevented operation
+ ErrConflict ErrorCode = C.GIT_ECONFLICT
// Lock file prevented operation
ErrLocked ErrorCode = C.GIT_ELOCKED
// Reference value does not match expected
ErrModified ErrorCode = C.GIT_EMODIFIED
+ // Authentication failed
+ ErrAuth ErrorCode = C.GIT_EAUTH
+ // Server certificate is invalid
+ ErrCertificate ErrorCode = C.GIT_ECERTIFICATE
+ // Patch/merge has already been applied
+ ErrApplied ErrorCode = C.GIT_EAPPLIED
+ // The requested peel operation is not possible
+ ErrPeel ErrorCode = C.GIT_EPEEL
+ // Unexpected EOF
+ ErrEOF ErrorCode = C.GIT_EEOF
+ // Uncommitted changes in index prevented operation
+ ErrUncommitted ErrorCode = C.GIT_EUNCOMMITTED
+ // The operation is not valid for a directory
+ ErrDirectory ErrorCode = C.GIT_EDIRECTORY
+ // A merge conflict exists and cannot continue
+ ErrMergeConflict ErrorCode = C.GIT_EMERGECONFLICT
+
// Internal only
ErrPassthrough ErrorCode = C.GIT_PASSTHROUGH
// Signals end of iteration with iterator
ErrIterOver ErrorCode = C.GIT_ITEROVER
- // Authentication failed
- ErrAuth ErrorCode = C.GIT_EAUTH
)
var (
@@ -102,6 +129,15 @@ func init() {
C.git_libgit2_init()
+ // Due to the multithreaded nature of Go and its interaction with
+ // calling C functions, we cannot work with a library that was not built
+ // with multi-threading support. The most likely outcome is a segfault
+ // or panic at an incomprehensible time, so let's make it easy by
+ // panicking right here.
+ if Features()&FeatureThreads == 0 {
+ panic("libgit2 was not built with threading support")
+ }
+
// This is not something we should be doing, as we may be
// stomping all over someone else's setup. The user should do
// this themselves or use some binding/wrapper which does it