pr-1018/derrickstolee/sparse-index/add-rm-mv-behavior-v3
tagged this
20 Sep 17:45
This series is based on ds/mergies-with-sparse-index. As requested, this series looks to update the behavior of git add, git rm, and git mv when they attempt to modify paths outside of the sparse-checkout cone. In particular, this care is expanded to not just cache entries with the SKIP_WORKTREE bit, but also paths that do not match the sparse-checkout definition. This means that commands that worked before this series can now fail. In particular, if 'git merge' results in a conflict outside of the sparse-checkout cone, then 'git add ' will now fail. In order to allow users to circumvent these protections, a new '--sparse' option is added that ignores the sparse-checkout patterns and the SKIP_WORKTREE bit. The message for advice.updateSparsePath is adjusted to assist with discovery of this option. There is a subtle issue with git mv in that it does not check the index until it discovers a directory and then uses the index to find the contained entries. This means that in non-cone-mode patterns, a pattern such as "sub/dir" will not match the path "sub" and this can cause an issue. In order to allow for checking arbitrary paths against the sparse-checkout patterns, some changes to the underlying pattern matching code is required. It turns out that there are some bugs in the methods as advertised, but these bugs were never discovered because of the way methods like unpack_trees() will check a directory for a pattern match before checking its contained paths. Our new "check patterns on-demand" approach pokes holes in that approach, specifically with patterns that match entire directories. Updates in v3 ============= * Fixed an incorrectly-squashed commit. Spread out some changes in a better way. For example, I don't add --sparse to tests before introducing the option. * Use a NULL struct strbuf pointer to indicate an uninitialized value instead of relying on an internal member. * Use grep over test_i18ngrep. * Fixed line wrapping for error messages. * Use strbuf_setlen() over modifying the len member manually. Updates in v2 ============= * I got no complaints about these restrictions, so this is now a full series, not RFC. * Thanks to Matheus, several holes are filled with extra testing and bugfixes. * New patches add --chmod and --renormalize improvements. These are added after the --sparse option to make them be one change each. Thanks, -Stolee Derrick Stolee (14): t3705: test that 'sparse_entry' is unstaged t1092: behavior for adding sparse files dir: extract directory-matching logic dir: select directories correctly dir: fix pattern matching on dirs add: fail when adding an untracked sparse file add: skip tracked paths outside sparse-checkout cone add: implement the --sparse option add: update --chmod to skip sparse paths add: update --renormalize to skip sparse paths rm: add --sparse option rm: skip sparse paths with missing SKIP_WORKTREE mv: refuse to move sparse paths advice: update message to suggest '--sparse' Documentation/git-add.txt | 9 +- Documentation/git-rm.txt | 6 + advice.c | 11 +- builtin/add.c | 32 +++- builtin/mv.c | 52 +++++-- builtin/rm.c | 10 +- dir.c | 56 ++++++- pathspec.c | 5 +- t/t1091-sparse-checkout-builtin.sh | 4 +- t/t1092-sparse-checkout-compatibility.sh | 75 +++++++-- t/t3602-rm-sparse-checkout.sh | 40 ++++- t/t3705-add-sparse-checkout.sh | 68 +++++++- t/t7002-mv-sparse-checkout.sh | 189 +++++++++++++++++++++++ 13 files changed, 505 insertions(+), 52 deletions(-) create mode 100755 t/t7002-mv-sparse-checkout.sh base-commit: 516680ba7704c473bb21628aa19cabbd787df4db Submitted-As: https://lore.kernel.org/git/pull.1018.v3.git.1632159937.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.1018.git.1629842085.gitgitgadget@gmail.com In-Reply-To: https://lore.kernel.org/git/pull.1018.v2.git.1631453010.gitgitgadget@gmail.com
Assets 2
-
2021-09-20T17:45:37Z -
2021-09-20T17:45:37Z - Loading