From a48e2e260733917f366daefc85dcdd061ab575a8 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 15 Nov 2022 14:01:45 +0100 Subject: [PATCH 1/3] feat(cmd)!: run abra.sh commands with /bin/bash if available. BREAKING CHANGE: abra.sh commands that depend on /bin/sh will break --- cli/app/cmd.go | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/cli/app/cmd.go b/cli/app/cmd.go index eb4ebcc0..76b91e00 100644 --- a/cli/app/cmd.go +++ b/cli/app/cmd.go @@ -87,7 +87,12 @@ Example: sourceAndExec = fmt.Sprintf("TARGET=local; APP_NAME=%s; STACK_NAME=%s; %s . %s; %s", app.Name, app.StackName(), exportEnv, abraSh, cmdName) } - cmd := exec.Command("/bin/sh", "-c", sourceAndExec) + var shell string = "/bin/bash" + if _, err := os.Stat(shell); errors.Is(err, os.ErrNotExist) { + logrus.Debugf("%s does not exist locally, use /bin/sh as fallback", shell) + shell = "/bin/sh" + } + cmd := exec.Command(shell, "-c", sourceAndExec) if err := internal.RunCmd(cmd); err != nil { logrus.Fatal(err) @@ -192,34 +197,44 @@ func runCmdRemote(app config.App, abraSh, serviceName, cmdName, cmdArgs string) return err } - var cmd []string - if cmdArgs != "" { - cmd = []string{"/bin/sh", "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s %s", serviceName, app.Name, app.StackName(), cmdName, cmdArgs)} - } else { - cmd = []string{"/bin/sh", "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s", serviceName, app.Name, app.StackName(), cmdName)} + // FIXME: avoid instantiating a new CLI + dcli, err := command.NewDockerCli() + if err != nil { + return err } - logrus.Debugf("running command: %s", strings.Join(cmd, " ")) - + var shell string = "/bin/bash" + var findShell []string = []string{"test", "-e", shell} execCreateOpts := types.ExecConfig{ AttachStderr: true, AttachStdin: true, AttachStdout: true, - Cmd: cmd, + Cmd: findShell, Detach: false, - Tty: true, + Tty: false, } + if err := container.RunExec(dcli, cl, targetContainer.ID, &execCreateOpts); err != nil { + logrus.Infof("%s does not exist for %s, use /bin/sh as fallback", shell, app.Name) + shell = "/bin/sh" + } + + var cmd []string + if cmdArgs != "" { + cmd = []string{shell, "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s %s", serviceName, app.Name, app.StackName(), cmdName, cmdArgs)} + } else { + cmd = []string{shell, "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s", serviceName, app.Name, app.StackName(), cmdName)} + } + + logrus.Debugf("running command: %s", strings.Join(cmd, " ")) + if internal.RemoteUser != "" { logrus.Debugf("running command with user %s", internal.RemoteUser) execCreateOpts.User = internal.RemoteUser } - // FIXME: avoid instantiating a new CLI - dcli, err := command.NewDockerCli() - if err != nil { - return err - } + execCreateOpts.Cmd = cmd + execCreateOpts.Tty = true if err := container.RunExec(dcli, cl, targetContainer.ID, &execCreateOpts); err != nil { return err -- 2.40.1 From d7d8689d53be6b8efcfa95383c2c349d010a456f Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 15 Nov 2022 21:28:35 +0100 Subject: [PATCH 2/3] Resolve reviews --- cli/app/cmd.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/app/cmd.go b/cli/app/cmd.go index 76b91e00..0ada275a 100644 --- a/cli/app/cmd.go +++ b/cli/app/cmd.go @@ -87,7 +87,7 @@ Example: sourceAndExec = fmt.Sprintf("TARGET=local; APP_NAME=%s; STACK_NAME=%s; %s . %s; %s", app.Name, app.StackName(), exportEnv, abraSh, cmdName) } - var shell string = "/bin/bash" + shell := "/bin/bash" if _, err := os.Stat(shell); errors.Is(err, os.ErrNotExist) { logrus.Debugf("%s does not exist locally, use /bin/sh as fallback", shell) shell = "/bin/sh" @@ -203,8 +203,8 @@ func runCmdRemote(app config.App, abraSh, serviceName, cmdName, cmdArgs string) return err } - var shell string = "/bin/bash" - var findShell []string = []string{"test", "-e", shell} + shell := "/bin/bash" + findShell := []string{"test", "-e", shell} execCreateOpts := types.ExecConfig{ AttachStderr: true, AttachStdin: true, -- 2.40.1 From 521d3d12592b1b7092e61016d434280265c9b75f Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 15 Nov 2022 22:24:34 +0100 Subject: [PATCH 3/3] feat(autocomplete): add autocompletion for fish shell --- cli/cli.go | 11 ++++++++++- scripts/autocomplete/fish | 7 +++++++ tests/integration/autocomplete.sh | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 scripts/autocomplete/fish diff --git a/cli/cli.go b/cli/cli.go index 5a89053d..e0090bae 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -29,7 +29,7 @@ var AutoCompleteCommand = cli.Command{ Description: ` Set up auto-completion in your shell by downloading the relevant files and laying out what additional information must be loaded. Supported shells are as -follows: bash, fizsh & zsh. +follows: bash, fish, fizsh & zsh. Example: @@ -50,6 +50,7 @@ Example: "bash": true, "zsh": true, "fizsh": true, + "fish": true, } if _, ok := supportedShells[shellType]; !ok { @@ -93,6 +94,14 @@ sudo mkdir /etc/zsh/completion.d/ sudo cp %s /etc/zsh/completion.d/abra echo "PROG=abra\n_CLI_ZSH_AUTOCOMPLETE_HACK=1\nsource /etc/zsh/completion.d/abra" >> ~/.zshrc # And finally run "abra app ps " to test things are working, you should see app domains listed! +`, autocompletionFile)) + case "fish": + fmt.Println(fmt.Sprintf(` +# Run the following commands to install auto-completion +sudo mkdir -p /etc/fish/completions +sudo cp %s /etc/fish/completions/abra +echo "source /etc/fish/completions/abra" >> ~/.config/fish/config.fish +# And finally run "abra app ps " to test things are working, you should see app domains listed! `, autocompletionFile)) } diff --git a/scripts/autocomplete/fish b/scripts/autocomplete/fish new file mode 100644 index 00000000..54427187 --- /dev/null +++ b/scripts/autocomplete/fish @@ -0,0 +1,7 @@ +function complete_abra_args + set -l cmd (commandline -poc) --generate-bash-completion + $cmd +end +complete -c abra -f -n "not __fish_seen_subcommand_from -h --help -v --version complete_abra_args" -a "(complete_abra_args)" +complete -c abra -f -s h -l help -d 'show help' +complete -c abra -f -s v -l version -d 'print the version' diff --git a/tests/integration/autocomplete.sh b/tests/integration/autocomplete.sh index ebac80de..4ea2ef88 100755 --- a/tests/integration/autocomplete.sh +++ b/tests/integration/autocomplete.sh @@ -8,3 +8,5 @@ run_test '$ABRA autocomplete bash' run_test '$ABRA autocomplete fizsh' run_test '$ABRA autocomplete zsh' + +run_test '$ABRA autocomplete fish' -- 2.40.1