@matheusbsbs / matheus-bagliano / commits / b2c8c0a762
Fork 0

merge-recursive: When we detect we can skip an update, actually skip it

In 882fd11 (merge-recursive: Delay content merging for renames 2010-09-20), there was code that checked for whether we could skip updating a file in the working directory, based on whether the merged version matched the current working copy. Due to the desire to handle directory/file conflicts that were resolvable, that commit deferred content merging by first updating the index with the unmerged entries and then moving the actual merging (along with the skip-the-content-update check) to another function that ran later in the merge process. As part moving the content merging code, a bug was introduced such that although the message about skipping the update would be printed (whenever GIT_MERGE_VERBOSITY was sufficiently high), the file would be unconditionally updated in the working copy anyway. When we detect that the file does not need to be updated in the working copy, update the index appropriately and then return early before updating the working copy. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Feb 28, 2011 at 18:08 UTC b2c8c0a762745768e8fb249949801c1aed8f7c1d
2 files changed +12 -7
merge-recursive.c
+11 -6
@@ -354,10 +354,11 @@ static void make_room_for_directories_of_df_conflicts(struct merge_options *o,
354 * make room for the corresponding directory. Such paths will
355 * later be processed in process_df_entry() at the end. If
356 * the corresponding directory ends up being removed by the
357 - * merge, then the file will be reinstated at that time;
358 - * otherwise, if the file is not supposed to be removed by the
359 - * merge, the contents of the file will be placed in another
360 - * unique filename.
357 + * merge, then the file will be reinstated at that time
358 + * (albeit with a different timestamp!); otherwise, if the
359 + * file is not supposed to be removed by the merge, the
360 + * contents of the file will be placed in another unique
361 + * filename.
362 *
363 * NOTE: This function relies on the fact that entries for a
364 * D/F conflict will appear adjacent in the index, with the
@@ -1272,9 +1273,13 @@ static int merge_content(struct merge_options *o,
1273 }
1274
1275 if (mfi.clean && !df_conflict_remains &&
1275 - sha_eq(mfi.sha, a_sha) && mfi.mode == a.mode)
1276 + sha_eq(mfi.sha, a_sha) && mfi.mode == a.mode &&
1277 + lstat(path, &st) == 0) {
1278 output(o, 3, "Skipped %s (merged same as existing)", path);
1277 - else
1279 + add_cacheinfo(mfi.mode, mfi.sha, path,
1280 + 0 /*stage*/, 1 /*refresh*/, 0 /*options*/);
1281 + return mfi.clean;
1282 + } else
1283 output(o, 2, "Auto-merging %s", path);
1284
1285 if (!mfi.clean) {
t/t6022-merge-rename.sh
+1 -1
@@ -728,7 +728,7 @@ test_expect_success 'setup avoid unnecessary update, normal rename' '
728 git commit -m "Random, unrelated changes"
729 '
730
731 -test_expect_failure 'avoid unnecessary update, normal rename' '
731 +test_expect_success 'avoid unnecessary update, normal rename' '
732 git checkout -q avoid-unnecessary-update-1^0 &&
733 test-chmtime =1000000000 rename &&
734 test-chmtime -v +0 rename >expect &&