[PATCH V2] builtin-rm: fix index lock file path
- From
- Olivier Marin <dkr+ml.git@free.fr>
- Date
- Jul 19, 2008, 16:24 UTC
- Message-ID
- <4882154E.5050806@free.fr>
- In-Reply-To
- <48821485.6050507@free.fr>
From: Olivier Marin <dkr@freesurf.fr>
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> ---
The same with the test case!
builtin-rm.c | 10 +++++----- t/t3600-rm.sh | 12 ++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/builtin-rm.c b/builtin-rm.c index 56454ec..ee8247b 100644 --- a/builtin-rm.c +++ b/builtin-rm.c @@ -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) 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++) diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 316775e..79c06ad 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -217,4 +217,16 @@ test_expect_success 'Remove nonexistent file returns nonzero exit status' ' test_must_fail 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
-- 1.5.6.3.440.g489d7