Making things work with libgit2 at 2dc49ea #54

Closed
meatballhat wants to merge 8 commits from working-with-libgit2-at-2dc49ea into master
14 changed files with 85 additions and 67 deletions
Showing only changes of commit 0e50e091f3 - Show all commits

View File

@ -22,4 +22,3 @@ func (v Blob) Contents() []byte {
buffer := unsafe.Pointer(C.git_blob_rawcontent(v.ptr)) buffer := unsafe.Pointer(C.git_blob_rawcontent(v.ptr))
return C.GoBytes(buffer, size) return C.GoBytes(buffer, size)
} }

View File

@ -9,8 +9,8 @@ git_checkout_opts git_checkout_opts_init() {
*/ */
import "C" import "C"
import ( import (
"runtime"
"os" "os"
"runtime"
) )
type CheckoutStrategy uint type CheckoutStrategy uint

14
git.go
View File

@ -10,8 +10,8 @@ import (
"bytes" "bytes"
"errors" "errors"
"runtime" "runtime"
"unsafe"
"strings" "strings"
"unsafe"
) )
const ( const (
@ -93,7 +93,7 @@ func (oid *Oid) Equal(oid2 *Oid) bool {
} }
func (oid *Oid) IsZero() bool { func (oid *Oid) IsZero() bool {
for _, a := range(oid.bytes) { for _, a := range oid.bytes {
if a != '0' { if a != '0' {
return false return false
} }
@ -147,14 +147,14 @@ func LastError() error {
} }
func cbool(b bool) C.int { func cbool(b bool) C.int {
if (b) { if b {
return C.int(1) return C.int(1)
} }
return C.int(0) return C.int(0)
} }
func ucbool(b bool) C.uint { func ucbool(b bool) C.uint {
if (b) { if b {
return C.uint(1) return C.uint(1)
} }
return C.uint(0) return C.uint(0)
@ -167,16 +167,16 @@ func Discover(start string, across_fs bool, ceiling_dirs []string) (string, erro
cstart := C.CString(start) cstart := C.CString(start)
defer C.free(unsafe.Pointer(cstart)) defer C.free(unsafe.Pointer(cstart))
retpath := (*C.char)(C.malloc(C.GIT_PATH_MAX)) retpath := (*C.git_buf)(C.malloc(C.GIT_PATH_MAX))
defer C.free(unsafe.Pointer(retpath)) defer C.free(unsafe.Pointer(retpath))
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
r := C.git_repository_discover(retpath, C.GIT_PATH_MAX, cstart, cbool(across_fs), ceildirs) r := C.git_repository_discover(retpath, cstart, cbool(across_fs), ceildirs)
if r == 0 { if r == 0 {
return C.GoString(retpath), nil return C.GoString(retpath.ptr), nil
} }
return "", LastError() return "", LastError()

View File

@ -1,8 +1,8 @@
package git package git
import ( import (
"testing"
"io/ioutil" "io/ioutil"
"testing"
"time" "time"
) )
@ -44,4 +44,3 @@ func seedTestRepo(t *testing.T, repo *Repository) (*Oid, *Oid) {
return commitId, treeId return commitId, treeId
} }

View File

@ -28,8 +28,8 @@ type gitObject struct {
ptr *C.git_object ptr *C.git_object
} }
func (t ObjectType) String() (string) { func (t ObjectType) String() string {
switch (t) { switch t {
case ObjectAny: case ObjectAny:
return "Any" return "Any"
case ObjectBad: case ObjectBad:

4
odb.go
View File

@ -8,9 +8,9 @@ extern int _go_git_odb_foreach(git_odb *db, void *payload);
*/ */
import "C" import "C"
import ( import (
"unsafe"
"reflect" "reflect"
"runtime" "runtime"
"unsafe"
) )
type Odb struct { type Odb struct {
@ -65,7 +65,7 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int {
case <-ch: case <-ch:
return -1 return -1
} }
return 0; return 0
} }
func (v *Odb) forEachWrap(ch chan *Oid) { func (v *Odb) forEachWrap(ch chan *Oid) {

View File

@ -11,6 +11,7 @@ import (
) )
type ReferenceType int type ReferenceType int
const ( const (
ReferenceSymbolic ReferenceType = C.GIT_REF_SYMBOLIC ReferenceSymbolic ReferenceType = C.GIT_REF_SYMBOLIC
ReferenceOid = C.GIT_REF_OID ReferenceOid = C.GIT_REF_OID
@ -27,15 +28,18 @@ func newReferenceFromC(ptr *C.git_reference) *Reference {
return ref return ref
} }
func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) { func (v *Reference) SetSymbolicTarget(target, logMsg string) (*Reference, error) {
var ptr *C.git_reference var ptr *C.git_reference
ctarget := C.CString(target) ctarget := C.CString(target)
defer C.free(unsafe.Pointer(ctarget)) defer C.free(unsafe.Pointer(ctarget))
cLogMsg := C.CString(logMsg)
defer C.free(unsafe.Pointer(cLogMsg))
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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, nil, cLogMsg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
@ -43,13 +47,16 @@ func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) {
return newReferenceFromC(ptr), nil return newReferenceFromC(ptr), nil
} }
func (v *Reference) SetTarget(target *Oid) (*Reference, error) { func (v *Reference) SetTarget(target *Oid, logMsg string) (*Reference, error) {
var ptr *C.git_reference var ptr *C.git_reference
cLogMsg := C.CString(logMsg)
defer C.free(unsafe.Pointer(cLogMsg))
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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(), nil, cLogMsg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
@ -71,15 +78,18 @@ func (v *Reference) Resolve() (*Reference, error) {
return newReferenceFromC(ptr), nil return newReferenceFromC(ptr), nil
} }
func (v *Reference) Rename(name string, force bool) (*Reference, error) { func (v *Reference) Rename(name string, force bool, logMsg string) (*Reference, error) {
var ptr *C.git_reference var ptr *C.git_reference
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
cLogMsg := C.CString(logMsg)
defer C.free(unsafe.Pointer(cLogMsg))
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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), nil, cLogMsg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()

View File

@ -14,7 +14,7 @@ func TestRefModification(t *testing.T) {
commitId, treeId := seedTestRepo(t, repo) commitId, treeId := seedTestRepo(t, repo)
_, err := repo.CreateReference("refs/tags/tree", treeId, true) _, err := repo.CreateReference("refs/tags/tree", treeId, true, "")
checkFatal(t, err) checkFatal(t, err)
tag, err := repo.LookupReference("refs/tags/tree") tag, err := repo.LookupReference("refs/tags/tree")
@ -45,7 +45,7 @@ func TestRefModification(t *testing.T) {
t.Fatalf("Wrong ref target") t.Fatalf("Wrong ref target")
} }
_, err = tag.Rename("refs/tags/renamed", false) _, err = tag.Rename("refs/tags/renamed", false, "")
checkFatal(t, err) checkFatal(t, err)
tag, err = repo.LookupReference("refs/tags/renamed") tag, err = repo.LookupReference("refs/tags/renamed")
checkFatal(t, err) checkFatal(t, err)
@ -78,13 +78,13 @@ func TestIterator(t *testing.T) {
commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree) commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree)
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/one", commitId, true) _, err = repo.CreateReference("refs/heads/one", commitId, true, "")
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/two", commitId, true) _, err = repo.CreateReference("refs/heads/two", commitId, true, "")
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/three", commitId, true) _, err = repo.CreateReference("refs/heads/three", commitId, true, "")
checkFatal(t, err) checkFatal(t, err)
iter, err := repo.NewReferenceIterator() iter, err := repo.NewReferenceIterator()
@ -108,7 +108,6 @@ func TestIterator(t *testing.T) {
t.Fatal("Iteration not over") t.Fatal("Iteration not over")
} }
sort.Strings(list) sort.Strings(list)
compareStringList(t, expected, list) compareStringList(t, expected, list)
@ -129,7 +128,6 @@ func TestIterator(t *testing.T) {
t.Fatalf("Wrong number of references returned %v", count) t.Fatalf("Wrong number of references returned %v", count)
} }
// test the channel iteration // test the channel iteration
list = []string{} list = []string{}
iter, err = repo.NewReferenceIterator() iter, err = repo.NewReferenceIterator()

View File

@ -146,15 +146,18 @@ func (v *Repository) LookupReference(name string) (*Reference, error) {
return newReferenceFromC(ptr), nil 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, logMsg string) (*Reference, error) {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
var ptr *C.git_reference var ptr *C.git_reference
cLogMsg := C.CString(logMsg)
defer C.free(unsafe.Pointer(cLogMsg))
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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), nil, cLogMsg)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -162,17 +165,19 @@ func (v *Repository) CreateReference(name string, oid *Oid, force bool) (*Refere
return newReferenceFromC(ptr), nil return newReferenceFromC(ptr), nil
} }
func (v *Repository) CreateSymbolicReference(name, target string, force bool) (*Reference, error) { func (v *Repository) CreateSymbolicReference(name, target string, force bool, logMsg string) (*Reference, error) {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
ctarget := C.CString(target) ctarget := C.CString(target)
defer C.free(unsafe.Pointer(ctarget)) defer C.free(unsafe.Pointer(ctarget))
cLogMsg := C.CString(logMsg)
defer C.free(unsafe.Pointer(cLogMsg))
var ptr *C.git_reference var ptr *C.git_reference
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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), nil, cLogMsg)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -232,7 +237,7 @@ func (v *Repository) CreateCommit(
ret := C.git_commit_create( ret := C.git_commit_create(
oid.toC(), v.ptr, cref, oid.toC(), v.ptr, cref,
authorSig, committerSig, authorSig, committerSig,
nil, cmsg, tree.ptr, C.int(nparents), parentsarg) nil, cmsg, tree.ptr, C.size_t(nparents), parentsarg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()

View File

@ -240,7 +240,12 @@ func (sub *Submodule) SetFetchRecurseSubmodules(v bool) error {
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
ret := C.git_submodule_set_fetch_recurse_submodules(sub.ptr, cbool(v)) recurse := 0
if v {
recurse = 1
}
ret := C.git_submodule_set_fetch_recurse_submodules(sub.ptr, C.git_submodule_recurse_t(recurse))
if ret < 0 { if ret < 0 {
return LastError() return LastError()
} }

View File

@ -14,6 +14,7 @@ import (
) )
type Filemode int type Filemode int
const ( const (
FilemodeNew Filemode = C.GIT_FILEMODE_NEW FilemodeNew Filemode = C.GIT_FILEMODE_NEW
FilemodeTree = C.GIT_FILEMODE_TREE FilemodeTree = C.GIT_FILEMODE_TREE
@ -125,7 +126,7 @@ func (v *TreeBuilder) Free() {
C.git_treebuilder_free(v.ptr) C.git_treebuilder_free(v.ptr)
} }
func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) (error) { func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) error {
cfilename := C.CString(filename) cfilename := C.CString(filename)
defer C.free(unsafe.Pointer(cfilename)) defer C.free(unsafe.Pointer(cfilename))

View File

@ -14,6 +14,7 @@ import (
// RevWalk // RevWalk
type SortType uint type SortType uint
const ( const (
SortNone SortType = C.GIT_SORT_NONE SortNone SortType = C.GIT_SORT_NONE
SortTopological = C.GIT_SORT_TOPOLOGICAL SortTopological = C.GIT_SORT_TOPOLOGICAL