2023-03-10 18:27:30 +00:00
|
|
|
package fingerprint
|
2017-09-16 11:44:13 -03:00
|
|
|
|
|
|
|
import (
|
2019-08-21 13:33:12 +09:00
|
|
|
"os"
|
2017-09-16 11:44:13 -03:00
|
|
|
"sort"
|
|
|
|
|
2021-01-07 11:48:33 -03:00
|
|
|
"github.com/go-task/task/v3/internal/execext"
|
2022-08-06 18:19:07 -03:00
|
|
|
"github.com/go-task/task/v3/internal/filepathext"
|
2023-12-29 20:32:03 +00:00
|
|
|
"github.com/go-task/task/v3/taskfile/ast"
|
2017-09-16 11:44:13 -03:00
|
|
|
)
|
|
|
|
|
2023-12-29 20:32:03 +00:00
|
|
|
func Globs(dir string, globs []*ast.Glob) ([]string, error) {
|
2025-03-22 20:06:16 -03:00
|
|
|
resultMap := make(map[string]bool)
|
2017-09-16 11:44:13 -03:00
|
|
|
for _, g := range globs {
|
2025-03-22 20:06:16 -03:00
|
|
|
matches, err := glob(dir, g.Glob)
|
2017-11-02 10:25:50 -02:00
|
|
|
if err != nil {
|
2019-08-21 13:33:12 +09:00
|
|
|
continue
|
2017-11-02 10:25:50 -02:00
|
|
|
}
|
2023-11-29 19:38:12 -06:00
|
|
|
for _, match := range matches {
|
2025-03-22 20:06:16 -03:00
|
|
|
resultMap[match] = !g.Negate
|
2023-11-29 19:38:12 -06:00
|
|
|
}
|
|
|
|
}
|
2025-03-22 20:06:16 -03:00
|
|
|
return collectKeys(resultMap), nil
|
2019-08-21 13:33:12 +09:00
|
|
|
}
|
|
|
|
|
2025-03-22 20:06:16 -03:00
|
|
|
func glob(dir string, g string) ([]string, error) {
|
2022-08-06 18:19:07 -03:00
|
|
|
g = filepathext.SmartJoin(dir, g)
|
|
|
|
|
2025-04-19 11:51:31 +01:00
|
|
|
fs, err := execext.ExpandFields(g)
|
2019-08-21 13:33:12 +09:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2022-08-06 18:19:07 -03:00
|
|
|
|
2025-03-22 20:06:16 -03:00
|
|
|
results := make(map[string]bool, len(fs))
|
|
|
|
|
2019-08-21 13:33:12 +09:00
|
|
|
for _, f := range fs {
|
|
|
|
info, err := os.Stat(f)
|
2017-09-16 11:44:13 -03:00
|
|
|
if err != nil {
|
2019-08-25 16:29:32 -03:00
|
|
|
return nil, err
|
2017-09-16 11:44:13 -03:00
|
|
|
}
|
2019-08-21 13:33:12 +09:00
|
|
|
if info.IsDir() {
|
|
|
|
continue
|
|
|
|
}
|
2025-03-22 20:06:16 -03:00
|
|
|
results[f] = true
|
|
|
|
}
|
|
|
|
return collectKeys(results), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func collectKeys(m map[string]bool) []string {
|
|
|
|
keys := make([]string, 0, len(m))
|
|
|
|
for k, v := range m {
|
|
|
|
if v {
|
|
|
|
keys = append(keys, k)
|
|
|
|
}
|
2017-09-16 11:44:13 -03:00
|
|
|
}
|
2025-03-22 20:06:16 -03:00
|
|
|
sort.Strings(keys)
|
|
|
|
return keys
|
2017-09-16 11:44:13 -03:00
|
|
|
}
|