Hi,
Just found a bug in builtin-mv.c. Here's a script to reproduce:
mkdir git cd git git init touch controled git add controled && git commit -m "init" touch foo1 foo2 mkdir dir git mv -k foo* dir/
The output is the following:
Initialized empty Git repository in /tmp/git/.git/ [master (root-commit)]: created 694563b: "init" 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 controled git: builtin-mv.c:216: cmd_mv: Assertion `pos >= 0' failed. ./bug.sh: line 10: 12919 Aborted git mv -k foo* dir/
Apparently, this happens when using "git mv -k" with more than one unversionned file. The code ignores the first one, but still goes through this
for (i = 0; i < argc; i++) {
const char *src = source[i], *dst = destination[i];
enum update_mode mode = modes[i];
int pos;
if (show_only || verbose)
printf("Renaming %s to %s\n", src, dst);
if (!show_only && mode != INDEX &&
rename(src, dst) < 0 && !ignore_errors)
die ("renaming %s failed: %s", src, strerror(errno));if (mode == WORKING_DIRECTORY) continue;
pos = cache_name_pos(src, strlen(src)); assert(pos >= 0); /* <----- this is the one */ if (!show_only) rename_cache_entry_at(pos, dst); }
for the second, and it crashes on the assertion (gdb says "pos" here is an unversionned file name).
If anyone has time to fix this ...
Thanks,
-- Matthieu