diff --git a/cli/context/signal.go b/cli/context/signal.go index 0edd75b..cf8f620 100644 --- a/cli/context/signal.go +++ b/cli/context/signal.go @@ -7,11 +7,7 @@ import ( "syscall" ) -func SelfCancelingContextFromBackground() (context.Context, context.CancelFunc) { - return SelfCancelingContext(context.Background()) -} - -func SelfCancelingContext(ctx context.Context) (context.Context, context.CancelFunc) { +func SelfCancelingCotext(ctx context.Context) (context.Context, context.CancelFunc) { c, done := context.WithCancel(ctx) ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) diff --git a/cmd/convids/main.go b/cmd/convids/main.go index 802bd0a..d938934 100644 --- a/cmd/convids/main.go +++ b/cmd/convids/main.go @@ -1,24 +1,67 @@ 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" - ccli "codeberg.org/danjones000/utils/internal/cli/convids" + "codeberg.org/danjones000/utils/cli/spin" + "codeberg.org/danjones000/utils/convids" + "github.com/spf13/pflag" ) const dataPath = "shows.yml" func main() { - ctx, done := c.SelfCancelingContextFromBackground() + loop := pflag.BoolP("loop", "l", false, "Loop") + help := pflag.BoolP("help", "h", false, "Get Help") + dryRun := pflag.BoolP("dry-run", "d", false, "Do a dry run") + pflag.Parse() + + if *help { + pflag.Usage() + os.Exit(2) + } + + ctx, done := c.SelfCancelingCotext(context.Background()) defer done() - app, err := ccli.NewApp(ctx, os.Args[0], os.Args[1:], dataPath, os.Stdout, os.Stdin, os.Stderr) + var walker convids.ShowWalker + if *dryRun { + *loop = false + walker = convids.DryRun(os.Stdout) + } else { + gs := convids.GetShow(ctx) + + 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) - err = app.Run(ctx) + 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/cmd/cool-down/main.go b/cmd/cool-down/main.go index 29efed5..234a06a 100644 --- a/cmd/cool-down/main.go +++ b/cmd/cool-down/main.go @@ -10,7 +10,7 @@ import ( ) func main() { - ctx, done := c.SelfCancelingContext(context.Background()) + ctx, done := c.SelfCancelingCotext(context.Background()) defer done() ctx = chill.Chill(ctx) s := spin.Spin(ctx, "Waiting for CPU to cool...") diff --git a/convids/logic.go b/convids/logic.go index 6d90c2b..80ef641 100644 --- a/convids/logic.go +++ b/convids/logic.go @@ -39,32 +39,21 @@ type GroupPrinter func(name string, group Shows) var ErrNoFiles = errors.New("no files processed") var ErrSkipped = errors.New("skipped") -type processInput struct { - file os.DirEntry - source string - show *Show - extRe *regexp.Regexp - skips []string - walk ShowWalker -} - -func processFile(input processInput) (processed bool, processError, cbError error) { - file := input.file +func processFile(conf *Config, walk ShowWalker, show *Show, file os.DirEntry) (processed bool, processError, cbError error) { if file.IsDir() { return } - if !input.extRe.MatchString(file.Name()) { + if !conf.extRe.MatchString(file.Name()) { return } - show := input.show var found bool found, processError = show.Match(file.Name()) if processError != nil || !found { return } - path := fp.Join(input.source, file.Name()) - for _, ext := range input.skips { + path := fp.Join(conf.Source, file.Name()) + for _, ext := range conf.Skip { if !strings.HasPrefix(ext, ".") { ext = "." + ext } @@ -75,31 +64,13 @@ func processFile(input processInput) (processed bool, processError, cbError erro } } - cbError = input.walk(show, path) + cbError = walk(show, path) if cbError == nil { processed = true } return } -type fileMap map[string][]os.DirEntry - -func (fm fileMap) GetFiles(path string) []os.DirEntry { - files, ok := fm[path] - if ok { - return files - } - fm.ReadPath(path) - return fm[path] -} - -func (fm fileMap) ReadPath(path string) { - if _, ok := fm[path]; ok { - return - } - fm[path], _ = os.ReadDir(path) -} - func WalkFiles(d *Data, stopOnError bool, gp GroupPrinter, cb ShowWalker) (err error) { err = ensureExtRe(d.Config) if err != nil { @@ -109,42 +80,33 @@ func WalkFiles(d *Data, stopOnError bool, gp GroupPrinter, cb ShowWalker) (err e cb = DryRun(os.Stdout) } count := 0 - allFiles := fileMap{} var files []os.DirEntry - + files, err = os.ReadDir(d.Config.Source) if err != nil { return } for s := range d.AllShows(gp) { - if len(s.Sources) == 0 { - s.Sources = []string{d.Config.Source} - } - showstart: - for _, source := range s.Sources { - files = allFiles.GetFiles(source) - for _, file := range files { - pIn := processInput{file, source, s, d.Config.extRe, d.Config.Skip, cb} - processed, processErr, cbErr := processFile(pIn) - if !processed && processErr == nil && cbErr == nil { - continue - } - if errors.Is(processErr, ErrSkipped) { - continue - } - if processErr != nil { - return processErr - } - if cbErr != nil && stopOnError { - return cbErr - } - if cbErr == nil && processed { - count++ - } - if cbErr != nil { - err = cbErr - } - break showstart + for _, file := range files { + processed, processErr, cbErr := processFile(d.Config, cb, s, file) + if !processed && processErr == nil && cbErr == nil { + continue } + if errors.Is(processErr, ErrSkipped) { + continue + } + if processErr != nil { + return processErr + } + if cbErr != nil && stopOnError { + return cbErr + } + if cbErr == nil && processed { + count++ + } + if cbErr != nil { + err = cbErr + } + break } } if err == nil && count < 1 { @@ -162,18 +124,13 @@ func DryRun(out io.Writer) ShowWalker { } func GetShow(ctx context.Context) ShowWalker { - return GetShowWithIO(ctx, os.Stdin, os.Stdout, os.Stderr) -} - -func GetShowWithIO(ctx context.Context, stdin io.Reader, stdout io.Writer, stderr io.Writer) ShowWalker { return func(s *Show, path string) error { cmd := exec.CommandContext(ctx, "get-shows", s.Folder, path) - cmd.Stdin = stdin - cmd.Stdout = stdout - cmd.Stderr = stderr + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr return cmd.Run() } - } func PrintGroupName(out io.Writer) GroupPrinter { diff --git a/convids/models.go b/convids/models.go index 58b8992..b7ad695 100644 --- a/convids/models.go +++ b/convids/models.go @@ -25,7 +25,6 @@ type Show struct { Pattern string Name string Anime bool - Sources []string re *regexp.Regexp } diff --git a/internal/cli/convids/app.go b/internal/cli/convids/app.go deleted file mode 100644 index 6bd349b..0000000 --- a/internal/cli/convids/app.go +++ /dev/null @@ -1,60 +0,0 @@ -package convids - -import ( - "context" - "fmt" - "io" - - conutils "codeberg.org/danjones000/utils/convids" - "github.com/spf13/pflag" -) - -type App struct { - Name string - Data *conutils.Data - flags *pflag.FlagSet - stdout io.Writer - stderr io.Writer - stdin io.Reader - walker conutils.ShowWalker - groupPrinter conutils.GroupPrinter -} - -func NewApp(ctx context.Context, name string, args []string, dataPath string, stdout io.Writer, stdin io.Reader, stderr io.Writer) (*App, error) { - a := App{Name: name, stdout: stdout, stdin: stdin, stderr: stderr} - var err error - a.flags, err = ParseFlags(name, args) - if err != nil { - return nil, err - } - - a.walker = GetWalker(ctx, *DryRun, stdin, stdout, stderr) - a.Data, err = conutils.NewData(dataPath) - if err != nil { - return nil, err - } - a.groupPrinter = conutils.PrintGroupName(stdout) - - return &a, nil -} - -func (a *App) Run(ctx context.Context) error { - if *Loop { - return a.runInLoop(ctx) - } - return a.run(ctx) -} - -func (a *App) run(ctx context.Context) error { - return conutils.WalkFiles(a.Data, false, a.groupPrinter, a.walker) -} - -func (a *App) runInLoop(ctx context.Context) error { - fmt.Fprintln(a.stdout, "Looping") - var err error - for err == nil { - err = a.run(ctx) - fmt.Fprintln(a.stdout, err) - } - return err -} diff --git a/internal/cli/convids/flags.go b/internal/cli/convids/flags.go deleted file mode 100644 index af2b2af..0000000 --- a/internal/cli/convids/flags.go +++ /dev/null @@ -1,39 +0,0 @@ -package convids - -import ( - "fmt" - - "github.com/spf13/pflag" -) - -var Help *bool -var Loop *bool -var DryRun *bool - -func GetFlags(name string) *pflag.FlagSet { - flags := pflag.NewFlagSet(name, pflag.ExitOnError) - - Help = flags.BoolP("help", "h", false, "Get Help") - Loop = flags.BoolP("loop", "l", false, "Loop") - DryRun = flags.BoolP("dry-run", "d", false, "Do a dry run (won't loop)") - - flags.Usage = func() { - fmt.Printf("Usage of %s:\n", name) - flags.PrintDefaults() - } - return flags -} - -func ParseFlags(name string, args []string) (*pflag.FlagSet, error) { - flags := GetFlags(name) - err := flags.Parse(args) - if err != nil { - return nil, err - } - - if *DryRun { - flags.Set("loop", "false") - } - - return flags, nil -} diff --git a/internal/cli/convids/walker.go b/internal/cli/convids/walker.go deleted file mode 100644 index a7dc85c..0000000 --- a/internal/cli/convids/walker.go +++ /dev/null @@ -1,29 +0,0 @@ -package convids - -import ( - "context" - "fmt" - "io" - - "codeberg.org/danjones000/utils/chill" - "codeberg.org/danjones000/utils/cli/spin" - conutils "codeberg.org/danjones000/utils/convids" -) - -func GetWalker(ctx context.Context, dryRun bool, in io.Reader, out, errOut io.Writer) conutils.ShowWalker { - if dryRun { - return conutils.DryRun(out) - } - - gs := conutils.GetShowWithIO(ctx, in, out, errOut) - return func(s *conutils.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) - } -}