@@ -18,10 +18,11 @@ import (
18
18
19
19
type AnnotatedCommit struct {
20
20
ptr * C.git_annotated_commit
21
+ r * Repository
21
22
}
22
23
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 }
25
26
runtime .SetFinalizer (mh , (* AnnotatedCommit ).Free )
26
27
return mh
27
28
}
@@ -32,8 +33,6 @@ func (mh *AnnotatedCommit) Free() {
32
33
}
33
34
34
35
func (r * Repository ) AnnotatedCommitFromFetchHead (branchName string , remoteURL string , oid * Oid ) (* AnnotatedCommit , error ) {
35
- mh := & AnnotatedCommit {}
36
-
37
36
cbranchName := C .CString (branchName )
38
37
defer C .free (unsafe .Pointer (cbranchName ))
39
38
@@ -43,40 +42,41 @@ func (r *Repository) AnnotatedCommitFromFetchHead(branchName string, remoteURL s
43
42
runtime .LockOSThread ()
44
43
defer runtime .UnlockOSThread ()
45
44
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 )
47
48
if ret < 0 {
48
49
return nil , MakeGitError (ret )
49
50
}
50
- runtime . SetFinalizer ( mh , ( * AnnotatedCommit ). Free )
51
- return mh , nil
51
+
52
+ return newAnnotatedCommitFromC ( ptr , r ) , nil
52
53
}
53
54
54
55
func (r * Repository ) LookupAnnotatedCommit (oid * Oid ) (* AnnotatedCommit , error ) {
55
- mh := & AnnotatedCommit {}
56
-
57
56
runtime .LockOSThread ()
58
57
defer runtime .UnlockOSThread ()
59
58
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 )
61
62
if ret < 0 {
62
63
return nil , MakeGitError (ret )
63
64
}
64
- runtime .SetFinalizer (mh , (* AnnotatedCommit ).Free )
65
- return mh , nil
65
+ return newAnnotatedCommitFromC (ptr , r ), nil
66
66
}
67
67
68
68
func (r * Repository ) AnnotatedCommitFromRef (ref * Reference ) (* AnnotatedCommit , error ) {
69
- mh := & AnnotatedCommit {}
70
-
71
69
runtime .LockOSThread ()
72
70
defer runtime .UnlockOSThread ()
73
71
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 )
75
76
if ret < 0 {
76
77
return nil , MakeGitError (ret )
77
78
}
78
- runtime .SetFinalizer (mh , (* AnnotatedCommit ).Free )
79
- return mh , nil
79
+ return newAnnotatedCommitFromC (ptr , r ), nil
80
80
}
81
81
82
82
type MergeTreeFlag int
@@ -162,6 +162,7 @@ func (r *Repository) Merge(theirHeads []*AnnotatedCommit, mergeOptions *MergeOpt
162
162
}
163
163
ptr := unsafe .Pointer (& gmerge_head_array [0 ])
164
164
err := C .git_merge (r .ptr , (* * C .git_annotated_commit )(ptr ), C .size_t (len (theirHeads )), cMergeOpts , cCheckoutOpts )
165
+ runtime .KeepAlive (theirHeads )
165
166
if err < 0 {
166
167
return MakeGitError (err )
167
168
}
@@ -201,6 +202,7 @@ func (r *Repository) MergeAnalysis(theirHeads []*AnnotatedCommit) (MergeAnalysis
201
202
var analysis C.git_merge_analysis_t
202
203
var preference C.git_merge_preference_t
203
204
err := C .git_merge_analysis (& analysis , & preference , r .ptr , (* * C .git_annotated_commit )(ptr ), C .size_t (len (theirHeads )))
205
+ runtime .KeepAlive (theirHeads )
204
206
if err < 0 {
205
207
return MergeAnalysisNone , MergePreferenceNone , MakeGitError (err )
206
208
}
@@ -214,14 +216,15 @@ func (r *Repository) MergeCommits(ours *Commit, theirs *Commit, options *MergeOp
214
216
215
217
copts := options .toC ()
216
218
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 )
220
223
if ret < 0 {
221
224
return nil , MakeGitError (ret )
222
225
}
223
- runtime . SetFinalizer ( idx , ( * Index ). Free )
224
- return idx , nil
226
+
227
+ return newIndexFromC ( ptr , r ) , nil
225
228
}
226
229
227
230
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
230
233
231
234
copts := options .toC ()
232
235
233
- idx := & Index {}
234
236
var ancestor_ptr * C.git_tree
235
237
if ancestor != nil {
236
238
ancestor_ptr = ancestor .cast_ptr
237
239
}
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 )
239
245
if ret < 0 {
240
246
return nil , MakeGitError (ret )
241
247
}
242
- runtime . SetFinalizer ( idx , ( * Index ). Free )
243
- return idx , nil
248
+
249
+ return newIndexFromC ( ptr , r ) , nil
244
250
}
245
251
246
252
func (r * Repository ) MergeBase (one * Oid , two * Oid ) (* Oid , error ) {
@@ -249,6 +255,9 @@ func (r *Repository) MergeBase(one *Oid, two *Oid) (*Oid, error) {
249
255
250
256
var oid C.git_oid
251
257
ret := C .git_merge_base (& oid , r .ptr , one .toC (), two .toC ())
258
+ runtime .KeepAlive (one )
259
+ runtime .KeepAlive (two )
260
+ runtime .KeepAlive (r )
252
261
if ret < 0 {
253
262
return nil , MakeGitError (ret )
254
263
}
@@ -265,6 +274,8 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
265
274
266
275
var coids C.git_oidarray
267
276
ret := C .git_merge_bases (& coids , r .ptr , one .toC (), two .toC ())
277
+ runtime .KeepAlive (one )
278
+ runtime .KeepAlive (two )
268
279
if ret < 0 {
269
280
return make ([]* Oid , 0 ), MakeGitError (ret )
270
281
}
@@ -413,6 +424,9 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp
413
424
(* C .char )(unsafe .Pointer (oursContents )), C .size_t (len (ours .Contents )), oursPath , C .uint (ours .Mode ),
414
425
(* C .char )(unsafe .Pointer (theirsContents )), C .size_t (len (theirs .Contents )), theirsPath , C .uint (theirs .Mode ),
415
426
copts )
427
+ runtime .KeepAlive (ancestor )
428
+ runtime .KeepAlive (ours )
429
+ runtime .KeepAlive (theirs )
416
430
if ecode < 0 {
417
431
return nil , MakeGitError (ecode )
418
432
}
0 commit comments