diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2006-12-03 20:42:47 +0100 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-04 00:55:12 -0800 |
commit | aca085e577688108a2480b96a2f7077424a74e4d (patch) | |
tree | c5ffc1a20ac48ae96c013a9fc27520f1d78b1410 /builtin-mv.c | |
parent | 6173c197c9a23fa8594f18fd2c856407d4af31c1 (diff) | |
download | git-aca085e577688108a2480b96a2f7077424a74e4d.tar.gz |
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>
Diffstat (limited to 'builtin-mv.c')
-rw-r--r-- | builtin-mv.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/builtin-mv.c b/builtin-mv.c index 54dd3bfe8a..d14a4a7f5c 100644 --- a/builtin-mv.c +++ b/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"; |