on main help sign in
feat(shell): use coreutils from u-root
commitec7894ff9f13b108094c03541c5ef6855cded994 authorAndrey Nering <andreynering@users.noreply.github.com> dateWed 16 Jul 2025, 13:53 (1 year ago) parentcb3bcaa
4 files changed+66−3
go.mod+2−1 go.sum+4−1 internal/shell/coreutils.go+59 internal/shell/shell.go+1−1
go.mod+2−1
@@ -39,6 +39,7 @@ require (
3939 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
4040 github.com/stretchr/testify v1.10.0
4141 github.com/tidwall/sjson v1.2.5
42+ github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc
4243 github.com/zeebo/xxh3 v1.0.2
4344 golang.org/x/exp v0.0.0-20250305212735-054e65f0b394
4445 gopkg.in/natefinch/lumberjack.v2 v2.2.1
@@ -108,7 +109,7 @@ require (
108109 github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
109110 github.com/sethvargo/go-retry v0.3.0 // indirect
110111 github.com/spf13/cast v1.7.1 // indirect
111− github.com/spf13/pflag v1.0.6 // indirect
112+ github.com/spf13/pflag v1.0.7 // indirect
112113 github.com/tetratelabs/wazero v1.9.0 // indirect
113114 github.com/tidwall/gjson v1.18.0 // indirect
114115 github.com/tidwall/match v1.1.1 // indirect
go.sum+4−1
@@ -234,8 +234,9 @@ github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
234234github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
235235github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
236236github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
237−github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
238237github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
238+github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
239+github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
239240github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
240241github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
241242github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
@@ -258,6 +259,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
258259github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
259260github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
260261github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
262+github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc h1:HjI/UCF4dRyzizePQrhGUSQvuU7z4tOqMqz6GRGlFCM=
263+github.com/u-root/u-root v0.14.1-0.20250722142936-bf4e78a90dfc/go.mod h1:/0Qr7qJeDwWxoKku2xKQ4Szc+SwBE3g9VE8jNiamsmc=
261264github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
262265github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
263266github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
internal/shell/coreutils.gonew file+59
@@ -0,0 +1,59 @@
1+package shell
2+
3+import (
4+ "context"
5+
6+ "github.com/u-root/u-root/pkg/core"
7+ "github.com/u-root/u-root/pkg/core/cat"
8+ "github.com/u-root/u-root/pkg/core/chmod"
9+ "github.com/u-root/u-root/pkg/core/cp"
10+ "github.com/u-root/u-root/pkg/core/find"
11+ "github.com/u-root/u-root/pkg/core/ls"
12+ "github.com/u-root/u-root/pkg/core/mkdir"
13+ "github.com/u-root/u-root/pkg/core/mv"
14+ "github.com/u-root/u-root/pkg/core/rm"
15+ "github.com/u-root/u-root/pkg/core/touch"
16+ "github.com/u-root/u-root/pkg/core/xargs"
17+ "mvdan.cc/sh/v3/interp"
18+)
19+
20+var coreUtils = map[string]func() core.Command{
21+ "cat": func() core.Command { return cat.New() },
22+ "chmod": func() core.Command { return chmod.New() },
23+ "cp": func() core.Command { return cp.New() },
24+ "find": func() core.Command { return find.New() },
25+ "ls": func() core.Command { return ls.New() },
26+ "mkdir": func() core.Command { return mkdir.New() },
27+ "mv": func() core.Command { return mv.New() },
28+ "rm": func() core.Command { return rm.New() },
29+ "touch": func() core.Command { return touch.New() },
30+ "xargs": func() core.Command { return xargs.New() },
31+}
32+
33+func (s *Shell) coreUtilsHandler() func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
34+ return func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc {
35+ return func(ctx context.Context, args []string) error {
36+ if len(args) == 0 {
37+ return next(ctx, args)
38+ }
39+
40+ program, programArgs := args[0], args[1:]
41+
42+ newCoreUtil, ok := coreUtils[program]
43+ if !ok {
44+ return next(ctx, args)
45+ }
46+
47+ c := interp.HandlerCtx(ctx)
48+
49+ cmd := newCoreUtil()
50+ cmd.SetIO(c.Stdin, c.Stdout, c.Stderr)
51+ cmd.SetWorkingDir(c.Dir)
52+ cmd.SetLookupEnv(func(key string) (string, bool) {
53+ v := c.Env.Get(key)
54+ return v.Str, v.Set
55+ })
56+ return cmd.RunContext(ctx, programArgs...)
57+ }
58+ }
59+}
internal/shell/shell.go+1−1
@@ -221,7 +221,7 @@ func (s *Shell) execPOSIX(ctx context.Context, command string) (string, string,
221221 interp.Interactive(false),
222222 interp.Env(expand.ListEnviron(s.env...)),
223223 interp.Dir(s.cwd),
224− interp.ExecHandlers(s.blockHandler()),
224+ interp.ExecHandlers(s.blockHandler(), s.coreUtilsHandler()),
225225 )
226226 if err != nil {
227227 return "", "", fmt.Errorf("could not run command: %w", err)