From ec5b64f53c415bf9a0b65c7ace3b2d7c7b8b73a6 Mon Sep 17 00:00:00 2001 From: Derrick Stolee Date: Tue, 29 Jun 2021 11:12:56 -0400 Subject: [PATCH] add/rm: allow adding sparse entries when virtual Upstream, a20f704 (add: warn when asked to update SKIP_WORKTREE entries, 2021-04-08) modified how 'git add ' works with cache entries marked with the SKIP_WORKTREE bit. The intention is to prevent a user from accidentally adding a path that is outside their sparse-checkout definition but somehow matches an existing index entry. A similar change for 'git rm' happened in d5f4b82 (rm: honor sparse checkout patterns, 2021-04-08). This breaks when using the virtual filesystem in VFS for Git. It is rare, but we could be in a scenario where the user has staged a change and then the file is projected away. If the user re-adds the file, then this warning causes the command to fail with the advise message. Disable this logic when core_virtualfilesystem is enabled. Signed-off-by: Derrick Stolee --- builtin/add.c | 13 ++++++++++--- builtin/rm.c | 8 ++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index 7386e44dbaea25..1dd20ad9cc3959 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -208,7 +208,11 @@ static int refresh(int verbose, const struct pathspec *pathspec) } } - if (only_match_skip_worktree.nr) { + /* + * When using a virtual filesystem, we might re-add a path + * that is currently virtual and we want that to succeed. + */ + if (only_match_skip_worktree.nr && !core_virtualfilesystem) { advise_on_updating_sparse_paths(&only_match_skip_worktree); ret = 1; } @@ -652,8 +656,11 @@ int cmd_add(int argc, const char **argv, const char *prefix) } } - - if (only_match_skip_worktree.nr) { + /* + * When using a virtual filesystem, we might re-add a path + * that is currently virtual and we want that to succeed. + */ + if (only_match_skip_worktree.nr && !core_virtualfilesystem) { advise_on_updating_sparse_paths(&only_match_skip_worktree); exit_status = 1; } diff --git a/builtin/rm.c b/builtin/rm.c index 8a24c715e02bab..e08e8014731b77 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -298,7 +298,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix) ensure_full_index(&the_index); for (i = 0; i < active_nr; i++) { const struct cache_entry *ce = active_cache[i]; - if (ce_skip_worktree(ce)) + if (!core_virtualfilesystem && ce_skip_worktree(ce)) continue; if (!ce_path_match(&the_index, ce, &pathspec, seen)) continue; @@ -332,7 +332,11 @@ int cmd_rm(int argc, const char **argv, const char *prefix) *original ? original : "."); } - if (only_match_skip_worktree.nr) { + /* + * When using a virtual filesystem, we might re-add a path + * that is currently virtual and we want that to succeed. + */ + if (only_match_skip_worktree.nr && !core_virtualfilesystem) { advise_on_updating_sparse_paths(&only_match_skip_worktree); ret = 1; }