-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Description
My urfave/cli version is
github.com/urfave/cli/v3 v3.6.0
Checklist
- [ X] Are you running the latest v3 release? The list of releases is here.
- [ X] Did you check the manual for your release? The v3 manual is here
- [ X] Did you perform a search about this problem? Here's the GitHub guide about searching.
Dependency Management
- My project is using go modules.
Describe the bug
I have two String arguments: --value1=foo and --value2=bar. If I leave off the foo, and pass in
--value1= --value2=bar
then the parsed value for the value1 argument will be --value2=bar (and obviously --value2 will never be parsed).
I suspect the problem is somewhere here in func (cmd *Command) parseFlags() (Args, error) :
if index := strings.Index(flagName, "="); index != -1 {
flagVal = flagName[index+1:]
flagName = flagName[:index]
}
Here we split off the = from the value1 flag, at which point flagVal is empty.
Later we have
// not a bool flag so need to get the next arg
if flagVal == "" {
if len(rargs) == 1 {
return &stringSliceArgs{posArgs}, fmt.Errorf("%s%s", argumentNotProvidedErrMsg, firstArg)
}
flagVal = rargs[1]
rargs = rargs[1:]
}
but we didn't remember that we already got the =, so that we should NOT get the next rargs: We should just use whatever was after the = (which is empty).
To reproduce
See above
Observed behavior
Second argument-value becomes the value of the first argument.
Expected behavior
First argument should remain empty, and the second argument should be normally parsed.
Additional context
This worked in v2. I don't know if it worked prior to v3.6.0, since I'm just porting over my v2 code.
Want to fix this yourself?
No time.
Run go version and paste its output here
go version go1.25.4 darwin/arm64
AR='ar'
CC='cc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='c++'
GCCGO='gccgo'
GO111MODULE=''
GOARCH='arm64'
GOARM64='v8.0'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/Users/jvilhuber/Library/Caches/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/Users/jvilhuber/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/s5/8qspwhrs4438zmz3q_yh6kh80000gs/T/go-build124383343=/tmp/go-build -gno-record-gcc-switches -fno-common'
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMOD='/Users/jvilhuber/src/my-service/go.mod'
GOMODCACHE='/Users/jvilhuber/go/pkg/mod'
GOOS='darwin'
GOPATH='/Users/jvilhuber/go'
GOROOT='/opt/homebrew/Cellar/go/1.25.4/libexec'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/Users/jvilhuber/Library/Application Support/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.25.4/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.25.4'
GOWORK=''
PKG_CONFIG='pkg-config'