summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Martí <vicent@github.com>2013-01-10 10:04:53 -0800
committerVicent Martí <vicent@github.com>2013-01-10 10:04:53 -0800
commit48de3061d16f2d9a55a1e3fc6253cab35a64018b (patch)
treeceb9ee171f984224514e9bec134f60097fcb48fd
parent7bacc2c8c5831ac185dc35bd74d26b92337c8a07 (diff)
parenteb3c247a78e62fc2bb87f70b08774de90e34faa1 (diff)
downloadlibgit2-48de3061d16f2d9a55a1e3fc6253cab35a64018b.tar.gz
Merge pull request #1220 from ethomson/reuc_empty_sides
REUC needs to handle empty sides
-rw-r--r--src/index.c12
-rw-r--r--tests-clar/index/reuc.c50
2 files changed, 56 insertions, 6 deletions
diff --git a/src/index.c b/src/index.c
index 096d122b1..606a431a4 100644
--- a/src/index.c
+++ b/src/index.c
@@ -616,14 +616,14 @@ static int index_entry_reuc_init(git_index_reuc_entry **reuc_out,
if (reuc->path == NULL)
return -1;
- reuc->mode[0] = ancestor_mode;
- git_oid_cpy(&reuc->oid[0], ancestor_oid);
+ if ((reuc->mode[0] = ancestor_mode) > 0)
+ git_oid_cpy(&reuc->oid[0], ancestor_oid);
- reuc->mode[1] = our_mode;
- git_oid_cpy(&reuc->oid[1], our_oid);
+ if ((reuc->mode[1] = our_mode) > 0)
+ git_oid_cpy(&reuc->oid[1], our_oid);
- reuc->mode[2] = their_mode;
- git_oid_cpy(&reuc->oid[2], their_oid);
+ if ((reuc->mode[2] = their_mode) > 0)
+ git_oid_cpy(&reuc->oid[2], their_oid);
*reuc_out = reuc;
return 0;
diff --git a/tests-clar/index/reuc.c b/tests-clar/index/reuc.c
index 3a139aa5d..2062b51d3 100644
--- a/tests-clar/index/reuc.c
+++ b/tests-clar/index/reuc.c
@@ -31,6 +31,56 @@ void test_index_reuc__cleanup(void)
cl_git_sandbox_cleanup();
}
+void test_index_reuc__add(void)
+{
+ git_oid ancestor_oid, our_oid, their_oid;
+ const git_index_reuc_entry *reuc;
+
+ git_oid_fromstr(&ancestor_oid, ONE_ANCESTOR_OID);
+ git_oid_fromstr(&our_oid, ONE_OUR_OID);
+ git_oid_fromstr(&their_oid, ONE_THEIR_OID);
+
+ cl_git_pass(git_index_reuc_add(repo_index, "newfile.txt",
+ 0100644, &ancestor_oid,
+ 0100644, &our_oid,
+ 0100644, &their_oid));
+
+ cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "newfile.txt"));
+
+ cl_assert(strcmp(reuc->path, "newfile.txt") == 0);
+ cl_assert(reuc->mode[0] == 0100644);
+ cl_assert(reuc->mode[1] == 0100644);
+ cl_assert(reuc->mode[2] == 0100644);
+ cl_assert(git_oid_cmp(&reuc->oid[0], &ancestor_oid) == 0);
+ cl_assert(git_oid_cmp(&reuc->oid[1], &our_oid) == 0);
+ cl_assert(git_oid_cmp(&reuc->oid[2], &their_oid) == 0);
+}
+
+void test_index_reuc__add_no_ancestor(void)
+{
+ git_oid ancestor_oid, our_oid, their_oid;
+ const git_index_reuc_entry *reuc;
+
+ memset(&ancestor_oid, 0x0, sizeof(git_oid));
+ git_oid_fromstr(&our_oid, ONE_OUR_OID);
+ git_oid_fromstr(&their_oid, ONE_THEIR_OID);
+
+ cl_git_pass(git_index_reuc_add(repo_index, "newfile.txt",
+ 0, NULL,
+ 0100644, &our_oid,
+ 0100644, &their_oid));
+
+ cl_assert(reuc = git_index_reuc_get_bypath(repo_index, "newfile.txt"));
+
+ cl_assert(strcmp(reuc->path, "newfile.txt") == 0);
+ cl_assert(reuc->mode[0] == 0);
+ cl_assert(reuc->mode[1] == 0100644);
+ cl_assert(reuc->mode[2] == 0100644);
+ cl_assert(git_oid_cmp(&reuc->oid[0], &ancestor_oid) == 0);
+ cl_assert(git_oid_cmp(&reuc->oid[1], &our_oid) == 0);
+ cl_assert(git_oid_cmp(&reuc->oid[2], &their_oid) == 0);
+}
+
void test_index_reuc__read_bypath(void)
{
const git_index_reuc_entry *reuc;