git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 8/8] tests: disallow the use of abbreviated options (by default)

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 15, 2019, 02:55 UTC
Message-ID
<xmqqy34cugdj.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<xmqqv9zhwbxt.fsf@gitster-ct.c.googlers.com>
Junio C Hamano <gitster@pobox.com> writes:
> Do you mean more like
> ...
> I think I can agree with either of the two positions...

I am guessing from the earlier iteration that you wanted to say "unless it is given explicitly, we turn it on".

As this last-minute style update that was botched, and a typofix in the proposed log message in 8/8, are the only differences, let me locally fix 8/8 up and replace it.

It was very good that this round did not have to touch 1/8 which is shared with Denton's keep-base topic; otherwise replacing would have been a little bit messier.

Here is what I'll use (unless it gets further replaced by v3 or later, that is).

Thanks.
-- >8 --
From: Johannes Schindelin <johannes.schindelin@gmx.de>
Date: Fri, 12 Apr 2019 02:37:24 -0700
Subject: [PATCH v2bis 8/8] tests: disallow the use of abbreviated options (by default)

Git's command-line parsers support uniquely abbreviated options, e.g. `git init --ba` would automatically expand `--ba` to `--bare`.

This is a very convenient feature in every day life for Git users, in particular when tab completion is not available.

However, it is not a good idea to rely on that in Git's test suite, as something that is a unique abbreviation of a command line option today might no longer be a unique abbreviation tomorrow.

For example, if a future contribution added a new mode `git init --babyproofing` and a previously-introduced test case used the fact that `git init --ba` expanded to `git init --bare`, that future contribution would now have to touch seemingly unrelated tests just to keep the test suite from failing.

So let's disallow abbreviated options in the test suite by default.
Note: for ease of implementation, this patch really only touches the
`parse-options` machinery: more and more hand-rolled option parsers are
converted to use that internal API, and more and more scripts are
converted to built-ins (naturally using the parse-options API, too), so
in practice this catches most issues, and is definitely the biggest bang
for the buck.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 parse-options.c          |  9 +++++++++
 t/README                 |  4 ++++
 t/t0040-parse-options.sh | 14 +++++++++++++-
 t/test-lib.sh            |  7 +++++++
 4 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/parse-options.c b/parse-options.c
index cec74522e5..acc3a93660 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -6,6 +6,8 @@
 #include "color.h"
 #include "utf8.h"
 
+static int disallow_abbreviated_options;
+
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
@@ -344,6 +346,10 @@ static enum parse_opt_result parse_long_opt(
 		return get_value(p, options, all_opts, flags ^ opt_flags);
 	}
 
