diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-01-07 12:56:01 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-01-07 12:56:01 -0800 |
commit | bb86a40e06ce1caafd74cc9fc87db4d5da8e3d07 (patch) | |
tree | 30ca25a9391bafdd9041e6ba9e6a7448b0838123 | |
parent | Merge branch 'jc/merge-bases' (diff) | |
parent | lockfile.c: store absolute path (diff) | |
download | tgif-bb86a40e06ce1caafd74cc9fc87db4d5da8e3d07.tar.xz |
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.c | 14 | ||||
-rwxr-xr-x | t/t2107-update-index-basic.sh | 15 |
2 files changed, 26 insertions, 3 deletions
diff --git a/lockfile.c b/lockfile.c index 4f16ee78ce..9889277751 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 1bafb9098c..dfe02f4818 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 |