diff options
author | Daniele Sluijters <daenney@users.noreply.github.com> | 2023-01-03 14:42:34 +0100 |
---|---|---|
committer | Anirudh Oppiliappan <x@icyphox.sh> | 2023-02-05 12:45:46 +0200 |
commit | ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee (patch) | |
tree | a9751983520a232cd83ba6d2d967c221b029ff26 | |
parent | ee459fce7bc466f0d388f80de6396cfe260967b0 (diff) | |
download | legit-ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee.tar.gz legit-ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee.tar.bz2 legit-ee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | routes/util.go | 57 |
1 files changed, 57 insertions, 0 deletions
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)) +} |