All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matheus Tavares <matheus.bernardino@usp.br>
To: git@vger.kernel.org
Cc: gitster@pobox.com, stolee@gmail.com, newren@gmail.com,
	jonathantanmy@google.com, jrnieder@gmail.com,
	sunshine@sunshineco.com
Subject: [PATCH v6 0/9] grep: honor sparse checkout and add option to ignore it
Date: Thu, 10 Sep 2020 14:21:19 -0300	[thread overview]
Message-ID: <cover.1599758167.git.matheus.bernardino@usp.br> (raw)
In-Reply-To: <cover.1599026986.git.matheus.bernardino@usp.br>

This series makes git-grep restrict its output to the sparsity patterns when
requested by the user. A new global option is added to control this behavior
in grep and hopefully more commands in the future. There is also a fix in
config.c, to correctly read worktree-specific settings on submodules.

Changes since v5:

Patch 2:
- Avoid complex '\'quoting\'' by using '.', as the string is going to
  be used in a grep search.
- Split the check_config auxiliary function into two, to remove some
  unecessary logic and future-proof them against wrong usages of
  test-config.

Patch 4: reword commit message to focus on correctly diagnosing missing
         arguments.

Patch 5: don't replace explicit `return 0` with `return ret`.

Added patch 6, passing a `struct repository` to do_git_config_sequence().

Patch 6:
- Removed global `repository_format_worktree_config` and cached
  extensions.worktreeConfig value in `struct repository`, to avoid repeating
  repository format discovery.
- Improved commit message as suggested by Jonathan.
- Use usage_with_options()


Jonathan Nieder (1):
  config: make do_git_config_sequence receive a 'struct repository'

Matheus Tavares (8):
  doc: grep: unify info on configuration variables
  t1308-config-set: avoid false positives when using test-config
  t/helper/test-config: be consistent with exit codes
  t/helper/test-config: diagnose missing arguments
  t/helper/test-config: unify exit labels
  config: correctly read worktree configs in submodules
  grep: honor sparse checkout patterns
  config: add setting to ignore sparsity patterns in some cmds

 Documentation/config.txt               |   2 +
 Documentation/config/grep.txt          |  18 +-
 Documentation/config/sparse.txt        |  20 ++
 Documentation/git-grep.txt             |  36 +--
 Documentation/git.txt                  |   4 +
 Makefile                               |   1 +
 builtin/config.c                       |   8 +-
 builtin/grep.c                         | 134 ++++++++++-
 cache.h                                |   1 -
 config.c                               |  47 ++--
 config.h                               |   4 +-
 contrib/completion/git-completion.bash |   2 +
 environment.c                          |   1 -
 git.c                                  |   5 +
 repository.c                           |   1 +
 repository.h                           |   1 +
 setup.c                                |   4 +-
 sparse-checkout.c                      |  18 ++
 sparse-checkout.h                      |  11 +
 t/helper/test-config.c                 | 124 ++++++----
 t/t1308-config-set.sh                  |  28 +--
 t/t2404-worktree-config.sh             |  16 ++
 t/t7011-skip-worktree-reading.sh       |   9 -
 t/t7817-grep-sparse-checkout.sh        | 321 +++++++++++++++++++++++++
 t/t9902-completion.sh                  |   4 +-
 25 files changed, 682 insertions(+), 138 deletions(-)
 create mode 100644 Documentation/config/sparse.txt
 create mode 100644 sparse-checkout.c
 create mode 100644 sparse-checkout.h
 create mode 100755 t/t7817-grep-sparse-checkout.sh

