From 6fcff3997f1dac4f367040a6556e6e96309fc167 Mon Sep 17 00:00:00 2001
From: Jesse Ezell <jesse.ezell@neudesic.com>
Date: Fri, 21 Feb 2014 20:40:30 -0800
Subject: [PATCH 1/3] Update to support building against current HEAD

---
 git.go        | 10 +++++-----
 reference.go  | 32 +++++++++++++++++++++++++-------
 repository.go | 22 +++++++++++++++++-----
 submodule.go  | 13 +++++++++++--
 4 files changed, 58 insertions(+), 19 deletions(-)

diff --git a/git.go b/git.go
index 28196c8..ad76aeb 100644
--- a/git.go
+++ b/git.go
@@ -167,16 +167,16 @@ func Discover(start string, across_fs bool, ceiling_dirs []string) (string, erro
 	cstart := C.CString(start)
 	defer C.free(unsafe.Pointer(cstart))
 
-	retpath := (*C.char)(C.malloc(C.GIT_PATH_MAX))
-	defer C.free(unsafe.Pointer(retpath))
-
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	r := C.git_repository_discover(retpath, C.GIT_PATH_MAX, cstart, cbool(across_fs), ceildirs)
+	retpath := C.git_buf {} 
+
+	r := C.git_repository_discover(&retpath, cstart, cbool(across_fs), ceildirs)
 
 	if r == 0 {
-		return C.GoString(retpath), nil
+		C.git_buf_free(&retpath)
+		return C.GoStringN(retpath.ptr, C.int(retpath.size)), nil
 	}
 
 	return "", LastError()
diff --git a/reference.go b/reference.go
index 8e33354..fa130a7 100644
--- a/reference.go
+++ b/reference.go
@@ -27,15 +27,21 @@ func newReferenceFromC(ptr *C.git_reference) *Reference {
 	return ref
 }
 
-func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) {
+func (v *Reference) SetSymbolicTarget(target string, signature *Signature, message string) (*Reference, error) {
 	var ptr *C.git_reference
 	ctarget := C.CString(target)
 	defer C.free(unsafe.Pointer(ctarget))
 
+	csignature := signature.toC()
+	defer C.git_signature_free(csignature)
+
+	cmessage := C.CString(message)
+	defer C.free(unsafe.Pointer(cmessage))
+	
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	ret := C.git_reference_symbolic_set_target(&ptr, v.ptr, ctarget)
+	ret := C.git_reference_symbolic_set_target(&ptr, v.ptr, ctarget, csignature, cmessage)
 	if ret < 0 {
 		return nil, LastError()
 	}
@@ -43,13 +49,19 @@ func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) {
 	return newReferenceFromC(ptr), nil
 }
 
-func (v *Reference) SetTarget(target *Oid) (*Reference, error) {
+func (v *Reference) SetTarget(target *Oid, signature *Signature, message string) (*Reference, error) {
 	var ptr *C.git_reference
 
+	csignature := signature.toC()
+	defer C.git_signature_free(csignature)
+
+	cmessage := C.CString(message)
+	defer C.free(unsafe.Pointer(cmessage))
 	runtime.LockOSThread()
+	
 	defer runtime.UnlockOSThread()
 
-	ret := C.git_reference_set_target(&ptr, v.ptr, target.toC())
+	ret := C.git_reference_set_target(&ptr, v.ptr, target.toC(), csignature, cmessage)
 	if ret < 0 {
 		return nil, LastError()
 	}
@@ -71,15 +83,21 @@ func (v *Reference) Resolve() (*Reference, error) {
 	return newReferenceFromC(ptr), nil
 }
 
-func (v *Reference) Rename(name string, force bool) (*Reference, error) {
+func (v *Reference) Rename(name string, force bool, signature *Signature, message string) (*Reference, error) {
 	var ptr *C.git_reference
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
 
+	csignature := signature.toC()
+	defer C.git_signature_free(csignature)
+
+	cmessage := C.CString(message)
+	defer C.free(unsafe.Pointer(cmessage))
+	
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	ret := C.git_reference_rename(&ptr, v.ptr, cname, cbool(force))
+	ret := C.git_reference_rename(&ptr, v.ptr, cname, cbool(force), csignature, cmessage)
 
 	if ret < 0 {
 		return nil, LastError()
@@ -152,7 +170,7 @@ func (repo *Repository) NewReferenceIterator() (*ReferenceIterator, error) {
 // NewReferenceIteratorGlob creates an iterator over reference names
 // that match the speicified glob. The glob is of the usual fnmatch
 // type.
-func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterator, error) {
+func (repo *Repository) NewReferenceIteratorGlob(glob string, signature *Signature, message string) (*ReferenceIterator, error) {
 	cstr := C.CString(glob)
 	defer C.free(unsafe.Pointer(cstr))
 	var ptr *C.git_reference_iterator
diff --git a/repository.go b/repository.go
index 3a9068d..03bf449 100644
--- a/repository.go
+++ b/repository.go
@@ -146,15 +146,21 @@ func (v *Repository) LookupReference(name string) (*Reference, error) {
 	return newReferenceFromC(ptr), nil
 }
 
-func (v *Repository) CreateReference(name string, oid *Oid, force bool) (*Reference, error) {
+func (v *Repository) CreateReference(name string, oid *Oid, force bool, signature *Signature, message string) (*Reference, error) {
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
 	var ptr *C.git_reference
 
+	csignature := signature.toC()
+	defer C.git_signature_free(csignature)
+
+	cmessage := C.CString(message)
+	defer C.free(unsafe.Pointer(cmessage))
+
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	ecode := C.git_reference_create(&ptr, v.ptr, cname, oid.toC(), cbool(force))
+	ecode := C.git_reference_create(&ptr, v.ptr, cname, oid.toC(), cbool(force), csignature, cmessage)
 	if ecode < 0 {
 		return nil, LastError()
 	}
@@ -162,17 +168,23 @@ func (v *Repository) CreateReference(name string, oid *Oid, force bool) (*Refere
 	return newReferenceFromC(ptr), nil
 }
 
-func (v *Repository) CreateSymbolicReference(name, target string, force bool) (*Reference, error) {
+func (v *Repository) CreateSymbolicReference(name, target string, force bool, signature *Signature, message string) (*Reference, error) {
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
 	ctarget := C.CString(target)
 	defer C.free(unsafe.Pointer(ctarget))
 	var ptr *C.git_reference
+ 
+	csignature := signature.toC()
+	defer C.git_signature_free(csignature)
+
+	cmessage := C.CString(message)
+	defer C.free(unsafe.Pointer(cmessage))
 
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force))
+	ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force), csignature, cmessage)
 	if ecode < 0 {
 		return nil, LastError()
 	}
@@ -232,7 +244,7 @@ func (v *Repository) CreateCommit(
 	ret := C.git_commit_create(
 		oid.toC(), v.ptr, cref,
 		authorSig, committerSig,
-		nil, cmsg, tree.ptr, C.int(nparents), parentsarg)
+		nil, cmsg, tree.ptr, C.size_t(nparents), parentsarg)
 
 	if ret < 0 {
 		return nil, LastError()
diff --git a/submodule.go b/submodule.go
index 48ea151..53d960a 100644
--- a/submodule.go
+++ b/submodule.go
@@ -236,11 +236,20 @@ func (sub *Submodule) FetchRecurseSubmodules() bool {
 	return true
 }
 
-func (sub *Submodule) SetFetchRecurseSubmodules(v bool) error {
+type SubmoduleRecurseType int
+
+const (
+	SubmoduleRecurseReset SubmoduleRecurseType  = C.GIT_SUBMODULE_RECURSE_RESET
+	SubmoduleRecurseNo                          = C.GIT_SUBMODULE_RECURSE_NO
+	SubmoduleRecurseYes                         = C.GIT_SUBMODULE_RECURSE_YES
+	SubmoduleRecurseOnDemand                    = C.GIT_SUBMODULE_RECURSE_ONDEMAND
+)
+
+func (sub *Submodule) SetFetchRecurseSubmodules(mode SubmoduleRecurseType) error {
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	ret := C.git_submodule_set_fetch_recurse_submodules(sub.ptr, cbool(v))
+	ret := C.git_submodule_set_fetch_recurse_submodules(sub.ptr, C.git_submodule_recurse_t(mode))
 	if ret < 0 {
 		return LastError()
 	}

From bc83614ccc3f9923eeb101312fd32c81b981d43d Mon Sep 17 00:00:00 2001
From: Jesse Ezell <jesse.ezell@neudesic.com>
Date: Fri, 21 Feb 2014 22:22:24 -0800
Subject: [PATCH 2/3] cleanup

---
 reference.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/reference.go b/reference.go
index fa130a7..d47a487 100644
--- a/reference.go
+++ b/reference.go
@@ -170,7 +170,7 @@ func (repo *Repository) NewReferenceIterator() (*ReferenceIterator, error) {
 // NewReferenceIteratorGlob creates an iterator over reference names
 // that match the speicified glob. The glob is of the usual fnmatch
 // type.
-func (repo *Repository) NewReferenceIteratorGlob(glob string, signature *Signature, message string) (*ReferenceIterator, error) {
+func (repo *Repository) NewReferenceIteratorGlob(glob string) (*ReferenceIterator, error) {
 	cstr := C.CString(glob)
 	defer C.free(unsafe.Pointer(cstr))
 	var ptr *C.git_reference_iterator

From 1f5da172c68e6b7ac7185ab460a14d424a7e0f62 Mon Sep 17 00:00:00 2001
From: Jesse Ezell <jesse.ezell@neudesic.com>
Date: Fri, 21 Feb 2014 23:01:03 -0800
Subject: [PATCH 3/3] update tests

---
 reference_test.go | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/reference_test.go b/reference_test.go
index f955a2c..4eee2a4 100644
--- a/reference_test.go
+++ b/reference_test.go
@@ -14,7 +14,17 @@ func TestRefModification(t *testing.T) {
 
 	commitId, treeId := seedTestRepo(t, repo)
 
-	_, err := repo.CreateReference("refs/tags/tree", treeId, true)
+	loc, err := time.LoadLocation("Europe/Berlin")
+	checkFatal(t, err)
+        sig := Signature {
+		Name:  "Rand Om Hacker",
+		Email: "random@hacker.com",
+		When:  time.Date(2013, 03, 06, 14, 30, 0, 0, loc),
+        }
+
+        message := "this is a test"
+
+	_, err = repo.CreateReference("refs/tags/tree", treeId, true, &sig, message)
 	checkFatal(t, err)
 
 	tag, err := repo.LookupReference("refs/tags/tree")
@@ -45,7 +55,11 @@ func TestRefModification(t *testing.T) {
 		t.Fatalf("Wrong ref target")
 	}
 
-	_, err = tag.Rename("refs/tags/renamed", false)
+	if target := ref.SymbolicTarget(); target != "" {
+		t.Fatalf("Expected empty string, got %v", target)
+	}
+
+	_, err = tag.Rename("refs/tags/renamed", false, &sig, message)
 	checkFatal(t, err)
 	tag, err = repo.LookupReference("refs/tags/renamed")
 	checkFatal(t, err)
@@ -78,13 +92,13 @@ func TestIterator(t *testing.T) {
 	commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree)
 	checkFatal(t, err)
 
-	_, err = repo.CreateReference("refs/heads/one", commitId, true)
+	_, err = repo.CreateReference("refs/heads/one", commitId, true, sig, message)
 	checkFatal(t, err)
 
-	_, err = repo.CreateReference("refs/heads/two", commitId, true)
+	_, err = repo.CreateReference("refs/heads/two", commitId, true, sig, message)
 	checkFatal(t, err)
 
-	_, err = repo.CreateReference("refs/heads/three", commitId, true)
+	_, err = repo.CreateReference("refs/heads/three", commitId, true, sig, message)
 	checkFatal(t, err)
 
 	iter, err := repo.NewReferenceIterator()