git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] xmerge.c: fix xdl_merge to conform with the manual

From
Anton Trunov <anton.a.trunov@gmail.com>
Date
Mar 3, 2015, 17:37 UTC
Message-ID
<1425404233-89907-1-git-send-email-anton.a.trunov@gmail.com>

The git-merge manual says that the ignore-space-change, ignore-all-space, ignore-space-at-eol options preserve our version if their version only introduces whitespace changes to a line.

So far if there is whitespace-only changes to both sides in *all* lines their version will be used.

This commit fixes merge behavior in this case by checking change for their version first.

Signed-off-by: Anton Trunov <anton.a.trunov <at> gmail.com>
---
 t/t3032-merge-recursive-options.sh | 43 ++++++++++++++++++++++++++++++++++++++
 xdiff/xmerge.c                     | 10 ++++-----
 2 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/t/t3032-merge-recursive-options.sh b/t/t3032-merge-recursive-options.sh
index 4029c9c..4cbedb4 100755
--- a/t/t3032-merge-recursive-options.sh
+++ b/t/t3032-merge-recursive-options.sh
@@ -204,4 +204,47 @@ test_expect_success '--ignore-space-at-eol' '
 	test_cmp expected actual
 '
 
+# Setup for automerging with whitespace-only changes
+# on both sides and in *all* lines
+
+test_expect_success 'setup: w/s only changes in all lines on both sides' '
+	git rm -rf . &&
+	git clean -fdqx &&
+	rm -rf .git &&
+	git init
+
+	echo " two words" >text.txt &&
+	git add text.txt &&
+	test_tick &&
+	git commit -m "Initial revision" &&
+
+	git checkout -b remote &&
+	echo " \t\ttwo     words  " >text.txt &&
+	git commit -a -m "remote: insert whitespace only" &&
+
+	git checkout master &&
+	echo "    two words" >text.txt &&
+	git commit -a -m "master: insert whitespace only"
+'
+
+test_expect_success 'w/s only in all lines: --ignore-space-change preserves ours' '
+	echo "    two words" >expected &&
+	git read-tree --reset -u HEAD &&
+	git merge-recursive --ignore-space-change HEAD^ -- HEAD remote &&
+	test_cmp expected text.txt
+'
+
+test_expect_success 'w/s only in all lines: --ignore-all-space preserves ours' '
+	echo "    two words" >expected &&
+	git read-tree --reset -u HEAD &&
+	git merge-recursive --ignore-all-space HEAD^ -- HEAD remote &&
+	test_cmp expected text.txt
+'
+
+test_expect_success 'w/s only in all lines: --ignore-space-at-eol fails' '
+	git read-tree --reset -u HEAD &&
+	test_must_fail git merge-recursive --ignore-space-at-eol HEAD^ -- HEAD remote &&
+	grep "<<<<<<" text.txt
+'
+
 test_done
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 625198e..2c7db26 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -596,14 +596,14 @@ int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
 		return -1;
 	}
 	status = 0;
-	if (!xscr1) {
-		result->ptr = xdl_malloc(mf2->size);
-		memcpy(result->ptr, mf2->ptr, mf2->size);
-		result->size = mf2->size;
-	} else if (!xscr2) {
+	if (!xscr2) {
 		result->ptr = xdl_malloc(mf1->size);
 		memcpy(result->ptr, mf1->ptr, mf1->size);
 		result->size = mf1->size;
+	} else if (!xscr1) {
+		result->ptr = xdl_malloc(mf2->size);
+		memcpy(result->ptr, mf2->ptr, mf2->size);
+		result->size = mf2->size;
 	} else {
 		status = xdl_do_merge(&xe1, xscr1,
 				      &xe2, xscr2,
-- 
2.3.1.167.g7f4ba4b
Next: Torsten Bögershausen
Message 1 of 13 in “xmerge.c: fix xdl_merge to conform with the manual”
  1. xmerge.c: fix xdl_merge to conform with the manualAnton Trunov, Mar 3, 2015
  2. Torsten BögershausenMar 3, 2015
  3. Eric SunshineMar 4, 2015
  4. Anton TrunovMar 4, 2015
  5. Eric SunshineMar 4, 2015
  6. Anton TrunovMar 4, 2015
  7. Junio C HamanoMar 3, 2015
  8. Anton TrunovMar 4, 2015
  9. Junio C HamanoMar 4, 2015
  10. Anton TrunovMar 5, 2015
  11. Anton TrunovMar 6, 2015
  12. Junio C HamanoMar 8, 2015
  13. Anton TrunovMar 9, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.