]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge: fix save_state() to work when there are stat-dirty files
authorElijah Newren <newren@gmail.com>
Sat, 23 Jul 2022 01:53:15 +0000 (01:53 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 Jul 2022 04:45:23 +0000 (21:45 -0700)
When there are stat-dirty files, but no files are modified,
`git stash create` exits with unsuccessful status.  This causes merge
to fail.  Copy some code from sequencer.c's create_autostash to refresh
the index first to avoid this problem.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge.c
t/t6424-merge-unrelated-index-changes.sh

index c120ad619c478a27e7911981509f30f5225ff6de..780b4b9100aa3575a9e9349818001dbb795f6cfc 100644 (file)
@@ -313,8 +313,16 @@ static int save_state(struct object_id *stash)
        int len;
        struct child_process cp = CHILD_PROCESS_INIT;
        struct strbuf buffer = STRBUF_INIT;
+       struct lock_file lock_file = LOCK_INIT;
+       int fd;
        int rc = -1;
 
+       fd = repo_hold_locked_index(the_repository, &lock_file, 0);
+       refresh_cache(REFRESH_QUIET);
+       if (0 <= fd)
+               repo_update_index_if_able(the_repository, &lock_file);
+       rollback_lock_file(&lock_file);
+
        strvec_pushl(&cp.args, "stash", "create", NULL);
        cp.out = -1;
        cp.git_cmd = 1;
index 615061c7af442bceafc302f2027b543828ac3e0c..2c83210f9fd575469c366368b7a5435a45dd709b 100755 (executable)
@@ -275,6 +275,17 @@ test_expect_success 'subtree' '
        test_path_is_missing .git/MERGE_HEAD
 '
 
+test_expect_success 'avoid failure due to stat-dirty files' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       # Make "a" be stat-dirty
+       test-tool chmtime =+1 a &&
+
+       # stat-dirty file should not prevent stash creation in builtin/merge.c
+       git merge -s resolve -s recursive D^0
+'
+
 test_expect_success 'with multiple strategies, recursive or ort failure do not early abort' '
        git reset --hard &&
        git checkout B^0 &&