From patchwork Tue Sep 3 19:10:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11128633 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 C23D81398 for ; Tue, 3 Sep 2019 19:10:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 979B522D6D for ; Tue, 3 Sep 2019 19:10:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XBytGYmA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726490AbfICTKt (ORCPT ); Tue, 3 Sep 2019 15:10:49 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:32956 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726383AbfICTKt (ORCPT ); Tue, 3 Sep 2019 15:10:49 -0400 Received: by mail-wm1-f65.google.com with SMTP id r17so735351wme.0 for ; Tue, 03 Sep 2019 12:10:47 -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=L0C6Vpjk5Wc7FtGNy8tLIf6VdopGyVfcQ6MWbNIvARk=; b=XBytGYmAYrrdzNANAc0F0hqI88uZy/SP7u/qTznkDbJUSbIxUaPeVxU8egQ9RFfVhi Ryr50EgDQQOv2PzhnE/AL7/fFckAJe/d5yjWTfuirnysFHjfLAOXVq8f0asuIDGslFoU n3P57NAhKM8a1L+PPlkOT515d60D+/b86OU0OwWaMFMXFrxrQgHfpu2Nh1Gxpv9u1cOe FNJ9jof9tl79/3dRvWAopBqKixD4nA3kxXsVxLP88QIVLhJ8RUjYntxpQLVXSFONRnBt OrEKGiyIslFeibk6XL7xPaU8bUgQerGbc+oZAUq9DHWqAQVaKAfOD/WdFG5adJ/pJZcA +7dw== 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=L0C6Vpjk5Wc7FtGNy8tLIf6VdopGyVfcQ6MWbNIvARk=; b=fN9mnyzppnU5CLVdO6v0iu3OQhKvjbSmLnOOu+MyoEL5194WLtuekW6WivfeWaIyBL B5BIxJKE5l+G9DDlFmAumQWLi4BzjV/t7KaI2rJLpy9dI/k7vDY+R3So1J8nvHjTEmwx t8h1cXA1rDzQGN3x++DRzuW11jIXGOAf7+W5CwAiMoDHrqpmU26Ib7rR4UDbnLT7A5Wn uor7JEHpwh3bi0MSwsl9BnFhxPq7EDg3GXlB2eUVddnv+2l9phDompvDEckFbobEQtq5 NC9GMobRgNNqszINn5sR3OcJU2qTUIoWk6Snspg3IZvPVuV3qH99It68uAR9o3qbKGIo xSCA== X-Gm-Message-State: APjAAAWEnbwcoYc2TaiqKS/u0iEvvL0GlJQaF7og2sBuhHGsxpWJIj2G G3Ke1mjFtBA8Ieg7ia/V1HPDYh/Q X-Google-Smtp-Source: APXvYqx/Q7IinWExs8TATTB6Ywn8vCgbD7YX/0S+/57ucgkoJUAVhg7CqNQa7Pf0rVVVPV4iqOyPpA== X-Received: by 2002:a1c:a54a:: with SMTP id o71mr1084992wme.51.1567537846489; Tue, 03 Sep 2019 12:10:46 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id q25sm775325wmq.27.2019.09.03.12.10.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Sep 2019 12:10:45 -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 v3 1/3] factor out refresh_and_write_cache function Date: Tue, 3 Sep 2019 20:10:39 +0100 Message-Id: <20190903191041.10470-2-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190903191041.10470-1-t.gummerer@gmail.com> References: <20190829182748.43802-1-t.gummerer@gmail.com> <20190903191041.10470-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. Signed-off-by: Thomas Gummerer --- builtin/am.c | 16 ++-------------- cache.h | 16 ++++++++++++++++ read-cache.c | 19 +++++++++++++++++++ 3 files changed, 37 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..2b14768bea 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,21 @@ 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 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 don't write + * the result to disk. + */ +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..2ad96677ae 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1472,6 +1472,25 @@ 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)) { + rollback_lock_file(&lock_file); + 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 Tue Sep 3 19:10:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11128637 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 9D96118A6 for ; Tue, 3 Sep 2019 19:10:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7D36722DCC for ; Tue, 3 Sep 2019 19:10:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ASyFms4g" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726590AbfICTKu (ORCPT ); Tue, 3 Sep 2019 15:10:50 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:55333 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725939AbfICTKt (ORCPT ); Tue, 3 Sep 2019 15:10:49 -0400 Received: by mail-wm1-f68.google.com with SMTP id g207so642885wmg.5 for ; Tue, 03 Sep 2019 12:10:48 -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=ASyFms4gyrBJ9YhXA99hTfK8E978OZnpvRw8jXLzwM4otZX99ovdyhtj89uWVp1HRI PsaoohW6CuEdpuvjL5oQx3Yh3HxWw7d0EVyijmuxG5C1WJcPO37A1qDkxOGcZOcyaGNU 1PvZhtnWclR1zeVI/tc7ZejseqJ7zErMpvJNDP7UpKnR6rRbe2nLkL51jQ9G8Fo79zCA PBbNZl+bSbVPRqSud+8MUeSTq0XNZ0VOmo/soL7RwFRf8AAUYdnbv9SUm5Ayn9BpN8Gn xXbjWGzvnHR9SbPqAcsO3HvKGy2Hve6fR0obxzFv2etkcPY//P3BLgmJ9XbUu0OCN2x4 2BEQ== 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=lHcisiHVpYP3Le/410CwHmffrzmAd3BPnr2DaxV4j70CWSsCQ+Vlz/SEI8qohZwdcB XsnmUKazEniFvsFMhU6PAepMgHRh8c5p3DWG8KYh7CKF28amhtfBX9e7zXohJx7bJB9J hutRxsQTWaXqm/aWMCG9neEsza7V4TARgh3RFOaAn6IDq86e9BsxTKNR1CZgNWeJ4w9S x0WUjqcvjLD3vpMBScC5HycCIZxhxxTe0nhgoF0mCzo3JFA4ER6cXJDwiQuykC6bisVL muwtRB8tjBwFf42tZYos0BAOVKomrWvMutv8+COL22VhZj0ZFTJd9DjIX0wd8fSkbwoi 8hZQ== X-Gm-Message-State: APjAAAXSfMZMa1K24qqtUNtMTi9WmTjBf8dyNTrLJXIMv84F3eGROJaL Z6esJIDbKeLOmIuuozJhjvCyHYEA X-Google-Smtp-Source: APXvYqzBNwRY5vVe3JaL3vyBtcd2ZsJ2fQzbotrPrm1tJFvMwJBceGXJMlLy1yHLhVcZgT9DpqlOHw== X-Received: by 2002:a7b:cc0f:: with SMTP id f15mr1037624wmh.39.1567537847700; Tue, 03 Sep 2019 12:10:47 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id f197sm427242wme.22.2019.09.03.12.10.46 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Sep 2019 12:10:47 -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 v3 2/3] merge: use refresh_and_write_cache Date: Tue, 3 Sep 2019 20:10:40 +0100 Message-Id: <20190903191041.10470-3-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190903191041.10470-1-t.gummerer@gmail.com> References: <20190829182748.43802-1-t.gummerer@gmail.com> <20190903191041.10470-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 Tue Sep 3 19:10:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 11128639 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 822A714DE for ; Tue, 3 Sep 2019 19:10:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 61E5A230F2 for ; Tue, 3 Sep 2019 19:10:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="clqxaEVs" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726411AbfICTKw (ORCPT ); Tue, 3 Sep 2019 15:10:52 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:33879 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726571AbfICTKv (ORCPT ); Tue, 3 Sep 2019 15:10:51 -0400 Received: by mail-wr1-f65.google.com with SMTP id s18so18698887wrn.1 for ; Tue, 03 Sep 2019 12:10:50 -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=clqxaEVsWsRI7C9Hv7QQHOQBIWRn1WhfiBIkir/DC5HlspBrTx8DevLJyiul64mZxp CgmH57cqtox7V1M5XCjNAc1jsMixEjnpj8dbZVNPaPaJjT1twnj0CUQnsmM61nCyFUqw HSW1Y1lk5PvsNcHfk9KCUyEv5Ds82YWV+VQsQihpqHwRD+L7Px2ts5zYskwRhJ6N3pCz vrIZaHhcKbjIBqXHPeRosHK087Aa2HUSzsiRNsLiKzZfumRLRWwSJimpHh5mWMVlR7h1 5AVVt6H+ZJIvMK10HnYOsqv1lh5rs9MZSn/ofiCv/dOg5c1WkMS6qQpRFC+PTX5Kvno+ J7Tw== 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=MDETcRE3LDANDjuoZeYmwYAG4481JsZctfSrJSbKGPoQEeBbx6biT6eyV9KONP8Ty6 oAL82GkDQavMkzcqsRwE5gZFbHKC3SHLyPfWBvPtb1M8Yn1VqGKKb/y7/kCIt45P8AH0 J5NedbveHbU+XW2GhiRQhD33caVxHOXAJn3MoQkftV6n1ONXazp4Hc9W4lsnD1r43e9s sYlC17YDy71y8XAvBJicQTDGZ9tY3glQPjn86ErKMYOlqL6g1K8uW+Lb1dEllLgfA86N sOETMOhBHoIM4MqxYM76mFdpVHSj5ugzRJlSh28ZbxmElo0+t0mNzVhw3aFhkX43cbiP 165Q== X-Gm-Message-State: APjAAAXJzIU1srL7Q3S2pDKQWQxF8dCOEizEGb38Fks8Ae4wG26H3FuC h1flCDp7PcNqWnB4rULbQ/qz23bT X-Google-Smtp-Source: APXvYqyX0UcutCBdh3RsFZ5x2Dz3kyG1aPjM37BBZn1nHhU+VNWMMVMsqdwM0HBngTLt88ZI6W8QGQ== X-Received: by 2002:adf:ee4a:: with SMTP id w10mr29873940wro.138.1567537849351; Tue, 03 Sep 2019 12:10:49 -0700 (PDT) Received: from localhost ([95.148.214.9]) by smtp.gmail.com with ESMTPSA id g73sm593503wme.10.2019.09.03.12.10.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Sep 2019 12:10:48 -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 v3 3/3] stash: make sure to write refreshed cache Date: Tue, 3 Sep 2019 20:10:41 +0100 Message-Id: <20190903191041.10470-4-t.gummerer@gmail.com> X-Mailer: git-send-email 2.23.0.rc2.194.ge5444969c9 In-Reply-To: <20190903191041.10470-1-t.gummerer@gmail.com> References: <20190829182748.43802-1-t.gummerer@gmail.com> <20190903191041.10470-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