Thread (87 messages) 87 messages, 5 authors, 2021-02-09

Re: [PATCH v3 5/5] config: add setting to ignore sparsity patterns in some cmds

From: Elijah Newren <hidden>
Date: 2020-06-03 02:40:08

On Sun, May 31, 2020 at 9:46 PM Matheus Tavares Bernardino
[off-list ref] wrote:
On Sat, May 30, 2020 at 1:18 PM Elijah Newren [off-list ref] wrote:
quoted
On Wed, May 27, 2020 at 6:14 PM Matheus Tavares
[off-list ref] wrote:
quoted
diff --git a/Documentation/config/sparse.txt b/Documentation/config/sparse.txt
new file mode 100644
index 0000000000..2a25b4b8ef
--- /dev/null
+++ b/Documentation/config/sparse.txt
@@ -0,0 +1,24 @@
+sparse.restrictCmds::
+       Only meaningful in conjunction with core.sparseCheckout. This option
+       extends sparse checkouts (which limit which paths are written to the
+       working tree), so that output and operations are also limited to the
+       sparsity paths where possible and implemented. The purpose of this
+       option is to (1) focus output for the user on the portion of the
+       repository that is of interest to them, and (2) enable potentially
+       dramatic performance improvements, especially in conjunction with
+       partial clones.
++
+When this option is true (default), some git commands may limit their behavior
+to the paths specified by the sparsity patterns, or to the intersection of
+those paths and any (like `*.c`) that the user might also specify on the
+command line. When false, the affected commands will work on full trees,
+ignoring the sparsity patterns. For now, only git-grep honors this setting. In
+this command, the restriction takes effect in three cases: with --cached; when
+a commit-ish is given; when searching a working tree where some paths excluded
+by the sparsity patterns are present (e.g. manually created paths or not
+removed submodules).
I think "In this command, the restriction takes effect..." to the end
of the paragraph should be removed.  I don't want every subcommand's
behavior to be specified here; it'll grow unreadably long and be more
likely to eventually go stale.
Yeah, I was also concerned about that. But wouldn't it be important to
inform the users how the setting takes place in grep (specially with
the corner cases)? And maybe others, in the future?

What if we move the information that is only relevant to a single
command into its own man page? I.e. git-grep.txt would have something
like:
Moving it to grep's manpage seems ideal to me.  grep's behavior should
be defined in grep's manual.
sparse.restrictCmds::
See complete definition in linkgit:git-config[1]. In grep, the
restriction takes effect in three cases: with --cached; when a
commit-ish is given; when searching a working tree where some paths
excluded by the sparsity patterns are present (e.g. manually created
paths or not removed submodules).
That looks more than a little confusing.  Could this definition be
something more like "See base definition in linkgit:git-config[1].
grep honors sparse.restrictCmds by limiting searches to the sparsity
paths in three cases: when searching the working tree, when searching
the index with --cached, or when searching a specified commit"
The only problem then is that the information would be a little
scattered... But I think it shouldn't be a big deal, as a person
interested in knowing how foo behaves with sparse.restrictCmds would
only need to look into foo's man page, anyway.
quoted
quoted
diff --git a/git.c b/git.c
index a2d337eed7..6db1382ae4 100644
--- a/git.c
+++ b/git.c
@@ -319,6 +324,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
                (*argv)++;
                (*argc)--;
        }
+
        return (*argv) - orig_argv;
 }
Why the stray whitespace change?
Oops, that shouldn't be there. Thanks!
quoted
quoted
diff --git a/sparse-checkout.c b/sparse-checkout.c
new file mode 100644
index 0000000000..9a9e50fd29
--- /dev/null
+++ b/sparse-checkout.c
@@ -0,0 +1,16 @@
+#include "cache.h"
+#include "config.h"
+#include "sparse-checkout.h"
+
+int restrict_to_sparse_paths(struct repository *repo)
+{
+       int ret;
+
+       if (opt_restrict_to_sparse_paths >= 0)
+               return opt_restrict_to_sparse_paths;
+
+       if (repo_config_get_bool(repo, "sparse.restrictcmds", &ret))
+               ret = 1;
+
+       return ret;
+}
Do we want to considering renaming this file to sparse.c, since it's
for sparse grep and sparse diff and etc., not just for the checkout
piece?  It would also go along well with our toplevel related config
being in the "sparse" namespace.
Makes sense. But since Stolee is already working on
"sparse-checkout.c" [1], if we use "sparse.c" in this series we will
end up with two extra files. And as "sparse.c" is quite small, I think
we could unify into the "sparse-checkout.c".

[1]: https://lore.kernel.org/git/0181a134bfb6986dc0e54ae624c478446a1324a9.1588857462.git.gitgitgadget@gmail.com/ (local)
Or we could just suggest he use sparse.c too.  :-)

Stolee?

quoted
quoted
diff --git a/t/t7817-grep-sparse-checkout.sh b/t/t7817-grep-sparse-checkout.sh
index ce080cf572..1aef084186 100755
--- a/t/t7817-grep-sparse-checkout.sh
+++ b/t/t7817-grep-sparse-checkout.sh
All these testcases look great (modulo the small typo I pointed out
earlier); I kept thinking "but what about case <x>?" and then I kept
reading and saw you covered it.  You even added some I wasn't thinking
about and might have overlooked but seem important.
Thanks :)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help