diff --git a/cmd/kubectx/flags.go b/cmd/kubectx/flags.go index 060cd1c..0a40f4d 100644 --- a/cmd/kubectx/flags.go +++ b/cmd/kubectx/flags.go @@ -40,6 +40,17 @@ func parseArgs(argv []string) Op { return ListOp{} } + if argv[0] == "-q" { + if cmdutil.IsInteractiveMode(os.Stdout) { + if len(argv) > 1 { + return InteractiveSwitchOp{SelfCmd: os.Args[0], Query: argv[1]} + } else { + return UnsupportedOp{Err: fmt.Errorf("'-q' needs an argument")} + } + } else { + return UnsupportedOp{Err: fmt.Errorf("'-q' only works in interactive mode")} + } + } if argv[0] == "-d" { if len(argv) == 1 { if cmdutil.IsInteractiveMode(os.Stdout) { diff --git a/cmd/kubectx/flags_test.go b/cmd/kubectx/flags_test.go index 071e3bf..9ac14a9 100644 --- a/cmd/kubectx/flags_test.go +++ b/cmd/kubectx/flags_test.go @@ -78,6 +78,10 @@ func Test_parseArgs_new(t *testing.T) { {name: "too many args", args: []string{"a", "b", "c"}, want: UnsupportedOp{Err: fmt.Errorf("too many arguments")}}, + {name: "missing query", + args: []string{"-q"}, + want: UnsupportedOp{Err: fmt.Errorf("'-q' only works in interactive mode")}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/cmd/kubectx/fzf.go b/cmd/kubectx/fzf.go index 5006129..7840973 100644 --- a/cmd/kubectx/fzf.go +++ b/cmd/kubectx/fzf.go @@ -31,14 +31,23 @@ import ( ) type InteractiveSwitchOp struct { - SelfCmd string + SelfCmd string + Query string + FzfFlags []string } type InteractiveDeleteOp struct { SelfCmd string } -func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error { +func (op InteractiveSwitchOp) Run(stdout io.Writer, stderr io.Writer) error { + if op.Query != "" { + op.FzfFlags = append(op.FzfFlags, "-q", op.Query) + } + return op._Run(stdout, stderr) +} + +func (op InteractiveSwitchOp) _Run(_, stderr io.Writer) error { // parse kubeconfig just to see if it can be loaded kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader) if err := kc.Parse(); err != nil { @@ -49,8 +58,11 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error { return errors.Wrap(err, "kubeconfig error") } kc.Close() - - cmd := exec.Command("fzf", "--ansi", "--no-preview") + fzfFlags := append([]string{"--ansi", "--no-preview"}, op.FzfFlags...) + cmd := exec.Command( + "fzf", + fzfFlags..., + ) var out bytes.Buffer cmd.Stdin = os.Stdin cmd.Stderr = stderr diff --git a/cmd/kubectx/help.go b/cmd/kubectx/help.go index 020d2a3..876eb63 100644 --- a/cmd/kubectx/help.go +++ b/cmd/kubectx/help.go @@ -41,6 +41,7 @@ func printUsage(out io.Writer) error { %PROG% =. : rename current-context to %PROG% -u, --unset : unset the current context %PROG% -d [] : delete context ('.' for current-context) + %PROG% -q : start the finder with the given query %SPAC% (this command won't delete the user/cluster entry %SPAC% referenced by the context entry) %PROG% -h,--help : show this message