Skip to content

Commit 140f362

Browse files
author
Axel Wagner
committed
Add support for git_packbuilder
1 parent c9adbf0 commit 140f362

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

packbuilder.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package git
2+
3+
/*
4+
#cgo pkg-config: libgit2
5+
#include <git2.h>
6+
#include <git2/errors.h>
7+
#include <git2/pack.h>
8+
#include <stdlib.h>
9+
10+
extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload);
11+
*/
12+
import "C"
13+
import (
14+
"runtime"
15+
"unsafe"
16+
)
17+
18+
type Packbuilder struct {
19+
ptr *C.git_packbuilder
20+
}
21+
22+
func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
23+
builder := &Packbuilder{}
24+
ret := C.git_packbuilder_new(&builder.ptr, repo.ptr)
25+
if ret != 0 {
26+
return nil, LastError()
27+
}
28+
runtime.SetFinalizer(builder, (*Packbuilder).Free)
29+
return builder, nil
30+
}
31+
32+
func (pb *Packbuilder) Free() {
33+
runtime.SetFinalizer(pb, nil)
34+
C.git_packbuilder_free(pb.ptr)
35+
}
36+
37+
func (pb *Packbuilder) Insert(id *Oid, name string) error {
38+
cname := C.CString(name)
39+
defer C.free(unsafe.Pointer(cname))
40+
ret := C.git_packbuilder_insert(pb.ptr, id.toC(), cname)
41+
if ret != 0 {
42+
return LastError()
43+
}
44+
return nil
45+
}
46+
47+
func (pb *Packbuilder) InsertCommit(id *Oid) error {
48+
ret := C.git_packbuilder_insert_commit(pb.ptr, id.toC())
49+
if ret != 0 {
50+
return LastError()
51+
}
52+
return nil
53+
}
54+
55+
func (pb *Packbuilder) InsertTree(id *Oid) error {
56+
ret := C.git_packbuilder_insert_tree(pb.ptr, id.toC())
57+
if ret != 0 {
58+
return LastError()
59+
}
60+
return nil
61+
}
62+
63+
func (pb *Packbuilder) ObjectCount() uint32 {
64+
return uint32(C.git_packbuilder_object_count(pb.ptr))
65+
}
66+
67+
func (pb *Packbuilder) WriteToFile(name string) error {
68+
cname := C.CString(name)
69+
defer C.free(unsafe.Pointer(cname))
70+
ret := C.git_packbuilder_write(pb.ptr, cname)
71+
if ret != 0 {
72+
return LastError()
73+
}
74+
return nil
75+
}
76+
77+
func (pb *Packbuilder) Written() uint32 {
78+
return uint32(C.git_packbuilder_written(pb.ptr))
79+
}
80+
81+
//export packbuilderForEachCb
82+
func packbuilderForEachCb(buf unsafe.Pointer, size C.size_t, payload unsafe.Pointer) int {
83+
ch := *(*chan []byte)(payload)
84+
85+
slice := C.GoBytes(buf, C.int(size))
86+
ch <- slice
87+
return 0
88+
}
89+
90+
func (pb *Packbuilder) forEachWrap(ch chan []byte) {
91+
C._go_git_packbuilder_foreach(pb.ptr, unsafe.Pointer(&ch))
92+
close(ch)
93+
}
94+
95+
func (pb *Packbuilder) ForEach() chan []byte {
96+
ch := make(chan []byte, 0)
97+
go pb.forEachWrap(ch)
98+
return ch
99+
}

wrapper.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "_cgo_export.h"
22
#include "git2.h"
33
#include "git2/submodule.h"
4+
#include "git2/pack.h"
45

56
typedef int (*gogit_submodule_cbk)(git_submodule *sm, const char *name, void *payload);
67

@@ -14,4 +15,9 @@ int _go_git_treewalk(git_tree *tree, git_treewalk_mode mode, void *ptr)
1415
return git_tree_walk(tree, mode, (git_treewalk_cb)&CallbackGitTreeWalk, ptr);
1516
}
1617

18+
int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload)
19+
{
20+
return git_packbuilder_foreach(pb, (git_packbuilder_foreach_cb)&packbuilderForEachCb, payload);
21+
}
22+
1723
/* EOF */

0 commit comments

Comments
 (0)