Skip to content

Commit 55a1096

Browse files
committed
Third round of keep-alive aditions
1 parent 7d29d68 commit 55a1096

17 files changed

+353
-122
lines changed

merge.go

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ import (
1818

1919
type AnnotatedCommit struct {
2020
ptr *C.git_annotated_commit
21+
r *Repository
2122
}
2223

23-
func newAnnotatedCommitFromC(c *C.git_annotated_commit) *AnnotatedCommit {
24-
mh := &AnnotatedCommit{ptr: c}
24+
func newAnnotatedCommitFromC(ptr *C.git_annotated_commit, r *Repository) *AnnotatedCommit {
25+
mh := &AnnotatedCommit{ptr: ptr, r: r}
2526
runtime.SetFinalizer(mh, (*AnnotatedCommit).Free)
2627
return mh
2728
}
@@ -32,8 +33,6 @@ func (mh *AnnotatedCommit) Free() {
3233
}
3334

3435
func (r *Repository) AnnotatedCommitFromFetchHead(branchName string, remoteURL string, oid *Oid) (*AnnotatedCommit, error) {
35-
mh := &AnnotatedCommit{}
36-
3736
cbranchName := C.CString(branchName)
3837
defer C.free(unsafe.Pointer(cbranchName))
3938

@@ -43,40 +42,41 @@ func (r *Repository) AnnotatedCommitFromFetchHead(branchName string, remoteURL s
4342
runtime.LockOSThread()
4443
defer runtime.UnlockOSThread()
4544

46-
ret := C.git_annotated_commit_from_fetchhead(&mh.ptr, r.ptr, cbranchName, cremoteURL, oid.toC())
45+
var ptr *C.git_annotated_commit
46+
ret := C.git_annotated_commit_from_fetchhead(&ptr, r.ptr, cbranchName, cremoteURL, oid.toC())
47+
runtime.KeepAlive(oid)
4748
if ret < 0 {
4849
return nil, MakeGitError(ret)
4950
}
50-
runtime.SetFinalizer(mh, (*AnnotatedCommit).Free)
51-
return mh, nil
51+
52+
return newAnnotatedCommitFromC(ptr, r), nil
5253
}
5354

5455
func (r *Repository) LookupAnnotatedCommit(oid *Oid) (*AnnotatedCommit, error) {
55-
mh := &AnnotatedCommit{}
56-
5756
runtime.LockOSThread()
5857
defer runtime.UnlockOSThread()
5958

60-
ret := C.git_annotated_commit_lookup(&mh.ptr, r.ptr, oid.toC())
59+
var ptr *C.git_annotated_commit
60+
ret := C.git_annotated_commit_lookup(&ptr, r.ptr, oid.toC())
61+
runtime.KeepAlive(oid)
6162
if ret < 0 {
6263
return nil, MakeGitError(ret)
6364
}
64-
runtime.SetFinalizer(mh, (*AnnotatedCommit).Free)
65-
return mh, nil
65+
return newAnnotatedCommitFromC(ptr, r), nil
6666
}
6767

6868
func (r *Repository) AnnotatedCommitFromRef(ref *Reference) (*AnnotatedCommit, error) {
69-
mh := &AnnotatedCommit{}
70-
7169
runtime.LockOSThread()
7270
defer runtime.UnlockOSThread()
7371

74-
ret := C.git_annotated_commit_from_ref(&mh.ptr, r.ptr, ref.ptr)
72+
var ptr *C.git_annotated_commit
73+
ret := C.git_annotated_commit_from_ref(&ptr, r.ptr, ref.ptr)
74+
runtime.KeepAlive(r)
75+
runtime.KeepAlive(ref)
7576
if ret < 0 {
7677
return nil, MakeGitError(ret)
7778
}
78-
runtime.SetFinalizer(mh, (*AnnotatedCommit).Free)
79-
return mh, nil
79+
return newAnnotatedCommitFromC(ptr, r), nil
8080
}
8181

8282
type MergeTreeFlag int
@@ -162,6 +162,7 @@ func (r *Repository) Merge(theirHeads []*AnnotatedCommit, mergeOptions *MergeOpt
162162
}
163163
ptr := unsafe.Pointer(&gmerge_head_array[0])
164164
err := C.git_merge(r.ptr, (**C.git_annotated_commit)(ptr), C.size_t(len(theirHeads)), cMergeOpts, cCheckoutOpts)
165+
runtime.KeepAlive(theirHeads)
165166
if err < 0 {
166167
return MakeGitError(err)
167168
}
@@ -201,6 +202,7 @@ func (r *Repository) MergeAnalysis(theirHeads []*AnnotatedCommit) (MergeAnalysis
201202
var analysis C.git_merge_analysis_t
202203
var preference C.git_merge_preference_t
203204
err := C.git_merge_analysis(&analysis, &preference, r.ptr, (**C.git_annotated_commit)(ptr), C.size_t(len(theirHeads)))
205+
runtime.KeepAlive(theirHeads)
204206
if err < 0 {
205207
return MergeAnalysisNone, MergePreferenceNone, MakeGitError(err)
206208
}
@@ -214,14 +216,15 @@ func (r *Repository) MergeCommits(ours *Commit, theirs *Commit, options *MergeOp
214216

215217
copts := options.toC()
216218

217-
idx := &Index{}
218-
219-
ret := C.git_merge_commits(&idx.ptr, r.ptr, ours.cast_ptr, theirs.cast_ptr, copts)
219+
var ptr *C.git_index
220+
ret := C.git_merge_commits(&ptr, r.ptr, ours.cast_ptr, theirs.cast_ptr, copts)
221+
runtime.KeepAlive(ours)
222+
runtime.KeepAlive(theirs)
220223
if ret < 0 {
221224
return nil, MakeGitError(ret)
222225
}
223-
runtime.SetFinalizer(idx, (*Index).Free)
224-
return idx, nil
226+
227+
return newIndexFromC(ptr, r), nil
225228
}
226229

227230
func (r *Repository) MergeTrees(ancestor *Tree, ours *Tree, theirs *Tree, options *MergeOptions) (*Index, error) {
@@ -230,17 +233,20 @@ func (r *Repository) MergeTrees(ancestor *Tree, ours *Tree, theirs *Tree, option
230233

231234
copts := options.toC()
232235

233-
idx := &Index{}
234236
var ancestor_ptr *C.git_tree
235237
if ancestor != nil {
236238
ancestor_ptr = ancestor.cast_ptr
237239
}
238-
ret := C.git_merge_trees(&idx.ptr, r.ptr, ancestor_ptr, ours.cast_ptr, theirs.cast_ptr, copts)
240+
var ptr *C.git_index
241+
ret := C.git_merge_trees(&ptr, r.ptr, ancestor_ptr, ours.cast_ptr, theirs.cast_ptr, copts)
242+
runtime.KeepAlive(ancestor)
243+
runtime.KeepAlive(ours)
244+
runtime.KeepAlive(theirs)
239245
if ret < 0 {
240246
return nil, MakeGitError(ret)
241247
}
242-
runtime.SetFinalizer(idx, (*Index).Free)
243-
return idx, nil
248+
249+
return newIndexFromC(ptr, r), nil
244250
}
245251

246252
func (r *Repository) MergeBase(one *Oid, two *Oid) (*Oid, error) {
@@ -249,6 +255,9 @@ func (r *Repository) MergeBase(one *Oid, two *Oid) (*Oid, error) {
249255

250256
var oid C.git_oid
251257
ret := C.git_merge_base(&oid, r.ptr, one.toC(), two.toC())
258+
runtime.KeepAlive(one)
259+
runtime.KeepAlive(two)
260+
runtime.KeepAlive(r)
252261
if ret < 0 {
253262
return nil, MakeGitError(ret)
254263
}
@@ -265,6 +274,8 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
265274

266275
var coids C.git_oidarray
267276
ret := C.git_merge_bases(&coids, r.ptr, one.toC(), two.toC())
277+
runtime.KeepAlive(one)
278+
runtime.KeepAlive(two)
268279
if ret < 0 {
269280
return make([]*Oid, 0), MakeGitError(ret)
270281
}
@@ -413,6 +424,9 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp
413424
(*C.char)(unsafe.Pointer(oursContents)), C.size_t(len(ours.Contents)), oursPath, C.uint(ours.Mode),
414425
(*C.char)(unsafe.Pointer(theirsContents)), C.size_t(len(theirs.Contents)), theirsPath, C.uint(theirs.Mode),
415426
copts)
427+
runtime.KeepAlive(ancestor)
428+
runtime.KeepAlive(ours)
429+
runtime.KeepAlive(theirs)
416430
if ecode < 0 {
417431
return nil, MakeGitError(ecode)
418432
}

note.go

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ func (c *NoteCollection) Create(
5252
ret := C.git_note_create(
5353
oid.toC(), c.repo.ptr, cref, authorSig,
5454
committerSig, id.toC(), cnote, cbool(force))
55-
55+
runtime.KeepAlive(c)
56+
runtime.KeepAlive(id)
5657
if ret < 0 {
5758
return nil, MakeGitError(ret)
5859
}
@@ -69,17 +70,18 @@ func (c *NoteCollection) Read(ref string, id *Oid) (*Note, error) {
6970
defer C.free(unsafe.Pointer(cref))
7071
}
7172

72-
note := new(Note)
73-
7473
runtime.LockOSThread()
7574
defer runtime.UnlockOSThread()
7675

77-
if ret := C.git_note_read(&note.ptr, c.repo.ptr, cref, id.toC()); ret < 0 {
76+
var ptr *C.git_note
77+
ret := C.git_note_read(&ptr, c.repo.ptr, cref, id.toC())
78+
runtime.KeepAlive(c)
79+
runtime.KeepAlive(id)
80+
if ret < 0 {
7881
return nil, MakeGitError(ret)
7982
}
8083

81-
runtime.SetFinalizer(note, (*Note).Free)
82-
return note, nil
84+
return newNoteFromC(ptr, c.repo), nil
8385
}
8486

8587
// Remove removes the note for an object
@@ -108,6 +110,8 @@ func (c *NoteCollection) Remove(ref string, author, committer *Signature, id *Oi
108110
defer runtime.UnlockOSThread()
109111

110112
ret := C.git_note_remove(c.repo.ptr, cref, authorSig, committerSig, id.toC())
113+
runtime.KeepAlive(c)
114+
runtime.KeepAlive(id)
111115
if ret < 0 {
112116
return MakeGitError(ret)
113117
}
@@ -121,8 +125,10 @@ func (c *NoteCollection) DefaultRef() (string, error) {
121125
runtime.LockOSThread()
122126
defer runtime.UnlockOSThread()
123127

124-
if ret := C.git_note_default_ref(&buf, c.repo.ptr); ret < 0 {
125-
return "", MakeGitError(ret)
128+
ecode := C.git_note_default_ref(&buf, c.repo.ptr)
129+
runtime.KeepAlive(c)
130+
if ecode < 0 {
131+
return "", MakeGitError(ecode)
126132
}
127133

128134
ret := C.GoString(buf.ptr)
@@ -134,6 +140,13 @@ func (c *NoteCollection) DefaultRef() (string, error) {
134140
// Note
135141
type Note struct {
136142
ptr *C.git_note
143+
r *Repository
144+
}
145+
146+
func newNoteFromC(ptr *C.git_note, r *Repository) *Note {
147+
note := &Note{ptr: ptr, r: r}
148+
runtime.SetFinalizer(note, (*Note).Free)
149+
return note
137150
}
138151

139152
// Free frees a git_note object
@@ -156,23 +169,28 @@ func (n *Note) Author() *Signature {
156169
// Id returns the note object's id
157170
func (n *Note) Id() *Oid {
158171
ptr := C.git_note_id(n.ptr)
172+
runtime.KeepAlive(n)
159173
return newOidFromC(ptr)
160174
}
161175

162176
// Committer returns the signature of the note committer
163177
func (n *Note) Committer() *Signature {
164178
ptr := C.git_note_committer(n.ptr)
179+
runtime.KeepAlive(n)
165180
return newSignatureFromC(ptr)
166181
}
167182

168183
// Message returns the note message
169184
func (n *Note) Message() string {
170-
return C.GoString(C.git_note_message(n.ptr))
185+
ret := C.GoString(C.git_note_message(n.ptr))
186+
runtime.KeepAlive(n)
187+
return ret
171188
}
172189

173190
// NoteIterator
174191
type NoteIterator struct {
175192
ptr *C.git_note_iterator
193+
r *Repository
176194
}
177195

178196
// NewNoteIterator creates a new iterator for notes
@@ -190,11 +208,13 @@ func (repo *Repository) NewNoteIterator(ref string) (*NoteIterator, error) {
190208
runtime.LockOSThread()
191209
defer runtime.UnlockOSThread()
192210

193-
if ret := C.git_note_iterator_new(&ptr, repo.ptr, cref); ret < 0 {
211+
ret := C.git_note_iterator_new(&ptr, repo.ptr, cref)
212+
runtime.KeepAlive(repo)
213+
if ret < 0 {
194214
return nil, MakeGitError(ret)
195215
}
196216

197-
iter := &NoteIterator{ptr: ptr}
217+
iter := &NoteIterator{ptr: ptr, r: repo}
198218
runtime.SetFinalizer(iter, (*NoteIterator).Free)
199219
return iter, nil
200220
}
@@ -213,7 +233,11 @@ func (it *NoteIterator) Next() (noteId, annotatedId *Oid, err error) {
213233
runtime.LockOSThread()
214234
defer runtime.UnlockOSThread()
215235

216-
if ret := C.git_note_next(noteId.toC(), annotatedId.toC(), it.ptr); ret < 0 {
236+
ret := C.git_note_next(noteId.toC(), annotatedId.toC(), it.ptr)
237+
runtime.KeepAlive(noteId)
238+
runtime.KeepAlive(annotatedId)
239+
runtime.KeepAlive(it)
240+
if ret < 0 {
217241
err = MakeGitError(ret)
218242
}
219243
return

object.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ func (t ObjectType) String() string {
4646
}
4747

4848
func (o *Object) Id() *Oid {
49-
return newOidFromC(C.git_object_id(o.ptr))
49+
ret := newOidFromC(C.git_object_id(o.ptr))
50+
runtime.KeepAlive(o)
51+
return ret
5052
}
5153

5254
func (o *Object) ShortId() (string, error) {
@@ -56,6 +58,7 @@ func (o *Object) ShortId() (string, error) {
5658
defer runtime.UnlockOSThread()
5759

5860
ecode := C.git_object_short_id(&resultBuf, o.ptr)
61+
runtime.KeepAlive(o)
5962
if ecode < 0 {
6063
return "", MakeGitError(ecode)
6164
}
@@ -64,15 +67,19 @@ func (o *Object) ShortId() (string, error) {
6467
}
6568

6669
func (o *Object) Type() ObjectType {
67-
return ObjectType(C.git_object_type(o.ptr))
70+
ret := ObjectType(C.git_object_type(o.ptr))
71+
runtime.KeepAlive(o)
72+
return ret
6873
}
6974

7075
// Owner returns a weak reference to the repository which owns this
7176
// object. This won't keep the underlying repository alive.
7277
func (o *Object) Owner() *Repository {
73-
return &Repository{
78+
ret := &Repository{
7479
ptr: C.git_object_owner(o.ptr),
7580
}
81+
runtime.KeepAlive(o)
82+
return ret
7683
}
7784

7885
func dupObject(obj *Object, kind ObjectType) (*C.git_object, error) {
@@ -85,7 +92,9 @@ func dupObject(obj *Object, kind ObjectType) (*C.git_object, error) {
8592
runtime.LockOSThread()
8693
defer runtime.UnlockOSThread()
8794

88-
if err := C.git_object_dup(&cobj, obj.ptr); err < 0 {
95+
err := C.git_object_dup(&cobj, obj.ptr)
96+
runtime.KeepAlive(obj)
97+
if err < 0 {
8998
return nil, MakeGitError(err)
9099
}
91100

@@ -203,7 +212,9 @@ func (o *Object) Peel(t ObjectType) (*Object, error) {
203212
runtime.LockOSThread()
204213
defer runtime.UnlockOSThread()
205214

206-
if err := C.git_object_peel(&cobj, o.ptr, C.git_otype(t)); err < 0 {
215+
err := C.git_object_peel(&cobj, o.ptr, C.git_otype(t))
216+
runtime.KeepAlive(o)
217+
if err < 0 {
207218
return nil, MakeGitError(err)
208219
}
209220

0 commit comments

Comments
 (0)