From 66dfbbf5399182d4b307a236042a845ca7a1ed15 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Tue, 17 Dec 2013 18:46:25 -0500 Subject: [PATCH 01/12] add function to init repos w/custom odb backends --- repository.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/repository.go b/repository.go index 5540a0c..6dbe386 100644 --- a/repository.go +++ b/repository.go @@ -15,6 +15,8 @@ type Repository struct { ptr *C.git_repository } +type InitCustomBackend func(**C.git_repository, **C.git_odb) int + func OpenRepository(path string) (*Repository, error) { repo := new(Repository) @@ -45,6 +47,23 @@ func InitRepository(path string, isbare bool) (*Repository, error) { return repo, nil } +func InitRepositoryWCustomOdbBackend(initStrategy InitCustomBackend) (*Repository, *Odb, error) { + // init return vars + repo := new(Repository) + odb := new(Odb) + + // run initStrategy abstract function + ret := initStrategy(&repo.ptr, &odb.ptr) + if ret < 0 { + return nil, nil, LastError() + } + + // cleanup and return + runtime.SetFinalizer(repo, (*Repository).Free) + runtime.SetFinalizer(odb, (*Odb).Free) + return repo, odb, nil +} + func (v *Repository) Free() { runtime.SetFinalizer(v, nil) C.git_repository_free(v.ptr) From dfe6d1ab7efa8bb480616eb5f3962989b4ac3096 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Wed, 18 Dec 2013 17:25:54 -0500 Subject: [PATCH 02/12] Stop assuming ODB backend includes wrapping routine; wrap in git2go instead --- odb.go | 4 ++++ repository.go | 27 ++++++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/odb.go b/odb.go index eaa7872..acde696 100644 --- a/odb.go +++ b/odb.go @@ -17,6 +17,10 @@ type Odb struct { ptr *C.git_odb } +type OdbBackend struct { + ptr *C.git_odb_backend +} + func (v *Odb) Exists(oid *Oid) bool { ret := C.git_odb_exists(v.ptr, oid.toC()) return ret != 0 diff --git a/repository.go b/repository.go index 6dbe386..c65bd9d 100644 --- a/repository.go +++ b/repository.go @@ -15,7 +15,7 @@ type Repository struct { ptr *C.git_repository } -type InitCustomBackend func(**C.git_repository, **C.git_odb) int +type InitCustomBackend func(**C.git_odb_backend) int func OpenRepository(path string) (*Repository, error) { repo := new(Repository) @@ -47,18 +47,31 @@ func InitRepository(path string, isbare bool) (*Repository, error) { return repo, nil } -func InitRepositoryWCustomOdbBackend(initStrategy InitCustomBackend) (*Repository, *Odb, error) { - // init return vars - repo := new(Repository) +func InitRepositoryWCustomOdbBackend(initStrategy InitCustomBackend, priority int) (*Repository, *Odb, error) { + // inits + repo := new(Repository) odb := new(Odb) + backend := new(OdbBackend) - // run initStrategy abstract function - ret := initStrategy(&repo.ptr, &odb.ptr) + // wrap routine w/abstract function + ret := C.git_odb_new(&odb.ptr) + if ret >= 0 { + ret = C.git_repository_wrap_odb(&repo.ptr, odb.ptr) + } + + if ret >= 0 { + ret = C.int(initStrategy(&backend.ptr)) + } + + if ret >= 0 { + ret = C.git_odb_add_backend(odb.ptr, backend.ptr, C.int(priority)) + } + + // cleanup and return if ret < 0 { return nil, nil, LastError() } - // cleanup and return runtime.SetFinalizer(repo, (*Repository).Free) runtime.SetFinalizer(odb, (*Odb).Free) return repo, odb, nil From 19b241bd55966f495b7e32f56dc54b42a13dd0b8 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Thu, 19 Dec 2013 00:33:23 -0500 Subject: [PATCH 03/12] Refactor InitRepositoryWCustomOdbBackend() into component functions --- odb.go | 23 ++++++++++++++++++++++- repository.go | 34 +++++++--------------------------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/odb.go b/odb.go index acde696..774e94c 100644 --- a/odb.go +++ b/odb.go @@ -17,8 +17,29 @@ type Odb struct { ptr *C.git_odb } +// OdbBackends need public Ptrs: client apps init the backend type OdbBackend struct { - ptr *C.git_odb_backend + Ptr *C.git_odb_backend +} + +func InitOdb() (odb *Odb, err error) { + odb = new(Odb) + + ret := C.git_odb_new(&odb.ptr) + if ret < 0 { + return nil, LastError() + } + + runtime.SetFinalizer(odb, (*Odb).Free) + return +} + +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 { + err = LastError() + } + return nil } func (v *Odb) Exists(oid *Oid) bool { diff --git a/repository.go b/repository.go index c65bd9d..503c1b3 100644 --- a/repository.go +++ b/repository.go @@ -15,8 +15,6 @@ type Repository struct { ptr *C.git_repository } -type InitCustomBackend func(**C.git_odb_backend) int - func OpenRepository(path string) (*Repository, error) { repo := new(Repository) @@ -47,34 +45,16 @@ func InitRepository(path string, isbare bool) (*Repository, error) { return repo, nil } -func InitRepositoryWCustomOdbBackend(initStrategy InitCustomBackend, priority int) (*Repository, *Odb, error) { - // inits - repo := new(Repository) - odb := new(Odb) - backend := new(OdbBackend) +func InitRepositoryByWrapOdb(odb *Odb) (repo *Repository, err error) { + repo = new(Repository) - // wrap routine w/abstract function - ret := C.git_odb_new(&odb.ptr) - if ret >= 0 { - ret = C.git_repository_wrap_odb(&repo.ptr, odb.ptr) + ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) + if ret < 0 { + return nil, LastError() } - if ret >= 0 { - ret = C.int(initStrategy(&backend.ptr)) - } - - if ret >= 0 { - ret = C.git_odb_add_backend(odb.ptr, backend.ptr, C.int(priority)) - } - - // cleanup and return - if ret < 0 { - return nil, nil, LastError() - } - - runtime.SetFinalizer(repo, (*Repository).Free) - runtime.SetFinalizer(odb, (*Odb).Free) - return repo, odb, nil + runtime.SetFinalizer(repo, (*Repository).Free) + return } func (v *Repository) Free() { From 507a204249fbfe528b8d3caae7a64b35beab5d14 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Thu, 19 Dec 2013 17:24:44 -0500 Subject: [PATCH 04/12] Rename constructor functions to New... --- odb.go | 2 +- repository.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/odb.go b/odb.go index 774e94c..aea7a65 100644 --- a/odb.go +++ b/odb.go @@ -22,7 +22,7 @@ type OdbBackend struct { Ptr *C.git_odb_backend } -func InitOdb() (odb *Odb, err error) { +func NewOdb() (odb *Odb, err error) { odb = new(Odb) ret := C.git_odb_new(&odb.ptr) diff --git a/repository.go b/repository.go index 503c1b3..4bd8cc2 100644 --- a/repository.go +++ b/repository.go @@ -45,7 +45,7 @@ func InitRepository(path string, isbare bool) (*Repository, error) { return repo, nil } -func InitRepositoryByWrapOdb(odb *Odb) (repo *Repository, err error) { +func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { repo = new(Repository) ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) From 59c7bd5ce462f243ff04c35214152837f1baec67 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Fri, 20 Dec 2013 14:11:24 -0500 Subject: [PATCH 05/12] Add OdbBackend constructor --- odb.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/odb.go b/odb.go index aea7a65..e4bbd77 100644 --- a/odb.go +++ b/odb.go @@ -19,7 +19,7 @@ type Odb struct { // OdbBackends need public Ptrs: client apps init the backend type OdbBackend struct { - Ptr *C.git_odb_backend + ptr *C.git_odb_backend } func NewOdb() (odb *Odb, err error) { @@ -34,8 +34,14 @@ func NewOdb() (odb *Odb, err error) { return } +func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) { + backend = &OdbBackend{ptr} + return +} + + func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) { - ret := C.git_odb_add_backend(v.ptr, backend.Ptr, C.int(priority)) + ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority)) if ret < 0 { err = LastError() } From e6865861496daef507dc08fa14a22a74269df211 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Fri, 20 Dec 2013 14:26:00 -0500 Subject: [PATCH 06/12] remove unnecessary comment --- odb.go | 1 - 1 file changed, 1 deletion(-) diff --git a/odb.go b/odb.go index e4bbd77..1e81d58 100644 --- a/odb.go +++ b/odb.go @@ -17,7 +17,6 @@ type Odb struct { ptr *C.git_odb } -// OdbBackends need public Ptrs: client apps init the backend type OdbBackend struct { ptr *C.git_odb_backend } From 1c23e8ece34d217bcc787f1c5da6bfb143f27e9b Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Wed, 29 Jan 2014 18:55:17 -0500 Subject: [PATCH 07/12] add OdbBackend.Free() and the C it wraps; go fmt odb.go --- odb.go | 45 +++++++++++++++++++++++++-------------------- wrapper.c | 9 +++++++++ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/odb.go b/odb.go index c7c8bd9..fc8fbd4 100644 --- a/odb.go +++ b/odb.go @@ -5,12 +5,13 @@ package git #include 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 ( - "unsafe" "reflect" "runtime" + "unsafe" ) type Odb struct { @@ -18,33 +19,33 @@ type Odb struct { } type OdbBackend struct { - ptr *C.git_odb_backend + ptr *C.git_odb_backend } func NewOdb() (odb *Odb, err error) { - odb = new(Odb) + odb = new(Odb) - ret := C.git_odb_new(&odb.ptr) - if ret < 0 { - return nil, LastError() - } + ret := C.git_odb_new(&odb.ptr) + if ret < 0 { + return nil, LastError() + } - runtime.SetFinalizer(odb, (*Odb).Free) - return + runtime.SetFinalizer(odb, (*Odb).Free) + return } func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) { - backend = &OdbBackend{ptr} - return + backend = &OdbBackend{ptr} + return } - 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 { - err = LastError() - } - return nil + ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority)) + if ret < 0 { + backend.Free() + err = LastError() + } + return nil } func (v *Odb) Exists(oid *Oid) bool { @@ -93,9 +94,9 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int { select { case ch <- oid: case <-ch: - return -1 + return -1 } - return 0; + return 0 } func (v *Odb) forEachWrap(ch chan *Oid) { @@ -136,6 +137,10 @@ func (v *Odb) NewWriteStream(size int, otype ObjectType) (*OdbWriteStream, error return stream, nil } +func (v *OdbBackend) Free() { + C._go_git_odb_backend_free(v.ptr) +} + type OdbObject struct { ptr *C.git_odb_object } @@ -199,7 +204,7 @@ func (stream *OdbReadStream) Free() { type OdbWriteStream struct { ptr *C.git_odb_stream - Id Oid + Id Oid } // Write writes to the stream diff --git a/wrapper.c b/wrapper.c index 2af3974..6f69a7a 100644 --- a/wrapper.c +++ b/wrapper.c @@ -1,5 +1,6 @@ #include "_cgo_export.h" #include "git2.h" +#include "git2/sys/odb_backend.h" #include "git2/submodule.h" #include "git2/pack.h" @@ -24,4 +25,12 @@ int _go_git_odb_foreach(git_odb *db, void *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; +} /* EOF */ From decaf064f9ace275789657343d5123ee5290ea31 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Mon, 24 Feb 2014 03:01:47 -0500 Subject: [PATCH 08/12] add custom refdb backend support --- refdb.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ repository.go | 26 ++++++++++++++++++++------ wrapper.c | 9 +++++++++ 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 refdb.go diff --git a/refdb.go b/refdb.go new file mode 100644 index 0000000..3b8ed03 --- /dev/null +++ b/refdb.go @@ -0,0 +1,50 @@ +package git + +/* +#include +#include + +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, LastError() + } + + runtime.SetFinalizer(refdb, (*Refdb).Free) + return +} + +func NewRefdbBackendFromC(ptr *C.git_refdb_backend) (backend *RefdbBackend) { + backend = &RefdbBackend{ptr} + return +} + +func (v *Refdb) SetBackend(backend *RefdbBackend) (err error) { + ret := C.git_refdb_set_backend(v.ptr, backend.ptr) + if ret < 0 { + backend.Free() + err = LastError() + } + return +} + +func (v *RefdbBackend) Free() { + C._go_git_refdb_backend_free(v.ptr) +} diff --git a/repository.go b/repository.go index 68b9aba..f8b327a 100644 --- a/repository.go +++ b/repository.go @@ -15,6 +15,10 @@ type Repository struct { ptr *C.git_repository } +func (v *Repository) Pointer() *C.git_repository { + return v.ptr +} + func OpenRepository(path string) (*Repository, error) { repo := new(Repository) @@ -52,15 +56,20 @@ func InitRepository(path string, isbare bool) (*Repository, error) { } func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { - repo = new(Repository) + repo = new(Repository) - ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) - if ret < 0 { - return nil, LastError() + ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) + if ret < 0 { + return nil, LastError() } - runtime.SetFinalizer(repo, (*Repository).Free) - return + runtime.SetFinalizer(repo, (*Repository).Free) + return +} + +func (v *Repository) SetRefdb(refdb *Refdb) { + C.git_repository_set_refdb(v.ptr, refdb.ptr) + return } func (v *Repository) Free() { @@ -269,6 +278,11 @@ func (v *Odb) Free() { 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) { odb = new(Odb) diff --git a/wrapper.c b/wrapper.c index 6f69a7a..66a6110 100644 --- a/wrapper.c +++ b/wrapper.c @@ -1,6 +1,7 @@ #include "_cgo_export.h" #include "git2.h" #include "git2/sys/odb_backend.h" +#include "git2/sys/refdb_backend.h" #include "git2/submodule.h" #include "git2/pack.h" @@ -33,4 +34,12 @@ void _go_git_odb_backend_free(git_odb_backend *backend) return; } + +void _go_git_refdb_backend_free(git_refdb_backend *backend) +{ + if (backend->free) + backend->free(backend); + + return; +} /* EOF */ From 9299214e5761e73e867f2e739689402161a75fec Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Wed, 26 Feb 2014 23:44:32 -0500 Subject: [PATCH 09/12] re-encapsulate repository --- repository.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/repository.go b/repository.go index 6fbf1d3..2817fe7 100644 --- a/repository.go +++ b/repository.go @@ -15,10 +15,6 @@ type Repository struct { ptr *C.git_repository } -func (v *Repository) Pointer() *C.git_repository { - return v.ptr -} - func OpenRepository(path string) (*Repository, error) { repo := new(Repository) From b5e60dc106828b308fdb7e69fe10a0d2dec4eece Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Thu, 3 Apr 2014 16:39:21 -0400 Subject: [PATCH 10/12] explicit returns --- odb.go | 14 +++++++------- refdb.go | 8 ++++---- repository.go | 5 ++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/odb.go b/odb.go index 4a5187c..80f8312 100644 --- a/odb.go +++ b/odb.go @@ -31,12 +31,12 @@ func NewOdb() (odb *Odb, err error) { } runtime.SetFinalizer(odb, (*Odb).Free) - return + return odb, nil } func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) { backend = &OdbBackend{ptr} - return + return backend } func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) { @@ -63,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)) if ret < 0 { - err = LastError() + return nil, LastError() } - return + return oid, nil } func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) { @@ -81,7 +81,7 @@ func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) { } runtime.SetFinalizer(obj, (*OdbObject).Free) - return + return obj, nil } //export odbForEachCb @@ -121,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)); if ret < 0 { - err = LastError() + return nil, LastError() } - return + return oid, nil } // NewReadStream opens a read stream from the ODB. Reading from it will give you the diff --git a/refdb.go b/refdb.go index 3b8ed03..9550b49 100644 --- a/refdb.go +++ b/refdb.go @@ -28,21 +28,21 @@ func (v *Repository) NewRefdb() (refdb *Refdb, err error) { } runtime.SetFinalizer(refdb, (*Refdb).Free) - return + return refdb, nil } func NewRefdbBackendFromC(ptr *C.git_refdb_backend) (backend *RefdbBackend) { backend = &RefdbBackend{ptr} - return + 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() - err = LastError() + return LastError() } - return + return nil } func (v *RefdbBackend) Free() { diff --git a/repository.go b/repository.go index 2817fe7..1f273fb 100644 --- a/repository.go +++ b/repository.go @@ -60,12 +60,11 @@ func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { } runtime.SetFinalizer(repo, (*Repository).Free) - return + return repo, nil } func (v *Repository) SetRefdb(refdb *Refdb) { C.git_repository_set_refdb(v.ptr, refdb.ptr) - return } func (v *Repository) Free() { @@ -294,7 +293,7 @@ func (v *Repository) Odb() (odb *Odb, err error) { } runtime.SetFinalizer(odb, (*Odb).Free) - return + return odb, nil } func (repo *Repository) Path() string { From fc70808cb7a5fa6e627bb44bbcf9d8f42b1bcd80 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Thu, 3 Apr 2014 16:49:22 -0400 Subject: [PATCH 11/12] update for upstream changes --- odb.go | 4 ++-- refdb.go | 4 ++-- repository.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/odb.go b/odb.go index 3b0c864..abfa1cd 100644 --- a/odb.go +++ b/odb.go @@ -27,7 +27,7 @@ func NewOdb() (odb *Odb, err error) { ret := C.git_odb_new(&odb.ptr) if ret < 0 { - return nil, LastError() + return nil, MakeGitError(ret) } runtime.SetFinalizer(odb, (*Odb).Free) @@ -43,7 +43,7 @@ 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() - err = LastError() + return MakeGitError(ret) } return nil } diff --git a/refdb.go b/refdb.go index 9550b49..ba66e61 100644 --- a/refdb.go +++ b/refdb.go @@ -24,7 +24,7 @@ func (v *Repository) NewRefdb() (refdb *Refdb, err error) { ret := C.git_refdb_new(&refdb.ptr, v.ptr) if ret < 0 { - return nil, LastError() + return nil, MakeGitError(ret) } runtime.SetFinalizer(refdb, (*Refdb).Free) @@ -40,7 +40,7 @@ func (v *Refdb) SetBackend(backend *RefdbBackend) (err error) { ret := C.git_refdb_set_backend(v.ptr, backend.ptr) if ret < 0 { backend.Free() - return LastError() + return MakeGitError(ret) } return nil } diff --git a/repository.go b/repository.go index d5aa753..e694bb6 100644 --- a/repository.go +++ b/repository.go @@ -56,7 +56,7 @@ func NewRepositoryWrapOdb(odb *Odb) (repo *Repository, err error) { ret := C.git_repository_wrap_odb(&repo.ptr, odb.ptr) if ret < 0 { - return nil, LastError() + return nil, MakeGitError(ret) } runtime.SetFinalizer(repo, (*Repository).Free) From cbc81246afe58f4e3176ec2e4e930dcb0145a2a2 Mon Sep 17 00:00:00 2001 From: Aidan Nulman Date: Thu, 3 Apr 2014 17:12:31 -0400 Subject: [PATCH 12/12] fix for travisci --- refdb.go | 1 + 1 file changed, 1 insertion(+) diff --git a/refdb.go b/refdb.go index ba66e61..46fbb63 100644 --- a/refdb.go +++ b/refdb.go @@ -3,6 +3,7 @@ package git /* #include #include +#include extern void _go_git_refdb_backend_free(git_refdb_backend *backend); */