summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-01-07 20:56:01 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-01-07 20:56:01 (GMT)
commitbb86a40e06ce1caafd74cc9fc87db4d5da8e3d07 (patch)
tree30ca25a9391bafdd9041e6ba9e6a7448b0838123
parent098501527f2b5628f086d3d9d2fda87220c069a5 (diff)
parentfa137f67a40bbcb3f583920586fdd34ce98ddeaf (diff)
downloadgit-bb86a40e06ce1caafd74cc9fc87db4d5da8e3d07.zip
git-bb86a40e06ce1caafd74cc9fc87db4d5da8e3d07.tar.gz
git-bb86a40e06ce1caafd74cc9fc87db4d5da8e3d07.tar.bz2
Merge branch 'nd/lockfile-absolute'
The lockfile API can get confused which file to clean up when the process moved the $cwd after creating a lockfile. * nd/lockfile-absolute: lockfile.c: store absolute path
-rw-r--r--lockfile.c14
-rwxr-xr-xt/t2107-update-index-basic.sh15
2 files changed, 26 insertions, 3 deletions
diff --git a/lockfile.c b/lockfile.c
index 4f16ee7..9889277 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -128,9 +128,17 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
path);
}
- strbuf_add(&lk->filename, path, pathlen);
- if (!(flags & LOCK_NO_DEREF))
- resolve_symlink(&lk->filename);
+ if (flags & LOCK_NO_DEREF) {
+ strbuf_add_absolute_path(&lk->filename, path);
+ } else {
+ struct strbuf resolved_path = STRBUF_INIT;
+
+ strbuf_add(&resolved_path, path, pathlen);
+ resolve_symlink(&resolved_path);
+ strbuf_add_absolute_path(&lk->filename, resolved_path.buf);
+ strbuf_release(&resolved_path);
+ }
+
strbuf_addstr(&lk->filename, LOCK_SUFFIX);
lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
if (lk->fd < 0) {
diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh
index 1bafb90..dfe02f4 100755
--- a/t/t2107-update-index-basic.sh
+++ b/t/t2107-update-index-basic.sh
@@ -65,4 +65,19 @@ test_expect_success '--cacheinfo mode,sha1,path (new syntax)' '
test_cmp expect actual
'
+test_expect_success '.lock files cleaned up' '
+ mkdir cleanup &&
+ (
+ cd cleanup &&
+ mkdir worktree &&
+ git init repo &&
+ cd repo &&
+ git config core.worktree ../../worktree &&
+ # --refresh triggers late setup_work_tree,
+ # active_cache_changed is zero, rollback_lock_file fails
+ git update-index --refresh &&
+ ! test -f .git/index.lock
+ )
+'
+
test_done