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 <redacted>
---
builtin/checkout-index.c | 5 ++++-
builtin/checkout.c | 2 ++
t/t2203-add-intent.sh | 34 ++++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 8028c37..eca975d 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -56,7 +56,8 @@ 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) ||
+ ce_intent_to_add(ce))
break;
has_same_name = 1;
pos++;@@ -99,6 +100,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 e1403be..02889d4 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -300,6 +300,8 @@ static int checkout_paths(const struct checkout_opts *opts,
* anything to this entry at all.
*/
continue;
+ if (ce_intent_to_add(ce))
+ continue;
/*
* Either this entry came from the tree-ish we are
* checking the paths out of, or we are checking out
diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh
index 96c8755..d0f36a4 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 &&
+ test_must_fail 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