From 0b2f16665d14795047c56feb001d08a2d50fde50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 6 Mar 2013 18:29:43 +0100 Subject: [PATCH] Wrap immutable refs --- reference.go | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ repository.go | 41 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 reference.go diff --git a/reference.go b/reference.go new file mode 100644 index 0000000..820d166 --- /dev/null +++ b/reference.go @@ -0,0 +1,113 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include +#include +*/ +import "C" +import ( + "runtime" + "unsafe" +) + +var ( + SYMBOLIC = C.GIT_REF_SYMBOLIC + OID = C.GIT_REF_OID +) + +type Reference struct { + ptr *C.git_reference +} + +func newReferenceFromC(ptr *C.git_reference) *Reference { + ref := &Reference{ptr} + runtime.SetFinalizer(ref, (*Reference).Free) + + return ref +} + +func (v *Reference) SetSymbolicTarget(target string) (*Reference, error) { + var ptr *C.git_reference + ctarget := C.CString(target) + defer C.free(unsafe.Pointer(ctarget)) + + ret := C.git_reference_symbolic_set_target(&ptr, v.ptr, ctarget) + if ret < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Reference) SetTarget(target *Oid) (*Reference, error) { + var ptr *C.git_reference + + ret := C.git_reference_set_target(&ptr, v.ptr, target.toC()) + if ret < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Reference) Resolve() (*Reference, error) { + var ptr *C.git_reference + + ret := C.git_reference_resolve(&ptr, v.ptr) + if ret < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Reference) Rename(name string, force bool) (*Reference, error) { + var ptr *C.git_reference + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + + ret := C.git_reference_rename(&ptr, v.ptr, cname, cbool(force)) + + if ret < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Reference) Target() *Oid { + return newOidFromC(C.git_reference_target(v.ptr)) +} + +func (v *Reference) SymbolicTarget() string { + cstr := C.git_reference_symbolic_target(v.ptr) + if cstr == nil { + return "" + } + + return C.GoString(cstr) +} + +func (v *Reference) Delete() error { + ret := C.git_reference_delete(v.ptr) + + if ret < 0 { + return LastError() + } + + return nil +} + +func (v *Reference) Name() string { + return C.GoString(C.git_reference_name(v.ptr)) +} + +func (v *Reference) Type() int { + return int(C.git_reference_type(v.ptr)) +} + +func (v *Reference) Free() { + runtime.SetFinalizer(v, nil) + C.git_reference_free(v.ptr) +} diff --git a/repository.go b/repository.go index 4cc8c5d..2e53a01 100644 --- a/repository.go +++ b/repository.go @@ -103,6 +103,47 @@ func (v *Repository) LookupBlob(o *Oid) (*Blob, error) { return blob, nil } +func (v *Repository) LookupReference(name string) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + var ptr *C.git_reference + + ecode := C.git_reference_lookup(&ptr, v.ptr, cname) + if ecode < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Repository) CreateReference(name string, oid *Oid, force bool) (*Reference, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + var ptr *C.git_reference + + ecode := C.git_reference_create(&ptr, v.ptr, cname, oid.toC(), cbool(force)) + if ecode < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + +func (v *Repository) CreateSymbolicReference(name, target string, force bool) (*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 + + ecode := C.git_reference_symbolic_create(&ptr, v.ptr, cname, ctarget, cbool(force)) + if ecode < 0 { + return nil, LastError() + } + + return newReferenceFromC(ptr), nil +} + func (v *Repository) Walk() (*RevWalk, error) { walk := new(RevWalk) ecode := C.git_revwalk_new(&walk.ptr, v.ptr)