summaryrefslogtreecommitdiff
path: root/diff.go
diff options
context:
space:
mode:
Diffstat (limited to 'diff.go')
-rw-r--r--diff.go57
1 files changed, 42 insertions, 15 deletions
diff --git a/diff.go b/diff.go
index e8d5007..3cc1dc2 100644
--- a/diff.go
+++ b/diff.go
@@ -127,14 +127,17 @@ func diffLineFromC(line *C.git_diff_line) DiffLine {
}
type Diff struct {
- ptr *C.git_diff
+ ptr *C.git_diff
+ repo *Repository
}
func (diff *Diff) NumDeltas() (int, error) {
if diff.ptr == nil {
return -1, ErrInvalid
}
- return int(C.git_diff_num_deltas(diff.ptr)), nil
+ ret := int(C.git_diff_num_deltas(diff.ptr))
+ runtime.KeepAlive(diff)
+ return ret, nil
}
func (diff *Diff) GetDelta(index int) (DiffDelta, error) {
@@ -142,16 +145,19 @@ func (diff *Diff) GetDelta(index int) (DiffDelta, error) {
return DiffDelta{}, ErrInvalid
}
ptr := C.git_diff_get_delta(diff.ptr, C.size_t(index))
- return diffDeltaFromC(ptr), nil
+ ret := diffDeltaFromC(ptr)
+ runtime.KeepAlive(diff)
+ return ret, nil
}
-func newDiffFromC(ptr *C.git_diff) *Diff {
+func newDiffFromC(ptr *C.git_diff, repo *Repository) *Diff {
if ptr == nil {
return nil
}
diff := &Diff{
- ptr: ptr,
+ ptr: ptr,
+ repo: repo,
}
runtime.SetFinalizer(diff, (*Diff).Free)
@@ -187,6 +193,7 @@ func (diff *Diff) FindSimilar(opts *DiffFindOptions) error {
defer runtime.UnlockOSThread()
ecode := C.git_diff_find_similar(diff.ptr, copts)
+ runtime.KeepAlive(diff)
if ecode < 0 {
return MakeGitError(ecode)
}
@@ -209,15 +216,21 @@ func (stats *DiffStats) Free() error {
}
func (stats *DiffStats) Insertions() int {
- return int(C.git_diff_stats_insertions(stats.ptr))
+ ret := int(C.git_diff_stats_insertions(stats.ptr))
+ runtime.KeepAlive(stats)
+ return ret
}
func (stats *DiffStats) Deletions() int {
- return int(C.git_diff_stats_deletions(stats.ptr))
+ ret := int(C.git_diff_stats_deletions(stats.ptr))
+ runtime.KeepAlive(stats)
+ return ret
}
func (stats *DiffStats) FilesChanged() int {
- return int(C.git_diff_stats_files_changed(stats.ptr))
+ ret := int(C.git_diff_stats_files_changed(stats.ptr))
+ runtime.KeepAlive(stats)
+ return ret
}
type DiffStatsFormat int
@@ -240,6 +253,7 @@ func (stats *DiffStats) String(format DiffStatsFormat,
ret := C.git_diff_stats_to_buf(&buf,
stats.ptr, C.git_diff_stats_format_t(format), C.size_t(width))
+ runtime.KeepAlive(stats)
if ret < 0 {
return "", MakeGitError(ret)
}
@@ -253,7 +267,9 @@ func (diff *Diff) Stats() (*DiffStats, error) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- if ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr); ecode < 0 {
+ ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr)
+ runtime.KeepAlive(diff)
+ if ecode < 0 {
return nil, MakeGitError(ecode)
}
runtime.SetFinalizer(stats, (*DiffStats).Free)
@@ -301,6 +317,7 @@ func (diff *Diff) ForEach(cbFile DiffForEachFileCallback, detail DiffDetail) err
defer pointerHandles.Untrack(handle)
ecode := C._go_git_diff_foreach(diff.ptr, 1, intHunks, intLines, handle)
+ runtime.KeepAlive(diff)
if ecode < 0 {
return data.Error
}
@@ -380,6 +397,7 @@ func (diff *Diff) Patch(deltaIndex int) (*Patch, error) {
defer runtime.UnlockOSThread()
ecode := C.git_patch_from_diff(&patchPtr, diff.ptr, C.size_t(deltaIndex))
+ runtime.KeepAlive(diff)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -537,7 +555,7 @@ func diffNotifyCb(_diff_so_far unsafe.Pointer, delta_to_add *C.git_diff_delta, m
if data != nil {
if data.Diff == nil {
- data.Diff = newDiffFromC(diff_so_far)
+ data.Diff = newDiffFromC(diff_so_far, nil)
}
err := data.Callback(data.Diff, diffDeltaFromC(delta_to_add), C.GoString(matched_pathspec))
@@ -618,6 +636,8 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (
defer runtime.UnlockOSThread()
ecode := C.git_diff_tree_to_tree(&diffPtr, v.ptr, oldPtr, newPtr, copts)
+ runtime.KeepAlive(oldTree)
+ runtime.KeepAlive(newTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -625,7 +645,7 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (
if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
- return newDiffFromC(diffPtr), nil
+ return newDiffFromC(diffPtr, v), nil
}
func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff, error) {
@@ -643,6 +663,7 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff,
defer runtime.UnlockOSThread()
ecode := C.git_diff_tree_to_workdir(&diffPtr, v.ptr, oldPtr, copts)
+ runtime.KeepAlive(oldTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -650,7 +671,7 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff,
if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
- return newDiffFromC(diffPtr), nil
+ return newDiffFromC(diffPtr, v), nil
}
func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOptions) (*Diff, error) {
@@ -673,6 +694,8 @@ func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOpti
defer runtime.UnlockOSThread()
ecode := C.git_diff_tree_to_index(&diffPtr, v.ptr, oldPtr, indexPtr, copts)
+ runtime.KeepAlive(oldTree)
+ runtime.KeepAlive(index)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -680,7 +703,7 @@ func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOpti
if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
- return newDiffFromC(diffPtr), nil
+ return newDiffFromC(diffPtr, v), nil
}
func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions) (*Diff, error) {
@@ -698,6 +721,7 @@ func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions
defer runtime.UnlockOSThread()
ecode := C.git_diff_tree_to_workdir_with_index(&diffPtr, v.ptr, oldPtr, copts)
+ runtime.KeepAlive(oldTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -705,7 +729,7 @@ func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions
if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
- return newDiffFromC(diffPtr), nil
+ return newDiffFromC(diffPtr, v), nil
}
func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff, error) {
@@ -723,6 +747,7 @@ func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff,
defer runtime.UnlockOSThread()
ecode := C.git_diff_index_to_workdir(&diffPtr, v.ptr, indexPtr, copts)
+ runtime.KeepAlive(index)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
@@ -730,7 +755,7 @@ func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff,
if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
- return newDiffFromC(diffPtr), nil
+ return newDiffFromC(diffPtr, v), nil
}
// DiffBlobs performs a diff between two arbitrary blobs. You can pass
@@ -773,6 +798,8 @@ func DiffBlobs(oldBlob *Blob, oldAsPath string, newBlob *Blob, newAsPath string,
defer runtime.UnlockOSThread()
ecode := C._go_git_diff_blobs(oldBlobPtr, oldBlobPath, newBlobPtr, newBlobPath, copts, 1, intHunks, intLines, handle)
+ runtime.KeepAlive(oldBlob)
+ runtime.KeepAlive(newBlob)
if ecode < 0 {
return MakeGitError(ecode)
}