Browse Source

builtin-rm: fix index lock file path

When hold_locked_index() is called with a relative git_dir and you are
outside the work tree, the lock file become relative to the current
directory. So when later setup_work_tree() change the current directory
it breaks lock file path and commit_locked_index() fails.

This patch move index locking code after setup_work_tree() call to make
lock file relative to the working tree as it should be and add a test
case.

Noticed by Nick Andrew.

Signed-off-by: Olivier Marin <dkr@freesurf.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Olivier Marin 17 years ago committed by Junio C Hamano
parent
commit
4d26467279
  1. 10
      builtin-rm.c
  2. 12
      t/t3600-rm.sh

10
builtin-rm.c

@ -146,11 +146,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix) @@ -146,11 +146,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix)

git_config(git_default_config, NULL);

newfd = hold_locked_index(&lock_file, 1);

if (read_cache() < 0)
die("index file corrupt");

argc = parse_options(argc, argv, builtin_rm_options, builtin_rm_usage, 0);
if (!argc)
usage_with_options(builtin_rm_usage, builtin_rm_options);
@ -158,6 +153,11 @@ int cmd_rm(int argc, const char **argv, const char *prefix) @@ -158,6 +153,11 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
if (!index_only)
setup_work_tree();

newfd = hold_locked_index(&lock_file, 1);

if (read_cache() < 0)
die("index file corrupt");

pathspec = get_pathspec(prefix, argv);
seen = NULL;
for (i = 0; pathspec[i] ; i++)

12
t/t3600-rm.sh

@ -217,4 +217,16 @@ test_expect_success 'Remove nonexistent file returns nonzero exit status' ' @@ -217,4 +217,16 @@ test_expect_success 'Remove nonexistent file returns nonzero exit status' '
! git rm nonexistent
'

test_expect_success 'Call "rm" from outside the work tree' '
mkdir repo &&
cd repo &&
git init &&
echo something > somefile &&
git add somefile &&
git commit -m "add a file" &&
(cd .. &&
git --git-dir=repo/.git --work-tree=repo rm somefile) &&
test_must_fail git ls-files --error-unmatch somefile
'

test_done

Loading…
Cancel
Save