summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Alvarez <[email protected]>2014-12-05 16:52:15 -0500
committerjoseferminj <[email protected]>2014-12-06 16:29:25 -0500
commitdb17135a30100c698d3efa1c98ba717201f426ce (patch)
tree81c5f522324a7c0fa7785c7f600d4921397ef880
parent520a0425c736c7d584d21d073b08a8735dd2464f (diff)
Export PatchFromBuffers function.
This change also factor out diffOptionsToC function to remove duplicated code.
-rw-r--r--diff.go72
-rw-r--r--patch.go32
2 files changed, 59 insertions, 45 deletions
diff --git a/diff.go b/diff.go
index 00f4bd5..999f067 100644
--- a/diff.go
+++ b/diff.go
@@ -459,21 +459,8 @@ func diffNotifyCb(_diff_so_far unsafe.Pointer, delta_to_add *C.git_diff_delta, m
return 0
}
-func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (*Diff, error) {
- var diffPtr *C.git_diff
- var oldPtr, newPtr *C.git_tree
-
- if oldTree != nil {
- oldPtr = oldTree.cast_ptr
- }
-
- if newTree != nil {
- newPtr = newTree.cast_ptr
- }
-
+func diffOptionsToC(opts *DiffOptions) (copts *C.git_diff_options, notifyData *diffNotifyData) {
cpathspec := C.git_strarray{}
- var copts *C.git_diff_options
- var notifyData *diffNotifyData
if opts != nil {
notifyData = &diffNotifyData{
Callback: opts.NotifyCallback,
@@ -481,7 +468,6 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (
if opts.Pathspec != nil {
cpathspec.count = C.size_t(len(opts.Pathspec))
cpathspec.strings = makeCStringsFromStrings(opts.Pathspec)
- defer freeStrarray(&cpathspec)
}
copts = &C.git_diff_options{
@@ -500,6 +486,30 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (
copts.notify_payload = unsafe.Pointer(notifyData)
}
}
+ return
+}
+
+func freeDiffOptions(copts *C.git_diff_options) {
+ if copts != nil {
+ cpathspec := copts.pathspec
+ freeStrarray(&cpathspec)
+ }
+}
+
+func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (*Diff, error) {
+ var diffPtr *C.git_diff
+ var oldPtr, newPtr *C.git_tree
+
+ if oldTree != nil {
+ oldPtr = oldTree.cast_ptr
+ }
+
+ if newTree != nil {
+ newPtr = newTree.cast_ptr
+ }
+
+ copts, notifyData := diffOptionsToC(opts)
+ defer freeDiffOptions(copts)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
@@ -523,35 +533,8 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff,
oldPtr = oldTree.cast_ptr
}
- cpathspec := C.git_strarray{}
- var copts *C.git_diff_options
- var notifyData *diffNotifyData
- if opts != nil {
- notifyData = &diffNotifyData{
- Callback: opts.NotifyCallback,
- }
- if opts.Pathspec != nil {
- cpathspec.count = C.size_t(len(opts.Pathspec))
- cpathspec.strings = makeCStringsFromStrings(opts.Pathspec)
- defer freeStrarray(&cpathspec)
- }
-
- copts = &C.git_diff_options{
- version: C.GIT_DIFF_OPTIONS_VERSION,
- flags: C.uint32_t(opts.Flags),
- ignore_submodules: C.git_submodule_ignore_t(opts.IgnoreSubmodules),
- pathspec: cpathspec,
- context_lines: C.uint32_t(opts.ContextLines),
- interhunk_lines: C.uint32_t(opts.InterhunkLines),
- id_abbrev: C.uint16_t(opts.IdAbbrev),
- max_size: C.git_off_t(opts.MaxSize),
- }
-
- if opts.NotifyCallback != nil {
- C._go_git_setup_diff_notify_callbacks(copts)
- copts.notify_payload = unsafe.Pointer(notifyData)
- }
- }
+ copts, notifyData := diffOptionsToC(opts)
+ defer freeDiffOptions(copts)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
@@ -565,5 +548,4 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff,
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
-
}
diff --git a/patch.go b/patch.go
index 0fe1c04..ea01b87 100644
--- a/patch.go
+++ b/patch.go
@@ -6,6 +6,7 @@ package git
import "C"
import (
"runtime"
+ "unsafe"
)
type Patch struct {
@@ -50,3 +51,34 @@ func (patch *Patch) String() (string, error) {
}
return C.GoString(buf.ptr), nil
}
+
+func toPointer(data []byte) (ptr unsafe.Pointer) {
+ if len(data) > 0 {
+ ptr = unsafe.Pointer(&data[0])
+ } else {
+ ptr = unsafe.Pointer(nil)
+ }
+ return
+}
+
+func (v *Repository) PatchFromBuffers(oldPath, newPath string, oldBuf, newBuf []byte, opts *DiffOptions) (*Patch, error) {
+ var patchPtr *C.git_patch
+
+ oldPtr := toPointer(oldBuf)
+ newPtr := (*C.char)(toPointer(newBuf))
+
+ cOldPath := C.CString(oldPath)
+ defer C.free(unsafe.Pointer(cOldPath))
+
+ cNewPath := C.CString(newPath)
+ defer C.free(unsafe.Pointer(cNewPath))
+
+ copts, _ := diffOptionsToC(opts)
+ defer freeDiffOptions(copts)
+
+ ecode := C.git_patch_from_buffers(&patchPtr, oldPtr, C.size_t(len(oldBuf)), cOldPath, newPtr, C.size_t(len(newBuf)), cNewPath, copts)
+ if ecode < 0 {
+ return nil, MakeGitError(ecode)
+ }
+ return newPatchFromC(patchPtr), nil
+}