diff options
| -rw-r--r-- | commit.go | 17 | ||||
| -rw-r--r-- | git.go | 20 | ||||
| -rw-r--r-- | odb.go | 29 | ||||
| -rw-r--r-- | packbuilder.go | 4 | ||||
| -rw-r--r-- | wrapper.c | 4 |
5 files changed, 71 insertions, 3 deletions
@@ -53,6 +53,23 @@ func (c *Commit) Committer() *Signature { return newSignatureFromC(ptr) } +func (c *Commit) Parent(n uint) *Commit { + par := &Commit{} + ret := C.git_commit_parent(&par.ptr, c.ptr, C.uint(n)) + if ret != 0 { + return nil + } + return par +} + +func (c *Commit) ParentId(n uint) *Oid { + return newOidFromC(C.git_commit_parent_id(c.ptr, C.uint(n))) +} + +func (c *Commit) ParentCount() uint { + return uint(C.git_commit_parentcount(c.ptr)) +} + // Signature type Signature struct { @@ -101,6 +101,26 @@ func (oid *Oid) NCmp(oid2 *Oid, n uint) int { return bytes.Compare(oid.bytes[:n], oid2.bytes[:n]) } +func ShortenOids(ids []*Oid, minlen int) (int, error) { + shorten := C.git_oid_shorten_new(C.size_t(minlen)) + if shorten == nil { + panic("Out of memory") + } + defer C.git_oid_shorten_free(shorten) + + var ret C.int + for _, id := range ids { + buf := make([]byte, 41) + C.git_oid_fmt((*C.char)(unsafe.Pointer(&buf[0])), id.toC()) + buf[40] = 0 + ret = C.git_oid_shorten_add(shorten, (*C.char)(unsafe.Pointer(&buf[0]))) + if ret < 0 { + return int(ret), LastError() + } + } + return int(ret), nil +} + type GitError struct { Message string Code int @@ -4,6 +4,8 @@ package git #cgo pkg-config: libgit2 #include <git2.h> #include <git2/errors.h> + +extern int _go_git_odb_foreach(git_odb *db, void *payload); */ import "C" import ( @@ -53,6 +55,32 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) { return } +//export odbForEachCb +func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int { + ch := *(*chan *Oid)(payload) + oid := newOidFromC(id) + // Because the channel is unbuffered, we never read our own data. If ch is + // readable, the user has sent something on it, which means we should + // abort. + select { + case ch <- oid: + case <-ch: + return -1 + } + return 0; +} + +func (v *Odb) forEachWrap(ch chan *Oid) { + C._go_git_odb_foreach(v.ptr, unsafe.Pointer(&ch)) + close(ch) +} + +func (v *Odb) ForEach() chan *Oid { + ch := make(chan *Oid, 0) + go v.forEachWrap(ch) + return ch +} + type OdbObject struct { ptr *C.git_odb_object } @@ -83,4 +111,3 @@ func (object *OdbObject) Data() (data []byte) { return blob } - diff --git a/packbuilder.go b/packbuilder.go index 8cc03bd..3b4d5ef 100644 --- a/packbuilder.go +++ b/packbuilder.go @@ -11,9 +11,9 @@ extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload); */ import "C" import ( + "io" "runtime" "unsafe" - "io" ) type Packbuilder struct { @@ -68,7 +68,7 @@ func (pb *Packbuilder) ObjectCount() uint32 { func (pb *Packbuilder) WriteToFile(name string) error { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) - ret := C.git_packbuilder_write(pb.ptr, cname) + ret := C.git_packbuilder_write(pb.ptr, cname, nil, nil) if ret != 0 { return LastError() } @@ -20,4 +20,8 @@ int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload) return git_packbuilder_foreach(pb, (git_packbuilder_foreach_cb)&packbuilderForEachCb, payload); } +int _go_git_odb_foreach(git_odb *db, void *payload) +{ + return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload); +} /* EOF */ |
