summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commit.go17
-rw-r--r--git.go20
-rw-r--r--odb.go29
-rw-r--r--packbuilder.go4
-rw-r--r--wrapper.c4
5 files changed, 71 insertions, 3 deletions
diff --git a/commit.go b/commit.go
index d31f684..06d1a22 100644
--- a/commit.go
+++ b/commit.go
@@ -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 {
diff --git a/git.go b/git.go
index 19f4a32..f5c69fd 100644
--- a/git.go
+++ b/git.go
@@ -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
diff --git a/odb.go b/odb.go
index bf17171..f6eb591 100644
--- a/odb.go
+++ b/odb.go
@@ -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()
}
diff --git a/wrapper.c b/wrapper.c
index 67f34fd..2af3974 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -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 */