commit 3b7a8de84c14cc760408c592f679a9344692d1e9
parent 49c2852099d474614d276f7aa70563b076ccb733
Author: Sean Enck <sean@ttypty.com>
Date: Fri, 28 Jul 2023 21:44:44 -0400
support short output of current env settings
Diffstat:
8 files changed, 80 insertions(+), 7 deletions(-)
diff --git a/internal/app/completions.go b/internal/app/completions.go
@@ -31,6 +31,8 @@ type (
JSONCommand string
HelpCommand string
HelpAdvancedCommand string
+ EnvShortCommand string
+ EnvCommand string
}
)
@@ -51,9 +53,11 @@ func GenerateCompletions(isBash, defaults bool) ([]string, error) {
MultiLineCommand: MultiLineCommand,
JSONCommand: JSONCommand,
HelpCommand: HelpCommand,
+ EnvCommand: EnvCommand,
HelpAdvancedCommand: HelpAdvancedCommand,
TOTPCommand: TOTPCommand,
MoveCommand: MoveCommand,
+ EnvShortCommand: EnvShortCommand,
DoList: fmt.Sprintf("%s %s", name, ListCommand),
DoTOTPList: fmt.Sprintf("%s %s %s", name, TOTPCommand, TOTPListCommand),
Options: []string{MultiLineCommand, EnvCommand, HelpCommand, ListCommand, ShowCommand, VersionCommand, JSONCommand},
diff --git a/internal/app/core.go b/internal/app/core.go
@@ -54,6 +54,8 @@ const (
TOTPOnceCommand = "once"
// EnvDefaultsCommand will display the default env variables, not those set
EnvDefaultsCommand = "defaults"
+ // EnvShortCommand will output the set environment variables
+ EnvShortCommand = "short"
// BashCommand is the command to generate bash completions
BashCommand = "bash"
// BashDefaultsCommand will generate environment agnostic completions
diff --git a/internal/app/doc/bash b/internal/app/doc/bash
@@ -12,6 +12,9 @@ _{{ $.Executable }}() {
else
if [ "$COMP_CWORD" -eq 2 ]; then
case ${COMP_WORDS[1]} in
+ "{{ $.EnvCommand }}")
+ opts="{{ $.EnvShortCommand }}"
+ ;;
"{{ $.HelpCommand }}")
opts="{{ $.HelpAdvancedCommand }}"
;;
diff --git a/internal/app/doc/zsh b/internal/app/doc/zsh
@@ -15,6 +15,11 @@ _{{ $.Executable }}() {
;;
*)
case $words[2] in
+ "{{ $.EnvCommand }}")
+ if [ "$len" -eq 3 ]; then
+ compadd "$@" "{{ $.EnvShortCommand }}"
+ fi
+ ;;
"{{ $.HelpCommand }}")
if [ "$len" -eq 3 ]; then
compadd "$@" "{{ $.HelpAdvancedCommand }}"
diff --git a/internal/app/info.go b/internal/app/info.go
@@ -44,15 +44,20 @@ func info(command string, args []string) ([]string, error) {
return results, nil
case EnvCommand, BashCommand, ZshCommand:
defaultFlag := BashDefaultsCommand
+ secondFlag := ""
isEnv := command == EnvCommand
if isEnv {
defaultFlag = EnvDefaultsCommand
+ secondFlag = EnvShortCommand
}
- defaults, err := getInfoDefault(args, defaultFlag)
+ defaults, short, err := getInfoDefault(args, defaultFlag, secondFlag)
if err != nil {
return nil, err
}
if isEnv {
+ if short {
+ return config.Environ(), nil
+ }
return config.ListEnvironmentVariables(!defaults), nil
}
return GenerateCompletions(command == BashCommand, defaults)
@@ -60,23 +65,29 @@ func info(command string, args []string) ([]string, error) {
return nil, nil
}
-func getInfoDefault(args []string, possibleArg string) (bool, error) {
- defaults := false
+func getInfoDefault(args []string, possibleArg, otherArg string) (bool, bool, error) {
+ first := false
+ second := false
invalid := false
switch len(args) {
case 0:
break
case 1:
- if args[0] == possibleArg {
- defaults = true
+ arg := args[0]
+ if arg == possibleArg {
+ first = true
} else {
invalid = true
+ if otherArg != "" && arg == otherArg {
+ invalid = false
+ second = true
+ }
}
default:
invalid = true
}
if invalid {
- return false, errors.New("invalid argument")
+ return false, false, errors.New("invalid argument")
}
- return defaults, nil
+ return first, second, nil
}
diff --git a/internal/app/info_test.go b/internal/app/info_test.go
@@ -67,6 +67,9 @@ func TestBashInfo(t *testing.T) {
if _, err = app.Info(&buf, "bash", []string{"test", "default"}); err.Error() != "invalid argument" {
t.Errorf("invalid error: %v", err)
}
+ if _, err = app.Info(&buf, "bash", []string{"short"}); err.Error() != "invalid argument" {
+ t.Errorf("invalid error: %v", err)
+ }
}
func TestEnvInfo(t *testing.T) {
@@ -93,6 +96,24 @@ func TestEnvInfo(t *testing.T) {
if _, err = app.Info(&buf, "env", []string{"test", "default"}); err.Error() != "invalid argument" {
t.Errorf("invalid error: %v", err)
}
+ os.Clearenv()
+ buf = bytes.Buffer{}
+ ok, err = app.Info(&buf, "env", []string{"short"})
+ if ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() != "" {
+ t.Error("something written")
+ }
+ os.Setenv("LOCKBOX_TEST", "1")
+ buf = bytes.Buffer{}
+ ok, err = app.Info(&buf, "env", []string{"short"})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
}
func TestZshInfo(t *testing.T) {
diff --git a/internal/config/core.go b/internal/config/core.go
@@ -7,6 +7,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "sort"
"strconv"
"strings"
@@ -318,3 +319,15 @@ func IsUnset(k, v string) (bool, error) {
}
return false, nil
}
+
+// Environ will list the current environment keys
+func Environ() []string {
+ var results []string
+ for _, k := range os.Environ() {
+ if strings.HasPrefix(k, prefixKey) {
+ results = append(results, k)
+ }
+ }
+ sort.Strings(results)
+ return results
+}
diff --git a/internal/config/core_test.go b/internal/config/core_test.go
@@ -141,3 +141,17 @@ func TestIsUnset(t *testing.T) {
t.Error("found unset var")
}
}
+
+func TestEnviron(t *testing.T) {
+ os.Clearenv()
+ e := config.Environ()
+ if len(e) != 0 {
+ t.Error("invalid environ")
+ }
+ os.Setenv("LOCKBOX_1", "1")
+ os.Setenv("LOCKBOX_2", "2")
+ e = config.Environ()
+ if len(e) != 2 || fmt.Sprintf("%v", e) != "[LOCKBOX_1=1 LOCKBOX_2=2]" {
+ t.Errorf("invalid environ: %v", e)
+ }
+}