diff --git a/routes/util.go b/routes/util.go index e6a6267..bc15b7e 100644 --- a/routes/util.go +++ b/routes/util.go @@ -1,8 +1,11 @@ package routes import ( + "io/fs" + "log" "os" "path/filepath" + "strings" "git.icyphox.sh/legit/git" ) @@ -31,3 +34,57 @@ func (d *deps) isIgnored(name string) bool { return false } + +type repoInfo struct { + Git *git.GitRepo + Path string + Category string +} + +func (d *deps) getAllRepos() ([]repoInfo, error) { + repos := []repoInfo{} + max := strings.Count(d.c.Repo.ScanPath, string(os.PathSeparator)) + 2 + + err := filepath.WalkDir(d.c.Repo.ScanPath, func(path string, de fs.DirEntry, err error) error { + if err != nil { + return err + } + + if de.IsDir() { + // Check if we've exceeded our recursion depth + if strings.Count(path, string(os.PathSeparator)) > max { + return fs.SkipDir + } + + if d.isIgnored(path) { + return fs.SkipDir + } + + // A bare repo should always have at least a HEAD file, if it + // doesn't we can continue recursing + if _, err := os.Lstat(filepath.Join(path, "HEAD")); err == nil { + repo, err := git.Open(path, "") + if err != nil { + log.Println(err) + } else { + relpath, _ := filepath.Rel(d.c.Repo.ScanPath, path) + repos = append(repos, repoInfo{ + Git: repo, + Path: relpath, + Category: d.category(path), + }) + // Since we found a Git repo, we don't want to recurse + // further + return fs.SkipDir + } + } + } + return nil + }) + + return repos, err +} + +func (d *deps) category(path string) string { + return strings.TrimPrefix(filepath.Dir(strings.TrimPrefix(path, d.c.Repo.ScanPath)), string(os.PathSeparator)) +}