From 63ffd5a1685175282ed681c202c724377a040b57 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Thu, 20 Jul 2023 16:30:47 -0700 Subject: [PATCH] Add kubectl-bkl --- cmd/bklb/main.go | 64 ++++-------------------------------- cmd/kubectl-bkl/main.go | 9 +++++ wrapper/wrapper.go | 73 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 58 deletions(-) create mode 100644 cmd/kubectl-bkl/main.go create mode 100644 wrapper/wrapper.go diff --git a/cmd/bklb/main.go b/cmd/bklb/main.go index e5c2d9b..3393a5b 100644 --- a/cmd/bklb/main.go +++ b/cmd/bklb/main.go @@ -3,31 +3,18 @@ package main import ( "fmt" "os" - "os/exec" "path/filepath" - "runtime/debug" "strings" - "syscall" - "github.com/gopatchy/bkl" - "golang.org/x/exp/slices" + "github.com/gopatchy/bkl/wrapper" ) func main() { - if os.Getenv("BKL_VERSION") != "" { - bi, ok := debug.ReadBuildInfo() - if !ok { - fatal(fmt.Errorf("ReadBuildInfo() failed")) //nolint:goerr113 - } + cmd := filepath.Base(os.Args[0]) - fmt.Printf("%s", bi) - os.Exit(0) - } - - cmd := strings.TrimSuffix(filepath.Base(os.Args[0]), "b") - args := slices.Clone(os.Args[1:]) - - if cmd == "bkl" { + if strings.HasSuffix(cmd, "b") { + cmd = strings.TrimSuffix(cmd, "b") + } else { // Run as bklb, not via symlink //nolint:goerr113,revive,stylecheck fatal(fmt.Errorf(`Usage: @@ -36,46 +23,7 @@ func main() { See https://bkl.gopatchy.io/#bklb for detailed documentation.`)) } - cmdPath, err := exec.LookPath(cmd) - if err != nil { - fatal(err) - } - - for i, arg := range args { - realPath, f, err := bkl.FileMatch(arg) - if err != nil { - continue - } - - b := bkl.New() - - err = b.MergeFileLayers(realPath) - if err != nil { - fatal(err) - } - - pat := fmt.Sprintf( - "%s.*.%s", - filepath.Base(os.Args[0]), - filepath.Base(arg), - ) - - tmp, err := os.CreateTemp("", pat) - if err != nil { - fatal(err) - } - - err = b.OutputToFile(tmp.Name(), f) - if err != nil { - fatal(err) - } - - args[i] = tmp.Name() - - tmp.Close() - } - - fatal(syscall.Exec(cmdPath, append([]string{cmd}, args...), os.Environ())) + wrapper.WrapOrDie(cmd) } func fatal(err error) { diff --git a/cmd/kubectl-bkl/main.go b/cmd/kubectl-bkl/main.go new file mode 100644 index 0000000..48ce7f4 --- /dev/null +++ b/cmd/kubectl-bkl/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/gopatchy/bkl/wrapper" +) + +func main() { + wrapper.WrapOrDie("kubectl") +} diff --git a/wrapper/wrapper.go b/wrapper/wrapper.go new file mode 100644 index 0000000..21a3e88 --- /dev/null +++ b/wrapper/wrapper.go @@ -0,0 +1,73 @@ +package wrapper + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime/debug" + "syscall" + + "github.com/gopatchy/bkl" + "golang.org/x/exp/slices" +) + +func WrapOrDie(cmd string) { + if os.Getenv("BKL_VERSION") != "" { + bi, ok := debug.ReadBuildInfo() + if !ok { + fatal(fmt.Errorf("ReadBuildInfo() failed")) //nolint:goerr113 + } + + fmt.Printf("%s", bi) + os.Exit(0) + } + + cmdPath, err := exec.LookPath(cmd) + if err != nil { + fatal(err) + } + + args := slices.Clone(os.Args[1:]) + + for i, arg := range args { + realPath, f, err := bkl.FileMatch(arg) + if err != nil { + continue + } + + b := bkl.New() + + err = b.MergeFileLayers(realPath) + if err != nil { + fatal(err) + } + + pat := fmt.Sprintf( + "%s.*.%s", + filepath.Base(os.Args[0]), + filepath.Base(arg), + ) + + tmp, err := os.CreateTemp("", pat) + if err != nil { + fatal(err) + } + + err = b.OutputToFile(tmp.Name(), f) + if err != nil { + fatal(err) + } + + args[i] = tmp.Name() + + tmp.Close() + } + + fatal(syscall.Exec(cmdPath, append([]string{cmd}, args...), os.Environ())) +} + +func fatal(err error) { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) +}