From 6fcff3997f1dac4f367040a6556e6e96309fc167 Mon Sep 17 00:00:00 2001 From: Jesse Ezell 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() } -- 2.45.2 From bc83614ccc3f9923eeb101312fd32c81b981d43d Mon Sep 17 00:00:00 2001 From: Jesse Ezell 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 -- 2.45.2 From 1f5da172c68e6b7ac7185ab460a14d424a7e0f62 Mon Sep 17 00:00:00 2001 From: Jesse Ezell 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() -- 2.45.2