Browse Source

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
Derrick Stolee 5 years ago committed by Junio C Hamano
parent
commit
7bffca95ea
  1. 3
      Documentation/git-sparse-checkout.txt
  2. 34
      builtin/sparse-checkout.c
  3. 20
      t/t1091-sparse-checkout-builtin.sh

3
Documentation/git-sparse-checkout.txt

@ -47,6 +47,9 @@ To avoid interfering with other worktrees, it first enables the
a list of arguments following the 'set' subcommand. Update the a list of arguments following the 'set' subcommand. Update the
working directory to match the new patterns. Enable the working directory to match the new patterns. Enable the
core.sparseCheckout config setting if it is not already enabled. 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 SPARSE CHECKOUT
--------------- ---------------

34
builtin/sparse-checkout.c

@ -150,6 +150,15 @@ static int write_patterns_and_update(struct pattern_list *pl)
return update_working_directory(); 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 int sparse_checkout_set(int argc, const char **argv, const char *prefix)
{ {
static const char *empty_base = ""; 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; struct pattern_list pl;
int result; int result;
int changed_config = 0; 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)); memset(&pl, 0, sizeof(pl));


for (i = 1; i < argc; i++) argc = parse_options(argc, argv, prefix,
add_pattern(argv[i], empty_base, 0, &pl, 0); 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) { if (!core_apply_sparse_checkout) {
set_config(MODE_ALL_PATTERNS); set_config(MODE_ALL_PATTERNS);

20
t/t1091-sparse-checkout-builtin.sh

@ -128,4 +128,24 @@ test_expect_success 'set sparse-checkout using builtin' '
test_cmp expect dir 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 test_done

Loading…
Cancel
Save