summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2014-11-09 20:34:56 +0100
committerCarlos Martín Nieto <[email protected]>2014-11-09 20:34:56 +0100
commit61729f5c9365f59db726218cc3d9c450ff26be7b (patch)
tree3281d6e682e26e295f79c75699945bbe7e5b7a0a
parent98299e65fbf1875a95c631c494dba0763ec543b3 (diff)
parentff65faa082f9eca3239da25277e1eb15bd3ac9ec (diff)
Merge pull request #134 from joseferminj/fix-merge-trees-nil-ancestor
Fix MergeTrees func to accept nil as ancestor parameter
-rw-r--r--merge.go13
-rw-r--r--merge_test.go23
2 files changed, 32 insertions, 4 deletions
diff --git a/merge.go b/merge.go
index 2bc4e47..93ac71b 100644
--- a/merge.go
+++ b/merge.go
@@ -206,8 +206,11 @@ func (r *Repository) MergeTrees(ancestor *Tree, ours *Tree, theirs *Tree, option
copts := options.toC()
idx := &Index{}
-
- ret := C.git_merge_trees(&idx.ptr, r.ptr, ancestor.cast_ptr, ours.cast_ptr, theirs.cast_ptr, copts)
+ var ancestor_ptr *C.git_tree
+ if ancestor != nil {
+ ancestor_ptr = ancestor.cast_ptr
+ }
+ ret := C.git_merge_trees(&idx.ptr, r.ptr, ancestor_ptr, ours.cast_ptr, theirs.cast_ptr, copts)
if ret < 0 {
return nil, MakeGitError(ret)
}
@@ -273,8 +276,10 @@ type MergeFileInput struct {
// populate a C struct with merge file input, make sure to use freeMergeFileInput to clean up allocs
func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) {
c.path = C.CString(input.Path)
- c.ptr = (*C.char)(unsafe.Pointer(&input.Contents[0]))
- c.size = C.size_t(len(input.Contents))
+ if input.Contents != nil {
+ c.ptr = (*C.char)(unsafe.Pointer(&input.Contents[0]))
+ c.size = C.size_t(len(input.Contents))
+ }
c.mode = C.uint(input.Mode)
}
diff --git a/merge_test.go b/merge_test.go
index cc7af81..7e884c0 100644
--- a/merge_test.go
+++ b/merge_test.go
@@ -1,6 +1,7 @@
package git
import (
+ "os"
"testing"
)
@@ -65,6 +66,28 @@ func TestMergeSameFile(t *testing.T) {
compareBytes(t, file.Contents, result.Contents)
}
+func TestMergeTreesWithoutAncestor(t *testing.T) {
+ repo := createTestRepo(t)
+ defer repo.Free()
+ defer os.RemoveAll(repo.Workdir())
+
+ _, originalTreeId := seedTestRepo(t, repo)
+ originalTree, err := repo.LookupTree(originalTreeId)
+
+ checkFatal(t, err)
+
+ _, newTreeId := updateReadme(t, repo, "file changed\n")
+
+ newTree, err := repo.LookupTree(newTreeId)
+ checkFatal(t, err)
+ index, err := repo.MergeTrees(nil, originalTree, newTree, nil)
+ if !index.HasConflicts() {
+ t.Fatal("expected conflicts in the index")
+ }
+ _, err = index.GetConflict("README")
+ checkFatal(t, err)
+
+}
func compareBytes(t *testing.T, expected, actual []byte) {
for i, v := range expected {