summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Daniele Sluijters <daenney@users.noreply.github.com>2023-01-03 14:42:34 +0100
committerLibravatar Anirudh Oppiliappan <x@icyphox.sh>2023-02-05 12:45:46 +0200
commitee5ab32a40e5ae4c0f629dc9313e9a1115d6a8ee (patch)
treea9751983520a232cd83ba6d2d967c221b029ff26
parentee459fce7bc466f0d388f80de6396cfe260967b0 (diff)
downloadlegit-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.
-rw-r--r--routes/util.go57
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))
+}