Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2020-12-08 14:16:12 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2020-12-15 12:04:34 +0300
commit1a1543a943abf085dba1275b2c3db5759d2504cb (patch)
tree8c65ad395710b9cb5a80939bb30e81c1777474c2
parente9cddf540b6962fcc81c4e356b2208edad04a086 (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.go32
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