diff options
-rw-r--r-- | lockfile.c | 10 | ||||
-rwxr-xr-x | t/t2107-update-index-basic.sh | 15 |
2 files changed, 20 insertions, 5 deletions
diff --git a/lockfile.c b/lockfile.c index 154915fb1a..0aa70a5b3c 100644 --- a/lockfile.c +++ b/lockfile.c @@ -117,13 +117,13 @@ static char *resolve_symlink(const char *in) static int lock_file(struct lock_file *lk, const char *path, int flags) { - int len; + struct strbuf sb = STRBUF_INIT; + if (!(flags & LOCK_NODEREF) && !(path = resolve_symlink(path))) return -1; - len = strlen(path) + 5; /* .lock */ - lk->filename = xmallocz(len); - strcpy(lk->filename, path); - strcat(lk->filename, ".lock"); + strbuf_add_absolute_path(&sb, path); + strbuf_addstr(&sb, ".lock"); + lk->filename = strbuf_detach(&sb, NULL); lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); if (0 <= lk->fd) { if (!lock_file_list) { 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 |