diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-12-08 14:16:12 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-12-15 12:04:34 +0300 |
commit | 1a1543a943abf085dba1275b2c3db5759d2504cb (patch) | |
tree | 8c65ad395710b9cb5a80939bb30e81c1777474c2 | |
parent | e9cddf540b6962fcc81c4e356b2208edad04a086 (diff) |
git: Pull out function to assemble command arguments
Assembling arguments for subcommands is non-trivial logic as it requires
handling names, options, positional arguments and post-separator
arguments. As we're about to introduce a second user which requires this
logic by converting `SubSubCmd` from an option to a command, let's pull
out common code into a separate function which can be called by both
SubCmd and SubSubCmd types.
-rw-r--r-- | internal/git/safecmd.go | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/internal/git/safecmd.go b/internal/git/safecmd.go index 5cfadfef3..715de5a5a 100644 --- a/internal/git/safecmd.go +++ b/internal/git/safecmd.go @@ -69,33 +69,45 @@ func (sc SubCmd) CommandArgs() ([]string, error) { } safeArgs = append(safeArgs, sc.Name) - for _, o := range sc.Flags { + commandArgs, err := assembleCommandArgs(sc.Name, sc.Flags, sc.Args, sc.PostSepArgs) + if err != nil { + return nil, err + } + safeArgs = append(safeArgs, commandArgs...) + + return safeArgs, nil +} + +func assembleCommandArgs(command string, flags []Option, args []string, postSepArgs []string) ([]string, error) { + var commandArgs []string + + for _, o := range flags { args, err := o.OptionArgs() if err != nil { return nil, err } - safeArgs = append(safeArgs, args...) + commandArgs = append(commandArgs, args...) } - for _, a := range sc.Args { + for _, a := range args { if err := validatePositionalArg(a); err != nil { return nil, err } - safeArgs = append(safeArgs, a) + commandArgs = append(commandArgs, a) } - if supportsEndOfOptions(sc.Name) { - safeArgs = append(safeArgs, "--end-of-options") + if supportsEndOfOptions(command) { + commandArgs = append(commandArgs, "--end-of-options") } - if len(sc.PostSepArgs) > 0 { - safeArgs = append(safeArgs, "--") + if len(postSepArgs) > 0 { + commandArgs = append(commandArgs, "--") } // post separator args do not need any validation - safeArgs = append(safeArgs, sc.PostSepArgs...) + commandArgs = append(commandArgs, postSepArgs...) - return safeArgs, nil + return commandArgs, nil } // GlobalOption is an interface for all options which can be globally applied |