}
if cleanPkg {
- for _, pkg := range load.PackagesAndErrors(args) {
+ for _, pkg := range load.PackagesAndErrors(ctx, args) {
clean(pkg)
}
}
func runFix(ctx context.Context, cmd *base.Command, args []string) {
printed := false
- for _, pkg := range load.Packages(args) {
+ for _, pkg := range load.Packages(ctx, args) {
if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main {
if !printed {
fmt.Fprintf(os.Stderr, "go: not fixing packages in dependency modules\n")
}
}()
}
- for _, pkg := range load.PackagesAndErrors(args) {
+ for _, pkg := range load.PackagesAndErrors(ctx, args) {
if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main {
if !printed {
fmt.Fprintf(os.Stderr, "go: not formatting packages in dependency modules\n")
// Even if the arguments are .go files, this loop suffices.
printed := false
- for _, pkg := range load.PackagesAndErrors(args) {
+ for _, pkg := range load.PackagesAndErrors(ctx, args) {
if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main {
if !printed {
fmt.Fprintf(os.Stderr, "go: not generating in packages in dependency modules\n")
// everything.
load.ClearPackageCache()
- pkgs := load.PackagesForBuild(args)
+ pkgs := load.PackagesForBuild(ctx, args)
// Phase 3. Install.
if *getD {
return
}
- work.InstallPackages(args, pkgs)
+ work.InstallPackages(ctx, args, pkgs)
}
// downloadPaths prepares the list of paths to pass to download.
load.IgnoreImports = *listFind
var pkgs []*load.Package
if *listE {
- pkgs = load.PackagesAndErrors(args)
+ pkgs = load.PackagesAndErrors(ctx, args)
} else {
- pkgs = load.Packages(args)
+ pkgs = load.Packages(ctx, args)
base.ExitIfErrors()
}
a.Deps = append(a.Deps, b.AutoAction(work.ModeInstall, work.ModeInstall, p))
}
}
- b.Do(a)
+ b.Do(ctx, a)
}
for _, p := range pkgs {
import (
"bytes"
+ "context"
"encoding/json"
"errors"
"fmt"
"cmd/go/internal/par"
"cmd/go/internal/search"
"cmd/go/internal/str"
+ "cmd/go/internal/trace"
)
var (
// to load dependencies of a named package, the named
// package is still returned, with p.Incomplete = true
// and details in p.DepsErrors.
-func Packages(args []string) []*Package {
+func Packages(ctx context.Context, args []string) []*Package {
var pkgs []*Package
- for _, pkg := range PackagesAndErrors(args) {
+ for _, pkg := range PackagesAndErrors(ctx, args) {
if pkg.Error != nil {
base.Errorf("%v", pkg.Error)
continue
// *Package for every argument, even the ones that
// cannot be loaded at all.
// The packages that fail to load will have p.Error != nil.
-func PackagesAndErrors(patterns []string) []*Package {
+func PackagesAndErrors(ctx context.Context, patterns []string) []*Package {
+ ctx, span := trace.StartSpan(ctx, "load.PackagesAndErrors")
+ defer span.Done()
+
for _, p := range patterns {
// Listing is only supported with all patterns referring to either:
// - Files that are part of the same directory.
// PackagesForBuild is like Packages but exits
// if any of the packages or their dependencies have errors
// (cannot be built).
-func PackagesForBuild(args []string) []*Package {
- pkgs := PackagesAndErrors(args)
+func PackagesForBuild(ctx context.Context, args []string) []*Package {
+ pkgs := PackagesAndErrors(ctx, args)
printed := map[*PackageError]bool{}
for _, pkg := range pkgs {
if pkg.Error != nil {
return
}
work.BuildInit()
- pkgs := load.PackagesForBuild(pkgPatterns)
- work.InstallPackages(pkgPatterns, pkgs)
+ pkgs := load.PackagesForBuild(ctx, pkgPatterns)
+ work.InstallPackages(ctx, pkgPatterns, pkgs)
}
// runQueries looks up modules at target versions in parallel. Results will be
}
p = load.GoFilesPackage(files)
} else if len(args) > 0 && !strings.HasPrefix(args[0], "-") {
- pkgs := load.PackagesAndErrors(args[:1])
+ pkgs := load.PackagesAndErrors(ctx, args[:1])
if len(pkgs) == 0 {
base.Fatalf("go run: no packages loaded from %s", args[0])
}
}
a1 := b.LinkAction(work.ModeBuild, work.ModeBuild, p)
a := &work.Action{Mode: "go run", Func: buildRunProgram, Args: cmdArgs, Deps: []*work.Action{a1}}
- b.Do(a)
+ b.Do(ctx, a)
}
// buildRunProgram is the action for running a binary that has already
work.VetFlags = testVet.flags
work.VetExplicit = testVet.explicit
- pkgs = load.PackagesForBuild(pkgArgs)
+ pkgs = load.PackagesForBuild(ctx, pkgArgs)
if len(pkgs) == 0 {
base.Fatalf("no packages to test")
}
sort.Strings(all)
a := &work.Action{Mode: "go test -i"}
- for _, p := range load.PackagesForBuild(all) {
+ for _, p := range load.PackagesForBuild(ctx, all) {
if cfg.BuildToolchainName == "gccgo" && p.Standard {
// gccgo's standard library packages
// can not be reinstalled.
}
a.Deps = append(a.Deps, b.CompileAction(work.ModeInstall, work.ModeInstall, p))
}
- b.Do(a)
+ b.Do(ctx, a)
if !testC || a.Failed {
return
}
}
}
- b.Do(root)
+ b.Do(ctx, root)
}
// ensures that package p imports the named package
}
}
- pkgs := load.PackagesForBuild(pkgArgs)
+ pkgs := load.PackagesForBuild(ctx, pkgArgs)
if len(pkgs) == 0 {
base.Fatalf("no packages to vet")
}
root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, pxtest))
}
}
- b.Do(root)
+ b.Do(ctx, root)
}
"cmd/go/internal/cfg"
"cmd/go/internal/load"
"cmd/go/internal/search"
+ "cmd/go/internal/trace"
)
var CmdBuild = &base.Command{
var b Builder
b.Init()
- pkgs := load.PackagesForBuild(args)
+ pkgs := load.PackagesForBuild(ctx, args)
explicitO := len(cfg.BuildO) > 0
depMode = ModeInstall
}
- pkgs = omitTestOnly(pkgsFilter(load.Packages(args)))
+ pkgs = omitTestOnly(pkgsFilter(load.Packages(ctx, args)))
// Special case -o /dev/null by not writing at all.
if cfg.BuildO == os.DevNull {
if len(a.Deps) == 0 {
base.Fatalf("go build: no main packages to build")
}
- b.Do(a)
+ b.Do(ctx, a)
return
}
if len(pkgs) > 1 {
p.Stale = true // must build - not up to date
p.StaleReason = "build -o flag in use"
a := b.AutoAction(ModeInstall, depMode, p)
- b.Do(a)
+ b.Do(ctx, a)
return
}
if cfg.BuildBuildmode == "shared" {
a = b.buildmodeShared(ModeBuild, depMode, args, pkgs, a)
}
- b.Do(a)
+ b.Do(ctx, a)
}
var CmdInstall = &base.Command{
func runInstall(ctx context.Context, cmd *base.Command, args []string) {
BuildInit()
- InstallPackages(args, load.PackagesForBuild(args))
+ InstallPackages(ctx, args, load.PackagesForBuild(ctx, args))
}
// omitTestOnly returns pkgs with test-only packages removed.
return list
}
-func InstallPackages(patterns []string, pkgs []*load.Package) {
+func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Package) {
+ ctx, span := trace.StartSpan(ctx, "InstallPackages "+strings.Join(patterns, " "))
+ defer span.Done()
+
if cfg.GOBIN != "" && !filepath.IsAbs(cfg.GOBIN) {
base.Fatalf("cannot install, GOBIN must be an absolute path")
}
a = b.buildmodeShared(ModeInstall, ModeInstall, patterns, pkgs, a)
}
- b.Do(a)
+ b.Do(ctx, a)
base.ExitIfErrors()
// Success. If this command is 'go install' with no arguments
import (
"bytes"
+ "context"
"encoding/json"
"errors"
"fmt"
"cmd/go/internal/cfg"
"cmd/go/internal/load"
"cmd/go/internal/str"
+ "cmd/go/internal/trace"
)
// actionList returns the list of actions in the dag rooted at root
}
// do runs the action graph rooted at root.
-func (b *Builder) Do(root *Action) {
+func (b *Builder) Do(ctx context.Context, root *Action) {
+ ctx, span := trace.StartSpan(ctx, "exec.Builder.Do ("+root.Mode+" "+root.Target+")")
+ defer span.Done()
+
if !b.IsCmdList {
// If we're doing real work, take time at the end to trim the cache.
c := cache.Default()