From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 5/6] checkout(-index): do not checkout i-t-a entries
Date: Sun, 27 Dec 2015 08:51:31 +0700 [thread overview]
Message-ID: <1451181092-26054-6-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1451181092-26054-1-git-send-email-pclouds@gmail.com>
The cached blob of i-t-a entries are empty blob. By checkout, we delete
the content we have. Don't do it.
This is done higher up instead of inside checkout_entry() because we
would have limited options in there: silently ignore, loudly ignore,
die. At higher level we can do better reporting. For example, "git
checkout -- foo" will complain that "foo" does not match pathspec, just
like when "foo" is not registered with "git add -N"
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout-index.c | 12 ++++++++++--
builtin/checkout.c | 9 ++++++---
t/t2203-add-intent.sh | 34 ++++++++++++++++++++++++++++++++++
3 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 9ca2da1..d9fe8f4 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -48,6 +48,7 @@ static int checkout_file(const char *name, const char *prefix)
int pos = cache_name_pos(name, namelen);
int has_same_name = 0;
int did_checkout = 0;
+ int has_intent_to_add = 0;
int errs = 0;
if (pos < 0)
@@ -56,8 +57,11 @@ static int checkout_file(const char *name, const char *prefix)
while (pos < active_nr) {
struct cache_entry *ce = active_cache[pos];
if (ce_namelen(ce) != namelen ||
- memcmp(ce->name, name, namelen))
+ memcmp(ce->name, name, namelen)) {
+ if (ce_intent_to_add(ce))
+ has_intent_to_add = 1;
break;
+ }
has_same_name = 1;
pos++;
if (ce_stage(ce) != checkout_stage
@@ -77,7 +81,9 @@ static int checkout_file(const char *name, const char *prefix)
if (!state.quiet) {
fprintf(stderr, "git checkout-index: %s ", name);
- if (!has_same_name)
+ if (has_intent_to_add)
+ fprintf(stderr, "is not yet in the cache");
+ else if (!has_same_name)
fprintf(stderr, "is not in the cache");
else if (checkout_stage)
fprintf(stderr, "does not exist at stage %d",
@@ -99,6 +105,8 @@ static void checkout_all(const char *prefix, int prefix_length)
if (ce_stage(ce) != checkout_stage
&& (CHECKOUT_ALL != checkout_stage || !ce_stage(ce)))
continue;
+ if (ce_intent_to_add(ce))
+ continue;
if (prefix && *prefix &&
(ce_namelen(ce) <= prefix_length ||
memcmp(prefix, ce->name, prefix_length)))
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 3e141fc..ac37d92 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -328,12 +328,15 @@ static int checkout_paths(const struct checkout_opts *opts,
if (opts->merge)
unmerge_marked_index(&the_index);
- /* Any unmerged paths? */
for (pos = 0; pos < active_nr; pos++) {
- const struct cache_entry *ce = active_cache[pos];
+ struct cache_entry *ce = active_cache[pos];
if (ce->ce_flags & CE_MATCHED) {
- if (!ce_stage(ce))
+ if (!ce_stage(ce)) {
+ if (ce_intent_to_add(ce))
+ ce->ce_flags &= ~CE_MATCHED;
continue;
+ }
+ /* Unmerged paths */
if (opts->force) {
warning(_("path '%s' is unmerged"), ce->name);
} else if (opts->writeout_stage) {
diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh
index 96c8755..52e9f7f 100755
--- a/t/t2203-add-intent.sh
+++ b/t/t2203-add-intent.sh
@@ -111,5 +111,39 @@ test_expect_success 'apply:check_preimage() not creating empty file' '
)
'
+test_expect_success 'checkout ignores i-t-a' '
+ git init checkout &&
+ (
+ cd checkout &&
+ echo data >file &&
+ git add -N file &&
+ git checkout -- file &&
+ echo data >expected &&
+ test_cmp expected file
+ )
+'
+
+test_expect_success 'checkout-index ignores i-t-a' '
+ (
+ cd checkout &&
+ git checkout-index file &&
+ echo data >expected &&
+ test_cmp expected file
+ )
+'
+
+test_expect_success 'checkout-index --all ignores i-t-a' '
+ (
+ cd checkout &&
+ echo data >anotherfile &&
+ git add anotherfile &&
+ rm anotherfile &&
+ git checkout-index --all &&
+ echo data >expected &&
+ test_cmp expected file &&
+ test_cmp expected anotherfile
+ )
+'
+
test_done
--
2.3.0.rc1.137.g477eb31
next prev parent reply other threads:[~2015-12-27 1:52 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-27 1:51 [PATCH 0/6] nd/ita-cleanup updates Nguyễn Thái Ngọc Duy
2015-12-27 1:51 ` [PATCH 1/6] blame: remove obsolete comment Nguyễn Thái Ngọc Duy
2015-12-28 17:35 ` Junio C Hamano
2015-12-27 1:51 ` [PATCH 2/6] Add and use convenient macro ce_intent_to_add() Nguyễn Thái Ngọc Duy
2015-12-28 17:53 ` Junio C Hamano
2015-12-27 1:51 ` [PATCH 3/6] apply: fix adding new files on i-t-a entries Nguyễn Thái Ngọc Duy
2015-12-28 3:01 ` Junio C Hamano
2015-12-29 14:02 ` Duy Nguyen
2015-12-29 17:40 ` Junio C Hamano
2015-12-27 1:51 ` [PATCH 4/6] apply: make sure check_preimage() does not leave empty file on error Nguyễn Thái Ngọc Duy
2015-12-28 18:35 ` Junio C Hamano
2015-12-27 1:51 ` Nguyễn Thái Ngọc Duy [this message]
2015-12-28 19:56 ` [PATCH 5/6] checkout(-index): do not checkout i-t-a entries Junio C Hamano
2015-12-27 1:51 ` [PATCH 6/6] grep: make it clear i-t-a entries are ignored Nguyễn Thái Ngọc Duy
2015-12-28 19:59 ` Junio C Hamano
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=1451181092-26054-6-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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).