+	if (disallow_abbreviated_options && (ambiguous_option || abbrev_option))
+		die("disallowed abbreviated or ambiguous option '%.*s'",
+		    (int)(arg_end - arg), arg);
+
 	if (ambiguous_option) {
 		error(_("ambiguous option: %s "
 			"(could be --%s%s or --%s%s)"),
@@ -708,6 +714,9 @@ int parse_options(int argc, const char **argv, const char *prefix,
 {
 	struct parse_opt_ctx_t ctx;
 
+	disallow_abbreviated_options =
+		git_env_bool("GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS", 0);
+
 	parse_options_start(&ctx, argc, argv, prefix, options, flags);
 	switch (parse_options_step(&ctx, options, usagestr)) {
 	case PARSE_OPT_HELP:
diff --git a/t/README b/t/README
index 656288edce..9ed3051a1c 100644
--- a/t/README
+++ b/t/README
@@ -399,6 +399,10 @@ GIT_TEST_SIDEBAND_ALL=<boolean>, when true, overrides the
 fetch-pack to not request sideband-all (even if the server advertises
 sideband-all).
 
+GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=<boolean>, when true (which is
+the default when running tests), errors out when an abbreviated option
+is used.
+
 Naming Tests
 ------------
 
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index b8f366c442..800b3ea5f5 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -203,20 +203,24 @@ file: (not set)
 EOF
 
 test_expect_success 'unambiguously abbreviated option' '
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
 	test-tool parse-options --int 2 --boolean --no-bo >output 2>output.err &&
 	test_must_be_empty output.err &&
 	test_cmp expect output
 '
 
 test_expect_success 'unambiguously abbreviated option with "="' '
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
 	test-tool parse-options --expect="integer: 2" --int=2
 '
 
 test_expect_success 'ambiguously abbreviated option' '
-	test_expect_code 129 test-tool parse-options --strin 123
+	test_expect_code 129 env GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
+	test-tool parse-options --strin 123
 '
 
 test_expect_success 'non ambiguous option (after two options it abbreviates)' '
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
 	test-tool parse-options --expect="string: 123" --st 123
 '
 
@@ -325,6 +329,7 @@ file: (not set)
 EOF
 
 test_expect_success 'negation of OPT_NONEG flags is not ambiguous' '
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
 	test-tool parse-options --no-ambig >output 2>output.err &&
 	test_must_be_empty output.err &&
 	test_cmp expect output
@@ -370,4 +375,11 @@ test_expect_success '--no-verbose resets multiple verbose to 0' '
 	test-tool parse-options --expect="verbose: 0" -v -v -v --no-verbose
 '
 
+test_expect_success 'GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS works' '
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \
+		test-tool parse-options --ye &&
+	test_must_fail env GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=true \
+		test-tool parse-options --ye
+'
+
 test_done
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 562c57e685..c14ebe68d3 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -57,6 +57,13 @@ fi
 . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
 export PERL_PATH SHELL_PATH
 
+# Disallow the use of abbreviated options in the test suite by default
+if test -z "${GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS}"
+then
+	GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=true
+	export GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS
+fi
+
 ################################################################
 # It appears that people try to run tests without building...
 "${GIT_TEST_INSTALLED:-$GIT_BUILD_DIR}/git$X" >/dev/null
-- 
2.21.0-313-ge35b8cb8e2
Previous: Junio C HamanoNext: Johannes Schindelin
Message 47 of 52 in “Do not use abbreviated options in tests”
  1. 0/8 Do not use abbreviated options in testsJohannes Schindelin via GitGitGadget, Mar 25, 2019
  2. 1/8 tests (rebase): spell out the `--keep-empty` optionJohannes Schindelin via GitGitGadget, Mar 25, 2019
  3. 3/8 t7810: do not abbreviate `--no-exclude-standard` nor `--invert-match`Johannes Schindelin via GitGitGadget, Mar 25, 2019
  4. 5/8 tests (push): do not abbreviate the `--follow-tags` optionJohannes Schindelin via GitGitGadget, Mar 25, 2019
  5. 4/8 t5531: avoid using an abbreviated optionJohannes Schindelin via GitGitGadget, Mar 25, 2019
  6. 2/8 tests (rebase): spell out the `--force-rebase` optionJohannes Schindelin via GitGitGadget, Mar 25, 2019
  7. 8/8 tests: disallow the use of abbreviated options (by default)Johannes Schindelin via GitGitGadget, Mar 25, 2019
  8. Denton LiuMar 25, 2019
  9. Ævar Arnfjörð BjarmasonMar 25, 2019
  10. Johannes SchindelinApr 12, 2019
  11. Johannes SchindelinApr 12, 2019
  12. Ævar Arnfjörð BjarmasonMar 25, 2019
  13. Johannes SchindelinApr 12, 2019
  14. 6/8 tests (status): spell out the `--find-renames` option in fullJohannes Schindelin via GitGitGadget, Mar 25, 2019
  15. 7/8 tests (pack-objects): use the full, unabbreviated `--revs` optionJohannes Schindelin via GitGitGadget, Mar 25, 2019
  16. 0/2 allow for configuring option abbreviation + fixÆvar Arnfjörð Bjarmason, Mar 25, 2019
  17. 1/2 parse-options: allow for configuring option abbreviationÆvar Arnfjörð Bjarmason, Mar 25, 2019
  18. Eric SunshineMar 25, 2019
  19. Ævar Arnfjörð BjarmasonMar 25, 2019
  20. Duy NguyenMar 26, 2019
  21. Ævar Arnfjörð BjarmasonMar 26, 2019
  22. Duy NguyenMar 26, 2019
  23. Ævar Arnfjörð BjarmasonMar 26, 2019
  24. Junio C HamanoApr 1, 2019
  25. Johannes SchindelinApr 12, 2019
  26. 2/2 parse-options: don't emit "ambiguous option" for aliasesÆvar Arnfjörð Bjarmason, Mar 25, 2019
  27. parse-options: don't emit "ambiguous option" for aliasesÆvar Arnfjörð Bjarmason, Apr 17, 2019
  28. Duy NguyenApr 17, 2019
  29. Junio C HamanoApr 18, 2019
  30. Duy NguyenApr 18, 2019
  31. Junio C HamanoApr 19, 2019
  32. parse-options: don't emit "ambiguous option" for aliasesNguyễn Thái Ngọc Duy, Apr 22, 2019
  33. Duy NguyenApr 22, 2019
  34. parse-options: don't emit "ambiguous option" for aliasesNguyễn Thái Ngọc Duy, Apr 29, 2019
  35. Junio C HamanoMay 7, 2019
  36. Duy NguyenMay 7, 2019
  37. Junio C HamanoApr 2, 2019
  38. 0/8 Do not use abbreviated options in testsJohannes Schindelin via GitGitGadget, Apr 12, 2019
  39. 2/8 tests (rebase): spell out the `--force-rebase` optionJohannes Schindelin via GitGitGadget, Apr 12, 2019
  40. 4/8 t5531: avoid using an abbreviated optionJohannes Schindelin via GitGitGadget, Apr 12, 2019
  41. 6/8 tests (status): spell out the `--find-renames` option in fullJohannes Schindelin via GitGitGadget, Apr 12, 2019
  42. 5/8 tests (push): do not abbreviate the `--follow-tags` optionJohannes Schindelin via GitGitGadget, Apr 12, 2019
  43. 1/8 tests (rebase): spell out the `--keep-empty` optionJohannes Schindelin via GitGitGadget, Apr 12, 2019
  44. 3/8 t7810: do not abbreviate `--no-exclude-standard` nor `--invert-match`Johannes Schindelin via GitGitGadget, Apr 12, 2019
  45. 8/8 tests: disallow the use of abbreviated options (by default)Johannes Schindelin via GitGitGadget, Apr 12, 2019
  46. Junio C HamanoApr 14, 2019
  47. Junio C HamanoApr 15, 2019
  48. Johannes SchindelinApr 15, 2019
  49. Junio C HamanoApr 15, 2019
  50. Johannes SchindelinApr 17, 2019
  51. Johannes SchindelinApr 15, 2019
  52. 7/8 tests (pack-objects): use the full, unabbreviated `--revs` optionJohannes Schindelin via GitGitGadget, Apr 12, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.