summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2015-06-28 01:32:13 +0200
committerCarlos Martín Nieto <[email protected]>2015-06-28 01:32:13 +0200
commite50203a2531209d32fab9d9b5fea3ff55c873c86 (patch)
tree782cd6f6816aec27707f2b84df4471e9a6983440
parent70c95a7655eddffda4cd8fddd87536c5580136fe (diff)
parent2488de286c0f73b31e95820835767adc3d2ee101 (diff)
Merge remote-tracking branch 'upstream/master' into next
Conflicts: branch.go
-rw-r--r--branch.go6
-rw-r--r--clone.go12
-rw-r--r--git.go2
-rw-r--r--remote.go28
4 files changed, 30 insertions, 18 deletions
diff --git a/branch.go b/branch.go
index 0daa99d..d0a0835 100644
--- a/branch.go
+++ b/branch.go
@@ -92,18 +92,18 @@ func (repo *Repository) NewBranchIterator(flags BranchType) (*BranchIterator, er
func (repo *Repository) CreateBranch(branchName string, target *Commit, force bool) (*Branch, error) {
- ref := new(Reference)
+ var ptr *C.git_reference
cBranchName := C.CString(branchName)
cForce := cbool(force)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- ret := C.git_branch_create(&ref.ptr, repo.ptr, cBranchName, target.cast_ptr, cForce)
+ ret := C.git_branch_create(&ptr, repo.ptr, cBranchName, target.cast_ptr, cForce)
if ret < 0 {
return nil, MakeGitError(ret)
}
- return ref.Branch(), nil
+ return newReferenceFromC(ptr, repo).Branch(), nil
}
func (b *Branch) Delete() error {
diff --git a/clone.go b/clone.go
index 233300d..f67f511 100644
--- a/clone.go
+++ b/clone.go
@@ -28,18 +28,20 @@ func Clone(url string, path string, options *CloneOptions) (*Repository, error)
cpath := C.CString(path)
defer C.free(unsafe.Pointer(cpath))
- var copts C.git_clone_options
- populateCloneOptions(&copts, options)
- defer freeCheckoutOpts(&copts.checkout_opts)
+ copts := (*C.git_clone_options)(C.calloc(1, C.size_t(unsafe.Sizeof(C.git_clone_options{}))))
+ populateCloneOptions(copts, options)
if len(options.CheckoutBranch) != 0 {
copts.checkout_branch = C.CString(options.CheckoutBranch)
- defer C.free(unsafe.Pointer(copts.checkout_branch))
}
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- ret := C.git_clone(&repo.ptr, curl, cpath, &copts)
+ ret := C.git_clone(&repo.ptr, curl, cpath, copts)
+ freeCheckoutOpts(&copts.checkout_opts)
+ C.free(unsafe.Pointer(copts.checkout_branch))
+ C.free(unsafe.Pointer(copts))
+
if ret < 0 {
return nil, MakeGitError(ret)
}
diff --git a/git.go b/git.go
index ae65cb7..34d58e6 100644
--- a/git.go
+++ b/git.go
@@ -86,6 +86,8 @@ const (
ErrPassthrough ErrorCode = C.GIT_PASSTHROUGH
// Signals end of iteration with iterator
ErrIterOver ErrorCode = C.GIT_ITEROVER
+ // Authentication failed
+ ErrAuth ErrorCode = C.GIT_EAUTH
)
var (
diff --git a/remote.go b/remote.go
index 5bed309..c221713 100644
--- a/remote.go
+++ b/remote.go
@@ -168,18 +168,24 @@ func newRemoteHeadFromC(ptr *C.git_remote_head) RemoteHead {
}
}
+func untrackCalbacksPayload(callbacks *C.git_remote_callbacks) {
+ if callbacks != nil && callbacks.payload != nil {
+ pointerHandles.Untrack(callbacks.payload)
+ }
+}
+
func populateRemoteCallbacks(ptr *C.git_remote_callbacks, callbacks *RemoteCallbacks) {
C.git_remote_init_callbacks(ptr, C.GIT_REMOTE_CALLBACKS_VERSION)
if callbacks == nil {
return
}
C._go_git_setup_callbacks(ptr)
- ptr.payload = unsafe.Pointer(callbacks)
+ ptr.payload = pointerHandles.Track(callbacks)
}
//export sidebandProgressCallback
func sidebandProgressCallback(_str *C.char, _len C.int, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.SidebandProgressCallback == nil {
return 0
}
@@ -189,7 +195,7 @@ func sidebandProgressCallback(_str *C.char, _len C.int, data unsafe.Pointer) int
//export completionCallback
func completionCallback(completion_type C.git_remote_completion_type, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.CompletionCallback == nil {
return 0
}
@@ -198,7 +204,7 @@ func completionCallback(completion_type C.git_remote_completion_type, data unsaf
//export credentialsCallback
func credentialsCallback(_cred **C.git_cred, _url *C.char, _username_from_url *C.char, allowed_types uint, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.CredentialsCallback == nil {
return 0
}
@@ -211,7 +217,7 @@ func credentialsCallback(_cred **C.git_cred, _url *C.char, _username_from_url *C
//export transferProgressCallback
func transferProgressCallback(stats *C.git_transfer_progress, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.TransferProgressCallback == nil {
return 0
}
@@ -220,7 +226,7 @@ func transferProgressCallback(stats *C.git_transfer_progress, data unsafe.Pointe
//export updateTipsCallback
func updateTipsCallback(_refname *C.char, _a *C.git_oid, _b *C.git_oid, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.UpdateTipsCallback == nil {
return 0
}
@@ -232,7 +238,7 @@ func updateTipsCallback(_refname *C.char, _a *C.git_oid, _b *C.git_oid, data uns
//export certificateCheckCallback
func certificateCheckCallback(_cert *C.git_cert, _valid C.int, _host *C.char, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
// if there's no callback set, we need to make sure we fail if the library didn't consider this cert valid
if callbacks.CertificateCheckCallback == nil {
if _valid == 1 {
@@ -273,7 +279,7 @@ func certificateCheckCallback(_cert *C.git_cert, _valid C.int, _host *C.char, da
//export packProgressCallback
func packProgressCallback(stage C.int, current, total C.uint, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.PackProgressCallback == nil {
return 0
@@ -284,7 +290,7 @@ func packProgressCallback(stage C.int, current, total C.uint, data unsafe.Pointe
//export pushTransferProgressCallback
func pushTransferProgressCallback(current, total C.uint, bytes C.size_t, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.PushTransferProgressCallback == nil {
return 0
}
@@ -294,7 +300,7 @@ func pushTransferProgressCallback(current, total C.uint, bytes C.size_t, data un
//export pushUpdateReferenceCallback
func pushUpdateReferenceCallback(refname, status *C.char, data unsafe.Pointer) int {
- callbacks := (*RemoteCallbacks)(data)
+ callbacks, _ := pointerHandles.Get(data).(*RemoteCallbacks)
if callbacks.PushUpdateReferenceCallback == nil {
return 0
@@ -604,6 +610,7 @@ func (o *Remote) Fetch(refspecs []string, opts *FetchOptions, msg string) error
var coptions C.git_fetch_options
populateFetchOptions(&coptions, opts);
+ defer untrackCalbacksPayload(&coptions.callbacks)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
@@ -696,6 +703,7 @@ func (o *Remote) Push(refspecs []string, opts *PushOptions) error {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
+ defer untrackCalbacksPayload(&copts.callbacks)
ret := C.git_remote_push(o.ptr, &crefspecs, &copts)
if ret < 0 {