summaryrefslogtreecommitdiff
path: root/crawl/crawl.go
diff options
context:
space:
mode:
Diffstat (limited to 'crawl/crawl.go')
-rw-r--r--crawl/crawl.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/crawl/crawl.go b/crawl/crawl.go
new file mode 100644
index 0000000..dac6b19
--- /dev/null
+++ b/crawl/crawl.go
@@ -0,0 +1,54 @@
+package crawl
+
+import (
+ "path"
+ "path/filepath"
+ "slices"
+ "strings"
+)
+
+func Evaluated(loc string) (string, error) {
+ return filepath.EvalSymlinks(loc)
+}
+
+func RichLocations(origin string) []string {
+ locs := Locations(origin)
+
+ eval, err := Evaluated(origin)
+ if err == nil && eval != origin {
+ i := 0
+ evaledLocations := Locations(eval)
+ var result []string
+ for i < len(locs) && i < len(evaledLocations) {
+ result = append(result, evaledLocations[i], locs[i])
+ }
+ result = slices.Compact(result)
+ return result
+ }
+ return locs
+}
+
+func Locations(origin string) []string {
+ origin = path.Clean(origin)
+ var locs = []string{
+ origin,
+ }
+ for {
+ previous := locs[len(locs)-1]
+ parent := ParentDir(previous)
+ if previous == parent {
+ break
+ }
+ locs = append(locs, parent)
+ }
+ return locs
+}
+
+func ParentDir(origin string) string {
+ trimmedOrigin := strings.TrimSuffix(origin, "/")
+ dir, _ := path.Split(trimmedOrigin)
+ if dir == "" {
+ return origin
+ }
+ return dir
+}