Add kubectl-bkl
This commit is contained in:
@@ -3,31 +3,18 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime/debug"
|
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/gopatchy/bkl"
|
"github.com/gopatchy/bkl/wrapper"
|
||||||
"golang.org/x/exp/slices"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if os.Getenv("BKL_VERSION") != "" {
|
cmd := filepath.Base(os.Args[0])
|
||||||
bi, ok := debug.ReadBuildInfo()
|
|
||||||
if !ok {
|
|
||||||
fatal(fmt.Errorf("ReadBuildInfo() failed")) //nolint:goerr113
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("%s", bi)
|
if strings.HasSuffix(cmd, "b") {
|
||||||
os.Exit(0)
|
cmd = strings.TrimSuffix(cmd, "b")
|
||||||
}
|
} else {
|
||||||
|
|
||||||
cmd := strings.TrimSuffix(filepath.Base(os.Args[0]), "b")
|
|
||||||
args := slices.Clone(os.Args[1:])
|
|
||||||
|
|
||||||
if cmd == "bkl" {
|
|
||||||
// Run as bklb, not via symlink
|
// Run as bklb, not via symlink
|
||||||
//nolint:goerr113,revive,stylecheck
|
//nolint:goerr113,revive,stylecheck
|
||||||
fatal(fmt.Errorf(`Usage:
|
fatal(fmt.Errorf(`Usage:
|
||||||
@@ -36,46 +23,7 @@ func main() {
|
|||||||
See https://bkl.gopatchy.io/#bklb for detailed documentation.`))
|
See https://bkl.gopatchy.io/#bklb for detailed documentation.`))
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdPath, err := exec.LookPath(cmd)
|
wrapper.WrapOrDie(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()))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func fatal(err error) {
|
func fatal(err error) {
|
||||||
|
|||||||
9
cmd/kubectl-bkl/main.go
Normal file
9
cmd/kubectl-bkl/main.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gopatchy/bkl/wrapper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
wrapper.WrapOrDie("kubectl")
|
||||||
|
}
|
||||||
73
wrapper/wrapper.go
Normal file
73
wrapper/wrapper.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user