Commit 73e862ec authored by Bryan C. Mills's avatar Bryan C. Mills Committed by Dmitri Shuralyov

cmd/go/internal/get: use a strings.Replacer in expand

This should be a no-op, but produces deterministic (and more correct)
behavior if we have accidentally failed to sanitize one of the inputs.

Updates #29231

Change-Id: I1271d0ffd01a691ec8c84906c4e02d9e2be19c72
Reviewed-on: https://team-review.git.corp.google.com/c/370575Reviewed-by: 's avatarRuss Cox <rsc@google.com>
Reviewed-by: 's avatarDmitri Shuralyov <dmitshur@google.com>
Reviewed-on: https://go-review.googlesource.com/c/154103Reviewed-by: 's avatarBryan C. Mills <bcmills@google.com>
parent 4ab6fb19
......@@ -963,10 +963,14 @@ func matchGoImport(imports []metaImport, importPath string) (metaImport, error)
// expand rewrites s to replace {k} with match[k] for each key k in match.
func expand(match map[string]string, s string) string {
// We want to replace each match exactly once, and the result of expansion
// must not depend on the iteration order through the map.
// A strings.Replacer has exactly the properties we're looking for.
oldNew := make([]string, 0, 2*len(match))
for k, v := range match {
s = strings.ReplaceAll(s, "{"+k+"}", v)
oldNew = append(oldNew, "{"+k+"}", v)
}
return s
return strings.NewReplacer(oldNew...).Replace(s)
}
// vcsPaths defines the meaning of import paths referring to
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment