From 91946a570500bc441be0aea4603a5c83f81e22a4 Mon Sep 17 00:00:00 2001 From: lhchavez Date: Sun, 23 Dec 2018 03:25:52 +0000 Subject: Add odb.NewOdbBackendLoose() This change adds support for odb.NewOdbBackendLoose(). This, together with the git.Packbuilder, can do what Mempack does with a lot less memory. --- odb.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'odb.go') diff --git a/odb.go b/odb.go index 994ff2a..d313e3b 100644 --- a/odb.go +++ b/odb.go @@ -4,6 +4,7 @@ package git #include extern int git_odb_backend_one_pack(git_odb_backend **out, const char *index_file); +extern int git_odb_backend_loose(git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync, unsigned int dir_mode, unsigned int file_mode); extern int _go_git_odb_foreach(git_odb *db, void *payload); extern void _go_git_odb_backend_free(git_odb_backend *backend); extern int _go_git_odb_write_pack(git_odb_writepack **out, git_odb *db, void *progress_payload); @@ -14,6 +15,7 @@ extern void _go_git_odb_writepack_free(git_odb_writepack *writepack); import "C" import ( "io" + "os" "reflect" "runtime" "unsafe" @@ -88,6 +90,27 @@ func NewOdbBackendOnePack(packfileIndexPath string) (backend *OdbBackend, err er return NewOdbBackendFromC(unsafe.Pointer(odbOnePack)), nil } +// NewOdbBackendLoose creates a backend for loose objects. +func NewOdbBackendLoose(objectsDir string, compressionLevel int, doFsync bool, dirMode os.FileMode, fileMode os.FileMode) (backend *OdbBackend, err error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var odbLoose *C.git_odb_backend = nil + var doFsyncInt C.int + if doFsync { + doFsyncInt = C.int(1) + } + + cstr := C.CString(objectsDir) + defer C.free(unsafe.Pointer(cstr)) + + ret := C.git_odb_backend_loose(&odbLoose, cstr, C.int(compressionLevel), doFsyncInt, C.uint(dirMode), C.uint(fileMode)) + if ret < 0 { + return nil, MakeGitError(ret) + } + return NewOdbBackendFromC(unsafe.Pointer(odbLoose)), nil +} + func (v *Odb) ReadHeader(oid *Oid) (uint64, ObjectType, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() -- cgit v1.2.3