all repos — legit @ ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee

web frontend for git, written in go

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
commit

ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee

parent

ee459fce7bc466f0d388f80de6396cfe260967b0

1 files changed, 57 insertions(+), 0 deletions(-)

jump to
M routes/util.goroutes/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)) +}