package main import ( "os" "path/filepath" "strings" "time" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) func doRepos() error { if argv.Repos.List != nil { me.forge.PrintForgedTable(me.forge.Repos) // me.forge.PrintPullTable(me.forge.Repos) // return doReposList() return nil } if argv.Repos.Scan != nil { log.Infof("start repos scan repos.Len()=%d %s\n", me.forge.Repos.Len(), me.forge.Config.ReposDir) _, err := scanForgedDir(me.forge.Config.ReposDir) me.forge.SaveRepos() return err } if argv.Repos.Reload != nil { for repo := range me.forge.Repos.IterAll() { if repo.GetMasterBranchName() == "" { me.forge.VerifyBranchNames(repo) log.Info("ABNORMAL: master branch name was blank in", repo.GetFullPath()) } } me.forge.SaveRepos() /* count := me.forge.RillReload() if count != 0 { me.forge.SaveRepos() log.Infof("%d repos changed\n", count) return nil } log.Infof("no repos changed\n") */ return nil } if argv.Repos.Pull != nil { var count int for repo := range me.forge.Repos.IterAll() { dur := repo.GitPullAge() if dur < time.Hour { continue } count += 1 log.Infof("%s %s git pull\n", shell.FormatDuration(dur), repo.FullPath) if stats := repo.RunRealtimeVerbose([]string{"git", "fetch", "origin"}); stats.Error != nil { log.Infof("%s %s failed %v\n", shell.FormatDuration(dur), repo.FullPath, stats.Error) } /* if _, err := repo.GitPull(); err != nil { log.Infof("%s %s failed %v\n", shell.FormatDuration(dur), repo.FullPath, err) repo.RunVerbose([]string{"git", "remote", "prune", "origin"}) } */ if count > 70 { break } } if count != 0 { me.forge.SaveRepos() } return nil } log.Infof("Repos len=%d\n", me.forge.Repos.Len()) if me.forge.Repos.Len() < 2 { return nil } found := gitpb.NewRepos() found.Append(me.forge.Repos.Repos[0]) found.Append(me.forge.Repos.Repos[1]) me.forge.PrintForgedTable(found) return nil } /* func doReposInit() { log.Info("do pull here") dirs, err := scanForgedDir(me.forge.Config.ReposDir) if err != nil { badExit(err) } os.Chdir(me.forge.Config.ReposDir) for _, dir := range dirs { // log.Info("found repo", i, dir) // repo, err := me.forge.AddNamespaceDir(ns string, fullpath string) repo, err := readGitPB(dir) if err != nil { log.Info(dir, err) continue } // check to see if 'git clone' has already been run _, err = os.Stat(filepath.Join(dir, "git.clone")) if os.IsNotExist(err) { log.Info("repo needs cloning:", repo.Namespace, repo.URL, dir) if err := tryGitClone(repo, dir); err == nil { continue } // check for GO lang specific 'git clone' redirects if pkgurl, err := forgepb.RunGoList(repo.Namespace); err == nil { log.Info("NEED TO TRY", pkgurl) // if repo, err := f.urlClone(gopath, pkgurl); repo != nil { // return repo, err // } if err := forgepb.RunGitClone("git.clone", dir, pkgurl); err == nil { } else { badExit(err) } } else { badExit(err) } } else { // log.Info("repo is already cloned", dir, repo.Namespace) } } okExit("") } */ func tryGitClone(repo *gitpb.Repo, dir string) error { if err := forgepb.RunGitClone("git.clone", dir, "https://"+repo.Namespace); err == nil { return nil } giturl, err := forgepb.FindGoImport("https://" + repo.Namespace) if err == nil { log.Info("TRY THIS INSTEAD!!!!", giturl) if err := forgepb.RunGitClone("git.clone", dir, giturl); err != nil { log.Info("git clone still failed", giturl, err) return err } return nil } log.Info("git clone failed", err) return err } // must be "/foo/bar/" + "git.clone/" and then have a .git/ dir func addGitRepoDir(dir string) (bool, error) { fullpath := filepath.Join(dir, "git.clone") if check := me.forge.Repos.FindByFullPath(fullpath); check != nil { // log.Info(oldr.Namespace, fullpath, "already added") return false, nil } var namespace string if oldr, err := readGitPB(dir); err == nil { namespace = oldr.Namespace } else { log.Info("readGitPB() failed", dir, err) namespace = strings.TrimPrefix(dir, "/home/repos") } namespace = strings.Trim(namespace, "/") // check to see if 'git clone' has already been run _, err := os.Stat(fullpath) if os.IsNotExist(err) { log.Info("repo needs cloning:", namespace, dir) return false, err } if repo, err := me.forge.AddNamespaceDir(namespace, fullpath); err == nil { log.Info("repo added", repo.FullPath) return true, nil } else { log.Info("repo add failed", repo.FullPath, err) return false, err } return false, err } /* func initForged() error { var changed bool log.Info("do pull here") dirs, err := scanForgedDir(me.forge.Config.ReposDir) if err != nil { return err } log.Printf("forged has %d repos\n", me.forge.Repos.Len()) // me.forge.PrintHumanTable(me.forge.Repos) for _, dir := range dirs { fullpath := filepath.Join(dir, "git.clone") ok, err := addGitRepoDir(fullpath); if ok { changed = true } if err != nil { log.Info("repo add problem", fullpath, err) } } if changed { me.forge.SaveRepos() } return nil } */ func verifyForged() { var changed bool = false for repo := range me.forge.Repos.IterAll() { // check to see if 'git clone' has already been run _, err := os.Stat(repo.FullPath) if os.IsNotExist(err) { log.Info("repo no longer exists", repo.FullPath, err) me.forge.Repos.Delete(repo) changed = true continue } if err != nil { log.Info("repo has some other error", repo.FullPath, err) continue } // repo is fine } if changed { me.forge.Repos.ConfigSave(me.forge.Config.ReposPB) } } /* func doReposList() error { log.Info("do pull here") dirs, err := scanForgedDir(me.forge.Config.ReposDir) if err != nil { badExit(err) return err } count := 0 for _, dir := range dirs { // log.Info("found repo", i, dir) // repo, err := forge.AddNamespaceDir(ns string, fullpath string) oldr, err := readGitPB(dir) if err != nil { log.Info(dir, err) continue } fullpath := filepath.Join(dir, "git.clone") if check := me.forge.Repos.FindByFullPath(fullpath); check != nil { log.Info(oldr.Namespace, fullpath, "already added") continue } // check to see if 'git clone' has already been run _, err = os.Stat(fullpath) if os.IsNotExist(err) { // log.Info("repo needs cloning:", oldr.Namespace, repo.URL, dir) } else { log.Info("repo is already cloned", dir, oldr.Namespace) // me.forge.Repos.Append(newr) // break if count > 50 { // break } count += 1 } } return nil } */