utils: Add helper to get all repos This does a filepath.WalkDir of the config.ScanPath and tries to find all valid git repos. It returns a list of repoInfo structs holding basic information of each repository.
Daniele Sluijters daenney@users.noreply.github.com
Tue, 03 Jan 2023 14:42:34 +0100
1 files changed,
57 insertions(+),
0 deletions(-)
jump to
M
routes/util.go
→
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 @@ }
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)) +}