Web lists-archives.com

RE: [PATCH 1/1] reset: fix reset when using the sparse-checkout feature.




From: Junio C Hamano [mailto:gitster@xxxxxxxxx]
Sent: Friday, September 8, 2017 1:02 PM
> Kevin Willford <kewillf@xxxxxxxxxxxxx> 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).
> 

Will update.

> > +
> > +		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?
> 

I don't believe so because if the user has a file there whether they modified
it or not, it is what the user did and we just leave it there and a diff with
what the index gets reset to will show how the file is different from what the
index got reset to.

> Other than that, the patch looks quite cleanly done and well explained.
> 
> Thanks.
>