Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
pkg
golang-golang-x-tools
Commits
b22c2c1f
Commit
b22c2c1f
authored
Mar 06, 2021
by
Apertis CI
Browse files
Import Upstream version 0.1.0+ds
parent
60765248
Changes
1000
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 1000+
files are displayed.
Plain diff
Email patch
.prettierrc
0 → 100644
View file @
b22c2c1f
{
"singleQuote": true,
"trailingComma": "es5"
}
\ No newline at end of file
README.md
View file @
b22c2c1f
# Go Tools
[

](https://pkg.go.dev/golang.org/x/tools)
This subrepository holds the source for various packages and tools that support
the Go programming language.
...
...
@@ -17,6 +19,15 @@ Static Single Assignment form (SSA) representation for Go programs.
The easiest way to install is to run
`go get -u golang.org/x/tools/...`
. You can
also manually git clone the repository to
`$GOPATH/src/golang.org/x/tools`
.
## JS/CSS Formatting
This repository uses
[
prettier
](
https://prettier.io/
)
to format JS and CSS files.
The version of
`prettier`
used is 1.18.2.
It is encouraged that all JS and CSS code be run through this before submitting
a change. However, it is not a strict requirement enforced by CI.
## Report Issues / Send Patches
This repository uses Gerrit for code changes. To learn how to submit changes to
...
...
benchmark/parse/parse_test.go
View file @
b22c2c1f
...
...
@@ -152,3 +152,57 @@ func TestParseSet(t *testing.T) {
t
.
Errorf
(
"parsed bench set incorrectly, want %v have %v"
,
want
,
have
)
}
}
func
TestString
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
name
string
input
*
Benchmark
wanted
string
}{
{
name
:
"nsTest"
,
input
:
&
Benchmark
{
Name
:
"BenchmarkTest"
,
N
:
100000000
,
NsPerOp
:
19.6
,
Measured
:
NsPerOp
,
},
wanted
:
"BenchmarkTest 100000000 19.60 ns/op"
,
},
{
name
:
"mbTest"
,
input
:
&
Benchmark
{
Name
:
"BenchmarkTest"
,
N
:
100000000
,
MBPerS
:
19.6
,
Measured
:
MBPerS
,
},
wanted
:
"BenchmarkTest 100000000 19.60 MB/s"
,
},
{
name
:
"allocatedBytesTest"
,
input
:
&
Benchmark
{
Name
:
"BenchmarkTest"
,
N
:
100000000
,
AllocedBytesPerOp
:
5
,
Measured
:
AllocedBytesPerOp
,
},
wanted
:
"BenchmarkTest 100000000 5 B/op"
,
},
{
name
:
"allocsTest"
,
input
:
&
Benchmark
{
Name
:
"BenchmarkTest"
,
N
:
100000000
,
AllocsPerOp
:
5
,
Measured
:
AllocsPerOp
,
},
wanted
:
"BenchmarkTest 100000000 5 allocs/op"
,
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
result
:=
tt
.
input
.
String
()
if
result
!=
tt
.
wanted
{
t
.
Errorf
(
"String() is called, want %q, have %q"
,
tt
.
wanted
,
result
)
}
})
}
}
blog/atom/atom.go
View file @
b22c2c1f
// Copyright 2009 The Go Authors.
All rights reserved.
// Copyright 2009 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.
...
...
blog/blog.go
View file @
b22c2c1f
// Copyright 2013 The Go Authors.
All rights reserved.
// Copyright 2013 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.
...
...
@@ -38,10 +38,11 @@ type Config struct {
ContentPath
string
// Relative or absolute location of article files and related content.
TemplatePath
string
// Relative or absolute location of template files.
BaseURL
string
// Absolute base URL (for permalinks; no trailing slash).
BasePath
string
// Base URL path relative to server root (no trailing slash).
GodocURL
string
// The base URL of godoc (for menu bar; no trailing slash).
Hostname
string
// Server host name, used for rendering ATOM feeds.
BaseURL
string
// Absolute base URL (for permalinks; no trailing slash).
BasePath
string
// Base URL path relative to server root (no trailing slash).
GodocURL
string
// The base URL of godoc (for menu bar; no trailing slash).
Hostname
string
// Server host name, used for rendering ATOM feeds.
AnalyticsHTML
template
.
HTML
// Optional analytics HTML to insert at the beginning of <head>.
HomeArticles
int
// Articles to display on the home page.
FeedArticles
int
// Articles to include in Atom and JSON feeds.
...
...
@@ -64,12 +65,13 @@ type Doc struct {
// Server implements an http.Handler that serves blog articles.
type
Server
struct
{
cfg
Config
docs
[]
*
Doc
tags
[]
string
docPaths
map
[
string
]
*
Doc
// key is path without BasePath.
docTags
map
[
string
][]
*
Doc
template
struct
{
cfg
Config
docs
[]
*
Doc
redirects
map
[
string
]
string
tags
[]
string
docPaths
map
[
string
]
*
Doc
// key is path without BasePath.
docTags
map
[
string
][]
*
Doc
template
struct
{
home
,
index
,
article
,
doc
*
template
.
Template
}
atomFeed
[]
byte
// pre-rendered Atom feed
...
...
@@ -117,7 +119,8 @@ func NewServer(cfg Config) (*Server, error) {
}
// Load content.
err
=
s
.
loadDocs
(
filepath
.
Clean
(
cfg
.
ContentPath
))
content
:=
filepath
.
Clean
(
cfg
.
ContentPath
)
err
=
s
.
loadDocs
(
content
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -156,6 +159,9 @@ func authors(authors []present.Author) string {
for
i
,
a
:=
range
authors
{
if
i
>
0
{
if
i
==
last
{
if
len
(
authors
)
>
2
{
b
.
WriteString
(
","
)
}
b
.
WriteString
(
" and "
)
}
else
{
b
.
WriteString
(
", "
)
...
...
@@ -187,6 +193,10 @@ func (s *Server) loadDocs(root string) error {
// Read content into docs field.
const
ext
=
".article"
fn
:=
func
(
p
string
,
info
os
.
FileInfo
,
err
error
)
error
{
if
err
!=
nil
{
return
err
}
if
filepath
.
Ext
(
p
)
!=
ext
{
return
nil
}
...
...
@@ -223,12 +233,27 @@ func (s *Server) loadDocs(root string) error {
// Pull out doc paths and tags and put in reverse-associating maps.
s
.
docPaths
=
make
(
map
[
string
]
*
Doc
)
s
.
docTags
=
make
(
map
[
string
][]
*
Doc
)
s
.
redirects
=
make
(
map
[
string
]
string
)
for
_
,
d
:=
range
s
.
docs
{
s
.
docPaths
[
strings
.
TrimPrefix
(
d
.
Path
,
s
.
cfg
.
BasePath
)]
=
d
for
_
,
t
:=
range
d
.
Tags
{
s
.
docTags
[
t
]
=
append
(
s
.
docTags
[
t
],
d
)
}
}
for
_
,
d
:=
range
s
.
docs
{
for
_
,
old
:=
range
d
.
OldURL
{
if
!
strings
.
HasPrefix
(
old
,
"/"
)
{
old
=
"/"
+
old
}
if
_
,
ok
:=
s
.
docPaths
[
old
];
ok
{
return
fmt
.
Errorf
(
"redirect %s -> %s conflicts with document %s"
,
old
,
d
.
Path
,
old
)
}
if
new
,
ok
:=
s
.
redirects
[
old
];
ok
{
return
fmt
.
Errorf
(
"redirect %s -> %s conflicts with redirect %s -> %s"
,
old
,
d
.
Path
,
old
,
new
)
}
s
.
redirects
[
old
]
=
d
.
Path
}
}
// Pull out unique sorted list of tags.
for
t
:=
range
s
.
docTags
{
...
...
@@ -290,9 +315,21 @@ func (s *Server) renderAtomFeed() error {
if
i
>=
s
.
cfg
.
FeedArticles
{
break
}
// Use original article path as ID in atom feed
// to avoid articles being treated as new when renamed.
idPath
:=
doc
.
Path
if
len
(
doc
.
OldURL
)
>
0
{
old
:=
doc
.
OldURL
[
0
]
if
!
strings
.
HasPrefix
(
old
,
"/"
)
{
old
=
"/"
+
old
}
idPath
=
old
}
e
:=
&
atom
.
Entry
{
Title
:
doc
.
Title
,
ID
:
feed
.
ID
+
d
oc
.
Path
,
ID
:
feed
.
ID
+
i
dPath
,
Link
:
[]
atom
.
Link
{{
Rel
:
"alternate"
,
Href
:
doc
.
Permalink
,
...
...
@@ -379,17 +416,22 @@ func summary(d *Doc) string {
// rootData encapsulates data destined for the root template.
type
rootData
struct
{
Doc
*
Doc
BasePath
string
GodocURL
string
Data
interface
{}
Doc
*
Doc
BasePath
string
GodocURL
string
AnalyticsHTML
template
.
HTML
Data
interface
{}
}
// ServeHTTP serves the front, index, and article pages
// as well as the ATOM and JSON feeds.
func
(
s
*
Server
)
ServeHTTP
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
var
(
d
=
rootData
{
BasePath
:
s
.
cfg
.
BasePath
,
GodocURL
:
s
.
cfg
.
GodocURL
}
d
=
rootData
{
BasePath
:
s
.
cfg
.
BasePath
,
GodocURL
:
s
.
cfg
.
GodocURL
,
AnalyticsHTML
:
s
.
cfg
.
AnalyticsHTML
,
}
t
*
template
.
Template
)
switch
p
:=
strings
.
TrimPrefix
(
r
.
URL
.
Path
,
s
.
cfg
.
BasePath
);
p
{
...
...
@@ -416,6 +458,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w
.
Write
(
s
.
jsonFeed
)
return
default
:
if
redir
,
ok
:=
s
.
redirects
[
p
];
ok
{
http
.
Redirect
(
w
,
r
,
redir
,
http
.
StatusMovedPermanently
)
return
}
doc
,
ok
:=
s
.
docPaths
[
p
]
if
!
ok
{
// Not a doc; try to just serve static content.
...
...
cmd/auth/authtest/authtest.go
0 → 100644
View file @
b22c2c1f
// Copyright 2019 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.
// authtest is a diagnostic tool for implementations of the GOAUTH protocol
// described in https://golang.org/issue/26232.
//
// It accepts a single URL as an argument, and executes the GOAUTH protocol to
// fetch and display the headers for that URL.
//
// CAUTION: authtest logs the GOAUTH responses, which may include user
// credentials, to stderr. Do not post its output unless you are certain that
// all of the credentials involved are fake!
package
main
import
(
"bufio"
"bytes"
"flag"
"fmt"
exec
"golang.org/x/sys/execabs"
"io"
"log"
"net/http"
"net/textproto"
"net/url"
"os"
"path/filepath"
"strings"
)
var
v
=
flag
.
Bool
(
"v"
,
false
,
"if true, log GOAUTH responses to stderr"
)
func
main
()
{
log
.
SetFlags
(
log
.
LstdFlags
|
log
.
Lshortfile
)
flag
.
Parse
()
args
:=
flag
.
Args
()
if
len
(
args
)
!=
1
{
log
.
Fatalf
(
"usage: [GOAUTH=CMD...] %s URL"
,
filepath
.
Base
(
os
.
Args
[
0
]))
}
resp
:=
try
(
args
[
0
],
nil
)
if
resp
.
StatusCode
==
http
.
StatusOK
{
return
}
resp
=
try
(
args
[
0
],
resp
)
if
resp
.
StatusCode
!=
http
.
StatusOK
{
os
.
Exit
(
1
)
}
}
func
try
(
url
string
,
prev
*
http
.
Response
)
*
http
.
Response
{
req
:=
new
(
http
.
Request
)
if
prev
!=
nil
{
*
req
=
*
prev
.
Request
}
else
{
var
err
error
req
,
err
=
http
.
NewRequest
(
"HEAD"
,
os
.
Args
[
1
],
nil
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
goauth
:
for
_
,
argList
:=
range
strings
.
Split
(
os
.
Getenv
(
"GOAUTH"
),
";"
)
{
// TODO(golang.org/issue/26849): If we escape quoted strings in GOFLAGS, use
// the same quoting here.
args
:=
strings
.
Split
(
argList
,
" "
)
if
len
(
args
)
==
0
||
args
[
0
]
==
""
{
log
.
Fatalf
(
"invalid or empty command in GOAUTH"
)
}
creds
,
err
:=
getCreds
(
args
,
prev
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
for
_
,
c
:=
range
creds
{
if
c
.
Apply
(
req
)
{
fmt
.
Fprintf
(
os
.
Stderr
,
"# request to %s
\n
"
,
req
.
URL
)
fmt
.
Fprintf
(
os
.
Stderr
,
"%s %s %s
\n
"
,
req
.
Method
,
req
.
URL
,
req
.
Proto
)
req
.
Header
.
Write
(
os
.
Stderr
)
fmt
.
Fprintln
(
os
.
Stderr
)
break
goauth
}
}
}
resp
,
err
:=
http
.
DefaultClient
.
Do
(
req
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
defer
resp
.
Body
.
Close
()
if
resp
.
StatusCode
!=
http
.
StatusOK
&&
resp
.
StatusCode
<
400
||
resp
.
StatusCode
>
500
{
log
.
Fatalf
(
"unexpected status: %v"
,
resp
.
Status
)
}
fmt
.
Fprintf
(
os
.
Stderr
,
"# response from %s
\n
"
,
resp
.
Request
.
URL
)
formatHead
(
os
.
Stderr
,
resp
)
return
resp
}
func
formatHead
(
out
io
.
Writer
,
resp
*
http
.
Response
)
{
fmt
.
Fprintf
(
out
,
"%s %s
\n
"
,
resp
.
Proto
,
resp
.
Status
)
if
err
:=
resp
.
Header
.
Write
(
out
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
fmt
.
Fprintln
(
out
)
}
type
Cred
struct
{
URLPrefixes
[]
*
url
.
URL
Header
http
.
Header
}
func
(
c
Cred
)
Apply
(
req
*
http
.
Request
)
bool
{
if
req
.
URL
==
nil
{
return
false
}
ok
:=
false
for
_
,
prefix
:=
range
c
.
URLPrefixes
{
if
prefix
.
Host
==
req
.
URL
.
Host
&&
(
req
.
URL
.
Path
==
prefix
.
Path
||
(
strings
.
HasPrefix
(
req
.
URL
.
Path
,
prefix
.
Path
)
&&
(
strings
.
HasSuffix
(
prefix
.
Path
,
"/"
)
||
req
.
URL
.
Path
[
len
(
prefix
.
Path
)]
==
'/'
)))
{
ok
=
true
break
}
}
if
!
ok
{
return
false
}
for
k
,
vs
:=
range
c
.
Header
{
req
.
Header
.
Del
(
k
)
for
_
,
v
:=
range
vs
{
req
.
Header
.
Add
(
k
,
v
)
}
}
return
true
}
func
(
c
Cred
)
String
()
string
{
var
buf
strings
.
Builder
for
_
,
u
:=
range
c
.
URLPrefixes
{
fmt
.
Fprintln
(
&
buf
,
u
)
}
buf
.
WriteString
(
"
\n
"
)
c
.
Header
.
Write
(
&
buf
)
buf
.
WriteString
(
"
\n
"
)
return
buf
.
String
()
}
func
getCreds
(
args
[]
string
,
resp
*
http
.
Response
)
([]
Cred
,
error
)
{
cmd
:=
exec
.
Command
(
args
[
0
],
args
[
1
:
]
...
)
cmd
.
Stderr
=
os
.
Stderr
if
resp
!=
nil
{
u
:=
*
resp
.
Request
.
URL
u
.
RawQuery
=
""
cmd
.
Args
=
append
(
cmd
.
Args
,
u
.
String
())
}
var
head
strings
.
Builder
if
resp
!=
nil
{
formatHead
(
&
head
,
resp
)
}
cmd
.
Stdin
=
strings
.
NewReader
(
head
.
String
())
fmt
.
Fprintf
(
os
.
Stderr
,
"# %s
\n
"
,
strings
.
Join
(
cmd
.
Args
,
" "
))
out
,
err
:=
cmd
.
Output
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"%s: %v"
,
strings
.
Join
(
cmd
.
Args
,
" "
),
err
)
}
os
.
Stderr
.
Write
(
out
)
os
.
Stderr
.
WriteString
(
"
\n
"
)
var
creds
[]
Cred
r
:=
textproto
.
NewReader
(
bufio
.
NewReader
(
bytes
.
NewReader
(
out
)))
line
:=
0
readLoop
:
for
{
var
prefixes
[]
*
url
.
URL
for
{
prefix
,
err
:=
r
.
ReadLine
()
if
err
==
io
.
EOF
{
if
len
(
prefixes
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"line %d: %v"
,
line
,
io
.
ErrUnexpectedEOF
)
}
break
readLoop
}
line
++
if
prefix
==
""
{
if
len
(
prefixes
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"line %d: unexpected newline"
,
line
)
}
break
}
u
,
err
:=
url
.
Parse
(
prefix
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"line %d: malformed URL: %v"
,
line
,
err
)
}
if
u
.
Scheme
!=
"https"
{
return
nil
,
fmt
.
Errorf
(
"line %d: non-HTTPS URL %q"
,
line
,
prefix
)
}
if
len
(
u
.
RawQuery
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"line %d: unexpected query string in URL %q"
,
line
,
prefix
)
}
if
len
(
u
.
Fragment
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"line %d: unexpected fragment in URL %q"
,
line
,
prefix
)
}
prefixes
=
append
(
prefixes
,
u
)
}
header
,
err
:=
r
.
ReadMIMEHeader
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"headers at line %d: %v"
,
line
,
err
)
}
if
len
(
header
)
>
0
{
creds
=
append
(
creds
,
Cred
{
URLPrefixes
:
prefixes
,
Header
:
http
.
Header
(
header
),
})
}
}
return
creds
,
nil
}
cmd/auth/cookieauth/cookieauth.go
0 → 100644
View file @
b22c2c1f
// Copyright 2019 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.
// cookieauth uses a “Netscape cookie file” to implement the GOAUTH protocol
// described in https://golang.org/issue/26232.
// It expects the location of the file as the first command-line argument.
//
// Example GOAUTH usage:
// export GOAUTH="cookieauth $(git config --get http.cookieFile)"
//
// See http://www.cookiecentral.com/faq/#3.5 for a description of the Netscape
// cookie file format.
package
main
import
(
"bufio"
"fmt"
"io"
"log"
"net/http"
"net/http/cookiejar"
"net/url"
"os"
"strconv"
"strings"
"time"
"unicode"
)
func
main
()
{
if
len
(
os
.
Args
)
<
2
{
fmt
.
Fprintf
(
os
.
Stderr
,
"usage: %s COOKIEFILE [URL]
\n
"
,
os
.
Args
[
0
])
os
.
Exit
(
2
)
}
log
.
SetPrefix
(
"cookieauth: "
)
f
,
err
:=
os
.
Open
(
os
.
Args
[
1
])
if
err
!=
nil
{
log
.
Fatalf
(
"failed to read cookie file: %v
\n
"
,
os
.
Args
[
1
])
os
.
Exit
(
1
)
}
defer
f
.
Close
()
var
(
targetURL
*
url
.
URL
targetURLs
=
map
[
string
]
*
url
.
URL
{}
)
if
len
(
os
.
Args
)
==
3
{
targetURL
,
err
=
url
.
ParseRequestURI
(
os
.
Args
[
2
])
if
err
!=
nil
{
log
.
Fatalf
(
"invalid request URI (%v): %q
\n
"
,
err
,
os
.
Args
[
2
])
}
targetURLs
[
targetURL
.
String
()]
=
targetURL
}
else
if
len
(
os
.
Args
)
>
3
{
// Extra arguments were passed: maybe the protocol was expanded?
// We don't know how to interpret the request, so ignore it.
return
}
entries
,
err
:=
parseCookieFile
(
f
.
Name
(),
f
)
if
err
!=
nil
{
log
.
Fatalf
(
"error reading cookie file: %v
\n
"
,
f
.
Name
())
}
jar
,
err
:=
cookiejar
.
New
(
nil
)
if
err
!=
nil
{
log
.
Fatalf
(
"failed to initialize cookie jar: %v
\n
"
,
err
)
}
for
_
,
e
:=
range
entries
{
u
:=
&
url
.
URL
{
Scheme
:
"https"
,
Host
:
e
.
Host
,
Path
:
e
.
Cookie
.
Path
,
}
if
targetURL
==
nil
{
targetURLs
[
u
.
String
()]
=
u
}
jar
.
SetCookies
(
u
,
[]
*
http
.
Cookie
{
&
e
.
Cookie
})
}
for
_
,
u
:=
range
targetURLs
{
req
:=
&
http
.
Request
{
URL
:
u
,
Header
:
make
(
http
.
Header
)}
for
_
,
c
:=
range
jar
.
Cookies
(
req
.
URL
)
{
req
.
AddCookie
(
c
)
}
fmt
.
Printf
(
"%s
\n\n
"
,
u
)
req
.
Header
.
Write
(
os
.
Stdout
)
fmt
.
Println
()
}
}
type
Entry
struct
{
Host
string
Cookie
http
.
Cookie
}
// parseCookieFile parses a Netscape cookie file as described in
// http://www.cookiecentral.com/faq/#3.5.
func
parseCookieFile
(
name
string
,
r
io
.
Reader
)
([]
*
Entry
,
error
)
{
var
entries
[]
*
Entry
s
:=
bufio
.
NewScanner
(
r
)
line
:=
0
for
s
.
Scan
()
{
line
++
text
:=
strings
.
TrimSpace
(
s
.
Text
())
if
len
(
text
)
<
2
||
(
text
[
0
]
==
'#'
&&
unicode
.
IsSpace
(
rune
(
text
[
1
])))
{
continue
}
e
,
err
:=
parseCookieLine
(
text
)
if
err
!=
nil
{
log
.
Printf
(
"%s:%d: %v
\n
"
,
name
,
line
,
err
)
continue
}
entries
=
append
(
entries
,
e
)
}
return
entries
,
s
.
Err
()
}
func
parseCookieLine
(
line
string
)
(
*
Entry
,
error
)
{
f
:=
strings
.
Fields
(
line
)
if
len
(
f
)
<
7
{
return
nil
,
fmt
.
Errorf
(
"found %d columns; want 7"
,
len
(
f
))
}
e
:=
new
(
Entry
)