diff options
Diffstat (limited to 'scanRepoDir.go')
| -rw-r--r-- | scanRepoDir.go | 117 |
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 +} |
