✨ convids seems to work properly now
This commit is contained in:
parent
0272aa3b22
commit
5e8f954a14
3 changed files with 99 additions and 34 deletions
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue