Skip to content

Commit 90af2ae

Browse files
github-actions[bot]codexetremelhchavez
authored
bugfix: HTTPS Clone fails with remote pointer not found using Go transport (#836) (#842) (#848)
Fixes: #836 Changes: * adding a weak bool param for Remote * create a new remote in the smartTransportCallback incase one is not found (cherry picked from commit 0e8009f) Co-authored-by: Yashodhan Ghadge <codexetreme@users.noreply.github.com> Co-authored-by: lhchavez <lhchavez@lhchavez.com>
1 parent 0ff1486 commit 90af2ae

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

@@ -76,3 +77,17 @@ func TestCloneWithCallback(t *testing.T) {
7677
}
7778
defer remote.Free()
7879
}
80+
81+
// TestCloneWithExternalHTTPUrl
82+
func TestCloneWithExternalHTTPUrl(t *testing.T) {
83+
84+
path, err := ioutil.TempDir("", "git2go")
85+
defer os.RemoveAll(path)
86+
87+
// clone the repo
88+
url := "https://github.com/libgit2/TestGitRepository"
89+
_, err = Clone(url, path, &CloneOptions{})
90+
if err != nil {
91+
t.Fatal("cannot clone remote repo via https, error: ", err)
92+
}
93+
}

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 {
@@ -592,6 +595,9 @@ func (r *Remote) free() {
592595
// Free releases the resources of the Remote.
593596
func (r *Remote) Free() {
594597
r.repo.Remotes.untrackRemote(r)
598+
if r.weak {
599+
return
600+
}
595601
r.free()
596602
}
597603

@@ -1221,3 +1227,12 @@ func freeRemoteCreateOptions(ptr *C.git_remote_create_options) {
12211227
C.free(unsafe.Pointer(ptr.name))
12221228
C.free(unsafe.Pointer(ptr.fetchspec))
12231229
}
1230+
1231+
// createNewEmptyRemote used to get a new empty object of *Remote
1232+
func createNewEmptyRemote() *Remote {
1233+
return &Remote{
1234+
callbacks: RemoteCallbacks{},
1235+
repo: nil,
1236+
weak: false,
1237+
}
1238+
}

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"
@@ -296,8 +295,10 @@ func smartTransportCallback(
296295
registeredSmartTransport := pointerHandles.Get(handle).(*RegisteredSmartTransport)
297296
remote, ok := remotePointers.get(owner)
298297
if !ok {
299-
err := errors.New("remote pointer not found")
300-
return setCallbackError(errorMessage, err)
298+
// create a new empty remote and set it
299+
// as a weak pointer, so that control stays in golang
300+
remote = createNewEmptyRemote()
301+
remote.weak = true
301302
}
302303

303304
managed := &managedSmartSubtransport{

0 commit comments

Comments
 (0)