// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "errors" "fmt" "os" "path/filepath" "go.wit.com/log" ) func doInstall() error { all := me.forge.Repos.SortByFullPath() for all.Scan() { check := all.Next() repotype := check.GetRepoType() if repotype == "binary" || repotype == "plugin" { // we only want to process things that can be compiled with 'go build' } else { // log.Info("skipping repo", check.GetGoPath(), repotype) continue } if me.forge.Config.IsReadOnly(check.GetGoPath()) { // ignore read only stuff continue } // var cmd []string var start string var end string // add te repotype end += check.GetRepoType() manufactured := check.GetCurrentVersion() ver := trimNonNumericFromStart(manufactured) name := me.forge.Config.DebName(check.GetGoPath()) var realver string if installedPackage := me.machine.FindInstalledByName(name); installedPackage != nil { realver = installedPackage.Version } if actualp := me.machine.FindVersion(name, ver); actualp != nil { end += " (version match) " + actualp.Version + " " + ver + " " state[check] = "on mirrors" } else { if realver != "" { end += fmt.Sprintf(" (version miss) %s vs %s ", realver, ver) } // end += "" + ver + " " } if me.machine.IsInstalled(name) { if actualp := me.machine.FindInstalledByName(name); actualp != nil { if ver != actualp.Version { end += "(installed " + actualp.Version + ") " } else { end += "(installed ok) " } } else { end += "(installed) " } } debname := name + "_" + ver + "_amd64.deb" debnames[check] = debname outdir := getOutdir(check) _, err := os.Stat(filepath.Join(outdir, debname)) if err == nil { // log.Info("exists", filepath.Join(outdir, debname)) state[check] = "in incoming" } else { // log.Info(debname, "does not exist") } if state[check] == "" { state[check] = "need to build" } start = fmt.Sprintf("%-15s %-20s %-50s", state[check], ver, debname) if state[check] == "need to build" { end += " (will build) " } log.Info(start, end) if name == "" { // err := fmt.Sprintf("name is blank error %+v", repo) log.Warn("name is blank error", check.GetGoPath()) } if argv.DryRun { continue } if argv.TestBuild != nil { if argv.DryRun { continue } if argv.Verbose { verbose := []string{"-v", "-x"} if err := me.forge.Build(check, verbose); err != nil { log.Warn("BUILD FAILED", check.GetGoPath(), err) failed[check] = fmt.Sprintf("%s %s %v", "go build", check.GetGoPath(), err) } } else { if err := me.forge.Build(check, nil); err != nil { log.Warn("BUILD FAILED", check.GetGoPath(), err) failed[check] = fmt.Sprintf("%s %s %v", "go build", check.GetGoPath(), err) } } continue } log.Info("STARTING 'make install' in", check.GetGoPath()) if argv.DryRun { continue } if argv.Verbose { verbose := []string{"-v", "-x"} if err := me.forge.Install(check, verbose); err != nil { log.Warn("INSTALL FAILED", check.GetGoPath(), err) failed[check] = fmt.Sprintf("%s %s %v", "go install", check.GetGoPath(), err) } } else { if err := me.forge.Install(check, nil); err != nil { log.Warn("INSTALL FAILED", check.GetGoPath(), err) failed[check] = fmt.Sprintf("%s %s %v", "go install", check.GetGoPath(), err) } } } if len(failed) != 0 { log.Info("") log.Info("something failed on:") for repo, cmd := range failed { log.Info("failed cmd :", cmd, repo.GetGoPath()) } // me.forge.CheckoutUser() // shell.Run([]string{"forge", "--find-private"}) badExit(errors.New("some repos failed")) return errors.New("some repos failed") } return nil }