From: Jonathan Nieder <jrnieder@gmail.com>
To: Pete Wyckoff <pw@padd.com>
Cc: git@vger.kernel.org, Christian Couder <chriscool@tuxfamily.org>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH] cherry-pick/revert: transparently refresh index
Date: Sun, 31 Oct 2010 14:59:33 -0500 [thread overview]
Message-ID: <20101031195933.GA21240@burratino> (raw)
In-Reply-To: <20101031174430.GA30236@arf.padd.com>
A stat-dirty index is not a detail that ought to concern the operator
of porcelain such as "git cherry-pick".
Without this change, a cherry-pick after copying a worktree with rsync
errors out with a misleading message.
$ git cherry-pick build/top
error: Your local changes to 'file.h' would be overwritten by merge. Aborting.
Please, commit your changes or stash them before you can merge.
Noticed-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Pete Wyckoff wrote:
> P.S. The user-observable problem that occurs if I do not
> rebuild the index is, e.g.:
>
> $ git cherry-pick build/top
> error: Your local changes to 'file.h' would be overwritten by merge. Aborting.
> Please, commit your changes or stash them before you can merge.
Maybe this would help?
builtin/revert.c | 18 ++++++++++++++++--
t/t3501-revert-cherry-pick.sh | 13 +++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 57b51e4..bb6e9e8 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -547,6 +547,21 @@ static void prepare_revs(struct rev_info *revs)
die("empty commit set passed");
}
+static void read_and_refresh_cache(const char *me)
+{
+ static struct lock_file index_lock;
+ int index_fd = hold_locked_index(&index_lock, 0);
+ if (read_index_preload(&the_index, NULL) < 0)
+ die("git %s: failed to read the index", me);
+ refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
+ if (the_index.cache_changed) {
+ if (write_index(&the_index, index_fd) ||
+ commit_locked_index(&index_lock))
+ die("git %s: failed to refresh the index", me);
+ }
+ rollback_lock_file(&index_lock);
+}
+
static int revert_or_cherry_pick(int argc, const char **argv)
{
struct rev_info revs;
@@ -567,8 +582,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
die("cherry-pick --ff cannot be used with --edit");
}
- if (read_cache() < 0)
- die("git %s: failed to read the index", me);
+ read_and_refresh_cache(me);
prepare_revs(&revs);
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index bc7aedd..b210188 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -81,6 +81,19 @@ test_expect_success 'revert after renaming branch' '
'
+test_expect_success 'revert on stat-dirty working tree' '
+ git clone . repo &&
+ (
+ cd repo &&
+ git checkout initial
+ ) &&
+ cp -R repo copy &&
+ (
+ cd copy &&
+ git cherry-pick added
+ )
+'
+
test_expect_success 'revert forbidden on dirty working tree' '
echo content >extra_file &&
--
1.7.2.3.557.gab647.dirty
next prev parent reply other threads:[~2010-10-31 19:59 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-31 17:44 index rebuild for cloned repo Pete Wyckoff
2010-10-31 18:07 ` Jonathan Nieder
2010-10-31 19:59 ` Jonathan Nieder [this message]
2010-10-31 20:26 ` [PATCH] cherry-pick/revert: transparently refresh index Andreas Schwab
2010-10-31 20:32 ` Jonathan Nieder
2010-10-31 22:26 ` Pete Wyckoff
2010-10-31 22:28 ` [PATCH] teach update-index --refresh about --data-unchanged Pete Wyckoff
2010-11-03 17:37 ` Junio C Hamano
2010-11-03 18:36 ` Jonathan Nieder
2010-11-03 22:02 ` Pete Wyckoff
2010-11-14 16:58 ` Pete Wyckoff
2010-11-14 17:34 ` Jonathan Nieder
2010-11-01 8:09 ` [PATCH] cherry-pick/revert: transparently refresh index Johannes Sixt
2010-11-03 17:30 ` Junio C Hamano
2010-11-03 20:33 ` Johannes Sixt
2010-11-01 8:44 ` Nguyen Thai Ngoc Duy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101031195933.GA21240@burratino \
--to=jrnieder@gmail.com \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pw@padd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).