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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.