// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "time" "go.wit.com/lib/config" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) func doMerge() error { if argv.All == true { start := time.Now() repos, err := doMergeDevel() dur := time.Since(start) if err != nil { badExit(err) } log.Printf("Merged %d devel branches in %s\n", repos.Len(), shell.FormatDuration(dur)) start = time.Now() repos, err = doMergeMaster() dur = time.Since(start) if err != nil { badExit(err) } log.Printf("Merged %d master branches in %s\n", repos.Len(), shell.FormatDuration(dur)) okExit("") } if argv.Merge.Devel != nil { start := time.Now() repos, err := doMergeDevel() dur := time.Since(start) if err != nil { badExit(err) } log.Printf("Merged %d devel branches in %s\n", repos.Len(), shell.FormatDuration(dur)) okExit("") } if argv.Merge.Master != nil { start := time.Now() repos, err := doMergeMaster() dur := time.Since(start) if err != nil { badExit(err) } log.Printf("Merged %d master branches in %s\n", repos.Len(), shell.FormatDuration(dur)) okExit("") } repo := findCurrentPwdRepoOrDie() if err := repoMergeToDevel(repo); err != nil { badRepoExit(repo, err) } return nil } func doMergeReport() *forgepb.Patches { found := forgepb.NewPatches() for repo := range me.forge.Repos.IterAll() { if repo.GetDevelVersion() == repo.GetMasterVersion() { continue } tmp := log.Sprintf("%s..%s", repo.GetMasterVersion(), repo.GetDevelVersion()) r, err := repo.RunStrict([]string{"git", "log", "--pretty=format:%H", tmp}) _ = err for i, line := range r.Stdout { log.Info(i, line, repo.FullPath) } } return found } func doMergeDevel() (*gitpb.Repos, error) { var err error done := gitpb.NewRepos() found := findMergeToDevel() for repo := range found.IterAll() { if repo.CheckDirty() { log.Info("repo is dirty", repo.GetFullPath()) continue } log.Infof("%s starting git merge\n", repo.FullPath) if repo.CheckoutDevel() { log.Info("checkout devel failed", repo.GetGoPath()) err = log.Errorf("checkout devel failed") badExit(err) } // hash differences when merging user into devel branch out := repo.GetBranchDifferences(repo.GetDevelBranchName(), repo.GetUserBranchName()) for i, hash := range out { log.Info("MERGE HASH FROM USER TO DEVEL", i, hash) } if _, err := repo.MergeToDevel(); err != nil { log.Info("merge from user failed", repo.GetGoPath(), err) err = log.Errorf("merge from user failed") // log.Info(strings.Join(r.Stdout, "\n")) // log.Info(strings.Join(r.Stderr, "\n")) badExit(err) } done.Append(repo) config.SetChanged("repos", true) } return done, err } func repoMergeToDevel(repo *gitpb.Repo) error { if repo.CheckDirty() { return log.Errorf("can not merge. repo is dirty") } log.Infof("%s starting git merge\n", repo.FullPath) if repo.CheckoutDevel() { log.Info("checkout devel failed", repo.GetGoPath()) err := log.Errorf("checkout devel failed") badExit(err) } // hash differences when merging user into devel branch out := repo.GetBranchDifferences(repo.GetDevelBranchName(), repo.GetUserBranchName()) for i, hash := range out { log.Info("MERGE HASH FROM USER TO DEVEL", i, hash) } if _, err := repo.MergeToDevel(); err != nil { log.Info("merge from user failed", repo.GetGoPath(), err) // err := log.Errorf("merge from user failed") // log.Info(strings.Join(r.Stdout, "\n")) // log.Info(strings.Join(r.Stderr, "\n")) badExit(err) } config.SetChanged("repos", true) return nil } func doMergeMaster() (*gitpb.Repos, error) { var err error setForgeMode(forgepb.ForgeMode_MASTER) done := gitpb.NewRepos() found := findMergeToMaster() for repo := range found.IterAll() { if repo.CheckDirty() { log.Info("repo is dirty", repo.GetGoPath()) continue } log.Info("Starting merge on", repo.GetGoPath()) if repo.CheckoutMaster() { log.Info("checkout devel failed", repo.GetGoPath()) err = log.Errorf("checkout devel failed") badExit(err) } if _, err := repo.MergeToMaster(); err != nil { log.Info("merge from user failed", repo.GetGoPath(), err) err = log.Errorf("merge from user failed") // log.Info(strings.Join(r.Stdout, "\n")) // log.Info(strings.Join(r.Stderr, "\n")) badExit(err) } done.Append(repo) config.SetChanged("repos", true) } return done, err }