"cmd/go/internal/cfg"
"cmd/go/internal/load"
"cmd/go/internal/modload"
+ "cmd/go/internal/slices"
"cmd/go/internal/str"
"cmd/go/internal/work"
)
if g.commands[command] != nil {
g.errorf("command %q multiply defined", command)
}
- g.commands[command] = words[2:len(words):len(words)] // force later append to make copy
+ g.commands[command] = slices.Clip(words[2:])
}
// exec runs the command specified by the argument. The first word is
"cmd/go/internal/cfg"
"cmd/go/internal/mvs"
"cmd/go/internal/par"
+ "cmd/go/internal/slices"
"context"
"fmt"
"os"
"golang.org/x/mod/semver"
)
-// capVersionSlice returns s with its cap reduced to its length.
-func capVersionSlice(s []module.Version) []module.Version {
- return s[:len(s):len(s)]
-}
-
// A Requirements represents a logically-immutable set of root module requirements.
type Requirements struct {
// pruning is the pruning at which the requirement graph is computed.
if pruning == workspace {
return &Requirements{
pruning: pruning,
- rootModules: capVersionSlice(rootModules),
+ rootModules: slices.Clip(rootModules),
maxRootVersion: nil,
direct: direct,
}
rs := &Requirements{
pruning: pruning,
- rootModules: capVersionSlice(rootModules),
+ rootModules: slices.Clip(rootModules),
maxRootVersion: make(map[string]string, len(rootModules)),
direct: direct,
}
// and may rely on it not to be modified.
func (mg *ModuleGraph) BuildList() []module.Version {
mg.buildListOnce.Do(func() {
- mg.buildList = capVersionSlice(mg.g.BuildList())
+ mg.buildList = slices.Clip(mg.g.BuildList())
})
return mg.buildList
}
"cmd/go/internal/modconv"
"cmd/go/internal/modfetch"
"cmd/go/internal/search"
+ "cmd/go/internal/slices"
"golang.org/x/mod/modfile"
"golang.org/x/mod/module"
}
modRootContainingCWD := findModuleRoot(base.Cwd())
mainModules := &MainModuleSet{
- versions: ms[:len(ms):len(ms)],
+ versions: slices.Clip(ms),
inGorootSrc: map[module.Version]bool{},
pathPrefix: map[module.Version]string{},
modRoot: map[module.Version]string{},
"cmd/go/internal/modfetch/codehost"
"cmd/go/internal/modinfo"
"cmd/go/internal/search"
+ "cmd/go/internal/slices"
"cmd/go/internal/str"
"cmd/go/internal/trace"
"cmd/internal/pkgpattern"
Query: query,
}
}
- return results[:len(results):len(results)], modOnly, err
+ return slices.Clip(results), modOnly, err
}
// modulePrefixesExcludingTarget returns all prefixes of path that may plausibly
package mvs
import (
+ "cmd/go/internal/slices"
"fmt"
"golang.org/x/mod/module"
func NewGraph(cmp func(v1, v2 string) int, roots []module.Version) *Graph {
g := &Graph{
cmp: cmp,
- roots: roots[:len(roots):len(roots)],
+ roots: slices.Clip(roots),
required: make(map[module.Version][]module.Version),
isRoot: make(map[module.Version]bool),
selected: make(map[string]string),
// Truncate reqs to its capacity to avoid aliasing bugs if it is later
// returned from RequiredBy and appended to.
- reqs = reqs[:len(reqs):len(reqs)]
+ reqs = slices.Clip(reqs)
if _, dup := g.required[m]; dup {
panic(fmt.Sprintf("requirements of %v have already been set", m))
--- /dev/null
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// TODO: Replace with slices package when it lands in standard library.
+
+package slices
+
+// Clip removes unused capacity from the slice, returning s[:len(s):len(s)].
+func Clip[S ~[]E, E any](s S) S {
+ return s[:len(s):len(s)]
+}
"cmd/go/internal/lockedfile"
"cmd/go/internal/modload"
"cmd/go/internal/search"
+ "cmd/go/internal/slices"
"cmd/go/internal/str"
"cmd/go/internal/trace"
"cmd/go/internal/work"
cmd := exec.CommandContext(ctx, args[0], args[1:]...)
cmd.Dir = a.Package.Dir
- env := cfg.OrigEnv[:len(cfg.OrigEnv):len(cfg.OrigEnv)]
+ env := slices.Clip(cfg.OrigEnv)
env = base.AppendPATH(env)
env = base.AppendPWD(env, cmd.Dir)
cmd.Env = env
package vcweb
import (
+ "cmd/go/internal/slices"
"log"
"net/http"
"net/http/cgi"
Logger: logger,
Args: []string{"http-backend"},
Dir: dir,
- Env: append(env[:len(env):len(env)],
+ Env: append(slices.Clip(env),
"GIT_PROJECT_ROOT="+dir,
"GIT_HTTP_EXPORT_ALL=1",
),
import (
"bufio"
+ "cmd/go/internal/slices"
"context"
"errors"
"io"
cmd := exec.CommandContext(ctx, h.hgPath, "serve", "--port", "0", "--address", "localhost", "--accesslog", os.DevNull, "--name", "vcweb", "--print-url")
cmd.Dir = dir
- cmd.Env = append(env[:len(env):len(env)], "PWD="+dir)
+ cmd.Env = append(slices.Clip(env), "PWD="+dir)
cmd.Cancel = func() error {
err := cmd.Process.Signal(os.Interrupt)
"cmd/go/internal/fsys"
"cmd/go/internal/load"
"cmd/go/internal/modload"
+ "cmd/go/internal/slices"
"cmd/go/internal/str"
"cmd/go/internal/trace"
"cmd/internal/quoted"
} else {
to = filepath.Join("/_", toPath)
}
- flags = append(flags[:len(flags):len(flags)], "-fdebug-prefix-map="+from+"="+to)
+ flags = append(slices.Clip(flags), "-fdebug-prefix-map="+from+"="+to)
}
}