sparse-checkout: avoid writing entries with the skip-worktree bit

When using the sparse-checkout feature git should not write to the working
directory for files with the skip-worktree bit on.  With the skip-worktree
bit on the file may or may not be in the working directory and if it is
not we don't want or need to create it by calling checkout_entry.

There are two callers of checkout_target.  Both of which check that the
file does not exist before calling checkout_target.  load_current which
make a call to lstat right before calling checkout_target and
check_preimage which will only run checkout_taret it stat_ret is less than
zero.  It sets stat_ret to zero and only if !stat->cached will it lstat
the file and set stat_ret to something other than zero.

This patch checks if skip-worktree bit is on in checkout_target and just
returns so that the entry doesn't not end up in the working directory.
This is so that apply will not create a file in the working directory,
then update the index but not keep the working directory up to date with
the changes that happened in the index.

Signed-off-by: Kevin Willford <kewillf@microsoft.com>
This commit is contained in:
Kevin Willford 2017-03-01 15:17:12 -08:00 коммит произвёл Johannes Schindelin
Родитель e9b8846220
Коммит 0f401ffd1f
1 изменённых файлов: 18 добавлений и 0 удалений

18
apply.c
Просмотреть файл

@ -3363,6 +3363,24 @@ static int checkout_target(struct index_state *istate,
{
struct checkout costate = CHECKOUT_INIT;
/*
* Do not checkout the entry if the skipworktree bit is set
*
* Both callers of this method (check_preimage and load_current)
* check for the existance of the file before calling this
* method so we know that the file doesn't exist at this point
* and we don't need to perform that check again here.
* We just need to check the skip-worktree and return.
*
* This is to prevent git from creating a file in the
* working directory that has the skip-worktree bit on,
* then updating the index from the patch and not keeping
* the working directory version up to date with what it
* changed the index version to be.
*/
if (ce_skip_worktree(ce))
return 0;
costate.refresh_cache = 1;
costate.istate = istate;
if (checkout_entry(ce, &costate, NULL, NULL) ||