summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYashodhan Ghadge <[email protected]>2021-10-23 20:33:10 +0300
committerGitHub <[email protected]>2021-10-23 10:33:10 -0700
commit0e8009f00a65034d196c67b1cdd82af6f12c34d3 (patch)
tree26ea2a1a90daac40ab95aecbcbf98fa156223177
parent6eae74c128e37e590d3a5da3fe0561add4b94d5c (diff)
bugfix: HTTPS Clone fails with remote pointer not found using Go transport (#836) (#842)
Fixes: #836 Changes: * adding a weak bool param for Remote * create a new remote in the smartTransportCallback incase one is not found
-rw-r--r--clone_test.go15
-rw-r--r--remote.go15
-rw-r--r--transport.go7
3 files changed, 34 insertions, 3 deletions
diff --git a/clone_test.go b/clone_test.go
index 8814dd0..9ff03e6 100644
--- a/clone_test.go
+++ b/clone_test.go
@@ -2,6 +2,7 @@ package git
import (
"io/ioutil"
+ "os"
"testing"
)
@@ -70,3 +71,17 @@ func TestCloneWithCallback(t *testing.T) {
}
defer remote.Free()
}
+
+// TestCloneWithExternalHTTPUrl
+func TestCloneWithExternalHTTPUrl(t *testing.T) {
+
+ path, err := ioutil.TempDir("", "git2go")
+ defer os.RemoveAll(path)
+
+ // clone the repo
+ url := "https://github.com/libgit2/TestGitRepository"
+ _, err = Clone(url, path, &CloneOptions{})
+ if err != nil {
+ t.Fatal("cannot clone remote repo via https, error: ", err)
+ }
+}
diff --git a/remote.go b/remote.go
index 7abc461..f4424fc 100644
--- a/remote.go
+++ b/remote.go
@@ -182,6 +182,9 @@ type Remote struct {
ptr *C.git_remote
callbacks RemoteCallbacks
repo *Repository
+ // weak indicates that a remote is a weak pointer and should not be
+ // freed.
+ weak bool
}
type remotePointerList struct {
@@ -602,6 +605,9 @@ func (r *Remote) free() {
// Free releases the resources of the Remote.
func (r *Remote) Free() {
r.repo.Remotes.untrackRemote(r)
+ if r.weak {
+ return
+ }
r.free()
}
@@ -1231,3 +1237,12 @@ func freeRemoteCreateOptions(ptr *C.git_remote_create_options) {
C.free(unsafe.Pointer(ptr.name))
C.free(unsafe.Pointer(ptr.fetchspec))
}
+
+// createNewEmptyRemote used to get a new empty object of *Remote
+func createNewEmptyRemote() *Remote {
+ return &Remote{
+ callbacks: RemoteCallbacks{},
+ repo: nil,
+ weak: false,
+ }
+}
diff --git a/transport.go b/transport.go
index 1afa6f4..23514b4 100644
--- a/transport.go
+++ b/transport.go
@@ -22,7 +22,6 @@ void _go_git_setup_smart_subtransport_stream(_go_managed_smart_subtransport_stre
*/
import "C"
import (
- "errors"
"fmt"
"io"
"reflect"
@@ -306,8 +305,10 @@ func smartTransportCallback(
registeredSmartTransport := pointerHandles.Get(handle).(*RegisteredSmartTransport)
remote, ok := remotePointers.get(owner)
if !ok {
- err := errors.New("remote pointer not found")
- return setCallbackError(errorMessage, err)
+ // create a new empty remote and set it
+ // as a weak pointer, so that control stays in golang
+ remote = createNewEmptyRemote()
+ remote.weak = true
}
managed := &managedSmartSubtransport{