summaryrefslogtreecommitdiff
path: root/goSrcScan.go
diff options
context:
space:
mode:
Diffstat (limited to 'goSrcScan.go')
-rw-r--r--goSrcScan.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/goSrcScan.go b/goSrcScan.go
new file mode 100644
index 0000000..0f85c33
--- /dev/null
+++ b/goSrcScan.go
@@ -0,0 +1,118 @@
+package forgepb
+
+import (
+ "os"
+ "os/user"
+ "path/filepath"
+ "strings"
+
+ "go.wit.com/log"
+)
+
+func (f *Forge) ScanGoSrc() (bool, error) {
+ dirs, err := gitDirectories(f.goSrc)
+ if err != nil {
+ return false, err
+ }
+
+ for _, dir := range dirs {
+ if strings.HasPrefix(dir, f.goSrc) {
+ gopath := strings.TrimPrefix(dir, f.goSrc)
+ gopath = strings.Trim(gopath, "/")
+ // log.Info("ScanGoSrc() ok:", f.goSrc, gopath)
+ newr, err := f.Repos.NewGoPath(f.goSrc, gopath)
+ if err != nil {
+ log.Log(FORGEPBWARN, "init failed", err)
+ panic("crapnuts")
+ }
+ log.Info("init worked for", newr.GoPath)
+ // try to guess what the 'master' branch is
+ if newr.IsBranch("guimaster") {
+ newr.SetMasterBranchName("guimaster")
+ } else if newr.IsBranch("master") {
+ newr.SetMasterBranchName("master")
+ } else if newr.IsBranch("main") {
+ newr.SetMasterBranchName("main")
+ } else {
+ newr.SetMasterBranchName("masterFIXME")
+ }
+
+ if newr.IsBranch("guidevel") {
+ newr.SetDevelBranchName("guidevel")
+ } else if newr.IsBranch("devel") {
+ newr.SetDevelBranchName("devel")
+ } else {
+ newr.SetDevelBranchName("develFIXME")
+ }
+
+ usr, _ := user.Current()
+ uname := usr.Username
+ if newr.IsBranch(uname) {
+ newr.SetUserBranchName(uname)
+ } else {
+ newr.SetUserBranchName(uname + "FIXME")
+ }
+ } else {
+ log.Log(FORGEPBWARN, "ScanGoSrc() bad:", dir)
+ }
+ }
+ return true, err
+}
+
+func gitDirectories(srcDir string) ([]string, error) {
+ var all []string
+ err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ log.Log(FORGEPBWARN, "Error accessing path:", path, err)
+ return nil
+ }
+
+ // Check if the path is a directory and has a .git subdirectory
+ if info.IsDir() && IsGitDir(path) {
+ all = append(all, path)
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ log.Log(FORGEPBWARN, "Error walking the path:", srcDir, err)
+ }
+
+ return all, err
+}
+
+// IsGitDir checks if a .git directory exists inside the given directory
+func IsGitDir(dir string) bool {
+ gitDir := filepath.Join(dir, ".git")
+ info, err := os.Stat(gitDir)
+ if os.IsNotExist(err) {
+ return false
+ }
+ return info.IsDir()
+}
+
+/*
+// rill is awesome. long live rill
+func rillAddDirs(gopaths []string) {
+ // Convert a slice of user IDs into a channel
+ ids := rill.FromSlice(gopaths, nil)
+
+ // Read users from the API.
+ // Concurrency = 20
+ dirs := rill.Map(ids, 20, func(id string) (*repolist.RepoRow, error) {
+ return me.repos.View.FindByName(id), nil
+ })
+
+ // Activate users.
+ // Concurrency = 10
+ err := rill.ForEach(dirs, 10, func(repo *repolist.RepoRow) error {
+ fmt.Printf("Repo found : %s\n", repo.GoPath())
+ repo.Run([]string{"git", "pull"})
+ return nil
+ })
+
+ // Handle errors
+ fmt.Println("Error:", err)
+}
+*/