@@ -18,10 +18,11 @@ import (
1818
1919type 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
3435func (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
5455func (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
6868func (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
8282type 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
227230func (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
246252func (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 }
0 commit comments