зеркало из https://github.com/microsoft/git.git
git-mv: search more precisely for source directory in index
A move of a directory should find the entries in the index by searching for the name _including_ the slash. Otherwise, the directory can be shadowed by a file when it matches the prefix and is lexicographically smaller, e.g. "ab.c" shadows "ab/". Noticed by Sergey Vlasov. [jc: added Sergey's original reproduction recipe as a test case at the end of t7001.] Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
6173c197c9
Коммит
aca085e577
11
builtin-mv.c
11
builtin-mv.c
|
@ -146,21 +146,24 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||
&& lstat(dst, &st) == 0)
|
||||
bad = "cannot move directory over file";
|
||||
else if (src_is_dir) {
|
||||
const char *src_w_slash = add_slash(src);
|
||||
int len_w_slash = length + 1;
|
||||
int first, last;
|
||||
|
||||
modes[i] = WORKING_DIRECTORY;
|
||||
|
||||
first = cache_name_pos(src, length);
|
||||
first = cache_name_pos(src_w_slash, len_w_slash);
|
||||
if (first >= 0)
|
||||
die ("Huh? %s/ is in index?", src);
|
||||
die ("Huh? %.*s is in index?",
|
||||
len_w_slash, src_w_slash);
|
||||
|
||||
first = -1 - first;
|
||||
for (last = first; last < active_nr; last++) {
|
||||
const char *path = active_cache[last]->name;
|
||||
if (strncmp(path, src, length)
|
||||
|| path[length] != '/')
|
||||
if (strncmp(path, src_w_slash, len_w_slash))
|
||||
break;
|
||||
}
|
||||
free((char *)src_w_slash);
|
||||
|
||||
if (last - first < 1)
|
||||
bad = "source directory is empty";
|
||||
|
|
|
@ -105,4 +105,17 @@ test_expect_success "Michael Cassar's test case" '
|
|||
}
|
||||
'
|
||||
|
||||
rm -fr papers partA path?
|
||||
|
||||
test_expect_success "Sergey Vlasov's test case" '
|
||||
rm -fr .git &&
|
||||
git init-db &&
|
||||
mkdir ab &&
|
||||
date >ab.c &&
|
||||
date >ab/d &&
|
||||
git add ab.c ab &&
|
||||
git commit -m 'initial' &&
|
||||
git mv ab a
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче