Skip to content

Commit 21d6181

Browse files
authored
Merge pull request #423 from josharian/more-annotated-commit
merge: add two missing AnnotatedCommit methods
2 parents 06764f4 + a140f23 commit 21d6181

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

merge.go

+39-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ func newAnnotatedCommitFromC(ptr *C.git_annotated_commit, r *Repository) *Annota
2727
return mh
2828
}
2929

30+
func (mh *AnnotatedCommit) Id() *Oid {
31+
runtime.LockOSThread()
32+
defer runtime.UnlockOSThread()
33+
34+
ret := newOidFromC(C.git_annotated_commit_id(mh.ptr))
35+
runtime.KeepAlive(mh)
36+
return ret
37+
}
38+
3039
func (mh *AnnotatedCommit) Free() {
3140
runtime.SetFinalizer(mh, nil)
3241
C.git_annotated_commit_free(mh.ptr)
@@ -49,7 +58,9 @@ func (r *Repository) AnnotatedCommitFromFetchHead(branchName string, remoteURL s
4958
return nil, MakeGitError(ret)
5059
}
5160

52-
return newAnnotatedCommitFromC(ptr, r), nil
61+
annotatedCommit := newAnnotatedCommitFromC(ptr, r)
62+
runtime.KeepAlive(r)
63+
return annotatedCommit, nil
5364
}
5465

5566
func (r *Repository) LookupAnnotatedCommit(oid *Oid) (*AnnotatedCommit, error) {
@@ -62,7 +73,10 @@ func (r *Repository) LookupAnnotatedCommit(oid *Oid) (*AnnotatedCommit, error) {
6273
if ret < 0 {
6374
return nil, MakeGitError(ret)
6475
}
65-
return newAnnotatedCommitFromC(ptr, r), nil
76+
77+
annotatedCommit := newAnnotatedCommitFromC(ptr, r)
78+
runtime.KeepAlive(r)
79+
return annotatedCommit, nil
6680
}
6781

6882
func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, error) {
@@ -76,7 +90,29 @@ func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, e
7690
if ret < 0 {
7791
return nil, MakeGitError(ret)
7892
}
79-
return newAnnotatedCommitFromC(ptr, r), nil
93+
94+
annotatedCommit := newAnnotatedCommitFromC(ptr, r)
95+
runtime.KeepAlive(r)
96+
return annotatedCommit, nil
97+
}
98+
99+
func (r *Repository) AnnotatedCommitFromRevspec(spec string) (*AnnotatedCommit, error) {
100+
crevspec := C.CString(spec)
101+
defer C.free(unsafe.Pointer(crevspec))
102+
103+
runtime.LockOSThread()
104+
defer runtime.UnlockOSThread()
105+
106+
var ptr *C.git_annotated_commit
107+
ret := C.git_annotated_commit_from_revspec(&ptr, r.ptr, crevspec)
108+
runtime.KeepAlive(r)
109+
if ret < 0 {
110+
return nil, MakeGitError(ret)
111+
}
112+
113+
annotatedCommit := newAnnotatedCommitFromC(ptr, r)
114+
runtime.KeepAlive(r)
115+
return annotatedCommit, nil
80116
}
81117

82118
type MergeTreeFlag int

merge_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,22 @@ import (
55
"time"
66
)
77

8+
func TestAnnotatedCommitFromRevspec(t *testing.T) {
9+
t.Parallel()
10+
repo := createTestRepo(t)
11+
defer cleanupTestRepo(t, repo)
12+
13+
seedTestRepo(t, repo)
14+
15+
mergeHead, err := repo.AnnotatedCommitFromRevspec("refs/heads/master")
16+
checkFatal(t, err)
17+
18+
expectedId := "473bf778b67b6d53e2ab289e0f1a2e8addef2fc2"
19+
if mergeHead.Id().String() != expectedId {
20+
t.Errorf("mergeHead.Id() = %v, want %v", mergeHead.Id(), expectedId)
21+
}
22+
}
23+
824
func TestMergeWithSelf(t *testing.T) {
925
t.Parallel()
1026
repo := createTestRepo(t)
@@ -18,6 +34,11 @@ func TestMergeWithSelf(t *testing.T) {
1834
mergeHead, err := repo.AnnotatedCommitFromRef(master)
1935
checkFatal(t, err)
2036

37+
expectedId := "473bf778b67b6d53e2ab289e0f1a2e8addef2fc2"
38+
if mergeHead.Id().String() != expectedId {
39+
t.Errorf("mergeHead.Id() = %v, want %v", mergeHead.Id(), expectedId)
40+
}
41+
2142
mergeHeads := make([]*AnnotatedCommit, 1)
2243
mergeHeads[0] = mergeHead
2344
err = repo.Merge(mergeHeads, nil, nil)

0 commit comments

Comments
 (0)