This commit is used to solve the problem of inconsistent execution results caused by switching the order of parameters and options in some scenarios. For example, if we execute the following commands: $/opt/git/master/bin/git ls-remote .git >3ea29ad061137e321853d64fb38b6c6e907546a0 HEAD >3ea29ad061137e321853d64fb38b6c6e907546a0 refs/heads/master >3 ea29ad061137e321853d64fb38b6c6e907546a0 refs/tags/v1.0 $/opt/git/master/bin/git ls-remote --heads .git >3ea29ad061137e321853d64fb38b6c6e907546a0 refs/heads/master $/opt/git/master/bin/git ls-remote .git --heads > Please omit the ">" because they are just to make the output more intuitive. The tests are based on 2ae0a9cb82 (The fifth batch, 2021-12-22). in master. Similarily "--tags", "--refs" and "--symref" also produces the same result (no output print in this case). The issue is caused by `ls-remote` command supports args as "patterns", which will filter the refs list from <remote> through the trailing matching rule. In these usages, Options can be differentiated and processed more accurately with "patterns", otherwise the result might lead to confusion if user has a loss of the context. This commit sets "parse_opt_flags" value in "parse_options()" to 0, this will let the commands produce the same result in this scenario. At the same time, this commit does not break the current test cases in t5512. Signed-off-by: Teng Long <dyroneteng@xxxxxxxxx> --- builtin/ls-remote.c | 3 +-- t/t5512-ls-remote.sh | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index 44448fa61d..45eeecdb71 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -80,8 +80,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) memset(&ref_array, 0, sizeof(ref_array)); - argc = parse_options(argc, argv, prefix, options, ls_remote_usage, - PARSE_OPT_STOP_AT_NON_OPTION); + argc = parse_options(argc, argv, prefix, options, ls_remote_usage, 0); dest = argv[0]; packet_trace_identity("ls-remote"); diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh index f53f58895a..7c51cc23d1 100755 --- a/t/t5512-ls-remote.sh +++ b/t/t5512-ls-remote.sh @@ -349,4 +349,28 @@ test_expect_success 'ls-remote prefixes work with all protocol versions' ' test_cmp expect actual.v2 ' +test_expect_success 'ls-remote same result if exchange the order of --heads and <remote>' ' + git ls-remote --heads self > expect.heads && + git ls-remote self --heads > actual.heads && + test_cmp expect.heads actual.heads +' + +test_expect_success 'ls-remote same result if exchange the order of --tags and <remote>' ' + git ls-remote --tags self > expect.tags && + git ls-remote self --tags > actual.tags && + test_cmp expect.tags actual.tags +' + +test_expect_success 'ls-remote same result if exchange the order of --refs and <remote>' ' + git ls-remote --refs self > expect.refs && + git ls-remote self --refs > actual.refs && + test_cmp expect.refs actual.refs +' + +test_expect_success 'ls-remote same result if exchange the order of --symref and <remote>' ' + git ls-remote --symref self > expect.symref && + git ls-remote self --symref > actual.symref && + test_cmp expect.symref actual.symref +' + test_done -- 2.34.1.391.g9ef3d6f133