From 4868eea4d7b2950ede083470cf304e4e1e1cbbb7 Mon Sep 17 00:00:00 2001 From: Jun Wu Date: Sat, 17 Oct 2026 00:32:31 -0700 Subject: [PATCH] reset: fix write race Similar to the previous commit "commit: fix write race", fix a similar race in "reset" (except for --soft, which does not lock/write the index) by changing "read -> lock -> write" to "lock -> read -> write", so "reset" now qualifies the new user-friendly "waiting for index lock" behavior. Unlike "commit", "reset" uses repo_read_index(), not repo_read_index_preload(), so it won't add significant work (e.g. lstat() working tree) while holding the index lock. I chose to not add a test to t0032-index-lock-timeout.sh, since every waiting test case there (undesirably) takes 1 second to run, there are already representative test cases, and the change looks straightforward. Signed-off-by: Jun Wu Signed-off-by: Junio C Hamano --- builtin/reset.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/builtin/reset.c b/builtin/reset.c index 78e69bd84b..0e1aa76aaa 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -346,6 +346,7 @@ int cmd_reset(int argc, struct object_id oid; struct pathspec pathspec; int intent_to_add = 0; + struct lock_file lock = LOCK_INIT; struct interactive_options interactive_opts = INTERACTIVE_OPTIONS_INIT; const struct option options[] = { OPT__QUIET(&quiet, N_("be quiet, only report errors")), @@ -477,6 +478,9 @@ int cmd_reset(int argc, if (intent_to_add && reset_type != MIXED) die(_("the option '%s' requires '%s'"), "-N", "--mixed"); + if (reset_type != SOFT) + repo_hold_locked_index(the_repository, &lock, + LOCK_DIE_ON_ERROR); if (repo_read_index(the_repository) < 0) die(_("index file corrupt")); @@ -487,9 +491,6 @@ int cmd_reset(int argc, die_if_unmerged_cache(reset_type); if (reset_type != SOFT) { - struct lock_file lock = LOCK_INIT; - repo_hold_locked_index(the_repository, &lock, - LOCK_DIE_ON_ERROR); if (reset_type == MIXED) { int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN; if (read_from_tree(&pathspec, &oid, intent_to_add)) {