Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pref: fix version flag handling #21377

Merged
merged 4 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 10 additions & 16 deletions vlib/v/pref/pref.c.v
Original file line number Diff line number Diff line change
Expand Up @@ -401,17 +401,16 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin
}
res.is_quiet = true
}
'-v' {
if command_pos != -1 {
// a -v flag after the command, is intended for the command, not for V itself
continue
}
// `-v` flag is for setting verbosity, but without any args it prints the version, like Clang
if args.len > 1 {
res.is_verbose = true
} else {
command = 'version'
command_pos = i
'-v', '-V', '--version', '-version' {
if command_pos == -1 {
// Version flags after a command are intended for the command, not for V itself.
if current_args.len > 1 && arg == '-v' {
// With additional args after the `-v` flag, it toggles verbosity, like Clang.
// E.g.: `v -v` VS `v -v run examples/hello_world.v`.
res.is_verbose = true
} else {
command = 'version'
}
}
}
'-progress' {
Expand Down Expand Up @@ -960,11 +959,6 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin
}
continue
}
if arg in ['-V', '-version', '--version'] {
command = 'version'
command_pos = i
continue
}
if command != '' && command != 'build-module' {
// arguments for e.g. fmt should be checked elsewhere
continue
Expand Down
32 changes: 32 additions & 0 deletions vlib/v/pref/pref_test.v
Original file line number Diff line number Diff line change
@@ -1,8 +1,40 @@
module pref

import v.vmod
import os

fn test_check_parametes() {
// reproducing issue https://github.com/vlang/v/issues/13983
_, cmd := parse_args_and_show_errors(['help'], [''], true)
// no command found from args
assert cmd == ''
}

fn test_version_falg() {
// Vars instead of consts to prevent dupl decls in pref.
vexe := @VEXE
vroot := os.dir(vexe)

v_ver := vmod.from_file(os.join_path(vroot, 'v.mod'))!.version
v_ver_cmd_res := os.execute_opt('${vexe} --version')!.output
assert v_ver_cmd_res.starts_with('V ${v_ver}'), v_ver_cmd_res

v_retry_ver_cmd_res := os.execute_opt('${vexe} retry --version')!.output
assert v_retry_ver_cmd_res != v_ver_cmd_res

v_git_ver_subcmd_res := os.execute_opt('${vexe} retry -- git --version')!.output
assert v_git_ver_subcmd_res !in [v_ver_cmd_res, v_retry_ver_cmd_res]

// Test version / verbosity toggle.
assert os.execute_opt('${vexe} -v')!.output == v_ver_cmd_res
assert os.execute_opt('${vexe} -cc tcc -v')!.output == v_ver_cmd_res

example_path := os.join_path(vroot, 'examples', 'hello_world.v')
v_verbose_cmd_res := os.execute_opt('${vexe} -v run ${example_path}')!.output
assert v_verbose_cmd_res != v_ver_cmd_res
assert v_verbose_cmd_res.contains('v.pref.lookup_path:')

v_verbose_cmd_with_additional_args_res := os.execute_opt('${vexe} -cc tcc -v run ${example_path}')!.output
assert v_verbose_cmd_with_additional_args_res != v_ver_cmd_res
assert v_verbose_cmd_with_additional_args_res.contains('v.pref.lookup_path:')
}