summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--remote.go17
-rw-r--r--remote_test.go27
2 files changed, 42 insertions, 2 deletions
diff --git a/remote.go b/remote.go
index da688e7..3e01ce1 100644
--- a/remote.go
+++ b/remote.go
@@ -303,6 +303,19 @@ func makeCStringsFromStrings(s []string) **C.char {
return x
}
+func freeStrarray(arr *C.git_strarray) {
+ count := int(arr.count)
+ size := unsafe.Sizeof(unsafe.Pointer(nil))
+
+ i := 0
+ for p := uintptr(unsafe.Pointer(arr.strings)); i < count; p += size {
+ C.free(unsafe.Pointer(sptr(p)))
+ i++
+ }
+
+ C.free(unsafe.Pointer(arr.strings))
+}
+
func (o *Remote) GetFetchRefspecs() ([]string, error) {
crefspecs := C.git_strarray{}
@@ -323,7 +336,7 @@ func (o *Remote) SetFetchRefspecs(refspecs []string) error {
crefspecs := C.git_strarray{}
crefspecs.count = C.size_t(len(refspecs))
crefspecs.strings = makeCStringsFromStrings(refspecs)
- defer C.git_strarray_free(&crefspecs)
+ defer freeStrarray(&crefspecs)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
@@ -368,7 +381,7 @@ func (o *Remote) SetPushRefspecs(refspecs []string) error {
crefspecs := C.git_strarray{}
crefspecs.count = C.size_t(len(refspecs))
crefspecs.strings = makeCStringsFromStrings(refspecs)
- defer C.git_strarray_free(&crefspecs)
+ defer freeStrarray(&crefspecs)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
diff --git a/remote_test.go b/remote_test.go
new file mode 100644
index 0000000..16675fc
--- /dev/null
+++ b/remote_test.go
@@ -0,0 +1,27 @@
+package git
+
+import (
+ "os"
+ "testing"
+)
+
+func TestRefspecs(t *testing.T) {
+ repo := createTestRepo(t)
+ defer os.RemoveAll(repo.Workdir())
+
+ remote, err := repo.CreateRemoteInMemory("refs/heads/*:refs/heads/*", "git://foo/bar")
+ checkFatal(t, err)
+
+ expected := []string{
+ "refs/heads/*:refs/remotes/origin/*",
+ "refs/pull/*/head:refs/remotes/origin/*",
+ }
+
+ err = remote.SetFetchRefspecs(expected)
+ checkFatal(t, err)
+
+ actual, err := remote.GetFetchRefspecs()
+ checkFatal(t, err)
+
+ compareStringList(t, expected, actual)
+}