зеркало из https://github.com/microsoft/git.git
Merge branch 'dt/merge-recursive-case-insensitive'
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
This commit is contained in:
Коммит
067fe64355
|
@ -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) {
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
Загрузка…
Ссылка в новой задаче