From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com,
matheus.bernardino@usp.br, stolee@gmail.com,
Derrick Stolee <derrickstolee@github.com>,
Derrick Stolee <dstolee@microsoft.com>
Subject: Re: [PATCH v3 5/8] sparse-checkout: create helper methods
Date: Thu, 19 Aug 2021 10:07:46 +0200 (CEST) [thread overview]
Message-ID: <nycvar.QRO.7.76.6.2108191005560.55@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <5d28570c82af19b4bda4253e72ace3760dfe2606.1629206603.git.gitgitgadget@gmail.com>
Hi Stolee,
On Tue, 17 Aug 2021, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <dstolee@microsoft.com>
>
> As we integrate the sparse index into more builtins, we occasionally
> need to check the sparse-checkout patterns to see if a path is within
> the sparse-checkout cone. Create some helper methods that help
> initialize the patterns and check for pattern matching to make this
> easier.
>
> The existing callers of commands like get_sparse_checkout_patterns() use
> a custom 'struct pattern_list' that is not necessarily the one in the
> 'struct index_state', so there are not many previous uses that could
> adopt these helpers. There are just two in builtin/add.c and
> sparse-index.c that can use path_in_sparse_checkout().
Very good!
>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> builtin/add.c | 8 ++------
> dir.c | 33 +++++++++++++++++++++++++++++++++
> dir.h | 6 ++++++
> sparse-index.c | 12 +++---------
> 4 files changed, 44 insertions(+), 15 deletions(-)
>
> diff --git a/builtin/add.c b/builtin/add.c
> index 17528e8f922..f675bdeae4a 100644
> --- a/builtin/add.c
> +++ b/builtin/add.c
> @@ -190,8 +190,6 @@ static int refresh(int verbose, const struct pathspec *pathspec)
> struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
> int flags = REFRESH_IGNORE_SKIP_WORKTREE |
> (verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);
> - struct pattern_list pl = { 0 };
> - int sparse_checkout_enabled = !get_sparse_checkout_patterns(&pl);
>
> seen = xcalloc(pathspec->nr, 1);
> refresh_index(&the_index, flags, pathspec, seen,
> @@ -199,12 +197,10 @@ static int refresh(int verbose, const struct pathspec *pathspec)
> for (i = 0; i < pathspec->nr; i++) {
> if (!seen[i]) {
> const char *path = pathspec->items[i].original;
> - int dtype = DT_REG;
>
> if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
> - (sparse_checkout_enabled &&
> - !path_matches_pattern_list(path, strlen(path), NULL,
> - &dtype, &pl, &the_index))) {
> + (core_apply_sparse_checkout &&
Do we need to test for `core_apply_sparse_checkout` here? Or does the `if
(!istate->sparse_checkout_patterns) return MATCHED;` early return in
`path_in_sparse_checkout()` suffice to catch this?
The remainder of the patch looks good to me.
Thank you,
Dscho
> + path_in_sparse_checkout(path, &the_index) == NOT_MATCHED)) {
> string_list_append(&only_match_skip_worktree,
> pathspec->items[i].original);
> } else {
> diff --git a/dir.c b/dir.c
> index 03c4d212672..6fd4f2e0f27 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -1439,6 +1439,39 @@ done:
> return result;
> }
>
> +int init_sparse_checkout_patterns(struct index_state *istate)
> +{
> + if (!core_apply_sparse_checkout ||
> + istate->sparse_checkout_patterns)
> + return 0;
> +
> + CALLOC_ARRAY(istate->sparse_checkout_patterns, 1);
> +
> + if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0) {
> + FREE_AND_NULL(istate->sparse_checkout_patterns);
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +int path_in_sparse_checkout(const char *path,
> + struct index_state *istate)
> +{
> + const char *base;
> + int dtype = DT_REG;
> + init_sparse_checkout_patterns(istate);
> +
> + if (!istate->sparse_checkout_patterns)
> + return MATCHED;
> +
> + base = strrchr(path, '/');
> + return path_matches_pattern_list(path, strlen(path), base ? base + 1 : path,
> + &dtype,
> + istate->sparse_checkout_patterns,
> + istate) > 0;
> +}
> +
> static struct path_pattern *last_matching_pattern_from_lists(
> struct dir_struct *dir, struct index_state *istate,
> const char *pathname, int pathlen,
> diff --git a/dir.h b/dir.h
> index b3e1a54a971..b899ee43d81 100644
> --- a/dir.h
> +++ b/dir.h
> @@ -394,6 +394,12 @@ enum pattern_match_result path_matches_pattern_list(const char *pathname,
> const char *basename, int *dtype,
> struct pattern_list *pl,
> struct index_state *istate);
> +
> +int init_sparse_checkout_patterns(struct index_state *state);
> +
> +int path_in_sparse_checkout(const char *path,
> + struct index_state *istate);
> +
> struct dir_entry *dir_add_ignored(struct dir_struct *dir,
> struct index_state *istate,
> const char *pathname, int len);
> diff --git a/sparse-index.c b/sparse-index.c
> index b6e90417556..2efc9fd4910 100644
> --- a/sparse-index.c
> +++ b/sparse-index.c
> @@ -34,17 +34,14 @@ static int convert_to_sparse_rec(struct index_state *istate,
> int i, can_convert = 1;
> int start_converted = num_converted;
> enum pattern_match_result match;
> - int dtype = DT_UNKNOWN;
> struct strbuf child_path = STRBUF_INIT;
> - struct pattern_list *pl = istate->sparse_checkout_patterns;
>
> /*
> * Is the current path outside of the sparse cone?
> * Then check if the region can be replaced by a sparse
> * directory entry (everything is sparse and merged).
> */
> - match = path_matches_pattern_list(ct_path, ct_pathlen,
> - NULL, &dtype, pl, istate);
> + match = path_in_sparse_checkout(ct_path, istate);
> if (match != NOT_MATCHED)
> can_convert = 0;
>
> @@ -153,11 +150,8 @@ int convert_to_sparse(struct index_state *istate)
> if (!istate->repo->settings.sparse_index)
> return 0;
>
> - if (!istate->sparse_checkout_patterns) {
> - istate->sparse_checkout_patterns = xcalloc(1, sizeof(struct pattern_list));
> - if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0)
> - return 0;
> - }
> + if (init_sparse_checkout_patterns(istate) < 0)
> + return 0;
>
> /*
> * We need cone-mode patterns to use sparse-index. If a user edits
> --
> gitgitgadget
>
>
next prev parent reply other threads:[~2021-08-19 8:07 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-29 17:27 [PATCH 0/2] Sparse index: delete ignored files outside sparse cone Derrick Stolee via GitGitGadget
2021-07-29 17:27 ` [PATCH 1/2] t7519: rewrite sparse index test Derrick Stolee via GitGitGadget
2021-07-29 17:27 ` [PATCH 2/2] sparse-checkout: clear tracked sparse dirs Derrick Stolee via GitGitGadget
2021-07-30 13:52 ` Elijah Newren
2021-08-02 14:34 ` Derrick Stolee
2021-08-02 16:17 ` Elijah Newren
2021-08-05 1:55 ` Derrick Stolee
2021-08-05 3:54 ` Elijah Newren
2021-07-30 13:11 ` [PATCH 0/2] Sparse index: delete ignored files outside sparse cone Elijah Newren
2021-08-10 19:50 ` [PATCH v2 0/8] " Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 1/8] t7519: rewrite sparse index test Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 2/8] sparse-index: silently return when not using cone-mode patterns Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 3/8] sparse-index: silently return when cache tree fails Derrick Stolee via GitGitGadget
2021-08-19 18:24 ` Elijah Newren
2021-08-20 15:04 ` Derrick Stolee
2021-08-10 19:50 ` [PATCH v2 4/8] unpack-trees: fix nested sparse-dir search Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 5/8] sparse-checkout: create helper methods Derrick Stolee via GitGitGadget
2021-08-12 17:29 ` Derrick Stolee
2021-08-10 19:50 ` [PATCH v2 6/8] attr: be careful about sparse directories Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 7/8] sparse-index: add SPARSE_INDEX_IGNORE_CONFIG flag Derrick Stolee via GitGitGadget
2021-08-10 19:50 ` [PATCH v2 8/8] sparse-checkout: clear tracked sparse dirs Derrick Stolee via GitGitGadget
2021-08-17 13:23 ` [PATCH v3 0/8] Sparse index: delete ignored files outside sparse cone Derrick Stolee via GitGitGadget
2021-08-17 13:23 ` [PATCH v3 1/8] t7519: rewrite sparse index test Derrick Stolee via GitGitGadget
2021-08-19 7:45 ` Johannes Schindelin
2021-08-20 15:09 ` Derrick Stolee
2021-08-20 16:40 ` Eric Sunshine
2021-08-17 13:23 ` [PATCH v3 2/8] sparse-index: silently return when not using cone-mode patterns Derrick Stolee via GitGitGadget
2021-08-17 13:23 ` [PATCH v3 3/8] sparse-index: silently return when cache tree fails Derrick Stolee via GitGitGadget
2021-08-17 13:23 ` [PATCH v3 4/8] unpack-trees: fix nested sparse-dir search Derrick Stolee via GitGitGadget
2021-08-19 8:01 ` Johannes Schindelin
2021-08-20 15:18 ` Derrick Stolee
2021-08-20 19:35 ` René Scharfe
2021-08-20 20:22 ` René Scharfe
2021-08-19 18:29 ` Elijah Newren
2021-08-17 13:23 ` [PATCH v3 5/8] sparse-checkout: create helper methods Derrick Stolee via GitGitGadget
2021-08-19 8:07 ` Johannes Schindelin [this message]
2021-08-20 15:30 ` Derrick Stolee
2021-08-17 13:23 ` [PATCH v3 6/8] attr: be careful about sparse directories Derrick Stolee via GitGitGadget
2021-08-19 8:11 ` Johannes Schindelin
2021-08-20 15:36 ` Derrick Stolee
2021-08-19 20:53 ` Elijah Newren
2021-08-20 15:39 ` Derrick Stolee
2021-08-20 16:05 ` Elijah Newren
2021-08-17 13:23 ` [PATCH v3 7/8] sparse-index: add SPARSE_INDEX_IGNORE_CONFIG flag Derrick Stolee via GitGitGadget
2021-08-18 18:59 ` Derrick Stolee
2021-08-17 13:23 ` [PATCH v3 8/8] sparse-checkout: clear tracked sparse dirs Derrick Stolee via GitGitGadget
2021-08-19 8:48 ` Johannes Schindelin
2021-08-20 15:49 ` Derrick Stolee
2021-08-20 16:15 ` Elijah Newren
2021-08-20 15:56 ` Elijah Newren
2021-08-23 20:00 ` Johannes Schindelin
2021-08-17 14:09 ` [PATCH v3 0/8] Sparse index: delete ignored files outside sparse cone Elijah Newren
2021-08-24 21:51 ` [PATCH v4 00/10] " Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 01/10] t7519: rewrite sparse index test Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 02/10] sparse-index: silently return when not using cone-mode patterns Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 03/10] sparse-index: silently return when cache tree fails Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 04/10] sparse-index: use WRITE_TREE_MISSING_OK Derrick Stolee via GitGitGadget
2021-08-27 21:33 ` Elijah Newren
2021-08-30 13:19 ` Derrick Stolee
2021-08-30 20:08 ` Elijah Newren
2021-08-24 21:51 ` [PATCH v4 05/10] unpack-trees: fix nested sparse-dir search Derrick Stolee via GitGitGadget
2021-08-24 22:21 ` René Scharfe
2021-08-25 1:09 ` Derrick Stolee
2021-08-24 21:51 ` [PATCH v4 06/10] sparse-checkout: create helper methods Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 07/10] attr: be careful about sparse directories Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 08/10] sparse-index: add SPARSE_INDEX_MEMORY_ONLY flag Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 09/10] sparse-checkout: clear tracked sparse dirs Derrick Stolee via GitGitGadget
2021-08-24 21:51 ` [PATCH v4 10/10] sparse-checkout: add config to disable deleting dirs Derrick Stolee via GitGitGadget
2021-08-27 20:58 ` Elijah Newren
2021-08-30 13:30 ` Derrick Stolee
2021-08-30 20:11 ` Elijah Newren
2021-08-27 21:56 ` [PATCH v4 00/10] Sparse index: delete ignored files outside sparse cone Elijah Newren
2021-08-27 22:01 ` Elijah Newren
2021-08-30 13:34 ` Derrick Stolee
2021-08-30 20:14 ` Elijah Newren
2021-08-30 13:54 ` Derrick Stolee
2021-08-30 20:23 ` Elijah Newren
2021-09-08 1:42 ` [PATCH v5 0/9] " Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 1/9] t7519: rewrite sparse index test Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 2/9] sparse-index: silently return when not using cone-mode patterns Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 3/9] unpack-trees: fix nested sparse-dir search Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 4/9] sparse-index: silently return when cache tree fails Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 5/9] sparse-index: use WRITE_TREE_MISSING_OK Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 6/9] sparse-checkout: create helper methods Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 7/9] attr: be careful about sparse directories Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 8/9] sparse-index: add SPARSE_INDEX_MEMORY_ONLY flag Derrick Stolee via GitGitGadget
2021-09-08 1:42 ` [PATCH v5 9/9] sparse-checkout: clear tracked sparse dirs Derrick Stolee via GitGitGadget
2021-09-08 5:21 ` [PATCH v5 0/9] Sparse index: delete ignored files outside sparse cone Junio C Hamano
2021-09-08 6:56 ` Junio C Hamano
2021-09-08 11:39 ` Derrick Stolee
2021-09-08 16:11 ` Junio C Hamano
2021-09-08 5:30 ` Elijah Newren
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=nycvar.QRO.7.76.6.2108191005560.55@tvgsbejvaqbjf.bet \
--to=johannes.schindelin@gmx.de \
--cc=derrickstolee@github.com \
--cc=dstolee@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=matheus.bernardino@usp.br \
--cc=newren@gmail.com \
--cc=stolee@gmail.com \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).