Commit 605066eee9deac246db0dcef7737297f8e27b20a

Edward Thomson 2018-11-05T14:37:35

apply: test renaming a file after modifying it Multiple deltas can exist in a diff, and can be applied in-order. If there exists a delta that modifies a file followed by a delta that renames that file, then both will be captured. The modification delta will be applied and the resulting file will be staged with the original filename. The rename delta will be independently applied - to the original file (not the modified file from the original delta) and staged independently.

diff --git a/tests/apply/apply_helpers.h b/tests/apply/apply_helpers.h
index 90c1942..dfd2f74 100644
--- a/tests/apply/apply_helpers.h
+++ b/tests/apply/apply_helpers.h
@@ -330,13 +330,13 @@
 	"\n" \
 	" Put into a pot three quarts of water, three onions cut small, one\n" \
 	" spoonful of black pepper pounded, and two of salt, with two or three\n" \
-	"diff --git a/veal.txt b/beef.txt\n" \
+	"diff --git a/veal.txt b/other.txt\n" \
 	"similarity index 96%\n" \
 	"rename from veal.txt\n" \
-	"rename to beef.txt\n" \
+	"rename to other.txt\n" \
 	"index 94d2c01..292cb60 100644\n" \
 	"--- a/veal.txt\n" \
-	"+++ b/beef.txt\n" \
+	"+++ b/other.txt\n" \
 	"@@ -15,4 +15,4 @@ will curdle in the soup. For a change you may put a dozen ripe tomatos\n" \
 	" in, first taking off their skins, by letting them stand a few minutes in\n" \
 	" hot water, when they may be easily peeled. When made in this way you\n" \
diff --git a/tests/apply/both.c b/tests/apply/both.c
index 91b9b42..74fc95c 100644
--- a/tests/apply/both.c
+++ b/tests/apply/both.c
@@ -651,13 +651,28 @@ void test_apply_both__rename_and_modify_deltas(void)
 	git_diff_free(diff);
 }
 
-void test_apply_both__cant_rename_after_modify(void)
+void test_apply_both__rename_delta_after_modify_delta(void)
 {
 	git_diff *diff;
 
+	struct merge_index_entry both_expected[] = {
+		{ 0100644, "f51658077d85f2264fa179b4d0848268cb3475c3", 0, "asparagus.txt" },
+		{ 0100644, "68f6182f4c85d39e1309d97c7e456156dc9c0096", 0, "beef.txt" },
+		{ 0100644, "4b7c5650008b2e747fe1809eeb5a1dde0e80850a", 0, "bouilli.txt" },
+		{ 0100644, "c4e6cca3ec6ae0148ed231f97257df8c311e015f", 0, "gravy.txt" },
+		{ 0100644, "292cb60ce5e25c337c5b6e12957bbbfe1be4bf49", 0, "other.txt" },
+		{ 0100644, "68af1fc7407fd9addf1701a87eb1c95c7494c598", 0, "oyster.txt" },
+		{ 0100644, "c8c120f466591bbe3b8867361d5ec3cdd9fda756", 0, "veal.txt" }
+	};
+	size_t both_expected_cnt = sizeof(both_expected) /
+		sizeof(struct merge_index_entry);
+
 	cl_git_pass(git_diff_from_buffer(&diff, DIFF_RENAME_AFTER_MODIFY,
 		strlen(DIFF_RENAME_AFTER_MODIFY)));
-	cl_git_fail(git_apply(repo, diff, GIT_APPLY_LOCATION_BOTH, NULL));
+	cl_git_pass(git_apply(repo, diff, GIT_APPLY_LOCATION_BOTH, NULL));
+
+	validate_apply_index(repo, both_expected, both_expected_cnt);
+	validate_apply_workdir(repo, both_expected, both_expected_cnt);
 
 	git_diff_free(diff);
 }