From 1ef973ffdfbb30ec130541d1addd5a5b3a3a9b75 Mon Sep 17 00:00:00 2001 From: Shubharanshu Mahapatra Date: Tue, 21 Jan 2025 18:38:18 +0530 Subject: [PATCH] fix: conflict in parsing of -h flag for help and hostname in container run Signed-off-by: Shubharanshu Mahapatra --- cmd/finch/nerdctl.go | 3 +- cmd/finch/nerdctl_remote.go | 76 ++++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/cmd/finch/nerdctl.go b/cmd/finch/nerdctl.go index 642ff30e2..65a3131a6 100644 --- a/cmd/finch/nerdctl.go +++ b/cmd/finch/nerdctl.go @@ -110,8 +110,9 @@ func (nc *nerdctlCommand) shouldReplaceForHelp(cmdName string, args []string) bo } } + // this only needs to handle `container run`. for _, arg := range args { - if arg == "--help" || arg == "-h" { + if arg == "--help" || (arg == "-h" && !strings.Contains(cmdName, "run")) { return true } } diff --git a/cmd/finch/nerdctl_remote.go b/cmd/finch/nerdctl_remote.go index 6f679e152..a5a09d238 100644 --- a/cmd/finch/nerdctl_remote.go +++ b/cmd/finch/nerdctl_remote.go @@ -142,11 +142,17 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { nerdctlArgs = append(nerdctlArgs, arg) case arg == "--add-host": // exact match to --add-host - args[i+1], err = resolveIP(args[i+1], nc.logger, nc.ecc) - if err != nil { - return err + if len(args) > i+1 { + args[i+1], err = resolveIP(args[i+1], nc.logger, nc.ecc) + if err != nil { + return err + } + nerdctlArgs = append(nerdctlArgs, arg) + } else { + // no value found for arg flag + // pass the arg as a nerdctl command argument + nerdctlArgs = append(nerdctlArgs, arg) } - nerdctlArgs = append(nerdctlArgs, arg) case strings.HasPrefix(arg, "--add-host"): // arg begins with --add-host resolvedIP, err := resolveIP(arg[11:], nc.logger, nc.ecc) @@ -158,21 +164,33 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { case strings.HasPrefix(arg, "--env-file"): // exact match to --env-file // or arg begins with --env-file - shouldSkip, addEnvs, err := handleEnvFile(nc.fs, nc.systemDeps, arg, args[i+1]) - if err != nil { - return err + if len(args) > i+1 { + shouldSkip, addEnvs, err := handleEnvFile(nc.fs, nc.systemDeps, arg, args[i+1]) + if err != nil { + return err + } + skip = shouldSkip + fileEnvs = append(fileEnvs, addEnvs...) + } else { + // no value found for arg flag + // pass the arg as a nerdctl command argument + nerdctlArgs = append(nerdctlArgs, arg) } - skip = shouldSkip - fileEnvs = append(fileEnvs, addEnvs...) case argIsEnv(arg): // exact match to either -e or --env // or arg begins with -e or --env // -e="", -e"" // --env="=", --env"=" - shouldSkip, addEnv := handleEnv(nc.systemDeps, arg, args[i+1]) - skip = shouldSkip - if addEnv != "" { - envs = append(envs, addEnv) + if len(args) > i+1 { + shouldSkip, addEnv := handleEnv(nc.systemDeps, arg, args[i+1]) + skip = shouldSkip + if addEnv != "" { + envs = append(envs, addEnv) + } + } else { + // no value found for arg flag + // pass the arg as a nerdctl command argument + nerdctlArgs = append(nerdctlArgs, arg) } case shortFlagBoolSet.Has(arg) || longFlagBoolSet.Has(arg): // exact match to a short no argument flag: -? @@ -195,11 +213,17 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { // or begins with a short arg flag: // short arg flag concatenated to value: -?"" // short arg flag equated to value: -?="" or -?= - shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) - skip = shouldSkip - if addKey != "" { - nerdctlArgs = append(nerdctlArgs, addKey) - nerdctlArgs = append(nerdctlArgs, addVal) + if len(args) > i+1 { + shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) + skip = shouldSkip + if addKey != "" { + nerdctlArgs = append(nerdctlArgs, addKey) + nerdctlArgs = append(nerdctlArgs, addVal) + } + } else { + // no value found for short arg flag + // pass the arg as a nerdctl command argument + nerdctlArgs = append(nerdctlArgs, arg) } case strings.HasPrefix(arg, "--"): // exact match to a long arg flag: - @@ -207,11 +231,17 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { // or begins with a long arg flag: // long arg flag concatenated to value: --"" // long arg flag equated to value: --="" or --= - shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) - skip = shouldSkip - if addKey != "" { - nerdctlArgs = append(nerdctlArgs, addKey) - nerdctlArgs = append(nerdctlArgs, addVal) + if len(args) > i+1 { + shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) + skip = shouldSkip + if addKey != "" { + nerdctlArgs = append(nerdctlArgs, addKey) + nerdctlArgs = append(nerdctlArgs, addVal) + } + } else { + // no value found for arg flag + // pass the arg as a nerdctl command argument + nerdctlArgs = append(nerdctlArgs, arg) } default: // arg other than a flag ("-?","--") or a skipped