summaryrefslogtreecommitdiff
path: root/scanRepoDir.go
diff options
context:
space:
mode:
Diffstat (limited to 'scanRepoDir.go')
-rw-r--r--scanRepoDir.go117
1 files changed, 117 insertions, 0 deletions
diff --git a/scanRepoDir.go b/scanRepoDir.go
new file mode 100644
index 0000000..19de1b0
--- /dev/null
+++ b/scanRepoDir.go
@@ -0,0 +1,117 @@
+package forgepb
+
+import (
+ "os"
+
+ "github.com/destel/rill"
+ "go.wit.com/lib/config"
+ "go.wit.com/lib/protobuf/gitpb"
+ "go.wit.com/log"
+)
+
+func reloadCheck(repo *gitpb.Repo) error {
+ if err := repo.ReloadCheck(); err != nil {
+ log.Infof("%s reload() says %v\n", repo.FullPath, err)
+ return err
+ }
+ return nil
+}
+
+func (f *Forge) TestScan() error {
+ f.Repos = gitpb.NewRepos()
+ dirs, err := gitDirectoriesNew(f.Config.ReposDir)
+ if err != nil {
+ return err
+ }
+ for i, fullpath := range dirs {
+ repo, err := gitpb.NewRepo(fullpath)
+ if err != nil {
+ log.Info("ReAdd() error", fullpath, err)
+ }
+ log.Info(i, "worked", repo.FullPath)
+ repo = f.Repos.Append(repo)
+ f.VerifyBranchNames(repo)
+ if f.Config.IsReadOnly(repo.GetGoPath()) {
+ repo.ReadOnly = true
+ }
+ repo.ReloadCheck()
+ if i > 5 {
+ break
+ }
+ }
+ return nil
+}
+
+func (f *Forge) checkNamespace(fullpath string) (*gitpb.Repo, error) {
+ if repo := f.Repos.FindByFullPath(fullpath); repo != nil {
+ return nil, nil
+ }
+ repo, err := gitpb.NewRepo(fullpath)
+ if err != nil {
+ log.Info(fullpath, err)
+ return nil, err
+ }
+ return repo, err
+}
+
+func (f *Forge) ScanRepoDir() error {
+ if r := recover(); r != nil {
+ log.Warn("panic ecovered in", r)
+ // debug.PrintStack()
+ // pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
+ panic(os.Stdout)
+ }
+ dirs, err := gitDirectoriesNew(f.Config.ReposDir)
+ if err != nil {
+ return err
+ }
+
+ stats := f.RillRepos(reloadCheck)
+ for _, stat := range stats {
+ if stat.Err == nil {
+ continue
+ }
+ config.SetChanged("repos", true)
+ }
+
+ newcount, err := f.rillScanDirsNew(dirs)
+ if err != nil {
+ log.Info("go src dir problem. exit for now?", err)
+ return err
+ }
+ if newcount != 0 {
+ log.Info("forge go src scan found", newcount, "repos")
+ config.SetChanged("repos", true)
+ }
+ return err
+}
+
+// rill is awesome. long live rill
+// attempt scan with rill
+func (f *Forge) rillScanDirsNew(fullpaths []string) (int, error) {
+ // Convert a slice of user IDs into a channel
+ ids := rill.FromSlice(fullpaths, nil)
+
+ // Read users from the API. // Concurrency = 20
+ dirs := rill.Map(ids, int(f.Config.RillX), func(id string) (*gitpb.Repo, error) {
+ return f.checkNamespace(id)
+ })
+
+ var counter int
+ // Activate users. // Concurrency = 10
+ err := rill.ForEach(dirs, int(f.Config.RillY), func(repo *gitpb.Repo) error {
+ if repo == nil {
+ return nil
+ }
+ repo = f.Repos.Append(repo)
+ f.VerifyBranchNames(repo)
+ if f.Config.IsReadOnly(repo.GetGoPath()) {
+ repo.ReadOnly = true
+ }
+ repo.ReloadCheck()
+ counter += 1
+ return nil
+ })
+
+ return counter, err
+}