Skip to content

Commit 4f73fd0

Browse files
committed
cmd: move internal/str back to cmd/go
cmd/go is not subject to all the same restrictions as most of cmd. In particular it need not be buildable with the bootstrap toolchain. So it is better to keep as little code shared between cmd/go and cmd/compile, cmd/link, cmd/cgo as possible. cmd/internal/str started as cmd/go/internal/str but was moved to cmd/internal in order to make use of the quoted string code. Move that code to cmd/internal/quoted and then move the rest of cmd/internal/str back to cmd/go/internal/str. Change-Id: I3a98f754d545cc3af7e9a32c2b77a5a035ea7b9a Reviewed-on: https://go-review.googlesource.com/c/go/+/355010 Trust: Russ Cox <[email protected]> Run-TryBot: Russ Cox <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Bryan C. Mills <[email protected]>
1 parent cfb5321 commit 4f73fd0

File tree

35 files changed

+314
-292
lines changed

35 files changed

+314
-292
lines changed

src/cmd/cgo/gcc.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
"unicode"
3030
"unicode/utf8"
3131

32-
"cmd/internal/str"
32+
"cmd/internal/quoted"
3333
)
3434

3535
var debugDefine = flag.Bool("debug-define", false, "print relevant #defines")
@@ -1568,7 +1568,7 @@ func checkGCCBaseCmd() ([]string, error) {
15681568
if value == "" {
15691569
value = defaultCC(goos, goarch)
15701570
}
1571-
args, err := str.SplitQuotedFields(value)
1571+
args, err := quoted.Split(value)
15721572
if err != nil {
15731573
return nil, err
15741574
}

src/cmd/compile/internal/ssa/stmtlines_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ssa_test
22

33
import (
44
cmddwarf "cmd/internal/dwarf"
5-
"cmd/internal/str"
5+
"cmd/internal/quoted"
66
"debug/dwarf"
77
"debug/elf"
88
"debug/macho"
@@ -58,7 +58,7 @@ func TestStmtLines(t *testing.T) {
5858
if extld == "" {
5959
extld = "gcc"
6060
}
61-
extldArgs, err := str.SplitQuotedFields(extld)
61+
extldArgs, err := quoted.Split(extld)
6262
if err != nil {
6363
t.Fatal(err)
6464
}

src/cmd/dist/buildtool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ var bootstrapDirs = []string{
4646
"cmd/internal/obj/...",
4747
"cmd/internal/objabi",
4848
"cmd/internal/pkgpath",
49+
"cmd/internal/quoted",
4950
"cmd/internal/src",
50-
"cmd/internal/str",
5151
"cmd/internal/sys",
5252
"cmd/link",
5353
"cmd/link/internal/...",

src/cmd/go/internal/base/base.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"sync"
1818

1919
"cmd/go/internal/cfg"
20-
"cmd/internal/str"
20+
"cmd/go/internal/str"
2121
)
2222

2323
// A Command is an implementation of a go command

src/cmd/go/internal/base/flag.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
"cmd/go/internal/cfg"
1111
"cmd/go/internal/fsys"
12-
"cmd/internal/str"
12+
"cmd/internal/quoted"
1313
)
1414

1515
// A StringsFlag is a command-line flag that interprets its argument
@@ -18,7 +18,7 @@ type StringsFlag []string
1818

1919
func (v *StringsFlag) Set(s string) error {
2020
var err error
21-
*v, err = str.SplitQuotedFields(s)
21+
*v, err = quoted.Split(s)
2222
if *v == nil {
2323
*v = []string{}
2424
}

src/cmd/go/internal/envcmd/env.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"cmd/go/internal/load"
2727
"cmd/go/internal/modload"
2828
"cmd/go/internal/work"
29-
"cmd/internal/str"
29+
"cmd/internal/quoted"
3030
)
3131

3232
var CmdEnv = &base.Command{
@@ -470,7 +470,7 @@ func checkEnvWrite(key, val string) error {
470470
if val == "" {
471471
break
472472
}
473-
args, err := str.SplitQuotedFields(val)
473+
args, err := quoted.Split(val)
474474
if err != nil {
475475
return fmt.Errorf("invalid %s: %v", key, err)
476476
}

src/cmd/go/internal/fix/fix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"cmd/go/internal/cfg"
1111
"cmd/go/internal/load"
1212
"cmd/go/internal/modload"
13-
"cmd/internal/str"
13+
"cmd/go/internal/str"
1414
"context"
1515
"fmt"
1616
"os"

src/cmd/go/internal/generate/generate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"cmd/go/internal/load"
2727
"cmd/go/internal/modload"
2828
"cmd/go/internal/work"
29-
"cmd/internal/str"
29+
"cmd/go/internal/str"
3030
)
3131

3232
var CmdGenerate = &base.Command{

src/cmd/go/internal/get/get.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"cmd/go/internal/vcs"
2121
"cmd/go/internal/web"
2222
"cmd/go/internal/work"
23-
"cmd/internal/str"
23+
"cmd/go/internal/str"
2424

2525
"golang.org/x/mod/module"
2626
)

src/cmd/go/internal/list/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"cmd/go/internal/modinfo"
2525
"cmd/go/internal/modload"
2626
"cmd/go/internal/work"
27-
"cmd/internal/str"
27+
"cmd/go/internal/str"
2828
)
2929

3030
var CmdList = &base.Command{

src/cmd/go/internal/load/flag.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package load
66

77
import (
88
"cmd/go/internal/base"
9-
"cmd/internal/str"
9+
"cmd/internal/quoted"
1010
"fmt"
1111
"strings"
1212
)
@@ -63,7 +63,7 @@ func (f *PerPackageFlag) set(v, cwd string) error {
6363
match = MatchPackage(pattern, cwd)
6464
v = v[i+1:]
6565
}
66-
flags, err := str.SplitQuotedFields(v)
66+
flags, err := quoted.Split(v)
6767
if err != nil {
6868
return err
6969
}

src/cmd/go/internal/load/pkg.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ import (
3838
"cmd/go/internal/modload"
3939
"cmd/go/internal/par"
4040
"cmd/go/internal/search"
41+
"cmd/go/internal/str"
4142
"cmd/go/internal/trace"
4243
"cmd/go/internal/vcs"
43-
"cmd/internal/str"
4444
"cmd/internal/sys"
4545

4646
"golang.org/x/mod/modfile"

src/cmd/go/internal/load/test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323

2424
"cmd/go/internal/fsys"
2525
"cmd/go/internal/trace"
26-
"cmd/internal/str"
26+
"cmd/go/internal/str"
2727
)
2828

2929
var TestMainDeps = []string{

src/cmd/go/internal/modcmd/vendor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"cmd/go/internal/imports"
2525
"cmd/go/internal/load"
2626
"cmd/go/internal/modload"
27-
"cmd/internal/str"
27+
"cmd/go/internal/str"
2828

2929
"golang.org/x/mod/module"
3030
"golang.org/x/mod/semver"

src/cmd/go/internal/modfetch/codehost/codehost.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
"cmd/go/internal/cfg"
2323
"cmd/go/internal/lockedfile"
24-
"cmd/internal/str"
24+
"cmd/go/internal/str"
2525
)
2626

2727
// Downloaded size limits.

src/cmd/go/internal/modfetch/codehost/vcs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020

2121
"cmd/go/internal/lockedfile"
2222
"cmd/go/internal/par"
23-
"cmd/internal/str"
23+
"cmd/go/internal/str"
2424
)
2525

2626
// A VCSError indicates an error using a version control system.

src/cmd/go/internal/modget/query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"cmd/go/internal/base"
1515
"cmd/go/internal/modload"
1616
"cmd/go/internal/search"
17-
"cmd/internal/str"
17+
"cmd/go/internal/str"
1818

1919
"golang.org/x/mod/module"
2020
)

src/cmd/go/internal/modload/load.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ import (
119119
"cmd/go/internal/mvs"
120120
"cmd/go/internal/par"
121121
"cmd/go/internal/search"
122-
"cmd/internal/str"
122+
"cmd/go/internal/str"
123123

124124
"golang.org/x/mod/module"
125125
"golang.org/x/mod/semver"

src/cmd/go/internal/modload/query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"cmd/go/internal/modfetch"
2323
"cmd/go/internal/search"
2424
"cmd/go/internal/trace"
25-
"cmd/internal/str"
25+
"cmd/go/internal/str"
2626

2727
"golang.org/x/mod/module"
2828
"golang.org/x/mod/semver"

src/cmd/go/internal/run/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"cmd/go/internal/load"
2020
"cmd/go/internal/modload"
2121
"cmd/go/internal/work"
22-
"cmd/internal/str"
22+
"cmd/go/internal/str"
2323
)
2424

2525
var CmdRun = &base.Command{
File renamed without changes.

src/cmd/go/internal/str/str.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright 2017 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
// Package str provides string manipulation utilities.
6+
package str
7+
8+
import (
9+
"bytes"
10+
"fmt"
11+
"unicode"
12+
"unicode/utf8"
13+
)
14+
15+
// StringList flattens its arguments into a single []string.
16+
// Each argument in args must have type string or []string.
17+
func StringList(args ...interface{}) []string {
18+
var x []string
19+
for _, arg := range args {
20+
switch arg := arg.(type) {
21+
case []string:
22+
x = append(x, arg...)
23+
case string:
24+
x = append(x, arg)
25+
default:
26+
panic("stringList: invalid argument of type " + fmt.Sprintf("%T", arg))
27+
}
28+
}
29+
return x
30+
}
31+
32+
// ToFold returns a string with the property that
33+
// strings.EqualFold(s, t) iff ToFold(s) == ToFold(t)
34+
// This lets us test a large set of strings for fold-equivalent
35+
// duplicates without making a quadratic number of calls
36+
// to EqualFold. Note that strings.ToUpper and strings.ToLower
37+
// do not have the desired property in some corner cases.
38+
func ToFold(s string) string {
39+
// Fast path: all ASCII, no upper case.
40+
// Most paths look like this already.
41+
for i := 0; i < len(s); i++ {
42+
c := s[i]
43+
if c >= utf8.RuneSelf || 'A' <= c && c <= 'Z' {
44+
goto Slow
45+
}
46+
}
47+
return s
48+
49+
Slow:
50+
var buf bytes.Buffer
51+
for _, r := range s {
52+
// SimpleFold(x) cycles to the next equivalent rune > x
53+
// or wraps around to smaller values. Iterate until it wraps,
54+
// and we've found the minimum value.
55+
for {
56+
r0 := r
57+
r = unicode.SimpleFold(r0)
58+
if r <= r0 {
59+
break
60+
}
61+
}
62+
// Exception to allow fast path above: A-Z => a-z
63+
if 'A' <= r && r <= 'Z' {
64+
r += 'a' - 'A'
65+
}
66+
buf.WriteRune(r)
67+
}
68+
return buf.String()
69+
}
70+
71+
// FoldDup reports a pair of strings from the list that are
72+
// equal according to strings.EqualFold.
73+
// It returns "", "" if there are no such strings.
74+
func FoldDup(list []string) (string, string) {
75+
clash := map[string]string{}
76+
for _, s := range list {
77+
fold := ToFold(s)
78+
if t := clash[fold]; t != "" {
79+
if s > t {
80+
s, t = t, s
81+
}
82+
return s, t
83+
}
84+
clash[fold] = s
85+
}
86+
return "", ""
87+
}
88+
89+
// Contains reports whether x contains s.
90+
func Contains(x []string, s string) bool {
91+
for _, t := range x {
92+
if t == s {
93+
return true
94+
}
95+
}
96+
return false
97+
}
98+
99+
// Uniq removes consecutive duplicate strings from ss.
100+
func Uniq(ss *[]string) {
101+
if len(*ss) <= 1 {
102+
return
103+
}
104+
uniq := (*ss)[:1]
105+
for _, s := range *ss {
106+
if s != uniq[len(uniq)-1] {
107+
uniq = append(uniq, s)
108+
}
109+
}
110+
*ss = uniq
111+
}

src/cmd/go/internal/str/str_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2020 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package str
6+
7+
import (
8+
"testing"
9+
)
10+
11+
var foldDupTests = []struct {
12+
list []string
13+
f1, f2 string
14+
}{
15+
{StringList("math/rand", "math/big"), "", ""},
16+
{StringList("math", "strings"), "", ""},
17+
{StringList("strings"), "", ""},
18+
{StringList("strings", "strings"), "strings", "strings"},
19+
{StringList("Rand", "rand", "math", "math/rand", "math/Rand"), "Rand", "rand"},
20+
}
21+
22+
func TestFoldDup(t *testing.T) {
23+
for _, tt := range foldDupTests {
24+
f1, f2 := FoldDup(tt.list)
25+
if f1 != tt.f1 || f2 != tt.f2 {
26+
t.Errorf("foldDup(%q) = %q, %q, want %q, %q", tt.list, f1, f2, tt.f1, tt.f2)
27+
}
28+
}
29+
}

src/cmd/go/internal/test/test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
"cmd/go/internal/search"
3434
"cmd/go/internal/trace"
3535
"cmd/go/internal/work"
36-
"cmd/internal/str"
36+
"cmd/go/internal/str"
3737
"cmd/internal/test2json"
3838
)
3939

src/cmd/go/internal/vcs/vcs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"cmd/go/internal/cfg"
2828
"cmd/go/internal/search"
2929
"cmd/go/internal/web"
30-
"cmd/internal/str"
30+
"cmd/go/internal/str"
3131

3232
"golang.org/x/mod/module"
3333
)

src/cmd/go/internal/work/buildid.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
"cmd/go/internal/cfg"
1717
"cmd/go/internal/fsys"
1818
"cmd/internal/buildid"
19-
"cmd/internal/str"
19+
"cmd/go/internal/str"
2020
)
2121

2222
// Build IDs

0 commit comments

Comments
 (0)