From 03339f731aba66baacab3fd67e7b2d185cdacb33 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 25 Jan 2018 16:00:39 -0800 Subject: [PATCH 1/2] merge: add two missing AnnotatedCommit methods --- merge.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/merge.go b/merge.go index bfbf9a3..cdf7f75 100644 --- a/merge.go +++ b/merge.go @@ -27,6 +27,15 @@ func newAnnotatedCommitFromC(ptr *C.git_annotated_commit, r *Repository) *Annota return mh } +func (mh *AnnotatedCommit) Id() *Oid { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ret := newOidFromC(C.git_annotated_commit_id(mh.ptr)) + runtime.KeepAlive(mh) + return ret +} + func (mh *AnnotatedCommit) Free() { runtime.SetFinalizer(mh, nil) C.git_annotated_commit_free(mh.ptr) @@ -79,6 +88,22 @@ func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, e return newAnnotatedCommitFromC(ptr, r), nil } +func (r *Repository) AnnotatedCommitFromRevspec(spec string) (*AnnotatedCommit, error) { + crevspec := C.CString(spec) + defer C.free(unsafe.Pointer(crevspec)) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var ptr *C.git_annotated_commit + ret := C.git_annotated_commit_from_revspec(&ptr, r.ptr, crevspec) + runtime.KeepAlive(r) + if ret < 0 { + return nil, MakeGitError(ret) + } + return newAnnotatedCommitFromC(ptr, r), nil +} + type MergeTreeFlag int const ( From a140f2310f56eb06d37454514e67647a8a49d197 Mon Sep 17 00:00:00 2001 From: lhchavez Date: Sun, 23 Feb 2020 14:58:21 +0000 Subject: [PATCH 2/2] Add test and runtime.KeepAlive() --- merge.go | 19 +++++++++++++++---- merge_test.go | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/merge.go b/merge.go index ab30fb2..06e98a0 100644 --- a/merge.go +++ b/merge.go @@ -58,7 +58,9 @@ func (r *Repository) AnnotatedCommitFromFetchHead(branchName string, remoteURL s return nil, MakeGitError(ret) } - return newAnnotatedCommitFromC(ptr, r), nil + annotatedCommit := newAnnotatedCommitFromC(ptr, r) + runtime.KeepAlive(r) + return annotatedCommit, nil } func (r *Repository) LookupAnnotatedCommit(oid *Oid) (*AnnotatedCommit, error) { @@ -71,7 +73,10 @@ func (r *Repository) LookupAnnotatedCommit(oid *Oid) (*AnnotatedCommit, error) { if ret < 0 { return nil, MakeGitError(ret) } - return newAnnotatedCommitFromC(ptr, r), nil + + annotatedCommit := newAnnotatedCommitFromC(ptr, r) + runtime.KeepAlive(r) + return annotatedCommit, nil } func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, error) { @@ -85,7 +90,10 @@ func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, e if ret < 0 { return nil, MakeGitError(ret) } - return newAnnotatedCommitFromC(ptr, r), nil + + annotatedCommit := newAnnotatedCommitFromC(ptr, r) + runtime.KeepAlive(r) + return annotatedCommit, nil } func (r *Repository) AnnotatedCommitFromRevspec(spec string) (*AnnotatedCommit, error) { @@ -101,7 +109,10 @@ func (r *Repository) AnnotatedCommitFromRevspec(spec string) (*AnnotatedCommit, if ret < 0 { return nil, MakeGitError(ret) } - return newAnnotatedCommitFromC(ptr, r), nil + + annotatedCommit := newAnnotatedCommitFromC(ptr, r) + runtime.KeepAlive(r) + return annotatedCommit, nil } type MergeTreeFlag int diff --git a/merge_test.go b/merge_test.go index f2c84bc..7cf034f 100644 --- a/merge_test.go +++ b/merge_test.go @@ -5,6 +5,22 @@ import ( "time" ) +func TestAnnotatedCommitFromRevspec(t *testing.T) { + t.Parallel() + repo := createTestRepo(t) + defer cleanupTestRepo(t, repo) + + seedTestRepo(t, repo) + + mergeHead, err := repo.AnnotatedCommitFromRevspec("refs/heads/master") + checkFatal(t, err) + + expectedId := "473bf778b67b6d53e2ab289e0f1a2e8addef2fc2" + if mergeHead.Id().String() != expectedId { + t.Errorf("mergeHead.Id() = %v, want %v", mergeHead.Id(), expectedId) + } +} + func TestMergeWithSelf(t *testing.T) { t.Parallel() repo := createTestRepo(t) @@ -18,6 +34,11 @@ func TestMergeWithSelf(t *testing.T) { mergeHead, err := repo.AnnotatedCommitFromRef(master) checkFatal(t, err) + expectedId := "473bf778b67b6d53e2ab289e0f1a2e8addef2fc2" + if mergeHead.Id().String() != expectedId { + t.Errorf("mergeHead.Id() = %v, want %v", mergeHead.Id(), expectedId) + } + mergeHeads := make([]*AnnotatedCommit, 1) mergeHeads[0] = mergeHead err = repo.Merge(mergeHeads, nil, nil)