package main import ( "fmt" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) var ErrorNotAllReposOnMaster error = fmt.Errorf("not all repos on are on the master branch") var ErrorNotAllReposOnDevel error = fmt.Errorf("not all repos on are on the devel branch") var ErrorNotAllReposOnUser error = fmt.Errorf("not all repos on are on the user branch") func IsEverythingOnMaster() error { var total int var count int // first make sure every repo is on the master branch all := me.forge.Repos.All() for all.Scan() { repo := all.Next() total += 1 if repo.GetMasterBranchName() == repo.GetCurrentBranchName() { count += 1 } } log.Printf("Master branch check. %d total repos. %d repos on the master branch\n", total, count) if total != count { // log.Info(ErrorNotAllReposOnMaster) return ErrorNotAllReposOnMaster } return nil } func IsEverythingOnDevel() error { var total int var count int // first make sure every repo is on the master branch all := me.forge.Repos.All() for all.Scan() { repo := all.Next() total += 1 if repo.GetDevelBranchName() == repo.GetCurrentBranchName() { count += 1 } } log.Printf("Devel branch check. %d total repos. %d repos on the devel branch\n", total, count) if total != count { return ErrorNotAllReposOnDevel } return nil } func IsEverythingOnUser() error { var total int var count int // first make sure every repo is on the master branch all := me.forge.Repos.All() for all.Scan() { repo := all.Next() total += 1 if repo.GetCurrentBranchName() == repo.GetUserBranchName() { count += 1 } } log.Printf("User branch check. %d total repos. %d repos on the user branch\n", total, count) if total != count { return ErrorNotAllReposOnUser } return nil } func doGitReset() { all := me.found.SortByFullPath() for all.Scan() { repo := all.Next() if me.forge.Config.IsReadOnly(repo.GetGoPath()) { // log.Info("is readonly", repo.GetGoPath()) if repo.CheckDirty() { log.Info("is readonly and dirty", repo.GetGoPath()) cmd := []string{"git", "reset", "--hard"} repo.RunRealtime(cmd) } } else { // log.Info("is not readonly", repo.GetGoPath()) } } } /* func checkoutBranches(repo *gitpb.Repo) error { dname := repo.GetDevelBranchName() if dname == "" { if err := me.forge.MakeDevelBranch(repo); err != nil { log.Info("verify() no devel branch name", repo.GetGoPath()) return err } configSave = true } if repo.GetUserBranchName() == "" { if err := me.forge.MakeUserBranch(repo); err != nil { log.Info("verify() no devel branch name", repo.GetGoPath()) return err } configSave = true } return nil } */ func rillCheckoutUser(repo *gitpb.Repo) error { if repo.IsDirty() { // never do dirty repos return nil } if repo.GetCurrentBranchName() == repo.GetUserBranchName() { // repo is already on user branch return nil } repo.CheckoutUser() return nil } func doAllCheckoutUser() error { me.forge.RillFuncError(rillCheckoutUser) count := me.forge.RillReload() if count != 0 { me.forge.ConfigSave() } if err := IsEverythingOnUser(); err != nil { // display all repos not on user me.found = new(gitpb.Repos) all := me.forge.Repos.SortByFullPath() for all.Scan() { repo := all.Next() if repo.GetCurrentBranchName() != repo.GetUserBranchName() { me.found.AppendByGoPath(repo) } } me.forge.PrintHumanTable(me.found) log.Printf("There are %d repos that are NOT on the user branch\n", me.found.Len()) return err } return nil } func doAllCheckoutDevel() error { me.forge.CheckoutDevel() // me.forge = forgepb.Init() count := me.forge.RillReload() log.Info("CHECKOUT DEVEL COUNT", count) if count != 0 { me.forge.ConfigSave() } if err := IsEverythingOnDevel(); err != nil { return err } return nil } func rillCheckoutMaster(repo *gitpb.Repo) error { if repo.IsDirty() { // never do dirty repos return nil } if repo.GetCurrentBranchName() == repo.GetMasterBranchName() { // repo is already on master return nil } if repo.GetUserVersion() != repo.GetDevelVersion() { // don't switch branches if the user branch has uncommitted patches return nil } if me.forge.Config.IsReadOnly(repo.GetGoPath()) { // skip other checks for readonly repos repo.CheckoutMaster() return nil } if repo.GetDevelVersion() != repo.GetMasterVersion() { // don't switch braches if the devel branch does not match master (needs merge) return nil } repo.CheckoutMaster() return nil } // trys to figure out if there is still something to update // todo: redo this logic as it is terrible func doAllCheckoutMaster() error { me.forge.RillFuncError(rillCheckoutMaster) count := me.forge.RillReload() if count != 0 { me.forge.ConfigSave() } if err := IsEverythingOnMaster(); err != nil { // display all repos not on master me.found = new(gitpb.Repos) all := me.forge.Repos.SortByFullPath() for all.Scan() { repo := all.Next() if repo.GetCurrentBranchName() != repo.GetMasterBranchName() { me.found.AppendByGoPath(repo) } } me.forge.PrintHumanTable(me.found) log.Printf("There are %d repos that are NOT on the master branch\n", me.found.Len()) return err } return nil } // trys to figure out if there is still something to update // todo: redo this logic as it is terrible func doCheckout() error { if argv.Checkout.User != nil { doAllCheckoutUser() okExit("") } if argv.Checkout.Devel != nil { me.forge.CheckoutDevel() me.forge = forgepb.Init() me.found = new(gitpb.Repos) argv.Checkout.Devel.findRepos() me.forge.PrintHumanTable(me.found) okExit("") } if argv.Checkout.Master != nil { doAllCheckoutMaster() okExit("") } return nil }