Skip to content

Commit a1743f7

Browse files
author
Vicent Martí
committed
Merge pull request libgit2#21 from Merovius/packbuilder
Implement Packbuilder-Support
2 parents c9adbf0 + 3a1bbbd commit a1743f7

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

packbuilder.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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+
"io"
17+
)
18+
19+
type Packbuilder struct {
20+
ptr *C.git_packbuilder
21+
}
22+
23+
func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
24+
builder := &Packbuilder{}
25+
ret := C.git_packbuilder_new(&builder.ptr, repo.ptr)
26+
if ret != 0 {
27+
return nil, LastError()
28+
}
29+
runtime.SetFinalizer(builder, (*Packbuilder).Free)
30+
return builder, nil
31+
}
32+
33+
func (pb *Packbuilder) Free() {
34+
runtime.SetFinalizer(pb, nil)
35+
C.git_packbuilder_free(pb.ptr)
36+
}
37+
38+
func (pb *Packbuilder) Insert(id *Oid, name string) error {
39+
cname := C.CString(name)
40+
defer C.free(unsafe.Pointer(cname))
41+
ret := C.git_packbuilder_insert(pb.ptr, id.toC(), cname)
42+
if ret != 0 {
43+
return LastError()
44+
}
45+
return nil
46+
}
47+
48+
func (pb *Packbuilder) InsertCommit(id *Oid) error {
49+
ret := C.git_packbuilder_insert_commit(pb.ptr, id.toC())
50+
if ret != 0 {
51+
return LastError()
52+
}
53+
return nil
54+
}
55+
56+
func (pb *Packbuilder) InsertTree(id *Oid) error {
57+
ret := C.git_packbuilder_insert_tree(pb.ptr, id.toC())
58+
if ret != 0 {
59+
return LastError()
60+
}
61+
return nil
62+
}
63+
64+
func (pb *Packbuilder) ObjectCount() uint32 {
65+
return uint32(C.git_packbuilder_object_count(pb.ptr))
66+
}
67+
68+
func (pb *Packbuilder) WriteToFile(name string) error {
69+
cname := C.CString(name)
70+
defer C.free(unsafe.Pointer(cname))
71+
ret := C.git_packbuilder_write(pb.ptr, cname)
72+
if ret != 0 {
73+
return LastError()
74+
}
75+
return nil
76+
}
77+
78+
func (pb *Packbuilder) Write(w io.Writer) error {
79+
ch := pb.ForEach()
80+
for slice := range ch {
81+
_, err := w.Write(slice)
82+
if err != nil {
83+
return err
84+
}
85+
}
86+
return nil
87+
}
88+
89+
func (pb *Packbuilder) Written() uint32 {
90+
return uint32(C.git_packbuilder_written(pb.ptr))
91+
}
92+
93+
//export packbuilderForEachCb
94+
func packbuilderForEachCb(buf unsafe.Pointer, size C.size_t, payload unsafe.Pointer) int {
95+
ch := *(*chan []byte)(payload)
96+
97+
slice := C.GoBytes(buf, C.int(size))
98+
ch <- slice
99+
return 0
100+
}
101+
102+
func (pb *Packbuilder) forEachWrap(ch chan []byte) {
103+
C._go_git_packbuilder_foreach(pb.ptr, unsafe.Pointer(&ch))
104+
close(ch)
105+
}
106+
107+
func (pb *Packbuilder) ForEach() chan []byte {
108+
ch := make(chan []byte, 0)
109+
go pb.forEachWrap(ch)
110+
return ch
111+
}

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)