[PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-08 Thread dturner
From: David Turner dtur...@twitter.com

On a case-insensitive filesystem, when merging, a file would be
wrongly deleted from the working tree if an incoming commit had
renamed it changing only its case.  When merging a rename, the file
with the old name would be deleted -- but since the filesystem
considers the old name to be the same as the new name, the new
file would in fact be deleted.

We avoid this by not deleting files that have a case-clone in the
index at stage 0.

Signed-off-by: David Turner dtur...@twitter.com
---
 merge-recursive.c   |  6 +
 t/t6039-merge-ignorecase.sh | 53 +
 2 files changed, 59 insertions(+)
 create mode 100755 t/t6039-merge-ignorecase.sh

diff --git a/merge-recursive.c b/merge-recursive.c
index 4177092..cab16fa 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean,
return -1;
}
if (update_working_directory) {
+   if (ignore_case) {
+   struct cache_entry *ce;
+   ce = cache_file_exists(path, strlen(path), ignore_case);
+   if (ce  ce_stage(ce) == 0)
+   return 0;
+   }
if (remove_path(path))
return -1;
}
diff --git a/t/t6039-merge-ignorecase.sh b/t/t6039-merge-ignorecase.sh
new file mode 100755
index 000..dfc9f17
--- /dev/null
+++ b/t/t6039-merge-ignorecase.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='git-merge with case-changing rename on case-insensitive file 
system'
+
+. ./test-lib.sh
+
+if ! test_have_prereq CASE_INSENSITIVE_FS
+then
+   skip_all='skipping case insensitive tests - case sensitive file system'
+   test_done
+fi
+
+test_expect_success 'merge with case-changing rename' '
+   test $(git config core.ignorecase) = true 
+   TestCase 
+   git add TestCase 
+   git commit -m add TestCase 
+   git tag baseline
+   git checkout -b with-camel 
+   foo 
+   git add foo 
+   git commit -m intervening commit 
+   git checkout master 
+   git rm TestCase 
+   testcase 
+   git add testcase 
+   git commit -m rename to testcase 
+   git checkout with-camel 
+   git merge master -m merge 
+   test_path_is_file testcase
+'
+
+test_expect_success 'merge with case-changing rename on both sides' '
+   git checkout master 
+   git reset --hard baseline 
+   git branch -D with-camel 
+   git checkout -b with-camel 
+   git mv --force TestCase testcase 
+   git commit -m recase on branch 
+   foo 
+   git add foo 
+   git commit -m intervening commit 
+   git checkout master 
+   git rm TestCase 
+   testcase 
+   git add testcase 
+   git commit -m rename to testcase 
+   git checkout with-camel 
+   git merge master -m merge 
+   test_path_is_file testcase
+'
+
+test_done
-- 
2.0.0.rc0.33.g27630aa

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-08 Thread Junio C Hamano
Thanks; I think this is identical to what we already have on the
dt/merge-recursive-case-insensitive topic.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-07 Thread Junio C Hamano
dtur...@twopensource.com writes:

 +if ! test_have_prereq CASE_INSENSITIVE_FS
 +then
 + skip_all='skipping case insensitive tests - case sensitive file system'
 + test_done
 +fi
 +
 +test_expect_success 'merge with case-changing rename' '
 + test $(git config core.ignorecase) = true 

This check seems a bit strange.  You already know you are on a case
insensitive filesystem, so I would understand that if you assume it
is set, or if you make sure it is set (if you are really paranoid).

But I'll let it pass, as it is not wrong per-se.  Just looked strange.

 +  TestCase 

Please have no SP between redirection operator and its target.

 + test -e testcase

Please make it a habit to use test -f when you expect the path
exists as a file, not merely something exists there I do not care
if it is a file or a directory, for which test -e is perfectly
appropriate.

I'll fix up locally before queuing; no need to resend.

Thanks.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-07 Thread Jonathan Nieder
Junio C Hamano wrote:
 dtur...@twopensource.com writes:

 +test -e testcase

 Please make it a habit to use test -f when you expect the path
 exists as a file, not merely something exists there I do not care
 if it is a file or a directory, for which test -e is perfectly
 appropriate.

Or, better in tests,

test_path_is_file testcase

which prints an error instead of just silently failing when
the path is not a file.

Thanks,
Jonathan
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-07 Thread Junio C Hamano
Jonathan Nieder jrnie...@gmail.com writes:

 Please make it a habit to use test -f when you expect the path
 exists as a file, not merely something exists there I do not care
 if it is a file or a directory, for which test -e is perfectly
 appropriate.

 Or, better in tests,

   test_path_is_file testcase

 which prints an error instead of just silently failing when
 the path is not a file.

Thanks, will tweak.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] merge-recursive.c: Fix case-changing merge.

2014-05-06 Thread dturner
From: David Turner dtur...@twitter.com

On a case-insensitive filesystem, when merging, a file would be
wrongly deleted from the working tree if an incoming commit had
renamed it changing only its case.  When merging a rename, the file
with the old name would be deleted -- but since the filesystem
considers the old name to be the same as the new name, the new
file would in fact be deleted.

We avoid this by not deleting files that have a case-clone in the
index at stage 0.

Signed-off-by: David Turner dtur...@twitter.com
---
 merge-recursive.c   |  6 +
 t/t6039-merge-ignorecase.sh | 53 +
 2 files changed, 59 insertions(+)
 create mode 100755 t/t6039-merge-ignorecase.sh

diff --git a/merge-recursive.c b/merge-recursive.c
index 4177092..cab16fa 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean,
return -1;
}
if (update_working_directory) {
+   if (ignore_case) {
+   struct cache_entry *ce;
+   ce = cache_file_exists(path, strlen(path), ignore_case);
+   if (ce  ce_stage(ce) == 0)
+   return 0;
+   }
if (remove_path(path))
return -1;
}
diff --git a/t/t6039-merge-ignorecase.sh b/t/t6039-merge-ignorecase.sh
new file mode 100755
index 000..ad06752
--- /dev/null
+++ b/t/t6039-merge-ignorecase.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='git-merge with case-changing rename on case-insensitive file 
system'
+
+. ./test-lib.sh
+
+if ! test_have_prereq CASE_INSENSITIVE_FS
+then
+   skip_all='skipping case insensitive tests - case sensitive file system'
+   test_done
+fi
+
+test_expect_success 'merge with case-changing rename' '
+   test $(git config core.ignorecase) = true 
+TestCase 
+   git add TestCase 
+   git commit -m add TestCase 
+   git tag baseline
+   git checkout -b with-camel 
+foo 
+   git add foo 
+   git commit -m intervening commit 
+   git checkout master 
+   git rm TestCase 
+testcase 
+   git add testcase 
+   git commit -m rename to testcase 
+   git checkout with-camel 
+   git merge master -m merge 
+   test -e testcase
+'
+
+test_expect_success 'merge with case-changing rename on both sides' '
+   git checkout master 
+   git reset --hard baseline 
+   git branch -D with-camel 
+   git checkout -b with-camel 
+   git mv --force TestCase testcase 
+   git commit -m recase on branch 
+foo 
+   git add foo 
+   git commit -m intervening commit 
+   git checkout master 
+   git rm TestCase 
+testcase 
+   git add testcase 
+   git commit -m rename to testcase 
+   git checkout with-camel 
+   git merge master -m merge 
+   test -e testcase
+'
+
+test_done
-- 
2.0.0.rc0.33.g27630aa

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html