Skip to content

v3: yield the version flag's -v alias to a user-defined flag#2330

Open
c-tonneslan wants to merge 1 commit into
urfave:mainfrom
c-tonneslan:fix/version-alias-conflict-with-user-flag
Open

v3: yield the version flag's -v alias to a user-defined flag#2330
c-tonneslan wants to merge 1 commit into
urfave:mainfrom
c-tonneslan:fix/version-alias-conflict-with-user-flag

Conversation

@c-tonneslan
Copy link
Copy Markdown
Contributor

Fixes #2229.

The default version flag carries `-v` as an alias. A user-defined flag that also wants `-v` (canonical case: `--verbose / -v`) wasn't actually broken at parse time: `-v` ended up setting the user flag. But `checkVersion` went through `cmd.Bool`, which resolves aliases, so it asked for the value of `"v"` and got back the user flag's value. The end result: passing `-v` was silently treated as "print version and exit."

Two narrow changes:

  • During root setup, drop any aliases from the local copy of the version flag that are already claimed by a user-defined flag's name or alias. Keeps the user flag the sole owner of the short form.
  • `checkVersion` now finds the actual version flag attached to the command (matching against the canonical primary name from the global VersionFlag) and checks `IsSet` directly, so it can't be fooled by a same-named alias on a different flag.

Added `TestVersionFlagYieldsAliasToUserFlag` covering the reporter's reproducer.

The default version flag carries -v as an alias. A user-defined flag
that also wants -v (canonical case: --verbose / -v) wasn't actually
broken at parse time: -v ended up setting the user flag. But
checkVersion went through cmd.Bool, which resolves aliases, so it
asked for the value of "v" and got back the user flag's value. The
end result: -v was silently treated as "print version and exit".

Two changes, both narrow:

  - During root setup, drop any aliases from the local copy of the
    version flag that are already claimed by a user-defined flag's
    name or alias. Keeps the user flag the sole owner of the
    short form.

  - checkVersion now looks for the actual version flag attached to
    the command (matching against the canonical primary name from
    the global VersionFlag) and checks its IsSet directly, so it
    can't be fooled by a same-named alias on a different flag.

Fixes urfave#2229.

Signed-off-by: Charlie Tonneslan <cst0520@gmail.com>
@c-tonneslan c-tonneslan requested a review from a team as a code owner May 16, 2026 22:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

--verbose flag gets interpreted as "print version and exit"

1 participant