From: Junio C Hamano <gitster@pobox.com>
To: Kevin Willford <kewillf@microsoft.com>
Cc: git@vger.kernel.org, peff@peff.net, pclouds@gmail.com
Subject: Re: [PATCH 1/1] reset: fix reset when using the sparse-checkout feature.
Date: Sat, 09 Sep 2017 04:01:37 +0900 [thread overview]
Message-ID: <xmqq4lsdypym.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20170908180050.25188-2-kewillf@microsoft.com> (Kevin Willford's message of "Fri, 8 Sep 2017 12:00:50 -0600")
Kevin Willford <kewillf@microsoft.com> writes:
> diff --git a/builtin/reset.c b/builtin/reset.c
> index d72c7d1c96..1b8bb45989 100644
> --- a/builtin/reset.c
> +++ b/builtin/reset.c
> @@ -24,6 +24,7 @@
> #include "cache-tree.h"
> #include "submodule.h"
> #include "submodule-config.h"
> +#include "dir.h"
>
> static const char * const git_reset_usage[] = {
> N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"),
> @@ -124,8 +125,32 @@ static void update_index_from_diff(struct diff_queue_struct *q,
>
> for (i = 0; i < q->nr; i++) {
> struct diff_filespec *one = q->queue[i]->one;
> + struct diff_filespec *two = q->queue[i]->two;
> + int pos;
> int is_missing = !(one->mode && !is_null_oid(&one->oid));
> + int was_missing = !two->mode && is_null_oid(&two->oid);
> struct cache_entry *ce;
> + struct cache_entry *ceBefore;
> + struct checkout state = CHECKOUT_INIT;
The five new variables are only used in the new block, so it
probably is better to limit their scope to the "we do something
unusual when sparse checkout is in effect" block as well. The scope
for the latter two can further be narrowed down to "we do need to
force a checkout of this entry" block.
We prefer to name our variables with underscore (e.g. ce_before)
over camelCase (e.g. ceBefore) unless there is a compelling reason
(e.g. a platform specific code in compat/ layer to match platform
convention).
> +
> + if (core_apply_sparse_checkout && !file_exists(two->path)) {
> + pos = cache_name_pos(two->path, strlen(two->path));
> + if ((pos >= 0 && ce_skip_worktree(active_cache[pos])) &&
> + (is_missing || !was_missing))
> + {
> + state.force = 1;
> + state.refresh_cache = 1;
> + state.istate = &the_index;
> + ceBefore = make_cache_entry(two->mode,
> + two->oid.hash,
> + two->path, 0, 0);
> + if (!ceBefore)
> + die(_("make_cache_entry failed for path '%s'"),
> + two->path);
> +
> + checkout_entry(ceBefore, &state, NULL);
> + }
> + }
Can we tell between the case where the reason why the path was not
there in the working tree was due to the path being excluded by the
sparse checkout and the path being removed manually by the end user?
I guess ce_skip_worktree() check is sufficient; we force checkout only
when the path is marked to be skipped due to "sparse" thing.
Do we have to worry about the reverse case, in which file_exists(two->path)
is true (i.e. the user created a file there manually) even though
the path is marked to be skipped due to "sparse" setting?
Other than that, the patch looks quite cleanly done and well explained.
Thanks.
> diff --git a/t/t7114-reset-sparse-checkout.sh b/t/t7114-reset-sparse-checkout.sh
> new file mode 100755
> index 0000000000..f2a5426847
> --- /dev/null
> +++ b/t/t7114-reset-sparse-checkout.sh
> @@ -0,0 +1,60 @@
> +#!/bin/sh
> +
> +test_description='reset when using a sparse-checkout'
> +
> +. ./test-lib.sh
> +
> +# reset using a sparse-checkout file
> +
> +test_expect_success 'setup' '
> + test_tick &&
> + echo "checkout file" >c &&
> + echo "modify file" >m &&
> + echo "delete file" >d &&
> + git add . &&
> + git commit -m "initial commit" &&
> + echo "added file" >a &&
> + echo "modification of a file" >m &&
> + git rm d &&
> + git add . &&
> + git commit -m "second commit" &&
> + git checkout -b endCommit
> +'
> +
> +test_expect_success 'reset when there is a sparse-checkout' '
> + echo "/c" >.git/info/sparse-checkout &&
> + test_config core.sparsecheckout true &&
> + git checkout -b resetBranch &&
> + test_path_is_missing m &&
> + test_path_is_missing a &&
> + test_path_is_missing d &&
> + git reset HEAD~1 &&
> + test "checkout file" = "$(cat c)" &&
> + test "modification of a file" = "$(cat m)" &&
> + test "added file" = "$(cat a)" &&
> + test_path_is_missing d
> +'
> +
> +test_expect_success 'reset after deleting file without skip-worktree bit' '
> + git checkout -f endCommit &&
> + git clean -xdf &&
> + cat >.git/info/sparse-checkout <<-\EOF &&
> + /c
> + /m
> + EOF
> + test_config core.sparsecheckout true &&
> + git checkout -b resetAfterDelete &&
> + test_path_is_file m &&
> + test_path_is_missing a &&
> + test_path_is_missing d &&
> + rm -f m &&
> + git reset HEAD~1 &&
> + test "checkout file" = "$(cat c)" &&
> + test "added file" = "$(cat a)" &&
> + test_path_is_missing m &&
> + test_path_is_missing d
> +'
> +
> +
> +
> +test_done
next prev parent reply other threads:[~2017-09-08 19:01 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-08 18:00 [PATCH 0/1] reset: fix mixed reset when using sparse-checkout Kevin Willford
2017-09-08 18:00 ` [PATCH 1/1] reset: fix reset when using the sparse-checkout feature Kevin Willford
2017-09-08 18:54 ` Torsten Bögershausen
2017-09-08 19:04 ` Junio C Hamano
2017-09-08 19:01 ` Junio C Hamano [this message]
2017-09-08 20:08 ` Kevin Willford
2017-09-08 19:12 ` Junio C Hamano
2017-09-08 20:02 ` Kevin Willford
2017-09-09 3:18 ` Junio C Hamano
2017-09-09 4:54 ` Kevin Willford
2017-09-11 4:01 ` Junio C Hamano
2017-09-11 11:15 ` Johannes Schindelin
2017-09-12 3:56 ` Junio C Hamano
2017-09-12 20:20 ` Kevin Willford
2017-09-12 22:29 ` Jacob Keller
2017-09-12 23:30 ` Kevin Willford
2017-09-13 1:39 ` Jacob Keller
2017-09-13 17:09 ` Kevin Willford
2017-09-13 22:17 ` Junio C Hamano
2017-09-14 14:26 ` Kevin Willford
2017-09-15 5:00 ` Junio C Hamano
2017-09-15 17:21 ` Kevin Willford
2017-09-15 21:33 ` Jacob Keller
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=xmqq4lsdypym.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=kewillf@microsoft.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/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.