update git2go to support latest libgit2 development commit (id: 66af84)

This commit is contained in:
Aidan Nulman 2014-01-29 18:01:26 -05:00
parent d8c3772e35
commit f66502aaf4
5 changed files with 71 additions and 29 deletions

18
git.go
View File

@ -9,8 +9,8 @@ import "C"
import ( import (
"bytes" "bytes"
"errors" "errors"
"unsafe"
"strings" "strings"
"unsafe"
) )
const ( const (
@ -89,7 +89,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
} }
@ -126,7 +126,7 @@ type GitError struct {
Code int Code int
} }
func (e GitError) Error() string{ func (e GitError) Error() string {
return e.Message return e.Message
} }
@ -139,14 +139,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)
@ -159,13 +159,13 @@ 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.git_buf_free(retpath)
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

@ -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,12 +28,19 @@ func newReferenceFromC(ptr *C.git_reference) *Reference {
return ref return ref
} }
func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) { func (v *Reference) SetSymbolicTarget(target string, sig *Signature, msg 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))
ret := C.git_reference_symbolic_set_target(&ptr, v.ptr, ctarget) csig := sig.toC()
defer C.free(unsafe.Pointer(csig))
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
ret := C.git_reference_symbolic_set_target(&ptr, v.ptr, ctarget, csig, cmsg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
@ -40,10 +48,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, sig *Signature, msg string) (*Reference, error) {
var ptr *C.git_reference var ptr *C.git_reference
ret := C.git_reference_set_target(&ptr, v.ptr, target.toC()) csig := sig.toC()
defer C.free(unsafe.Pointer(csig))
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
ret := C.git_reference_set_target(&ptr, v.ptr, target.toC(), csig, cmsg)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }

View File

@ -14,7 +14,14 @@ func TestRefModification(t *testing.T) {
commitId, treeId := seedTestRepo(t, repo) 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),
}
_, err = repo.CreateReference("refs/tags/tree", treeId, true, sig, "testTreeTag")
checkFatal(t, err) checkFatal(t, err)
tag, err := repo.LookupReference("refs/tags/tree") tag, err := repo.LookupReference("refs/tags/tree")
@ -78,13 +85,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, sig, "headOne")
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/two", commitId, true) _, err = repo.CreateReference("refs/heads/two", commitId, true, sig, "headTwo")
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/three", commitId, true) _, err = repo.CreateReference("refs/heads/three", commitId, true, sig, "headThree")
checkFatal(t, err) checkFatal(t, err)
iter, err := repo.NewReferenceIterator() iter, err := repo.NewReferenceIterator()
@ -108,7 +115,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 +135,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

@ -6,8 +6,8 @@ package git
*/ */
import "C" import "C"
import ( import (
"unsafe"
"runtime" "runtime"
"unsafe"
) )
// Repository // Repository
@ -125,12 +125,19 @@ 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, sig *Signature, msg string) (*Reference, error) {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
csig := sig.toC()
defer C.free(unsafe.Pointer(csig))
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
var ptr *C.git_reference var ptr *C.git_reference
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), csig, cmsg)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -138,14 +145,22 @@ 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, sig *Signature, msg 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))
csig := sig.toC()
defer C.free(unsafe.Pointer(csig))
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
var ptr *C.git_reference var ptr *C.git_reference
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), csig, cmsg)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -180,7 +195,7 @@ func (v *Repository) CreateCommit(
var cparents []*C.git_commit = nil var cparents []*C.git_commit = nil
var parentsarg **C.git_commit = nil var parentsarg **C.git_commit = nil
nparents:= len(parents) nparents := len(parents)
if nparents > 0 { if nparents > 0 {
cparents = make([]*C.git_commit, nparents) cparents = make([]*C.git_commit, nparents)
for i, v := range parents { for i, v := range parents {
@ -226,7 +241,7 @@ func (repo *Repository) Path() string {
return C.GoString(C.git_repository_path(repo.ptr)) return C.GoString(C.git_repository_path(repo.ptr))
} }
func (repo *Repository) IsBare() (bool) { func (repo *Repository) IsBare() bool {
return C.git_repository_is_bare(repo.ptr) != 0 return C.git_repository_is_bare(repo.ptr) != 0
} }

View File

@ -55,6 +55,14 @@ const (
SubmoduleStatusWdUntracked = C.GIT_SUBMODULE_STATUS_WD_UNTRACKED SubmoduleStatusWdUntracked = C.GIT_SUBMODULE_STATUS_WD_UNTRACKED
) )
type SubmoduleRecurse int
const (
SubmoduleRecurseNo SubmoduleRecurse = C.GIT_SUBMODULE_RECURSE_NO
SubmoduleRecurseYes = C.GIT_SUBMODULE_RECURSE_YES
SubmoduleRecurseOndemand = C.GIT_SUBMODULE_RECURSE_ONDEMAND
)
func SubmoduleStatusIsUnmodified(status int) bool { func SubmoduleStatusIsUnmodified(status int) bool {
o := SubmoduleStatus(status) & ^(SubmoduleStatusInHead | SubmoduleStatusInIndex | o := SubmoduleStatus(status) & ^(SubmoduleStatusInHead | SubmoduleStatusInIndex |
SubmoduleStatusInConfig | SubmoduleStatusInWd) SubmoduleStatusInConfig | SubmoduleStatusInWd)
@ -212,8 +220,8 @@ func (sub *Submodule) FetchRecurseSubmodules() bool {
return true return true
} }
func (sub *Submodule) SetFetchRecurseSubmodules(v bool) error { func (sub *Submodule) SetFetchRecurseSubmodules(recurse SubmoduleRecurse) error {
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(recurse))
if ret < 0 { if ret < 0 {
return LastError() return LastError()
} }