From 78536c3e19a81591c98a198df96a2417da711d13 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sun, 13 Apr 2025 19:28:57 +0200 Subject: [PATCH] Implement doublestar wildcards --- .gitignore | 1 + go.mod | 2 ++ go.sum | 2 ++ instruction.go | 26 ++++++++++++++++++++------ main.go | 6 +++--- sync.yaml | 4 ++-- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index d3b3343..fd380e4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.exe cln cln.log +.qodo diff --git a/go.mod b/go.mod index c124068..41ee0bc 100644 --- a/go.mod +++ b/go.mod @@ -3,3 +3,5 @@ module cln go 1.21.7 require gopkg.in/yaml.v3 v3.0.1 + +require github.com/bmatcuk/doublestar/v4 v4.8.1 diff --git a/go.sum b/go.sum index a62c313..b827d61 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= +github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/instruction.go b/instruction.go index d8bba5a..6485168 100644 --- a/instruction.go +++ b/instruction.go @@ -6,6 +6,7 @@ import ( "path/filepath" "strings" + "github.com/bmatcuk/doublestar/v4" "gopkg.in/yaml.v3" ) @@ -285,7 +286,7 @@ func ParseYAMLFile(filename, workdir string) ([]LinkInstruction, error) { for _, link := range config.Links { if strings.Contains(link.Source, "*") { LogSource("Expanding wildcard source %s in YAML file %s", link.Source, filename) - newlinks, err := ExpandWildcard(link.Source, workdir, link.Target) + newlinks, err := ExpandPattern(link.Source, workdir, link.Target) if err != nil { return nil, fmt.Errorf("error expanding wildcard: %w", err) } @@ -321,19 +322,32 @@ func ParseYAMLFile(filename, workdir string) ([]LinkInstruction, error) { return expanded, nil } -func ExpandWildcard(source, workdir, target string) (links []LinkInstruction, err error) { - dir := filepath.Dir(source) - pattern := filepath.Base(source) +func ExpandPattern(source, workdir, target string) (links []LinkInstruction, err error) { + static, pattern := doublestar.SplitPattern(source) + if static == "" { + cwd, err := os.Getwd() + if err != nil { + return nil, fmt.Errorf("error getting current working directory: %w", err) + } + static = cwd + } + LogInfo("Static part: %s", static) + LogInfo("Pattern part: %s", pattern) - files, err := filepath.Glob(filepath.Join(workdir, dir, pattern)) + files, err := doublestar.Glob(os.DirFS(static), pattern) if err != nil { return nil, fmt.Errorf("error expanding wildcard: %w", err) } for _, file := range files { + ext := filepath.Ext(file) + if ext == "" { + LogInfo("Skipping file %s because it has no extension (Directory?)", file) + continue + } link := LinkInstruction{ Source: file, - Target: filepath.Join(target, filepath.Base(file)), + Target: filepath.Join(target, file), } links = append(links, link) } diff --git a/main.go b/main.go index 10ccf59..a9720d3 100644 --- a/main.go +++ b/main.go @@ -62,9 +62,9 @@ func main() { LogInfo("Reading from command line arguments") go ReadFromArgs(instructions, status) - case IsPipeInput(): - LogInfo("Reading from stdin pipe") - go ReadFromStdin(instructions, status) + // case IsPipeInput(): + // LogInfo("Reading from stdin pipe") + // go ReadFromStdin(instructions, status) default: if _, err := os.Stat("sync"); err == nil { diff --git a/sync.yaml b/sync.yaml index 3def8c9..8f361d1 100644 --- a/sync.yaml +++ b/sync.yaml @@ -1,2 +1,2 @@ -- source: \* - target: test/ \ No newline at end of file +- source: A/**/* + target: B \ No newline at end of file