From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: John Keeping <john@keeping.me.uk>,
David Turner <dturner@twopensource.com>,
David Turner <dturner@twitter.com>
Subject: [PATCH v2] cache-tree: do not try to use an invalidated subtree info to build a tree
Date: Tue, 02 Sep 2014 15:39:04 -0700 [thread overview]
Message-ID: <xmqqvbp5y7ef.fsf_-_@gitster.dls.corp.google.com> (raw)
In-Reply-To: <xmqq4mwpzpfw.fsf_-_@gitster.dls.corp.google.com> (Junio C. Hamano's message of "Tue, 02 Sep 2014 14:24:03 -0700")
We punt from repairing the cache-tree during a branch switching if
it involves having to create a new tree object that does not yet
exist in the object store. "mkdir dir && >dir/file && git add dir"
followed by "git checkout" is one example, when a tree that records
the state of such "dir/" is not in the object store.
However, after discovering that we do not have a tree object that
records the state of "dir/", the caller failed to remember the fact
that it noticed the cache-tree entry it received for "dir/" is
invalidated, it already knows it should not be populating the level
callchain to stop the code to attempt populating the level that has
"dir/" as its immediate subdirectory, and it is not an error at all
for the sublevel cache-tree entry gave it a bogus object name it
shouldn't even look at.
This led the caller detect and report a non-existent error. The end
result was the same and we avoided stuffing a non-existent tree to
the cache-tree, but we shouldn't have issued an alarming error
message to the user.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* Second try. The level that has intent-to-add entries needs to be
kept invalidated but the level above it needs to treat as if the
i-t-a entries do not exist and build the whole tree; a directory
that does not yet have corresponding tree object while repairing
the cache-tree needs to invalidate itself *and* propagate the
(in)validity upwards. They have to be treated differently but
the first attempt failed to do so.
cache-tree.c | 7 ++++++-
t/t0090-cache-tree.sh | 8 ++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/cache-tree.c b/cache-tree.c
index f951d7d..57597ac 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -316,6 +316,7 @@ static int update_one(struct cache_tree *it,
int pathlen, entlen;
const unsigned char *sha1;
unsigned mode;
+ int expected_missing = 0;
path = ce->name;
pathlen = ce_namelen(ce);
@@ -332,8 +333,10 @@ static int update_one(struct cache_tree *it,
i += sub->count;
sha1 = sub->cache_tree->sha1;
mode = S_IFDIR;
- if (sub->cache_tree->entry_count < 0)
+ if (sub->cache_tree->entry_count < 0) {
to_invalidate = 1;
+ expected_missing = 1;
+ }
}
else {
sha1 = ce->sha1;
@@ -343,6 +346,8 @@ static int update_one(struct cache_tree *it,
}
if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) {
strbuf_release(&buffer);
+ if (expected_missing)
+ return -1;
return error("invalid object %06o %s for '%.*s'",
mode, sha1_to_hex(sha1), entlen+baselen, path);
}
diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
index 48c4240..f9648a8 100755
--- a/t/t0090-cache-tree.sh
+++ b/t/t0090-cache-tree.sh
@@ -210,4 +210,12 @@ test_expect_success 'partial commit gives cache-tree' '
test_cache_tree
'
+test_expect_success 'no phantom error when switching trees' '
+ mkdir newdir &&
+ >newdir/one &&
+ git add newdir/one &&
+ git checkout 2>errors &&
+ ! test -s errors
+'
+
test_done
--
2.1.0-391-g57244f3
next prev parent reply other threads:[~2014-09-02 22:39 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-12 4:44 [PATCH v8 1/4] cache-tree: Create/update cache-tree on checkout David Turner
2014-07-12 4:44 ` [PATCH v8 2/4] test-dump-cache-tree: invalid trees are not errors David Turner
2014-07-12 4:44 ` [PATCH v8 3/4] cache-tree: subdirectory tests David Turner
2014-07-12 4:44 ` [PATCH v8 4/4] cache-tree: Write updated cache-tree after commit David Turner
2014-07-13 5:09 ` Duy Nguyen
2014-07-14 15:54 ` Junio C Hamano
2014-07-14 17:33 ` Ramsay Jones
2014-07-14 17:51 ` Junio C Hamano
2014-07-14 18:41 ` Ramsay Jones
2014-07-14 22:16 ` Junio C Hamano
2014-07-14 22:32 ` David Turner
2014-07-15 2:15 ` Duy Nguyen
2014-07-15 6:38 ` Junio C Hamano
2014-07-15 10:23 ` Duy Nguyen
2014-07-15 16:45 ` Junio C Hamano
2014-07-16 10:18 ` Duy Nguyen
2014-07-16 17:33 ` Junio C Hamano
2014-07-14 17:43 ` Junio C Hamano
2014-07-14 20:19 ` [PATCH v2] lockfile: allow reopening a closed but still locked file Junio C Hamano
2014-08-31 12:07 ` [PATCH v8 1/4] cache-tree: Create/update cache-tree on checkou John Keeping
2014-09-01 20:49 ` David Turner
2014-09-01 22:13 ` John Keeping
2014-09-02 20:52 ` Junio C Hamano
2014-09-02 21:10 ` Junio C Hamano
2014-09-02 21:24 ` [PATCH] cache-tree: propagate invalidation up when punting Junio C Hamano
2014-09-02 22:39 ` Junio C Hamano [this message]
2014-09-03 2:56 ` [PATCH v2] cache-tree: do not try to use an invalidated subtree info to build a tree David Turner
2014-09-03 12:02 ` Eric Sunshine
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=xmqqvbp5y7ef.fsf_-_@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=dturner@twitter.com \
--cc=dturner@twopensource.com \
--cc=git@vger.kernel.org \
--cc=john@keeping.me.uk \
/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.