summaryrefslogtreecommitdiff
path: root/repository.go
diff options
context:
space:
mode:
Diffstat (limited to 'repository.go')
-rw-r--r--repository.go88
1 files changed, 84 insertions, 4 deletions
diff --git a/repository.go b/repository.go
index 02dcff6..5ae10f2 100644
--- a/repository.go
+++ b/repository.go
@@ -2,7 +2,7 @@ package git
/*
#include <git2.h>
-#include <git2/errors.h>
+#include <git2/sys/repository.h>
*/
import "C"
import (
@@ -69,6 +69,22 @@ func InitRepository(path string, isbare bool) (*Repository, error) {
return repo, nil
}
+func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) {
+ repo = new(Repository)
+
+ ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr)
+ if ret < 0 {
+ return nil, MakeGitError(ret)
+ }
+
+ runtime.SetFinalizer(repo, (*Repository).Free)
+ return repo, nil
+}
+
+func (v *Repository) SetRefdb(refdb *Refdb) {
+ C.git_repository_set_refdb(v.ptr, refdb.ptr)
+}
+
func (v *Repository) Free() {
runtime.SetFinalizer(v, nil)
C.git_repository_free(v.ptr)
@@ -164,6 +180,63 @@ func (v *Repository) LookupReference(name string) (*Reference, error) {
return newReferenceFromC(ptr), nil
}
+func (v *Repository) Head() (*Reference, error) {
+ var ptr *C.git_reference
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ ecode := C.git_repository_head(&ptr, v.ptr)
+ if ecode < 0 {
+ return nil, MakeGitError(ecode)
+ }
+
+ return newReferenceFromC(ptr), nil
+}
+
+func (v *Repository) SetHead(refname string, sig *Signature, msg string) error {
+ cname := C.CString(refname)
+ defer C.free(unsafe.Pointer(cname))
+
+ csig := sig.toC()
+ defer C.free(unsafe.Pointer(csig))
+
+ var cmsg *C.char
+ if msg != "" {
+ cmsg = C.CString(msg)
+ defer C.free(unsafe.Pointer(cmsg))
+ }
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ ecode := C.git_repository_set_head(v.ptr, cname, csig, cmsg)
+ if ecode != 0 {
+ return MakeGitError(ecode)
+ }
+ return nil
+}
+
+func (v *Repository) SetHeadDetached(id *Oid, sig *Signature, msg string) error {
+ csig := sig.toC()
+ defer C.free(unsafe.Pointer(csig))
+
+ var cmsg *C.char
+ if msg != "" {
+ cmsg = C.CString(msg)
+ defer C.free(unsafe.Pointer(cmsg))
+ }
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ ecode := C.git_repository_set_head_detached(v.ptr, id.toC(), csig, cmsg)
+ if ecode != 0 {
+ return MakeGitError(ecode)
+ }
+ return nil
+}
+
func (v *Repository) CreateReference(name string, id *Oid, force bool, sig *Signature, msg string) (*Reference, error) {
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
@@ -288,6 +361,11 @@ func (v *Odb) Free() {
C.git_odb_free(v.ptr)
}
+func (v *Refdb) Free() {
+ runtime.SetFinalizer(v, nil)
+ C.git_refdb_free(v.ptr)
+}
+
func (v *Repository) Odb() (odb *Odb, err error) {
odb = new(Odb)
@@ -299,7 +377,7 @@ func (v *Repository) Odb() (odb *Odb, err error) {
}
runtime.SetFinalizer(odb, (*Odb).Free)
- return
+ return odb, nil
}
func (repo *Repository) Path() string {
@@ -384,7 +462,8 @@ func (v *Repository) EnsureLog(name string) error {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- if ret := C.git_reference_ensure_log(v.ptr, cname); ret < 0 {
+ ret := C.git_reference_ensure_log(v.ptr, cname)
+ if ret < 0 {
return MakeGitError(ret)
}
@@ -417,7 +496,8 @@ func (v *Repository) DwimReference(name string) (*Reference, error) {
defer runtime.UnlockOSThread()
var ptr *C.git_reference
- if ret := C.git_reference_dwim(&ptr, v.ptr, cname); ret < 0 {
+ ret := C.git_reference_dwim(&ptr, v.ptr, cname)
+ if ret < 0 {
return nil, MakeGitError(ret)
}