notes-merge: Don't remove .git/NOTES_MERGE_WORKTREE; it may be the user's cwd
When a manual notes merge is committed or aborted, we need to remove the temporary worktree at .git/NOTES_MERGE_WORKTREE. However, removing the entire directory is not good if the user ran the 'git notes merge --commit/--abort' from within that directory. On Windows, the directory removal would simply fail, while on POSIX systems, users would suddenly find themselves in an invalid current directory. Therefore, instead of deleting the entire directory, we delete everything _within_ the directory, and leave the (empty) directory in place. This would cause a subsequent notes merge to abort, complaining about a previous - unfinished - notes merge (due to the presence of .git/NOTES_MERGE_WORKTREE), so we also need to adjust this check to only trigger when .git/NOTES_MERGE_WORKTREE is non-empty. Finally, adjust the t3310 manual notes merge testcases to correctly handle the existence of an empty .git/NOTES_MERGE_WORKTREE directory. Inspired-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a0be62c100
commit
dabba590aa
@ -267,7 +267,8 @@ static void check_notes_merge_worktree(struct notes_merge_options *o)
|
||||
* Must establish NOTES_MERGE_WORKTREE.
|
||||
* Abort if NOTES_MERGE_WORKTREE already exists
|
||||
*/
|
||||
if (file_exists(git_path(NOTES_MERGE_WORKTREE))) {
|
||||
if (file_exists(git_path(NOTES_MERGE_WORKTREE)) &&
|
||||
!is_empty_dir(git_path(NOTES_MERGE_WORKTREE))) {
|
||||
if (advice_resolve_conflict)
|
||||
die("You have not concluded your previous "
|
||||
"notes merge (%s exists).\nPlease, use "
|
||||
@ -756,14 +757,18 @@ int notes_merge_commit(struct notes_merge_options *o,
|
||||
|
||||
int notes_merge_abort(struct notes_merge_options *o)
|
||||
{
|
||||
/* Remove .git/NOTES_MERGE_WORKTREE directory and all files within */
|
||||
/*
|
||||
* Remove all files within .git/NOTES_MERGE_WORKTREE. We do not remove
|
||||
* the .git/NOTES_MERGE_WORKTREE directory itself, since it might be
|
||||
* the current working directory of the user.
|
||||
*/
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
int ret;
|
||||
|
||||
strbuf_addstr(&buf, git_path(NOTES_MERGE_WORKTREE));
|
||||
if (o->verbosity >= 3)
|
||||
printf("Removing notes merge worktree at %s\n", buf.buf);
|
||||
ret = remove_dir_recursively(&buf, 0);
|
||||
printf("Removing notes merge worktree at %s/*\n", buf.buf);
|
||||
ret = remove_dir_recursively(&buf, REMOVE_DIR_KEEP_TOPLEVEL);
|
||||
strbuf_release(&buf);
|
||||
return ret;
|
||||
}
|
||||
|
@ -324,7 +324,7 @@ y and z notes on 4th commit
|
||||
EOF
|
||||
git notes merge --commit &&
|
||||
# No .git/NOTES_MERGE_* files left
|
||||
test_must_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_might_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_cmp /dev/null output &&
|
||||
# Merge commit has pre-merge y and pre-merge z as parents
|
||||
test "$(git rev-parse refs/notes/m^1)" = "$(cat pre_merge_y)" &&
|
||||
@ -386,7 +386,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol
|
||||
test_expect_success 'abort notes merge' '
|
||||
git notes merge --abort &&
|
||||
# No .git/NOTES_MERGE_* files left
|
||||
test_must_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_might_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_cmp /dev/null output &&
|
||||
# m has not moved (still == y)
|
||||
test "$(git rev-parse refs/notes/m)" = "$(cat pre_merge_y)" &&
|
||||
@ -453,7 +453,7 @@ EOF
|
||||
# Finalize merge
|
||||
git notes merge --commit &&
|
||||
# No .git/NOTES_MERGE_* files left
|
||||
test_must_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_might_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_cmp /dev/null output &&
|
||||
# Merge commit has pre-merge y and pre-merge z as parents
|
||||
test "$(git rev-parse refs/notes/m^1)" = "$(cat pre_merge_y)" &&
|
||||
@ -542,7 +542,7 @@ EOF
|
||||
test_expect_success 'resolve situation by aborting the notes merge' '
|
||||
git notes merge --abort &&
|
||||
# No .git/NOTES_MERGE_* files left
|
||||
test_must_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_might_fail ls .git/NOTES_MERGE_* >output 2>/dev/null &&
|
||||
test_cmp /dev/null output &&
|
||||
# m has not moved (still == w)
|
||||
test "$(git rev-parse refs/notes/m)" = "$(git rev-parse refs/notes/w)" &&
|
||||
|
Loading…
Reference in New Issue
Block a user