sparse-checkout: add '--stdin' option to set subcommand
The 'git sparse-checkout set' subcommand takes a list of patterns and places them in the sparse-checkout file. Then, it updates the working directory to match those patterns. For a large list of patterns, the command-line call can get very cumbersome. Add a '--stdin' option to instead read patterns over standard in. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
f6039a9423
commit
7bffca95ea
|
@ -47,6 +47,9 @@ To avoid interfering with other worktrees, it first enables the
|
|||
a list of arguments following the 'set' subcommand. Update the
|
||||
working directory to match the new patterns. Enable the
|
||||
core.sparseCheckout config setting if it is not already enabled.
|
||||
+
|
||||
When the `--stdin` option is provided, the patterns are read from
|
||||
standard in as a newline-delimited list instead of from the arguments.
|
||||
|
||||
SPARSE CHECKOUT
|
||||
---------------
|
||||
|
|
|
@ -150,6 +150,15 @@ static int write_patterns_and_update(struct pattern_list *pl)
|
|||
return update_working_directory();
|
||||
}
|
||||
|
||||
static char const * const builtin_sparse_checkout_set_usage[] = {
|
||||
N_("git sparse-checkout set (--stdin | <patterns>)"),
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct sparse_checkout_set_opts {
|
||||
int use_stdin;
|
||||
} set_opts;
|
||||
|
||||
static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
static const char *empty_base = "";
|
||||
|
@ -157,10 +166,31 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
|
|||
struct pattern_list pl;
|
||||
int result;
|
||||
int changed_config = 0;
|
||||
|
||||
static struct option builtin_sparse_checkout_set_options[] = {
|
||||
OPT_BOOL(0, "stdin", &set_opts.use_stdin,
|
||||
N_("read patterns from standard in")),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
memset(&pl, 0, sizeof(pl));
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
argc = parse_options(argc, argv, prefix,
|
||||
builtin_sparse_checkout_set_options,
|
||||
builtin_sparse_checkout_set_usage,
|
||||
PARSE_OPT_KEEP_UNKNOWN);
|
||||
|
||||
if (set_opts.use_stdin) {
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
|
||||
while (!strbuf_getline(&line, stdin)) {
|
||||
char *buf = strbuf_detach(&line, NULL);
|
||||
add_pattern(buf, empty_base, 0, &pl, 0);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < argc; i++)
|
||||
add_pattern(argv[i], empty_base, 0, &pl, 0);
|
||||
}
|
||||
|
||||
if (!core_apply_sparse_checkout) {
|
||||
set_config(MODE_ALL_PATTERNS);
|
||||
|
|
|
@ -128,4 +128,24 @@ test_expect_success 'set sparse-checkout using builtin' '
|
|||
test_cmp expect dir
|
||||
'
|
||||
|
||||
test_expect_success 'set sparse-checkout using --stdin' '
|
||||
cat >expect <<-EOF &&
|
||||
/*
|
||||
!/*/
|
||||
/folder1/
|
||||
/folder2/
|
||||
EOF
|
||||
git -C repo sparse-checkout set --stdin <expect &&
|
||||
git -C repo sparse-checkout list >actual &&
|
||||
test_cmp expect actual &&
|
||||
test_cmp expect repo/.git/info/sparse-checkout &&
|
||||
ls repo >dir &&
|
||||
cat >expect <<-EOF &&
|
||||
a
|
||||
folder1
|
||||
folder2
|
||||
EOF
|
||||
test_cmp expect dir
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Loading…
Reference in New Issue