Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
fa276a4af3 chore(deps): bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 01:42:30 +00:00
4 changed files with 20 additions and 53 deletions

View File

@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- run: git fetch --tags
- name: Setup Go
uses: actions/setup-go@v6

View File

@@ -38,7 +38,7 @@ func parseArgs(argv []string) Op {
if n == 0 {
if cmdutil.IsInteractiveMode(os.Stdout) {
return InteractiveSwitchOp{}
return InteractiveSwitchOp{SelfCmd: os.Args[0]}
}
return ListOp{}
}

View File

@@ -16,23 +16,26 @@ package main
import (
"bytes"
"context"
"errors"
"fmt"
"io"
"os"
"os/exec"
"strings"
"time"
"github.com/ahmetb/kubectx/internal/cmdutil"
"github.com/ahmetb/kubectx/internal/env"
"github.com/ahmetb/kubectx/internal/kubeconfig"
"github.com/ahmetb/kubectx/internal/printer"
)
type InteractiveSwitchOp struct{}
type InteractiveSwitchOp struct {
SelfCmd string
}
// TODO(ahmetb) This method is heavily repetitive vs kubectx/fzf.go.
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)
defer kc.Close()
if err := kc.Parse(); err != nil {
@@ -43,48 +46,23 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error {
return fmt.Errorf("kubeconfig error: %w", err)
}
ctx, err := kc.GetCurrentContext()
ctxNames, err := kc.ContextNames()
if err != nil {
return fmt.Errorf("failed to get current context: %w", err)
return fmt.Errorf("failed to get context names: %w", err)
}
if ctx == "" {
return errors.New("current-context is not set")
}
curNs, err := kc.NamespaceOfContext(ctx)
if err != nil {
return fmt.Errorf("cannot read current namespace: %w", err)
}
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case <-time.After(3 * time.Second):
printer.Warning(stderr, `listing namespaces is taking long, switch to a namespace directly with "kubens -f <ns>"`)
case <-ctx.Done():
}
}()
ns, err := queryNamespaces(ctx, kc)
cancel()
if err != nil {
return fmt.Errorf("could not list namespaces (is the cluster accessible?): %w", err)
}
var input bytes.Buffer
for _, c := range ns {
s := c
if c == curNs {
s = printer.ActiveItemColor.Sprint(c)
}
fmt.Fprintf(&input, "%s\n", s)
if len(ctxNames) == 0 {
return errors.New("no contexts found in the kubeconfig file")
}
cmd := exec.Command("fzf", "--ansi", "--no-preview")
cmd.Stdin = &input
cmd.Stderr = stderr
var out bytes.Buffer
cmd.Stdin = os.Stdin
cmd.Stderr = stderr
cmd.Stdout = &out
cmd.Env = append(os.Environ(),
fmt.Sprintf("FZF_DEFAULT_COMMAND=%s", op.SelfCmd),
fmt.Sprintf("%s=1", env.EnvForceColor))
if err := cmd.Run(); err != nil {
var exitErr *exec.ExitError
if !errors.As(err, &exitErr) {

View File

@@ -21,7 +21,6 @@ import (
"io"
"os"
"slices"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
@@ -53,17 +52,7 @@ func (op ListOp) Run(stdout, stderr io.Writer) error {
return fmt.Errorf("cannot read current namespace: %w", err)
}
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case <-time.After(3 * time.Second):
printer.Warning(stderr, `listing namespaces is taking long, switch to a namespace directly with "kubens -f <ns>"`)
case <-ctx.Done():
}
}()
ns, err := queryNamespaces(ctx, kc)
cancel()
ns, err := queryNamespaces(kc)
if err != nil {
return fmt.Errorf("could not list namespaces (is the cluster accessible?): %w", err)
}
@@ -78,7 +67,7 @@ func (op ListOp) Run(stdout, stderr io.Writer) error {
return nil
}
func queryNamespaces(ctx context.Context, kc *kubeconfig.Kubeconfig) ([]string, error) {
func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) {
if os.Getenv("_MOCK_NAMESPACES") != "" {
return []string{"ns1", "ns2"}, nil
}
@@ -92,7 +81,7 @@ func queryNamespaces(ctx context.Context, kc *kubeconfig.Kubeconfig) ([]string,
var next string
for {
list, err := clientset.CoreV1().Namespaces().List(
ctx,
context.Background(),
metav1.ListOptions{
Limit: 500,
Continue: next,