summaryrefslogtreecommitdiff
path: root/run
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-04-14 16:37:17 +0200
committerewy <ewy0@protonmail.com>2026-04-14 16:37:17 +0200
commit45a297a8e526094e8fce6e2c5c0fd89b381d1765 (patch)
tree852ebc3a0112c94dc9726d0b27ab057bf6383660 /run
i have to commit at some point!
Diffstat (limited to 'run')
-rw-r--r--run/run.go104
1 files changed, 104 insertions, 0 deletions
diff --git a/run/run.go b/run/run.go
new file mode 100644
index 0000000..578e552
--- /dev/null
+++ b/run/run.go
@@ -0,0 +1,104 @@
+package run
+
+import (
+ "fmt"
+ "os"
+ "pik/flags"
+ "pik/menu"
+ "pik/model"
+ "slices"
+)
+
+func Run(source *model.Source, target model.Target, args ...string) error {
+ tags := target.Tags()
+ skipTriggers := tags.Has(model.Single) || *flags.Single
+
+ if !skipTriggers {
+ err := Pre(source, target)
+ if err != nil {
+ return err
+ }
+ }
+ err := Exec(source, target, args...)
+ fmt.Println()
+ if err != nil {
+ return err
+ }
+ if !skipTriggers {
+ err := Post(source, target)
+ if err != nil {
+ return err
+ }
+ err = Final(source, target)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func Pre(source *model.Source, target model.Target) error {
+ return ExecWithTrigger(source, target, model.Pre)
+}
+
+func Post(source *model.Source, target model.Target) error {
+ return ExecWithTrigger(source, target, model.Post)
+}
+
+func Final(source *model.Source, target model.Target) error {
+ return ExecWithTrigger(source, target, model.Final)
+}
+
+func ExecWithTrigger(source *model.Source, target model.Target, tag model.Tag) error {
+ for _, t := range source.Targets {
+ if t.Tags().Has(tag) {
+ triggerSub := t.Sub()
+ targetSub := target.Sub()
+
+ for _, targetSubPart := range triggerSub {
+ if !slices.Contains(targetSub, targetSubPart) {
+ continue
+ }
+ }
+
+ err := Exec(source, t)
+ fmt.Println()
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+func Exec(source *model.Source, target model.Target, args ...string) error {
+ _, _ = fmt.Fprint(os.Stderr, menu.Banner(source, target, args...))
+ loc := source.Path
+ tags := target.Tags()
+ if *flags.At != "" {
+ loc = *flags.At
+ } else if tags.Has(model.Here) || *flags.Here {
+ wd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ loc = wd
+ }
+ cmd := target.Create(source)
+ cmd.Dir = loc
+ cmd.Stdout = os.Stdout
+ cmd.Stdin = os.Stdin
+ cmd.Stderr = os.Stderr
+ cmd.Args = append(cmd.Args, args...)
+
+ _, _ = fmt.Fprintln(os.Stderr, menu.InlineCmd(cmd))
+
+ if *flags.Dry {
+ return nil
+ }
+
+ if *flags.Root {
+ cmd.Args = append([]string{"sudo"}, cmd.Args...)
+ }
+ return cmd.Run()
+}