Update to support building against current HEAD #57

Closed
jezell wants to merge 3 commits from update-to-head into master
5 changed files with 76 additions and 23 deletions

10
git.go
View File

@ -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))
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) retpath := C.git_buf {}
r := C.git_repository_discover(&retpath, cstart, cbool(across_fs), ceildirs)
if r == 0 { 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() return "", LastError()

View File

@ -27,15 +27,21 @@ 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, signature *Signature, message 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))
csignature := signature.toC()
defer C.git_signature_free(csignature)
cmessage := C.CString(message)
defer C.free(unsafe.Pointer(cmessage))
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, csignature, cmessage)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
@ -43,13 +49,19 @@ 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, signature *Signature, message string) (*Reference, error) {
var ptr *C.git_reference 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() 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(), csignature, cmessage)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
@ -71,15 +83,21 @@ 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, signature *Signature, message 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))
csignature := signature.toC()
defer C.git_signature_free(csignature)
cmessage := C.CString(message)
defer C.free(unsafe.Pointer(cmessage))
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), csignature, cmessage)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()

View File

@ -14,7 +14,17 @@ 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),
}
message := "this is a test"
_, err = repo.CreateReference("refs/tags/tree", treeId, true, &sig, message)
checkFatal(t, err) checkFatal(t, err)
tag, err := repo.LookupReference("refs/tags/tree") tag, err := repo.LookupReference("refs/tags/tree")
@ -45,7 +55,11 @@ func TestRefModification(t *testing.T) {
t.Fatalf("Wrong ref target") 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) 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 +92,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, message)
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/two", commitId, true) _, err = repo.CreateReference("refs/heads/two", commitId, true, sig, message)
checkFatal(t, err) checkFatal(t, err)
_, err = repo.CreateReference("refs/heads/three", commitId, true) _, err = repo.CreateReference("refs/heads/three", commitId, true, sig, message)
checkFatal(t, err) checkFatal(t, err)
iter, err := repo.NewReferenceIterator() iter, err := repo.NewReferenceIterator()

View File

@ -146,15 +146,21 @@ 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, signature *Signature, message 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
csignature := signature.toC()
defer C.git_signature_free(csignature)
cmessage := C.CString(message)
defer C.free(unsafe.Pointer(cmessage))
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), csignature, cmessage)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -162,17 +168,23 @@ 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, signature *Signature, message 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))
var ptr *C.git_reference 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() 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), csignature, cmessage)
if ecode < 0 { if ecode < 0 {
return nil, LastError() return nil, LastError()
} }
@ -232,7 +244,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

@ -236,11 +236,20 @@ func (sub *Submodule) FetchRecurseSubmodules() bool {
return true 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() runtime.LockOSThread()
defer runtime.UnlockOSThread() 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 { if ret < 0 {
return LastError() return LastError()
} }