Merge commit 'refs/pull/48/head' of github.com:libgit2/git2go
This commit is contained in:
commit
57f14a2591
49
odb.go
49
odb.go
|
@ -5,18 +5,49 @@ package git
|
||||||
#include <git2/errors.h>
|
#include <git2/errors.h>
|
||||||
|
|
||||||
extern int _go_git_odb_foreach(git_odb *db, void *payload);
|
extern int _go_git_odb_foreach(git_odb *db, void *payload);
|
||||||
|
extern void _go_git_odb_backend_free(git_odb_backend *backend);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"unsafe"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Odb struct {
|
type Odb struct {
|
||||||
ptr *C.git_odb
|
ptr *C.git_odb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OdbBackend struct {
|
||||||
|
ptr *C.git_odb_backend
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOdb() (odb *Odb, err error) {
|
||||||
|
odb = new(Odb)
|
||||||
|
|
||||||
|
ret := C.git_odb_new(&odb.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, MakeGitError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime.SetFinalizer(odb, (*Odb).Free)
|
||||||
|
return odb, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) {
|
||||||
|
backend = &OdbBackend{ptr}
|
||||||
|
return backend
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) {
|
||||||
|
ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority))
|
||||||
|
if ret < 0 {
|
||||||
|
backend.Free()
|
||||||
|
return MakeGitError(ret)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (v *Odb) Exists(oid *Oid) bool {
|
func (v *Odb) Exists(oid *Oid) bool {
|
||||||
ret := C.git_odb_exists(v.ptr, oid.toC())
|
ret := C.git_odb_exists(v.ptr, oid.toC())
|
||||||
return ret != 0
|
return ret != 0
|
||||||
|
@ -32,10 +63,10 @@ func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
|
||||||
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(hdr.Data), C.size_t(hdr.Len), C.git_otype(otype))
|
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(hdr.Data), C.size_t(hdr.Len), C.git_otype(otype))
|
||||||
|
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
err = MakeGitError(ret)
|
return nil, MakeGitError(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return oid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
|
func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
|
||||||
|
@ -50,7 +81,7 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime.SetFinalizer(obj, (*OdbObject).Free)
|
runtime.SetFinalizer(obj, (*OdbObject).Free)
|
||||||
return
|
return obj, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//export odbForEachCb
|
//export odbForEachCb
|
||||||
|
@ -65,7 +96,7 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int {
|
||||||
case <-ch:
|
case <-ch:
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
return 0;
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Odb) forEachWrap(ch chan *Oid) {
|
func (v *Odb) forEachWrap(ch chan *Oid) {
|
||||||
|
@ -90,9 +121,9 @@ func (v *Odb) Hash(data []byte, otype ObjectType) (oid *Oid, err error) {
|
||||||
|
|
||||||
ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype));
|
ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype));
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
err = MakeGitError(ret)
|
return nil, MakeGitError(ret)
|
||||||
}
|
}
|
||||||
return
|
return oid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewReadStream opens a read stream from the ODB. Reading from it will give you the
|
// NewReadStream opens a read stream from the ODB. Reading from it will give you the
|
||||||
|
@ -122,6 +153,10 @@ func (v *Odb) NewWriteStream(size int, otype ObjectType) (*OdbWriteStream, error
|
||||||
return stream, nil
|
return stream, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *OdbBackend) Free() {
|
||||||
|
C._go_git_odb_backend_free(v.ptr)
|
||||||
|
}
|
||||||
|
|
||||||
type OdbObject struct {
|
type OdbObject struct {
|
||||||
ptr *C.git_odb_object
|
ptr *C.git_odb_object
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
package git
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <git2.h>
|
||||||
|
#include <git2/errors.h>
|
||||||
|
#include <git2/sys/refdb_backend.h>
|
||||||
|
|
||||||
|
extern void _go_git_refdb_backend_free(git_refdb_backend *backend);
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Refdb struct {
|
||||||
|
ptr *C.git_refdb
|
||||||
|
}
|
||||||
|
|
||||||
|
type RefdbBackend struct {
|
||||||
|
ptr *C.git_refdb_backend
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Repository) NewRefdb() (refdb *Refdb, err error) {
|
||||||
|
refdb = new(Refdb)
|
||||||
|
|
||||||
|
ret := C.git_refdb_new(&refdb.ptr, v.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, MakeGitError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime.SetFinalizer(refdb, (*Refdb).Free)
|
||||||
|
return refdb, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRefdbBackendFromC(ptr *C.git_refdb_backend) (backend *RefdbBackend) {
|
||||||
|
backend = &RefdbBackend{ptr}
|
||||||
|
return backend
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Refdb) SetBackend(backend *RefdbBackend) (err error) {
|
||||||
|
ret := C.git_refdb_set_backend(v.ptr, backend.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
backend.Free()
|
||||||
|
return MakeGitError(ret)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *RefdbBackend) Free() {
|
||||||
|
C._go_git_refdb_backend_free(v.ptr)
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ package git
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <git2.h>
|
#include <git2.h>
|
||||||
#include <git2/errors.h>
|
#include <git2/sys/repository.h>
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
|
@ -51,6 +51,22 @@ func InitRepository(path string, isbare bool) (*Repository, error) {
|
||||||
return repo, nil
|
return repo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) {
|
||||||
|
repo = new(Repository)
|
||||||
|
|
||||||
|
ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, MakeGitError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime.SetFinalizer(repo, (*Repository).Free)
|
||||||
|
return repo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Repository) SetRefdb(refdb *Refdb) {
|
||||||
|
C.git_repository_set_refdb(v.ptr, refdb.ptr)
|
||||||
|
}
|
||||||
|
|
||||||
func (v *Repository) Free() {
|
func (v *Repository) Free() {
|
||||||
runtime.SetFinalizer(v, nil)
|
runtime.SetFinalizer(v, nil)
|
||||||
C.git_repository_free(v.ptr)
|
C.git_repository_free(v.ptr)
|
||||||
|
@ -270,6 +286,11 @@ func (v *Odb) Free() {
|
||||||
C.git_odb_free(v.ptr)
|
C.git_odb_free(v.ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *Refdb) Free() {
|
||||||
|
runtime.SetFinalizer(v, nil)
|
||||||
|
C.git_refdb_free(v.ptr)
|
||||||
|
}
|
||||||
|
|
||||||
func (v *Repository) Odb() (odb *Odb, err error) {
|
func (v *Repository) Odb() (odb *Odb, err error) {
|
||||||
odb = new(Odb)
|
odb = new(Odb)
|
||||||
|
|
||||||
|
@ -281,7 +302,7 @@ func (v *Repository) Odb() (odb *Odb, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime.SetFinalizer(odb, (*Odb).Free)
|
runtime.SetFinalizer(odb, (*Odb).Free)
|
||||||
return
|
return odb, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *Repository) Path() string {
|
func (repo *Repository) Path() string {
|
||||||
|
|
18
wrapper.c
18
wrapper.c
|
@ -1,5 +1,7 @@
|
||||||
#include "_cgo_export.h"
|
#include "_cgo_export.h"
|
||||||
#include "git2.h"
|
#include "git2.h"
|
||||||
|
#include "git2/sys/odb_backend.h"
|
||||||
|
#include "git2/sys/refdb_backend.h"
|
||||||
#include "git2/submodule.h"
|
#include "git2/submodule.h"
|
||||||
#include "git2/pack.h"
|
#include "git2/pack.h"
|
||||||
|
|
||||||
|
@ -25,6 +27,22 @@ int _go_git_odb_foreach(git_odb *db, void *payload)
|
||||||
return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload);
|
return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _go_git_odb_backend_free(git_odb_backend *backend)
|
||||||
|
{
|
||||||
|
if (backend->free)
|
||||||
|
backend->free(backend);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _go_git_refdb_backend_free(git_refdb_backend *backend)
|
||||||
|
{
|
||||||
|
if (backend->free)
|
||||||
|
backend->free(backend);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void _go_git_setup_callbacks(git_remote_callbacks *callbacks) {
|
void _go_git_setup_callbacks(git_remote_callbacks *callbacks) {
|
||||||
typedef int (*completion_cb)(git_remote_completion_type type, void *data);
|
typedef int (*completion_cb)(git_remote_completion_type type, void *data);
|
||||||
typedef int (*credentials_cb)(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *data);
|
typedef int (*credentials_cb)(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *data);
|
||||||
|
|
Loading…
Reference in New Issue