From patchwork Thu Aug 29 18:27:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11122219 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 2040B184E for ; Thu, 29 Aug 2019 18:28:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E88C8205C9 for ; Thu, 29 Aug 2019 18:28:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dQH5VKLP" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729701AbfH2S2Y (ORCPT ); Thu, 29 Aug 2019 14:28:24 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:50727 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728744AbfH2S2J (ORCPT ); Thu, 29 Aug 2019 14:28:09 -0400 Received: by mail-wm1-f66.google.com with SMTP id v15so4740223wml.0 for ; Thu, 29 Aug 2019 11:28:08 -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=fNCEMQP8FCbtf8HiQIYPv4jwNXJ8cQPMolrSHc0GMKM=; b=dQH5VKLPx9T16iiRkV1tcmN0GVwUDuGbFKwuE9FsH/swORSqLB6uQXeSQXtPgpzY2l j5twijPcQOYft7HOxqyAu4jBwCZs495o6E0GSCwHqgaxZZhGeH2ATjSzFnA572I30YU/ MWIYiJoO75+wtmAUsiMZjV40qFHSeqLcfRQgDggeKd6ZMGY5Pk9tts+dJPQyb7yZXYui XjchwRvHSu3WKsdRdyGQrQqs7N8J3yBWs2ebFKfxQb5um/FAissxLawaa3dIV3uPpibD xuAo2DYmBkAW5zCmLw081XdjBAxiqLUCnxoKd2zcYD5D0UK3IRatvTKiMq8LrUu6KsNp TNjA== 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=fNCEMQP8FCbtf8HiQIYPv4jwNXJ8cQPMolrSHc0GMKM=; b=lhVCLI1hseDyD+YnMP7RoL4dr6D0ke+/819Oa9KOAPc+AHeFsAnJWMTrcKvBDMmcJw Sv7n+6LIZQlwrh07FMDTUnLelhXzU+LacZTfroi9YtQHupXhl7RAFeCJM2CNiZqnns2Z j2lYM3mpmK7oz0lSMUEcbcub3fOruFOQR12MAwDjMxvasU8sjE5t4+YrqaTk6CTfPUdg SavuW3+jbWiDV/cno0DthFlhTsgdkNsnw8gu9mxHh2dBvPIAyL7ef2KaCFZMZAFclzVl InDbXWZy8+4Hj8JthIwFykHHVa0UJnyPoqkM8v16ltOzNaZVp0r96rv9mXXVaAkyAPfF uqdA== X-Gm-Message-State: APjAAAULBKmn+wvbwDrNnmcrzS9TiPKlwjRwD7CJbJ1tn63UFpqwAJod KJbEHtoXDjyt53nTce+3HUGFdy/m X-Google-Smtp-Source: APXvYqwA1XqzWH1YmnEAViVqxILvw5lZQclfDlFMlnogdUQZTCGHls8LAaxb8UIhTis2AQ3F6ZIrsA== X-Received: by 2002:a7b:ce1a:: with SMTP id m26mr13615467wmc.60.1567103287497; Thu, 29 Aug 2019 11:28:07 -0700 (PDT) Received: from localhost ([2.31.128.175]) by smtp.gmail.com with ESMTPSA id c132sm5289996wme.27.2019.08.29.11.28.06 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 29 Aug 2019 11:28:06 -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 v2 1/3] factor out refresh_and_write_cache function Date: Thu, 29 Aug 2019 19:27:46 +0100 Message-Id: <20190829182748.43802-2-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190829182748.43802-1-t.gummerer@gmail.com> References: <20190827101408.76757-1-t.gummerer@gmail.com> <20190829182748.43802-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. 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. Signed-off-by: Thomas Gummerer --- builtin/am.c | 16 ++-------------- cache.h | 13 +++++++++++++ read-cache.c | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 1aea657a7f..ddedd2b9d4 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) + 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..987d289e8f 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) repo_refresh_and_write_index(the_repository, (refresh_flags), (write_flags), 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,18 @@ 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. + * + * Return 1 if refreshing the cache failed, -1 if writing the cache to + * disk failed, 0 on success. + */ +int repo_refresh_and_write_index(struct repository*, unsigned int refresh_flags, unsigned int write_flags, 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..72662df077 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1472,6 +1472,23 @@ 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, + const struct pathspec *pathspec, + char *seen, const char *header_msg) +{ + struct lock_file lock_file = LOCK_INIT; + + repo_hold_locked_index(repo, &lock_file, LOCK_DIE_ON_ERROR); + if (refresh_index(repo->index, refresh_flags, pathspec, seen, header_msg)) + return 1; + if (write_locked_index(repo->index, &lock_file, COMMIT_LOCK | write_flags)) + return -1; + return 0; +} + + int refresh_index(struct index_state *istate, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg) From patchwork Thu Aug 29 18:27:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11122213 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 4FBC71395 for ; Thu, 29 Aug 2019 18:28:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2D35920578 for ; Thu, 29 Aug 2019 18:28:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qqahmYp9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729791AbfH2S2L (ORCPT ); Thu, 29 Aug 2019 14:28:11 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:34359 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729726AbfH2S2L (ORCPT ); Thu, 29 Aug 2019 14:28:11 -0400 Received: by mail-wr1-f65.google.com with SMTP id s18so4469679wrn.1 for ; Thu, 29 Aug 2019 11:28:09 -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=lkitX9/Yct+qYCp+CzaX96mAr/7OypfSkTJZmiskgng=; b=qqahmYp9lcrBm0mVBtbrDmYw567JEQ82eCOxSKZAxCPWmUvih5Bs7nGZMF9BvDtr67 Ag/1xzxuABj7myqzvPqPMrBdPq3uindHBQHCPOYruy2FYFgP2WJzfOBDu/xSCrY9GeGU i1n78eYQt6PoobDmCXUf4uLm3RYgwqv8bOYnLOBx165nR7pk5Qm/EY+yi3B9WYVxuF70 VcSUDN7QwG9o1CUqZo2cry6i4a3Eszcyk14Rhv9IpXV6UYUH6qI27kasFYESbcxOVZdF C9oqNp7PGVz3mUoY7pDtVwH+fXOmb15iax2P6AiKLCH7jy+MJB1sA0EnoIUhi2xg+otc Zq5w== 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=lkitX9/Yct+qYCp+CzaX96mAr/7OypfSkTJZmiskgng=; b=EQyjx5JEVS93vqjLS53kHCAvfPVbnjm+dZh8afe5SXUM/YLN5wj+oZjOojYnXMlE/S 1dEQUQdPk3oOlITa4VWhpziTjod8dnHlx/p2MFE8bXM4AhoYdaJpZsF4jx6NI3dVBTA4 32jD3eM9RLlVYzWBrUqnrBLi0BnIBTNpcNGXfMH/BED1zSJb9aOyedVbYlFwKmwldnLB 4cjg+by7zZml297/UxkuH9rkwMTxz3mqgJ4TLtIcM5L3bNcPxeubckuw8yj9XcsXTz2r VRRE5dVgkIOByjel2hzBiBbeJvst9rOl6X8Et9wI5DZR/gkCOCWgr8wzCqzsqxEMMPvK 7w9Q== X-Gm-Message-State: APjAAAVXLkBCeqDFnT3T5MPvRP8M0GF3WwCCC708JH0SiYrJEqVZ8+5d PDLJTqOSEwgQpfCptu51ox+EAoUn X-Google-Smtp-Source: APXvYqxDBjFYA7zogv+Ti/okBZVfNKZx4wPcLjHXQFIecQ0/LXM3os0mk+e4Wo3Cgk5TsyMl3o2ahQ== X-Received: by 2002:adf:ea8f:: with SMTP id s15mr5971398wrm.222.1567103288971; Thu, 29 Aug 2019 11:28:08 -0700 (PDT) Received: from localhost ([2.31.128.175]) by smtp.gmail.com with ESMTPSA id c11sm2088361wrs.86.2019.08.29.11.28.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 29 Aug 2019 11:28:08 -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 v2 2/3] merge: use refresh_and_write_cache Date: Thu, 29 Aug 2019 19:27:47 +0100 Message-Id: <20190829182748.43802-3-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190829182748.43802-1-t.gummerer@gmail.com> References: <20190827101408.76757-1-t.gummerer@gmail.com> <20190829182748.43802-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..0148d938c9 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) 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) return error(_("Unable to write index.")); write_tree_trivial(&result_tree); From patchwork Thu Aug 29 18:27:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11122215 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 E3EFA1395 for ; Thu, 29 Aug 2019 18:28:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C1C262166E for ; Thu, 29 Aug 2019 18:28:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QzqpSxE6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729726AbfH2S2N (ORCPT ); Thu, 29 Aug 2019 14:28:13 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:39077 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729770AbfH2S2N (ORCPT ); Thu, 29 Aug 2019 14:28:13 -0400 Received: by mail-wr1-f65.google.com with SMTP id t16so4429159wra.6 for ; Thu, 29 Aug 2019 11:28:11 -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=hcA0Bspg3f8ygchyDR4io5pI04x1+XX1RvPobfl6o48=; b=QzqpSxE6+8G6mkhLyurcco9GgvvVFhn6yJXkE3Q3AP4adje6Tw/zgS5SKEdZeISN++ X3uAqmO7ISiEyzeqEmCptFhq1DXME7nhnzV/b8LdbJDdN8a+6MPduLttIx9cgWGzcHlJ NG+cZxrnuxOZnP7exrSIt9dGvLg8SwluZ1/jT46jRwGErM66dCZzskne4RRNuPI5340t 6RaVHTbltvSzS0HcMTjpqJeMLe1UpiEEIG3bFdTxwPtvq7fYDRI69S5ZA7C0EmnjGmKE /KQ9ELmtjzRtKNxbMBsEo1Jvd9AIXXf+KFq4Aif9gCs3DuMW/QHHD0JRljxFXfd6LAXY BVTg== 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=hcA0Bspg3f8ygchyDR4io5pI04x1+XX1RvPobfl6o48=; b=XoLrkBebVRYGMtfE2/4S/go8Mkgm9QZrM1kPbDqSewkbZny4BGkgAjmYinZE/MYK7Z 8UqCE1YtprpguNCDMTnIFNZnYRL+iq8xDHzB/JG23F2jD1T8YBENl1YhXbhghy223tGs kJOY47u1HY1hsC/vWoUzKJ3SuQaixbUlgjSOPr671YuxQToNOIomwqF3r6pJ2N15xgYH dSu3isWfVjOzw/tfKz8bH0mcHkYjyaMYB0aeb9F+TzAE7dgJonS5eNv1lUz60eMIkUpS PR0g0pdkHhm65AjxPCY/YEhJMc61AyJNXuK+l/D8FXNP23UZ88iWxRQCWQcS/Ca4PIqi KBeg== X-Gm-Message-State: APjAAAV7lOultUogScHYSHJzGog+BHoA8Fz0qZVv3ihMVV63tN79TGL3 Ii/sGJ898O0ivg+OIBsWt1bf6i3z X-Google-Smtp-Source: APXvYqwjdfJXox3DSytuorklFvhJhmOuht8lZPssWOPfVZVeB8dw8+Rzf9O5K7emcIGr9eXMCwc1bQ== X-Received: by 2002:a5d:4245:: with SMTP id s5mr14275333wrr.334.1567103290647; Thu, 29 Aug 2019 11:28:10 -0700 (PDT) Received: from localhost ([2.31.128.175]) by smtp.gmail.com with ESMTPSA id h125sm5582926wmf.31.2019.08.29.11.28.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 29 Aug 2019 11:28:09 -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 v2 3/3] stash: make sure to write refreshed cache Date: Thu, 29 Aug 2019 19:27:48 +0100 Message-Id: <20190829182748.43802-4-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190829182748.43802-1-t.gummerer@gmail.com> References: <20190827101408.76757-1-t.gummerer@gmail.com> <20190829182748.43802-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..da1260ca8e 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)) 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)) 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) { + 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)) { 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