From: Junio C Hamano <gitster@pobox.com>
To: David Turner <dturner@twopensource.com>
Cc: git@vger.kernel.org, David Turner <dturner@twitter.com>
Subject: Re: [PATCH v4 4/4] cache-tree: Write updated cache-tree after commit
Date: Mon, 07 Jul 2014 13:03:28 -0700 [thread overview]
Message-ID: <xmqq61j9c4xb.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1404619619-4774-4-git-send-email-dturner@twitter.com> (David Turner's message of "Sat, 5 Jul 2014 21:06:59 -0700")
David Turner <dturner@twopensource.com> writes:
> During the commit process, update the cache-tree. Write this updated
> cache-tree so that it's ready for subsequent commands.
>
> Add test code which demonstrates that git commit now writes the cache
> tree. Make all tests test the entire cache-tree, not just the root
> level.
>
> Signed-off-by: David Turner <dturner@twitter.com>
> ---
> builtin/commit.c | 31 +++++++++++-------
> t/t0090-cache-tree.sh | 87 ++++++++++++++++++++++++++++++++++++++++++---------
> 2 files changed, 91 insertions(+), 27 deletions(-)
>
> diff --git a/builtin/commit.c b/builtin/commit.c
> index 9cfef6c..5981755 100644
> --- a/builtin/commit.c
> +++ b/builtin/commit.c
> @@ -342,6 +342,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
>
> discard_cache();
> read_cache_from(index_lock.filename);
> + if (update_main_cache_tree(WRITE_TREE_SILENT) >= 0)
> + write_cache(fd, active_cache, active_nr);
>
> commit_style = COMMIT_NORMAL;
> return index_lock.filename;
> @@ -363,10 +365,18 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
> fd = hold_locked_index(&index_lock, 1);
> add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
> refresh_cache_or_die(refresh_flags);
> - update_main_cache_tree(WRITE_TREE_SILENT);
> - if (write_cache(fd, active_cache, active_nr) ||
> - close_lock_file(&index_lock))
> - die(_("unable to write new_index file"));
> + if (active_cache_changed
> + || !cache_tree_fully_valid(active_cache_tree)) {
> + update_main_cache_tree(WRITE_TREE_SILENT);
> + active_cache_changed = 1;
> + }
> + if (active_cache_changed) {
> + if (write_cache(fd, active_cache, active_nr) ||
> + close_lock_file(&index_lock))
> + die(_("unable to write new_index file"));
> + } else {
> + rollback_lock_file(&index_lock);
> + }
> commit_style = COMMIT_NORMAL;
> return index_lock.filename;
> }
> @@ -383,14 +393,10 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
> if (!only && !pathspec.nr) {
> fd = hold_locked_index(&index_lock, 1);
> refresh_cache_or_die(refresh_flags);
> - if (active_cache_changed) {
> - update_main_cache_tree(WRITE_TREE_SILENT);
> - if (write_cache(fd, active_cache, active_nr) ||
> - commit_locked_index(&index_lock))
> - die(_("unable to write new_index file"));
> - } else {
> - rollback_lock_file(&index_lock);
> - }
> + update_main_cache_tree(WRITE_TREE_SILENT);
> + if (write_cache(fd, active_cache, active_nr) ||
> + commit_locked_index(&index_lock))
> + die(_("unable to write new_index file"));
> commit_style = COMMIT_AS_IS;
> return get_index_file();
> }
Hmph. The above two hunks somehow feel the other way around. When
doing a non-partial, non as-is commit, i.e. "git commit $paths", the
original used to call 'write-cache' unconditionally, because it is
very unlikely for us to see !active_cache_changed after calling the
add-files-to-cache with user-supplied pathspec (if there is nothing
to change, the user is being silly to say "git commit $paths" in the
first place). I would have expected that the patch would have left
that code path alone (it seems to be doing the right thing already).
On the other hand, "git commit" to commit the contents of the index
as-is is being cautious not to write things out unnecessarily, but
as you found out, it would be a good idea to fully populate the
cache-tree in this code path and write the otherwise already-good
index file out, even if we see !active_cache_changed after we called
refresh_cache_or_die(). So I would have expected that the patch
would have kept the "write only necessary" carefulness instead of
calling write-cache unconditionally.
That is, something like:
fd = hold_locked_index();
refresh_cache_or_die();
+ if (!cache_tree_fully_valid())
+ active_cache_changed = 1;
if (active_cache_changed) {
update_main_cache_tree();
> diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
> index 8437c5f..15f1484 100755
> --- a/t/t0090-cache-tree.sh
> +++ b/t/t0090-cache-tree.sh
> @@ -7,8 +7,14 @@ cache-tree extension.
> "
> . ./test-lib.sh
>
> +grep_nonmatch_ok () {
> + grep $@
dq around it, i.e. "$@".
> + test "$?" = "2" && return 1
POSIX.1 only specifies >1 not necessarily 2 as an error status.
> + return 0
> +}
Having said all that I do not think the helper is unnecessary. Just
use something like
sed -e '/#(ref)/d'
> cmp_cache_tree () {
> - test-dump-cache-tree >actual &&
> + test-dump-cache-tree | grep_nonmatch_ok -v \#\(ref\) >actual &&
next prev parent reply other threads:[~2014-07-07 20:03 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-06 4:06 [PATCH v4 1/4] cache-tree: Create/update cache-tree on checkout David Turner
2014-07-06 4:06 ` [PATCH v4 2/4] test-dump-cache-tree: invalid trees are not errors David Turner
2014-07-07 19:27 ` Junio C Hamano
2014-07-06 4:06 ` [PATCH v4 3/4] cache-tree: subdirectory tests David Turner
2014-07-06 8:10 ` Eric Sunshine
2014-07-07 19:15 ` Junio C Hamano
2014-07-06 4:06 ` [PATCH v4 4/4] cache-tree: Write updated cache-tree after commit David Turner
2014-07-07 20:03 ` Junio C Hamano [this message]
2014-07-08 0:26 ` Junio C Hamano
2014-07-08 10:32 ` Duy Nguyen
2014-07-08 17:05 ` Junio C Hamano
2014-07-09 1:58 ` Duy Nguyen
2014-07-08 18:32 ` Junio C Hamano
2014-07-08 19:15 ` Junio C Hamano
2014-07-07 18:58 ` [PATCH v4 1/4] cache-tree: Create/update cache-tree on checkout 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=xmqq61j9c4xb.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=dturner@twitter.com \
--cc=dturner@twopensource.com \
--cc=git@vger.kernel.org \
/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.