Range-diff against v5:
 1:  70c9a4e741 =  1:  70c9a4e741 doc: grep: unify info on configuration variables
 2:  f53782f14c <  -:  ---------- t1308-config-set: avoid false positives when using test-config
 -:  ---------- >  2:  3c2d722152 t1308-config-set: avoid false positives when using test-config
 3:  85e1588d6c =  3:  45d13744b7 t/helper/test-config: be consistent with exit codes
 4:  0750191342 !  4:  51656e43c3 t/helper/test-config: check argc before accessing argv
    @@ Metadata
     Author: Matheus Tavares <matheus.bernardino@usp.br>
     
      ## Commit message ##
    -    t/helper/test-config: check argc before accessing argv
    +    t/helper/test-config: diagnose missing arguments
     
    -    Check that we have the expected argc in 'configset_get_value' and
    -    'configset_get_value_multi' before trying to access argv elements.
    +    test-config verifies that the correct number of arguments was given for
    +    all of its commands except for 'configset_get_value' and
    +    'configset_get_value_multi'. Add the check to these two, so that we
    +    properly report missing arguments and prevent out-of-bounds access to
    +    argv[].
     
         Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
     
 5:  56535b0e36 !  5:  924d2e8ceb t/helper/test-config: unify exit labels
    @@ t/helper/test-config.c: static int early_config_cb(const char *var, const char *
      	const char *v;
      	const struct string_list *strptr;
      	struct config_set cs;
    - 
    - 	if (argc == 3 && !strcmp(argv[1], "read_early_config")) {
    - 		read_early_config(early_config_cb, (void *)argv[2]);
    --		return 0;
    -+		return ret;
    - 	}
    - 
    - 	setup_git_directory();
     @@ t/helper/test-config.c: int cmd__config(int argc, const char **argv)
      				printf("(NULL)\n");
      			else
 -:  ---------- >  6:  f5c0fc3336 config: make do_git_config_sequence receive a 'struct repository'
 6:  3e02e1bd24 !  7:  3a28b8e608 config: correctly read worktree configs in submodules
    @@ Commit message
         config: correctly read worktree configs in submodules
     
         The config machinery is not able to read worktree configs from a
    -    submodule in a process where the_repository represents the superproject.
    -    Furthermore, when extensions.worktreeConfig is set on the superproject,
    -    querying for a worktree config in a submodule will, instead, return
    -    the value set at the superproject.
    -
    -    The problem resides in do_git_config_sequence(). Although the function
    -    receives a git_dir string, it uses the_repository->git_dir when making
    -    the path to the worktree config file. And when checking if
    -    extensions.worktreeConfig is set, it uses the global
    -    repository_format_worktree_config variable, which refers to
    -    the_repository only. So let's fix this by using the git_dir given to the
    -    function and reading the extension value from the right place. Also add
    -    a test to avoid any regressions.
    +    submodule in a process where the_repository represents the superproject
    +    and extensions.worktreeConfig is not set there. Furthermore, when
    +    extensions.worktreeConfig is set on the superproject, querying for a
    +    worktree config in a submodule will, instead, return the value set at
    +    the superproject.
    +
    +    The relevant code is in do_git_config_sequence(). Although it is
    +    designed to act on an arbitrary repository, specified in the passed-in
    +    `struct config_options`, it accidentally depends on the_repository in
    +    two places:
    +
    +    - it reads the global variable `repository_format_worktree_config`,
    +      which is set based on the content of the_repository, to determine
    +      whether extensions.worktreeConfig is set.
    +
    +    - it uses the git_pathdup() helper to find the config.worktree file,
    +      instead of making a path using the passed-in repository.
    +
    +    Sever these dependencies and add a regression test. Also, to avoid
    +    future misuses of `repository_format_worktree_config` like this one,
    +    remove this global variable and store the config value on
    +    `struct repository` itself.
     
         Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
     
    + ## builtin/config.c ##
    +@@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix)
    + 		given_config_source.scope = CONFIG_SCOPE_LOCAL;
    + 	} else if (use_worktree_config) {
    + 		struct worktree **worktrees = get_worktrees();
    +-		if (repository_format_worktree_config)
    ++		if (!nongit && the_repository->worktree_config_extension)
    + 			given_config_source.file = git_pathdup("config.worktree");
    + 		else if (worktrees[0] && worktrees[1])
    + 			die(_("--worktree cannot be used with multiple "
    +
    + ## cache.h ##
    +@@ cache.h: extern int grafts_replace_parents;
    + #define GIT_REPO_VERSION 0
    + #define GIT_REPO_VERSION_READ 1
    + extern int repository_format_precious_objects;
    +-extern int repository_format_worktree_config;
    + 
    + /*
    +  * You _have_ to initialize a `struct repository_format` using
    +
      ## config.c ##
     @@ config.c: static int do_git_config_sequence(const struct config_options *opts,
      		ret += git_config_from_file(fn, repo_config, data);
    @@ config.c: static int do_git_config_sequence(const struct config_options *opts,
     -		if (!access_or_die(path, R_OK, 0))
     -			ret += git_config_from_file(fn, path, data);
     -		free(path);
    -+	if (!opts->ignore_worktree && repo_config && opts->git_dir) {
    -+		struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
    -+		struct strbuf buf = STRBUF_INIT;
    -+
    -+		read_repository_format(&repo_fmt, repo_config);
    -+
    -+		if (!verify_repository_format(&repo_fmt, &buf) &&
    -+		    repo_fmt.worktree_config) {
    -+			char *path = mkpathdup("%s/config.worktree", opts->git_dir);
    -+			if (!access_or_die(path, R_OK, 0))
    -+				ret += git_config_from_file(fn, path, data);
    -+			free(path);
    -+		}
    -+
    -+		strbuf_release(&buf);
    -+		clear_repository_format(&repo_fmt);
    ++	if (!opts->ignore_worktree && opts->repo && opts->repo->gitdir &&
    ++	    opts->repo->worktree_config_extension) {
    ++		struct strbuf path = STRBUF_INIT;
    ++		strbuf_repo_git_path(&path, opts->repo, "config.worktree");
    ++		if (!access_or_die(path.buf, R_OK, 0))
    ++			ret += git_config_from_file(fn, path.buf, data);
    ++		strbuf_release(&path);
      	}
      
      	current_parsing_scope = CONFIG_SCOPE_COMMAND;
     
    + ## environment.c ##
    +@@ environment.c: int warn_ambiguous_refs = 1;
    + int warn_on_object_refname_ambiguity = 1;
    + int ref_paranoia = -1;
    + int repository_format_precious_objects;
    +-int repository_format_worktree_config;
    + const char *git_commit_encoding;
    + const char *git_log_output_encoding;
    + char *apply_default_whitespace;
    +
    + ## repository.c ##
    +@@ repository.c: int repo_init(struct repository *repo,
    + 		goto error;
    + 
    + 	repo_set_hash_algo(repo, format.hash_algo);
    ++	repo->worktree_config_extension = format.worktree_config;
    + 
    + 	if (worktree)
    + 		repo_set_worktree(repo, worktree);
    +
    + ## repository.h ##
    +@@ repository.h: struct repository {
    + 
    + 	/* Indicate if a repository has a different 'commondir' from 'gitdir' */
    + 	unsigned different_commondir:1;
    ++	unsigned worktree_config_extension:1;
    + };
    + 
    + extern struct repository *the_repository;
    +
    + ## setup.c ##
    +@@ setup.c: static int check_repository_format_gently(const char *gitdir, struct repository_
    + 
    + 	repository_format_precious_objects = candidate->precious_objects;
    + 	set_repository_format_partial_clone(candidate->partial_clone);
    +-	repository_format_worktree_config = candidate->worktree_config;
    ++	the_repository->worktree_config_extension = candidate->worktree_config;
    + 	string_list_clear(&candidate->unknown_extensions, 0);
    + 	string_list_clear(&candidate->v1_only_extensions, 0);
    + 
    +-	if (repository_format_worktree_config) {
    ++	if (the_repository->worktree_config_extension) {
    + 		/*
    + 		 * pick up core.bare and core.worktree from per-worktree
    + 		 * config if present
    +
      ## t/helper/test-config.c ##
     @@
      #include "cache.h"
    @@ t/helper/test-config.c: static int early_config_cb(const char *var, const char *
     +	argc = parse_options(argc, argv, NULL, options, test_config_usage,
     +			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_STOP_AT_NON_OPTION);
     +	if (argc < 2)
    -+		die("Please, provide a command name on the command-line");
    ++		usage_with_options(test_config_usage, options);
      
      	if (argc == 3 && !strcmp(argv[1], "read_early_config")) {
     +		if (subrepo_path)
     +			die("cannot use --submodule with read_early_config");
      		read_early_config(early_config_cb, (void *)argv[2]);
    - 		return ret;
    + 		return 0;
      	}
     @@ t/helper/test-config.c: int cmd__config(int argc, const char **argv)
      
 7:  902556a7b6 =  8:  2fc889c9c2 grep: honor sparse checkout patterns
 8:  70e7d7b90c =  9:  92bc5351cf config: add setting to ignore sparsity patterns in some cmds
-- 
2.28.0


  parent reply	other threads:[~2020-09-10 17:22 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-24  6:04 [RFC PATCH 0/3] grep: honor sparse checkout and add option to ignore it Matheus Tavares
2020-03-24  6:11 ` [RFC PATCH 1/3] doc: grep: unify info on configuration variables Matheus Tavares
2020-03-24  7:57   ` Elijah Newren
2020-03-24 21:26     ` Junio C Hamano
2020-03-24 23:38       ` Matheus Tavares
2020-03-24  6:12 ` [RFC PATCH 2/3] grep: honor sparse checkout patterns Matheus Tavares
2020-03-24  7:15   ` Elijah Newren
2020-03-24 15:12     ` Derrick Stolee
2020-03-24 16:16       ` Elijah Newren
2020-03-24 17:02         ` Derrick Stolee
2020-03-24 23:01       ` Matheus Tavares Bernardino
2020-03-24 22:55     ` Matheus Tavares Bernardino
2020-04-21  2:10       ` Matheus Tavares Bernardino
2020-04-21  3:08         ` Elijah Newren
2020-04-22 12:08           ` Derrick Stolee
2020-04-23  6:09           ` Matheus Tavares Bernardino
2020-03-24  6:13 ` [RFC PATCH 3/3] grep: add option to ignore sparsity patterns Matheus Tavares
2020-03-24  7:54   ` Elijah Newren
2020-03-24 18:30     ` Junio C Hamano
2020-03-24 19:07       ` Elijah Newren
2020-03-25 20:18         ` Junio C Hamano
2020-03-30  3:23       ` Matheus Tavares Bernardino
2020-03-31 19:12         ` Elijah Newren
2020-03-31 20:02           ` Derrick Stolee
2020-04-27 17:15             ` Matheus Tavares Bernardino
2020-04-29 16:46               ` Elijah Newren
2020-04-29 17:21             ` Elijah Newren
2020-03-25 23:15     ` Matheus Tavares Bernardino
2020-03-26  6:02       ` Elijah Newren
2020-03-27 15:51         ` Junio C Hamano
2020-03-27 19:01           ` Elijah Newren
2020-03-30  1:12         ` Matheus Tavares Bernardino
2020-03-31 16:48           ` Elijah Newren
2020-05-10  0:41 ` [RFC PATCH v2 0/4] grep: honor sparse checkout and add option to ignore it Matheus Tavares
2020-05-10  0:41   ` [RFC PATCH v2 1/4] doc: grep: unify info on configuration variables Matheus Tavares
2020-05-10  0:41   ` [RFC PATCH v2 2/4] config: load the correct config.worktree file Matheus Tavares
2020-05-11 19:10     ` Junio C Hamano
2020-05-12 22:55       ` Matheus Tavares Bernardino
2020-05-12 23:22         ` Junio C Hamano
2020-05-10  0:41   ` [RFC PATCH v2 3/4] grep: honor sparse checkout patterns Matheus Tavares
2020-05-11 19:35     ` Junio C Hamano
2020-05-13  0:05       ` Matheus Tavares Bernardino
2020-05-13  0:17         ` Junio C Hamano
2020-05-21  7:26           ` Elijah Newren
2020-05-21 17:35             ` Matheus Tavares Bernardino
2020-05-21 17:52               ` Elijah Newren
2020-05-22  5:49                 ` Matheus Tavares Bernardino
2020-05-22 14:26                   ` Elijah Newren
2020-05-22 15:36                     ` Elijah Newren
2020-05-22 20:54                       ` Matheus Tavares Bernardino
2020-05-22 21:06                         ` Elijah Newren
2020-06-10 11:40                     ` Derrick Stolee
2020-06-10 16:22                       ` Matheus Tavares Bernardino
2020-06-10 17:42                         ` Derrick Stolee
2020-06-10 18:14                           ` Matheus Tavares Bernardino
2020-06-10 20:12                         ` Elijah Newren
2020-06-10 19:58                       ` Elijah Newren
2020-05-21  7:36       ` Elijah Newren
2020-05-10  0:41   ` [RFC PATCH v2 4/4] config: add setting to ignore sparsity patterns in some cmds Matheus Tavares
2020-05-10  4:23     ` Matheus Tavares Bernardino
2020-05-21 17:18       ` Elijah Newren
2020-05-21  7:09     ` Elijah Newren
2020-05-28  1:12   ` [PATCH v3 0/5] grep: honor sparse checkout and add option to ignore it Matheus Tavares
2020-05-28  1:12     ` [PATCH v3 1/5] doc: grep: unify info on configuration variables Matheus Tavares
2020-05-28  1:13     ` [PATCH v3 2/5] t/helper/test-config: return exit codes consistently Matheus Tavares
2020-05-30 14:29       ` Elijah Newren
2020-06-01  4:36         ` Matheus Tavares Bernardino
2020-05-28  1:13     ` [PATCH v3 3/5] config: correctly read worktree configs in submodules Matheus Tavares
2020-05-30 14:49       ` Elijah Newren
2020-06-01  4:38         ` Matheus Tavares Bernardino
2020-05-28  1:13     ` [PATCH v3 4/5] grep: honor sparse checkout patterns Matheus Tavares
2020-05-30 15:48       ` Elijah Newren
2020-06-01  4:44         ` Matheus Tavares Bernardino
2020-06-03  2:38           ` Elijah Newren
2020-06-10 17:08             ` Matheus Tavares Bernardino
2020-05-28  1:13     ` [PATCH v3 5/5] config: add setting to ignore sparsity patterns in some cmds Matheus Tavares
2020-05-30 16:18       ` Elijah Newren
2020-06-01  4:45         ` Matheus Tavares Bernardino
2020-06-03  2:39           ` Elijah Newren
2020-06-10 21:15             ` Matheus Tavares Bernardino
2020-06-11  0:35               ` Elijah Newren
2020-06-12 15:44     ` [PATCH v4 0/6] grep: honor sparse checkout and add option to ignore it Matheus Tavares
2020-06-12 15:44       ` [PATCH v4 1/6] doc: grep: unify info on configuration variables Matheus Tavares
2020-06-12 15:45       ` [PATCH v4 2/6] t/helper/test-config: return exit codes consistently Matheus Tavares
2020-06-12 15:45       ` [PATCH v4 3/6] t/helper/test-config: facilitate addition of new cli options Matheus Tavares
2020-06-12 15:45       ` [PATCH v4 4/6] config: correctly read worktree configs in submodules Matheus Tavares
2020-06-16 19:13         ` Elijah Newren
2020-06-21 16:05           ` Matheus Tavares Bernardino
2020-09-01  2:41         ` Jonathan Nieder
2020-09-01 21:44           ` Matheus Tavares Bernardino
2020-06-12 15:45       ` [PATCH v4 5/6] grep: honor sparse checkout patterns Matheus Tavares
2020-06-12 15:45       ` [PATCH v4 6/6] config: add setting to ignore sparsity patterns in some cmds Matheus Tavares
2020-06-16 22:31       ` [PATCH v4 0/6] grep: honor sparse checkout and add option to ignore it Elijah Newren
2020-09-02  6:17       ` [PATCH v5 0/8] " Matheus Tavares
2020-09-02  6:17         ` [PATCH v5 1/8] doc: grep: unify info on configuration variables Matheus Tavares
2020-09-02  6:17         ` [PATCH v5 2/8] t1308-config-set: avoid false positives when using test-config Matheus Tavares
2020-09-02  6:57           ` Eric Sunshine
2020-09-02 16:16             ` Matheus Tavares Bernardino
2020-09-02 16:38               ` Eric Sunshine
2020-09-02  6:17         ` [PATCH v5 3/8] t/helper/test-config: be consistent with exit codes Matheus Tavares
2020-09-02  6:17         ` [PATCH v5 4/8] t/helper/test-config: check argc before accessing argv Matheus Tavares
2020-09-02  7:18           ` Eric Sunshine
2020-09-02  6:17         ` [PATCH v5 5/8] t/helper/test-config: unify exit labels Matheus Tavares
2020-09-02  7:30           ` Eric Sunshine
2020-09-02  6:17         ` [PATCH v5 6/8] config: correctly read worktree configs in submodules Matheus Tavares
2020-09-02 20:15           ` Jonathan Nieder
2020-09-09 13:04             ` Matheus Tavares Bernardino
2020-09-09 23:32               ` Jonathan Nieder
2020-09-02  6:17         ` [PATCH v5 7/8] grep: honor sparse checkout patterns Matheus Tavares
2020-09-02  6:17         ` [PATCH v5 8/8] config: add setting to ignore sparsity patterns in some cmds Matheus Tavares
2020-09-10 17:21         ` Matheus Tavares [this message]
2020-09-10 17:21           ` [PATCH v6 1/9] doc: grep: unify info on configuration variables Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 2/9] t1308-config-set: avoid false positives when using test-config Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 3/9] t/helper/test-config: be consistent with exit codes Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 4/9] t/helper/test-config: diagnose missing arguments Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 5/9] t/helper/test-config: unify exit labels Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 6/9] config: make do_git_config_sequence receive a 'struct repository' Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 7/9] config: correctly read worktree configs in submodules Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 8/9] grep: honor sparse checkout patterns Matheus Tavares
2020-09-10 17:21           ` [PATCH v6 9/9] config: add setting to ignore sparsity patterns in some cmds Matheus Tavares
2021-02-09 21:33           ` [PATCH v7] grep: honor sparse-checkout on working tree searches Matheus Tavares
2021-02-09 23:23             ` Junio C Hamano
2021-02-10  6:12               ` 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1599758167.git.matheus.bernardino@usp.br \
    --to=matheus.bernardino@usp.br \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jonathantanmy@google.com \
    --cc=jrnieder@gmail.com \
    --cc=newren@gmail.com \
    --cc=stolee@gmail.com \
    --cc=sunshine@sunshineco.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.