From: Junio C Hamano Date: Thu, 21 Dec 2023 06:59:25 GMT Subject: [PATCH 3/3] sparse-checkout: tighten add_patterns_from_input() Message-ID: <20231221065925.3234048-4-gitster@pobox.com> In-Reply-To: <20231221065925.3234048-1-gitster@pobox.com> 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 ]" 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 --- builtin/sparse-checkout.c | 4 ++++ t/t1091-sparse-checkout-builtin.sh | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index 04ae81fce8..1166e1e298 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -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; diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index e33a6ed1b4..107ed170ac 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -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 check-rules-file check-rules-default all-files && + + test_must_fail git -C bare sparse-checkout check-rules --no-cone \ + --rules-file ../rules excess args check-rules-file check-rules-file out && -- 2.43.0-174-g055bb6e996