Skip to content

Commit

Permalink
Merge branch 'dt/merge-recursive-case-insensitive' into maint
Browse files Browse the repository at this point in the history
On a case insensitive filesystem, merge-recursive incorrectly
deleted the file that is to be renamed to a name that is the same
except for case differences.

* dt/merge-recursive-case-insensitive:
  mv: allow renaming to fix case on case insensitive filesystems
  merge-recursive.c: fix case-changing merge bug
  • Loading branch information
Junio C Hamano committed Jun 25, 2014
2 parents ed5d0d2 + baa37bf commit 5fa38cc
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
3 changes: 2 additions & 1 deletion builtin/mv.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
}
} else if (cache_name_pos(src, length) < 0)
bad = _("not under version control");
else if (lstat(dst, &st) == 0) {
else if (lstat(dst, &st) == 0 &&
(!ignore_case || strcasecmp(src, dst))) {
bad = _("destination exists");
if (force) {
/*
Expand Down
6 changes: 6 additions & 0 deletions merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
53 changes: 53 additions & 0 deletions t/t6039-merge-ignorecase.sh
Original file line number Diff line number Diff line change
@@ -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 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

0 comments on commit 5fa38cc

Please sign in to comment.