From patchwork Wed Sep 11 18:20:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11141693 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 571761599 for ; Wed, 11 Sep 2019 18:21:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 29FB3206A5 for ; Wed, 11 Sep 2019 18:21:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mJEhVgHo" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729860AbfIKSVR (ORCPT ); Wed, 11 Sep 2019 14:21:17 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:32945 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727575AbfIKSVQ (ORCPT ); Wed, 11 Sep 2019 14:21:16 -0400 Received: by mail-wm1-f66.google.com with SMTP id r17so2829004wme.0 for ; Wed, 11 Sep 2019 11:21:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YX9Jc4uTUl7rF9szigiX4FIebuQ+R/+M55GmSb0pZm4=; b=mJEhVgHo4pwoJe1J8AW+MicCjxrJW5PoDvDOG7GG2SMfuPmlHZ0ijWxGJApbV4XEoQ oH5F6Vbpt+85FteHHsKGs5lp720HFE1mkZKifa7DNbKNbHkUMRtDKdlSUtnaEqQkXD/6 sd+MZwW6CseASMFSLueoWqRLjmZs1vrhgttxGMccy/qBrsytL5TxYz/IXvXMC9oTud3q Kpo7ugyEwslooJmtLT4yAigy1n6FyzYcn+seiweMhAfe7I9u2x7E7aL/HJlyc76YqVxU EsDYGGG4gh71par+fSDh/yVJv5IQ79kf1ymmzrbvOJ+KPMT1ZFzQm6BdFkOkmzLFY6iu kKxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YX9Jc4uTUl7rF9szigiX4FIebuQ+R/+M55GmSb0pZm4=; b=qyDFg2e75C1wXw1H1WMbTiJhv9HzS5gChOx2EFwE4vDEXygFh6rF2MMgL9Q7TrvF3t aaYq+kuiLU5k9qPtrkmDUgc8LZ5+rCj45XQ/R9qI8tkDfdB2oQaq1GSDDGUjo2lwtPBk Gq2hc3pYGiY2qSdzTLwTW+nRSr0ISK+WmFrwN8kq9QhJcCa9h7lU2LmVp/GhsUpSrrVP sSu5mD119c8MYHZLDpt0UHhpZ02tmNmYy79ACK+24Wvhc2Vg6G0dPpcxTHHGvvoDdb/r ZDoHNxJcQnqNG/O4ishua1/45d9HH5BuYGjQByyD57XKHvDsjgY0yV7aqacneqKQNq3w P+rw== X-Gm-Message-State: APjAAAXUA+mZCej5jYoMTz4C4CmfdfYZ8YonIi48XlnX4DD7phRf88Bc XnZX6OTCGqggYTKCfnX92EVrh3Ru X-Google-Smtp-Source: APXvYqyPwlN5g/1RSc1X5vMOiO5KhLAGUga8jptzP3Yz6va3R0pnQ9JCQ5quq5OnVhMpiG2eOkqh6w== X-Received: by 2002:a7b:cc8e:: with SMTP id p14mr4972802wma.124.1568226072718; Wed, 11 Sep 2019 11:21:12 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id y6sm2547263wmi.14.2019.09.11.11.21.11 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 11 Sep 2019 11:21:11 -0700 (PDT) From: Thomas Gummerer To: git@vger.kernel.org Cc: Junio C Hamano , Joel Teichroeb , Johannes Schindelin , Jeff King , =?utf-8?q?Martin_=C3=85gren?= , Thomas Gummerer Subject: [PATCH v4 1/3] factor out refresh_and_write_cache function Date: Wed, 11 Sep 2019 19:20:25 +0100 Message-Id: <20190911182027.41284-2-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190911182027.41284-1-t.gummerer@gmail.com> References: <20190903191041.10470-1-t.gummerer@gmail.com> <20190911182027.41284-1-t.gummerer@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Getting the lock for the index, refreshing it and then writing it is a pattern that happens more than once throughout the codebase, and isn't trivial to get right. Factor out the refresh_and_write_cache function from builtin/am.c to read-cache.c, so it can be re-used in other places in a subsequent commit. Note that we return different error codes for failing to refresh the cache, and failing to write the index. The current caller only cares about failing to write the index. However for other callers we're going to convert in subsequent patches we will need this distinction. Helped-by: Martin Ă…gren Helped-by: Johannes Schindelin Signed-off-by: Thomas Gummerer --- builtin/am.c | 16 ++-------------- cache.h | 18 ++++++++++++++++++ read-cache.c | 21 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 1aea657a7f..92e0e70069 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -1071,19 +1071,6 @@ static const char *msgnum(const struct am_state *state) return sb.buf; } -/** - * Refresh and write index. - */ -static void refresh_and_write_cache(void) -{ - struct lock_file lock_file = LOCK_INIT; - - hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); - refresh_cache(REFRESH_QUIET); - if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) - die(_("unable to write index file")); -} - /** * Dies with a user-friendly message on how to proceed after resolving the * problem. This message can be overridden with state->resolvemsg. @@ -1703,7 +1690,8 @@ static void am_run(struct am_state *state, int resume) unlink(am_path(state, "dirtyindex")); - refresh_and_write_cache(); + if (refresh_and_write_cache(REFRESH_QUIET, 0, 0) < 0) + die(_("unable to write index file")); if (repo_index_has_changes(the_repository, NULL, &sb)) { write_state_bool(state, "dirtyindex", 1); diff --git a/cache.h b/cache.h index b1da1ab08f..68a54f50ac 100644 --- a/cache.h +++ b/cache.h @@ -414,6 +414,7 @@ extern struct index_state the_index; #define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags)) #define chmod_cache_entry(ce, flip) chmod_index_entry(&the_index, (ce), (flip)) #define refresh_cache(flags) refresh_index(&the_index, (flags), NULL, NULL, NULL) +#define refresh_and_write_cache(refresh_flags, write_flags, gentle) repo_refresh_and_write_index(the_repository, (refresh_flags), (write_flags), (gentle), NULL, NULL, NULL) #define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options)) #define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options)) #define cache_dir_exists(name, namelen) index_dir_exists(&the_index, (name), (namelen)) @@ -812,6 +813,23 @@ void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, st #define REFRESH_IN_PORCELAIN 0x0020 /* user friendly output, not "needs update" */ #define REFRESH_PROGRESS 0x0040 /* show progress bar if stderr is tty */ int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg); +/* + * Refresh the index and write it to disk. + * + * 'refresh_flags' is passed directly to 'refresh_index()', while + * 'COMMIT_LOCK | write_flags' is passed to 'write_locked_index()', so + * the lockfile is always either committed or rolled back. + * + * If 'gentle' is passed, errors locking the index are ignored. + * + * Return 1 if refreshing the index returns an error, -1 if writing + * the index to disk fails, 0 on success. + * + * Note that if refreshing the index returns an error, we still write + * out the index (unless locking fails). + */ +int repo_refresh_and_write_index(struct repository*, unsigned int refresh_flags, unsigned int write_flags, int gentle, const struct pathspec *, char *seen, const char *header_msg); + struct cache_entry *refresh_cache_entry(struct index_state *, struct cache_entry *, unsigned int); void set_alternate_index_output(const char *); diff --git a/read-cache.c b/read-cache.c index 52ffa8a313..7e646e06c2 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1472,6 +1472,27 @@ static void show_file(const char * fmt, const char * name, int in_porcelain, printf(fmt, name); } +int repo_refresh_and_write_index(struct repository *repo, + unsigned int refresh_flags, + unsigned int write_flags, + int gentle, + const struct pathspec *pathspec, + char *seen, const char *header_msg) +{ + struct lock_file lock_file = LOCK_INIT; + int fd, ret = 0; + + fd = repo_hold_locked_index(repo, &lock_file, 0); + if (!gentle && fd < 0) + return -1; + if (refresh_index(repo->index, refresh_flags, pathspec, seen, header_msg)) + ret = 1; + if (0 <= fd && write_locked_index(repo->index, &lock_file, COMMIT_LOCK | write_flags)) + ret = -1; + return ret; +} + + int refresh_index(struct index_state *istate, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg) From patchwork Wed Sep 11 18:20:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11141697 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E0FC814E5 for ; Wed, 11 Sep 2019 18:21:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BF2F2206A5 for ; Wed, 11 Sep 2019 18:21:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="vC/vTquX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729859AbfIKSVR (ORCPT ); Wed, 11 Sep 2019 14:21:17 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:32948 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728117AbfIKSVQ (ORCPT ); Wed, 11 Sep 2019 14:21:16 -0400 Received: by mail-wm1-f67.google.com with SMTP id r17so2829038wme.0 for ; Wed, 11 Sep 2019 11:21:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yzr0H2zKHhfVvG2fxuqRx6GmKY11fhhSrlzJfnheXSs=; b=vC/vTquXW4ER4O98uXz7psXXH0TIuadnSw1yebh0/BUiQeD6WAYsMpfZHDifSBgiEH AXWTp8MMo5r0HA7x29itNvUbo2lCgpn4g76wW7/k4Y4XnlFu9poI6HtikDo2wKKIxG0O D/tEFkupKon2CL/MhH2txAp1uz/ApjMi0LAKL8fAhZC0v8F5pT3LKrVqjkCoXcKUf3O+ VP7YxtlLjJvudlahAuF38uyeP2dR8m2cmpyJcPF9WL6MsFLLZ3CtzoBb3jfKGGPo8Mtn 9egYLkXeqkz+ROZcd39bIghxX3xfBILp0WzjcVlMO1Eo/NKkU+f9CNtQnT7q2gs9fDhX CMhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yzr0H2zKHhfVvG2fxuqRx6GmKY11fhhSrlzJfnheXSs=; b=YbD8xZFNfUD9yy6oamGW8km2P7wUHaVgDQ+bKTOEbavq/ZmPhAGWemdmcAAd87iNsi Y97hEGBJLtsAX/QCzG6d4UdGDzARlGg8jaZ3trFCLZicBjhiYJpSO6GcMFkPxb92XJs7 vcdhk8pGDatW2AYxNgYDNAyf7Ty8lD0YCBwisNY1k6KzbjZTTpn5W42uNlea5U8zfGZV WmnYYCxWnXgD7XkOgvU0WJE6YmDwVhBfZkzRisNWyJKmjfzhPRg+uYwOS1pcpeEq4JhG XOpYjXEJxsvRMH/S2z/KFALr4vcf0qlxerCg7H6WE+0gFY2Qee38RemMRIgFfVqv5+dt gjGQ== X-Gm-Message-State: APjAAAVywfldt6/vLHwPHIJnAH/T1uO8EK0+7+8KHz/QXsxR2U6pr0hN to/Eq2B7yeSLGXjBCuhJ5ldeR7sU X-Google-Smtp-Source: APXvYqyOwSNzogqCZFZkEaq+Dh4ELl3RCWwsix9/LF1YpFmBtcLG1hgL0fD6x8JB0eIqSzbReurhpA== X-Received: by 2002:a1c:720e:: with SMTP id n14mr4862612wmc.54.1568226074285; Wed, 11 Sep 2019 11:21:14 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id o8sm3409146wmc.30.2019.09.11.11.21.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 11 Sep 2019 11:21:13 -0700 (PDT) From: Thomas Gummerer To: git@vger.kernel.org Cc: Junio C Hamano , Joel Teichroeb , Johannes Schindelin , Jeff King , =?utf-8?q?Martin_=C3=85gren?= , Thomas Gummerer Subject: [PATCH v4 2/3] merge: use refresh_and_write_cache Date: Wed, 11 Sep 2019 19:20:26 +0100 Message-Id: <20190911182027.41284-3-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190911182027.41284-1-t.gummerer@gmail.com> References: <20190903191041.10470-1-t.gummerer@gmail.com> <20190911182027.41284-1-t.gummerer@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Use the 'refresh_and_write_cache()' convenience function introduced in the last commit, instead of refreshing and writing the index manually in merge.c Signed-off-by: Thomas Gummerer --- builtin/merge.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/builtin/merge.c b/builtin/merge.c index e2ccbc44e2..83e42fcb10 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -688,16 +688,13 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common, struct commit_list *remoteheads, struct commit *head) { - struct lock_file lock = LOCK_INIT; const char *head_arg = "HEAD"; - hold_locked_index(&lock, LOCK_DIE_ON_ERROR); - refresh_cache(REFRESH_QUIET); - if (write_locked_index(&the_index, &lock, - COMMIT_LOCK | SKIP_IF_UNCHANGED)) + if (refresh_and_write_cache(REFRESH_QUIET, SKIP_IF_UNCHANGED, 0) < 0) return error(_("Unable to write index.")); if (!strcmp(strategy, "recursive") || !strcmp(strategy, "subtree")) { + struct lock_file lock = LOCK_INIT; int clean, x; struct commit *result; struct commit_list *reversed = NULL; @@ -860,12 +857,8 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads) { struct object_id result_tree, result_commit; struct commit_list *parents, **pptr = &parents; - struct lock_file lock = LOCK_INIT; - hold_locked_index(&lock, LOCK_DIE_ON_ERROR); - refresh_cache(REFRESH_QUIET); - if (write_locked_index(&the_index, &lock, - COMMIT_LOCK | SKIP_IF_UNCHANGED)) + if (refresh_and_write_cache(REFRESH_QUIET, SKIP_IF_UNCHANGED, 0) < 0) return error(_("Unable to write index.")); write_tree_trivial(&result_tree); From patchwork Wed Sep 11 18:20:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11141699 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 31EF81902 for ; Wed, 11 Sep 2019 18:21:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0EE3120838 for ; Wed, 11 Sep 2019 18:21:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dzn81nZJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729895AbfIKSVS (ORCPT ); Wed, 11 Sep 2019 14:21:18 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:38563 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729758AbfIKSVS (ORCPT ); Wed, 11 Sep 2019 14:21:18 -0400 Received: by mail-wr1-f67.google.com with SMTP id l11so25652247wrx.5 for ; Wed, 11 Sep 2019 11:21:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yw34tZuxF7paVqcDxC9Kwa7pJwDI8PLzsYdCvILdBKk=; b=dzn81nZJsKveB55zTH0HjWj+RLpLLjOi/Pr2ZPSX3T6EwtSjTQnKxIdR45czN+Eh1x O2e7saY8AjqioQkDFZWbIJ5MUUsY1lgbqtDbmjnavmPSmFStwS1iu4ykR5hb1gLem/6V 8LIsOCCHpPSESif527RuIa9AxbJ5UmNQVEb5mUvBHvVsR++cDTUSWbm2AmMC2Bt9BzBN imoI0KkCR1yZcBexjhriNKkd5sOKoJ0/LkS8YMj3xkbeIISo84m1LpllyP2f24FSs0th SaH9vSktZFT/GJ3NAJxShijHoZRtHjASWc/n3jTcV5b+w2idu7DP24eIspz+Nl9rIjR8 amyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yw34tZuxF7paVqcDxC9Kwa7pJwDI8PLzsYdCvILdBKk=; b=tLZB72CxqJ8mQC54kEXeJT0KPf51BStHDJC/S9F4E2H/t3bXlhQUPkXSrBPzlGi6L4 LRgiIQCthL/oC8mU2mmJm7IJGCihYlOT9gPKxXjcLscK4EsR7hjEK2PiCH1q7onZdH48 TABJzrss2mdjCeIOO0+DMKST5Xyk4DivYmRmC9uCqDvOK8VmnQxFd4F3e5Nb60Re2ysv qhpWEyWONlaI3f96sWlZUg4AuYXkgBMC3gFfMNuY4pxdp1Q3goEs2RDHddeanGD9W5hb Yl2lyGAzX5FsobZkVZnRgP1yVzfBZ866LiOlZNGGipzKgCh1bIjb+CRCpXjoJw+c2qY3 NxHw== X-Gm-Message-State: APjAAAVBQ8RUnHC0mS2EcdAaosFY7S5kyZmgGPWsZ8Z5WfgJhQ0GI2t0 7r1m3xSQwKpaUzZL3+oU/6z9CHNH X-Google-Smtp-Source: APXvYqyfZrBqzWzQVUgwh/+Ab6OHifY9pD+JRrCE4eWS6HKt5acwN+iq/FC274yCWZsBeBnbtxCQSw== X-Received: by 2002:a5d:6647:: with SMTP id f7mr32006774wrw.170.1568226075833; Wed, 11 Sep 2019 11:21:15 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id l62sm6185935wml.13.2019.09.11.11.21.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 11 Sep 2019 11:21:15 -0700 (PDT) From: Thomas Gummerer To: git@vger.kernel.org Cc: Junio C Hamano , Joel Teichroeb , Johannes Schindelin , Jeff King , =?utf-8?q?Martin_=C3=85gren?= , Thomas Gummerer Subject: [PATCH v4 3/3] stash: make sure to write refreshed cache Date: Wed, 11 Sep 2019 19:20:27 +0100 Message-Id: <20190911182027.41284-4-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190911182027.41284-1-t.gummerer@gmail.com> References: <20190903191041.10470-1-t.gummerer@gmail.com> <20190911182027.41284-1-t.gummerer@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org When converting stash into C, calls to 'git update-index --refresh' were replaced with the 'refresh_cache()' function. That is fine as long as the index is only needed in-core, and not re-read from disk. However in many cases we do actually need the refreshed index to be written to disk, for example 'merge_recursive_generic()' discards the in-core index before re-reading it from disk, and in the case of 'apply --quiet', the 'refresh_cache()' we currently have is pointless without writing the index to disk. Always write the index after refreshing it to ensure there are no regressions in this compared to the scripted stash. In the future we can consider avoiding the write where possible after making sure none of the subsequent calls actually need the refreshed cache, and it is not expected to be refreshed after stash exits or it is written somewhere else already. Reported-by: Jeff King Signed-off-by: Thomas Gummerer --- builtin/stash.c | 11 +++++++---- t/t3903-stash.sh | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/builtin/stash.c b/builtin/stash.c index b5a301f24d..ab30d1e920 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -396,7 +396,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, const struct object_id *bases[1]; read_cache_preload(NULL); - if (refresh_cache(REFRESH_QUIET)) + if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) return -1; if (write_cache_as_tree(&c_tree, 0, NULL)) @@ -485,7 +485,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, } if (quiet) { - if (refresh_cache(REFRESH_QUIET)) + if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) warning("could not refresh index"); } else { struct child_process cp = CHILD_PROCESS_INIT; @@ -1129,7 +1129,10 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b prepare_fallback_ident("git stash", "git@stash"); read_cache_preload(NULL); - refresh_cache(REFRESH_QUIET); + if (refresh_and_write_cache(REFRESH_QUIET, 0, 0) < 0) { + ret = -1; + goto done; + } if (get_oid("HEAD", &info->b_commit)) { if (!quiet) @@ -1290,7 +1293,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q free(ps_matched); } - if (refresh_cache(REFRESH_QUIET)) { + if (refresh_and_write_cache(REFRESH_QUIET, 0, 0)) { ret = -1; goto done; } diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index b8e337893f..392954d6dd 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1241,4 +1241,20 @@ test_expect_success 'stash --keep-index with file deleted in index does not resu test_path_is_missing to-remove ' +test_expect_success 'stash apply should succeed with unmodified file' ' + echo base >file && + git add file && + git commit -m base && + + # now stash a modification + echo modified >file && + git stash && + + # make the file stat dirty + cp file other && + mv other file && + + git stash apply +' + test_done