Skip to content

Commit 0e8009f

Browse files
authored
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
1 parent 6eae74c commit 0e8009f

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

clone_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package git
22

33
import (
44
"io/ioutil"
5+
"os"
56
"testing"
67
)
78

@@ -70,3 +71,17 @@ func TestCloneWithCallback(t *testing.T) {
7071
}
7172
defer remote.Free()
7273
}
74+
75+
// TestCloneWithExternalHTTPUrl
76+
func TestCloneWithExternalHTTPUrl(t *testing.T) {
77+
78+
path, err := ioutil.TempDir("", "git2go")
79+
defer os.RemoveAll(path)
80+
81+
// clone the repo
82+
url := "https://github.com/libgit2/TestGitRepository"
83+
_, err = Clone(url, path, &CloneOptions{})
84+
if err != nil {
85+
t.Fatal("cannot clone remote repo via https, error: ", err)
86+
}
87+
}

remote.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ type Remote struct {
182182
ptr *C.git_remote
183183
callbacks RemoteCallbacks
184184
repo *Repository
185+
// weak indicates that a remote is a weak pointer and should not be
186+
// freed.
187+
weak bool
185188
}
186189

187190
type remotePointerList struct {
@@ -602,6 +605,9 @@ func (r *Remote) free() {
602605
// Free releases the resources of the Remote.
603606
func (r *Remote) Free() {
604607
r.repo.Remotes.untrackRemote(r)
608+
if r.weak {
609+
return
610+
}
605611
r.free()
606612
}
607613

@@ -1231,3 +1237,12 @@ func freeRemoteCreateOptions(ptr *C.git_remote_create_options) {
12311237
C.free(unsafe.Pointer(ptr.name))
12321238
C.free(unsafe.Pointer(ptr.fetchspec))
12331239
}
1240+
1241+
// createNewEmptyRemote used to get a new empty object of *Remote
1242+
func createNewEmptyRemote() *Remote {
1243+
return &Remote{
1244+
callbacks: RemoteCallbacks{},
1245+
repo: nil,
1246+
weak: false,
1247+
}
1248+
}

transport.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ void _go_git_setup_smart_subtransport_stream(_go_managed_smart_subtransport_stre
2222
*/
2323
import "C"
2424
import (
25-
"errors"
2625
"fmt"
2726
"io"
2827
"reflect"
@@ -306,8 +305,10 @@ func smartTransportCallback(
306305
registeredSmartTransport := pointerHandles.Get(handle).(*RegisteredSmartTransport)
307306
remote, ok := remotePointers.get(owner)
308307
if !ok {
309-
err := errors.New("remote pointer not found")
310-
return setCallbackError(errorMessage, err)
308+
// create a new empty remote and set it
309+
// as a weak pointer, so that control stays in golang
310+
remote = createNewEmptyRemote()
311+
remote.weak = true
311312
}
312313

313314
managed := &managedSmartSubtransport{

0 commit comments

Comments
 (0)