mirror of https://github.com/knative/client.git
upgrade to latest dependencies (#1538)
bumping knative.dev/eventing 72a4be0...43aa796: > 43aa796 Fix channel template spec type for Sequence channel template field (# 5955) > ab80d13 Update community files (# 5956) > 93df31e CR's name in metrics' label (# 5945) > 7678268 Enhance broker filter to proxy response headers. (# 5946) bumping knative.dev/networking 9e2b349...1c6e5ff: > 1c6e5ff Simplify the HTTP Proxy test image a bit (# 588) > 6c8dbb6 upgrade to latest dependencies (# 587) > d65e1ba Update community files (# 586) bumping knative.dev/hack 4ec2223...e11ac12: > e11ac12 Update community files (# 126) bumping knative.dev/pkg 0c482f1...18589ac: > 18589ac Bump assorted dependencies to their latest releases (# 2371) > d37811b Update community files (# 2370) bumping knative.dev/serving d24124c...8f36565: > 8f36565 Simplify the HTTP Proxy test image a bit (# 12399) > 9c546a5 upgrade to latest dependencies (# 12398) > 580901b Avoid LRU in defaults configmap (# 12348) > 0cb0b81 Update net-gateway-api nightly (# 12396) > a794e1f Simplify `net_istio_file_url()` in test script (# 12394) > d436895 Update net-contour nightly (# 12389) > 8b808e6 simplify net-gateway-api install (# 12386) > b291012 Update net-kourier nightly (# 12392) > 76d05d4 Update net-gateway-api nightly (# 12390) > 57a23a9 Update net-istio nightly (# 12391) > 420a599 Update community files (# 12388) > 1cc3a31 Do not install redundant resources in upgrade tests (# 12366) > ccfd144 Update net-istio nightly (# 12383) > 1f84d93 Update net-gateway-api nightly (# 12382) > 4bcfc89 Update net-certmanager nightly (# 12381) > 13d0c3b Update net-contour nightly (# 12380) > 550ef67 Use CheckEndpointState in v1beta1 domainmapping test (# 12373) > 50e4b64 enable feature emptyDir for tests run with Kind (# 12385) Signed-off-by: Knative Automation <automation@knative.team>
This commit is contained in:
parent
85489ab839
commit
c053f2bf75
10
go.mod
10
go.mod
|
|
@ -22,10 +22,10 @@ require (
|
||||||
k8s.io/client-go v0.21.4
|
k8s.io/client-go v0.21.4
|
||||||
k8s.io/code-generator v0.21.4
|
k8s.io/code-generator v0.21.4
|
||||||
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect
|
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect
|
||||||
knative.dev/eventing v0.27.1-0.20211202084045-72a4be098484
|
knative.dev/eventing v0.27.1-0.20211207100957-43aa7963d8c6
|
||||||
knative.dev/hack v0.0.0-20211202013744-4ec2223904bf
|
knative.dev/hack v0.0.0-20211203062838-e11ac125e707
|
||||||
knative.dev/networking v0.0.0-20211202071645-9e2b3496bb72
|
knative.dev/networking v0.0.0-20211207005157-1c6e5ff34dfb
|
||||||
knative.dev/pkg v0.0.0-20211202025645-0c482f157959
|
knative.dev/pkg v0.0.0-20211206113427-18589ac7627e
|
||||||
knative.dev/serving v0.27.1-0.20211202122446-d24124ce039c
|
knative.dev/serving v0.27.1-0.20211207020356-8f36565cbae6
|
||||||
sigs.k8s.io/yaml v1.3.0
|
sigs.k8s.io/yaml v1.3.0
|
||||||
)
|
)
|
||||||
|
|
|
||||||
56
go.sum
56
go.sum
|
|
@ -26,8 +26,9 @@ cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWc
|
||||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
||||||
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
||||||
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
||||||
cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8=
|
|
||||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
||||||
|
cloud.google.com/go v0.98.0 h1:w6LozQJyDDEyhf64Uusu1LCcnLt0I1VMLiJC2kV+eXk=
|
||||||
|
cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
|
|
@ -1040,6 +1041,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
|
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
|
||||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
|
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
|
||||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
||||||
|
|
@ -1141,8 +1143,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
|
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
||||||
|
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
|
@ -1205,8 +1208,9 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||||
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 h1:DZshvxDdVoeKIbudAdFEKi+f70l51luSy/7b76ibTY0=
|
|
||||||
golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20211205041911-012df41ee64c h1:7SfqwP5fxEtl/P02w5IhKc86ziJ+A25yFrkVgoy2FT8=
|
||||||
|
golang.org/x/net v0.0.0-20211205041911-012df41ee64c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
|
@ -1341,9 +1345,11 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1 h1:kwrAHlwJ0DUBZwQ238v+Uod/3eZ8B2K5rYsUHBQvzmI=
|
|
||||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc=
|
||||||
|
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
|
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
|
||||||
|
|
@ -1434,8 +1440,9 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
|
|
||||||
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||||
|
golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
|
||||||
|
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|
@ -1479,8 +1486,9 @@ google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv
|
||||||
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
||||||
google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E=
|
google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E=
|
||||||
google.golang.org/api v0.60.0 h1:eq/zs5WPH4J9undYM9IP1O7dSr7Yh8Y0GtSCpzGzIUk=
|
|
||||||
google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4=
|
google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4=
|
||||||
|
google.golang.org/api v0.61.0 h1:TXXKS1slM3b2bZNJwD5DV/Tp6/M2cLzLOLh9PjDhrw8=
|
||||||
|
google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
|
@ -1554,8 +1562,9 @@ google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEc
|
||||||
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 h1:b9mVrqYfq3P4bCdaLg1qtBnPzUYgglsIdjZkL/fQVOE=
|
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
|
google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12 h1:DN5b3HU13J4sMd/QjDx34U6afpaexKTDdop+26pdjdk=
|
||||||
|
google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
||||||
|
|
@ -1706,8 +1715,9 @@ k8s.io/csi-translation-lib v0.21.0/go.mod h1:edq+UMpgqEx3roTuGF/03uIuSOsI986jtu6
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||||
k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/gengo v0.0.0-20210915205010-39e73c8a59cd h1:WEhFhsVrgII9WzLqf1VTUUtwPHm+vxbRq8Ib6y9Jt4g=
|
|
||||||
k8s.io/gengo v0.0.0-20210915205010-39e73c8a59cd/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20210915205010-39e73c8a59cd/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
|
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI=
|
||||||
|
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
||||||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
|
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
|
||||||
|
|
@ -1725,26 +1735,26 @@ k8s.io/legacy-cloud-providers v0.21.0/go.mod h1:bNxo7gDg+PGkBmT/MFZswLTWdSWK9kAl
|
||||||
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||||
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ=
|
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ=
|
||||||
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||||
knative.dev/caching v0.0.0-20211126074453-72ad79574e83/go.mod h1:q/8RJkWzHcAzFJkVdCfmGrOHFGgjNDiYf6pE+ZMwlaE=
|
knative.dev/caching v0.0.0-20211203062336-50189aafddf2/go.mod h1:/HIs+aQnqTopt22ezLsFNi2pp1EkR8gCGiJEdotFOkw=
|
||||||
knative.dev/eventing v0.27.1-0.20211202084045-72a4be098484 h1:aUjqUjNXHE9E9D3KvMqm4nAZ9c88dDP5UMoin9TZCn8=
|
knative.dev/eventing v0.27.1-0.20211207100957-43aa7963d8c6 h1:V5S12/myRbGDMRGdBOAvz0PzkDKUl7EKwuHWdGiyvHA=
|
||||||
knative.dev/eventing v0.27.1-0.20211202084045-72a4be098484/go.mod h1:UEnzKapiHxRsFUF8wbJXFMsfktaEtGltBZdTebSNRCU=
|
knative.dev/eventing v0.27.1-0.20211207100957-43aa7963d8c6/go.mod h1:sfpooZ7ZnkLTOvNhXtc1geY16mjwc0kKWi/0wWoqWbE=
|
||||||
knative.dev/hack v0.0.0-20211101195839-11d193bf617b/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
knative.dev/hack v0.0.0-20211101195839-11d193bf617b/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
||||||
|
knative.dev/hack v0.0.0-20211112192837-128cf0150a69/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
||||||
knative.dev/hack v0.0.0-20211122162614-813559cefdda/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
knative.dev/hack v0.0.0-20211122162614-813559cefdda/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
||||||
knative.dev/hack v0.0.0-20211202013744-4ec2223904bf h1:Z4mOmsg8nqFurWIHr5JpA3iVgqI6EHjT5HsklQ+fi4U=
|
knative.dev/hack v0.0.0-20211203062838-e11ac125e707 h1:Nx3HBoTHjYzXT9xxh5j6A8pMapNqyDLqjl784YxWPDQ=
|
||||||
knative.dev/hack v0.0.0-20211202013744-4ec2223904bf/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
knative.dev/hack v0.0.0-20211203062838-e11ac125e707/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
|
||||||
knative.dev/hack/schema v0.0.0-20211122162614-813559cefdda/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0=
|
knative.dev/hack/schema v0.0.0-20211122162614-813559cefdda/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0=
|
||||||
knative.dev/networking v0.0.0-20211126074453-0151d6b9c689/go.mod h1:/rx6BM9Vn0X2RRLOhi0RDzwrj0sr0zEJNSWUIZR7vbM=
|
knative.dev/networking v0.0.0-20211203062838-d65e1ba909fe/go.mod h1:ZvA2FO5wExIGXTpH+egSwEK/SIaQVm6i7ErvFWsJMaU=
|
||||||
knative.dev/networking v0.0.0-20211202071645-9e2b3496bb72 h1:9NKLcCn5uaSV3h9JMtN2lLnNhiWK4aQiahY+H4V6uyc=
|
knative.dev/networking v0.0.0-20211207005157-1c6e5ff34dfb h1:FF2LcVqLvEG0R3iUjVfOhYoP2W2nYAkH4RmLXc0wp5k=
|
||||||
knative.dev/networking v0.0.0-20211202071645-9e2b3496bb72/go.mod h1:ZvA2FO5wExIGXTpH+egSwEK/SIaQVm6i7ErvFWsJMaU=
|
knative.dev/networking v0.0.0-20211207005157-1c6e5ff34dfb/go.mod h1:ESsS/8DnFpQ1JiI9aIkt5HO/0oDu/tyFyJgqsvV8oec=
|
||||||
knative.dev/pkg v0.0.0-20211101212339-96c0204a70dc/go.mod h1:SkfDk9bWIiNZD7XtILGkG7AKVyF/M6M0bGxLgl0SYL8=
|
knative.dev/pkg v0.0.0-20211101212339-96c0204a70dc/go.mod h1:SkfDk9bWIiNZD7XtILGkG7AKVyF/M6M0bGxLgl0SYL8=
|
||||||
knative.dev/pkg v0.0.0-20211125172117-608fc877e946/go.mod h1:fZUlVceKtVNyFU6LokWGk2a9QFQXeSTtnbKOjjkQ690=
|
knative.dev/pkg v0.0.0-20211120133512-d016976f2567/go.mod h1:VqUp1KWJqpTDNoiSI/heaX3uMdubImslJE2tBkP+Bbw=
|
||||||
knative.dev/pkg v0.0.0-20211129153605-754f332c0c51/go.mod h1:RnaMfVuCsk4ikspMTTc1k0kQKGdbDGxt6mxIPuanfv0=
|
|
||||||
knative.dev/pkg v0.0.0-20211129195804-438776b3c87c/go.mod h1:AKPae1Cmj+k0GWXWnF2tKY7q5qPa1mTD7oCP4OeMvEM=
|
knative.dev/pkg v0.0.0-20211129195804-438776b3c87c/go.mod h1:AKPae1Cmj+k0GWXWnF2tKY7q5qPa1mTD7oCP4OeMvEM=
|
||||||
knative.dev/pkg v0.0.0-20211202025645-0c482f157959 h1:MLtwkPFGEM6IUGFFBWX0Nvon494culUqZJ3JLKy4dps=
|
knative.dev/pkg v0.0.0-20211206113427-18589ac7627e h1:8hK7g4jz56ZtF3iQLsvrvR/hHnP5ZWLSxLnyYMbfxwY=
|
||||||
knative.dev/pkg v0.0.0-20211202025645-0c482f157959/go.mod h1:AKPae1Cmj+k0GWXWnF2tKY7q5qPa1mTD7oCP4OeMvEM=
|
knative.dev/pkg v0.0.0-20211206113427-18589ac7627e/go.mod h1:E6B4RTjZyxe55a0kxOlnEHEl71zuG7gghnqYvNBKwBw=
|
||||||
knative.dev/reconciler-test v0.0.0-20211112132636-ae9e2e21972f/go.mod h1:gTsbLk496j/M9xqMpx/liyCQ0X3bwDpRtcs2Zzws364=
|
knative.dev/reconciler-test v0.0.0-20211206091826-80584b570590/go.mod h1:gTsbLk496j/M9xqMpx/liyCQ0X3bwDpRtcs2Zzws364=
|
||||||
knative.dev/serving v0.27.1-0.20211202122446-d24124ce039c h1:RpnSzfHMetCB9f1NDORn0KnJTE0edN9N7Iipn+FoCx0=
|
knative.dev/serving v0.27.1-0.20211207020356-8f36565cbae6 h1:or4/3AhWSKfkMnceU9urF5VDQNsuugkc7cdpCLSf3N0=
|
||||||
knative.dev/serving v0.27.1-0.20211202122446-d24124ce039c/go.mod h1:6cR8XjM/4CNpieXhqI2taLv2NCl0Tc9VddfRK29FNHQ=
|
knative.dev/serving v0.27.1-0.20211207020356-8f36565cbae6/go.mod h1:HRjQYtClfYxXpQzWWSTWUkvbs+iYdaOqFCtOdEQgCi8=
|
||||||
pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
|
pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
|
|
|
||||||
|
|
@ -323,7 +323,7 @@ func (c *Client) getETag(suffix string) (value, etag string, err error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if reqErr != nil {
|
if reqErr != nil {
|
||||||
return "", "", nil
|
return "", "", reqErr
|
||||||
}
|
}
|
||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
if res.StatusCode == http.StatusNotFound {
|
if res.StatusCode == http.StatusNotFound {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
// Copyright 2018 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.
|
||||||
|
|
||||||
|
// Package lazyregexp is a thin wrapper over regexp, allowing the use of global
|
||||||
|
// regexp variables without forcing them to be compiled at init.
|
||||||
|
package lazyregexp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be
|
||||||
|
// compiled the first time it is needed.
|
||||||
|
type Regexp struct {
|
||||||
|
str string
|
||||||
|
once sync.Once
|
||||||
|
rx *regexp.Regexp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) re() *regexp.Regexp {
|
||||||
|
r.once.Do(r.build)
|
||||||
|
return r.rx
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) build() {
|
||||||
|
r.rx = regexp.MustCompile(r.str)
|
||||||
|
r.str = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) FindSubmatch(s []byte) [][]byte {
|
||||||
|
return r.re().FindSubmatch(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) FindStringSubmatch(s string) []string {
|
||||||
|
return r.re().FindStringSubmatch(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) FindStringSubmatchIndex(s string) []int {
|
||||||
|
return r.re().FindStringSubmatchIndex(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) ReplaceAllString(src, repl string) string {
|
||||||
|
return r.re().ReplaceAllString(src, repl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) FindString(s string) string {
|
||||||
|
return r.re().FindString(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) FindAllString(s string, n int) []string {
|
||||||
|
return r.re().FindAllString(s, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) MatchString(s string) bool {
|
||||||
|
return r.re().MatchString(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Regexp) SubexpNames() []string {
|
||||||
|
return r.re().SubexpNames()
|
||||||
|
}
|
||||||
|
|
||||||
|
var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test")
|
||||||
|
|
||||||
|
// New creates a new lazy regexp, delaying the compiling work until it is first
|
||||||
|
// needed. If the code is being run as part of tests, the regexp compiling will
|
||||||
|
// happen immediately.
|
||||||
|
func New(str string) *Regexp {
|
||||||
|
lr := &Regexp{str: str}
|
||||||
|
if inTest {
|
||||||
|
// In tests, always compile the regexps early.
|
||||||
|
lr.re()
|
||||||
|
}
|
||||||
|
return lr
|
||||||
|
}
|
||||||
|
|
@ -192,6 +192,21 @@ func (e *InvalidVersionError) Error() string {
|
||||||
|
|
||||||
func (e *InvalidVersionError) Unwrap() error { return e.Err }
|
func (e *InvalidVersionError) Unwrap() error { return e.Err }
|
||||||
|
|
||||||
|
// An InvalidPathError indicates a module, import, or file path doesn't
|
||||||
|
// satisfy all naming constraints. See CheckPath, CheckImportPath,
|
||||||
|
// and CheckFilePath for specific restrictions.
|
||||||
|
type InvalidPathError struct {
|
||||||
|
Kind string // "module", "import", or "file"
|
||||||
|
Path string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *InvalidPathError) Error() string {
|
||||||
|
return fmt.Sprintf("malformed %s path %q: %v", e.Kind, e.Path, e.Err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *InvalidPathError) Unwrap() error { return e.Err }
|
||||||
|
|
||||||
// Check checks that a given module path, version pair is valid.
|
// Check checks that a given module path, version pair is valid.
|
||||||
// In addition to the path being a valid module path
|
// In addition to the path being a valid module path
|
||||||
// and the version being a valid semantic version,
|
// and the version being a valid semantic version,
|
||||||
|
|
@ -296,30 +311,36 @@ func fileNameOK(r rune) bool {
|
||||||
// this second requirement is replaced by a requirement that the path
|
// this second requirement is replaced by a requirement that the path
|
||||||
// follow the gopkg.in server's conventions.
|
// follow the gopkg.in server's conventions.
|
||||||
// Third, no path element may begin with a dot.
|
// Third, no path element may begin with a dot.
|
||||||
func CheckPath(path string) error {
|
func CheckPath(path string) (err error) {
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
err = &InvalidPathError{Kind: "module", Path: path, Err: err}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if err := checkPath(path, modulePath); err != nil {
|
if err := checkPath(path, modulePath); err != nil {
|
||||||
return fmt.Errorf("malformed module path %q: %v", path, err)
|
return err
|
||||||
}
|
}
|
||||||
i := strings.Index(path, "/")
|
i := strings.Index(path, "/")
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
i = len(path)
|
i = len(path)
|
||||||
}
|
}
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
return fmt.Errorf("malformed module path %q: leading slash", path)
|
return fmt.Errorf("leading slash")
|
||||||
}
|
}
|
||||||
if !strings.Contains(path[:i], ".") {
|
if !strings.Contains(path[:i], ".") {
|
||||||
return fmt.Errorf("malformed module path %q: missing dot in first path element", path)
|
return fmt.Errorf("missing dot in first path element")
|
||||||
}
|
}
|
||||||
if path[0] == '-' {
|
if path[0] == '-' {
|
||||||
return fmt.Errorf("malformed module path %q: leading dash in first path element", path)
|
return fmt.Errorf("leading dash in first path element")
|
||||||
}
|
}
|
||||||
for _, r := range path[:i] {
|
for _, r := range path[:i] {
|
||||||
if !firstPathOK(r) {
|
if !firstPathOK(r) {
|
||||||
return fmt.Errorf("malformed module path %q: invalid char %q in first path element", path, r)
|
return fmt.Errorf("invalid char %q in first path element", r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, _, ok := SplitPathVersion(path); !ok {
|
if _, _, ok := SplitPathVersion(path); !ok {
|
||||||
return fmt.Errorf("malformed module path %q: invalid version", path)
|
return fmt.Errorf("invalid version")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -343,7 +364,7 @@ func CheckPath(path string) error {
|
||||||
// subtleties of Unicode.
|
// subtleties of Unicode.
|
||||||
func CheckImportPath(path string) error {
|
func CheckImportPath(path string) error {
|
||||||
if err := checkPath(path, importPath); err != nil {
|
if err := checkPath(path, importPath); err != nil {
|
||||||
return fmt.Errorf("malformed import path %q: %v", path, err)
|
return &InvalidPathError{Kind: "import", Path: path, Err: err}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -358,12 +379,13 @@ const (
|
||||||
filePath
|
filePath
|
||||||
)
|
)
|
||||||
|
|
||||||
// checkPath checks that a general path is valid.
|
// checkPath checks that a general path is valid. kind indicates what
|
||||||
// It returns an error describing why but not mentioning path.
|
// specific constraints should be applied.
|
||||||
// Because these checks apply to both module paths and import paths,
|
//
|
||||||
// the caller is expected to add the "malformed ___ path %q: " prefix.
|
// checkPath returns an error describing why the path is not valid.
|
||||||
// fileName indicates whether the final element of the path is a file name
|
// Because these checks apply to module, import, and file paths,
|
||||||
// (as opposed to a directory name).
|
// and because other checks may be applied, the caller is expected to wrap
|
||||||
|
// this error with InvalidPathError.
|
||||||
func checkPath(path string, kind pathKind) error {
|
func checkPath(path string, kind pathKind) error {
|
||||||
if !utf8.ValidString(path) {
|
if !utf8.ValidString(path) {
|
||||||
return fmt.Errorf("invalid UTF-8")
|
return fmt.Errorf("invalid UTF-8")
|
||||||
|
|
@ -371,7 +393,7 @@ func checkPath(path string, kind pathKind) error {
|
||||||
if path == "" {
|
if path == "" {
|
||||||
return fmt.Errorf("empty string")
|
return fmt.Errorf("empty string")
|
||||||
}
|
}
|
||||||
if path[0] == '-' {
|
if path[0] == '-' && kind != filePath {
|
||||||
return fmt.Errorf("leading dash")
|
return fmt.Errorf("leading dash")
|
||||||
}
|
}
|
||||||
if strings.Contains(path, "//") {
|
if strings.Contains(path, "//") {
|
||||||
|
|
@ -477,7 +499,7 @@ func checkElem(elem string, kind pathKind) error {
|
||||||
// subtleties of Unicode.
|
// subtleties of Unicode.
|
||||||
func CheckFilePath(path string) error {
|
func CheckFilePath(path string) error {
|
||||||
if err := checkPath(path, filePath); err != nil {
|
if err := checkPath(path, filePath); err != nil {
|
||||||
return fmt.Errorf("malformed file path %q: %v", path, err)
|
return &InvalidPathError{Kind: "file", Path: path, Err: err}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,250 @@
|
||||||
|
// Copyright 2018 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.
|
||||||
|
|
||||||
|
// Pseudo-versions
|
||||||
|
//
|
||||||
|
// Code authors are expected to tag the revisions they want users to use,
|
||||||
|
// including prereleases. However, not all authors tag versions at all,
|
||||||
|
// and not all commits a user might want to try will have tags.
|
||||||
|
// A pseudo-version is a version with a special form that allows us to
|
||||||
|
// address an untagged commit and order that version with respect to
|
||||||
|
// other versions we might encounter.
|
||||||
|
//
|
||||||
|
// A pseudo-version takes one of the general forms:
|
||||||
|
//
|
||||||
|
// (1) vX.0.0-yyyymmddhhmmss-abcdef123456
|
||||||
|
// (2) vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456
|
||||||
|
// (3) vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456+incompatible
|
||||||
|
// (4) vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456
|
||||||
|
// (5) vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456+incompatible
|
||||||
|
//
|
||||||
|
// If there is no recently tagged version with the right major version vX,
|
||||||
|
// then form (1) is used, creating a space of pseudo-versions at the bottom
|
||||||
|
// of the vX version range, less than any tagged version, including the unlikely v0.0.0.
|
||||||
|
//
|
||||||
|
// If the most recent tagged version before the target commit is vX.Y.Z or vX.Y.Z+incompatible,
|
||||||
|
// then the pseudo-version uses form (2) or (3), making it a prerelease for the next
|
||||||
|
// possible semantic version after vX.Y.Z. The leading 0 segment in the prerelease string
|
||||||
|
// ensures that the pseudo-version compares less than possible future explicit prereleases
|
||||||
|
// like vX.Y.(Z+1)-rc1 or vX.Y.(Z+1)-1.
|
||||||
|
//
|
||||||
|
// If the most recent tagged version before the target commit is vX.Y.Z-pre or vX.Y.Z-pre+incompatible,
|
||||||
|
// then the pseudo-version uses form (4) or (5), making it a slightly later prerelease.
|
||||||
|
|
||||||
|
package module
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/mod/internal/lazyregexp"
|
||||||
|
"golang.org/x/mod/semver"
|
||||||
|
)
|
||||||
|
|
||||||
|
var pseudoVersionRE = lazyregexp.New(`^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)\d{14}-[A-Za-z0-9]+(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$`)
|
||||||
|
|
||||||
|
const PseudoVersionTimestampFormat = "20060102150405"
|
||||||
|
|
||||||
|
// PseudoVersion returns a pseudo-version for the given major version ("v1")
|
||||||
|
// preexisting older tagged version ("" or "v1.2.3" or "v1.2.3-pre"), revision time,
|
||||||
|
// and revision identifier (usually a 12-byte commit hash prefix).
|
||||||
|
func PseudoVersion(major, older string, t time.Time, rev string) string {
|
||||||
|
if major == "" {
|
||||||
|
major = "v0"
|
||||||
|
}
|
||||||
|
segment := fmt.Sprintf("%s-%s", t.UTC().Format(PseudoVersionTimestampFormat), rev)
|
||||||
|
build := semver.Build(older)
|
||||||
|
older = semver.Canonical(older)
|
||||||
|
if older == "" {
|
||||||
|
return major + ".0.0-" + segment // form (1)
|
||||||
|
}
|
||||||
|
if semver.Prerelease(older) != "" {
|
||||||
|
return older + ".0." + segment + build // form (4), (5)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form (2), (3).
|
||||||
|
// Extract patch from vMAJOR.MINOR.PATCH
|
||||||
|
i := strings.LastIndex(older, ".") + 1
|
||||||
|
v, patch := older[:i], older[i:]
|
||||||
|
|
||||||
|
// Reassemble.
|
||||||
|
return v + incDecimal(patch) + "-0." + segment + build
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZeroPseudoVersion returns a pseudo-version with a zero timestamp and
|
||||||
|
// revision, which may be used as a placeholder.
|
||||||
|
func ZeroPseudoVersion(major string) string {
|
||||||
|
return PseudoVersion(major, "", time.Time{}, "000000000000")
|
||||||
|
}
|
||||||
|
|
||||||
|
// incDecimal returns the decimal string incremented by 1.
|
||||||
|
func incDecimal(decimal string) string {
|
||||||
|
// Scan right to left turning 9s to 0s until you find a digit to increment.
|
||||||
|
digits := []byte(decimal)
|
||||||
|
i := len(digits) - 1
|
||||||
|
for ; i >= 0 && digits[i] == '9'; i-- {
|
||||||
|
digits[i] = '0'
|
||||||
|
}
|
||||||
|
if i >= 0 {
|
||||||
|
digits[i]++
|
||||||
|
} else {
|
||||||
|
// digits is all zeros
|
||||||
|
digits[0] = '1'
|
||||||
|
digits = append(digits, '0')
|
||||||
|
}
|
||||||
|
return string(digits)
|
||||||
|
}
|
||||||
|
|
||||||
|
// decDecimal returns the decimal string decremented by 1, or the empty string
|
||||||
|
// if the decimal is all zeroes.
|
||||||
|
func decDecimal(decimal string) string {
|
||||||
|
// Scan right to left turning 0s to 9s until you find a digit to decrement.
|
||||||
|
digits := []byte(decimal)
|
||||||
|
i := len(digits) - 1
|
||||||
|
for ; i >= 0 && digits[i] == '0'; i-- {
|
||||||
|
digits[i] = '9'
|
||||||
|
}
|
||||||
|
if i < 0 {
|
||||||
|
// decimal is all zeros
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if i == 0 && digits[i] == '1' && len(digits) > 1 {
|
||||||
|
digits = digits[1:]
|
||||||
|
} else {
|
||||||
|
digits[i]--
|
||||||
|
}
|
||||||
|
return string(digits)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsPseudoVersion reports whether v is a pseudo-version.
|
||||||
|
func IsPseudoVersion(v string) bool {
|
||||||
|
return strings.Count(v, "-") >= 2 && semver.IsValid(v) && pseudoVersionRE.MatchString(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsZeroPseudoVersion returns whether v is a pseudo-version with a zero base,
|
||||||
|
// timestamp, and revision, as returned by ZeroPseudoVersion.
|
||||||
|
func IsZeroPseudoVersion(v string) bool {
|
||||||
|
return v == ZeroPseudoVersion(semver.Major(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
// PseudoVersionTime returns the time stamp of the pseudo-version v.
|
||||||
|
// It returns an error if v is not a pseudo-version or if the time stamp
|
||||||
|
// embedded in the pseudo-version is not a valid time.
|
||||||
|
func PseudoVersionTime(v string) (time.Time, error) {
|
||||||
|
_, timestamp, _, _, err := parsePseudoVersion(v)
|
||||||
|
if err != nil {
|
||||||
|
return time.Time{}, err
|
||||||
|
}
|
||||||
|
t, err := time.Parse("20060102150405", timestamp)
|
||||||
|
if err != nil {
|
||||||
|
return time.Time{}, &InvalidVersionError{
|
||||||
|
Version: v,
|
||||||
|
Pseudo: true,
|
||||||
|
Err: fmt.Errorf("malformed time %q", timestamp),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PseudoVersionRev returns the revision identifier of the pseudo-version v.
|
||||||
|
// It returns an error if v is not a pseudo-version.
|
||||||
|
func PseudoVersionRev(v string) (rev string, err error) {
|
||||||
|
_, _, rev, _, err = parsePseudoVersion(v)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// PseudoVersionBase returns the canonical parent version, if any, upon which
|
||||||
|
// the pseudo-version v is based.
|
||||||
|
//
|
||||||
|
// If v has no parent version (that is, if it is "vX.0.0-[…]"),
|
||||||
|
// PseudoVersionBase returns the empty string and a nil error.
|
||||||
|
func PseudoVersionBase(v string) (string, error) {
|
||||||
|
base, _, _, build, err := parsePseudoVersion(v)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch pre := semver.Prerelease(base); pre {
|
||||||
|
case "":
|
||||||
|
// vX.0.0-yyyymmddhhmmss-abcdef123456 → ""
|
||||||
|
if build != "" {
|
||||||
|
// Pseudo-versions of the form vX.0.0-yyyymmddhhmmss-abcdef123456+incompatible
|
||||||
|
// are nonsensical: the "vX.0.0-" prefix implies that there is no parent tag,
|
||||||
|
// but the "+incompatible" suffix implies that the major version of
|
||||||
|
// the parent tag is not compatible with the module's import path.
|
||||||
|
//
|
||||||
|
// There are a few such entries in the index generated by proxy.golang.org,
|
||||||
|
// but we believe those entries were generated by the proxy itself.
|
||||||
|
return "", &InvalidVersionError{
|
||||||
|
Version: v,
|
||||||
|
Pseudo: true,
|
||||||
|
Err: fmt.Errorf("lacks base version, but has build metadata %q", build),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
|
|
||||||
|
case "-0":
|
||||||
|
// vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456 → vX.Y.Z
|
||||||
|
// vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456+incompatible → vX.Y.Z+incompatible
|
||||||
|
base = strings.TrimSuffix(base, pre)
|
||||||
|
i := strings.LastIndexByte(base, '.')
|
||||||
|
if i < 0 {
|
||||||
|
panic("base from parsePseudoVersion missing patch number: " + base)
|
||||||
|
}
|
||||||
|
patch := decDecimal(base[i+1:])
|
||||||
|
if patch == "" {
|
||||||
|
// vX.0.0-0 is invalid, but has been observed in the wild in the index
|
||||||
|
// generated by requests to proxy.golang.org.
|
||||||
|
//
|
||||||
|
// NOTE(bcmills): I cannot find a historical bug that accounts for
|
||||||
|
// pseudo-versions of this form, nor have I seen such versions in any
|
||||||
|
// actual go.mod files. If we find actual examples of this form and a
|
||||||
|
// reasonable theory of how they came into existence, it seems fine to
|
||||||
|
// treat them as equivalent to vX.0.0 (especially since the invalid
|
||||||
|
// pseudo-versions have lower precedence than the real ones). For now, we
|
||||||
|
// reject them.
|
||||||
|
return "", &InvalidVersionError{
|
||||||
|
Version: v,
|
||||||
|
Pseudo: true,
|
||||||
|
Err: fmt.Errorf("version before %s would have negative patch number", base),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base[:i+1] + patch + build, nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
// vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456 → vX.Y.Z-pre
|
||||||
|
// vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456+incompatible → vX.Y.Z-pre+incompatible
|
||||||
|
if !strings.HasSuffix(base, ".0") {
|
||||||
|
panic(`base from parsePseudoVersion missing ".0" before date: ` + base)
|
||||||
|
}
|
||||||
|
return strings.TrimSuffix(base, ".0") + build, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var errPseudoSyntax = errors.New("syntax error")
|
||||||
|
|
||||||
|
func parsePseudoVersion(v string) (base, timestamp, rev, build string, err error) {
|
||||||
|
if !IsPseudoVersion(v) {
|
||||||
|
return "", "", "", "", &InvalidVersionError{
|
||||||
|
Version: v,
|
||||||
|
Pseudo: true,
|
||||||
|
Err: errPseudoSyntax,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
build = semver.Build(v)
|
||||||
|
v = strings.TrimSuffix(v, build)
|
||||||
|
j := strings.LastIndex(v, "-")
|
||||||
|
v, rev = v[:j], v[j+1:]
|
||||||
|
i := strings.LastIndex(v, "-")
|
||||||
|
if j := strings.LastIndex(v, "."); j > i {
|
||||||
|
base = v[:j] // "vX.Y.Z-pre.0" or "vX.Y.(Z+1)-0"
|
||||||
|
timestamp = v[j+1:]
|
||||||
|
} else {
|
||||||
|
base = v[:i] // "vX.0.0"
|
||||||
|
timestamp = v[i+1:]
|
||||||
|
}
|
||||||
|
return base, timestamp, rev, build, nil
|
||||||
|
}
|
||||||
|
|
@ -22,6 +22,8 @@
|
||||||
// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0.
|
// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0.
|
||||||
package semver
|
package semver
|
||||||
|
|
||||||
|
import "sort"
|
||||||
|
|
||||||
// parsed returns the parsed form of a semantic version string.
|
// parsed returns the parsed form of a semantic version string.
|
||||||
type parsed struct {
|
type parsed struct {
|
||||||
major string
|
major string
|
||||||
|
|
@ -150,6 +152,24 @@ func Max(v, w string) string {
|
||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ByVersion implements sort.Interface for sorting semantic version strings.
|
||||||
|
type ByVersion []string
|
||||||
|
|
||||||
|
func (vs ByVersion) Len() int { return len(vs) }
|
||||||
|
func (vs ByVersion) Swap(i, j int) { vs[i], vs[j] = vs[j], vs[i] }
|
||||||
|
func (vs ByVersion) Less(i, j int) bool {
|
||||||
|
cmp := Compare(vs[i], vs[j])
|
||||||
|
if cmp != 0 {
|
||||||
|
return cmp < 0
|
||||||
|
}
|
||||||
|
return vs[i] < vs[j]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort sorts a list of semantic version strings using ByVersion.
|
||||||
|
func Sort(list []string) {
|
||||||
|
sort.Sort(ByVersion(list))
|
||||||
|
}
|
||||||
|
|
||||||
func parse(v string) (p parsed, ok bool) {
|
func parse(v string) (p parsed, ok bool) {
|
||||||
if v == "" || v[0] != 'v' {
|
if v == "" || v[0] != 'v' {
|
||||||
p.err = "missing v prefix"
|
p.err = "missing v prefix"
|
||||||
|
|
|
||||||
|
|
@ -1252,13 +1252,13 @@ func (cs *clientStream) writeRequest(req *http.Request) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
continueTimeout := cc.t.expectContinueTimeout()
|
continueTimeout := cc.t.expectContinueTimeout()
|
||||||
if continueTimeout != 0 &&
|
if continueTimeout != 0 {
|
||||||
!httpguts.HeaderValuesContainsToken(
|
if !httpguts.HeaderValuesContainsToken(req.Header["Expect"], "100-continue") {
|
||||||
req.Header["Expect"],
|
|
||||||
"100-continue") {
|
|
||||||
continueTimeout = 0
|
continueTimeout = 0
|
||||||
|
} else {
|
||||||
cs.on100 = make(chan struct{}, 1)
|
cs.on100 = make(chan struct{}, 1)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Past this point (where we send request headers), it is possible for
|
// Past this point (where we send request headers), it is possible for
|
||||||
// RoundTrip to return successfully. Since the RoundTrip contract permits
|
// RoundTrip to return successfully. Since the RoundTrip contract permits
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@
|
||||||
|
|
||||||
package windows
|
package windows
|
||||||
|
|
||||||
//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
|
//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go setupapi_windows.go
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,100 +0,0 @@
|
||||||
// Copyright 2020 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.
|
|
||||||
|
|
||||||
package windows
|
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
|
|
||||||
const (
|
|
||||||
ERROR_EXPECTED_SECTION_NAME syscall.Errno = 0x20000000 | 0xC0000000 | 0
|
|
||||||
ERROR_BAD_SECTION_NAME_LINE syscall.Errno = 0x20000000 | 0xC0000000 | 1
|
|
||||||
ERROR_SECTION_NAME_TOO_LONG syscall.Errno = 0x20000000 | 0xC0000000 | 2
|
|
||||||
ERROR_GENERAL_SYNTAX syscall.Errno = 0x20000000 | 0xC0000000 | 3
|
|
||||||
ERROR_WRONG_INF_STYLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x100
|
|
||||||
ERROR_SECTION_NOT_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x101
|
|
||||||
ERROR_LINE_NOT_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x102
|
|
||||||
ERROR_NO_BACKUP syscall.Errno = 0x20000000 | 0xC0000000 | 0x103
|
|
||||||
ERROR_NO_ASSOCIATED_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x200
|
|
||||||
ERROR_CLASS_MISMATCH syscall.Errno = 0x20000000 | 0xC0000000 | 0x201
|
|
||||||
ERROR_DUPLICATE_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x202
|
|
||||||
ERROR_NO_DRIVER_SELECTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x203
|
|
||||||
ERROR_KEY_DOES_NOT_EXIST syscall.Errno = 0x20000000 | 0xC0000000 | 0x204
|
|
||||||
ERROR_INVALID_DEVINST_NAME syscall.Errno = 0x20000000 | 0xC0000000 | 0x205
|
|
||||||
ERROR_INVALID_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x206
|
|
||||||
ERROR_DEVINST_ALREADY_EXISTS syscall.Errno = 0x20000000 | 0xC0000000 | 0x207
|
|
||||||
ERROR_DEVINFO_NOT_REGISTERED syscall.Errno = 0x20000000 | 0xC0000000 | 0x208
|
|
||||||
ERROR_INVALID_REG_PROPERTY syscall.Errno = 0x20000000 | 0xC0000000 | 0x209
|
|
||||||
ERROR_NO_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x20A
|
|
||||||
ERROR_NO_SUCH_DEVINST syscall.Errno = 0x20000000 | 0xC0000000 | 0x20B
|
|
||||||
ERROR_CANT_LOAD_CLASS_ICON syscall.Errno = 0x20000000 | 0xC0000000 | 0x20C
|
|
||||||
ERROR_INVALID_CLASS_INSTALLER syscall.Errno = 0x20000000 | 0xC0000000 | 0x20D
|
|
||||||
ERROR_DI_DO_DEFAULT syscall.Errno = 0x20000000 | 0xC0000000 | 0x20E
|
|
||||||
ERROR_DI_NOFILECOPY syscall.Errno = 0x20000000 | 0xC0000000 | 0x20F
|
|
||||||
ERROR_INVALID_HWPROFILE syscall.Errno = 0x20000000 | 0xC0000000 | 0x210
|
|
||||||
ERROR_NO_DEVICE_SELECTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x211
|
|
||||||
ERROR_DEVINFO_LIST_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x212
|
|
||||||
ERROR_DEVINFO_DATA_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x213
|
|
||||||
ERROR_DI_BAD_PATH syscall.Errno = 0x20000000 | 0xC0000000 | 0x214
|
|
||||||
ERROR_NO_CLASSINSTALL_PARAMS syscall.Errno = 0x20000000 | 0xC0000000 | 0x215
|
|
||||||
ERROR_FILEQUEUE_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x216
|
|
||||||
ERROR_BAD_SERVICE_INSTALLSECT syscall.Errno = 0x20000000 | 0xC0000000 | 0x217
|
|
||||||
ERROR_NO_CLASS_DRIVER_LIST syscall.Errno = 0x20000000 | 0xC0000000 | 0x218
|
|
||||||
ERROR_NO_ASSOCIATED_SERVICE syscall.Errno = 0x20000000 | 0xC0000000 | 0x219
|
|
||||||
ERROR_NO_DEFAULT_DEVICE_INTERFACE syscall.Errno = 0x20000000 | 0xC0000000 | 0x21A
|
|
||||||
ERROR_DEVICE_INTERFACE_ACTIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x21B
|
|
||||||
ERROR_DEVICE_INTERFACE_REMOVED syscall.Errno = 0x20000000 | 0xC0000000 | 0x21C
|
|
||||||
ERROR_BAD_INTERFACE_INSTALLSECT syscall.Errno = 0x20000000 | 0xC0000000 | 0x21D
|
|
||||||
ERROR_NO_SUCH_INTERFACE_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x21E
|
|
||||||
ERROR_INVALID_REFERENCE_STRING syscall.Errno = 0x20000000 | 0xC0000000 | 0x21F
|
|
||||||
ERROR_INVALID_MACHINENAME syscall.Errno = 0x20000000 | 0xC0000000 | 0x220
|
|
||||||
ERROR_REMOTE_COMM_FAILURE syscall.Errno = 0x20000000 | 0xC0000000 | 0x221
|
|
||||||
ERROR_MACHINE_UNAVAILABLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x222
|
|
||||||
ERROR_NO_CONFIGMGR_SERVICES syscall.Errno = 0x20000000 | 0xC0000000 | 0x223
|
|
||||||
ERROR_INVALID_PROPPAGE_PROVIDER syscall.Errno = 0x20000000 | 0xC0000000 | 0x224
|
|
||||||
ERROR_NO_SUCH_DEVICE_INTERFACE syscall.Errno = 0x20000000 | 0xC0000000 | 0x225
|
|
||||||
ERROR_DI_POSTPROCESSING_REQUIRED syscall.Errno = 0x20000000 | 0xC0000000 | 0x226
|
|
||||||
ERROR_INVALID_COINSTALLER syscall.Errno = 0x20000000 | 0xC0000000 | 0x227
|
|
||||||
ERROR_NO_COMPAT_DRIVERS syscall.Errno = 0x20000000 | 0xC0000000 | 0x228
|
|
||||||
ERROR_NO_DEVICE_ICON syscall.Errno = 0x20000000 | 0xC0000000 | 0x229
|
|
||||||
ERROR_INVALID_INF_LOGCONFIG syscall.Errno = 0x20000000 | 0xC0000000 | 0x22A
|
|
||||||
ERROR_DI_DONT_INSTALL syscall.Errno = 0x20000000 | 0xC0000000 | 0x22B
|
|
||||||
ERROR_INVALID_FILTER_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22C
|
|
||||||
ERROR_NON_WINDOWS_NT_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22D
|
|
||||||
ERROR_NON_WINDOWS_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22E
|
|
||||||
ERROR_NO_CATALOG_FOR_OEM_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x22F
|
|
||||||
ERROR_DEVINSTALL_QUEUE_NONNATIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x230
|
|
||||||
ERROR_NOT_DISABLEABLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x231
|
|
||||||
ERROR_CANT_REMOVE_DEVINST syscall.Errno = 0x20000000 | 0xC0000000 | 0x232
|
|
||||||
ERROR_INVALID_TARGET syscall.Errno = 0x20000000 | 0xC0000000 | 0x233
|
|
||||||
ERROR_DRIVER_NONNATIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x234
|
|
||||||
ERROR_IN_WOW64 syscall.Errno = 0x20000000 | 0xC0000000 | 0x235
|
|
||||||
ERROR_SET_SYSTEM_RESTORE_POINT syscall.Errno = 0x20000000 | 0xC0000000 | 0x236
|
|
||||||
ERROR_SCE_DISABLED syscall.Errno = 0x20000000 | 0xC0000000 | 0x238
|
|
||||||
ERROR_UNKNOWN_EXCEPTION syscall.Errno = 0x20000000 | 0xC0000000 | 0x239
|
|
||||||
ERROR_PNP_REGISTRY_ERROR syscall.Errno = 0x20000000 | 0xC0000000 | 0x23A
|
|
||||||
ERROR_REMOTE_REQUEST_UNSUPPORTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x23B
|
|
||||||
ERROR_NOT_AN_INSTALLED_OEM_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x23C
|
|
||||||
ERROR_INF_IN_USE_BY_DEVICES syscall.Errno = 0x20000000 | 0xC0000000 | 0x23D
|
|
||||||
ERROR_DI_FUNCTION_OBSOLETE syscall.Errno = 0x20000000 | 0xC0000000 | 0x23E
|
|
||||||
ERROR_NO_AUTHENTICODE_CATALOG syscall.Errno = 0x20000000 | 0xC0000000 | 0x23F
|
|
||||||
ERROR_AUTHENTICODE_DISALLOWED syscall.Errno = 0x20000000 | 0xC0000000 | 0x240
|
|
||||||
ERROR_AUTHENTICODE_TRUSTED_PUBLISHER syscall.Errno = 0x20000000 | 0xC0000000 | 0x241
|
|
||||||
ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED syscall.Errno = 0x20000000 | 0xC0000000 | 0x242
|
|
||||||
ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x243
|
|
||||||
ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH syscall.Errno = 0x20000000 | 0xC0000000 | 0x244
|
|
||||||
ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE syscall.Errno = 0x20000000 | 0xC0000000 | 0x245
|
|
||||||
ERROR_DEVICE_INSTALLER_NOT_READY syscall.Errno = 0x20000000 | 0xC0000000 | 0x246
|
|
||||||
ERROR_DRIVER_STORE_ADD_FAILED syscall.Errno = 0x20000000 | 0xC0000000 | 0x247
|
|
||||||
ERROR_DEVICE_INSTALL_BLOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x248
|
|
||||||
ERROR_DRIVER_INSTALL_BLOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x249
|
|
||||||
ERROR_WRONG_INF_TYPE syscall.Errno = 0x20000000 | 0xC0000000 | 0x24A
|
|
||||||
ERROR_FILE_HASH_NOT_IN_CATALOG syscall.Errno = 0x20000000 | 0xC0000000 | 0x24B
|
|
||||||
ERROR_DRIVER_STORE_DELETE_FAILED syscall.Errno = 0x20000000 | 0xC0000000 | 0x24C
|
|
||||||
ERROR_UNRECOVERABLE_STACK_OVERFLOW syscall.Errno = 0x20000000 | 0xC0000000 | 0x300
|
|
||||||
EXCEPTION_SPAPI_UNRECOVERABLE_STACK_OVERFLOW syscall.Errno = ERROR_UNRECOVERABLE_STACK_OVERFLOW
|
|
||||||
ERROR_NO_DEFAULT_INTERFACE_DEVICE syscall.Errno = ERROR_NO_DEFAULT_DEVICE_INTERFACE
|
|
||||||
ERROR_INTERFACE_DEVICE_ACTIVE syscall.Errno = ERROR_DEVICE_INTERFACE_ACTIVE
|
|
||||||
ERROR_INTERFACE_DEVICE_REMOVED syscall.Errno = ERROR_DEVICE_INTERFACE_REMOVED
|
|
||||||
ERROR_NO_SUCH_INTERFACE_DEVICE syscall.Errno = ERROR_NO_SUCH_DEVICE_INTERFACE
|
|
||||||
)
|
|
||||||
|
|
@ -248,6 +248,7 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
||||||
//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
|
//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
|
||||||
//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
|
//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
|
||||||
//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
|
//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
|
||||||
|
//sys ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW
|
||||||
//sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
|
//sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
|
||||||
//sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
|
//sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
|
||||||
//sys getTickCount64() (ms uint64) = kernel32.GetTickCount64
|
//sys getTickCount64() (ms uint64) = kernel32.GetTickCount64
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ func errnoErr(e syscall.Errno) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
modCfgMgr32 = NewLazySystemDLL("CfgMgr32.dll")
|
||||||
modadvapi32 = NewLazySystemDLL("advapi32.dll")
|
modadvapi32 = NewLazySystemDLL("advapi32.dll")
|
||||||
modcrypt32 = NewLazySystemDLL("crypt32.dll")
|
modcrypt32 = NewLazySystemDLL("crypt32.dll")
|
||||||
moddnsapi = NewLazySystemDLL("dnsapi.dll")
|
moddnsapi = NewLazySystemDLL("dnsapi.dll")
|
||||||
|
|
@ -48,6 +49,7 @@ var (
|
||||||
modpsapi = NewLazySystemDLL("psapi.dll")
|
modpsapi = NewLazySystemDLL("psapi.dll")
|
||||||
modsechost = NewLazySystemDLL("sechost.dll")
|
modsechost = NewLazySystemDLL("sechost.dll")
|
||||||
modsecur32 = NewLazySystemDLL("secur32.dll")
|
modsecur32 = NewLazySystemDLL("secur32.dll")
|
||||||
|
modsetupapi = NewLazySystemDLL("setupapi.dll")
|
||||||
modshell32 = NewLazySystemDLL("shell32.dll")
|
modshell32 = NewLazySystemDLL("shell32.dll")
|
||||||
moduser32 = NewLazySystemDLL("user32.dll")
|
moduser32 = NewLazySystemDLL("user32.dll")
|
||||||
moduserenv = NewLazySystemDLL("userenv.dll")
|
moduserenv = NewLazySystemDLL("userenv.dll")
|
||||||
|
|
@ -56,6 +58,10 @@ var (
|
||||||
modws2_32 = NewLazySystemDLL("ws2_32.dll")
|
modws2_32 = NewLazySystemDLL("ws2_32.dll")
|
||||||
modwtsapi32 = NewLazySystemDLL("wtsapi32.dll")
|
modwtsapi32 = NewLazySystemDLL("wtsapi32.dll")
|
||||||
|
|
||||||
|
procCM_Get_DevNode_Status = modCfgMgr32.NewProc("CM_Get_DevNode_Status")
|
||||||
|
procCM_Get_Device_Interface_ListW = modCfgMgr32.NewProc("CM_Get_Device_Interface_ListW")
|
||||||
|
procCM_Get_Device_Interface_List_SizeW = modCfgMgr32.NewProc("CM_Get_Device_Interface_List_SizeW")
|
||||||
|
procCM_MapCrToWin32Err = modCfgMgr32.NewProc("CM_MapCrToWin32Err")
|
||||||
procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups")
|
procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups")
|
||||||
procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
|
procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
|
||||||
procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid")
|
procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid")
|
||||||
|
|
@ -199,6 +205,7 @@ var (
|
||||||
procDeviceIoControl = modkernel32.NewProc("DeviceIoControl")
|
procDeviceIoControl = modkernel32.NewProc("DeviceIoControl")
|
||||||
procDuplicateHandle = modkernel32.NewProc("DuplicateHandle")
|
procDuplicateHandle = modkernel32.NewProc("DuplicateHandle")
|
||||||
procExitProcess = modkernel32.NewProc("ExitProcess")
|
procExitProcess = modkernel32.NewProc("ExitProcess")
|
||||||
|
procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW")
|
||||||
procFindClose = modkernel32.NewProc("FindClose")
|
procFindClose = modkernel32.NewProc("FindClose")
|
||||||
procFindCloseChangeNotification = modkernel32.NewProc("FindCloseChangeNotification")
|
procFindCloseChangeNotification = modkernel32.NewProc("FindCloseChangeNotification")
|
||||||
procFindFirstChangeNotificationW = modkernel32.NewProc("FindFirstChangeNotificationW")
|
procFindFirstChangeNotificationW = modkernel32.NewProc("FindFirstChangeNotificationW")
|
||||||
|
|
@ -400,6 +407,34 @@ var (
|
||||||
procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications")
|
procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications")
|
||||||
procGetUserNameExW = modsecur32.NewProc("GetUserNameExW")
|
procGetUserNameExW = modsecur32.NewProc("GetUserNameExW")
|
||||||
procTranslateNameW = modsecur32.NewProc("TranslateNameW")
|
procTranslateNameW = modsecur32.NewProc("TranslateNameW")
|
||||||
|
procSetupDiBuildDriverInfoList = modsetupapi.NewProc("SetupDiBuildDriverInfoList")
|
||||||
|
procSetupDiCallClassInstaller = modsetupapi.NewProc("SetupDiCallClassInstaller")
|
||||||
|
procSetupDiCancelDriverInfoSearch = modsetupapi.NewProc("SetupDiCancelDriverInfoSearch")
|
||||||
|
procSetupDiClassGuidsFromNameExW = modsetupapi.NewProc("SetupDiClassGuidsFromNameExW")
|
||||||
|
procSetupDiClassNameFromGuidExW = modsetupapi.NewProc("SetupDiClassNameFromGuidExW")
|
||||||
|
procSetupDiCreateDeviceInfoListExW = modsetupapi.NewProc("SetupDiCreateDeviceInfoListExW")
|
||||||
|
procSetupDiCreateDeviceInfoW = modsetupapi.NewProc("SetupDiCreateDeviceInfoW")
|
||||||
|
procSetupDiDestroyDeviceInfoList = modsetupapi.NewProc("SetupDiDestroyDeviceInfoList")
|
||||||
|
procSetupDiDestroyDriverInfoList = modsetupapi.NewProc("SetupDiDestroyDriverInfoList")
|
||||||
|
procSetupDiEnumDeviceInfo = modsetupapi.NewProc("SetupDiEnumDeviceInfo")
|
||||||
|
procSetupDiEnumDriverInfoW = modsetupapi.NewProc("SetupDiEnumDriverInfoW")
|
||||||
|
procSetupDiGetClassDevsExW = modsetupapi.NewProc("SetupDiGetClassDevsExW")
|
||||||
|
procSetupDiGetClassInstallParamsW = modsetupapi.NewProc("SetupDiGetClassInstallParamsW")
|
||||||
|
procSetupDiGetDeviceInfoListDetailW = modsetupapi.NewProc("SetupDiGetDeviceInfoListDetailW")
|
||||||
|
procSetupDiGetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiGetDeviceInstallParamsW")
|
||||||
|
procSetupDiGetDeviceInstanceIdW = modsetupapi.NewProc("SetupDiGetDeviceInstanceIdW")
|
||||||
|
procSetupDiGetDevicePropertyW = modsetupapi.NewProc("SetupDiGetDevicePropertyW")
|
||||||
|
procSetupDiGetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiGetDeviceRegistryPropertyW")
|
||||||
|
procSetupDiGetDriverInfoDetailW = modsetupapi.NewProc("SetupDiGetDriverInfoDetailW")
|
||||||
|
procSetupDiGetSelectedDevice = modsetupapi.NewProc("SetupDiGetSelectedDevice")
|
||||||
|
procSetupDiGetSelectedDriverW = modsetupapi.NewProc("SetupDiGetSelectedDriverW")
|
||||||
|
procSetupDiOpenDevRegKey = modsetupapi.NewProc("SetupDiOpenDevRegKey")
|
||||||
|
procSetupDiSetClassInstallParamsW = modsetupapi.NewProc("SetupDiSetClassInstallParamsW")
|
||||||
|
procSetupDiSetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiSetDeviceInstallParamsW")
|
||||||
|
procSetupDiSetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiSetDeviceRegistryPropertyW")
|
||||||
|
procSetupDiSetSelectedDevice = modsetupapi.NewProc("SetupDiSetSelectedDevice")
|
||||||
|
procSetupDiSetSelectedDriverW = modsetupapi.NewProc("SetupDiSetSelectedDriverW")
|
||||||
|
procSetupUninstallOEMInfW = modsetupapi.NewProc("SetupUninstallOEMInfW")
|
||||||
procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW")
|
procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW")
|
||||||
procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath")
|
procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath")
|
||||||
procShellExecuteW = modshell32.NewProc("ShellExecuteW")
|
procShellExecuteW = modshell32.NewProc("ShellExecuteW")
|
||||||
|
|
@ -447,6 +482,30 @@ var (
|
||||||
procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken")
|
procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func cm_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) (ret CONFIGRET) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procCM_Get_DevNode_Status.Addr(), 4, uintptr(unsafe.Pointer(status)), uintptr(unsafe.Pointer(problemNumber)), uintptr(devInst), uintptr(flags), 0, 0)
|
||||||
|
ret = CONFIGRET(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func cm_Get_Device_Interface_List(interfaceClass *GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret CONFIGRET) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_ListW.Addr(), 5, uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(flags), 0)
|
||||||
|
ret = CONFIGRET(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *GUID, deviceID *uint16, flags uint32) (ret CONFIGRET) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_List_SizeW.Addr(), 4, uintptr(unsafe.Pointer(len)), uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(flags), 0, 0)
|
||||||
|
ret = CONFIGRET(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func cm_MapCrToWin32Err(configRet CONFIGRET, defaultWin32Error Errno) (ret Errno) {
|
||||||
|
r0, _, _ := syscall.Syscall(procCM_MapCrToWin32Err.Addr(), 2, uintptr(configRet), uintptr(defaultWin32Error), 0)
|
||||||
|
ret = Errno(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) {
|
func AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) {
|
||||||
var _p0 uint32
|
var _p0 uint32
|
||||||
if resetToDefault {
|
if resetToDefault {
|
||||||
|
|
@ -1716,6 +1775,15 @@ func ExitProcess(exitcode uint32) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size))
|
||||||
|
n = uint32(r0)
|
||||||
|
if n == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func FindClose(handle Handle) (err error) {
|
func FindClose(handle Handle) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0)
|
r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|
@ -3432,6 +3500,233 @@ func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiBuildDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiCallClassInstaller.Addr(), 3, uintptr(installFunction), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiCancelDriverInfoSearch.Addr(), 1, uintptr(deviceInfoSet), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiClassGuidsFromNameEx(className *uint16, classGuidList *GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiClassGuidsFromNameExW.Addr(), 6, uintptr(unsafe.Pointer(className)), uintptr(unsafe.Pointer(classGuidList)), uintptr(classGuidListSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiClassNameFromGuidEx(classGUID *GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiClassNameFromGuidExW.Addr(), 6, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(className)), uintptr(classNameSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall6(procSetupDiCreateDeviceInfoListExW.Addr(), 4, uintptr(unsafe.Pointer(classGUID)), uintptr(hwndParent), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0)
|
||||||
|
handle = DevInfo(r0)
|
||||||
|
if handle == DevInfo(InvalidHandle) {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall9(procSetupDiCreateDeviceInfoW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(DeviceName)), uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(DeviceDescription)), uintptr(hwndParent), uintptr(CreationFlags), uintptr(unsafe.Pointer(deviceInfoData)), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiDestroyDeviceInfoList.Addr(), 1, uintptr(deviceInfoSet), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiDestroyDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiEnumDeviceInfo.Addr(), 3, uintptr(deviceInfoSet), uintptr(memberIndex), uintptr(unsafe.Pointer(deviceInfoData)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiEnumDriverInfoW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType), uintptr(memberIndex), uintptr(unsafe.Pointer(driverInfoData)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetClassDevsEx(classGUID *GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall9(procSetupDiGetClassDevsExW.Addr(), 7, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(Enumerator)), uintptr(hwndParent), uintptr(Flags), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0)
|
||||||
|
handle = DevInfo(r0)
|
||||||
|
if handle == DevInfo(InvalidHandle) {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiGetClassInstallParamsW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), uintptr(unsafe.Pointer(requiredSize)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInfoListDetailW.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoSetDetailData)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiGetDeviceInstanceIdW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(instanceId)), uintptr(instanceIdSize), uintptr(unsafe.Pointer(instanceIdRequiredSize)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY, propertyType *DEVPROPTYPE, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32, flags uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall9(procSetupDiGetDevicePropertyW.Addr(), 8, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(flags), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall9(procSetupDiGetDeviceRegistryPropertyW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyRegDataType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), uintptr(unsafe.Pointer(requiredSize)), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiGetDriverInfoDetailW.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)), uintptr(unsafe.Pointer(driverInfoDetailData)), uintptr(driverInfoDetailDataSize), uintptr(unsafe.Pointer(requiredSize)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key Handle, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall6(procSetupDiOpenDevRegKey.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(Scope), uintptr(HwProfile), uintptr(KeyType), uintptr(samDesired))
|
||||||
|
key = Handle(r0)
|
||||||
|
if key == InvalidHandle {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiSetClassInstallParamsW.Addr(), 4, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiSetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procSetupDiSetDeviceRegistryPropertyW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetupUninstallOEMInfW.Addr(), 3, uintptr(unsafe.Pointer(infFileName)), uintptr(flags), uintptr(reserved))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) {
|
func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) {
|
||||||
r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0)
|
r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0)
|
||||||
argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0))
|
argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0))
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@ import (
|
||||||
"go/ast"
|
"go/ast"
|
||||||
"go/token"
|
"go/token"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/typeparams"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PathEnclosingInterval returns the node that encloses the source
|
// PathEnclosingInterval returns the node that encloses the source
|
||||||
|
|
@ -294,8 +296,8 @@ func childrenOf(n ast.Node) []ast.Node {
|
||||||
|
|
||||||
case *ast.FieldList:
|
case *ast.FieldList:
|
||||||
children = append(children,
|
children = append(children,
|
||||||
tok(n.Opening, len("(")),
|
tok(n.Opening, len("(")), // or len("[")
|
||||||
tok(n.Closing, len(")")))
|
tok(n.Closing, len(")"))) // or len("]")
|
||||||
|
|
||||||
case *ast.File:
|
case *ast.File:
|
||||||
// TODO test: Doc
|
// TODO test: Doc
|
||||||
|
|
@ -322,6 +324,9 @@ func childrenOf(n ast.Node) []ast.Node {
|
||||||
children = append(children, n.Recv)
|
children = append(children, n.Recv)
|
||||||
}
|
}
|
||||||
children = append(children, n.Name)
|
children = append(children, n.Name)
|
||||||
|
if tparams := typeparams.ForFuncType(n.Type); tparams != nil {
|
||||||
|
children = append(children, tparams)
|
||||||
|
}
|
||||||
if n.Type.Params != nil {
|
if n.Type.Params != nil {
|
||||||
children = append(children, n.Type.Params)
|
children = append(children, n.Type.Params)
|
||||||
}
|
}
|
||||||
|
|
@ -371,8 +376,13 @@ func childrenOf(n ast.Node) []ast.Node {
|
||||||
|
|
||||||
case *ast.IndexExpr:
|
case *ast.IndexExpr:
|
||||||
children = append(children,
|
children = append(children,
|
||||||
tok(n.Lbrack, len("{")),
|
tok(n.Lbrack, len("[")),
|
||||||
tok(n.Rbrack, len("}")))
|
tok(n.Rbrack, len("]")))
|
||||||
|
|
||||||
|
case *typeparams.IndexListExpr:
|
||||||
|
children = append(children,
|
||||||
|
tok(n.Lbrack, len("[")),
|
||||||
|
tok(n.Rbrack, len("]")))
|
||||||
|
|
||||||
case *ast.InterfaceType:
|
case *ast.InterfaceType:
|
||||||
children = append(children,
|
children = append(children,
|
||||||
|
|
@ -581,6 +591,8 @@ func NodeDescription(n ast.Node) string {
|
||||||
return "decrement statement"
|
return "decrement statement"
|
||||||
case *ast.IndexExpr:
|
case *ast.IndexExpr:
|
||||||
return "index expression"
|
return "index expression"
|
||||||
|
case *typeparams.IndexListExpr:
|
||||||
|
return "index list expression"
|
||||||
case *ast.InterfaceType:
|
case *ast.InterfaceType:
|
||||||
return "interface type"
|
return "interface type"
|
||||||
case *ast.KeyValueExpr:
|
case *ast.KeyValueExpr:
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,10 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.
|
||||||
a.apply(n, "X", nil, n.X)
|
a.apply(n, "X", nil, n.X)
|
||||||
a.apply(n, "Index", nil, n.Index)
|
a.apply(n, "Index", nil, n.Index)
|
||||||
|
|
||||||
|
case *typeparams.IndexListExpr:
|
||||||
|
a.apply(n, "X", nil, n.X)
|
||||||
|
a.applyList(n, "Indices")
|
||||||
|
|
||||||
case *ast.SliceExpr:
|
case *ast.SliceExpr:
|
||||||
a.apply(n, "X", nil, n.X)
|
a.apply(n, "X", nil, n.X)
|
||||||
a.apply(n, "Low", nil, n.Low)
|
a.apply(n, "Low", nil, n.Low)
|
||||||
|
|
@ -439,14 +443,8 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if ix := typeparams.GetIndexExprData(n); ix != nil {
|
|
||||||
a.apply(n, "X", nil, ix.X)
|
|
||||||
// *ast.IndexExpr was handled above, so n must be an *ast.MultiIndexExpr.
|
|
||||||
a.applyList(n, "Indices")
|
|
||||||
} else {
|
|
||||||
panic(fmt.Sprintf("Apply: unexpected node type %T", n))
|
panic(fmt.Sprintf("Apply: unexpected node type %T", n))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if a.post != nil && !a.post(&a.cursor) {
|
if a.post != nil && !a.post(&a.cursor) {
|
||||||
panic(abort)
|
panic(abort)
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ package typeparams
|
||||||
import (
|
import (
|
||||||
"go/ast"
|
"go/ast"
|
||||||
"go/token"
|
"go/token"
|
||||||
|
"go/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A IndexExprData holds data from both ast.IndexExpr and the new
|
// A IndexExprData holds data from both ast.IndexExpr and the new
|
||||||
|
|
@ -23,3 +24,9 @@ type IndexExprData struct {
|
||||||
Indices []ast.Expr // index expressions
|
Indices []ast.Expr // index expressions
|
||||||
Rbrack token.Pos // position of "]"
|
Rbrack token.Pos // position of "]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsTypeParam reports whether t is a type parameter.
|
||||||
|
func IsTypeParam(t types.Type) bool {
|
||||||
|
_, ok := t.(*TypeParam)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !typeparams || !go1.18
|
//go:build !go1.18
|
||||||
// +build !typeparams !go1.18
|
// +build !go1.18
|
||||||
|
|
||||||
package typeparams
|
package typeparams
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build typeparams && go1.18
|
//go:build go1.18
|
||||||
// +build typeparams,go1.18
|
// +build go1.18
|
||||||
|
|
||||||
package typeparams
|
package typeparams
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
// Copyright 2021 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.
|
||||||
|
|
||||||
|
package typeparams
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"go/types"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:generate go run copytermlist.go
|
||||||
|
|
||||||
|
const debug = false
|
||||||
|
|
||||||
|
var ErrEmptyTypeSet = errors.New("empty type set")
|
||||||
|
|
||||||
|
// StructuralTerms returns a slice of terms representing the normalized
|
||||||
|
// structural type restrictions of a type parameter, if any.
|
||||||
|
//
|
||||||
|
// Structural type restrictions of a type parameter are created via
|
||||||
|
// non-interface types embedded in its constraint interface (directly, or via a
|
||||||
|
// chain of interface embeddings). For example, in the declaration
|
||||||
|
// type T[P interface{~int; m()}] int
|
||||||
|
// the structural restriction of the type parameter P is ~int.
|
||||||
|
//
|
||||||
|
// With interface embedding and unions, the specification of structural type
|
||||||
|
// restrictions may be arbitrarily complex. For example, consider the
|
||||||
|
// following:
|
||||||
|
//
|
||||||
|
// type A interface{ ~string|~[]byte }
|
||||||
|
//
|
||||||
|
// type B interface{ int|string }
|
||||||
|
//
|
||||||
|
// type C interface { ~string|~int }
|
||||||
|
//
|
||||||
|
// type T[P interface{ A|B; C }] int
|
||||||
|
//
|
||||||
|
// In this example, the structural type restriction of P is ~string|int: A|B
|
||||||
|
// expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int,
|
||||||
|
// which when intersected with C (~string|~int) yields ~string|int.
|
||||||
|
//
|
||||||
|
// StructuralTerms computes these expansions and reductions, producing a
|
||||||
|
// "normalized" form of the embeddings. A structural restriction is normalized
|
||||||
|
// if it is a single union containing no interface terms, and is minimal in the
|
||||||
|
// sense that removing any term changes the set of types satisfying the
|
||||||
|
// constraint. It is left as a proof for the reader that, modulo sorting, there
|
||||||
|
// is exactly one such normalized form.
|
||||||
|
//
|
||||||
|
// Because the minimal representation always takes this form, StructuralTerms
|
||||||
|
// returns a slice of tilde terms corresponding to the terms of the union in
|
||||||
|
// the normalized structural restriction. An error is returned if the
|
||||||
|
// constraint interface is invalid, exceeds complexity bounds, or has an empty
|
||||||
|
// type set. In the latter case, StructuralTerms returns ErrEmptyTypeSet.
|
||||||
|
//
|
||||||
|
// StructuralTerms makes no guarantees about the order of terms, except that it
|
||||||
|
// is deterministic.
|
||||||
|
func StructuralTerms(tparam *TypeParam) ([]*Term, error) {
|
||||||
|
constraint := tparam.Constraint()
|
||||||
|
if constraint == nil {
|
||||||
|
return nil, fmt.Errorf("%s has nil constraint", tparam)
|
||||||
|
}
|
||||||
|
iface, _ := constraint.Underlying().(*types.Interface)
|
||||||
|
if iface == nil {
|
||||||
|
return nil, fmt.Errorf("constraint is %T, not *types.Interface", constraint.Underlying())
|
||||||
|
}
|
||||||
|
return InterfaceTermSet(iface)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InterfaceTermSet computes the normalized terms for a constraint interface,
|
||||||
|
// returning an error if the term set cannot be computed or is empty. In the
|
||||||
|
// latter case, the error will be ErrEmptyTypeSet.
|
||||||
|
//
|
||||||
|
// See the documentation of StructuralTerms for more information on
|
||||||
|
// normalization.
|
||||||
|
func InterfaceTermSet(iface *types.Interface) ([]*Term, error) {
|
||||||
|
return computeTermSet(iface)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnionTermSet computes the normalized terms for a union, returning an error
|
||||||
|
// if the term set cannot be computed or is empty. In the latter case, the
|
||||||
|
// error will be ErrEmptyTypeSet.
|
||||||
|
//
|
||||||
|
// See the documentation of StructuralTerms for more information on
|
||||||
|
// normalization.
|
||||||
|
func UnionTermSet(union *Union) ([]*Term, error) {
|
||||||
|
return computeTermSet(union)
|
||||||
|
}
|
||||||
|
|
||||||
|
func computeTermSet(typ types.Type) ([]*Term, error) {
|
||||||
|
tset, err := computeTermSetInternal(typ, make(map[types.Type]*termSet), 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if tset.terms.isEmpty() {
|
||||||
|
return nil, ErrEmptyTypeSet
|
||||||
|
}
|
||||||
|
if tset.terms.isAll() {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
var terms []*Term
|
||||||
|
for _, term := range tset.terms {
|
||||||
|
terms = append(terms, NewTerm(term.tilde, term.typ))
|
||||||
|
}
|
||||||
|
return terms, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A termSet holds the normalized set of terms for a given type.
|
||||||
|
//
|
||||||
|
// The name termSet is intentionally distinct from 'type set': a type set is
|
||||||
|
// all types that implement a type (and includes method restrictions), whereas
|
||||||
|
// a term set just represents the structural restrictions on a type.
|
||||||
|
type termSet struct {
|
||||||
|
complete bool
|
||||||
|
terms termlist
|
||||||
|
}
|
||||||
|
|
||||||
|
func indentf(depth int, format string, args ...interface{}) {
|
||||||
|
fmt.Fprintf(os.Stderr, strings.Repeat(".", depth)+format+"\n", args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth int) (res *termSet, err error) {
|
||||||
|
if t == nil {
|
||||||
|
panic("nil type")
|
||||||
|
}
|
||||||
|
|
||||||
|
if debug {
|
||||||
|
indentf(depth, "%s", t.String())
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
indentf(depth, "=> %s", err)
|
||||||
|
} else {
|
||||||
|
indentf(depth, "=> %s", res.terms.String())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
const maxTermCount = 100
|
||||||
|
if tset, ok := seen[t]; ok {
|
||||||
|
if !tset.complete {
|
||||||
|
return nil, fmt.Errorf("cycle detected in the declaration of %s", t)
|
||||||
|
}
|
||||||
|
return tset, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark the current type as seen to avoid infinite recursion.
|
||||||
|
tset := new(termSet)
|
||||||
|
defer func() {
|
||||||
|
tset.complete = true
|
||||||
|
}()
|
||||||
|
seen[t] = tset
|
||||||
|
|
||||||
|
switch u := t.Underlying().(type) {
|
||||||
|
case *types.Interface:
|
||||||
|
// The term set of an interface is the intersection of the term sets of its
|
||||||
|
// embedded types.
|
||||||
|
tset.terms = allTermlist
|
||||||
|
for i := 0; i < u.NumEmbeddeds(); i++ {
|
||||||
|
embedded := u.EmbeddedType(i)
|
||||||
|
if _, ok := embedded.Underlying().(*TypeParam); ok {
|
||||||
|
return nil, fmt.Errorf("invalid embedded type %T", embedded)
|
||||||
|
}
|
||||||
|
tset2, err := computeTermSetInternal(embedded, seen, depth+1)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tset.terms = tset.terms.intersect(tset2.terms)
|
||||||
|
}
|
||||||
|
case *Union:
|
||||||
|
// The term set of a union is the union of term sets of its terms.
|
||||||
|
tset.terms = nil
|
||||||
|
for i := 0; i < u.Len(); i++ {
|
||||||
|
t := u.Term(i)
|
||||||
|
var terms termlist
|
||||||
|
switch t.Type().Underlying().(type) {
|
||||||
|
case *types.Interface:
|
||||||
|
tset2, err := computeTermSetInternal(t.Type(), seen, depth+1)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
terms = tset2.terms
|
||||||
|
case *TypeParam, *Union:
|
||||||
|
// A stand-alone type parameter or union is not permitted as union
|
||||||
|
// term.
|
||||||
|
return nil, fmt.Errorf("invalid union term %T", t)
|
||||||
|
default:
|
||||||
|
if t.Type() == types.Typ[types.Invalid] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
terms = termlist{{t.Tilde(), t.Type()}}
|
||||||
|
}
|
||||||
|
tset.terms = tset.terms.union(terms)
|
||||||
|
if len(tset.terms) > maxTermCount {
|
||||||
|
return nil, fmt.Errorf("exceeded max term count %d", maxTermCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case *TypeParam:
|
||||||
|
panic("unreachable")
|
||||||
|
default:
|
||||||
|
// For all other types, the term set is just a single non-tilde term
|
||||||
|
// holding the type itself.
|
||||||
|
if u != types.Typ[types.Invalid] {
|
||||||
|
tset.terms = termlist{{false, t}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tset, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// under is a facade for the go/types internal function of the same name. It is
|
||||||
|
// used by typeterm.go.
|
||||||
|
func under(t types.Type) types.Type {
|
||||||
|
return t.Underlying()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,172 @@
|
||||||
|
// Copyright 2021 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.
|
||||||
|
|
||||||
|
// Code generated by copytermlist.go DO NOT EDIT.
|
||||||
|
|
||||||
|
package typeparams
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"go/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A termlist represents the type set represented by the union
|
||||||
|
// t1 ∪ y2 ∪ ... tn of the type sets of the terms t1 to tn.
|
||||||
|
// A termlist is in normal form if all terms are disjoint.
|
||||||
|
// termlist operations don't require the operands to be in
|
||||||
|
// normal form.
|
||||||
|
type termlist []*term
|
||||||
|
|
||||||
|
// allTermlist represents the set of all types.
|
||||||
|
// It is in normal form.
|
||||||
|
var allTermlist = termlist{new(term)}
|
||||||
|
|
||||||
|
// String prints the termlist exactly (without normalization).
|
||||||
|
func (xl termlist) String() string {
|
||||||
|
if len(xl) == 0 {
|
||||||
|
return "∅"
|
||||||
|
}
|
||||||
|
var buf bytes.Buffer
|
||||||
|
for i, x := range xl {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteString(" ∪ ")
|
||||||
|
}
|
||||||
|
buf.WriteString(x.String())
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// isEmpty reports whether the termlist xl represents the empty set of types.
|
||||||
|
func (xl termlist) isEmpty() bool {
|
||||||
|
// If there's a non-nil term, the entire list is not empty.
|
||||||
|
// If the termlist is in normal form, this requires at most
|
||||||
|
// one iteration.
|
||||||
|
for _, x := range xl {
|
||||||
|
if x != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// isAll reports whether the termlist xl represents the set of all types.
|
||||||
|
func (xl termlist) isAll() bool {
|
||||||
|
// If there's a 𝓤 term, the entire list is 𝓤.
|
||||||
|
// If the termlist is in normal form, this requires at most
|
||||||
|
// one iteration.
|
||||||
|
for _, x := range xl {
|
||||||
|
if x != nil && x.typ == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// norm returns the normal form of xl.
|
||||||
|
func (xl termlist) norm() termlist {
|
||||||
|
// Quadratic algorithm, but good enough for now.
|
||||||
|
// TODO(gri) fix asymptotic performance
|
||||||
|
used := make([]bool, len(xl))
|
||||||
|
var rl termlist
|
||||||
|
for i, xi := range xl {
|
||||||
|
if xi == nil || used[i] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for j := i + 1; j < len(xl); j++ {
|
||||||
|
xj := xl[j]
|
||||||
|
if xj == nil || used[j] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if u1, u2 := xi.union(xj); u2 == nil {
|
||||||
|
// If we encounter a 𝓤 term, the entire list is 𝓤.
|
||||||
|
// Exit early.
|
||||||
|
// (Note that this is not just an optimization;
|
||||||
|
// if we continue, we may end up with a 𝓤 term
|
||||||
|
// and other terms and the result would not be
|
||||||
|
// in normal form.)
|
||||||
|
if u1.typ == nil {
|
||||||
|
return allTermlist
|
||||||
|
}
|
||||||
|
xi = u1
|
||||||
|
used[j] = true // xj is now unioned into xi - ignore it in future iterations
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rl = append(rl, xi)
|
||||||
|
}
|
||||||
|
return rl
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the type set represented by xl is specified by a single (non-𝓤) term,
|
||||||
|
// structuralType returns that type. Otherwise it returns nil.
|
||||||
|
func (xl termlist) structuralType() types.Type {
|
||||||
|
if nl := xl.norm(); len(nl) == 1 {
|
||||||
|
return nl[0].typ // if nl.isAll() then typ is nil, which is ok
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// union returns the union xl ∪ yl.
|
||||||
|
func (xl termlist) union(yl termlist) termlist {
|
||||||
|
return append(xl, yl...).norm()
|
||||||
|
}
|
||||||
|
|
||||||
|
// intersect returns the intersection xl ∩ yl.
|
||||||
|
func (xl termlist) intersect(yl termlist) termlist {
|
||||||
|
if xl.isEmpty() || yl.isEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quadratic algorithm, but good enough for now.
|
||||||
|
// TODO(gri) fix asymptotic performance
|
||||||
|
var rl termlist
|
||||||
|
for _, x := range xl {
|
||||||
|
for _, y := range yl {
|
||||||
|
if r := x.intersect(y); r != nil {
|
||||||
|
rl = append(rl, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rl.norm()
|
||||||
|
}
|
||||||
|
|
||||||
|
// equal reports whether xl and yl represent the same type set.
|
||||||
|
func (xl termlist) equal(yl termlist) bool {
|
||||||
|
// TODO(gri) this should be more efficient
|
||||||
|
return xl.subsetOf(yl) && yl.subsetOf(xl)
|
||||||
|
}
|
||||||
|
|
||||||
|
// includes reports whether t ∈ xl.
|
||||||
|
func (xl termlist) includes(t types.Type) bool {
|
||||||
|
for _, x := range xl {
|
||||||
|
if x.includes(t) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// supersetOf reports whether y ⊆ xl.
|
||||||
|
func (xl termlist) supersetOf(y *term) bool {
|
||||||
|
for _, x := range xl {
|
||||||
|
if y.subsetOf(x) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// subsetOf reports whether xl ⊆ yl.
|
||||||
|
func (xl termlist) subsetOf(yl termlist) bool {
|
||||||
|
if yl.isEmpty() {
|
||||||
|
return xl.isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
// each term x of xl must be a subset of yl
|
||||||
|
for _, x := range xl {
|
||||||
|
if !yl.supersetOf(x) {
|
||||||
|
return false // x is not a subset yl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
@ -2,13 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !typeparams || !go1.18
|
//go:build !go1.18
|
||||||
// +build !typeparams !go1.18
|
// +build !go1.18
|
||||||
|
|
||||||
package typeparams
|
package typeparams
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go/ast"
|
"go/ast"
|
||||||
|
"go/token"
|
||||||
"go/types"
|
"go/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -30,6 +31,34 @@ func GetIndexExprData(n ast.Node) *IndexExprData {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PackIndexExpr returns an *ast.IndexExpr with the given index.
|
||||||
|
// Calling PackIndexExpr with len(indices) != 1 will panic.
|
||||||
|
func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr {
|
||||||
|
switch len(indices) {
|
||||||
|
case 0:
|
||||||
|
panic("empty indices")
|
||||||
|
case 1:
|
||||||
|
return &ast.IndexExpr{
|
||||||
|
X: x,
|
||||||
|
Lbrack: lbrack,
|
||||||
|
Index: indices[0],
|
||||||
|
Rbrack: rbrack,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
panic("cannot pack multiple indices at this go version")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IndexListExpr is a placeholder type, as type parameters are not supported at
|
||||||
|
// this Go version. Its methods panic on use.
|
||||||
|
type IndexListExpr struct {
|
||||||
|
ast.Expr
|
||||||
|
X ast.Expr // expression
|
||||||
|
Lbrack token.Pos // position of "["
|
||||||
|
Indices []ast.Expr // index expressions
|
||||||
|
Rbrack token.Pos // position of "]"
|
||||||
|
}
|
||||||
|
|
||||||
// ForTypeSpec returns an empty field list, as type parameters on not supported
|
// ForTypeSpec returns an empty field list, as type parameters on not supported
|
||||||
// at this Go version.
|
// at this Go version.
|
||||||
func ForTypeSpec(*ast.TypeSpec) *ast.FieldList {
|
func ForTypeSpec(*ast.TypeSpec) *ast.FieldList {
|
||||||
|
|
@ -46,6 +75,7 @@ func ForFuncType(*ast.FuncType) *ast.FieldList {
|
||||||
// this Go version. Its methods panic on use.
|
// this Go version. Its methods panic on use.
|
||||||
type TypeParam struct{ types.Type }
|
type TypeParam struct{ types.Type }
|
||||||
|
|
||||||
|
func (*TypeParam) Index() int { unsupported(); return 0 }
|
||||||
func (*TypeParam) Constraint() types.Type { unsupported(); return nil }
|
func (*TypeParam) Constraint() types.Type { unsupported(); return nil }
|
||||||
func (*TypeParam) Obj() *types.TypeName { unsupported(); return nil }
|
func (*TypeParam) Obj() *types.TypeName { unsupported(); return nil }
|
||||||
|
|
||||||
|
|
@ -72,42 +102,46 @@ func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) {
|
||||||
unsupported()
|
unsupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewSignatureType calls types.NewSignature, panicking if recvTypeParams or
|
||||||
|
// typeParams is non-empty.
|
||||||
|
func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature {
|
||||||
|
if len(recvTypeParams) != 0 || len(typeParams) != 0 {
|
||||||
|
panic("signatures cannot have type parameters at this Go version")
|
||||||
|
}
|
||||||
|
return types.NewSignature(recv, params, results, variadic)
|
||||||
|
}
|
||||||
|
|
||||||
// ForSignature returns an empty slice.
|
// ForSignature returns an empty slice.
|
||||||
func ForSignature(*types.Signature) *TypeParamList {
|
func ForSignature(*types.Signature) *TypeParamList {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetForSignature panics if tparams is non-empty.
|
|
||||||
func SetForSignature(_ *types.Signature, tparams []*TypeParam) {
|
|
||||||
if len(tparams) > 0 {
|
|
||||||
unsupported()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecvTypeParams returns a nil slice.
|
// RecvTypeParams returns a nil slice.
|
||||||
func RecvTypeParams(sig *types.Signature) *TypeParamList {
|
func RecvTypeParams(sig *types.Signature) *TypeParamList {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetRecvTypeParams panics if rparams is non-empty.
|
|
||||||
func SetRecvTypeParams(sig *types.Signature, rparams []*TypeParam) {
|
|
||||||
if len(rparams) > 0 {
|
|
||||||
unsupported()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsComparable returns false, as no interfaces are type-restricted at this Go
|
// IsComparable returns false, as no interfaces are type-restricted at this Go
|
||||||
// version.
|
// version.
|
||||||
func IsComparable(*types.Interface) bool {
|
func IsComparable(*types.Interface) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConstraint returns false, as no interfaces are type-restricted at this Go
|
// IsMethodSet returns true, as no interfaces are type-restricted at this Go
|
||||||
// version.
|
// version.
|
||||||
func IsConstraint(*types.Interface) bool {
|
func IsMethodSet(*types.Interface) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsImplicit returns false, as no interfaces are implicit at this Go version.
|
||||||
|
func IsImplicit(*types.Interface) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarkImplicit does nothing, because this Go version does not have implicit
|
||||||
|
// interfaces.
|
||||||
|
func MarkImplicit(*types.Interface) {}
|
||||||
|
|
||||||
// ForNamed returns an empty type parameter list, as type parameters are not
|
// ForNamed returns an empty type parameter list, as type parameters are not
|
||||||
// supported at this Go version.
|
// supported at this Go version.
|
||||||
func ForNamed(*types.Named) *TypeParamList {
|
func ForNamed(*types.Named) *TypeParamList {
|
||||||
|
|
@ -131,19 +165,25 @@ func NamedTypeOrigin(named *types.Named) types.Type {
|
||||||
return named
|
return named
|
||||||
}
|
}
|
||||||
|
|
||||||
// Term is a placeholder type, as type parameters are not supported at this Go
|
// Term holds information about a structural type restriction.
|
||||||
// version. Its methods panic on use.
|
type Term struct {
|
||||||
type Term struct{}
|
tilde bool
|
||||||
|
typ types.Type
|
||||||
|
}
|
||||||
|
|
||||||
func (*Term) Tilde() bool { unsupported(); return false }
|
func (m *Term) Tilde() bool { return m.tilde }
|
||||||
func (*Term) Type() types.Type { unsupported(); return nil }
|
func (m *Term) Type() types.Type { return m.typ }
|
||||||
func (*Term) String() string { unsupported(); return "" }
|
func (m *Term) String() string {
|
||||||
func (*Term) Underlying() types.Type { unsupported(); return nil }
|
pre := ""
|
||||||
|
if m.tilde {
|
||||||
|
pre = "~"
|
||||||
|
}
|
||||||
|
return pre + m.typ.String()
|
||||||
|
}
|
||||||
|
|
||||||
// NewTerm is unsupported at this Go version, and panics.
|
// NewTerm is unsupported at this Go version, and panics.
|
||||||
func NewTerm(tilde bool, typ types.Type) *Term {
|
func NewTerm(tilde bool, typ types.Type) *Term {
|
||||||
unsupported()
|
return &Term{tilde, typ}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Union is a placeholder type, as type parameters are not supported at this Go
|
// Union is a placeholder type, as type parameters are not supported at this Go
|
||||||
|
|
@ -162,16 +202,23 @@ func NewUnion(terms []*Term) *Union {
|
||||||
// InitInstanceInfo is a noop at this Go version.
|
// InitInstanceInfo is a noop at this Go version.
|
||||||
func InitInstanceInfo(*types.Info) {}
|
func InitInstanceInfo(*types.Info) {}
|
||||||
|
|
||||||
// GetInstance returns nothing, as type parameters are not supported at this Go
|
// Instance is a placeholder type, as type parameters are not supported at this
|
||||||
// version.
|
// Go version.
|
||||||
func GetInstance(*types.Info, *ast.Ident) (*TypeList, types.Type) { return nil, nil }
|
type Instance struct {
|
||||||
|
TypeArgs *TypeList
|
||||||
|
Type types.Type
|
||||||
|
}
|
||||||
|
|
||||||
// Environment is a placeholder type, as type parameters are not supported at
|
// GetInstances returns a nil map, as type parameters are not supported at this
|
||||||
|
// Go version.
|
||||||
|
func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil }
|
||||||
|
|
||||||
|
// Context is a placeholder type, as type parameters are not supported at
|
||||||
// this Go version.
|
// this Go version.
|
||||||
type Environment struct{}
|
type Context struct{}
|
||||||
|
|
||||||
// Instantiate is unsupported on this Go version, and panics.
|
// Instantiate is unsupported on this Go version, and panics.
|
||||||
func Instantiate(env *Environment, typ types.Type, targs []types.Type, validate bool) (types.Type, error) {
|
func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) {
|
||||||
unsupported()
|
unsupported()
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build typeparams && go1.18
|
//go:build go1.18
|
||||||
// +build typeparams,go1.18
|
// +build go1.18
|
||||||
|
|
||||||
package typeparams
|
package typeparams
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go/ast"
|
"go/ast"
|
||||||
|
"go/token"
|
||||||
"go/types"
|
"go/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -21,6 +22,7 @@ import (
|
||||||
//
|
//
|
||||||
// For nodes that don't represent index expressions, GetIndexExprData returns
|
// For nodes that don't represent index expressions, GetIndexExprData returns
|
||||||
// nil.
|
// nil.
|
||||||
|
// TODO(rfindley): remove this function in favor of using the alias below.
|
||||||
func GetIndexExprData(n ast.Node) *IndexExprData {
|
func GetIndexExprData(n ast.Node) *IndexExprData {
|
||||||
switch e := n.(type) {
|
switch e := n.(type) {
|
||||||
case *ast.IndexExpr:
|
case *ast.IndexExpr:
|
||||||
|
|
@ -36,6 +38,33 @@ func GetIndexExprData(n ast.Node) *IndexExprData {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PackIndexExpr returns an *ast.IndexExpr or *ast.IndexListExpr, depending on
|
||||||
|
// the cardinality of indices. Calling PackIndexExpr with len(indices) == 0
|
||||||
|
// will panic.
|
||||||
|
func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr {
|
||||||
|
switch len(indices) {
|
||||||
|
case 0:
|
||||||
|
panic("empty indices")
|
||||||
|
case 1:
|
||||||
|
return &ast.IndexExpr{
|
||||||
|
X: x,
|
||||||
|
Lbrack: lbrack,
|
||||||
|
Index: indices[0],
|
||||||
|
Rbrack: rbrack,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return &ast.IndexListExpr{
|
||||||
|
X: x,
|
||||||
|
Lbrack: lbrack,
|
||||||
|
Indices: indices,
|
||||||
|
Rbrack: rbrack,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IndexListExpr is an alias for ast.IndexListExpr.
|
||||||
|
type IndexListExpr = ast.IndexListExpr
|
||||||
|
|
||||||
// ForTypeSpec returns n.TypeParams.
|
// ForTypeSpec returns n.TypeParams.
|
||||||
func ForTypeSpec(n *ast.TypeSpec) *ast.FieldList {
|
func ForTypeSpec(n *ast.TypeSpec) *ast.FieldList {
|
||||||
if n == nil {
|
if n == nil {
|
||||||
|
|
@ -71,34 +100,39 @@ func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) {
|
||||||
tparam.SetConstraint(constraint)
|
tparam.SetConstraint(constraint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewSignatureType calls types.NewSignatureType.
|
||||||
|
func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature {
|
||||||
|
return types.NewSignatureType(recv, recvTypeParams, typeParams, params, results, variadic)
|
||||||
|
}
|
||||||
|
|
||||||
// ForSignature returns sig.TypeParams()
|
// ForSignature returns sig.TypeParams()
|
||||||
func ForSignature(sig *types.Signature) *TypeParamList {
|
func ForSignature(sig *types.Signature) *TypeParamList {
|
||||||
return sig.TypeParams()
|
return sig.TypeParams()
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetForSignature calls sig.SetTypeParams(tparams)
|
|
||||||
func SetForSignature(sig *types.Signature, tparams []*TypeParam) {
|
|
||||||
sig.SetTypeParams(tparams)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecvTypeParams returns sig.RecvTypeParams().
|
// RecvTypeParams returns sig.RecvTypeParams().
|
||||||
func RecvTypeParams(sig *types.Signature) *TypeParamList {
|
func RecvTypeParams(sig *types.Signature) *TypeParamList {
|
||||||
return sig.RecvTypeParams()
|
return sig.RecvTypeParams()
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetRecvTypeParams calls sig.SetRecvTypeParams(rparams).
|
|
||||||
func SetRecvTypeParams(sig *types.Signature, rparams []*TypeParam) {
|
|
||||||
sig.SetRecvTypeParams(rparams)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsComparable calls iface.IsComparable().
|
// IsComparable calls iface.IsComparable().
|
||||||
func IsComparable(iface *types.Interface) bool {
|
func IsComparable(iface *types.Interface) bool {
|
||||||
return iface.IsComparable()
|
return iface.IsComparable()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConstraint calls iface.IsConstraint().
|
// IsMethodSet calls iface.IsMethodSet().
|
||||||
func IsConstraint(iface *types.Interface) bool {
|
func IsMethodSet(iface *types.Interface) bool {
|
||||||
return iface.IsConstraint()
|
return iface.IsMethodSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsImplicit calls iface.IsImplicit().
|
||||||
|
func IsImplicit(iface *types.Interface) bool {
|
||||||
|
return iface.IsImplicit()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarkImplicit calls iface.MarkImplicit().
|
||||||
|
func MarkImplicit(iface *types.Interface) {
|
||||||
|
iface.MarkImplicit()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForNamed extracts the (possibly empty) type parameter object list from
|
// ForNamed extracts the (possibly empty) type parameter object list from
|
||||||
|
|
@ -145,21 +179,18 @@ func InitInstanceInfo(info *types.Info) {
|
||||||
info.Instances = make(map[*ast.Ident]types.Instance)
|
info.Instances = make(map[*ast.Ident]types.Instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetInstance extracts information about the instantiation occurring at the
|
// Instance is an alias for types.Instance.
|
||||||
// identifier id. id should be the identifier denoting a parameterized type or
|
type Instance = types.Instance
|
||||||
// function in an instantiation expression or function call.
|
|
||||||
func GetInstance(info *types.Info, id *ast.Ident) (*TypeList, types.Type) {
|
// GetInstances returns info.Instances.
|
||||||
if info.Instances != nil {
|
func GetInstances(info *types.Info) map[*ast.Ident]Instance {
|
||||||
inf := info.Instances[id]
|
return info.Instances
|
||||||
return inf.TypeArgs, inf.Type
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Environment is an alias for types.Environment.
|
// Context is an alias for types.Context.
|
||||||
type Environment = types.Environment
|
type Context = types.Context
|
||||||
|
|
||||||
// Instantiate calls types.Instantiate.
|
// Instantiate calls types.Instantiate.
|
||||||
func Instantiate(env *Environment, typ types.Type, targs []types.Type, validate bool) (types.Type, error) {
|
func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) {
|
||||||
return types.Instantiate(env, typ, targs, validate)
|
return types.Instantiate(ctxt, typ, targs, validate)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,170 @@
|
||||||
|
// Copyright 2021 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.
|
||||||
|
|
||||||
|
// Code generated by copytermlist.go DO NOT EDIT.
|
||||||
|
|
||||||
|
package typeparams
|
||||||
|
|
||||||
|
import "go/types"
|
||||||
|
|
||||||
|
// A term describes elementary type sets:
|
||||||
|
//
|
||||||
|
// ∅: (*term)(nil) == ∅ // set of no types (empty set)
|
||||||
|
// 𝓤: &term{} == 𝓤 // set of all types (𝓤niverse)
|
||||||
|
// T: &term{false, T} == {T} // set of type T
|
||||||
|
// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t
|
||||||
|
//
|
||||||
|
type term struct {
|
||||||
|
tilde bool // valid if typ != nil
|
||||||
|
typ types.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *term) String() string {
|
||||||
|
switch {
|
||||||
|
case x == nil:
|
||||||
|
return "∅"
|
||||||
|
case x.typ == nil:
|
||||||
|
return "𝓤"
|
||||||
|
case x.tilde:
|
||||||
|
return "~" + x.typ.String()
|
||||||
|
default:
|
||||||
|
return x.typ.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// equal reports whether x and y represent the same type set.
|
||||||
|
func (x *term) equal(y *term) bool {
|
||||||
|
// easy cases
|
||||||
|
switch {
|
||||||
|
case x == nil || y == nil:
|
||||||
|
return x == y
|
||||||
|
case x.typ == nil || y.typ == nil:
|
||||||
|
return x.typ == y.typ
|
||||||
|
}
|
||||||
|
// ∅ ⊂ x, y ⊂ 𝓤
|
||||||
|
|
||||||
|
return x.tilde == y.tilde && types.Identical(x.typ, y.typ)
|
||||||
|
}
|
||||||
|
|
||||||
|
// union returns the union x ∪ y: zero, one, or two non-nil terms.
|
||||||
|
func (x *term) union(y *term) (_, _ *term) {
|
||||||
|
// easy cases
|
||||||
|
switch {
|
||||||
|
case x == nil && y == nil:
|
||||||
|
return nil, nil // ∅ ∪ ∅ == ∅
|
||||||
|
case x == nil:
|
||||||
|
return y, nil // ∅ ∪ y == y
|
||||||
|
case y == nil:
|
||||||
|
return x, nil // x ∪ ∅ == x
|
||||||
|
case x.typ == nil:
|
||||||
|
return x, nil // 𝓤 ∪ y == 𝓤
|
||||||
|
case y.typ == nil:
|
||||||
|
return y, nil // x ∪ 𝓤 == 𝓤
|
||||||
|
}
|
||||||
|
// ∅ ⊂ x, y ⊂ 𝓤
|
||||||
|
|
||||||
|
if x.disjoint(y) {
|
||||||
|
return x, y // x ∪ y == (x, y) if x ∩ y == ∅
|
||||||
|
}
|
||||||
|
// x.typ == y.typ
|
||||||
|
|
||||||
|
// ~t ∪ ~t == ~t
|
||||||
|
// ~t ∪ T == ~t
|
||||||
|
// T ∪ ~t == ~t
|
||||||
|
// T ∪ T == T
|
||||||
|
if x.tilde || !y.tilde {
|
||||||
|
return x, nil
|
||||||
|
}
|
||||||
|
return y, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// intersect returns the intersection x ∩ y.
|
||||||
|
func (x *term) intersect(y *term) *term {
|
||||||
|
// easy cases
|
||||||
|
switch {
|
||||||
|
case x == nil || y == nil:
|
||||||
|
return nil // ∅ ∩ y == ∅ and ∩ ∅ == ∅
|
||||||
|
case x.typ == nil:
|
||||||
|
return y // 𝓤 ∩ y == y
|
||||||
|
case y.typ == nil:
|
||||||
|
return x // x ∩ 𝓤 == x
|
||||||
|
}
|
||||||
|
// ∅ ⊂ x, y ⊂ 𝓤
|
||||||
|
|
||||||
|
if x.disjoint(y) {
|
||||||
|
return nil // x ∩ y == ∅ if x ∩ y == ∅
|
||||||
|
}
|
||||||
|
// x.typ == y.typ
|
||||||
|
|
||||||
|
// ~t ∩ ~t == ~t
|
||||||
|
// ~t ∩ T == T
|
||||||
|
// T ∩ ~t == T
|
||||||
|
// T ∩ T == T
|
||||||
|
if !x.tilde || y.tilde {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
|
// includes reports whether t ∈ x.
|
||||||
|
func (x *term) includes(t types.Type) bool {
|
||||||
|
// easy cases
|
||||||
|
switch {
|
||||||
|
case x == nil:
|
||||||
|
return false // t ∈ ∅ == false
|
||||||
|
case x.typ == nil:
|
||||||
|
return true // t ∈ 𝓤 == true
|
||||||
|
}
|
||||||
|
// ∅ ⊂ x ⊂ 𝓤
|
||||||
|
|
||||||
|
u := t
|
||||||
|
if x.tilde {
|
||||||
|
u = under(u)
|
||||||
|
}
|
||||||
|
return types.Identical(x.typ, u)
|
||||||
|
}
|
||||||
|
|
||||||
|
// subsetOf reports whether x ⊆ y.
|
||||||
|
func (x *term) subsetOf(y *term) bool {
|
||||||
|
// easy cases
|
||||||
|
switch {
|
||||||
|
case x == nil:
|
||||||
|
return true // ∅ ⊆ y == true
|
||||||
|
case y == nil:
|
||||||
|
return false // x ⊆ ∅ == false since x != ∅
|
||||||
|
case y.typ == nil:
|
||||||
|
return true // x ⊆ 𝓤 == true
|
||||||
|
case x.typ == nil:
|
||||||
|
return false // 𝓤 ⊆ y == false since y != 𝓤
|
||||||
|
}
|
||||||
|
// ∅ ⊂ x, y ⊂ 𝓤
|
||||||
|
|
||||||
|
if x.disjoint(y) {
|
||||||
|
return false // x ⊆ y == false if x ∩ y == ∅
|
||||||
|
}
|
||||||
|
// x.typ == y.typ
|
||||||
|
|
||||||
|
// ~t ⊆ ~t == true
|
||||||
|
// ~t ⊆ T == false
|
||||||
|
// T ⊆ ~t == true
|
||||||
|
// T ⊆ T == true
|
||||||
|
return !x.tilde || y.tilde
|
||||||
|
}
|
||||||
|
|
||||||
|
// disjoint reports whether x ∩ y == ∅.
|
||||||
|
// x.typ and y.typ must not be nil.
|
||||||
|
func (x *term) disjoint(y *term) bool {
|
||||||
|
if debug && (x.typ == nil || y.typ == nil) {
|
||||||
|
panic("invalid argument(s)")
|
||||||
|
}
|
||||||
|
ux := x.typ
|
||||||
|
if y.tilde {
|
||||||
|
ux = under(ux)
|
||||||
|
}
|
||||||
|
uy := y.typ
|
||||||
|
if x.tilde {
|
||||||
|
uy = under(uy)
|
||||||
|
}
|
||||||
|
return !types.Identical(ux, uy)
|
||||||
|
}
|
||||||
|
|
@ -86,6 +86,9 @@ type GeneratorArgs struct {
|
||||||
// Any custom arguments go here
|
// Any custom arguments go here
|
||||||
CustomArgs interface{}
|
CustomArgs interface{}
|
||||||
|
|
||||||
|
// If specified, trim the prefix from OutputPackagePath before writing files.
|
||||||
|
TrimPathPrefix string
|
||||||
|
|
||||||
// Whether to use default command line flags
|
// Whether to use default command line flags
|
||||||
defaultCommandLineFlags bool
|
defaultCommandLineFlags bool
|
||||||
}
|
}
|
||||||
|
|
@ -104,6 +107,7 @@ func (g *GeneratorArgs) AddFlags(fs *pflag.FlagSet) {
|
||||||
fs.StringVarP(&g.GoHeaderFilePath, "go-header-file", "h", g.GoHeaderFilePath, "File containing boilerplate header text. The string YEAR will be replaced with the current 4-digit year.")
|
fs.StringVarP(&g.GoHeaderFilePath, "go-header-file", "h", g.GoHeaderFilePath, "File containing boilerplate header text. The string YEAR will be replaced with the current 4-digit year.")
|
||||||
fs.BoolVar(&g.VerifyOnly, "verify-only", g.VerifyOnly, "If true, only verify existing output, do not write anything.")
|
fs.BoolVar(&g.VerifyOnly, "verify-only", g.VerifyOnly, "If true, only verify existing output, do not write anything.")
|
||||||
fs.StringVar(&g.GeneratedBuildTag, "build-tag", g.GeneratedBuildTag, "A Go build tag to use to identify files generated by this command. Should be unique.")
|
fs.StringVar(&g.GeneratedBuildTag, "build-tag", g.GeneratedBuildTag, "A Go build tag to use to identify files generated by this command. Should be unique.")
|
||||||
|
fs.StringVar(&g.TrimPathPrefix, "trim-path-prefix", g.TrimPathPrefix, "If set, trim the specified prefix from --output-package when generating files.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadGoBoilerplate loads the boilerplate file passed to --go-header-file.
|
// LoadGoBoilerplate loads the boilerplate file passed to --go-header-file.
|
||||||
|
|
@ -202,6 +206,8 @@ func (g *GeneratorArgs) Execute(nameSystems namer.NameSystems, defaultSystem str
|
||||||
return fmt.Errorf("Failed making a context: %v", err)
|
return fmt.Errorf("Failed making a context: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.TrimPathPrefix = g.TrimPathPrefix
|
||||||
|
|
||||||
c.Verify = g.VerifyOnly
|
c.Verify = g.VerifyOnly
|
||||||
packages := pkgs(c, g)
|
packages := pkgs(c, g)
|
||||||
if err := c.ExecutePackages(g.OutputBase, packages); err != nil {
|
if err := c.ExecutePackages(g.OutputBase, packages); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
|
|
||||||
inputs := sets.NewString(context.Inputs...)
|
inputs := sets.NewString(context.Inputs...)
|
||||||
packages := generator.Packages{}
|
packages := generator.Packages{}
|
||||||
header := append([]byte(fmt.Sprintf("// +build !%s\n\n", arguments.GeneratedBuildTag)), boilerplate...)
|
header := append([]byte(fmt.Sprintf("//go:build !%s\n// +build !%s\n\n", arguments.GeneratedBuildTag, arguments.GeneratedBuildTag)), boilerplate...)
|
||||||
|
|
||||||
boundingDirs := []string{}
|
boundingDirs := []string{}
|
||||||
if customArgs, ok := arguments.CustomArgs.(*CustomArgs); ok {
|
if customArgs, ok := arguments.CustomArgs.(*CustomArgs); ok {
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ type DefaultFileType struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ft DefaultFileType) AssembleFile(f *File, pathname string) error {
|
func (ft DefaultFileType) AssembleFile(f *File, pathname string) error {
|
||||||
klog.V(2).Infof("Assembling file %q", pathname)
|
klog.V(5).Infof("Assembling file %q", pathname)
|
||||||
destFile, err := os.Create(pathname)
|
destFile, err := os.Create(pathname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -91,7 +91,7 @@ func (ft DefaultFileType) AssembleFile(f *File, pathname string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ft DefaultFileType) VerifyFile(f *File, pathname string) error {
|
func (ft DefaultFileType) VerifyFile(f *File, pathname string) error {
|
||||||
klog.V(2).Infof("Verifying file %q", pathname)
|
klog.V(5).Infof("Verifying file %q", pathname)
|
||||||
friendlyName := filepath.Join(f.PackageName, f.Name)
|
friendlyName := filepath.Join(f.PackageName, f.Name)
|
||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
et := NewErrorTracker(b)
|
et := NewErrorTracker(b)
|
||||||
|
|
@ -214,7 +214,22 @@ func (c *Context) addNameSystems(namers namer.NameSystems) *Context {
|
||||||
// import path already, this will be appended to 'outDir'.
|
// import path already, this will be appended to 'outDir'.
|
||||||
func (c *Context) ExecutePackage(outDir string, p Package) error {
|
func (c *Context) ExecutePackage(outDir string, p Package) error {
|
||||||
path := filepath.Join(outDir, p.Path())
|
path := filepath.Join(outDir, p.Path())
|
||||||
klog.V(2).Infof("Processing package %q, disk location %q", p.Name(), path)
|
|
||||||
|
// When working outside of GOPATH, we typically won't want to generate the
|
||||||
|
// full path for a package. For example, if our current project's root/base
|
||||||
|
// package is github.com/foo/bar, outDir=., p.Path()=github.com/foo/bar/generated,
|
||||||
|
// then we really want to be writing files to ./generated, not ./github.com/foo/bar/generated.
|
||||||
|
// The following will trim a path prefix (github.com/foo/bar) from p.Path() to arrive at
|
||||||
|
// a relative path that works with projects not in GOPATH.
|
||||||
|
if c.TrimPathPrefix != "" {
|
||||||
|
separator := string(filepath.Separator)
|
||||||
|
if !strings.HasSuffix(c.TrimPathPrefix, separator) {
|
||||||
|
c.TrimPathPrefix += separator
|
||||||
|
}
|
||||||
|
|
||||||
|
path = strings.TrimPrefix(path, c.TrimPathPrefix)
|
||||||
|
}
|
||||||
|
klog.V(5).Infof("Processing package %q, disk location %q", p.Name(), path)
|
||||||
// Filter out any types the *package* doesn't care about.
|
// Filter out any types the *package* doesn't care about.
|
||||||
packageContext := c.filteredBy(p.Filter)
|
packageContext := c.filteredBy(p.Filter)
|
||||||
os.MkdirAll(path, 0755)
|
os.MkdirAll(path, 0755)
|
||||||
|
|
|
||||||
|
|
@ -183,6 +183,9 @@ type Context struct {
|
||||||
|
|
||||||
// Allows generators to add packages at runtime.
|
// Allows generators to add packages at runtime.
|
||||||
builder *parser.Builder
|
builder *parser.Builder
|
||||||
|
|
||||||
|
// If specified, trim the prefix from a package's path before writing files.
|
||||||
|
TrimPathPrefix string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewContext generates a context from the given builder, naming systems, and
|
// NewContext generates a context from the given builder, naming systems, and
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,9 @@ type Builder struct {
|
||||||
// This might hold the same value for multiple names, e.g. if someone
|
// This might hold the same value for multiple names, e.g. if someone
|
||||||
// referenced ./pkg/name or in the case of vendoring, which canonicalizes
|
// referenced ./pkg/name or in the case of vendoring, which canonicalizes
|
||||||
// differently that what humans would type.
|
// differently that what humans would type.
|
||||||
buildPackages map[string]*build.Package
|
//
|
||||||
|
// This must only be accessed via getLoadedBuildPackage and setLoadedBuildPackage
|
||||||
|
buildPackages map[importPathString]*build.Package
|
||||||
|
|
||||||
fset *token.FileSet
|
fset *token.FileSet
|
||||||
// map of package path to list of parsed files
|
// map of package path to list of parsed files
|
||||||
|
|
@ -102,7 +104,7 @@ func New() *Builder {
|
||||||
c.CgoEnabled = false
|
c.CgoEnabled = false
|
||||||
return &Builder{
|
return &Builder{
|
||||||
context: &c,
|
context: &c,
|
||||||
buildPackages: map[string]*build.Package{},
|
buildPackages: map[importPathString]*build.Package{},
|
||||||
typeCheckedPackages: map[importPathString]*tc.Package{},
|
typeCheckedPackages: map[importPathString]*tc.Package{},
|
||||||
fset: token.NewFileSet(),
|
fset: token.NewFileSet(),
|
||||||
parsed: map[importPathString][]parsedFile{},
|
parsed: map[importPathString][]parsedFile{},
|
||||||
|
|
@ -118,11 +120,37 @@ func (b *Builder) AddBuildTags(tags ...string) {
|
||||||
b.context.BuildTags = append(b.context.BuildTags, tags...)
|
b.context.BuildTags = append(b.context.BuildTags, tags...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Builder) getLoadedBuildPackage(importPath string) (*build.Package, bool) {
|
||||||
|
canonicalized := canonicalizeImportPath(importPath)
|
||||||
|
if string(canonicalized) != importPath {
|
||||||
|
klog.V(5).Infof("getLoadedBuildPackage: %s normalized to %s", importPath, canonicalized)
|
||||||
|
}
|
||||||
|
buildPkg, ok := b.buildPackages[canonicalized]
|
||||||
|
return buildPkg, ok
|
||||||
|
}
|
||||||
|
func (b *Builder) setLoadedBuildPackage(importPath string, buildPkg *build.Package) {
|
||||||
|
canonicalizedImportPath := canonicalizeImportPath(importPath)
|
||||||
|
if string(canonicalizedImportPath) != importPath {
|
||||||
|
klog.V(5).Infof("setLoadedBuildPackage: importPath %s normalized to %s", importPath, canonicalizedImportPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
canonicalizedBuildPkgImportPath := canonicalizeImportPath(buildPkg.ImportPath)
|
||||||
|
if string(canonicalizedBuildPkgImportPath) != buildPkg.ImportPath {
|
||||||
|
klog.V(5).Infof("setLoadedBuildPackage: buildPkg.ImportPath %s normalized to %s", buildPkg.ImportPath, canonicalizedBuildPkgImportPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if canonicalizedImportPath != canonicalizedBuildPkgImportPath {
|
||||||
|
klog.V(5).Infof("setLoadedBuildPackage: normalized importPath (%s) differs from buildPkg.ImportPath (%s)", canonicalizedImportPath, canonicalizedBuildPkgImportPath)
|
||||||
|
}
|
||||||
|
b.buildPackages[canonicalizedImportPath] = buildPkg
|
||||||
|
b.buildPackages[canonicalizedBuildPkgImportPath] = buildPkg
|
||||||
|
}
|
||||||
|
|
||||||
// Get package information from the go/build package. Automatically excludes
|
// Get package information from the go/build package. Automatically excludes
|
||||||
// e.g. test files and files for other platforms-- there is quite a bit of
|
// e.g. test files and files for other platforms-- there is quite a bit of
|
||||||
// logic of that nature in the build package.
|
// logic of that nature in the build package.
|
||||||
func (b *Builder) importBuildPackage(dir string) (*build.Package, error) {
|
func (b *Builder) importBuildPackage(dir string) (*build.Package, error) {
|
||||||
if buildPkg, ok := b.buildPackages[dir]; ok {
|
if buildPkg, ok := b.getLoadedBuildPackage(dir); ok {
|
||||||
return buildPkg, nil
|
return buildPkg, nil
|
||||||
}
|
}
|
||||||
// This validates the `package foo // github.com/bar/foo` comments.
|
// This validates the `package foo // github.com/bar/foo` comments.
|
||||||
|
|
@ -142,17 +170,7 @@ func (b *Builder) importBuildPackage(dir string) (*build.Package, error) {
|
||||||
|
|
||||||
// Remember it under the user-provided name.
|
// Remember it under the user-provided name.
|
||||||
klog.V(5).Infof("saving buildPackage %s", dir)
|
klog.V(5).Infof("saving buildPackage %s", dir)
|
||||||
b.buildPackages[dir] = buildPkg
|
b.setLoadedBuildPackage(dir, buildPkg)
|
||||||
canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
|
|
||||||
if dir != string(canonicalPackage) {
|
|
||||||
// Since `dir` is not the canonical name, see if we knew it under another name.
|
|
||||||
if buildPkg, ok := b.buildPackages[string(canonicalPackage)]; ok {
|
|
||||||
return buildPkg, nil
|
|
||||||
}
|
|
||||||
// Must be new, save it under the canonical name, too.
|
|
||||||
klog.V(5).Infof("saving buildPackage %s", canonicalPackage)
|
|
||||||
b.buildPackages[string(canonicalPackage)] = buildPkg
|
|
||||||
}
|
|
||||||
|
|
||||||
return buildPkg, nil
|
return buildPkg, nil
|
||||||
}
|
}
|
||||||
|
|
@ -167,7 +185,7 @@ func (b *Builder) AddFileForTest(pkg string, path string, src []byte) error {
|
||||||
if err := b.addFile(importPathString(pkg), path, src, true); err != nil {
|
if err := b.addFile(importPathString(pkg), path, src, true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := b.typeCheckPackage(importPathString(pkg)); err != nil {
|
if _, err := b.typeCheckPackage(importPathString(pkg), true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -231,7 +249,11 @@ func (b *Builder) AddDirRecursive(dir string) error {
|
||||||
|
|
||||||
// filepath.Walk does not follow symlinks. We therefore evaluate symlinks and use that with
|
// filepath.Walk does not follow symlinks. We therefore evaluate symlinks and use that with
|
||||||
// filepath.Walk.
|
// filepath.Walk.
|
||||||
realPath, err := filepath.EvalSymlinks(b.buildPackages[dir].Dir)
|
buildPkg, ok := b.getLoadedBuildPackage(dir)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("no loaded build package for %s", dir)
|
||||||
|
}
|
||||||
|
realPath, err := filepath.EvalSymlinks(buildPkg.Dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -241,7 +263,11 @@ func (b *Builder) AddDirRecursive(dir string) error {
|
||||||
rel := filepath.ToSlash(strings.TrimPrefix(filePath, realPath))
|
rel := filepath.ToSlash(strings.TrimPrefix(filePath, realPath))
|
||||||
if rel != "" {
|
if rel != "" {
|
||||||
// Make a pkg path.
|
// Make a pkg path.
|
||||||
pkg := path.Join(string(canonicalizeImportPath(b.buildPackages[dir].ImportPath)), rel)
|
buildPkg, ok := b.getLoadedBuildPackage(dir)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("no loaded build package for %s", dir)
|
||||||
|
}
|
||||||
|
pkg := path.Join(string(canonicalizeImportPath(buildPkg.ImportPath)), rel)
|
||||||
|
|
||||||
// Add it.
|
// Add it.
|
||||||
if _, err := b.importPackage(pkg, true); err != nil {
|
if _, err := b.importPackage(pkg, true); err != nil {
|
||||||
|
|
@ -269,7 +295,7 @@ func (b *Builder) AddDirTo(dir string, u *types.Universe) error {
|
||||||
if _, err := b.importPackage(dir, true); err != nil {
|
if _, err := b.importPackage(dir, true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
pkg, ok := b.buildPackages[dir]
|
pkg, ok := b.getLoadedBuildPackage(dir)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("no such package: %q", dir)
|
return fmt.Errorf("no such package: %q", dir)
|
||||||
}
|
}
|
||||||
|
|
@ -287,8 +313,8 @@ func (b *Builder) AddDirectoryTo(dir string, u *types.Universe) (*types.Package,
|
||||||
if _, err := b.importPackage(dir, true); err != nil {
|
if _, err := b.importPackage(dir, true); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
pkg, ok := b.buildPackages[dir]
|
pkg, ok := b.getLoadedBuildPackage(dir)
|
||||||
if !ok {
|
if !ok || pkg == nil {
|
||||||
return nil, fmt.Errorf("no such package: %q", dir)
|
return nil, fmt.Errorf("no such package: %q", dir)
|
||||||
}
|
}
|
||||||
path := canonicalizeImportPath(pkg.ImportPath)
|
path := canonicalizeImportPath(pkg.ImportPath)
|
||||||
|
|
@ -355,10 +381,11 @@ func isErrPackageNotFound(err error) bool {
|
||||||
// needs to import a go package. 'path' is the import path.
|
// needs to import a go package. 'path' is the import path.
|
||||||
func (b *Builder) importPackage(dir string, userRequested bool) (*tc.Package, error) {
|
func (b *Builder) importPackage(dir string, userRequested bool) (*tc.Package, error) {
|
||||||
klog.V(5).Infof("importPackage %s", dir)
|
klog.V(5).Infof("importPackage %s", dir)
|
||||||
|
|
||||||
var pkgPath = importPathString(dir)
|
var pkgPath = importPathString(dir)
|
||||||
|
|
||||||
// Get the canonical path if we can.
|
// Get the canonical path if we can.
|
||||||
if buildPkg := b.buildPackages[dir]; buildPkg != nil {
|
if buildPkg, _ := b.getLoadedBuildPackage(dir); buildPkg != nil {
|
||||||
canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
|
canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
|
||||||
klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
|
klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
|
||||||
pkgPath = canonicalPackage
|
pkgPath = canonicalPackage
|
||||||
|
|
@ -382,7 +409,7 @@ func (b *Builder) importPackage(dir string, userRequested bool) (*tc.Package, er
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the canonical path now that it has been added.
|
// Get the canonical path now that it has been added.
|
||||||
if buildPkg := b.buildPackages[dir]; buildPkg != nil {
|
if buildPkg, _ := b.getLoadedBuildPackage(dir); buildPkg != nil {
|
||||||
canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
|
canonicalPackage := canonicalizeImportPath(buildPkg.ImportPath)
|
||||||
klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
|
klog.V(5).Infof("importPackage %s, canonical path is %s", dir, canonicalPackage)
|
||||||
pkgPath = canonicalPackage
|
pkgPath = canonicalPackage
|
||||||
|
|
@ -396,13 +423,13 @@ func (b *Builder) importPackage(dir string, userRequested bool) (*tc.Package, er
|
||||||
// Run the type checker. We may end up doing this to pkgs that are already
|
// Run the type checker. We may end up doing this to pkgs that are already
|
||||||
// done, or are in the queue to be done later, but it will short-circuit,
|
// done, or are in the queue to be done later, but it will short-circuit,
|
||||||
// and we can't miss pkgs that are only depended on.
|
// and we can't miss pkgs that are only depended on.
|
||||||
pkg, err := b.typeCheckPackage(pkgPath)
|
pkg, err := b.typeCheckPackage(pkgPath, !ignoreError)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch {
|
switch {
|
||||||
case ignoreError && pkg != nil:
|
case ignoreError && pkg != nil:
|
||||||
klog.V(2).Infof("type checking encountered some issues in %q, but ignoring.\n", pkgPath)
|
klog.V(4).Infof("type checking encountered some issues in %q, but ignoring.\n", pkgPath)
|
||||||
case !ignoreError && pkg != nil:
|
case !ignoreError && pkg != nil:
|
||||||
klog.V(2).Infof("type checking encountered some errors in %q\n", pkgPath)
|
klog.V(3).Infof("type checking encountered some errors in %q\n", pkgPath)
|
||||||
return nil, err
|
return nil, err
|
||||||
default:
|
default:
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -423,7 +450,7 @@ func (a importAdapter) Import(path string) (*tc.Package, error) {
|
||||||
// typeCheckPackage will attempt to return the package even if there are some
|
// typeCheckPackage will attempt to return the package even if there are some
|
||||||
// errors, so you may check whether the package is nil or not even if you get
|
// errors, so you may check whether the package is nil or not even if you get
|
||||||
// an error.
|
// an error.
|
||||||
func (b *Builder) typeCheckPackage(pkgPath importPathString) (*tc.Package, error) {
|
func (b *Builder) typeCheckPackage(pkgPath importPathString, logErr bool) (*tc.Package, error) {
|
||||||
klog.V(5).Infof("typeCheckPackage %s", pkgPath)
|
klog.V(5).Infof("typeCheckPackage %s", pkgPath)
|
||||||
if pkg, ok := b.typeCheckedPackages[pkgPath]; ok {
|
if pkg, ok := b.typeCheckedPackages[pkgPath]; ok {
|
||||||
if pkg != nil {
|
if pkg != nil {
|
||||||
|
|
@ -451,7 +478,11 @@ func (b *Builder) typeCheckPackage(pkgPath importPathString) (*tc.Package, error
|
||||||
// method. So there can't be cycles in the import graph.
|
// method. So there can't be cycles in the import graph.
|
||||||
Importer: importAdapter{b},
|
Importer: importAdapter{b},
|
||||||
Error: func(err error) {
|
Error: func(err error) {
|
||||||
|
if logErr {
|
||||||
klog.V(2).Infof("type checker: %v\n", err)
|
klog.V(2).Infof("type checker: %v\n", err)
|
||||||
|
} else {
|
||||||
|
klog.V(3).Infof("type checker: %v\n", err)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
pkg, err := c.Check(string(pkgPath), b.fset, files, nil)
|
pkg, err := c.Check(string(pkgPath), b.fset, files, nil)
|
||||||
|
|
@ -600,6 +631,10 @@ func (b *Builder) importWithMode(dir string, mode build.ImportMode) (*build.Pack
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to get current directory: %v", err)
|
return nil, fmt.Errorf("unable to get current directory: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// normalize to drop /vendor/ if present
|
||||||
|
dir = string(canonicalizeImportPath(dir))
|
||||||
|
|
||||||
buildPkg, err := b.context.Import(filepath.ToSlash(dir), cwd, mode)
|
buildPkg, err := b.context.Import(filepath.ToSlash(dir), cwd, mode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -661,9 +696,11 @@ func (b *Builder) convertSignature(u types.Universe, t *tc.Signature) *types.Sig
|
||||||
signature := &types.Signature{}
|
signature := &types.Signature{}
|
||||||
for i := 0; i < t.Params().Len(); i++ {
|
for i := 0; i < t.Params().Len(); i++ {
|
||||||
signature.Parameters = append(signature.Parameters, b.walkType(u, nil, t.Params().At(i).Type()))
|
signature.Parameters = append(signature.Parameters, b.walkType(u, nil, t.Params().At(i).Type()))
|
||||||
|
signature.ParameterNames = append(signature.ParameterNames, t.Params().At(i).Name())
|
||||||
}
|
}
|
||||||
for i := 0; i < t.Results().Len(); i++ {
|
for i := 0; i < t.Results().Len(); i++ {
|
||||||
signature.Results = append(signature.Results, b.walkType(u, nil, t.Results().At(i).Type()))
|
signature.Results = append(signature.Results, b.walkType(u, nil, t.Results().At(i).Type()))
|
||||||
|
signature.ResultNames = append(signature.ResultNames, t.Results().At(i).Name())
|
||||||
}
|
}
|
||||||
if r := t.Recv(); r != nil {
|
if r := t.Recv(); r != nil {
|
||||||
signature.Receiver = b.walkType(u, nil, r.Type())
|
signature.Receiver = b.walkType(u, nil, r.Type())
|
||||||
|
|
|
||||||
|
|
@ -423,12 +423,12 @@ func (m Member) String() string {
|
||||||
|
|
||||||
// Signature is a function's signature.
|
// Signature is a function's signature.
|
||||||
type Signature struct {
|
type Signature struct {
|
||||||
// TODO: store the parameter names, not just types.
|
|
||||||
|
|
||||||
// If a method of some type, this is the type it's a member of.
|
// If a method of some type, this is the type it's a member of.
|
||||||
Receiver *Type
|
Receiver *Type
|
||||||
Parameters []*Type
|
Parameters []*Type
|
||||||
|
ParameterNames []string
|
||||||
Results []*Type
|
Results []*Type
|
||||||
|
ResultNames []string
|
||||||
|
|
||||||
// True if the last in parameter is of the form ...T.
|
// True if the last in parameter is of the form ...T.
|
||||||
Variadic bool
|
Variadic bool
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
lru "github.com/hashicorp/golang-lru"
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
@ -66,25 +65,16 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
templateCache *lru.Cache
|
DefaultInitContainerNameTemplate = mustParseTemplate(DefaultInitContainerName)
|
||||||
|
DefaultUserContainerNameTemplate = mustParseTemplate(DefaultUserContainerName)
|
||||||
// Verify the default templates are valid.
|
|
||||||
_ = template.Must(template.New("user-container-template").Parse(DefaultUserContainerName))
|
|
||||||
_ = template.Must(template.New("init-container-template").Parse(DefaultInitContainerName))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
// The only failure is due to negative size.
|
|
||||||
// Store 10 latest templates.
|
|
||||||
templateCache, _ = lru.New(10)
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultDefaultsConfig() *Defaults {
|
func defaultDefaultsConfig() *Defaults {
|
||||||
return &Defaults{
|
return &Defaults{
|
||||||
RevisionTimeoutSeconds: DefaultRevisionTimeoutSeconds,
|
RevisionTimeoutSeconds: DefaultRevisionTimeoutSeconds,
|
||||||
MaxRevisionTimeoutSeconds: DefaultMaxRevisionTimeoutSeconds,
|
MaxRevisionTimeoutSeconds: DefaultMaxRevisionTimeoutSeconds,
|
||||||
InitContainerNameTemplate: DefaultInitContainerName,
|
InitContainerNameTemplate: DefaultInitContainerNameTemplate,
|
||||||
UserContainerNameTemplate: DefaultUserContainerName,
|
UserContainerNameTemplate: DefaultUserContainerNameTemplate,
|
||||||
ContainerConcurrency: DefaultContainerConcurrency,
|
ContainerConcurrency: DefaultContainerConcurrency,
|
||||||
ContainerConcurrencyMaxLimit: DefaultMaxRevisionContainerConcurrency,
|
ContainerConcurrencyMaxLimit: DefaultMaxRevisionContainerConcurrency,
|
||||||
AllowContainerConcurrencyZero: DefaultAllowContainerConcurrencyZero,
|
AllowContainerConcurrencyZero: DefaultAllowContainerConcurrencyZero,
|
||||||
|
|
@ -113,8 +103,8 @@ func NewDefaultsConfigFromMap(data map[string]string) (*Defaults, error) {
|
||||||
nc := defaultDefaultsConfig()
|
nc := defaultDefaultsConfig()
|
||||||
|
|
||||||
if err := cm.Parse(data,
|
if err := cm.Parse(data,
|
||||||
cm.AsString("init-container-name-template", &nc.InitContainerNameTemplate),
|
asTemplate("init-container-name-template", &nc.InitContainerNameTemplate),
|
||||||
cm.AsString("container-name-template", &nc.UserContainerNameTemplate),
|
asTemplate("container-name-template", &nc.UserContainerNameTemplate),
|
||||||
|
|
||||||
cm.AsBool("allow-container-concurrency-zero", &nc.AllowContainerConcurrencyZero),
|
cm.AsBool("allow-container-concurrency-zero", &nc.AllowContainerConcurrencyZero),
|
||||||
asTriState("enable-service-links", &nc.EnableServiceLinks, nil),
|
asTriState("enable-service-links", &nc.EnableServiceLinks, nil),
|
||||||
|
|
@ -145,29 +135,13 @@ func NewDefaultsConfigFromMap(data map[string]string) (*Defaults, error) {
|
||||||
return nil, apis.ErrOutOfBoundsValue(
|
return nil, apis.ErrOutOfBoundsValue(
|
||||||
nc.ContainerConcurrency, 0, nc.ContainerConcurrencyMaxLimit, "container-concurrency")
|
nc.ContainerConcurrency, 0, nc.ContainerConcurrencyMaxLimit, "container-concurrency")
|
||||||
}
|
}
|
||||||
if _, ok := templateCache.Get(nc.UserContainerNameTemplate); !ok {
|
// Check that the templates properly apply to ObjectMeta.
|
||||||
tmpl, err := template.New("container-template").Parse(nc.UserContainerNameTemplate)
|
if err := nc.UserContainerNameTemplate.Execute(io.Discard, metav1.ObjectMeta{}); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Check that the template properly applies to ObjectMeta.
|
|
||||||
if err := tmpl.Execute(io.Discard, metav1.ObjectMeta{}); err != nil {
|
|
||||||
return nil, fmt.Errorf("error executing template: %w", err)
|
return nil, fmt.Errorf("error executing template: %w", err)
|
||||||
}
|
}
|
||||||
|
if err := nc.InitContainerNameTemplate.Execute(io.Discard, metav1.ObjectMeta{}); err != nil {
|
||||||
templateCache.Add(nc.UserContainerNameTemplate, tmpl)
|
|
||||||
}
|
|
||||||
if _, ok := templateCache.Get(nc.InitContainerNameTemplate); !ok {
|
|
||||||
tmpl, err := template.New("container-template").Parse(nc.InitContainerNameTemplate)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Check that the template properly applies to ObjectMeta.
|
|
||||||
if err := tmpl.Execute(io.Discard, metav1.ObjectMeta{}); err != nil {
|
|
||||||
return nil, fmt.Errorf("error executing template: %w", err)
|
return nil, fmt.Errorf("error executing template: %w", err)
|
||||||
}
|
}
|
||||||
templateCache.Add(nc.InitContainerNameTemplate, tmpl)
|
|
||||||
}
|
|
||||||
return nc, nil
|
return nc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,9 +157,9 @@ type Defaults struct {
|
||||||
// RevisionTimeoutSeconds must be less than this value.
|
// RevisionTimeoutSeconds must be less than this value.
|
||||||
MaxRevisionTimeoutSeconds int64
|
MaxRevisionTimeoutSeconds int64
|
||||||
|
|
||||||
InitContainerNameTemplate string
|
InitContainerNameTemplate *ObjectMetaTemplate
|
||||||
|
|
||||||
UserContainerNameTemplate string
|
UserContainerNameTemplate *ObjectMetaTemplate
|
||||||
|
|
||||||
ContainerConcurrency int64
|
ContainerConcurrency int64
|
||||||
|
|
||||||
|
|
@ -209,15 +183,7 @@ type Defaults struct {
|
||||||
RevisionEphemeralStorageLimit *resource.Quantity
|
RevisionEphemeralStorageLimit *resource.Quantity
|
||||||
}
|
}
|
||||||
|
|
||||||
func containerNameFromTemplate(ctx context.Context, templateText string) string {
|
func containerNameFromTemplate(ctx context.Context, tmpl *ObjectMetaTemplate) string {
|
||||||
var tmpl *template.Template
|
|
||||||
if tt, ok := templateCache.Get(templateText); ok {
|
|
||||||
tmpl = tt.(*template.Template)
|
|
||||||
} else {
|
|
||||||
// Fallback for unit tests.
|
|
||||||
tmpl = template.Must(
|
|
||||||
template.New("container-template").Parse(templateText))
|
|
||||||
}
|
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
if err := tmpl.Execute(buf, apis.ParentMeta(ctx)); err != nil {
|
if err := tmpl.Execute(buf, apis.ParentMeta(ctx)); err != nil {
|
||||||
return ""
|
return ""
|
||||||
|
|
@ -234,3 +200,58 @@ func (d Defaults) UserContainerName(ctx context.Context) string {
|
||||||
func (d Defaults) InitContainerName(ctx context.Context) string {
|
func (d Defaults) InitContainerName(ctx context.Context) string {
|
||||||
return containerNameFromTemplate(ctx, d.InitContainerNameTemplate)
|
return containerNameFromTemplate(ctx, d.InitContainerNameTemplate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func asTemplate(key string, target **ObjectMetaTemplate) cm.ParseFunc {
|
||||||
|
return func(data map[string]string) error {
|
||||||
|
if raw, ok := data[key]; ok {
|
||||||
|
val, err := template.New("container-template").Parse(raw)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
*target = &ObjectMetaTemplate{val}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObjectMetaTemplate is a template.Template wrapper for templates
|
||||||
|
// which can be applied to ObjectMeta. It implements DeepCopy and
|
||||||
|
// Equal so it can be used in Config structs and with go-cmp in
|
||||||
|
// tests.
|
||||||
|
type ObjectMetaTemplate struct {
|
||||||
|
*template.Template
|
||||||
|
}
|
||||||
|
|
||||||
|
func mustParseTemplate(t string) *ObjectMetaTemplate {
|
||||||
|
return &ObjectMetaTemplate{
|
||||||
|
Template: template.Must(template.New("container-template").Parse(t)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t ObjectMetaTemplate) DeepCopy() ObjectMetaTemplate {
|
||||||
|
var err error
|
||||||
|
t.Template, err = t.Template.Clone()
|
||||||
|
if err != nil {
|
||||||
|
// Can't fail since the template is validated.
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal compares two ObjectMetaTemplates for equality, it is
|
||||||
|
// implemented so that tests using go-cmp work nicely. Equality is
|
||||||
|
// defined to mean that applying the template results in the same
|
||||||
|
// value given the same ObjectMeta.Name.
|
||||||
|
func (t ObjectMetaTemplate) Equal(t2 ObjectMetaTemplate) bool {
|
||||||
|
var a, b bytes.Buffer
|
||||||
|
if err := t.Execute(&a, metav1.ObjectMeta{Name: "abc"}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if err := t2.Execute(&b, metav1.ObjectMeta{Name: "abc"}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return a.String() == b.String()
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,16 @@ func (in *Config) DeepCopy() *Config {
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *Defaults) DeepCopyInto(out *Defaults) {
|
func (in *Defaults) DeepCopyInto(out *Defaults) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
if in.InitContainerNameTemplate != nil {
|
||||||
|
in, out := &in.InitContainerNameTemplate, &out.InitContainerNameTemplate
|
||||||
|
x := (*in).DeepCopy()
|
||||||
|
*out = &x
|
||||||
|
}
|
||||||
|
if in.UserContainerNameTemplate != nil {
|
||||||
|
in, out := &in.UserContainerNameTemplate, &out.UserContainerNameTemplate
|
||||||
|
x := (*in).DeepCopy()
|
||||||
|
*out = &x
|
||||||
|
}
|
||||||
if in.EnableServiceLinks != nil {
|
if in.EnableServiceLinks != nil {
|
||||||
in, out := &in.EnableServiceLinks, &out.EnableServiceLinks
|
in, out := &in.EnableServiceLinks, &out.EnableServiceLinks
|
||||||
*out = new(bool)
|
*out = new(bool)
|
||||||
|
|
@ -122,3 +132,9 @@ func (in *Features) DeepCopy() *Features {
|
||||||
in.DeepCopyInto(out)
|
in.DeepCopyInto(out)
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *ObjectMetaTemplate) DeepCopyInto(out *ObjectMetaTemplate) {
|
||||||
|
*out = in.DeepCopy()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -221,14 +221,7 @@ function knative_setup() {
|
||||||
|
|
||||||
# Install gateway-api and istio. Gateway API CRD must be installed before Istio.
|
# Install gateway-api and istio. Gateway API CRD must be installed before Istio.
|
||||||
if is_ingress_class gateway-api; then
|
if is_ingress_class gateway-api; then
|
||||||
# TODO: Do not use fixed Gateway API version and Istio version.
|
stage_gateway_api_resources
|
||||||
kubectl apply -k 'github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.3.0'
|
|
||||||
export ISTIO_VERSION=1.11.4 && curl -sL https://istio.io/downloadIstioctl | sh -
|
|
||||||
if (( KIND )); then
|
|
||||||
$HOME/.istioctl/bin/istioctl install -y --set values.gateways.istio-ingressgateway.type=NodePort --set values.global.proxy.clusterDomain="${CLUSTER_DOMAIN}"
|
|
||||||
else
|
|
||||||
$HOME/.istioctl/bin/istioctl install -y --set values.global.proxy.clusterDomain="${CLUSTER_DOMAIN}"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
stage_test_resources
|
stage_test_resources
|
||||||
|
|
@ -267,6 +260,10 @@ function install() {
|
||||||
if is_ingress_class istio; then
|
if is_ingress_class istio; then
|
||||||
# Istio - see cluster_setup for how the files are staged
|
# Istio - see cluster_setup for how the files are staged
|
||||||
YTT_FILES+=("${E2E_YAML_DIR}/istio/${ingress_version}/install")
|
YTT_FILES+=("${E2E_YAML_DIR}/istio/${ingress_version}/install")
|
||||||
|
elif is_ingress_class gateway-api; then
|
||||||
|
# This installs an istio version that works with the v1alpha1 gateway api
|
||||||
|
YTT_FILES+=("${E2E_YAML_DIR}/gateway-api/install")
|
||||||
|
YTT_FILES+=("${REPO_ROOT_DIR}/third_party/${ingress}-latest")
|
||||||
else
|
else
|
||||||
YTT_FILES+=("${REPO_ROOT_DIR}/third_party/${ingress}-latest")
|
YTT_FILES+=("${REPO_ROOT_DIR}/third_party/${ingress}-latest")
|
||||||
fi
|
fi
|
||||||
|
|
@ -339,12 +336,6 @@ function install() {
|
||||||
# kubectl -n ${SYSTEM_NAMESPACE} delete leases --all
|
# kubectl -n ${SYSTEM_NAMESPACE} delete leases --all
|
||||||
wait_for_leader_controller || return 1
|
wait_for_leader_controller || return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Due to https://github.com/vmware-tanzu/carvel-kapp/issues/381, deploy svc by kubectl instead of kapp.
|
|
||||||
if is_ingress_class gateway-api; then
|
|
||||||
kubectl delete -f ${REPO_ROOT_DIR}/third_party/gateway-api-latest/istio-gateway.yaml
|
|
||||||
kubectl apply -f ${REPO_ROOT_DIR}/third_party/gateway-api-latest/istio-gateway.yaml
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if we should use --resolvabledomain. In case the ingress only has
|
# Check if we should use --resolvabledomain. In case the ingress only has
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,32 @@ function is_ingress_class() {
|
||||||
[[ "${INGRESS_CLASS}" == *"${1}"* ]]
|
[[ "${INGRESS_CLASS}" == *"${1}"* ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function stage_gateway_api_resources() {
|
||||||
|
# This installs an istio version that works with the v1alpha1 gateway api
|
||||||
|
header "Staging Gateway API Resources"
|
||||||
|
|
||||||
|
local gateway_dir="${E2E_YAML_DIR}/gateway-api/install"
|
||||||
|
mkdir -p "${gateway_dir}"
|
||||||
|
|
||||||
|
# TODO: if we switch to istio 1.12 we can reuse stage_istio_head
|
||||||
|
curl -sL https://istio.io/downloadIstioctl | ISTIO_VERSION=1.11.4 sh -
|
||||||
|
|
||||||
|
local params="--set values.global.proxy.clusterDomain=${CLUSTER_DOMAIN}"
|
||||||
|
if (( KIND )); then
|
||||||
|
params="${params} --set values.gateways.istio-ingressgateway.type=NodePort"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF > "${gateway_dir}/istio.yaml"
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: istio-system
|
||||||
|
---
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$HOME/.istioctl/bin/istioctl manifest generate $params >> "${gateway_dir}/istio.yaml"
|
||||||
|
}
|
||||||
|
|
||||||
function stage_istio_head() {
|
function stage_istio_head() {
|
||||||
header "Staging Istio YAML (HEAD)"
|
header "Staging Istio YAML (HEAD)"
|
||||||
local istio_head_dir="${E2E_YAML_DIR}/istio/HEAD/install"
|
local istio_head_dir="${E2E_YAML_DIR}/istio/HEAD/install"
|
||||||
|
|
@ -77,17 +103,13 @@ function net_istio_file_url() {
|
||||||
local sha="$1"
|
local sha="$1"
|
||||||
local file="$2"
|
local file="$2"
|
||||||
|
|
||||||
local profile="istio"
|
local profile="istio-ci-no-mesh"
|
||||||
if (( KIND )); then
|
|
||||||
profile+="-kind"
|
|
||||||
else
|
|
||||||
profile+="-ci"
|
|
||||||
fi
|
|
||||||
if [[ $MESH -eq 0 ]]; then
|
|
||||||
profile+="-no"
|
|
||||||
fi
|
|
||||||
|
|
||||||
profile+="-mesh"
|
if (( KIND )); then
|
||||||
|
profile="istio-kind-no-mesh"
|
||||||
|
elif (( MESH )); then
|
||||||
|
profile="istio-ci-mesh"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "https://raw.githubusercontent.com/knative-sandbox/net-istio/${sha}/third_party/istio-${ISTIO_VERSION}/${profile}/${file}"
|
echo "https://raw.githubusercontent.com/knative-sandbox/net-istio/${sha}/third_party/istio-${ISTIO_VERSION}/${profile}/${file}"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,12 @@
|
||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/e2e-common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/e2e-common.sh"
|
||||||
|
|
||||||
|
# Overrides
|
||||||
|
function stage_test_resources() {
|
||||||
|
# Nothing to install before tests.
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
# Script entry point.
|
# Script entry point.
|
||||||
|
|
||||||
# Skip installing istio as an add-on.
|
# Skip installing istio as an add-on.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# cloud.google.com/go v0.97.0
|
# cloud.google.com/go v0.98.0
|
||||||
cloud.google.com/go/compute/metadata
|
cloud.google.com/go/compute/metadata
|
||||||
# contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d
|
# contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d
|
||||||
contrib.go.opencensus.io/exporter/ocagent
|
contrib.go.opencensus.io/exporter/ocagent
|
||||||
|
|
@ -259,10 +259,11 @@ go.uber.org/zap/internal/bufferpool
|
||||||
go.uber.org/zap/internal/color
|
go.uber.org/zap/internal/color
|
||||||
go.uber.org/zap/internal/exit
|
go.uber.org/zap/internal/exit
|
||||||
go.uber.org/zap/zapcore
|
go.uber.org/zap/zapcore
|
||||||
# golang.org/x/mod v0.4.2
|
# golang.org/x/mod v0.5.1
|
||||||
|
golang.org/x/mod/internal/lazyregexp
|
||||||
golang.org/x/mod/module
|
golang.org/x/mod/module
|
||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
# golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4
|
# golang.org/x/net v0.0.0-20211205041911-012df41ee64c
|
||||||
golang.org/x/net/context
|
golang.org/x/net/context
|
||||||
golang.org/x/net/context/ctxhttp
|
golang.org/x/net/context/ctxhttp
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
|
|
@ -283,7 +284,7 @@ golang.org/x/oauth2/jwt
|
||||||
# golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
# golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||||
golang.org/x/sync/errgroup
|
golang.org/x/sync/errgroup
|
||||||
golang.org/x/sync/semaphore
|
golang.org/x/sync/semaphore
|
||||||
# golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1
|
# golang.org/x/sys v0.0.0-20211124211545-fe61309f8881
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/plan9
|
golang.org/x/sys/plan9
|
||||||
|
|
@ -306,7 +307,7 @@ golang.org/x/text/unicode/norm
|
||||||
golang.org/x/text/width
|
golang.org/x/text/width
|
||||||
# golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac
|
# golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac
|
||||||
golang.org/x/time/rate
|
golang.org/x/time/rate
|
||||||
# golang.org/x/tools v0.1.7
|
# golang.org/x/tools v0.1.8
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
golang.org/x/tools/imports
|
golang.org/x/tools/imports
|
||||||
golang.org/x/tools/internal/event
|
golang.org/x/tools/internal/event
|
||||||
|
|
@ -323,7 +324,7 @@ golang.org/x/xerrors
|
||||||
golang.org/x/xerrors/internal
|
golang.org/x/xerrors/internal
|
||||||
# gomodules.xyz/jsonpatch/v2 v2.2.0
|
# gomodules.xyz/jsonpatch/v2 v2.2.0
|
||||||
gomodules.xyz/jsonpatch/v2
|
gomodules.xyz/jsonpatch/v2
|
||||||
# google.golang.org/api v0.60.0
|
# google.golang.org/api v0.61.0
|
||||||
google.golang.org/api/support/bundler
|
google.golang.org/api/support/bundler
|
||||||
# google.golang.org/appengine v1.6.7
|
# google.golang.org/appengine v1.6.7
|
||||||
google.golang.org/appengine
|
google.golang.org/appengine
|
||||||
|
|
@ -336,7 +337,7 @@ google.golang.org/appengine/internal/modules
|
||||||
google.golang.org/appengine/internal/remote_api
|
google.golang.org/appengine/internal/remote_api
|
||||||
google.golang.org/appengine/internal/urlfetch
|
google.golang.org/appengine/internal/urlfetch
|
||||||
google.golang.org/appengine/urlfetch
|
google.golang.org/appengine/urlfetch
|
||||||
# google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1
|
# google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12
|
||||||
google.golang.org/genproto/googleapis/api/httpbody
|
google.golang.org/genproto/googleapis/api/httpbody
|
||||||
google.golang.org/genproto/googleapis/rpc/status
|
google.golang.org/genproto/googleapis/rpc/status
|
||||||
google.golang.org/genproto/protobuf/field_mask
|
google.golang.org/genproto/protobuf/field_mask
|
||||||
|
|
@ -707,7 +708,7 @@ k8s.io/code-generator/cmd/set-gen
|
||||||
k8s.io/code-generator/pkg/namer
|
k8s.io/code-generator/pkg/namer
|
||||||
k8s.io/code-generator/pkg/util
|
k8s.io/code-generator/pkg/util
|
||||||
k8s.io/code-generator/third_party/forked/golang/reflect
|
k8s.io/code-generator/third_party/forked/golang/reflect
|
||||||
# k8s.io/gengo v0.0.0-20210915205010-39e73c8a59cd
|
# k8s.io/gengo v0.0.0-20211129171323-c02415ce4185
|
||||||
k8s.io/gengo/args
|
k8s.io/gengo/args
|
||||||
k8s.io/gengo/examples/deepcopy-gen/generators
|
k8s.io/gengo/examples/deepcopy-gen/generators
|
||||||
k8s.io/gengo/examples/defaulter-gen/generators
|
k8s.io/gengo/examples/defaulter-gen/generators
|
||||||
|
|
@ -735,7 +736,7 @@ k8s.io/utils/buffer
|
||||||
k8s.io/utils/integer
|
k8s.io/utils/integer
|
||||||
k8s.io/utils/pointer
|
k8s.io/utils/pointer
|
||||||
k8s.io/utils/trace
|
k8s.io/utils/trace
|
||||||
# knative.dev/eventing v0.27.1-0.20211202084045-72a4be098484
|
# knative.dev/eventing v0.27.1-0.20211207100957-43aa7963d8c6
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/eventing/pkg/apis/config
|
knative.dev/eventing/pkg/apis/config
|
||||||
knative.dev/eventing/pkg/apis/duck
|
knative.dev/eventing/pkg/apis/duck
|
||||||
|
|
@ -761,10 +762,10 @@ knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1/fake
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1/fake
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2
|
||||||
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2/fake
|
knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1beta2/fake
|
||||||
# knative.dev/hack v0.0.0-20211202013744-4ec2223904bf
|
# knative.dev/hack v0.0.0-20211203062838-e11ac125e707
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/hack
|
knative.dev/hack
|
||||||
# knative.dev/networking v0.0.0-20211202071645-9e2b3496bb72
|
# knative.dev/networking v0.0.0-20211207005157-1c6e5ff34dfb
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/networking/pkg
|
knative.dev/networking/pkg
|
||||||
knative.dev/networking/pkg/apis/networking
|
knative.dev/networking/pkg/apis/networking
|
||||||
|
|
@ -772,7 +773,7 @@ knative.dev/networking/pkg/apis/networking/v1alpha1
|
||||||
knative.dev/networking/pkg/client/clientset/versioned
|
knative.dev/networking/pkg/client/clientset/versioned
|
||||||
knative.dev/networking/pkg/client/clientset/versioned/scheme
|
knative.dev/networking/pkg/client/clientset/versioned/scheme
|
||||||
knative.dev/networking/pkg/client/clientset/versioned/typed/networking/v1alpha1
|
knative.dev/networking/pkg/client/clientset/versioned/typed/networking/v1alpha1
|
||||||
# knative.dev/pkg v0.0.0-20211202025645-0c482f157959
|
# knative.dev/pkg v0.0.0-20211206113427-18589ac7627e
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/pkg/apis
|
knative.dev/pkg/apis
|
||||||
knative.dev/pkg/apis/duck
|
knative.dev/pkg/apis/duck
|
||||||
|
|
@ -822,7 +823,7 @@ knative.dev/pkg/tracing/config
|
||||||
knative.dev/pkg/tracing/propagation
|
knative.dev/pkg/tracing/propagation
|
||||||
knative.dev/pkg/tracing/propagation/tracecontextb3
|
knative.dev/pkg/tracing/propagation/tracecontextb3
|
||||||
knative.dev/pkg/tracker
|
knative.dev/pkg/tracker
|
||||||
# knative.dev/serving v0.27.1-0.20211202122446-d24124ce039c
|
# knative.dev/serving v0.27.1-0.20211207020356-8f36565cbae6
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/serving/pkg/apis/autoscaling
|
knative.dev/serving/pkg/apis/autoscaling
|
||||||
knative.dev/serving/pkg/apis/autoscaling/v1alpha1
|
knative.dev/serving/pkg/apis/autoscaling/v1alpha1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue