summaryrefslogtreecommitdiff
path: root/tests/apply
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2018-06-29 12:50:38 +0100
committerEdward Thomson <ethomson@edwardthomson.com>2018-11-05 15:53:03 +0000
commit9db66c790d04ee81e838160d2c60c6193daef82f (patch)
treecd1b4a20a407638d73a981dcfeab096a1cccb2a9 /tests/apply
parent771bd81e6ee3b3c04a214aacfcf8a3d2910f6b49 (diff)
downloadlibgit2-9db66c790d04ee81e838160d2c60c6193daef82f.tar.gz
apply test: apply with non-conflicting changes
Ensure that we can apply to the working directory or the index when the application target is modified, so long as there are not conflicting changes to the items.
Diffstat (limited to 'tests/apply')
-rw-r--r--tests/apply/index.c43
-rw-r--r--tests/apply/workdir.c27
2 files changed, 70 insertions, 0 deletions
diff --git a/tests/apply/index.c b/tests/apply/index.c
index 23ead1ab5..52510d69e 100644
--- a/tests/apply/index.c
+++ b/tests/apply/index.c
@@ -226,3 +226,46 @@ void test_apply_index__application_failure_leaves_index_unmodified(void)
git_diff_free(diff);
}
+
+void test_apply_index__keeps_nonconflicting_changes(void)
+{
+ git_diff *diff;
+ git_index *index;
+ git_index_entry idx_entry;
+ git_apply_options opts = GIT_APPLY_OPTIONS_INIT;
+
+ const char *diff_file = DIFF_MODIFY_TWO_FILES;
+
+ struct merge_index_entry index_expected[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "898d12687fb35be271c27c795a6b32c8b51da79e", 0, "beef.txt" },
+ { 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+ { 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+ { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ };
+ size_t index_expected_cnt = sizeof(index_expected) /
+ sizeof(struct merge_index_entry);
+
+ /* mutate the index */
+ cl_git_pass(git_repository_index(&index, repo));
+
+ memset(&idx_entry, 0, sizeof(git_index_entry));
+ idx_entry.mode = 0100644;
+ idx_entry.path = "beef.txt";
+ cl_git_pass(git_oid_fromstr(&idx_entry.id, "898d12687fb35be271c27c795a6b32c8b51da79e"));
+ cl_git_pass(git_index_add(index, &idx_entry));
+
+ cl_git_pass(git_index_remove(index, "bouilli.txt", 0));
+ cl_git_pass(git_index_write(index));
+ git_index_free(index);
+
+ cl_git_pass(git_diff_from_buffer(&diff, diff_file, strlen(diff_file)));
+
+ opts.location = GIT_APPLY_LOCATION_INDEX;
+ cl_git_pass(git_apply(repo, diff, &opts));
+
+ validate_apply_index(repo, index_expected, index_expected_cnt);
+ validate_workdir_unchanged(repo);
+
+ git_diff_free(diff);
+}
diff --git a/tests/apply/workdir.c b/tests/apply/workdir.c
index 3d1f39be0..34d1072d4 100644
--- a/tests/apply/workdir.c
+++ b/tests/apply/workdir.c
@@ -216,3 +216,30 @@ void test_apply_workdir__application_failure_leaves_workdir_unmodified(void)
git_diff_free(diff);
}
+
+void test_apply_workdir__keeps_nonconflicting_changes(void)
+{
+ git_diff *diff;
+
+ struct merge_index_entry workdir_expected[] = {
+ { 0100644, "ffb36e513f5fdf8a6ba850a20142676a2ac4807d", 0, "asparagus.txt" },
+ { 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+ { 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+ { 0100644, "f75ba05f340c51065cbea2e1fdbfe5fe13144c97", 0, "gravy.txt" },
+ { 0100644, "a7b066537e6be7109abfe4ff97b675d4e077da20", 0, "veal.txt" },
+ };
+ size_t workdir_expected_cnt = sizeof(workdir_expected) /
+ sizeof(struct merge_index_entry);
+
+ cl_git_rmfile("merge-recursive/oyster.txt");
+ cl_git_rewritefile("merge-recursive/gravy.txt", "Hello, world.\n");
+
+ cl_git_pass(git_diff_from_buffer(&diff,
+ DIFF_MODIFY_TWO_FILES, strlen(DIFF_MODIFY_TWO_FILES)));
+ cl_git_pass(git_apply(repo, diff, NULL));
+
+ validate_index_unchanged(repo);
+ validate_apply_workdir(repo, workdir_expected, workdir_expected_cnt);
+
+ git_diff_free(diff);
+}