summaryrefslogtreecommitdiff
path: root/tools/chain.go
diff options
context:
space:
mode:
authorGrail Finder <wohilas@gmail.com>2026-03-14 16:34:58 +0300
committerGrail Finder <wohilas@gmail.com>2026-03-14 16:34:58 +0300
commit26377702d335261fb5e307038e0f829ab9a42fb1 (patch)
tree6a06eb25733d0fc8e4f7a048ed6da920ca4cdb49 /tools/chain.go
parentfdcaa6c5e2a192ce10e47a49dec7854b9e46ba75 (diff)
Fix: view_img, exec commands
Diffstat (limited to 'tools/chain.go')
-rw-r--r--tools/chain.go77
1 files changed, 76 insertions, 1 deletions
diff --git a/tools/chain.go b/tools/chain.go
index 73ab6cd..4afb7e5 100644
--- a/tools/chain.go
+++ b/tools/chain.go
@@ -239,7 +239,12 @@ func execBuiltin(name string, args []string, stdin string) string {
}
return ""
}
- data, err := os.ReadFile(args[0])
+ path := args[0]
+ abs := path
+ if !filepath.IsAbs(path) {
+ abs = filepath.Join(fsRootDir, path)
+ }
+ data, err := os.ReadFile(abs)
if err != nil {
return fmt.Sprintf("[error] cat: %v", err)
}
@@ -266,6 +271,76 @@ func execBuiltin(name string, args []string, stdin string) string {
}
fsRootDir = abs
return fmt.Sprintf("Changed directory to: %s", fsRootDir)
+ case "mkdir":
+ if len(args) == 0 {
+ return "[error] usage: mkdir [-p] <dir>"
+ }
+ createParents := false
+ var dirPath string
+ for _, a := range args {
+ if a == "-p" || a == "--parents" {
+ createParents = true
+ } else if dirPath == "" {
+ dirPath = a
+ }
+ }
+ if dirPath == "" {
+ return "[error] usage: mkdir [-p] <dir>"
+ }
+ abs := dirPath
+ if !filepath.IsAbs(dirPath) {
+ abs = filepath.Join(fsRootDir, dirPath)
+ }
+ abs = filepath.Clean(abs)
+ var mkdirFunc func(string, os.FileMode) error
+ if createParents {
+ mkdirFunc = os.MkdirAll
+ } else {
+ mkdirFunc = os.Mkdir
+ }
+ if err := mkdirFunc(abs, 0o755); err != nil {
+ return fmt.Sprintf("[error] mkdir: %v", err)
+ }
+ if createParents {
+ return fmt.Sprintf("Created %s (with parents)", dirPath)
+ }
+ return fmt.Sprintf("Created %s", dirPath)
+ case "ls":
+ dir := "."
+ for _, a := range args {
+ if !strings.HasPrefix(a, "-") {
+ dir = a
+ break
+ }
+ }
+ abs := dir
+ if !filepath.IsAbs(dir) {
+ abs = filepath.Join(fsRootDir, dir)
+ }
+ entries, err := os.ReadDir(abs)
+ if err != nil {
+ return fmt.Sprintf("[error] ls: %v", err)
+ }
+ var out strings.Builder
+ for _, e := range entries {
+ info, _ := e.Info()
+ if e.IsDir() {
+ fmt.Fprintf(&out, "d %-8s %s/\n", "-", e.Name())
+ } else if info != nil {
+ size := info.Size()
+ sizeStr := fmt.Sprintf("%d", size)
+ if size > 1024 {
+ sizeStr = fmt.Sprintf("%.1fKB", float64(size)/1024)
+ }
+ fmt.Fprintf(&out, "f %-8s %s\n", sizeStr, e.Name())
+ } else {
+ fmt.Fprintf(&out, "f %-8s %s\n", "?", e.Name())
+ }
+ }
+ if out.Len() == 0 {
+ return "(empty directory)"
+ }
+ return strings.TrimRight(out.String(), "\n")
case "go":
// Allow all go subcommands
if len(args) == 0 {