@@ -555,6 +555,10 @@ static void add_patterns_from_input(struct pattern_list *pl,
FILE *file)
{
int i;
+
+ if (file && argc)
+ die(_("excess command line parameter '%s'"), argv[0]);
+
if (core_sparse_checkout_cone) {
struct strbuf line = STRBUF_INIT;
@@ -937,6 +937,10 @@ test_expect_success 'check-rules cone mode' '
EOF
git -C bare ls-tree -r --name-only HEAD >all-files &&
+
+ test_must_fail git -C bare sparse-checkout check-rules --cone \
+ --rules-file ../rules excess args <all-files &&
+
git -C bare sparse-checkout check-rules --cone \
--rules-file ../rules >check-rules-file <all-files &&
@@ -947,6 +951,7 @@ test_expect_success 'check-rules cone mode' '
git -C repo sparse-checkout check-rules >check-rules-default <all-files &&
test_grep "deep/deeper1/deepest/a" check-rules-file &&
+ test_grep ! "end-of-options" check-rules-file &&
test_grep ! "deep/deeper2" check-rules-file &&
test_cmp check-rules-file ls-files &&
@@ -959,8 +964,12 @@ test_expect_success 'check-rules non-cone mode' '
EOF
git -C bare ls-tree -r --name-only HEAD >all-files &&
+
+ test_must_fail git -C bare sparse-checkout check-rules --no-cone \
+ --rules-file ../rules excess args <all-files &&
+
git -C bare sparse-checkout check-rules --no-cone --rules-file ../rules\
- >check-rules-file <all-files &&
+ --end-of-options >check-rules-file <all-files &&
cat rules | git -C repo sparse-checkout set --no-cone --stdin &&
git -C repo ls-files -t >out &&
The add_patterns_from_input() function was introduced at 6fb705ab (sparse-checkout: extract add_patterns_from_input(), 2020-02-11) and then modified by 00408ade (builtin/sparse-checkout: add check-rules command, 2023-03-27). Throughout its life, it either allowed to read patterns from the file (before 00408ade, it only allowed the standard input, after 00408ade, an arbitrary FILE *) or from argv[], but never both. However, when we read from a file, the function never checked that there is nothing in argv[] (in other words, the command line arguments have fully been consumed), resulting in excess arguments silently getting ignored. This caused commands like "git sparse-checkout set [--stdin]" and "git sparse-checkout check-rules [--rules-file <file>]" to silently ignore the rest of the command line arguments without reporting. The fix finally makes the --end-of-options handling for this subcommand also work, so add test for it, too. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- builtin/sparse-checkout.c | 4 ++++ t/t1091-sparse-checkout-builtin.sh | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-)