From 714cd56c715d22e9759413783c9c4be0018193e0 Mon Sep 17 00:00:00 2001 From: Augie Fackler Date: Mon, 2 Nov 2015 15:51:03 -0500 Subject: odb: remove debug fmt.Printlns These appear to be left over debug statements, and they also look like they were intended to be fmt.Printf calls anyway. --- odb.go | 4 ---- 1 file changed, 4 deletions(-) (limited to 'odb.go') diff --git a/odb.go b/odb.go index be0870e..b15851f 100644 --- a/odb.go +++ b/odb.go @@ -11,7 +11,6 @@ import ( "reflect" "runtime" "unsafe" - "fmt" ) type Odb struct { @@ -107,9 +106,7 @@ func odbForEachCb(id *C.git_oid, handle unsafe.Pointer) int { } err := data.callback(newOidFromC(id)) - fmt.Println("err %v", err) if err != nil { - fmt.Println("returning EUSER") data.err = err return C.GIT_EUSER } @@ -130,7 +127,6 @@ func (v *Odb) ForEach(callback OdbForEachCallback) error { defer pointerHandles.Untrack(handle) ret := C._go_git_odb_foreach(v.ptr, handle) - fmt.Println("ret %v", ret); if ret == C.GIT_EUSER { return data.err } else if ret < 0 { -- cgit v1.2.3 From 42b11d403d91e25754fe60c63c26371fbb7a89a9 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 7 Jan 2016 18:37:46 -0800 Subject: handles, merge, odb: changes for Go 1.6 pointer passing rules See http://tip.golang.org/cmd/cgo/#hdr-Passing_pointers . --- handles.go | 6 +++--- merge.go | 34 +++++++++++++++++++--------------- odb.go | 5 +++-- 3 files changed, 25 insertions(+), 20 deletions(-) (limited to 'odb.go') diff --git a/handles.go b/handles.go index a062231..a855717 100644 --- a/handles.go +++ b/handles.go @@ -52,12 +52,12 @@ func (v *HandleList) Track(pointer interface{}) unsafe.Pointer { v.Unlock() - return unsafe.Pointer(&slot) + return unsafe.Pointer(uintptr(slot)) } // Untrack stops tracking the pointer given by the handle func (v *HandleList) Untrack(handle unsafe.Pointer) { - slot := *(*int)(handle) + slot := int(uintptr(handle)) v.Lock() @@ -69,7 +69,7 @@ func (v *HandleList) Untrack(handle unsafe.Pointer) { // Get retrieves the pointer from the given handle func (v *HandleList) Get(handle unsafe.Pointer) interface{} { - slot := *(*int)(handle) + slot := int(uintptr(handle)) v.RLock() diff --git a/merge.go b/merge.go index 272bf6a..535a5e7 100644 --- a/merge.go +++ b/merge.go @@ -85,8 +85,8 @@ const ( ) type MergeOptions struct { - Version uint - TreeFlags MergeTreeFlag + Version uint + TreeFlags MergeTreeFlag RenameThreshold uint TargetLimit uint @@ -98,7 +98,7 @@ type MergeOptions struct { func mergeOptionsFromC(opts *C.git_merge_options) MergeOptions { return MergeOptions{ Version: uint(opts.version), - TreeFlags: MergeTreeFlag(opts.tree_flags), + TreeFlags: MergeTreeFlag(opts.tree_flags), RenameThreshold: uint(opts.rename_threshold), TargetLimit: uint(opts.target_limit), FileFavor: MergeFileFavor(opts.file_favor), @@ -262,10 +262,10 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) { } oids := make([]*Oid, coids.count) - hdr := reflect.SliceHeader { + hdr := reflect.SliceHeader{ Data: uintptr(unsafe.Pointer(coids.ids)), - Len: int(coids.count), - Cap: int(coids.count), + Len: int(coids.count), + Cap: int(coids.count), } goSlice := *(*[]C.git_oid)(unsafe.Pointer(&hdr)) @@ -321,17 +321,21 @@ type MergeFileInput struct { } // populate a C struct with merge file input, make sure to use freeMergeFileInput to clean up allocs -func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) { +func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) *C.char { c.path = C.CString(input.Path) + var toFree *C.char if input.Contents != nil { - c.ptr = (*C.char)(unsafe.Pointer(&input.Contents[0])) + toFree = C.CString(string(input.Contents)) + c.ptr = toFree c.size = C.size_t(len(input.Contents)) } c.mode = C.uint(input.Mode) + return toFree } -func freeCMergeFileInput(c *C.git_merge_file_input) { +func freeCMergeFileInput(c *C.git_merge_file_input, toFree *C.char) { C.free(unsafe.Pointer(c.path)) + C.free(unsafe.Pointer(toFree)) } type MergeFileFlags int @@ -382,12 +386,12 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp var cours C.git_merge_file_input var ctheirs C.git_merge_file_input - populateCMergeFileInput(&cancestor, ancestor) - defer freeCMergeFileInput(&cancestor) - populateCMergeFileInput(&cours, ours) - defer freeCMergeFileInput(&cours) - populateCMergeFileInput(&ctheirs, theirs) - defer freeCMergeFileInput(&ctheirs) + t := populateCMergeFileInput(&cancestor, ancestor) + defer freeCMergeFileInput(&cancestor, t) + t = populateCMergeFileInput(&cours, ours) + defer freeCMergeFileInput(&cours, t) + t = populateCMergeFileInput(&ctheirs, theirs) + defer freeCMergeFileInput(&ctheirs, t) var copts *C.git_merge_file_options if options != nil { diff --git a/odb.go b/odb.go index b15851f..8e8fba0 100644 --- a/odb.go +++ b/odb.go @@ -61,12 +61,13 @@ func (v *Odb) Exists(oid *Oid) bool { func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) { oid = new(Oid) - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + cstr := C.CString(string(data)) + defer C.free(unsafe.Pointer(cstr)) runtime.LockOSThread() defer runtime.UnlockOSThread() - 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(cstr), C.size_t(len(data)), C.git_otype(otype)) if ret < 0 { return nil, MakeGitError(ret) -- cgit v1.2.3 From 773ac24a16da6261e0f31b9354a9c890b1002422 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 2 Feb 2016 19:02:15 +0100 Subject: Expose git_odb_read_header as Odb.ReadHeader. This function is much faster for discovering sizes for a given OID. --- odb.go | 15 +++++++++++++++ odb_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) (limited to 'odb.go') diff --git a/odb.go b/odb.go index b15851f..d881f63 100644 --- a/odb.go +++ b/odb.go @@ -54,6 +54,21 @@ func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) { return nil } +func (v *Odb) ReadHeader(oid *Oid) (uint64, ObjectType, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var sz C.size_t + var cotype C.git_otype + + ret := C.git_odb_read_header(&sz, &cotype, v.ptr, oid.toC()) + if ret < 0 { + return 0, C.GIT_OBJ_BAD, MakeGitError(ret) + } + + return uint64(sz), ObjectType(cotype), nil +} + func (v *Odb) Exists(oid *Oid) bool { ret := C.git_odb_exists(v.ptr, oid.toC()) return ret != 0 diff --git a/odb_test.go b/odb_test.go index 0d765b9..dfd2ad0 100644 --- a/odb_test.go +++ b/odb_test.go @@ -6,6 +6,34 @@ import ( "testing" ) +func TestOdbReadHeader(t *testing.T) { + repo := createTestRepo(t) + defer cleanupTestRepo(t, repo) + + _, _ = seedTestRepo(t, repo) + odb, err := repo.Odb() + if err != nil { + t.Fatalf("Odb: %v", err) + } + data := []byte("hello") + id, err := odb.Write(data, ObjectBlob) + if err != nil { + t.Fatalf("odb.Write: %v", err) + } + + sz, typ, err := odb.ReadHeader(id) + if err != nil { + t.Fatalf("ReadHeader: %v", err) + } + + if sz != uint64(len(data)) { + t.Errorf("ReadHeader got size %d, want %d", sz, len(data)) + } + if typ != ObjectBlob { + t.Errorf("ReadHeader got object type %s", typ) + } +} + func TestOdbStream(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) -- cgit v1.2.3 From dc8b154f4f1b346fb6b8dee99fcfa6e4ca2d2d24 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 16 Feb 2016 21:40:05 -0800 Subject: odb: don't copy buffer --- odb.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'odb.go') diff --git a/odb.go b/odb.go index dfad507..9c6baa3 100644 --- a/odb.go +++ b/odb.go @@ -76,13 +76,15 @@ func (v *Odb) Exists(oid *Oid) bool { func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) { oid = new(Oid) - cstr := C.CString(string(data)) - defer C.free(unsafe.Pointer(cstr)) + var cptr unsafe.Pointer + if len(data) > 0 { + cptr = unsafe.Pointer(&data[0]) + } runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(cstr), C.size_t(len(data)), C.git_otype(otype)) + ret := C.git_odb_write(oid.toC(), v.ptr, cptr, C.size_t(len(data)), C.git_otype(otype)) if ret < 0 { return nil, MakeGitError(ret) -- cgit v1.2.3