From 5e8f954a147cc9968a3244cb53fb9e0659ff4d20 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Thu, 7 Nov 2024 05:56:06 -0600 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20convids=20seems=20to=20work=20prope?= =?UTF-8?q?rly=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Taskfile.yml | 4 +- cmd/convids/main.go | 38 ++++++++++++++++--- convids/logic.go | 91 ++++++++++++++++++++++++++++++++------------- 3 files changed, 99 insertions(+), 34 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 34dfb3f..fce2e25 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -56,9 +56,7 @@ tasks: build-convids: desc: Builds the convids command sources: - - cmd/convids/**/*.go - - convids/**/*.go - - cli/err/*go + - '**/*.go' generates: - build/convids cmds: diff --git a/cmd/convids/main.go b/cmd/convids/main.go index fd53b65..d938934 100644 --- a/cmd/convids/main.go +++ b/cmd/convids/main.go @@ -1,10 +1,14 @@ package main import ( + "context" "fmt" "os" + "codeberg.org/danjones000/utils/chill" + c "codeberg.org/danjones000/utils/cli/context" e "codeberg.org/danjones000/utils/cli/err" + "codeberg.org/danjones000/utils/cli/spin" "codeberg.org/danjones000/utils/convids" "github.com/spf13/pflag" ) @@ -22,19 +26,43 @@ func main() { os.Exit(2) } - *dryRun = true // @todo temp + ctx, done := c.SelfCancelingCotext(context.Background()) + defer done() + var walker convids.ShowWalker if *dryRun { + *loop = false walker = convids.DryRun(os.Stdout) - } + } else { + gs := convids.GetShow(ctx) - if *loop { - fmt.Println("looping") + walker = func(s *convids.Show, path string) error { + ct := chill.Chill(ctx) + msg := fmt.Sprintf("Waiting for CPU to cool, for %s", path) + sp := spin.Spin(ct, msg) + err := sp.Wait() + if err != nil { + return err + } + return gs(s, path) + } } data, err := convids.NewData(dataPath) e.HandleErr(err) - convids.WalkFiles(data, false, convids.PrintGroupName(os.Stdout), walker) + groupPrinter := convids.PrintGroupName(os.Stdout) + + if *loop { + fmt.Println("looping") + for err == nil { + err = convids.WalkFiles(data, false, groupPrinter, walker) + fmt.Println(err) + } + } else { + err = convids.WalkFiles(data, false, groupPrinter, walker) + } + e.HandleErr(err) + fmt.Println("Done!") } diff --git a/convids/logic.go b/convids/logic.go index 3dbc7b6..80ef641 100644 --- a/convids/logic.go +++ b/convids/logic.go @@ -1,10 +1,12 @@ package convids import ( + "context" "errors" "fmt" "io" "os" + "os/exec" fp "path/filepath" "regexp" "strings" @@ -34,6 +36,41 @@ func ensureExtRe(c *Config) (err error) { type ShowWalker func(show *Show, path string) error type GroupPrinter func(name string, group Shows) +var ErrNoFiles = errors.New("no files processed") +var ErrSkipped = errors.New("skipped") + +func processFile(conf *Config, walk ShowWalker, show *Show, file os.DirEntry) (processed bool, processError, cbError error) { + if file.IsDir() { + return + } + if !conf.extRe.MatchString(file.Name()) { + return + } + var found bool + found, processError = show.Match(file.Name()) + if processError != nil || !found { + return + } + + path := fp.Join(conf.Source, file.Name()) + for _, ext := range conf.Skip { + if !strings.HasPrefix(ext, ".") { + ext = "." + ext + } + skipper := path + ext + _, statErr := os.Stat(skipper) + if !errors.Is(statErr, os.ErrNotExist) { + return processed, ErrSkipped, cbError + } + } + + cbError = walk(show, path) + if cbError == nil { + processed = true + } + return +} + func WalkFiles(d *Data, stopOnError bool, gp GroupPrinter, cb ShowWalker) (err error) { err = ensureExtRe(d.Config) if err != nil { @@ -42,55 +79,57 @@ func WalkFiles(d *Data, stopOnError bool, gp GroupPrinter, cb ShowWalker) (err e if cb == nil { cb = DryRun(os.Stdout) } + count := 0 var files []os.DirEntry files, err = os.ReadDir(d.Config.Source) if err != nil { return } for s := range d.AllShows(gp) { - var found bool - start: for _, file := range files { - if file.IsDir() { + processed, processErr, cbErr := processFile(d.Config, cb, s, file) + if !processed && processErr == nil && cbErr == nil { continue } - if !d.Config.extRe.MatchString(file.Name()) { + if errors.Is(processErr, ErrSkipped) { continue } - found, err = s.Match(file.Name()) - if err != nil { - return + if processErr != nil { + return processErr } - if !found { - continue + if cbErr != nil && stopOnError { + return cbErr } - - path := fp.Join(d.Config.Source, file.Name()) - for _, ext := range d.Config.Skip { - if !strings.HasPrefix(ext, ".") { - ext = "." + ext - } - skipper := path + ext - _, err := os.Stat(skipper) - if !errors.Is(err, os.ErrNotExist) { - break start - } + if cbErr == nil && processed { + count++ } - - err = cb(s, path) - if err != nil && stopOnError { - return + if cbErr != nil { + err = cbErr } break } } - return nil + if err == nil && count < 1 { + fmt.Println("Found nothing") + return ErrNoFiles + } + return } func DryRun(out io.Writer) ShowWalker { return func(s *Show, path string) error { fmt.Fprintf(out, "Saving %s to %s\n", path, s.Folder) - return nil + return ErrSkipped + } +} + +func GetShow(ctx context.Context) ShowWalker { + return func(s *Show, path string) error { + cmd := exec.CommandContext(ctx, "get-shows", s.Folder, path) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() } }