summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlhchavez <[email protected]>2020-02-23 07:05:25 -0800
committerGitHub <[email protected]>2020-02-23 07:05:25 -0800
commit21d618136f415486d95965e75af80c0e6688a0d5 (patch)
treefb156488aa27d753c7fe7864b9917a48d027b38e
parent06764f48dce903bf95701c6ef75ad0fe46c0dedf (diff)
parenta140f2310f56eb06d37454514e67647a8a49d197 (diff)
Merge pull request #423 from josharian/more-annotated-commit
merge: add two missing AnnotatedCommit methods
-rw-r--r--merge.go42
-rw-r--r--merge_test.go21
2 files changed, 60 insertions, 3 deletions
diff --git a/merge.go b/merge.go
index 955289a..06e98a0 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)
@@ -49,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) {
@@ -62,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) {
@@ -76,7 +90,29 @@ 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) {
+ 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)
+ }
+
+ 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)