mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-11-01 02:38:12 +00:00
Update kubectl kustomize to kyaml/v0.18.1, cmd/config/v0.15.0, api/v0.18.0, kustomize/v5.5.0
This commit is contained in:
33
LICENSES/vendor/go.starlark.net/LICENSE
generated
vendored
33
LICENSES/vendor/go.starlark.net/LICENSE
generated
vendored
@@ -1,33 +0,0 @@
|
||||
= vendor/go.starlark.net licensed under: =
|
||||
|
||||
Copyright (c) 2017 The Bazel Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
= vendor/go.starlark.net/LICENSE 30237ff6085f287d7c65ec084235a89e
|
||||
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 QRI, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
7
go.mod
7
go.mod
@@ -212,7 +212,6 @@ require (
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
@@ -224,9 +223,9 @@ require (
|
||||
k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect
|
||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/kustomize/api v0.17.2 // indirect
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
|
||||
sigs.k8s.io/kustomize/api v0.18.0 // indirect
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
|
||||
)
|
||||
|
||||
replace (
|
||||
|
||||
22
go.sum
22
go.sum
@@ -176,10 +176,7 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS
|
||||
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
|
||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8=
|
||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y=
|
||||
github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
@@ -344,7 +341,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
@@ -600,8 +596,6 @@ go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+
|
||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
@@ -667,7 +661,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -678,7 +671,6 @@ golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -777,13 +769,13 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/knftables v0.0.17 h1:wGchTyRF/iGTIjd+vRaR1m676HM7jB8soFtyr/148ic=
|
||||
sigs.k8s.io/knftables v0.0.17/go.mod h1:f/5ZLKYEUPUhVjUCg6l80ACdL7CIIyeL0DxfgojGRTk=
|
||||
sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
|
||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.14.1/go.mod h1:Sw1cPsFqh4uYczCWKlidPgMrsffLPCAB+7ytYLlauY4=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 h1:9Zl5Gqg3XMdBEvkR54pVLCBj7FVO7W+VPNDDEzD6AyE=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2/go.mod h1:5ypfJVYlPb2MKKeoGknVLxvHemDlQT+szI4+KOhnD6k=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
|
||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
|
||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
|
||||
@@ -933,4 +933,5 @@ rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
|
||||
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.11.2 h1:YyoHHbxxsLUts/gWLGgIQkdT82ekp3zautbpcml54vc=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.14.1 h1:r1gRhgfPmnt7VYf4uxO8M27GX406n9kOOeScOH9IQds=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.15.0 h1:WkdY8V2+8J+W00YbImXa2ke9oegfrHH79e+kywW7EdU=
|
||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||
|
||||
@@ -25,8 +25,8 @@ require (
|
||||
k8s.io/klog/v2 v2.130.1
|
||||
k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
|
||||
sigs.k8s.io/kustomize/api v0.17.2
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1
|
||||
sigs.k8s.io/kustomize/api v0.18.0
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1
|
||||
sigs.k8s.io/yaml v1.4.0
|
||||
)
|
||||
|
||||
@@ -60,7 +60,6 @@ require (
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xlab/treeprint v1.2.0 // indirect
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
golang.org/x/net v0.28.0 // indirect
|
||||
golang.org/x/oauth2 v0.21.0 // indirect
|
||||
golang.org/x/sys v0.23.0 // indirect
|
||||
|
||||
73
staging/src/k8s.io/cli-runtime/go.sum
generated
73
staging/src/k8s.io/cli-runtime/go.sum
generated
@@ -1,18 +1,11 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
@@ -23,8 +16,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
@@ -43,29 +34,13 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
@@ -124,7 +99,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
@@ -152,51 +126,34 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
|
||||
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
|
||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -206,10 +163,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
@@ -219,22 +172,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
||||
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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
@@ -250,8 +187,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
@@ -261,10 +196,10 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
|
||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
|
||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
|
||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
|
||||
@@ -42,8 +42,8 @@ require (
|
||||
k8s.io/metrics v0.0.0
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1
|
||||
sigs.k8s.io/yaml v1.4.0
|
||||
)
|
||||
@@ -83,7 +83,6 @@ require (
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xlab/treeprint v1.2.0 // indirect
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
golang.org/x/net v0.28.0 // indirect
|
||||
golang.org/x/oauth2 v0.21.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
@@ -94,7 +93,7 @@ require (
|
||||
google.golang.org/protobuf v1.34.2 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
sigs.k8s.io/kustomize/api v0.17.2 // indirect
|
||||
sigs.k8s.io/kustomize/api v0.18.0 // indirect
|
||||
)
|
||||
|
||||
replace (
|
||||
|
||||
79
staging/src/k8s.io/kubectl/go.sum
generated
79
staging/src/k8s.io/kubectl/go.sum
generated
@@ -1,8 +1,6 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
|
||||
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
@@ -13,15 +11,10 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
|
||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
||||
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
|
||||
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
@@ -36,8 +29,6 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr
|
||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=
|
||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
|
||||
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
|
||||
@@ -63,17 +54,7 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
|
||||
@@ -85,12 +66,6 @@ github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
@@ -163,7 +138,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
@@ -204,8 +178,6 @@ go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUis
|
||||
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
|
||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
@@ -214,44 +186,29 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
|
||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -261,10 +218,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
@@ -274,25 +227,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
||||
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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
@@ -308,8 +245,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
@@ -319,13 +254,13 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
|
||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.14.1/go.mod h1:Sw1cPsFqh4uYczCWKlidPgMrsffLPCAB+7ytYLlauY4=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 h1:9Zl5Gqg3XMdBEvkR54pVLCBj7FVO7W+VPNDDEzD6AyE=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.4.2/go.mod h1:5ypfJVYlPb2MKKeoGknVLxvHemDlQT+szI4+KOhnD6k=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
|
||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
|
||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
|
||||
sigs.k8s.io/kustomize/cmd/config v0.15.0/go.mod h1:Jq57b0nPaoYUlOqg//0JtAh6iibboqMcfbtCYoWPM00=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
|
||||
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
|
||||
@@ -36,7 +36,7 @@ import (
|
||||
)
|
||||
|
||||
// TODO(knverey): remove this hardcoding once kubectl being built with module support makes BuildInfo available.
|
||||
const kustomizeVersion = "v5.4.2"
|
||||
const kustomizeVersion = "v5.5.0"
|
||||
|
||||
// Version is a struct for version information
|
||||
type Version struct {
|
||||
|
||||
@@ -45,10 +45,8 @@ require (
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/stretchr/objx v0.5.2 // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xlab/treeprint v1.2.0 // indirect
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
golang.org/x/net v0.28.0 // indirect
|
||||
golang.org/x/oauth2 v0.21.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
@@ -67,8 +65,8 @@ require (
|
||||
k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/kustomize/api v0.17.2 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
|
||||
sigs.k8s.io/kustomize/api v0.18.0 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||
sigs.k8s.io/yaml v1.4.0 // indirect
|
||||
)
|
||||
|
||||
73
staging/src/k8s.io/sample-cli-plugin/go.sum
generated
73
staging/src/k8s.io/sample-cli-plugin/go.sum
generated
@@ -1,18 +1,11 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
@@ -23,8 +16,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
@@ -43,29 +34,13 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
@@ -124,7 +99,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
@@ -152,51 +126,34 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
|
||||
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
|
||||
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -206,10 +163,6 @@ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
@@ -219,22 +172,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
||||
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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
@@ -250,8 +187,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
@@ -261,10 +196,10 @@ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
|
||||
sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
|
||||
sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
|
||||
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
|
||||
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
|
||||
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
|
||||
29
vendor/go.starlark.net/LICENSE
generated
vendored
29
vendor/go.starlark.net/LICENSE
generated
vendored
@@ -1,29 +0,0 @@
|
||||
Copyright (c) 2017 The Bazel Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
1924
vendor/go.starlark.net/internal/compile/compile.go
generated
vendored
1924
vendor/go.starlark.net/internal/compile/compile.go
generated
vendored
File diff suppressed because it is too large
Load Diff
395
vendor/go.starlark.net/internal/compile/serial.go
generated
vendored
395
vendor/go.starlark.net/internal/compile/serial.go
generated
vendored
@@ -1,395 +0,0 @@
|
||||
package compile
|
||||
|
||||
// This file defines functions to read and write a compile.Program to a file.
|
||||
//
|
||||
// It is the client's responsibility to avoid version skew between the
|
||||
// compiler used to produce a file and the interpreter that consumes it.
|
||||
// The version number is provided as a constant.
|
||||
// Incompatible protocol changes should also increment the version number.
|
||||
//
|
||||
// Encoding
|
||||
//
|
||||
// Program:
|
||||
// "sky!" [4]byte # magic number
|
||||
// str uint32le # offset of <strings> section
|
||||
// version varint # must match Version
|
||||
// filename string
|
||||
// numloads varint
|
||||
// loads []Ident
|
||||
// numnames varint
|
||||
// names []string
|
||||
// numconsts varint
|
||||
// consts []Constant
|
||||
// numglobals varint
|
||||
// globals []Ident
|
||||
// toplevel Funcode
|
||||
// numfuncs varint
|
||||
// funcs []Funcode
|
||||
// <strings> []byte # concatenation of all referenced strings
|
||||
// EOF
|
||||
//
|
||||
// Funcode:
|
||||
// id Ident
|
||||
// code []byte
|
||||
// pclinetablen varint
|
||||
// pclinetab []varint
|
||||
// numlocals varint
|
||||
// locals []Ident
|
||||
// numcells varint
|
||||
// cells []int
|
||||
// numfreevars varint
|
||||
// freevar []Ident
|
||||
// maxstack varint
|
||||
// numparams varint
|
||||
// numkwonlyparams varint
|
||||
// hasvarargs varint (0 or 1)
|
||||
// haskwargs varint (0 or 1)
|
||||
//
|
||||
// Ident:
|
||||
// filename string
|
||||
// line, col varint
|
||||
//
|
||||
// Constant: # type data
|
||||
// type varint # 0=string string
|
||||
// data ... # 1=bytes string
|
||||
// # 2=int varint
|
||||
// # 3=float varint (bits as uint64)
|
||||
// # 4=bigint string (decimal ASCII text)
|
||||
//
|
||||
// The encoding starts with a four-byte magic number.
|
||||
// The next four bytes are a little-endian uint32
|
||||
// that provides the offset of the string section
|
||||
// at the end of the file, which contains the ordered
|
||||
// concatenation of all strings referenced by the
|
||||
// program. This design permits the decoder to read
|
||||
// the first and second parts of the file into different
|
||||
// memory allocations: the first (the encoded program)
|
||||
// is transient, but the second (the strings) persists
|
||||
// for the life of the Program.
|
||||
//
|
||||
// Within the encoded program, all strings are referred
|
||||
// to by their length. As the encoder and decoder process
|
||||
// the entire file sequentially, they are in lock step,
|
||||
// so the start offset of each string is implicit.
|
||||
//
|
||||
// Program.Code is represented as a []byte slice to permit
|
||||
// modification when breakpoints are set. All other strings
|
||||
// are represented as strings. They all (unsafely) share the
|
||||
// same backing byte slice.
|
||||
//
|
||||
// Aside from the str field, all integers are encoded as varints.
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/big"
|
||||
debugpkg "runtime/debug"
|
||||
"unsafe"
|
||||
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
const magic = "!sky"
|
||||
|
||||
// Encode encodes a compiled Starlark program.
|
||||
func (prog *Program) Encode() []byte {
|
||||
var e encoder
|
||||
e.p = append(e.p, magic...)
|
||||
e.p = append(e.p, "????"...) // string data offset; filled in later
|
||||
e.int(Version)
|
||||
e.string(prog.Toplevel.Pos.Filename())
|
||||
e.bindings(prog.Loads)
|
||||
e.int(len(prog.Names))
|
||||
for _, name := range prog.Names {
|
||||
e.string(name)
|
||||
}
|
||||
e.int(len(prog.Constants))
|
||||
for _, c := range prog.Constants {
|
||||
switch c := c.(type) {
|
||||
case string:
|
||||
e.int(0)
|
||||
e.string(c)
|
||||
case Bytes:
|
||||
e.int(1)
|
||||
e.string(string(c))
|
||||
case int64:
|
||||
e.int(2)
|
||||
e.int64(c)
|
||||
case float64:
|
||||
e.int(3)
|
||||
e.uint64(math.Float64bits(c))
|
||||
case *big.Int:
|
||||
e.int(4)
|
||||
e.string(c.Text(10))
|
||||
}
|
||||
}
|
||||
e.bindings(prog.Globals)
|
||||
e.function(prog.Toplevel)
|
||||
e.int(len(prog.Functions))
|
||||
for _, fn := range prog.Functions {
|
||||
e.function(fn)
|
||||
}
|
||||
|
||||
// Patch in the offset of the string data section.
|
||||
binary.LittleEndian.PutUint32(e.p[4:8], uint32(len(e.p)))
|
||||
|
||||
return append(e.p, e.s...)
|
||||
}
|
||||
|
||||
type encoder struct {
|
||||
p []byte // encoded program
|
||||
s []byte // strings
|
||||
tmp [binary.MaxVarintLen64]byte
|
||||
}
|
||||
|
||||
func (e *encoder) int(x int) {
|
||||
e.int64(int64(x))
|
||||
}
|
||||
|
||||
func (e *encoder) int64(x int64) {
|
||||
n := binary.PutVarint(e.tmp[:], x)
|
||||
e.p = append(e.p, e.tmp[:n]...)
|
||||
}
|
||||
|
||||
func (e *encoder) uint64(x uint64) {
|
||||
n := binary.PutUvarint(e.tmp[:], x)
|
||||
e.p = append(e.p, e.tmp[:n]...)
|
||||
}
|
||||
|
||||
func (e *encoder) string(s string) {
|
||||
e.int(len(s))
|
||||
e.s = append(e.s, s...)
|
||||
}
|
||||
|
||||
func (e *encoder) bytes(b []byte) {
|
||||
e.int(len(b))
|
||||
e.s = append(e.s, b...)
|
||||
}
|
||||
|
||||
func (e *encoder) binding(bind Binding) {
|
||||
e.string(bind.Name)
|
||||
e.int(int(bind.Pos.Line))
|
||||
e.int(int(bind.Pos.Col))
|
||||
}
|
||||
|
||||
func (e *encoder) bindings(binds []Binding) {
|
||||
e.int(len(binds))
|
||||
for _, bind := range binds {
|
||||
e.binding(bind)
|
||||
}
|
||||
}
|
||||
|
||||
func (e *encoder) function(fn *Funcode) {
|
||||
e.binding(Binding{fn.Name, fn.Pos})
|
||||
e.string(fn.Doc)
|
||||
e.bytes(fn.Code)
|
||||
e.int(len(fn.pclinetab))
|
||||
for _, x := range fn.pclinetab {
|
||||
e.int64(int64(x))
|
||||
}
|
||||
e.bindings(fn.Locals)
|
||||
e.int(len(fn.Cells))
|
||||
for _, index := range fn.Cells {
|
||||
e.int(index)
|
||||
}
|
||||
e.bindings(fn.Freevars)
|
||||
e.int(fn.MaxStack)
|
||||
e.int(fn.NumParams)
|
||||
e.int(fn.NumKwonlyParams)
|
||||
e.int(b2i(fn.HasVarargs))
|
||||
e.int(b2i(fn.HasKwargs))
|
||||
}
|
||||
|
||||
func b2i(b bool) int {
|
||||
if b {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
// DecodeProgram decodes a compiled Starlark program from data.
|
||||
func DecodeProgram(data []byte) (_ *Program, err error) {
|
||||
if len(data) < len(magic) {
|
||||
return nil, fmt.Errorf("not a compiled module: no magic number")
|
||||
}
|
||||
if got := string(data[:4]); got != magic {
|
||||
return nil, fmt.Errorf("not a compiled module: got magic number %q, want %q",
|
||||
got, magic)
|
||||
}
|
||||
defer func() {
|
||||
if x := recover(); x != nil {
|
||||
debugpkg.PrintStack()
|
||||
err = fmt.Errorf("internal error while decoding program: %v", x)
|
||||
}
|
||||
}()
|
||||
|
||||
offset := binary.LittleEndian.Uint32(data[4:8])
|
||||
d := decoder{
|
||||
p: data[8:offset],
|
||||
s: append([]byte(nil), data[offset:]...), // allocate a copy, which will persist
|
||||
}
|
||||
|
||||
if v := d.int(); v != Version {
|
||||
return nil, fmt.Errorf("version mismatch: read %d, want %d", v, Version)
|
||||
}
|
||||
|
||||
filename := d.string()
|
||||
d.filename = &filename
|
||||
|
||||
loads := d.bindings()
|
||||
|
||||
names := make([]string, d.int())
|
||||
for i := range names {
|
||||
names[i] = d.string()
|
||||
}
|
||||
|
||||
// constants
|
||||
constants := make([]interface{}, d.int())
|
||||
for i := range constants {
|
||||
var c interface{}
|
||||
switch d.int() {
|
||||
case 0:
|
||||
c = d.string()
|
||||
case 1:
|
||||
c = Bytes(d.string())
|
||||
case 2:
|
||||
c = d.int64()
|
||||
case 3:
|
||||
c = math.Float64frombits(d.uint64())
|
||||
case 4:
|
||||
c, _ = new(big.Int).SetString(d.string(), 10)
|
||||
}
|
||||
constants[i] = c
|
||||
}
|
||||
|
||||
globals := d.bindings()
|
||||
toplevel := d.function()
|
||||
funcs := make([]*Funcode, d.int())
|
||||
for i := range funcs {
|
||||
funcs[i] = d.function()
|
||||
}
|
||||
|
||||
prog := &Program{
|
||||
Loads: loads,
|
||||
Names: names,
|
||||
Constants: constants,
|
||||
Globals: globals,
|
||||
Functions: funcs,
|
||||
Toplevel: toplevel,
|
||||
}
|
||||
toplevel.Prog = prog
|
||||
for _, f := range funcs {
|
||||
f.Prog = prog
|
||||
}
|
||||
|
||||
if len(d.p)+len(d.s) > 0 {
|
||||
return nil, fmt.Errorf("internal error: unconsumed data during decoding")
|
||||
}
|
||||
|
||||
return prog, nil
|
||||
}
|
||||
|
||||
type decoder struct {
|
||||
p []byte // encoded program
|
||||
s []byte // strings
|
||||
filename *string // (indirect to avoid keeping decoder live)
|
||||
}
|
||||
|
||||
func (d *decoder) int() int {
|
||||
return int(d.int64())
|
||||
}
|
||||
|
||||
func (d *decoder) int64() int64 {
|
||||
x, len := binary.Varint(d.p[:])
|
||||
d.p = d.p[len:]
|
||||
return x
|
||||
}
|
||||
|
||||
func (d *decoder) uint64() uint64 {
|
||||
x, len := binary.Uvarint(d.p[:])
|
||||
d.p = d.p[len:]
|
||||
return x
|
||||
}
|
||||
|
||||
func (d *decoder) string() (s string) {
|
||||
if slice := d.bytes(); len(slice) > 0 {
|
||||
// Avoid a memory allocation for each string
|
||||
// by unsafely aliasing slice.
|
||||
type string struct {
|
||||
data *byte
|
||||
len int
|
||||
}
|
||||
ptr := (*string)(unsafe.Pointer(&s))
|
||||
ptr.data = &slice[0]
|
||||
ptr.len = len(slice)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func (d *decoder) bytes() []byte {
|
||||
len := d.int()
|
||||
r := d.s[:len:len]
|
||||
d.s = d.s[len:]
|
||||
return r
|
||||
}
|
||||
|
||||
func (d *decoder) binding() Binding {
|
||||
name := d.string()
|
||||
line := int32(d.int())
|
||||
col := int32(d.int())
|
||||
return Binding{Name: name, Pos: syntax.MakePosition(d.filename, line, col)}
|
||||
}
|
||||
|
||||
func (d *decoder) bindings() []Binding {
|
||||
bindings := make([]Binding, d.int())
|
||||
for i := range bindings {
|
||||
bindings[i] = d.binding()
|
||||
}
|
||||
return bindings
|
||||
}
|
||||
|
||||
func (d *decoder) ints() []int {
|
||||
ints := make([]int, d.int())
|
||||
for i := range ints {
|
||||
ints[i] = d.int()
|
||||
}
|
||||
return ints
|
||||
}
|
||||
|
||||
func (d *decoder) bool() bool { return d.int() != 0 }
|
||||
|
||||
func (d *decoder) function() *Funcode {
|
||||
id := d.binding()
|
||||
doc := d.string()
|
||||
code := d.bytes()
|
||||
pclinetab := make([]uint16, d.int())
|
||||
for i := range pclinetab {
|
||||
pclinetab[i] = uint16(d.int())
|
||||
}
|
||||
locals := d.bindings()
|
||||
cells := d.ints()
|
||||
freevars := d.bindings()
|
||||
maxStack := d.int()
|
||||
numParams := d.int()
|
||||
numKwonlyParams := d.int()
|
||||
hasVarargs := d.int() != 0
|
||||
hasKwargs := d.int() != 0
|
||||
return &Funcode{
|
||||
// Prog is filled in later.
|
||||
Pos: id.Pos,
|
||||
Name: id.Name,
|
||||
Doc: doc,
|
||||
Code: code,
|
||||
pclinetab: pclinetab,
|
||||
Locals: locals,
|
||||
Cells: cells,
|
||||
Freevars: freevars,
|
||||
MaxStack: maxStack,
|
||||
NumParams: numParams,
|
||||
NumKwonlyParams: numKwonlyParams,
|
||||
HasVarargs: hasVarargs,
|
||||
HasKwargs: hasKwargs,
|
||||
}
|
||||
}
|
||||
115
vendor/go.starlark.net/internal/spell/spell.go
generated
vendored
115
vendor/go.starlark.net/internal/spell/spell.go
generated
vendored
@@ -1,115 +0,0 @@
|
||||
// Package spell file defines a simple spelling checker for use in attribute errors
|
||||
// such as "no such field .foo; did you mean .food?".
|
||||
package spell
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// Nearest returns the element of candidates
|
||||
// nearest to x using the Levenshtein metric,
|
||||
// or "" if none were promising.
|
||||
func Nearest(x string, candidates []string) string {
|
||||
// Ignore underscores and case when matching.
|
||||
fold := func(s string) string {
|
||||
return strings.Map(func(r rune) rune {
|
||||
if r == '_' {
|
||||
return -1
|
||||
}
|
||||
return unicode.ToLower(r)
|
||||
}, s)
|
||||
}
|
||||
|
||||
x = fold(x)
|
||||
|
||||
var best string
|
||||
bestD := (len(x) + 1) / 2 // allow up to 50% typos
|
||||
for _, c := range candidates {
|
||||
d := levenshtein(x, fold(c), bestD)
|
||||
if d < bestD {
|
||||
bestD = d
|
||||
best = c
|
||||
}
|
||||
}
|
||||
return best
|
||||
}
|
||||
|
||||
// levenshtein returns the non-negative Levenshtein edit distance
|
||||
// between the byte strings x and y.
|
||||
//
|
||||
// If the computed distance exceeds max,
|
||||
// the function may return early with an approximate value > max.
|
||||
func levenshtein(x, y string, max int) int {
|
||||
// This implementation is derived from one by Laurent Le Brun in
|
||||
// Bazel that uses the single-row space efficiency trick
|
||||
// described at bitbucket.org/clearer/iosifovich.
|
||||
|
||||
// Let x be the shorter string.
|
||||
if len(x) > len(y) {
|
||||
x, y = y, x
|
||||
}
|
||||
|
||||
// Remove common prefix.
|
||||
for i := 0; i < len(x); i++ {
|
||||
if x[i] != y[i] {
|
||||
x = x[i:]
|
||||
y = y[i:]
|
||||
break
|
||||
}
|
||||
}
|
||||
if x == "" {
|
||||
return len(y)
|
||||
}
|
||||
|
||||
if d := abs(len(x) - len(y)); d > max {
|
||||
return d // excessive length divergence
|
||||
}
|
||||
|
||||
row := make([]int, len(y)+1)
|
||||
for i := range row {
|
||||
row[i] = i
|
||||
}
|
||||
|
||||
for i := 1; i <= len(x); i++ {
|
||||
row[0] = i
|
||||
best := i
|
||||
prev := i - 1
|
||||
for j := 1; j <= len(y); j++ {
|
||||
a := prev + b2i(x[i-1] != y[j-1]) // substitution
|
||||
b := 1 + row[j-1] // deletion
|
||||
c := 1 + row[j] // insertion
|
||||
k := min(a, min(b, c))
|
||||
prev, row[j] = row[j], k
|
||||
best = min(best, k)
|
||||
}
|
||||
if best > max {
|
||||
return best
|
||||
}
|
||||
}
|
||||
return row[len(y)]
|
||||
}
|
||||
|
||||
func b2i(b bool) int {
|
||||
if b {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func min(x, y int) int {
|
||||
if x < y {
|
||||
return x
|
||||
} else {
|
||||
return y
|
||||
}
|
||||
}
|
||||
|
||||
func abs(x int) int {
|
||||
if x >= 0 {
|
||||
return x
|
||||
} else {
|
||||
return -x
|
||||
}
|
||||
}
|
||||
74
vendor/go.starlark.net/resolve/binding.go
generated
vendored
74
vendor/go.starlark.net/resolve/binding.go
generated
vendored
@@ -1,74 +0,0 @@
|
||||
// Copyright 2019 The Bazel 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 resolve
|
||||
|
||||
import "go.starlark.net/syntax"
|
||||
|
||||
// This file defines resolver data types saved in the syntax tree.
|
||||
// We cannot guarantee API stability for these types
|
||||
// as they are closely tied to the implementation.
|
||||
|
||||
// A Binding contains resolver information about an identifer.
|
||||
// The resolver populates the Binding field of each syntax.Identifier.
|
||||
// The Binding ties together all identifiers that denote the same variable.
|
||||
type Binding struct {
|
||||
Scope Scope
|
||||
|
||||
// Index records the index into the enclosing
|
||||
// - {DefStmt,File}.Locals, if Scope==Local
|
||||
// - DefStmt.FreeVars, if Scope==Free
|
||||
// - File.Globals, if Scope==Global.
|
||||
// It is zero if Scope is Predeclared, Universal, or Undefined.
|
||||
Index int
|
||||
|
||||
First *syntax.Ident // first binding use (iff Scope==Local/Free/Global)
|
||||
}
|
||||
|
||||
// The Scope of Binding indicates what kind of scope it has.
|
||||
type Scope uint8
|
||||
|
||||
const (
|
||||
Undefined Scope = iota // name is not defined
|
||||
Local // name is local to its function or file
|
||||
Cell // name is function-local but shared with a nested function
|
||||
Free // name is cell of some enclosing function
|
||||
Global // name is global to module
|
||||
Predeclared // name is predeclared for this module (e.g. glob)
|
||||
Universal // name is universal (e.g. len)
|
||||
)
|
||||
|
||||
var scopeNames = [...]string{
|
||||
Undefined: "undefined",
|
||||
Local: "local",
|
||||
Cell: "cell",
|
||||
Free: "free",
|
||||
Global: "global",
|
||||
Predeclared: "predeclared",
|
||||
Universal: "universal",
|
||||
}
|
||||
|
||||
func (scope Scope) String() string { return scopeNames[scope] }
|
||||
|
||||
// A Module contains resolver information about a file.
|
||||
// The resolver populates the Module field of each syntax.File.
|
||||
type Module struct {
|
||||
Locals []*Binding // the file's (comprehension-)local variables
|
||||
Globals []*Binding // the file's global variables
|
||||
}
|
||||
|
||||
// A Function contains resolver information about a named or anonymous function.
|
||||
// The resolver populates the Function field of each syntax.DefStmt and syntax.LambdaExpr.
|
||||
type Function struct {
|
||||
Pos syntax.Position // of DEF or LAMBDA
|
||||
Name string // name of def, or "lambda"
|
||||
Params []syntax.Expr // param = ident | ident=expr | * | *ident | **ident
|
||||
Body []syntax.Stmt // contains synthetic 'return expr' for lambda
|
||||
|
||||
HasVarargs bool // whether params includes *args (convenience)
|
||||
HasKwargs bool // whether params includes **kwargs (convenience)
|
||||
NumKwonlyParams int // number of keyword-only optional parameters
|
||||
Locals []*Binding // this function's local/cell variables, parameters first
|
||||
FreeVars []*Binding // enclosing cells to capture in closure
|
||||
}
|
||||
969
vendor/go.starlark.net/resolve/resolve.go
generated
vendored
969
vendor/go.starlark.net/resolve/resolve.go
generated
vendored
@@ -1,969 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 resolve defines a name-resolution pass for Starlark abstract
|
||||
// syntax trees.
|
||||
//
|
||||
// The resolver sets the Locals and FreeVars arrays of each DefStmt and
|
||||
// the LocalIndex field of each syntax.Ident that refers to a local or
|
||||
// free variable. It also sets the Locals array of a File for locals
|
||||
// bound by top-level comprehensions and load statements.
|
||||
// Identifiers for global variables do not get an index.
|
||||
package resolve // import "go.starlark.net/resolve"
|
||||
|
||||
// All references to names are statically resolved. Names may be
|
||||
// predeclared, global, or local to a function or file.
|
||||
// File-local variables include those bound by top-level comprehensions
|
||||
// and by load statements. ("Top-level" means "outside of any function".)
|
||||
// The resolver maps each global name to a small integer and each local
|
||||
// name to a small integer; these integers enable a fast and compact
|
||||
// representation of globals and locals in the evaluator.
|
||||
//
|
||||
// As an optimization, the resolver classifies each predeclared name as
|
||||
// either universal (e.g. None, len) or per-module (e.g. glob in Bazel's
|
||||
// build language), enabling the evaluator to share the representation
|
||||
// of the universal environment across all modules.
|
||||
//
|
||||
// The lexical environment is a tree of blocks with the file block at
|
||||
// its root. The file's child blocks may be of two kinds: functions
|
||||
// and comprehensions, and these may have further children of either
|
||||
// kind.
|
||||
//
|
||||
// Python-style resolution requires multiple passes because a name is
|
||||
// determined to be local to a function only if the function contains a
|
||||
// "binding" use of it; similarly, a name is determined to be global (as
|
||||
// opposed to predeclared) if the module contains a top-level binding use.
|
||||
// Unlike ordinary top-level assignments, the bindings created by load
|
||||
// statements are local to the file block.
|
||||
// A non-binding use may lexically precede the binding to which it is resolved.
|
||||
// In the first pass, we inspect each function, recording in
|
||||
// 'uses' each identifier and the environment block in which it occurs.
|
||||
// If a use of a name is binding, such as a function parameter or
|
||||
// assignment, we add the name to the block's bindings mapping and add a
|
||||
// local variable to the enclosing function.
|
||||
//
|
||||
// As we finish resolving each function, we inspect all the uses within
|
||||
// that function and discard ones that were found to be function-local. The
|
||||
// remaining ones must be either free (local to some lexically enclosing
|
||||
// function), or top-level (global, predeclared, or file-local), but we cannot tell
|
||||
// which until we have finished inspecting the outermost enclosing
|
||||
// function. At that point, we can distinguish local from top-level names
|
||||
// (and this is when Python would compute free variables).
|
||||
//
|
||||
// However, Starlark additionally requires that all references to global
|
||||
// names are satisfied by some declaration in the current module;
|
||||
// Starlark permits a function to forward-reference a global or file-local
|
||||
// that has not
|
||||
// been declared yet so long as it is declared before the end of the
|
||||
// module. So, instead of re-resolving the unresolved references after
|
||||
// each top-level function, we defer this until the end of the module
|
||||
// and ensure that all such references are satisfied by some definition.
|
||||
//
|
||||
// At the end of the module, we visit each of the nested function blocks
|
||||
// in bottom-up order, doing a recursive lexical lookup for each
|
||||
// unresolved name. If the name is found to be local to some enclosing
|
||||
// function, we must create a DefStmt.FreeVar (capture) parameter for
|
||||
// each intervening function. We enter these synthetic bindings into
|
||||
// the bindings map so that we create at most one freevar per name. If
|
||||
// the name was not local, we check that it was defined at module level.
|
||||
//
|
||||
// We resolve all uses of locals in the module (due to load statements
|
||||
// and comprehensions) in a similar way and compute the file's set of
|
||||
// local variables.
|
||||
//
|
||||
// Starlark enforces that all global names are assigned at most once on
|
||||
// all control flow paths by forbidding if/else statements and loops at
|
||||
// top level. A global may be used before it is defined, leading to a
|
||||
// dynamic error. However, the AllowGlobalReassign flag (really: allow
|
||||
// top-level reassign) makes the resolver allow multiple to a variable
|
||||
// at top-level. It also allows if-, for-, and while-loops at top-level,
|
||||
// which in turn may make the evaluator dynamically assign multiple
|
||||
// values to a variable at top-level. (These two roles should be separated.)
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.starlark.net/internal/spell"
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
const debug = false
|
||||
const doesnt = "this Starlark dialect does not "
|
||||
|
||||
// global options
|
||||
// These features are either not standard Starlark (yet), or deprecated
|
||||
// features of the BUILD language, so we put them behind flags.
|
||||
var (
|
||||
AllowSet = false // allow the 'set' built-in
|
||||
AllowGlobalReassign = false // allow reassignment to top-level names; also, allow if/for/while at top-level
|
||||
AllowRecursion = false // allow while statements and recursive functions
|
||||
LoadBindsGlobally = false // load creates global not file-local bindings (deprecated)
|
||||
|
||||
// obsolete flags for features that are now standard. No effect.
|
||||
AllowNestedDef = true
|
||||
AllowLambda = true
|
||||
AllowFloat = true
|
||||
AllowBitwise = true
|
||||
)
|
||||
|
||||
// File resolves the specified file and records information about the
|
||||
// module in file.Module.
|
||||
//
|
||||
// The isPredeclared and isUniversal predicates report whether a name is
|
||||
// a pre-declared identifier (visible in the current module) or a
|
||||
// universal identifier (visible in every module).
|
||||
// Clients should typically pass predeclared.Has for the first and
|
||||
// starlark.Universe.Has for the second, where predeclared is the
|
||||
// module's StringDict of predeclared names and starlark.Universe is the
|
||||
// standard set of built-ins.
|
||||
// The isUniverse predicate is supplied a parameter to avoid a cyclic
|
||||
// dependency upon starlark.Universe, not because users should ever need
|
||||
// to redefine it.
|
||||
func File(file *syntax.File, isPredeclared, isUniversal func(name string) bool) error {
|
||||
return REPLChunk(file, nil, isPredeclared, isUniversal)
|
||||
}
|
||||
|
||||
// REPLChunk is a generalization of the File function that supports a
|
||||
// non-empty initial global block, as occurs in a REPL.
|
||||
func REPLChunk(file *syntax.File, isGlobal, isPredeclared, isUniversal func(name string) bool) error {
|
||||
r := newResolver(isGlobal, isPredeclared, isUniversal)
|
||||
r.stmts(file.Stmts)
|
||||
|
||||
r.env.resolveLocalUses()
|
||||
|
||||
// At the end of the module, resolve all non-local variable references,
|
||||
// computing closures.
|
||||
// Function bodies may contain forward references to later global declarations.
|
||||
r.resolveNonLocalUses(r.env)
|
||||
|
||||
file.Module = &Module{
|
||||
Locals: r.moduleLocals,
|
||||
Globals: r.moduleGlobals,
|
||||
}
|
||||
|
||||
if len(r.errors) > 0 {
|
||||
return r.errors
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Expr resolves the specified expression.
|
||||
// It returns the local variables bound within the expression.
|
||||
//
|
||||
// The isPredeclared and isUniversal predicates behave as for the File function.
|
||||
func Expr(expr syntax.Expr, isPredeclared, isUniversal func(name string) bool) ([]*Binding, error) {
|
||||
r := newResolver(nil, isPredeclared, isUniversal)
|
||||
r.expr(expr)
|
||||
r.env.resolveLocalUses()
|
||||
r.resolveNonLocalUses(r.env) // globals & universals
|
||||
if len(r.errors) > 0 {
|
||||
return nil, r.errors
|
||||
}
|
||||
return r.moduleLocals, nil
|
||||
}
|
||||
|
||||
// An ErrorList is a non-empty list of resolver error messages.
|
||||
type ErrorList []Error // len > 0
|
||||
|
||||
func (e ErrorList) Error() string { return e[0].Error() }
|
||||
|
||||
// An Error describes the nature and position of a resolver error.
|
||||
type Error struct {
|
||||
Pos syntax.Position
|
||||
Msg string
|
||||
}
|
||||
|
||||
func (e Error) Error() string { return e.Pos.String() + ": " + e.Msg }
|
||||
|
||||
func newResolver(isGlobal, isPredeclared, isUniversal func(name string) bool) *resolver {
|
||||
file := new(block)
|
||||
return &resolver{
|
||||
file: file,
|
||||
env: file,
|
||||
isGlobal: isGlobal,
|
||||
isPredeclared: isPredeclared,
|
||||
isUniversal: isUniversal,
|
||||
globals: make(map[string]*Binding),
|
||||
predeclared: make(map[string]*Binding),
|
||||
}
|
||||
}
|
||||
|
||||
type resolver struct {
|
||||
// env is the current local environment:
|
||||
// a linked list of blocks, innermost first.
|
||||
// The tail of the list is the file block.
|
||||
env *block
|
||||
file *block // file block (contains load bindings)
|
||||
|
||||
// moduleLocals contains the local variables of the module
|
||||
// (due to load statements and comprehensions outside any function).
|
||||
// moduleGlobals contains the global variables of the module.
|
||||
moduleLocals []*Binding
|
||||
moduleGlobals []*Binding
|
||||
|
||||
// globals maps each global name in the module to its binding.
|
||||
// predeclared does the same for predeclared and universal names.
|
||||
globals map[string]*Binding
|
||||
predeclared map[string]*Binding
|
||||
|
||||
// These predicates report whether a name is
|
||||
// pre-declared, either in this module or universally,
|
||||
// or already declared in the module globals (as in a REPL).
|
||||
// isGlobal may be nil.
|
||||
isGlobal, isPredeclared, isUniversal func(name string) bool
|
||||
|
||||
loops int // number of enclosing for/while loops
|
||||
ifstmts int // number of enclosing if statements loops
|
||||
|
||||
errors ErrorList
|
||||
}
|
||||
|
||||
// container returns the innermost enclosing "container" block:
|
||||
// a function (function != nil) or file (function == nil).
|
||||
// Container blocks accumulate local variable bindings.
|
||||
func (r *resolver) container() *block {
|
||||
for b := r.env; ; b = b.parent {
|
||||
if b.function != nil || b == r.file {
|
||||
return b
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) push(b *block) {
|
||||
r.env.children = append(r.env.children, b)
|
||||
b.parent = r.env
|
||||
r.env = b
|
||||
}
|
||||
|
||||
func (r *resolver) pop() { r.env = r.env.parent }
|
||||
|
||||
type block struct {
|
||||
parent *block // nil for file block
|
||||
|
||||
// In the file (root) block, both these fields are nil.
|
||||
function *Function // only for function blocks
|
||||
comp *syntax.Comprehension // only for comprehension blocks
|
||||
|
||||
// bindings maps a name to its binding.
|
||||
// A local binding has an index into its innermost enclosing container's locals array.
|
||||
// A free binding has an index into its innermost enclosing function's freevars array.
|
||||
bindings map[string]*Binding
|
||||
|
||||
// children records the child blocks of the current one.
|
||||
children []*block
|
||||
|
||||
// uses records all identifiers seen in this container (function or file),
|
||||
// and a reference to the environment in which they appear.
|
||||
// As we leave each container block, we resolve them,
|
||||
// so that only free and global ones remain.
|
||||
// At the end of each top-level function we compute closures.
|
||||
uses []use
|
||||
}
|
||||
|
||||
func (b *block) bind(name string, bind *Binding) {
|
||||
if b.bindings == nil {
|
||||
b.bindings = make(map[string]*Binding)
|
||||
}
|
||||
b.bindings[name] = bind
|
||||
}
|
||||
|
||||
func (b *block) String() string {
|
||||
if b.function != nil {
|
||||
return "function block at " + fmt.Sprint(b.function.Pos)
|
||||
}
|
||||
if b.comp != nil {
|
||||
return "comprehension block at " + fmt.Sprint(b.comp.Span())
|
||||
}
|
||||
return "file block"
|
||||
}
|
||||
|
||||
func (r *resolver) errorf(posn syntax.Position, format string, args ...interface{}) {
|
||||
r.errors = append(r.errors, Error{posn, fmt.Sprintf(format, args...)})
|
||||
}
|
||||
|
||||
// A use records an identifier and the environment in which it appears.
|
||||
type use struct {
|
||||
id *syntax.Ident
|
||||
env *block
|
||||
}
|
||||
|
||||
// bind creates a binding for id: a global (not file-local)
|
||||
// binding at top-level, a local binding otherwise.
|
||||
// At top-level, it reports an error if a global or file-local
|
||||
// binding already exists, unless AllowGlobalReassign.
|
||||
// It sets id.Binding to the binding (whether old or new),
|
||||
// and returns whether a binding already existed.
|
||||
func (r *resolver) bind(id *syntax.Ident) bool {
|
||||
// Binding outside any local (comprehension/function) block?
|
||||
if r.env == r.file {
|
||||
bind, ok := r.file.bindings[id.Name]
|
||||
if !ok {
|
||||
bind, ok = r.globals[id.Name]
|
||||
if !ok {
|
||||
// first global binding of this name
|
||||
bind = &Binding{
|
||||
First: id,
|
||||
Scope: Global,
|
||||
Index: len(r.moduleGlobals),
|
||||
}
|
||||
r.globals[id.Name] = bind
|
||||
r.moduleGlobals = append(r.moduleGlobals, bind)
|
||||
}
|
||||
}
|
||||
if ok && !AllowGlobalReassign {
|
||||
r.errorf(id.NamePos, "cannot reassign %s %s declared at %s",
|
||||
bind.Scope, id.Name, bind.First.NamePos)
|
||||
}
|
||||
id.Binding = bind
|
||||
return ok
|
||||
}
|
||||
|
||||
return r.bindLocal(id)
|
||||
}
|
||||
|
||||
func (r *resolver) bindLocal(id *syntax.Ident) bool {
|
||||
// Mark this name as local to current block.
|
||||
// Assign it a new local (positive) index in the current container.
|
||||
_, ok := r.env.bindings[id.Name]
|
||||
if !ok {
|
||||
var locals *[]*Binding
|
||||
if fn := r.container().function; fn != nil {
|
||||
locals = &fn.Locals
|
||||
} else {
|
||||
locals = &r.moduleLocals
|
||||
}
|
||||
bind := &Binding{
|
||||
First: id,
|
||||
Scope: Local,
|
||||
Index: len(*locals),
|
||||
}
|
||||
r.env.bind(id.Name, bind)
|
||||
*locals = append(*locals, bind)
|
||||
}
|
||||
|
||||
r.use(id)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (r *resolver) use(id *syntax.Ident) {
|
||||
use := use{id, r.env}
|
||||
|
||||
// The spec says that if there is a global binding of a name
|
||||
// then all references to that name in that block refer to the
|
||||
// global, even if the use precedes the def---just as for locals.
|
||||
// For example, in this code,
|
||||
//
|
||||
// print(len); len=1; print(len)
|
||||
//
|
||||
// both occurrences of len refer to the len=1 binding, which
|
||||
// completely shadows the predeclared len function.
|
||||
//
|
||||
// The rationale for these semantics, which differ from Python,
|
||||
// is that the static meaning of len (a reference to a global)
|
||||
// does not change depending on where it appears in the file.
|
||||
// Of course, its dynamic meaning does change, from an error
|
||||
// into a valid reference, so it's not clear these semantics
|
||||
// have any practical advantage.
|
||||
//
|
||||
// In any case, the Bazel implementation lags behind the spec
|
||||
// and follows Python behavior, so the first use of len refers
|
||||
// to the predeclared function. This typically used in a BUILD
|
||||
// file that redefines a predeclared name half way through,
|
||||
// for example:
|
||||
//
|
||||
// proto_library(...) # built-in rule
|
||||
// load("myproto.bzl", "proto_library")
|
||||
// proto_library(...) # user-defined rule
|
||||
//
|
||||
// We will piggyback support for the legacy semantics on the
|
||||
// AllowGlobalReassign flag, which is loosely related and also
|
||||
// required for Bazel.
|
||||
if AllowGlobalReassign && r.env == r.file {
|
||||
r.useToplevel(use)
|
||||
return
|
||||
}
|
||||
|
||||
b := r.container()
|
||||
b.uses = append(b.uses, use)
|
||||
}
|
||||
|
||||
// useToplevel resolves use.id as a reference to a name visible at top-level.
|
||||
// The use.env field captures the original environment for error reporting.
|
||||
func (r *resolver) useToplevel(use use) (bind *Binding) {
|
||||
id := use.id
|
||||
|
||||
if prev, ok := r.file.bindings[id.Name]; ok {
|
||||
// use of load-defined name in file block
|
||||
bind = prev
|
||||
} else if prev, ok := r.globals[id.Name]; ok {
|
||||
// use of global declared by module
|
||||
bind = prev
|
||||
} else if r.isGlobal != nil && r.isGlobal(id.Name) {
|
||||
// use of global defined in a previous REPL chunk
|
||||
bind = &Binding{
|
||||
First: id, // wrong: this is not even a binding use
|
||||
Scope: Global,
|
||||
Index: len(r.moduleGlobals),
|
||||
}
|
||||
r.globals[id.Name] = bind
|
||||
r.moduleGlobals = append(r.moduleGlobals, bind)
|
||||
} else if prev, ok := r.predeclared[id.Name]; ok {
|
||||
// repeated use of predeclared or universal
|
||||
bind = prev
|
||||
} else if r.isPredeclared(id.Name) {
|
||||
// use of pre-declared name
|
||||
bind = &Binding{Scope: Predeclared}
|
||||
r.predeclared[id.Name] = bind // save it
|
||||
} else if r.isUniversal(id.Name) {
|
||||
// use of universal name
|
||||
if !AllowSet && id.Name == "set" {
|
||||
r.errorf(id.NamePos, doesnt+"support sets")
|
||||
}
|
||||
bind = &Binding{Scope: Universal}
|
||||
r.predeclared[id.Name] = bind // save it
|
||||
} else {
|
||||
bind = &Binding{Scope: Undefined}
|
||||
var hint string
|
||||
if n := r.spellcheck(use); n != "" {
|
||||
hint = fmt.Sprintf(" (did you mean %s?)", n)
|
||||
}
|
||||
r.errorf(id.NamePos, "undefined: %s%s", id.Name, hint)
|
||||
}
|
||||
id.Binding = bind
|
||||
return bind
|
||||
}
|
||||
|
||||
// spellcheck returns the most likely misspelling of
|
||||
// the name use.id in the environment use.env.
|
||||
func (r *resolver) spellcheck(use use) string {
|
||||
var names []string
|
||||
|
||||
// locals
|
||||
for b := use.env; b != nil; b = b.parent {
|
||||
for name := range b.bindings {
|
||||
names = append(names, name)
|
||||
}
|
||||
}
|
||||
|
||||
// globals
|
||||
//
|
||||
// We have no way to enumerate the sets whose membership
|
||||
// tests are isPredeclared, isUniverse, and isGlobal,
|
||||
// which includes prior names in the REPL session.
|
||||
for _, bind := range r.moduleGlobals {
|
||||
names = append(names, bind.First.Name)
|
||||
}
|
||||
|
||||
sort.Strings(names)
|
||||
return spell.Nearest(use.id.Name, names)
|
||||
}
|
||||
|
||||
// resolveLocalUses is called when leaving a container (function/module)
|
||||
// block. It resolves all uses of locals/cells within that block.
|
||||
func (b *block) resolveLocalUses() {
|
||||
unresolved := b.uses[:0]
|
||||
for _, use := range b.uses {
|
||||
if bind := lookupLocal(use); bind != nil && (bind.Scope == Local || bind.Scope == Cell) {
|
||||
use.id.Binding = bind
|
||||
} else {
|
||||
unresolved = append(unresolved, use)
|
||||
}
|
||||
}
|
||||
b.uses = unresolved
|
||||
}
|
||||
|
||||
func (r *resolver) stmts(stmts []syntax.Stmt) {
|
||||
for _, stmt := range stmts {
|
||||
r.stmt(stmt)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) stmt(stmt syntax.Stmt) {
|
||||
switch stmt := stmt.(type) {
|
||||
case *syntax.ExprStmt:
|
||||
r.expr(stmt.X)
|
||||
|
||||
case *syntax.BranchStmt:
|
||||
if r.loops == 0 && (stmt.Token == syntax.BREAK || stmt.Token == syntax.CONTINUE) {
|
||||
r.errorf(stmt.TokenPos, "%s not in a loop", stmt.Token)
|
||||
}
|
||||
|
||||
case *syntax.IfStmt:
|
||||
if !AllowGlobalReassign && r.container().function == nil {
|
||||
r.errorf(stmt.If, "if statement not within a function")
|
||||
}
|
||||
r.expr(stmt.Cond)
|
||||
r.ifstmts++
|
||||
r.stmts(stmt.True)
|
||||
r.stmts(stmt.False)
|
||||
r.ifstmts--
|
||||
|
||||
case *syntax.AssignStmt:
|
||||
r.expr(stmt.RHS)
|
||||
isAugmented := stmt.Op != syntax.EQ
|
||||
r.assign(stmt.LHS, isAugmented)
|
||||
|
||||
case *syntax.DefStmt:
|
||||
r.bind(stmt.Name)
|
||||
fn := &Function{
|
||||
Name: stmt.Name.Name,
|
||||
Pos: stmt.Def,
|
||||
Params: stmt.Params,
|
||||
Body: stmt.Body,
|
||||
}
|
||||
stmt.Function = fn
|
||||
r.function(fn, stmt.Def)
|
||||
|
||||
case *syntax.ForStmt:
|
||||
if !AllowGlobalReassign && r.container().function == nil {
|
||||
r.errorf(stmt.For, "for loop not within a function")
|
||||
}
|
||||
r.expr(stmt.X)
|
||||
const isAugmented = false
|
||||
r.assign(stmt.Vars, isAugmented)
|
||||
r.loops++
|
||||
r.stmts(stmt.Body)
|
||||
r.loops--
|
||||
|
||||
case *syntax.WhileStmt:
|
||||
if !AllowRecursion {
|
||||
r.errorf(stmt.While, doesnt+"support while loops")
|
||||
}
|
||||
if !AllowGlobalReassign && r.container().function == nil {
|
||||
r.errorf(stmt.While, "while loop not within a function")
|
||||
}
|
||||
r.expr(stmt.Cond)
|
||||
r.loops++
|
||||
r.stmts(stmt.Body)
|
||||
r.loops--
|
||||
|
||||
case *syntax.ReturnStmt:
|
||||
if r.container().function == nil {
|
||||
r.errorf(stmt.Return, "return statement not within a function")
|
||||
}
|
||||
if stmt.Result != nil {
|
||||
r.expr(stmt.Result)
|
||||
}
|
||||
|
||||
case *syntax.LoadStmt:
|
||||
// A load statement may not be nested in any other statement.
|
||||
if r.container().function != nil {
|
||||
r.errorf(stmt.Load, "load statement within a function")
|
||||
} else if r.loops > 0 {
|
||||
r.errorf(stmt.Load, "load statement within a loop")
|
||||
} else if r.ifstmts > 0 {
|
||||
r.errorf(stmt.Load, "load statement within a conditional")
|
||||
}
|
||||
|
||||
for i, from := range stmt.From {
|
||||
if from.Name == "" {
|
||||
r.errorf(from.NamePos, "load: empty identifier")
|
||||
continue
|
||||
}
|
||||
if from.Name[0] == '_' {
|
||||
r.errorf(from.NamePos, "load: names with leading underscores are not exported: %s", from.Name)
|
||||
}
|
||||
|
||||
id := stmt.To[i]
|
||||
if LoadBindsGlobally {
|
||||
r.bind(id)
|
||||
} else if r.bindLocal(id) && !AllowGlobalReassign {
|
||||
// "Global" in AllowGlobalReassign is a misnomer for "toplevel".
|
||||
// Sadly we can't report the previous declaration
|
||||
// as id.Binding may not be set yet.
|
||||
r.errorf(id.NamePos, "cannot reassign top-level %s", id.Name)
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
log.Panicf("unexpected stmt %T", stmt)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) assign(lhs syntax.Expr, isAugmented bool) {
|
||||
switch lhs := lhs.(type) {
|
||||
case *syntax.Ident:
|
||||
// x = ...
|
||||
r.bind(lhs)
|
||||
|
||||
case *syntax.IndexExpr:
|
||||
// x[i] = ...
|
||||
r.expr(lhs.X)
|
||||
r.expr(lhs.Y)
|
||||
|
||||
case *syntax.DotExpr:
|
||||
// x.f = ...
|
||||
r.expr(lhs.X)
|
||||
|
||||
case *syntax.TupleExpr:
|
||||
// (x, y) = ...
|
||||
if isAugmented {
|
||||
r.errorf(syntax.Start(lhs), "can't use tuple expression in augmented assignment")
|
||||
}
|
||||
for _, elem := range lhs.List {
|
||||
r.assign(elem, isAugmented)
|
||||
}
|
||||
|
||||
case *syntax.ListExpr:
|
||||
// [x, y, z] = ...
|
||||
if isAugmented {
|
||||
r.errorf(syntax.Start(lhs), "can't use list expression in augmented assignment")
|
||||
}
|
||||
for _, elem := range lhs.List {
|
||||
r.assign(elem, isAugmented)
|
||||
}
|
||||
|
||||
case *syntax.ParenExpr:
|
||||
r.assign(lhs.X, isAugmented)
|
||||
|
||||
default:
|
||||
name := strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", lhs), "*syntax."))
|
||||
r.errorf(syntax.Start(lhs), "can't assign to %s", name)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) expr(e syntax.Expr) {
|
||||
switch e := e.(type) {
|
||||
case *syntax.Ident:
|
||||
r.use(e)
|
||||
|
||||
case *syntax.Literal:
|
||||
|
||||
case *syntax.ListExpr:
|
||||
for _, x := range e.List {
|
||||
r.expr(x)
|
||||
}
|
||||
|
||||
case *syntax.CondExpr:
|
||||
r.expr(e.Cond)
|
||||
r.expr(e.True)
|
||||
r.expr(e.False)
|
||||
|
||||
case *syntax.IndexExpr:
|
||||
r.expr(e.X)
|
||||
r.expr(e.Y)
|
||||
|
||||
case *syntax.DictEntry:
|
||||
r.expr(e.Key)
|
||||
r.expr(e.Value)
|
||||
|
||||
case *syntax.SliceExpr:
|
||||
r.expr(e.X)
|
||||
if e.Lo != nil {
|
||||
r.expr(e.Lo)
|
||||
}
|
||||
if e.Hi != nil {
|
||||
r.expr(e.Hi)
|
||||
}
|
||||
if e.Step != nil {
|
||||
r.expr(e.Step)
|
||||
}
|
||||
|
||||
case *syntax.Comprehension:
|
||||
// The 'in' operand of the first clause (always a ForClause)
|
||||
// is resolved in the outer block; consider: [x for x in x].
|
||||
clause := e.Clauses[0].(*syntax.ForClause)
|
||||
r.expr(clause.X)
|
||||
|
||||
// A list/dict comprehension defines a new lexical block.
|
||||
// Locals defined within the block will be allotted
|
||||
// distinct slots in the locals array of the innermost
|
||||
// enclosing container (function/module) block.
|
||||
r.push(&block{comp: e})
|
||||
|
||||
const isAugmented = false
|
||||
r.assign(clause.Vars, isAugmented)
|
||||
|
||||
for _, clause := range e.Clauses[1:] {
|
||||
switch clause := clause.(type) {
|
||||
case *syntax.IfClause:
|
||||
r.expr(clause.Cond)
|
||||
case *syntax.ForClause:
|
||||
r.assign(clause.Vars, isAugmented)
|
||||
r.expr(clause.X)
|
||||
}
|
||||
}
|
||||
r.expr(e.Body) // body may be *DictEntry
|
||||
r.pop()
|
||||
|
||||
case *syntax.TupleExpr:
|
||||
for _, x := range e.List {
|
||||
r.expr(x)
|
||||
}
|
||||
|
||||
case *syntax.DictExpr:
|
||||
for _, entry := range e.List {
|
||||
entry := entry.(*syntax.DictEntry)
|
||||
r.expr(entry.Key)
|
||||
r.expr(entry.Value)
|
||||
}
|
||||
|
||||
case *syntax.UnaryExpr:
|
||||
r.expr(e.X)
|
||||
|
||||
case *syntax.BinaryExpr:
|
||||
r.expr(e.X)
|
||||
r.expr(e.Y)
|
||||
|
||||
case *syntax.DotExpr:
|
||||
r.expr(e.X)
|
||||
// ignore e.Name
|
||||
|
||||
case *syntax.CallExpr:
|
||||
r.expr(e.Fn)
|
||||
var seenVarargs, seenKwargs bool
|
||||
var seenName map[string]bool
|
||||
var n, p int
|
||||
for _, arg := range e.Args {
|
||||
pos, _ := arg.Span()
|
||||
if unop, ok := arg.(*syntax.UnaryExpr); ok && unop.Op == syntax.STARSTAR {
|
||||
// **kwargs
|
||||
if seenKwargs {
|
||||
r.errorf(pos, "multiple **kwargs not allowed")
|
||||
}
|
||||
seenKwargs = true
|
||||
r.expr(arg)
|
||||
} else if ok && unop.Op == syntax.STAR {
|
||||
// *args
|
||||
if seenKwargs {
|
||||
r.errorf(pos, "*args may not follow **kwargs")
|
||||
} else if seenVarargs {
|
||||
r.errorf(pos, "multiple *args not allowed")
|
||||
}
|
||||
seenVarargs = true
|
||||
r.expr(arg)
|
||||
} else if binop, ok := arg.(*syntax.BinaryExpr); ok && binop.Op == syntax.EQ {
|
||||
// k=v
|
||||
n++
|
||||
if seenKwargs {
|
||||
r.errorf(pos, "keyword argument may not follow **kwargs")
|
||||
} else if seenVarargs {
|
||||
r.errorf(pos, "keyword argument may not follow *args")
|
||||
}
|
||||
x := binop.X.(*syntax.Ident)
|
||||
if seenName[x.Name] {
|
||||
r.errorf(x.NamePos, "keyword argument %q is repeated", x.Name)
|
||||
} else {
|
||||
if seenName == nil {
|
||||
seenName = make(map[string]bool)
|
||||
}
|
||||
seenName[x.Name] = true
|
||||
}
|
||||
r.expr(binop.Y)
|
||||
} else {
|
||||
// positional argument
|
||||
p++
|
||||
if seenVarargs {
|
||||
r.errorf(pos, "positional argument may not follow *args")
|
||||
} else if seenKwargs {
|
||||
r.errorf(pos, "positional argument may not follow **kwargs")
|
||||
} else if len(seenName) > 0 {
|
||||
r.errorf(pos, "positional argument may not follow named")
|
||||
}
|
||||
r.expr(arg)
|
||||
}
|
||||
}
|
||||
|
||||
// Fail gracefully if compiler-imposed limit is exceeded.
|
||||
if p >= 256 {
|
||||
pos, _ := e.Span()
|
||||
r.errorf(pos, "%v positional arguments in call, limit is 255", p)
|
||||
}
|
||||
if n >= 256 {
|
||||
pos, _ := e.Span()
|
||||
r.errorf(pos, "%v keyword arguments in call, limit is 255", n)
|
||||
}
|
||||
|
||||
case *syntax.LambdaExpr:
|
||||
fn := &Function{
|
||||
Name: "lambda",
|
||||
Pos: e.Lambda,
|
||||
Params: e.Params,
|
||||
Body: []syntax.Stmt{&syntax.ReturnStmt{Result: e.Body}},
|
||||
}
|
||||
e.Function = fn
|
||||
r.function(fn, e.Lambda)
|
||||
|
||||
case *syntax.ParenExpr:
|
||||
r.expr(e.X)
|
||||
|
||||
default:
|
||||
log.Panicf("unexpected expr %T", e)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) function(function *Function, pos syntax.Position) {
|
||||
// Resolve defaults in enclosing environment.
|
||||
for _, param := range function.Params {
|
||||
if binary, ok := param.(*syntax.BinaryExpr); ok {
|
||||
r.expr(binary.Y)
|
||||
}
|
||||
}
|
||||
|
||||
// Enter function block.
|
||||
b := &block{function: function}
|
||||
r.push(b)
|
||||
|
||||
var seenOptional bool
|
||||
var star *syntax.UnaryExpr // * or *args param
|
||||
var starStar *syntax.Ident // **kwargs ident
|
||||
var numKwonlyParams int
|
||||
for _, param := range function.Params {
|
||||
switch param := param.(type) {
|
||||
case *syntax.Ident:
|
||||
// e.g. x
|
||||
if starStar != nil {
|
||||
r.errorf(param.NamePos, "required parameter may not follow **%s", starStar.Name)
|
||||
} else if star != nil {
|
||||
numKwonlyParams++
|
||||
} else if seenOptional {
|
||||
r.errorf(param.NamePos, "required parameter may not follow optional")
|
||||
}
|
||||
if r.bind(param) {
|
||||
r.errorf(param.NamePos, "duplicate parameter: %s", param.Name)
|
||||
}
|
||||
|
||||
case *syntax.BinaryExpr:
|
||||
// e.g. y=dflt
|
||||
if starStar != nil {
|
||||
r.errorf(param.OpPos, "optional parameter may not follow **%s", starStar.Name)
|
||||
} else if star != nil {
|
||||
numKwonlyParams++
|
||||
}
|
||||
if id := param.X.(*syntax.Ident); r.bind(id) {
|
||||
r.errorf(param.OpPos, "duplicate parameter: %s", id.Name)
|
||||
}
|
||||
seenOptional = true
|
||||
|
||||
case *syntax.UnaryExpr:
|
||||
// * or *args or **kwargs
|
||||
if param.Op == syntax.STAR {
|
||||
if starStar != nil {
|
||||
r.errorf(param.OpPos, "* parameter may not follow **%s", starStar.Name)
|
||||
} else if star != nil {
|
||||
r.errorf(param.OpPos, "multiple * parameters not allowed")
|
||||
} else {
|
||||
star = param
|
||||
}
|
||||
} else {
|
||||
if starStar != nil {
|
||||
r.errorf(param.OpPos, "multiple ** parameters not allowed")
|
||||
}
|
||||
starStar = param.X.(*syntax.Ident)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Bind the *args and **kwargs parameters at the end,
|
||||
// so that regular parameters a/b/c are contiguous and
|
||||
// there is no hole for the "*":
|
||||
// def f(a, b, *args, c=0, **kwargs)
|
||||
// def f(a, b, *, c=0, **kwargs)
|
||||
if star != nil {
|
||||
if id, _ := star.X.(*syntax.Ident); id != nil {
|
||||
// *args
|
||||
if r.bind(id) {
|
||||
r.errorf(id.NamePos, "duplicate parameter: %s", id.Name)
|
||||
}
|
||||
function.HasVarargs = true
|
||||
} else if numKwonlyParams == 0 {
|
||||
r.errorf(star.OpPos, "bare * must be followed by keyword-only parameters")
|
||||
}
|
||||
}
|
||||
if starStar != nil {
|
||||
if r.bind(starStar) {
|
||||
r.errorf(starStar.NamePos, "duplicate parameter: %s", starStar.Name)
|
||||
}
|
||||
function.HasKwargs = true
|
||||
}
|
||||
|
||||
function.NumKwonlyParams = numKwonlyParams
|
||||
r.stmts(function.Body)
|
||||
|
||||
// Resolve all uses of this function's local vars,
|
||||
// and keep just the remaining uses of free/global vars.
|
||||
b.resolveLocalUses()
|
||||
|
||||
// Leave function block.
|
||||
r.pop()
|
||||
|
||||
// References within the function body to globals are not
|
||||
// resolved until the end of the module.
|
||||
}
|
||||
|
||||
func (r *resolver) resolveNonLocalUses(b *block) {
|
||||
// First resolve inner blocks.
|
||||
for _, child := range b.children {
|
||||
r.resolveNonLocalUses(child)
|
||||
}
|
||||
for _, use := range b.uses {
|
||||
use.id.Binding = r.lookupLexical(use, use.env)
|
||||
}
|
||||
}
|
||||
|
||||
// lookupLocal looks up an identifier within its immediately enclosing function.
|
||||
func lookupLocal(use use) *Binding {
|
||||
for env := use.env; env != nil; env = env.parent {
|
||||
if bind, ok := env.bindings[use.id.Name]; ok {
|
||||
if bind.Scope == Free {
|
||||
// shouldn't exist till later
|
||||
log.Panicf("%s: internal error: %s, %v", use.id.NamePos, use.id.Name, bind)
|
||||
}
|
||||
return bind // found
|
||||
}
|
||||
if env.function != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil // not found in this function
|
||||
}
|
||||
|
||||
// lookupLexical looks up an identifier use.id within its lexically enclosing environment.
|
||||
// The use.env field captures the original environment for error reporting.
|
||||
func (r *resolver) lookupLexical(use use, env *block) (bind *Binding) {
|
||||
if debug {
|
||||
fmt.Printf("lookupLexical %s in %s = ...\n", use.id.Name, env)
|
||||
defer func() { fmt.Printf("= %v\n", bind) }()
|
||||
}
|
||||
|
||||
// Is this the file block?
|
||||
if env == r.file {
|
||||
return r.useToplevel(use) // file-local, global, predeclared, or not found
|
||||
}
|
||||
|
||||
// Defined in this block?
|
||||
bind, ok := env.bindings[use.id.Name]
|
||||
if !ok {
|
||||
// Defined in parent block?
|
||||
bind = r.lookupLexical(use, env.parent)
|
||||
if env.function != nil && (bind.Scope == Local || bind.Scope == Free || bind.Scope == Cell) {
|
||||
// Found in parent block, which belongs to enclosing function.
|
||||
// Add the parent's binding to the function's freevars,
|
||||
// and add a new 'free' binding to the inner function's block,
|
||||
// and turn the parent's local into cell.
|
||||
if bind.Scope == Local {
|
||||
bind.Scope = Cell
|
||||
}
|
||||
index := len(env.function.FreeVars)
|
||||
env.function.FreeVars = append(env.function.FreeVars, bind)
|
||||
bind = &Binding{
|
||||
First: bind.First,
|
||||
Scope: Free,
|
||||
Index: index,
|
||||
}
|
||||
if debug {
|
||||
fmt.Printf("creating freevar %v in function at %s: %s\n",
|
||||
len(env.function.FreeVars), env.function.Pos, use.id.Name)
|
||||
}
|
||||
}
|
||||
|
||||
// Memoize, to avoid duplicate free vars
|
||||
// and redundant global (failing) lookups.
|
||||
env.bind(use.id.Name, bind)
|
||||
}
|
||||
return bind
|
||||
}
|
||||
42
vendor/go.starlark.net/starlark/debug.go
generated
vendored
42
vendor/go.starlark.net/starlark/debug.go
generated
vendored
@@ -1,42 +0,0 @@
|
||||
package starlark
|
||||
|
||||
import "go.starlark.net/syntax"
|
||||
|
||||
// This file defines an experimental API for the debugging tools.
|
||||
// Some of these declarations expose details of internal packages.
|
||||
// (The debugger makes liberal use of exported fields of unexported types.)
|
||||
// Breaking changes may occur without notice.
|
||||
|
||||
// Local returns the value of the i'th local variable.
|
||||
// It may be nil if not yet assigned.
|
||||
//
|
||||
// Local may be called only for frames whose Callable is a *Function (a
|
||||
// function defined by Starlark source code), and only while the frame
|
||||
// is active; it will panic otherwise.
|
||||
//
|
||||
// This function is provided only for debugging tools.
|
||||
//
|
||||
// THIS API IS EXPERIMENTAL AND MAY CHANGE WITHOUT NOTICE.
|
||||
func (fr *frame) Local(i int) Value { return fr.locals[i] }
|
||||
|
||||
// DebugFrame is the debugger API for a frame of the interpreter's call stack.
|
||||
//
|
||||
// Most applications have no need for this API; use CallFrame instead.
|
||||
//
|
||||
// Clients must not retain a DebugFrame nor call any of its methods once
|
||||
// the current built-in call has returned or execution has resumed
|
||||
// after a breakpoint as this may have unpredictable effects, including
|
||||
// but not limited to retention of object that would otherwise be garbage.
|
||||
type DebugFrame interface {
|
||||
Callable() Callable // returns the frame's function
|
||||
Local(i int) Value // returns the value of the (Starlark) frame's ith local variable
|
||||
Position() syntax.Position // returns the current position of execution in this frame
|
||||
}
|
||||
|
||||
// DebugFrame returns the debugger interface for
|
||||
// the specified frame of the interpreter's call stack.
|
||||
// Frame numbering is as for Thread.CallFrame.
|
||||
//
|
||||
// This function is intended for use in debugging tools.
|
||||
// Most applications should have no need for it; use CallFrame instead.
|
||||
func (thread *Thread) DebugFrame(depth int) DebugFrame { return thread.frameAt(depth) }
|
||||
3
vendor/go.starlark.net/starlark/empty.s
generated
vendored
3
vendor/go.starlark.net/starlark/empty.s
generated
vendored
@@ -1,3 +0,0 @@
|
||||
// The presence of this file allows the package to use the
|
||||
// "go:linkname" hack to call non-exported functions in the
|
||||
// Go runtime, such as hardware-accelerated string hashing.
|
||||
1648
vendor/go.starlark.net/starlark/eval.go
generated
vendored
1648
vendor/go.starlark.net/starlark/eval.go
generated
vendored
File diff suppressed because it is too large
Load Diff
390
vendor/go.starlark.net/starlark/hashtable.go
generated
vendored
390
vendor/go.starlark.net/starlark/hashtable.go
generated
vendored
@@ -1,390 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 starlark
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
_ "unsafe" // for go:linkname hack
|
||||
)
|
||||
|
||||
// hashtable is used to represent Starlark dict and set values.
|
||||
// It is a hash table whose key/value entries form a doubly-linked list
|
||||
// in the order the entries were inserted.
|
||||
//
|
||||
// Initialized instances of hashtable must not be copied.
|
||||
type hashtable struct {
|
||||
table []bucket // len is zero or a power of two
|
||||
bucket0 [1]bucket // inline allocation for small maps.
|
||||
len uint32
|
||||
itercount uint32 // number of active iterators (ignored if frozen)
|
||||
head *entry // insertion order doubly-linked list; may be nil
|
||||
tailLink **entry // address of nil link at end of list (perhaps &head)
|
||||
frozen bool
|
||||
|
||||
_ noCopy // triggers vet copylock check on this type.
|
||||
}
|
||||
|
||||
// noCopy is zero-sized type that triggers vet's copylock check.
|
||||
// See https://github.com/golang/go/issues/8005#issuecomment-190753527.
|
||||
type noCopy struct{}
|
||||
|
||||
func (*noCopy) Lock() {}
|
||||
func (*noCopy) Unlock() {}
|
||||
|
||||
const bucketSize = 8
|
||||
|
||||
type bucket struct {
|
||||
entries [bucketSize]entry
|
||||
next *bucket // linked list of buckets
|
||||
}
|
||||
|
||||
type entry struct {
|
||||
hash uint32 // nonzero => in use
|
||||
key, value Value
|
||||
next *entry // insertion order doubly-linked list; may be nil
|
||||
prevLink **entry // address of link to this entry (perhaps &head)
|
||||
}
|
||||
|
||||
func (ht *hashtable) init(size int) {
|
||||
if size < 0 {
|
||||
panic("size < 0")
|
||||
}
|
||||
nb := 1
|
||||
for overloaded(size, nb) {
|
||||
nb = nb << 1
|
||||
}
|
||||
if nb < 2 {
|
||||
ht.table = ht.bucket0[:1]
|
||||
} else {
|
||||
ht.table = make([]bucket, nb)
|
||||
}
|
||||
ht.tailLink = &ht.head
|
||||
}
|
||||
|
||||
func (ht *hashtable) freeze() {
|
||||
if !ht.frozen {
|
||||
ht.frozen = true
|
||||
for e := ht.head; e != nil; e = e.next {
|
||||
e.key.Freeze()
|
||||
e.value.Freeze()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ht *hashtable) insert(k, v Value) error {
|
||||
if err := ht.checkMutable("insert into"); err != nil {
|
||||
return err
|
||||
}
|
||||
if ht.table == nil {
|
||||
ht.init(1)
|
||||
}
|
||||
h, err := k.Hash()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if h == 0 {
|
||||
h = 1 // zero is reserved
|
||||
}
|
||||
|
||||
retry:
|
||||
var insert *entry
|
||||
|
||||
// Inspect each bucket in the bucket list.
|
||||
p := &ht.table[h&(uint32(len(ht.table)-1))]
|
||||
for {
|
||||
for i := range p.entries {
|
||||
e := &p.entries[i]
|
||||
if e.hash != h {
|
||||
if e.hash == 0 {
|
||||
// Found empty entry; make a note.
|
||||
insert = e
|
||||
}
|
||||
continue
|
||||
}
|
||||
if eq, err := Equal(k, e.key); err != nil {
|
||||
return err // e.g. excessively recursive tuple
|
||||
} else if !eq {
|
||||
continue
|
||||
}
|
||||
// Key already present; update value.
|
||||
e.value = v
|
||||
return nil
|
||||
}
|
||||
if p.next == nil {
|
||||
break
|
||||
}
|
||||
p = p.next
|
||||
}
|
||||
|
||||
// Key not found. p points to the last bucket.
|
||||
|
||||
// Does the number of elements exceed the buckets' load factor?
|
||||
if overloaded(int(ht.len), len(ht.table)) {
|
||||
ht.grow()
|
||||
goto retry
|
||||
}
|
||||
|
||||
if insert == nil {
|
||||
// No space in existing buckets. Add a new one to the bucket list.
|
||||
b := new(bucket)
|
||||
p.next = b
|
||||
insert = &b.entries[0]
|
||||
}
|
||||
|
||||
// Insert key/value pair.
|
||||
insert.hash = h
|
||||
insert.key = k
|
||||
insert.value = v
|
||||
|
||||
// Append entry to doubly-linked list.
|
||||
insert.prevLink = ht.tailLink
|
||||
*ht.tailLink = insert
|
||||
ht.tailLink = &insert.next
|
||||
|
||||
ht.len++
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func overloaded(elems, buckets int) bool {
|
||||
const loadFactor = 6.5 // just a guess
|
||||
return elems >= bucketSize && float64(elems) >= loadFactor*float64(buckets)
|
||||
}
|
||||
|
||||
func (ht *hashtable) grow() {
|
||||
// Double the number of buckets and rehash.
|
||||
//
|
||||
// Even though this makes reentrant calls to ht.insert,
|
||||
// calls Equals unnecessarily (since there can't be duplicate keys),
|
||||
// and recomputes the hash unnecessarily, the gains from
|
||||
// avoiding these steps were found to be too small to justify
|
||||
// the extra logic: -2% on hashtable benchmark.
|
||||
ht.table = make([]bucket, len(ht.table)<<1)
|
||||
oldhead := ht.head
|
||||
ht.head = nil
|
||||
ht.tailLink = &ht.head
|
||||
ht.len = 0
|
||||
for e := oldhead; e != nil; e = e.next {
|
||||
ht.insert(e.key, e.value)
|
||||
}
|
||||
ht.bucket0[0] = bucket{} // clear out unused initial bucket
|
||||
}
|
||||
|
||||
func (ht *hashtable) lookup(k Value) (v Value, found bool, err error) {
|
||||
h, err := k.Hash()
|
||||
if err != nil {
|
||||
return nil, false, err // unhashable
|
||||
}
|
||||
if h == 0 {
|
||||
h = 1 // zero is reserved
|
||||
}
|
||||
if ht.table == nil {
|
||||
return None, false, nil // empty
|
||||
}
|
||||
|
||||
// Inspect each bucket in the bucket list.
|
||||
for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next {
|
||||
for i := range p.entries {
|
||||
e := &p.entries[i]
|
||||
if e.hash == h {
|
||||
if eq, err := Equal(k, e.key); err != nil {
|
||||
return nil, false, err // e.g. excessively recursive tuple
|
||||
} else if eq {
|
||||
return e.value, true, nil // found
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return None, false, nil // not found
|
||||
}
|
||||
|
||||
// Items returns all the items in the map (as key/value pairs) in insertion order.
|
||||
func (ht *hashtable) items() []Tuple {
|
||||
items := make([]Tuple, 0, ht.len)
|
||||
array := make([]Value, ht.len*2) // allocate a single backing array
|
||||
for e := ht.head; e != nil; e = e.next {
|
||||
pair := Tuple(array[:2:2])
|
||||
array = array[2:]
|
||||
pair[0] = e.key
|
||||
pair[1] = e.value
|
||||
items = append(items, pair)
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
func (ht *hashtable) first() (Value, bool) {
|
||||
if ht.head != nil {
|
||||
return ht.head.key, true
|
||||
}
|
||||
return None, false
|
||||
}
|
||||
|
||||
func (ht *hashtable) keys() []Value {
|
||||
keys := make([]Value, 0, ht.len)
|
||||
for e := ht.head; e != nil; e = e.next {
|
||||
keys = append(keys, e.key)
|
||||
}
|
||||
return keys
|
||||
}
|
||||
|
||||
func (ht *hashtable) delete(k Value) (v Value, found bool, err error) {
|
||||
if err := ht.checkMutable("delete from"); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
if ht.table == nil {
|
||||
return None, false, nil // empty
|
||||
}
|
||||
h, err := k.Hash()
|
||||
if err != nil {
|
||||
return nil, false, err // unhashable
|
||||
}
|
||||
if h == 0 {
|
||||
h = 1 // zero is reserved
|
||||
}
|
||||
|
||||
// Inspect each bucket in the bucket list.
|
||||
for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next {
|
||||
for i := range p.entries {
|
||||
e := &p.entries[i]
|
||||
if e.hash == h {
|
||||
if eq, err := Equal(k, e.key); err != nil {
|
||||
return nil, false, err
|
||||
} else if eq {
|
||||
// Remove e from doubly-linked list.
|
||||
*e.prevLink = e.next
|
||||
if e.next == nil {
|
||||
ht.tailLink = e.prevLink // deletion of last entry
|
||||
} else {
|
||||
e.next.prevLink = e.prevLink
|
||||
}
|
||||
|
||||
v := e.value
|
||||
*e = entry{}
|
||||
ht.len--
|
||||
return v, true, nil // found
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(adonovan): opt: remove completely empty bucket from bucket list.
|
||||
|
||||
return None, false, nil // not found
|
||||
}
|
||||
|
||||
// checkMutable reports an error if the hash table should not be mutated.
|
||||
// verb+" dict" should describe the operation.
|
||||
func (ht *hashtable) checkMutable(verb string) error {
|
||||
if ht.frozen {
|
||||
return fmt.Errorf("cannot %s frozen hash table", verb)
|
||||
}
|
||||
if ht.itercount > 0 {
|
||||
return fmt.Errorf("cannot %s hash table during iteration", verb)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ht *hashtable) clear() error {
|
||||
if err := ht.checkMutable("clear"); err != nil {
|
||||
return err
|
||||
}
|
||||
if ht.table != nil {
|
||||
for i := range ht.table {
|
||||
ht.table[i] = bucket{}
|
||||
}
|
||||
}
|
||||
ht.head = nil
|
||||
ht.tailLink = &ht.head
|
||||
ht.len = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ht *hashtable) addAll(other *hashtable) error {
|
||||
for e := other.head; e != nil; e = e.next {
|
||||
if err := ht.insert(e.key, e.value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// dump is provided as an aid to debugging.
|
||||
func (ht *hashtable) dump() {
|
||||
fmt.Printf("hashtable %p len=%d head=%p tailLink=%p",
|
||||
ht, ht.len, ht.head, ht.tailLink)
|
||||
if ht.tailLink != nil {
|
||||
fmt.Printf(" *tailLink=%p", *ht.tailLink)
|
||||
}
|
||||
fmt.Println()
|
||||
for j := range ht.table {
|
||||
fmt.Printf("bucket chain %d\n", j)
|
||||
for p := &ht.table[j]; p != nil; p = p.next {
|
||||
fmt.Printf("bucket %p\n", p)
|
||||
for i := range p.entries {
|
||||
e := &p.entries[i]
|
||||
fmt.Printf("\tentry %d @ %p hash=%d key=%v value=%v\n",
|
||||
i, e, e.hash, e.key, e.value)
|
||||
fmt.Printf("\t\tnext=%p &next=%p prev=%p",
|
||||
e.next, &e.next, e.prevLink)
|
||||
if e.prevLink != nil {
|
||||
fmt.Printf(" *prev=%p", *e.prevLink)
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ht *hashtable) iterate() *keyIterator {
|
||||
if !ht.frozen {
|
||||
ht.itercount++
|
||||
}
|
||||
return &keyIterator{ht: ht, e: ht.head}
|
||||
}
|
||||
|
||||
type keyIterator struct {
|
||||
ht *hashtable
|
||||
e *entry
|
||||
}
|
||||
|
||||
func (it *keyIterator) Next(k *Value) bool {
|
||||
if it.e != nil {
|
||||
*k = it.e.key
|
||||
it.e = it.e.next
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (it *keyIterator) Done() {
|
||||
if !it.ht.frozen {
|
||||
it.ht.itercount--
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(adonovan): use go1.19's maphash.String.
|
||||
|
||||
// hashString computes the hash of s.
|
||||
func hashString(s string) uint32 {
|
||||
if len(s) >= 12 {
|
||||
// Call the Go runtime's optimized hash implementation,
|
||||
// which uses the AESENC instruction on amd64 machines.
|
||||
return uint32(goStringHash(s, 0))
|
||||
}
|
||||
return softHashString(s)
|
||||
}
|
||||
|
||||
//go:linkname goStringHash runtime.stringHash
|
||||
func goStringHash(s string, seed uintptr) uintptr
|
||||
|
||||
// softHashString computes the 32-bit FNV-1a hash of s in software.
|
||||
func softHashString(s string) uint32 {
|
||||
var h uint32 = 2166136261
|
||||
for i := 0; i < len(s); i++ {
|
||||
h ^= uint32(s[i])
|
||||
h *= 16777619
|
||||
}
|
||||
return h
|
||||
}
|
||||
452
vendor/go.starlark.net/starlark/int.go
generated
vendored
452
vendor/go.starlark.net/starlark/int.go
generated
vendored
@@ -1,452 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 starlark
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/big"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
// Int is the type of a Starlark int.
|
||||
//
|
||||
// The zero value is not a legal value; use MakeInt(0).
|
||||
type Int struct{ impl intImpl }
|
||||
|
||||
// --- high-level accessors ---
|
||||
|
||||
// MakeInt returns a Starlark int for the specified signed integer.
|
||||
func MakeInt(x int) Int { return MakeInt64(int64(x)) }
|
||||
|
||||
// MakeInt64 returns a Starlark int for the specified int64.
|
||||
func MakeInt64(x int64) Int {
|
||||
if math.MinInt32 <= x && x <= math.MaxInt32 {
|
||||
return makeSmallInt(x)
|
||||
}
|
||||
return makeBigInt(big.NewInt(x))
|
||||
}
|
||||
|
||||
// MakeUint returns a Starlark int for the specified unsigned integer.
|
||||
func MakeUint(x uint) Int { return MakeUint64(uint64(x)) }
|
||||
|
||||
// MakeUint64 returns a Starlark int for the specified uint64.
|
||||
func MakeUint64(x uint64) Int {
|
||||
if x <= math.MaxInt32 {
|
||||
return makeSmallInt(int64(x))
|
||||
}
|
||||
return makeBigInt(new(big.Int).SetUint64(x))
|
||||
}
|
||||
|
||||
// MakeBigInt returns a Starlark int for the specified big.Int.
|
||||
// The new Int value will contain a copy of x. The caller is safe to modify x.
|
||||
func MakeBigInt(x *big.Int) Int {
|
||||
if isSmall(x) {
|
||||
return makeSmallInt(x.Int64())
|
||||
}
|
||||
z := new(big.Int).Set(x)
|
||||
return makeBigInt(z)
|
||||
}
|
||||
|
||||
func isSmall(x *big.Int) bool {
|
||||
n := x.BitLen()
|
||||
return n < 32 || n == 32 && x.Int64() == math.MinInt32
|
||||
}
|
||||
|
||||
var (
|
||||
zero, one = makeSmallInt(0), makeSmallInt(1)
|
||||
oneBig = big.NewInt(1)
|
||||
|
||||
_ HasUnary = Int{}
|
||||
)
|
||||
|
||||
// Unary implements the operations +int, -int, and ~int.
|
||||
func (i Int) Unary(op syntax.Token) (Value, error) {
|
||||
switch op {
|
||||
case syntax.MINUS:
|
||||
return zero.Sub(i), nil
|
||||
case syntax.PLUS:
|
||||
return i, nil
|
||||
case syntax.TILDE:
|
||||
return i.Not(), nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Int64 returns the value as an int64.
|
||||
// If it is not exactly representable the result is undefined and ok is false.
|
||||
func (i Int) Int64() (_ int64, ok bool) {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
x, acc := bigintToInt64(iBig)
|
||||
if acc != big.Exact {
|
||||
return // inexact
|
||||
}
|
||||
return x, true
|
||||
}
|
||||
return iSmall, true
|
||||
}
|
||||
|
||||
// BigInt returns a new big.Int with the same value as the Int.
|
||||
func (i Int) BigInt() *big.Int {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
return new(big.Int).Set(iBig)
|
||||
}
|
||||
return big.NewInt(iSmall)
|
||||
}
|
||||
|
||||
// bigInt returns the value as a big.Int.
|
||||
// It differs from BigInt in that this method returns the actual
|
||||
// reference and any modification will change the state of i.
|
||||
func (i Int) bigInt() *big.Int {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
return iBig
|
||||
}
|
||||
return big.NewInt(iSmall)
|
||||
}
|
||||
|
||||
// Uint64 returns the value as a uint64.
|
||||
// If it is not exactly representable the result is undefined and ok is false.
|
||||
func (i Int) Uint64() (_ uint64, ok bool) {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
x, acc := bigintToUint64(iBig)
|
||||
if acc != big.Exact {
|
||||
return // inexact
|
||||
}
|
||||
return x, true
|
||||
}
|
||||
if iSmall < 0 {
|
||||
return // inexact
|
||||
}
|
||||
return uint64(iSmall), true
|
||||
}
|
||||
|
||||
// The math/big API should provide this function.
|
||||
func bigintToInt64(i *big.Int) (int64, big.Accuracy) {
|
||||
sign := i.Sign()
|
||||
if sign > 0 {
|
||||
if i.Cmp(maxint64) > 0 {
|
||||
return math.MaxInt64, big.Below
|
||||
}
|
||||
} else if sign < 0 {
|
||||
if i.Cmp(minint64) < 0 {
|
||||
return math.MinInt64, big.Above
|
||||
}
|
||||
}
|
||||
return i.Int64(), big.Exact
|
||||
}
|
||||
|
||||
// The math/big API should provide this function.
|
||||
func bigintToUint64(i *big.Int) (uint64, big.Accuracy) {
|
||||
sign := i.Sign()
|
||||
if sign > 0 {
|
||||
if i.BitLen() > 64 {
|
||||
return math.MaxUint64, big.Below
|
||||
}
|
||||
} else if sign < 0 {
|
||||
return 0, big.Above
|
||||
}
|
||||
return i.Uint64(), big.Exact
|
||||
}
|
||||
|
||||
var (
|
||||
minint64 = new(big.Int).SetInt64(math.MinInt64)
|
||||
maxint64 = new(big.Int).SetInt64(math.MaxInt64)
|
||||
)
|
||||
|
||||
func (i Int) Format(s fmt.State, ch rune) {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
iBig.Format(s, ch)
|
||||
return
|
||||
}
|
||||
big.NewInt(iSmall).Format(s, ch)
|
||||
}
|
||||
func (i Int) String() string {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
return iBig.Text(10)
|
||||
}
|
||||
return strconv.FormatInt(iSmall, 10)
|
||||
}
|
||||
func (i Int) Type() string { return "int" }
|
||||
func (i Int) Freeze() {} // immutable
|
||||
func (i Int) Truth() Bool { return i.Sign() != 0 }
|
||||
func (i Int) Hash() (uint32, error) {
|
||||
iSmall, iBig := i.get()
|
||||
var lo big.Word
|
||||
if iBig != nil {
|
||||
lo = iBig.Bits()[0]
|
||||
} else {
|
||||
lo = big.Word(iSmall)
|
||||
}
|
||||
return 12582917 * uint32(lo+3), nil
|
||||
}
|
||||
|
||||
// Required by the TotallyOrdered interface
|
||||
func (x Int) Cmp(v Value, depth int) (int, error) {
|
||||
y := v.(Int)
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return x.bigInt().Cmp(y.bigInt()), nil
|
||||
}
|
||||
return signum64(xSmall - ySmall), nil // safe: int32 operands
|
||||
}
|
||||
|
||||
// Float returns the float value nearest i.
|
||||
func (i Int) Float() Float {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
// Fast path for hardware int-to-float conversions.
|
||||
if iBig.IsUint64() {
|
||||
return Float(iBig.Uint64())
|
||||
} else if iBig.IsInt64() {
|
||||
return Float(iBig.Int64())
|
||||
}
|
||||
|
||||
f, _ := new(big.Float).SetInt(iBig).Float64()
|
||||
return Float(f)
|
||||
}
|
||||
return Float(iSmall)
|
||||
}
|
||||
|
||||
// finiteFloat returns the finite float value nearest i,
|
||||
// or an error if the magnitude is too large.
|
||||
func (i Int) finiteFloat() (Float, error) {
|
||||
f := i.Float()
|
||||
if math.IsInf(float64(f), 0) {
|
||||
return 0, fmt.Errorf("int too large to convert to float")
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func (x Int) Sign() int {
|
||||
xSmall, xBig := x.get()
|
||||
if xBig != nil {
|
||||
return xBig.Sign()
|
||||
}
|
||||
return signum64(xSmall)
|
||||
}
|
||||
|
||||
func (x Int) Add(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).Add(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return MakeInt64(xSmall + ySmall)
|
||||
}
|
||||
func (x Int) Sub(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).Sub(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return MakeInt64(xSmall - ySmall)
|
||||
}
|
||||
func (x Int) Mul(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).Mul(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return MakeInt64(xSmall * ySmall)
|
||||
}
|
||||
func (x Int) Or(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).Or(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return makeSmallInt(xSmall | ySmall)
|
||||
}
|
||||
func (x Int) And(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).And(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return makeSmallInt(xSmall & ySmall)
|
||||
}
|
||||
func (x Int) Xor(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
return MakeBigInt(new(big.Int).Xor(x.bigInt(), y.bigInt()))
|
||||
}
|
||||
return makeSmallInt(xSmall ^ ySmall)
|
||||
}
|
||||
func (x Int) Not() Int {
|
||||
xSmall, xBig := x.get()
|
||||
if xBig != nil {
|
||||
return MakeBigInt(new(big.Int).Not(xBig))
|
||||
}
|
||||
return makeSmallInt(^xSmall)
|
||||
}
|
||||
func (x Int) Lsh(y uint) Int { return MakeBigInt(new(big.Int).Lsh(x.bigInt(), y)) }
|
||||
func (x Int) Rsh(y uint) Int { return MakeBigInt(new(big.Int).Rsh(x.bigInt(), y)) }
|
||||
|
||||
// Precondition: y is nonzero.
|
||||
func (x Int) Div(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
// http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
|
||||
if xBig != nil || yBig != nil {
|
||||
xb, yb := x.bigInt(), y.bigInt()
|
||||
|
||||
var quo, rem big.Int
|
||||
quo.QuoRem(xb, yb, &rem)
|
||||
if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 {
|
||||
quo.Sub(&quo, oneBig)
|
||||
}
|
||||
return MakeBigInt(&quo)
|
||||
}
|
||||
quo := xSmall / ySmall
|
||||
rem := xSmall % ySmall
|
||||
if (xSmall < 0) != (ySmall < 0) && rem != 0 {
|
||||
quo -= 1
|
||||
}
|
||||
return MakeInt64(quo)
|
||||
}
|
||||
|
||||
// Precondition: y is nonzero.
|
||||
func (x Int) Mod(y Int) Int {
|
||||
xSmall, xBig := x.get()
|
||||
ySmall, yBig := y.get()
|
||||
if xBig != nil || yBig != nil {
|
||||
xb, yb := x.bigInt(), y.bigInt()
|
||||
|
||||
var quo, rem big.Int
|
||||
quo.QuoRem(xb, yb, &rem)
|
||||
if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 {
|
||||
rem.Add(&rem, yb)
|
||||
}
|
||||
return MakeBigInt(&rem)
|
||||
}
|
||||
rem := xSmall % ySmall
|
||||
if (xSmall < 0) != (ySmall < 0) && rem != 0 {
|
||||
rem += ySmall
|
||||
}
|
||||
return makeSmallInt(rem)
|
||||
}
|
||||
|
||||
func (i Int) rational() *big.Rat {
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
return new(big.Rat).SetInt(iBig)
|
||||
}
|
||||
return new(big.Rat).SetInt64(iSmall)
|
||||
}
|
||||
|
||||
// AsInt32 returns the value of x if is representable as an int32.
|
||||
func AsInt32(x Value) (int, error) {
|
||||
i, ok := x.(Int)
|
||||
if !ok {
|
||||
return 0, fmt.Errorf("got %s, want int", x.Type())
|
||||
}
|
||||
iSmall, iBig := i.get()
|
||||
if iBig != nil {
|
||||
return 0, fmt.Errorf("%s out of range", i)
|
||||
}
|
||||
return int(iSmall), nil
|
||||
}
|
||||
|
||||
// AsInt sets *ptr to the value of Starlark int x, if it is exactly representable,
|
||||
// otherwise it returns an error.
|
||||
// The type of ptr must be one of the pointer types *int, *int8, *int16, *int32, or *int64,
|
||||
// or one of their unsigned counterparts including *uintptr.
|
||||
func AsInt(x Value, ptr interface{}) error {
|
||||
xint, ok := x.(Int)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want int", x.Type())
|
||||
}
|
||||
|
||||
bits := reflect.TypeOf(ptr).Elem().Size() * 8
|
||||
switch ptr.(type) {
|
||||
case *int, *int8, *int16, *int32, *int64:
|
||||
i, ok := xint.Int64()
|
||||
if !ok || bits < 64 && !(-1<<(bits-1) <= i && i < 1<<(bits-1)) {
|
||||
return fmt.Errorf("%s out of range (want value in signed %d-bit range)", xint, bits)
|
||||
}
|
||||
switch ptr := ptr.(type) {
|
||||
case *int:
|
||||
*ptr = int(i)
|
||||
case *int8:
|
||||
*ptr = int8(i)
|
||||
case *int16:
|
||||
*ptr = int16(i)
|
||||
case *int32:
|
||||
*ptr = int32(i)
|
||||
case *int64:
|
||||
*ptr = int64(i)
|
||||
}
|
||||
|
||||
case *uint, *uint8, *uint16, *uint32, *uint64, *uintptr:
|
||||
i, ok := xint.Uint64()
|
||||
if !ok || bits < 64 && i >= 1<<bits {
|
||||
return fmt.Errorf("%s out of range (want value in unsigned %d-bit range)", xint, bits)
|
||||
}
|
||||
switch ptr := ptr.(type) {
|
||||
case *uint:
|
||||
*ptr = uint(i)
|
||||
case *uint8:
|
||||
*ptr = uint8(i)
|
||||
case *uint16:
|
||||
*ptr = uint16(i)
|
||||
case *uint32:
|
||||
*ptr = uint32(i)
|
||||
case *uint64:
|
||||
*ptr = uint64(i)
|
||||
case *uintptr:
|
||||
*ptr = uintptr(i)
|
||||
}
|
||||
default:
|
||||
panic(fmt.Sprintf("invalid argument type: %T", ptr))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// NumberToInt converts a number x to an integer value.
|
||||
// An int is returned unchanged, a float is truncated towards zero.
|
||||
// NumberToInt reports an error for all other values.
|
||||
func NumberToInt(x Value) (Int, error) {
|
||||
switch x := x.(type) {
|
||||
case Int:
|
||||
return x, nil
|
||||
case Float:
|
||||
f := float64(x)
|
||||
if math.IsInf(f, 0) {
|
||||
return zero, fmt.Errorf("cannot convert float infinity to integer")
|
||||
} else if math.IsNaN(f) {
|
||||
return zero, fmt.Errorf("cannot convert float NaN to integer")
|
||||
}
|
||||
return finiteFloatToInt(x), nil
|
||||
|
||||
}
|
||||
return zero, fmt.Errorf("cannot convert %s to int", x.Type())
|
||||
}
|
||||
|
||||
// finiteFloatToInt converts f to an Int, truncating towards zero.
|
||||
// f must be finite.
|
||||
func finiteFloatToInt(f Float) Int {
|
||||
// We avoid '<= MaxInt64' so that both constants are exactly representable as floats.
|
||||
// See https://github.com/google/starlark-go/issues/375.
|
||||
if math.MinInt64 <= f && f < math.MaxInt64+1 {
|
||||
// small values
|
||||
return MakeInt64(int64(f))
|
||||
}
|
||||
rat := f.rational()
|
||||
if rat == nil {
|
||||
panic(f) // non-finite
|
||||
}
|
||||
return MakeBigInt(new(big.Int).Div(rat.Num(), rat.Denom()))
|
||||
}
|
||||
34
vendor/go.starlark.net/starlark/int_generic.go
generated
vendored
34
vendor/go.starlark.net/starlark/int_generic.go
generated
vendored
@@ -1,34 +0,0 @@
|
||||
//go:build (!linux && !darwin && !dragonfly && !freebsd && !netbsd && !solaris) || (!amd64 && !arm64 && !mips64x && !ppc64x && !loong64)
|
||||
// +build !linux,!darwin,!dragonfly,!freebsd,!netbsd,!solaris !amd64,!arm64,!mips64x,!ppc64x,!loong64
|
||||
|
||||
package starlark
|
||||
|
||||
// generic Int implementation as a union
|
||||
|
||||
import "math/big"
|
||||
|
||||
type intImpl struct {
|
||||
// We use only the signed 32-bit range of small to ensure
|
||||
// that small+small and small*small do not overflow.
|
||||
small_ int64 // minint32 <= small <= maxint32
|
||||
big_ *big.Int // big != nil <=> value is not representable as int32
|
||||
}
|
||||
|
||||
// --- low-level accessors ---
|
||||
|
||||
// get returns the small and big components of the Int.
|
||||
// small is defined only if big is nil.
|
||||
// small is sign-extended to 64 bits for ease of subsequent arithmetic.
|
||||
func (i Int) get() (small int64, big *big.Int) {
|
||||
return i.impl.small_, i.impl.big_
|
||||
}
|
||||
|
||||
// Precondition: math.MinInt32 <= x && x <= math.MaxInt32
|
||||
func makeSmallInt(x int64) Int {
|
||||
return Int{intImpl{small_: x}}
|
||||
}
|
||||
|
||||
// Precondition: x cannot be represented as int32.
|
||||
func makeBigInt(x *big.Int) Int {
|
||||
return Int{intImpl{big_: x}}
|
||||
}
|
||||
91
vendor/go.starlark.net/starlark/int_posix64.go
generated
vendored
91
vendor/go.starlark.net/starlark/int_posix64.go
generated
vendored
@@ -1,91 +0,0 @@
|
||||
//go:build (linux || darwin || dragonfly || freebsd || netbsd || solaris) && (amd64 || arm64 || mips64x || ppc64x || loong64)
|
||||
// +build linux darwin dragonfly freebsd netbsd solaris
|
||||
// +build amd64 arm64 mips64x ppc64x loong64
|
||||
|
||||
package starlark
|
||||
|
||||
// This file defines an optimized Int implementation for 64-bit machines
|
||||
// running POSIX. It reserves a 4GB portion of the address space using
|
||||
// mmap and represents int32 values as addresses within that range. This
|
||||
// disambiguates int32 values from *big.Int pointers, letting all Int
|
||||
// values be represented as an unsafe.Pointer, so that Int-to-Value
|
||||
// interface conversion need not allocate.
|
||||
|
||||
// Although iOS (which, like macOS, appears as darwin/arm64) is
|
||||
// POSIX-compliant, it limits each process to about 700MB of virtual
|
||||
// address space, which defeats the optimization. Similarly,
|
||||
// OpenBSD's default ulimit for virtual memory is a measly GB or so.
|
||||
// On both those platforms the attempted optimization will fail and
|
||||
// fall back to the slow implementation.
|
||||
|
||||
// An alternative approach to this optimization would be to embed the
|
||||
// int32 values in pointers using odd values, which can be distinguished
|
||||
// from (even) *big.Int pointers. However, the Go runtime does not allow
|
||||
// user programs to manufacture pointers to arbitrary locations such as
|
||||
// within the zero page, or non-span, non-mmap, non-stack locations,
|
||||
// and it may panic if it encounters them; see Issue #382.
|
||||
|
||||
import (
|
||||
"log"
|
||||
"math"
|
||||
"math/big"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
// intImpl represents a union of (int32, *big.Int) in a single pointer,
|
||||
// so that Int-to-Value conversions need not allocate.
|
||||
//
|
||||
// The pointer is either a *big.Int, if the value is big, or a pointer into a
|
||||
// reserved portion of the address space (smallints), if the value is small
|
||||
// and the address space allocation succeeded.
|
||||
//
|
||||
// See int_generic.go for the basic representation concepts.
|
||||
type intImpl unsafe.Pointer
|
||||
|
||||
// get returns the (small, big) arms of the union.
|
||||
func (i Int) get() (int64, *big.Int) {
|
||||
if smallints == 0 {
|
||||
// optimization disabled
|
||||
if x := (*big.Int)(i.impl); isSmall(x) {
|
||||
return x.Int64(), nil
|
||||
} else {
|
||||
return 0, x
|
||||
}
|
||||
}
|
||||
|
||||
if ptr := uintptr(i.impl); ptr >= smallints && ptr < smallints+1<<32 {
|
||||
return math.MinInt32 + int64(ptr-smallints), nil
|
||||
}
|
||||
return 0, (*big.Int)(i.impl)
|
||||
}
|
||||
|
||||
// Precondition: math.MinInt32 <= x && x <= math.MaxInt32
|
||||
func makeSmallInt(x int64) Int {
|
||||
if smallints == 0 {
|
||||
// optimization disabled
|
||||
return Int{intImpl(big.NewInt(x))}
|
||||
}
|
||||
|
||||
return Int{intImpl(uintptr(x-math.MinInt32) + smallints)}
|
||||
}
|
||||
|
||||
// Precondition: x cannot be represented as int32.
|
||||
func makeBigInt(x *big.Int) Int { return Int{intImpl(x)} }
|
||||
|
||||
// smallints is the base address of a 2^32 byte memory region.
|
||||
// Pointers to addresses in this region represent int32 values.
|
||||
// We assume smallints is not at the very top of the address space.
|
||||
//
|
||||
// Zero means the optimization is disabled and all Ints allocate a big.Int.
|
||||
var smallints = reserveAddresses(1 << 32)
|
||||
|
||||
func reserveAddresses(len int) uintptr {
|
||||
b, err := unix.Mmap(-1, 0, len, unix.PROT_READ, unix.MAP_PRIVATE|unix.MAP_ANON)
|
||||
if err != nil {
|
||||
log.Printf("Starlark failed to allocate 4GB address space: %v. Integer performance may suffer.", err)
|
||||
return 0 // optimization disabled
|
||||
}
|
||||
return uintptr(unsafe.Pointer(&b[0]))
|
||||
}
|
||||
705
vendor/go.starlark.net/starlark/interp.go
generated
vendored
705
vendor/go.starlark.net/starlark/interp.go
generated
vendored
@@ -1,705 +0,0 @@
|
||||
package starlark
|
||||
|
||||
// This file defines the bytecode interpreter.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
|
||||
"go.starlark.net/internal/compile"
|
||||
"go.starlark.net/internal/spell"
|
||||
"go.starlark.net/resolve"
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
const vmdebug = false // TODO(adonovan): use a bitfield of specific kinds of error.
|
||||
|
||||
// TODO(adonovan):
|
||||
// - optimize position table.
|
||||
// - opt: record MaxIterStack during compilation and preallocate the stack.
|
||||
|
||||
func (fn *Function) CallInternal(thread *Thread, args Tuple, kwargs []Tuple) (Value, error) {
|
||||
// Postcondition: args is not mutated. This is stricter than required by Callable,
|
||||
// but allows CALL to avoid a copy.
|
||||
|
||||
if !resolve.AllowRecursion {
|
||||
// detect recursion
|
||||
for _, fr := range thread.stack[:len(thread.stack)-1] {
|
||||
// We look for the same function code,
|
||||
// not function value, otherwise the user could
|
||||
// defeat the check by writing the Y combinator.
|
||||
if frfn, ok := fr.Callable().(*Function); ok && frfn.funcode == fn.funcode {
|
||||
return nil, fmt.Errorf("function %s called recursively", fn.Name())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
f := fn.funcode
|
||||
fr := thread.frameAt(0)
|
||||
|
||||
// Allocate space for stack and locals.
|
||||
// Logically these do not escape from this frame
|
||||
// (See https://github.com/golang/go/issues/20533.)
|
||||
//
|
||||
// This heap allocation looks expensive, but I was unable to get
|
||||
// more than 1% real time improvement in a large alloc-heavy
|
||||
// benchmark (in which this alloc was 8% of alloc-bytes)
|
||||
// by allocating space for 8 Values in each frame, or
|
||||
// by allocating stack by slicing an array held by the Thread
|
||||
// that is expanded in chunks of min(k, nspace), for k=256 or 1024.
|
||||
nlocals := len(f.Locals)
|
||||
nspace := nlocals + f.MaxStack
|
||||
space := make([]Value, nspace)
|
||||
locals := space[:nlocals:nlocals] // local variables, starting with parameters
|
||||
stack := space[nlocals:] // operand stack
|
||||
|
||||
// Digest arguments and set parameters.
|
||||
err := setArgs(locals, fn, args, kwargs)
|
||||
if err != nil {
|
||||
return nil, thread.evalError(err)
|
||||
}
|
||||
|
||||
fr.locals = locals
|
||||
|
||||
if vmdebug {
|
||||
fmt.Printf("Entering %s @ %s\n", f.Name, f.Position(0))
|
||||
fmt.Printf("%d stack, %d locals\n", len(stack), len(locals))
|
||||
defer fmt.Println("Leaving ", f.Name)
|
||||
}
|
||||
|
||||
// Spill indicated locals to cells.
|
||||
// Each cell is a separate alloc to avoid spurious liveness.
|
||||
for _, index := range f.Cells {
|
||||
locals[index] = &cell{locals[index]}
|
||||
}
|
||||
|
||||
// TODO(adonovan): add static check that beneath this point
|
||||
// - there is exactly one return statement
|
||||
// - there is no redefinition of 'err'.
|
||||
|
||||
var iterstack []Iterator // stack of active iterators
|
||||
|
||||
// Use defer so that application panics can pass through
|
||||
// interpreter without leaving thread in a bad state.
|
||||
defer func() {
|
||||
// ITERPOP the rest of the iterator stack.
|
||||
for _, iter := range iterstack {
|
||||
iter.Done()
|
||||
}
|
||||
|
||||
fr.locals = nil
|
||||
}()
|
||||
|
||||
sp := 0
|
||||
var pc uint32
|
||||
var result Value
|
||||
code := f.Code
|
||||
loop:
|
||||
for {
|
||||
thread.Steps++
|
||||
if thread.Steps >= thread.maxSteps {
|
||||
if thread.OnMaxSteps != nil {
|
||||
thread.OnMaxSteps(thread)
|
||||
} else {
|
||||
thread.Cancel("too many steps")
|
||||
}
|
||||
}
|
||||
if reason := atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&thread.cancelReason))); reason != nil {
|
||||
err = fmt.Errorf("Starlark computation cancelled: %s", *(*string)(reason))
|
||||
break loop
|
||||
}
|
||||
|
||||
fr.pc = pc
|
||||
|
||||
op := compile.Opcode(code[pc])
|
||||
pc++
|
||||
var arg uint32
|
||||
if op >= compile.OpcodeArgMin {
|
||||
// TODO(adonovan): opt: profile this.
|
||||
// Perhaps compiling big endian would be less work to decode?
|
||||
for s := uint(0); ; s += 7 {
|
||||
b := code[pc]
|
||||
pc++
|
||||
arg |= uint32(b&0x7f) << s
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if vmdebug {
|
||||
fmt.Fprintln(os.Stderr, stack[:sp]) // very verbose!
|
||||
compile.PrintOp(f, fr.pc, op, arg)
|
||||
}
|
||||
|
||||
switch op {
|
||||
case compile.NOP:
|
||||
// nop
|
||||
|
||||
case compile.DUP:
|
||||
stack[sp] = stack[sp-1]
|
||||
sp++
|
||||
|
||||
case compile.DUP2:
|
||||
stack[sp] = stack[sp-2]
|
||||
stack[sp+1] = stack[sp-1]
|
||||
sp += 2
|
||||
|
||||
case compile.POP:
|
||||
sp--
|
||||
|
||||
case compile.EXCH:
|
||||
stack[sp-2], stack[sp-1] = stack[sp-1], stack[sp-2]
|
||||
|
||||
case compile.EQL, compile.NEQ, compile.GT, compile.LT, compile.LE, compile.GE:
|
||||
op := syntax.Token(op-compile.EQL) + syntax.EQL
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
ok, err2 := Compare(op, x, y)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp] = Bool(ok)
|
||||
sp++
|
||||
|
||||
case compile.PLUS,
|
||||
compile.MINUS,
|
||||
compile.STAR,
|
||||
compile.SLASH,
|
||||
compile.SLASHSLASH,
|
||||
compile.PERCENT,
|
||||
compile.AMP,
|
||||
compile.PIPE,
|
||||
compile.CIRCUMFLEX,
|
||||
compile.LTLT,
|
||||
compile.GTGT,
|
||||
compile.IN:
|
||||
binop := syntax.Token(op-compile.PLUS) + syntax.PLUS
|
||||
if op == compile.IN {
|
||||
binop = syntax.IN // IN token is out of order
|
||||
}
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
z, err2 := Binary(binop, x, y)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp] = z
|
||||
sp++
|
||||
|
||||
case compile.UPLUS, compile.UMINUS, compile.TILDE:
|
||||
var unop syntax.Token
|
||||
if op == compile.TILDE {
|
||||
unop = syntax.TILDE
|
||||
} else {
|
||||
unop = syntax.Token(op-compile.UPLUS) + syntax.PLUS
|
||||
}
|
||||
x := stack[sp-1]
|
||||
y, err2 := Unary(unop, x)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp-1] = y
|
||||
|
||||
case compile.INPLACE_ADD:
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
|
||||
// It's possible that y is not Iterable but
|
||||
// nonetheless defines x+y, in which case we
|
||||
// should fall back to the general case.
|
||||
var z Value
|
||||
if xlist, ok := x.(*List); ok {
|
||||
if yiter, ok := y.(Iterable); ok {
|
||||
if err = xlist.checkMutable("apply += to"); err != nil {
|
||||
break loop
|
||||
}
|
||||
listExtend(xlist, yiter)
|
||||
z = xlist
|
||||
}
|
||||
}
|
||||
if z == nil {
|
||||
z, err = Binary(syntax.PLUS, x, y)
|
||||
if err != nil {
|
||||
break loop
|
||||
}
|
||||
}
|
||||
|
||||
stack[sp] = z
|
||||
sp++
|
||||
|
||||
case compile.INPLACE_PIPE:
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
|
||||
// It's possible that y is not Dict but
|
||||
// nonetheless defines x|y, in which case we
|
||||
// should fall back to the general case.
|
||||
var z Value
|
||||
if xdict, ok := x.(*Dict); ok {
|
||||
if ydict, ok := y.(*Dict); ok {
|
||||
if err = xdict.ht.checkMutable("apply |= to"); err != nil {
|
||||
break loop
|
||||
}
|
||||
xdict.ht.addAll(&ydict.ht) // can't fail
|
||||
z = xdict
|
||||
}
|
||||
}
|
||||
if z == nil {
|
||||
z, err = Binary(syntax.PIPE, x, y)
|
||||
if err != nil {
|
||||
break loop
|
||||
}
|
||||
}
|
||||
|
||||
stack[sp] = z
|
||||
sp++
|
||||
|
||||
case compile.NONE:
|
||||
stack[sp] = None
|
||||
sp++
|
||||
|
||||
case compile.TRUE:
|
||||
stack[sp] = True
|
||||
sp++
|
||||
|
||||
case compile.FALSE:
|
||||
stack[sp] = False
|
||||
sp++
|
||||
|
||||
case compile.MANDATORY:
|
||||
stack[sp] = mandatory{}
|
||||
sp++
|
||||
|
||||
case compile.JMP:
|
||||
pc = arg
|
||||
|
||||
case compile.CALL, compile.CALL_VAR, compile.CALL_KW, compile.CALL_VAR_KW:
|
||||
var kwargs Value
|
||||
if op == compile.CALL_KW || op == compile.CALL_VAR_KW {
|
||||
kwargs = stack[sp-1]
|
||||
sp--
|
||||
}
|
||||
|
||||
var args Value
|
||||
if op == compile.CALL_VAR || op == compile.CALL_VAR_KW {
|
||||
args = stack[sp-1]
|
||||
sp--
|
||||
}
|
||||
|
||||
// named args (pairs)
|
||||
var kvpairs []Tuple
|
||||
if nkvpairs := int(arg & 0xff); nkvpairs > 0 {
|
||||
kvpairs = make([]Tuple, 0, nkvpairs)
|
||||
kvpairsAlloc := make(Tuple, 2*nkvpairs) // allocate a single backing array
|
||||
sp -= 2 * nkvpairs
|
||||
for i := 0; i < nkvpairs; i++ {
|
||||
pair := kvpairsAlloc[:2:2]
|
||||
kvpairsAlloc = kvpairsAlloc[2:]
|
||||
pair[0] = stack[sp+2*i] // name
|
||||
pair[1] = stack[sp+2*i+1] // value
|
||||
kvpairs = append(kvpairs, pair)
|
||||
}
|
||||
}
|
||||
if kwargs != nil {
|
||||
// Add key/value items from **kwargs dictionary.
|
||||
dict, ok := kwargs.(IterableMapping)
|
||||
if !ok {
|
||||
err = fmt.Errorf("argument after ** must be a mapping, not %s", kwargs.Type())
|
||||
break loop
|
||||
}
|
||||
items := dict.Items()
|
||||
for _, item := range items {
|
||||
if _, ok := item[0].(String); !ok {
|
||||
err = fmt.Errorf("keywords must be strings, not %s", item[0].Type())
|
||||
break loop
|
||||
}
|
||||
}
|
||||
if len(kvpairs) == 0 {
|
||||
kvpairs = items
|
||||
} else {
|
||||
kvpairs = append(kvpairs, items...)
|
||||
}
|
||||
}
|
||||
|
||||
// positional args
|
||||
var positional Tuple
|
||||
if npos := int(arg >> 8); npos > 0 {
|
||||
positional = stack[sp-npos : sp]
|
||||
sp -= npos
|
||||
|
||||
// Copy positional arguments into a new array,
|
||||
// unless the callee is another Starlark function,
|
||||
// in which case it can be trusted not to mutate them.
|
||||
if _, ok := stack[sp-1].(*Function); !ok || args != nil {
|
||||
positional = append(Tuple(nil), positional...)
|
||||
}
|
||||
}
|
||||
if args != nil {
|
||||
// Add elements from *args sequence.
|
||||
iter := Iterate(args)
|
||||
if iter == nil {
|
||||
err = fmt.Errorf("argument after * must be iterable, not %s", args.Type())
|
||||
break loop
|
||||
}
|
||||
var elem Value
|
||||
for iter.Next(&elem) {
|
||||
positional = append(positional, elem)
|
||||
}
|
||||
iter.Done()
|
||||
}
|
||||
|
||||
function := stack[sp-1]
|
||||
|
||||
if vmdebug {
|
||||
fmt.Printf("VM call %s args=%s kwargs=%s @%s\n",
|
||||
function, positional, kvpairs, f.Position(fr.pc))
|
||||
}
|
||||
|
||||
thread.endProfSpan()
|
||||
z, err2 := Call(thread, function, positional, kvpairs)
|
||||
thread.beginProfSpan()
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
if vmdebug {
|
||||
fmt.Printf("Resuming %s @ %s\n", f.Name, f.Position(0))
|
||||
}
|
||||
stack[sp-1] = z
|
||||
|
||||
case compile.ITERPUSH:
|
||||
x := stack[sp-1]
|
||||
sp--
|
||||
iter := Iterate(x)
|
||||
if iter == nil {
|
||||
err = fmt.Errorf("%s value is not iterable", x.Type())
|
||||
break loop
|
||||
}
|
||||
iterstack = append(iterstack, iter)
|
||||
|
||||
case compile.ITERJMP:
|
||||
iter := iterstack[len(iterstack)-1]
|
||||
if iter.Next(&stack[sp]) {
|
||||
sp++
|
||||
} else {
|
||||
pc = arg
|
||||
}
|
||||
|
||||
case compile.ITERPOP:
|
||||
n := len(iterstack) - 1
|
||||
iterstack[n].Done()
|
||||
iterstack = iterstack[:n]
|
||||
|
||||
case compile.NOT:
|
||||
stack[sp-1] = !stack[sp-1].Truth()
|
||||
|
||||
case compile.RETURN:
|
||||
result = stack[sp-1]
|
||||
break loop
|
||||
|
||||
case compile.SETINDEX:
|
||||
z := stack[sp-1]
|
||||
y := stack[sp-2]
|
||||
x := stack[sp-3]
|
||||
sp -= 3
|
||||
err = setIndex(x, y, z)
|
||||
if err != nil {
|
||||
break loop
|
||||
}
|
||||
|
||||
case compile.INDEX:
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
z, err2 := getIndex(x, y)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp] = z
|
||||
sp++
|
||||
|
||||
case compile.ATTR:
|
||||
x := stack[sp-1]
|
||||
name := f.Prog.Names[arg]
|
||||
y, err2 := getAttr(x, name)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp-1] = y
|
||||
|
||||
case compile.SETFIELD:
|
||||
y := stack[sp-1]
|
||||
x := stack[sp-2]
|
||||
sp -= 2
|
||||
name := f.Prog.Names[arg]
|
||||
if err2 := setField(x, name, y); err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
|
||||
case compile.MAKEDICT:
|
||||
stack[sp] = new(Dict)
|
||||
sp++
|
||||
|
||||
case compile.SETDICT, compile.SETDICTUNIQ:
|
||||
dict := stack[sp-3].(*Dict)
|
||||
k := stack[sp-2]
|
||||
v := stack[sp-1]
|
||||
sp -= 3
|
||||
oldlen := dict.Len()
|
||||
if err2 := dict.SetKey(k, v); err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
if op == compile.SETDICTUNIQ && dict.Len() == oldlen {
|
||||
err = fmt.Errorf("duplicate key: %v", k)
|
||||
break loop
|
||||
}
|
||||
|
||||
case compile.APPEND:
|
||||
elem := stack[sp-1]
|
||||
list := stack[sp-2].(*List)
|
||||
sp -= 2
|
||||
list.elems = append(list.elems, elem)
|
||||
|
||||
case compile.SLICE:
|
||||
x := stack[sp-4]
|
||||
lo := stack[sp-3]
|
||||
hi := stack[sp-2]
|
||||
step := stack[sp-1]
|
||||
sp -= 4
|
||||
res, err2 := slice(x, lo, hi, step)
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
break loop
|
||||
}
|
||||
stack[sp] = res
|
||||
sp++
|
||||
|
||||
case compile.UNPACK:
|
||||
n := int(arg)
|
||||
iterable := stack[sp-1]
|
||||
sp--
|
||||
iter := Iterate(iterable)
|
||||
if iter == nil {
|
||||
err = fmt.Errorf("got %s in sequence assignment", iterable.Type())
|
||||
break loop
|
||||
}
|
||||
i := 0
|
||||
sp += n
|
||||
for i < n && iter.Next(&stack[sp-1-i]) {
|
||||
i++
|
||||
}
|
||||
var dummy Value
|
||||
if iter.Next(&dummy) {
|
||||
// NB: Len may return -1 here in obscure cases.
|
||||
err = fmt.Errorf("too many values to unpack (got %d, want %d)", Len(iterable), n)
|
||||
break loop
|
||||
}
|
||||
iter.Done()
|
||||
if i < n {
|
||||
err = fmt.Errorf("too few values to unpack (got %d, want %d)", i, n)
|
||||
break loop
|
||||
}
|
||||
|
||||
case compile.CJMP:
|
||||
if stack[sp-1].Truth() {
|
||||
pc = arg
|
||||
}
|
||||
sp--
|
||||
|
||||
case compile.CONSTANT:
|
||||
stack[sp] = fn.module.constants[arg]
|
||||
sp++
|
||||
|
||||
case compile.MAKETUPLE:
|
||||
n := int(arg)
|
||||
tuple := make(Tuple, n)
|
||||
sp -= n
|
||||
copy(tuple, stack[sp:])
|
||||
stack[sp] = tuple
|
||||
sp++
|
||||
|
||||
case compile.MAKELIST:
|
||||
n := int(arg)
|
||||
elems := make([]Value, n)
|
||||
sp -= n
|
||||
copy(elems, stack[sp:])
|
||||
stack[sp] = NewList(elems)
|
||||
sp++
|
||||
|
||||
case compile.MAKEFUNC:
|
||||
funcode := f.Prog.Functions[arg]
|
||||
tuple := stack[sp-1].(Tuple)
|
||||
n := len(tuple) - len(funcode.Freevars)
|
||||
defaults := tuple[:n:n]
|
||||
freevars := tuple[n:]
|
||||
stack[sp-1] = &Function{
|
||||
funcode: funcode,
|
||||
module: fn.module,
|
||||
defaults: defaults,
|
||||
freevars: freevars,
|
||||
}
|
||||
|
||||
case compile.LOAD:
|
||||
n := int(arg)
|
||||
module := string(stack[sp-1].(String))
|
||||
sp--
|
||||
|
||||
if thread.Load == nil {
|
||||
err = fmt.Errorf("load not implemented by this application")
|
||||
break loop
|
||||
}
|
||||
|
||||
thread.endProfSpan()
|
||||
dict, err2 := thread.Load(thread, module)
|
||||
thread.beginProfSpan()
|
||||
if err2 != nil {
|
||||
err = wrappedError{
|
||||
msg: fmt.Sprintf("cannot load %s: %v", module, err2),
|
||||
cause: err2,
|
||||
}
|
||||
break loop
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
from := string(stack[sp-1-i].(String))
|
||||
v, ok := dict[from]
|
||||
if !ok {
|
||||
err = fmt.Errorf("load: name %s not found in module %s", from, module)
|
||||
if n := spell.Nearest(from, dict.Keys()); n != "" {
|
||||
err = fmt.Errorf("%s (did you mean %s?)", err, n)
|
||||
}
|
||||
break loop
|
||||
}
|
||||
stack[sp-1-i] = v
|
||||
}
|
||||
|
||||
case compile.SETLOCAL:
|
||||
locals[arg] = stack[sp-1]
|
||||
sp--
|
||||
|
||||
case compile.SETLOCALCELL:
|
||||
locals[arg].(*cell).v = stack[sp-1]
|
||||
sp--
|
||||
|
||||
case compile.SETGLOBAL:
|
||||
fn.module.globals[arg] = stack[sp-1]
|
||||
sp--
|
||||
|
||||
case compile.LOCAL:
|
||||
x := locals[arg]
|
||||
if x == nil {
|
||||
err = fmt.Errorf("local variable %s referenced before assignment", f.Locals[arg].Name)
|
||||
break loop
|
||||
}
|
||||
stack[sp] = x
|
||||
sp++
|
||||
|
||||
case compile.FREE:
|
||||
stack[sp] = fn.freevars[arg]
|
||||
sp++
|
||||
|
||||
case compile.LOCALCELL:
|
||||
v := locals[arg].(*cell).v
|
||||
if v == nil {
|
||||
err = fmt.Errorf("local variable %s referenced before assignment", f.Locals[arg].Name)
|
||||
break loop
|
||||
}
|
||||
stack[sp] = v
|
||||
sp++
|
||||
|
||||
case compile.FREECELL:
|
||||
v := fn.freevars[arg].(*cell).v
|
||||
if v == nil {
|
||||
err = fmt.Errorf("local variable %s referenced before assignment", f.Freevars[arg].Name)
|
||||
break loop
|
||||
}
|
||||
stack[sp] = v
|
||||
sp++
|
||||
|
||||
case compile.GLOBAL:
|
||||
x := fn.module.globals[arg]
|
||||
if x == nil {
|
||||
err = fmt.Errorf("global variable %s referenced before assignment", f.Prog.Globals[arg].Name)
|
||||
break loop
|
||||
}
|
||||
stack[sp] = x
|
||||
sp++
|
||||
|
||||
case compile.PREDECLARED:
|
||||
name := f.Prog.Names[arg]
|
||||
x := fn.module.predeclared[name]
|
||||
if x == nil {
|
||||
err = fmt.Errorf("internal error: predeclared variable %s is uninitialized", name)
|
||||
break loop
|
||||
}
|
||||
stack[sp] = x
|
||||
sp++
|
||||
|
||||
case compile.UNIVERSAL:
|
||||
stack[sp] = Universe[f.Prog.Names[arg]]
|
||||
sp++
|
||||
|
||||
default:
|
||||
err = fmt.Errorf("unimplemented: %s", op)
|
||||
break loop
|
||||
}
|
||||
}
|
||||
// (deferred cleanup runs here)
|
||||
return result, err
|
||||
}
|
||||
|
||||
type wrappedError struct {
|
||||
msg string
|
||||
cause error
|
||||
}
|
||||
|
||||
func (e wrappedError) Error() string {
|
||||
return e.msg
|
||||
}
|
||||
|
||||
// Implements the xerrors.Wrapper interface
|
||||
// https://godoc.org/golang.org/x/xerrors#Wrapper
|
||||
func (e wrappedError) Unwrap() error {
|
||||
return e.cause
|
||||
}
|
||||
|
||||
// mandatory is a sentinel value used in a function's defaults tuple
|
||||
// to indicate that a (keyword-only) parameter is mandatory.
|
||||
type mandatory struct{}
|
||||
|
||||
func (mandatory) String() string { return "mandatory" }
|
||||
func (mandatory) Type() string { return "mandatory" }
|
||||
func (mandatory) Freeze() {} // immutable
|
||||
func (mandatory) Truth() Bool { return False }
|
||||
func (mandatory) Hash() (uint32, error) { return 0, nil }
|
||||
|
||||
// A cell is a box containing a Value.
|
||||
// Local variables marked as cells hold their value indirectly
|
||||
// so that they may be shared by outer and inner nested functions.
|
||||
// Cells are always accessed using indirect {FREE,LOCAL,SETLOCAL}CELL instructions.
|
||||
// The FreeVars tuple contains only cells.
|
||||
// The FREE instruction always yields a cell.
|
||||
type cell struct{ v Value }
|
||||
|
||||
func (c *cell) String() string { return "cell" }
|
||||
func (c *cell) Type() string { return "cell" }
|
||||
func (c *cell) Freeze() {
|
||||
if c.v != nil {
|
||||
c.v.Freeze()
|
||||
}
|
||||
}
|
||||
func (c *cell) Truth() Bool { panic("unreachable") }
|
||||
func (c *cell) Hash() (uint32, error) { panic("unreachable") }
|
||||
2289
vendor/go.starlark.net/starlark/library.go
generated
vendored
2289
vendor/go.starlark.net/starlark/library.go
generated
vendored
File diff suppressed because it is too large
Load Diff
449
vendor/go.starlark.net/starlark/profile.go
generated
vendored
449
vendor/go.starlark.net/starlark/profile.go
generated
vendored
@@ -1,449 +0,0 @@
|
||||
// Copyright 2019 The Bazel 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 starlark
|
||||
|
||||
// This file defines a simple execution-time profiler for Starlark.
|
||||
// It measures the wall time spent executing Starlark code, and emits a
|
||||
// gzipped protocol message in pprof format (github.com/google/pprof).
|
||||
//
|
||||
// When profiling is enabled, the interpreter calls the profiler to
|
||||
// indicate the start and end of each "span" or time interval. A leaf
|
||||
// function (whether Go or Starlark) has a single span. A function that
|
||||
// calls another function has spans for each interval in which it is the
|
||||
// top of the stack. (A LOAD instruction also ends a span.)
|
||||
//
|
||||
// At the start of a span, the interpreter records the current time in
|
||||
// the thread's topmost frame. At the end of the span, it obtains the
|
||||
// time again and subtracts the span start time. The difference is added
|
||||
// to an accumulator variable in the thread. If the accumulator exceeds
|
||||
// some fixed quantum (10ms, say), the profiler records the current call
|
||||
// stack and sends it to the profiler goroutine, along with the number
|
||||
// of quanta, which are subtracted. For example, if the accumulator
|
||||
// holds 3ms and then a completed span adds 25ms to it, its value is 28ms,
|
||||
// which exceeeds 10ms. The profiler records a stack with the value 20ms
|
||||
// (2 quanta), and the accumulator is left with 8ms.
|
||||
//
|
||||
// The profiler goroutine converts the stacks into the pprof format and
|
||||
// emits a gzip-compressed protocol message to the designated output
|
||||
// file. We use a hand-written streaming proto encoder to avoid
|
||||
// dependencies on pprof and proto, and to avoid the need to
|
||||
// materialize the profile data structure in memory.
|
||||
//
|
||||
// A limitation of this profiler is that it measures wall time, which
|
||||
// does not necessarily correspond to CPU time. A CPU profiler requires
|
||||
// that only running (not runnable) threads are sampled; this is
|
||||
// commonly achieved by having the kernel deliver a (PROF) signal to an
|
||||
// arbitrary running thread, through setitimer(2). The CPU profiler in the
|
||||
// Go runtime uses this mechanism, but it is not possible for a Go
|
||||
// application to register a SIGPROF handler, nor is it possible for a
|
||||
// Go handler for some other signal to read the stack pointer of
|
||||
// the interrupted thread.
|
||||
//
|
||||
// Two caveats:
|
||||
// (1) it is tempting to send the leaf Frame directly to the profiler
|
||||
// goroutine instead of making a copy of the stack, since a Frame is a
|
||||
// spaghetti stack--a linked list. However, as soon as execution
|
||||
// resumes, the stack's Frame.pc values may be mutated, so Frames are
|
||||
// not safe to share with the asynchronous profiler goroutine.
|
||||
// (2) it is tempting to use Callables as keys in a map when tabulating
|
||||
// the pprof protocols's Function entities. However, we cannot assume
|
||||
// that Callables are valid map keys, and furthermore we must not
|
||||
// pin function values in memory indefinitely as this may cause lambda
|
||||
// values to keep their free variables live much longer than necessary.
|
||||
|
||||
// TODO(adonovan):
|
||||
// - make Start/Stop fully thread-safe.
|
||||
// - fix the pc hack.
|
||||
// - experiment with other values of quantum.
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"reflect"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
// StartProfile enables time profiling of all Starlark threads,
|
||||
// and writes a profile in pprof format to w.
|
||||
// It must be followed by a call to StopProfiler to stop
|
||||
// the profiler and finalize the profile.
|
||||
//
|
||||
// StartProfile returns an error if profiling was already enabled.
|
||||
//
|
||||
// StartProfile must not be called concurrently with Starlark execution.
|
||||
func StartProfile(w io.Writer) error {
|
||||
if !atomic.CompareAndSwapUint32(&profiler.on, 0, 1) {
|
||||
return fmt.Errorf("profiler already running")
|
||||
}
|
||||
|
||||
// TODO(adonovan): make the API fully concurrency-safe.
|
||||
// The main challenge is racy reads/writes of profiler.events,
|
||||
// and of send/close races on the channel it refers to.
|
||||
// It's easy to solve them with a mutex but harder to do
|
||||
// it efficiently.
|
||||
|
||||
profiler.events = make(chan *profEvent, 1)
|
||||
profiler.done = make(chan error)
|
||||
|
||||
go profile(w)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// StopProfiler stops the profiler started by a prior call to
|
||||
// StartProfile and finalizes the profile. It returns an error if the
|
||||
// profile could not be completed.
|
||||
//
|
||||
// StopProfiler must not be called concurrently with Starlark execution.
|
||||
func StopProfile() error {
|
||||
// Terminate the profiler goroutine and get its result.
|
||||
close(profiler.events)
|
||||
err := <-profiler.done
|
||||
|
||||
profiler.done = nil
|
||||
profiler.events = nil
|
||||
atomic.StoreUint32(&profiler.on, 0)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// globals
|
||||
var profiler struct {
|
||||
on uint32 // nonzero => profiler running
|
||||
events chan *profEvent // profile events from interpreter threads
|
||||
done chan error // indicates profiler goroutine is ready
|
||||
}
|
||||
|
||||
func (thread *Thread) beginProfSpan() {
|
||||
if profiler.events == nil {
|
||||
return // profiling not enabled
|
||||
}
|
||||
|
||||
thread.frameAt(0).spanStart = nanotime()
|
||||
}
|
||||
|
||||
// TODO(adonovan): experiment with smaller values,
|
||||
// which trade space and time for greater precision.
|
||||
const quantum = 10 * time.Millisecond
|
||||
|
||||
func (thread *Thread) endProfSpan() {
|
||||
if profiler.events == nil {
|
||||
return // profiling not enabled
|
||||
}
|
||||
|
||||
// Add the span to the thread's accumulator.
|
||||
thread.proftime += time.Duration(nanotime() - thread.frameAt(0).spanStart)
|
||||
if thread.proftime < quantum {
|
||||
return
|
||||
}
|
||||
|
||||
// Only record complete quanta.
|
||||
n := thread.proftime / quantum
|
||||
thread.proftime -= n * quantum
|
||||
|
||||
// Copy the stack.
|
||||
// (We can't save thread.frame because its pc will change.)
|
||||
ev := &profEvent{
|
||||
thread: thread,
|
||||
time: n * quantum,
|
||||
}
|
||||
ev.stack = ev.stackSpace[:0]
|
||||
for i := range thread.stack {
|
||||
fr := thread.frameAt(i)
|
||||
ev.stack = append(ev.stack, profFrame{
|
||||
pos: fr.Position(),
|
||||
fn: fr.Callable(),
|
||||
pc: fr.pc,
|
||||
})
|
||||
}
|
||||
|
||||
profiler.events <- ev
|
||||
}
|
||||
|
||||
type profEvent struct {
|
||||
thread *Thread // currently unused
|
||||
time time.Duration
|
||||
stack []profFrame
|
||||
stackSpace [8]profFrame // initial space for stack
|
||||
}
|
||||
|
||||
type profFrame struct {
|
||||
fn Callable // don't hold this live for too long (prevents GC of lambdas)
|
||||
pc uint32 // program counter (Starlark frames only)
|
||||
pos syntax.Position // position of pc within this frame
|
||||
}
|
||||
|
||||
// profile is the profiler goroutine.
|
||||
// It runs until StopProfiler is called.
|
||||
func profile(w io.Writer) {
|
||||
// Field numbers from pprof protocol.
|
||||
// See https://github.com/google/pprof/blob/master/proto/profile.proto
|
||||
const (
|
||||
Profile_sample_type = 1 // repeated ValueType
|
||||
Profile_sample = 2 // repeated Sample
|
||||
Profile_mapping = 3 // repeated Mapping
|
||||
Profile_location = 4 // repeated Location
|
||||
Profile_function = 5 // repeated Function
|
||||
Profile_string_table = 6 // repeated string
|
||||
Profile_time_nanos = 9 // int64
|
||||
Profile_duration_nanos = 10 // int64
|
||||
Profile_period_type = 11 // ValueType
|
||||
Profile_period = 12 // int64
|
||||
|
||||
ValueType_type = 1 // int64
|
||||
ValueType_unit = 2 // int64
|
||||
|
||||
Sample_location_id = 1 // repeated uint64
|
||||
Sample_value = 2 // repeated int64
|
||||
Sample_label = 3 // repeated Label
|
||||
|
||||
Label_key = 1 // int64
|
||||
Label_str = 2 // int64
|
||||
Label_num = 3 // int64
|
||||
Label_num_unit = 4 // int64
|
||||
|
||||
Location_id = 1 // uint64
|
||||
Location_mapping_id = 2 // uint64
|
||||
Location_address = 3 // uint64
|
||||
Location_line = 4 // repeated Line
|
||||
|
||||
Line_function_id = 1 // uint64
|
||||
Line_line = 2 // int64
|
||||
|
||||
Function_id = 1 // uint64
|
||||
Function_name = 2 // int64
|
||||
Function_system_name = 3 // int64
|
||||
Function_filename = 4 // int64
|
||||
Function_start_line = 5 // int64
|
||||
)
|
||||
|
||||
bufw := bufio.NewWriter(w) // write file in 4KB (not 240B flate-sized) chunks
|
||||
gz := gzip.NewWriter(bufw)
|
||||
enc := protoEncoder{w: gz}
|
||||
|
||||
// strings
|
||||
stringIndex := make(map[string]int64)
|
||||
str := func(s string) int64 {
|
||||
i, ok := stringIndex[s]
|
||||
if !ok {
|
||||
i = int64(len(stringIndex))
|
||||
enc.string(Profile_string_table, s)
|
||||
stringIndex[s] = i
|
||||
}
|
||||
return i
|
||||
}
|
||||
str("") // entry 0
|
||||
|
||||
// functions
|
||||
//
|
||||
// function returns the ID of a Callable for use in Line.FunctionId.
|
||||
// The ID is the same as the function's logical address,
|
||||
// which is supplied by the caller to avoid the need to recompute it.
|
||||
functionId := make(map[uintptr]uint64)
|
||||
function := func(fn Callable, addr uintptr) uint64 {
|
||||
id, ok := functionId[addr]
|
||||
if !ok {
|
||||
id = uint64(addr)
|
||||
|
||||
var pos syntax.Position
|
||||
if fn, ok := fn.(callableWithPosition); ok {
|
||||
pos = fn.Position()
|
||||
}
|
||||
|
||||
name := fn.Name()
|
||||
if name == "<toplevel>" {
|
||||
name = pos.Filename()
|
||||
}
|
||||
|
||||
nameIndex := str(name)
|
||||
|
||||
fun := new(bytes.Buffer)
|
||||
funenc := protoEncoder{w: fun}
|
||||
funenc.uint(Function_id, id)
|
||||
funenc.int(Function_name, nameIndex)
|
||||
funenc.int(Function_system_name, nameIndex)
|
||||
funenc.int(Function_filename, str(pos.Filename()))
|
||||
funenc.int(Function_start_line, int64(pos.Line))
|
||||
enc.bytes(Profile_function, fun.Bytes())
|
||||
|
||||
functionId[addr] = id
|
||||
}
|
||||
return id
|
||||
}
|
||||
|
||||
// locations
|
||||
//
|
||||
// location returns the ID of the location denoted by fr.
|
||||
// For Starlark frames, this is the Frame pc.
|
||||
locationId := make(map[uintptr]uint64)
|
||||
location := func(fr profFrame) uint64 {
|
||||
fnAddr := profFuncAddr(fr.fn)
|
||||
|
||||
// For Starlark functions, the frame position
|
||||
// represents the current PC value.
|
||||
// Mix it into the low bits of the address.
|
||||
// This is super hacky and may result in collisions
|
||||
// in large functions or if functions are numerous.
|
||||
// TODO(adonovan): fix: try making this cleaner by treating
|
||||
// each bytecode segment as a Profile.Mapping.
|
||||
pcAddr := fnAddr
|
||||
if _, ok := fr.fn.(*Function); ok {
|
||||
pcAddr = (pcAddr << 16) ^ uintptr(fr.pc)
|
||||
}
|
||||
|
||||
id, ok := locationId[pcAddr]
|
||||
if !ok {
|
||||
id = uint64(pcAddr)
|
||||
|
||||
line := new(bytes.Buffer)
|
||||
lineenc := protoEncoder{w: line}
|
||||
lineenc.uint(Line_function_id, function(fr.fn, fnAddr))
|
||||
lineenc.int(Line_line, int64(fr.pos.Line))
|
||||
loc := new(bytes.Buffer)
|
||||
locenc := protoEncoder{w: loc}
|
||||
locenc.uint(Location_id, id)
|
||||
locenc.uint(Location_address, uint64(pcAddr))
|
||||
locenc.bytes(Location_line, line.Bytes())
|
||||
enc.bytes(Profile_location, loc.Bytes())
|
||||
|
||||
locationId[pcAddr] = id
|
||||
}
|
||||
return id
|
||||
}
|
||||
|
||||
wallNanos := new(bytes.Buffer)
|
||||
wnenc := protoEncoder{w: wallNanos}
|
||||
wnenc.int(ValueType_type, str("wall"))
|
||||
wnenc.int(ValueType_unit, str("nanoseconds"))
|
||||
|
||||
// informational fields of Profile
|
||||
enc.bytes(Profile_sample_type, wallNanos.Bytes())
|
||||
enc.int(Profile_period, quantum.Nanoseconds()) // magnitude of sampling period
|
||||
enc.bytes(Profile_period_type, wallNanos.Bytes()) // dimension and unit of period
|
||||
enc.int(Profile_time_nanos, time.Now().UnixNano()) // start (real) time of profile
|
||||
|
||||
startNano := nanotime()
|
||||
|
||||
// Read profile events from the channel
|
||||
// until it is closed by StopProfiler.
|
||||
for e := range profiler.events {
|
||||
sample := new(bytes.Buffer)
|
||||
sampleenc := protoEncoder{w: sample}
|
||||
sampleenc.int(Sample_value, e.time.Nanoseconds()) // wall nanoseconds
|
||||
for _, fr := range e.stack {
|
||||
sampleenc.uint(Sample_location_id, location(fr))
|
||||
}
|
||||
enc.bytes(Profile_sample, sample.Bytes())
|
||||
}
|
||||
|
||||
endNano := nanotime()
|
||||
enc.int(Profile_duration_nanos, endNano-startNano)
|
||||
|
||||
err := gz.Close() // Close reports any prior write error
|
||||
if flushErr := bufw.Flush(); err == nil {
|
||||
err = flushErr
|
||||
}
|
||||
profiler.done <- err
|
||||
}
|
||||
|
||||
// nanotime returns the time in nanoseconds since epoch.
|
||||
// It is implemented by runtime.nanotime using the linkname hack;
|
||||
// runtime.nanotime is defined for all OSs/ARCHS and uses the
|
||||
// monotonic system clock, which there is no portable way to access.
|
||||
// Should that function ever go away, these alternatives exist:
|
||||
//
|
||||
// // POSIX only. REALTIME not MONOTONIC. 17ns.
|
||||
// var tv syscall.Timeval
|
||||
// syscall.Gettimeofday(&tv) // can't fail
|
||||
// return tv.Nano()
|
||||
//
|
||||
// // Portable. REALTIME not MONOTONIC. 46ns.
|
||||
// return time.Now().Nanoseconds()
|
||||
//
|
||||
// // POSIX only. Adds a dependency.
|
||||
// import "golang.org/x/sys/unix"
|
||||
// var ts unix.Timespec
|
||||
// unix.ClockGettime(CLOCK_MONOTONIC, &ts) // can't fail
|
||||
// return unix.TimespecToNsec(ts)
|
||||
//
|
||||
//go:linkname nanotime runtime.nanotime
|
||||
func nanotime() int64
|
||||
|
||||
// profFuncAddr returns the canonical "address"
|
||||
// of a Callable for use by the profiler.
|
||||
func profFuncAddr(fn Callable) uintptr {
|
||||
switch fn := fn.(type) {
|
||||
case *Builtin:
|
||||
return reflect.ValueOf(fn.fn).Pointer()
|
||||
case *Function:
|
||||
return uintptr(unsafe.Pointer(fn.funcode))
|
||||
}
|
||||
|
||||
// User-defined callable types are typically of
|
||||
// of kind pointer-to-struct. Handle them specially.
|
||||
if v := reflect.ValueOf(fn); v.Type().Kind() == reflect.Ptr {
|
||||
return v.Pointer()
|
||||
}
|
||||
|
||||
// Address zero is reserved by the protocol.
|
||||
// Use 1 for callables we don't recognize.
|
||||
log.Printf("Starlark profiler: no address for Callable %T", fn)
|
||||
return 1
|
||||
}
|
||||
|
||||
// We encode the protocol message by hand to avoid making
|
||||
// the interpreter depend on both github.com/google/pprof
|
||||
// and github.com/golang/protobuf.
|
||||
//
|
||||
// This also avoids the need to materialize a protocol message object
|
||||
// tree of unbounded size and serialize it all at the end.
|
||||
// The pprof format appears to have been designed to
|
||||
// permit streaming implementations such as this one.
|
||||
//
|
||||
// See https://developers.google.com/protocol-buffers/docs/encoding.
|
||||
type protoEncoder struct {
|
||||
w io.Writer // *bytes.Buffer or *gzip.Writer
|
||||
tmp [binary.MaxVarintLen64]byte
|
||||
}
|
||||
|
||||
func (e *protoEncoder) uvarint(x uint64) {
|
||||
n := binary.PutUvarint(e.tmp[:], x)
|
||||
e.w.Write(e.tmp[:n])
|
||||
}
|
||||
|
||||
func (e *protoEncoder) tag(field, wire uint) {
|
||||
e.uvarint(uint64(field<<3 | wire))
|
||||
}
|
||||
|
||||
func (e *protoEncoder) string(field uint, s string) {
|
||||
e.tag(field, 2) // length-delimited
|
||||
e.uvarint(uint64(len(s)))
|
||||
io.WriteString(e.w, s)
|
||||
}
|
||||
|
||||
func (e *protoEncoder) bytes(field uint, b []byte) {
|
||||
e.tag(field, 2) // length-delimited
|
||||
e.uvarint(uint64(len(b)))
|
||||
e.w.Write(b)
|
||||
}
|
||||
|
||||
func (e *protoEncoder) uint(field uint, x uint64) {
|
||||
e.tag(field, 0) // varint
|
||||
e.uvarint(x)
|
||||
}
|
||||
|
||||
func (e *protoEncoder) int(field uint, x int64) {
|
||||
e.tag(field, 0) // varint
|
||||
e.uvarint(uint64(x))
|
||||
}
|
||||
355
vendor/go.starlark.net/starlark/unpack.go
generated
vendored
355
vendor/go.starlark.net/starlark/unpack.go
generated
vendored
@@ -1,355 +0,0 @@
|
||||
package starlark
|
||||
|
||||
// This file defines the Unpack helper functions used by
|
||||
// built-in functions to interpret their call arguments.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"go.starlark.net/internal/spell"
|
||||
)
|
||||
|
||||
// An Unpacker defines custom argument unpacking behavior.
|
||||
// See UnpackArgs.
|
||||
type Unpacker interface {
|
||||
Unpack(v Value) error
|
||||
}
|
||||
|
||||
// UnpackArgs unpacks the positional and keyword arguments into the
|
||||
// supplied parameter variables. pairs is an alternating list of names
|
||||
// and pointers to variables.
|
||||
//
|
||||
// If the variable is a bool, integer, string, *List, *Dict, Callable,
|
||||
// Iterable, or user-defined implementation of Value,
|
||||
// UnpackArgs performs the appropriate type check.
|
||||
// Predeclared Go integer types uses the AsInt check.
|
||||
//
|
||||
// If the parameter name ends with "?", it is optional.
|
||||
//
|
||||
// If the parameter name ends with "??", it is optional and treats the None value
|
||||
// as if the argument was absent.
|
||||
//
|
||||
// If a parameter is marked optional, then all following parameters are
|
||||
// implicitly optional where or not they are marked.
|
||||
//
|
||||
// If the variable implements Unpacker, its Unpack argument
|
||||
// is called with the argument value, allowing an application
|
||||
// to define its own argument validation and conversion.
|
||||
//
|
||||
// If the variable implements Value, UnpackArgs may call
|
||||
// its Type() method while constructing the error message.
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// var (
|
||||
// a Value
|
||||
// b = MakeInt(42)
|
||||
// c Value = starlark.None
|
||||
// )
|
||||
//
|
||||
// // 1. mixed parameters, like def f(a, b=42, c=None).
|
||||
// err := UnpackArgs("f", args, kwargs, "a", &a, "b?", &b, "c?", &c)
|
||||
//
|
||||
// // 2. keyword parameters only, like def f(*, a, b, c=None).
|
||||
// if len(args) > 0 {
|
||||
// return fmt.Errorf("f: unexpected positional arguments")
|
||||
// }
|
||||
// err := UnpackArgs("f", args, kwargs, "a", &a, "b?", &b, "c?", &c)
|
||||
//
|
||||
// // 3. positional parameters only, like def f(a, b=42, c=None, /) in Python 3.8.
|
||||
// err := UnpackPositionalArgs("f", args, kwargs, 1, &a, &b, &c)
|
||||
//
|
||||
// More complex forms such as def f(a, b=42, *args, c, d=123, **kwargs)
|
||||
// require additional logic, but their need in built-ins is exceedingly rare.
|
||||
//
|
||||
// In the examples above, the declaration of b with type Int causes UnpackArgs
|
||||
// to require that b's argument value, if provided, is also an int.
|
||||
// To allow arguments of any type, while retaining the default value of 42,
|
||||
// declare b as a Value:
|
||||
//
|
||||
// var b Value = MakeInt(42)
|
||||
//
|
||||
// The zero value of a variable of type Value, such as 'a' in the
|
||||
// examples above, is not a valid Starlark value, so if the parameter is
|
||||
// optional, the caller must explicitly handle the default case by
|
||||
// interpreting nil as None or some computed default. The same is true
|
||||
// for the zero values of variables of type *List, *Dict, Callable, or
|
||||
// Iterable. For example:
|
||||
//
|
||||
// // def myfunc(d=None, e=[], f={})
|
||||
// var (
|
||||
// d Value
|
||||
// e *List
|
||||
// f *Dict
|
||||
// )
|
||||
// err := UnpackArgs("myfunc", args, kwargs, "d?", &d, "e?", &e, "f?", &f)
|
||||
// if d == nil { d = None; }
|
||||
// if e == nil { e = new(List); }
|
||||
// if f == nil { f = new(Dict); }
|
||||
//
|
||||
func UnpackArgs(fnname string, args Tuple, kwargs []Tuple, pairs ...interface{}) error {
|
||||
nparams := len(pairs) / 2
|
||||
var defined intset
|
||||
defined.init(nparams)
|
||||
|
||||
paramName := func(x interface{}) (name string, skipNone bool) { // (no free variables)
|
||||
name = x.(string)
|
||||
if strings.HasSuffix(name, "??") {
|
||||
name = strings.TrimSuffix(name, "??")
|
||||
skipNone = true
|
||||
} else if name[len(name)-1] == '?' {
|
||||
name = name[:len(name)-1]
|
||||
}
|
||||
|
||||
return name, skipNone
|
||||
}
|
||||
|
||||
// positional arguments
|
||||
if len(args) > nparams {
|
||||
return fmt.Errorf("%s: got %d arguments, want at most %d",
|
||||
fnname, len(args), nparams)
|
||||
}
|
||||
for i, arg := range args {
|
||||
defined.set(i)
|
||||
name, skipNone := paramName(pairs[2*i])
|
||||
if skipNone {
|
||||
if _, isNone := arg.(NoneType); isNone {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if err := unpackOneArg(arg, pairs[2*i+1]); err != nil {
|
||||
return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err)
|
||||
}
|
||||
}
|
||||
|
||||
// keyword arguments
|
||||
kwloop:
|
||||
for _, item := range kwargs {
|
||||
name, arg := item[0].(String), item[1]
|
||||
for i := 0; i < nparams; i++ {
|
||||
pName, skipNone := paramName(pairs[2*i])
|
||||
if pName == string(name) {
|
||||
// found it
|
||||
if defined.set(i) {
|
||||
return fmt.Errorf("%s: got multiple values for keyword argument %s",
|
||||
fnname, name)
|
||||
}
|
||||
|
||||
if skipNone {
|
||||
if _, isNone := arg.(NoneType); isNone {
|
||||
continue kwloop
|
||||
}
|
||||
}
|
||||
|
||||
ptr := pairs[2*i+1]
|
||||
if err := unpackOneArg(arg, ptr); err != nil {
|
||||
return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err)
|
||||
}
|
||||
continue kwloop
|
||||
}
|
||||
}
|
||||
err := fmt.Errorf("%s: unexpected keyword argument %s", fnname, name)
|
||||
names := make([]string, 0, nparams)
|
||||
for i := 0; i < nparams; i += 2 {
|
||||
param, _ := paramName(pairs[i])
|
||||
names = append(names, param)
|
||||
}
|
||||
if n := spell.Nearest(string(name), names); n != "" {
|
||||
err = fmt.Errorf("%s (did you mean %s?)", err.Error(), n)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// Check that all non-optional parameters are defined.
|
||||
// (We needn't check the first len(args).)
|
||||
for i := len(args); i < nparams; i++ {
|
||||
name := pairs[2*i].(string)
|
||||
if strings.HasSuffix(name, "?") {
|
||||
break // optional
|
||||
}
|
||||
if !defined.get(i) {
|
||||
return fmt.Errorf("%s: missing argument for %s", fnname, name)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnpackPositionalArgs unpacks the positional arguments into
|
||||
// corresponding variables. Each element of vars is a pointer; see
|
||||
// UnpackArgs for allowed types and conversions.
|
||||
//
|
||||
// UnpackPositionalArgs reports an error if the number of arguments is
|
||||
// less than min or greater than len(vars), if kwargs is nonempty, or if
|
||||
// any conversion fails.
|
||||
//
|
||||
// See UnpackArgs for general comments.
|
||||
func UnpackPositionalArgs(fnname string, args Tuple, kwargs []Tuple, min int, vars ...interface{}) error {
|
||||
if len(kwargs) > 0 {
|
||||
return fmt.Errorf("%s: unexpected keyword arguments", fnname)
|
||||
}
|
||||
max := len(vars)
|
||||
if len(args) < min {
|
||||
var atleast string
|
||||
if min < max {
|
||||
atleast = "at least "
|
||||
}
|
||||
return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atleast, min)
|
||||
}
|
||||
if len(args) > max {
|
||||
var atmost string
|
||||
if max > min {
|
||||
atmost = "at most "
|
||||
}
|
||||
return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atmost, max)
|
||||
}
|
||||
for i, arg := range args {
|
||||
if err := unpackOneArg(arg, vars[i]); err != nil {
|
||||
return fmt.Errorf("%s: for parameter %d: %s", fnname, i+1, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func unpackOneArg(v Value, ptr interface{}) error {
|
||||
// On failure, don't clobber *ptr.
|
||||
switch ptr := ptr.(type) {
|
||||
case Unpacker:
|
||||
return ptr.Unpack(v)
|
||||
case *Value:
|
||||
*ptr = v
|
||||
case *string:
|
||||
s, ok := AsString(v)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want string", v.Type())
|
||||
}
|
||||
*ptr = s
|
||||
case *bool:
|
||||
b, ok := v.(Bool)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want bool", v.Type())
|
||||
}
|
||||
*ptr = bool(b)
|
||||
case *int, *int8, *int16, *int32, *int64,
|
||||
*uint, *uint8, *uint16, *uint32, *uint64, *uintptr:
|
||||
return AsInt(v, ptr)
|
||||
case *float64:
|
||||
f, ok := v.(Float)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want float", v.Type())
|
||||
}
|
||||
*ptr = float64(f)
|
||||
case **List:
|
||||
list, ok := v.(*List)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want list", v.Type())
|
||||
}
|
||||
*ptr = list
|
||||
case **Dict:
|
||||
dict, ok := v.(*Dict)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want dict", v.Type())
|
||||
}
|
||||
*ptr = dict
|
||||
case *Callable:
|
||||
f, ok := v.(Callable)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want callable", v.Type())
|
||||
}
|
||||
*ptr = f
|
||||
case *Iterable:
|
||||
it, ok := v.(Iterable)
|
||||
if !ok {
|
||||
return fmt.Errorf("got %s, want iterable", v.Type())
|
||||
}
|
||||
*ptr = it
|
||||
default:
|
||||
// v must have type *V, where V is some subtype of starlark.Value.
|
||||
ptrv := reflect.ValueOf(ptr)
|
||||
if ptrv.Kind() != reflect.Ptr {
|
||||
log.Panicf("internal error: not a pointer: %T", ptr)
|
||||
}
|
||||
paramVar := ptrv.Elem()
|
||||
if !reflect.TypeOf(v).AssignableTo(paramVar.Type()) {
|
||||
// The value is not assignable to the variable.
|
||||
|
||||
// Detect a possible bug in the Go program that called Unpack:
|
||||
// If the variable *ptr is not a subtype of Value,
|
||||
// no value of v can possibly work.
|
||||
if !paramVar.Type().AssignableTo(reflect.TypeOf(new(Value)).Elem()) {
|
||||
log.Panicf("pointer element type does not implement Value: %T", ptr)
|
||||
}
|
||||
|
||||
// Report Starlark dynamic type error.
|
||||
//
|
||||
// We prefer the Starlark Value.Type name over
|
||||
// its Go reflect.Type name, but calling the
|
||||
// Value.Type method on the variable is not safe
|
||||
// in general. If the variable is an interface,
|
||||
// the call will fail. Even if the variable has
|
||||
// a concrete type, it might not be safe to call
|
||||
// Type() on a zero instance. Thus we must use
|
||||
// recover.
|
||||
|
||||
// Default to Go reflect.Type name
|
||||
paramType := paramVar.Type().String()
|
||||
|
||||
// Attempt to call Value.Type method.
|
||||
func() {
|
||||
defer func() { recover() }()
|
||||
if typer, _ := paramVar.Interface().(interface{ Type() string }); typer != nil {
|
||||
paramType = typer.Type()
|
||||
}
|
||||
}()
|
||||
return fmt.Errorf("got %s, want %s", v.Type(), paramType)
|
||||
}
|
||||
paramVar.Set(reflect.ValueOf(v))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type intset struct {
|
||||
small uint64 // bitset, used if n < 64
|
||||
large map[int]bool // set, used if n >= 64
|
||||
}
|
||||
|
||||
func (is *intset) init(n int) {
|
||||
if n >= 64 {
|
||||
is.large = make(map[int]bool)
|
||||
}
|
||||
}
|
||||
|
||||
func (is *intset) set(i int) (prev bool) {
|
||||
if is.large == nil {
|
||||
prev = is.small&(1<<uint(i)) != 0
|
||||
is.small |= 1 << uint(i)
|
||||
} else {
|
||||
prev = is.large[i]
|
||||
is.large[i] = true
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (is *intset) get(i int) bool {
|
||||
if is.large == nil {
|
||||
return is.small&(1<<uint(i)) != 0
|
||||
}
|
||||
return is.large[i]
|
||||
}
|
||||
|
||||
func (is *intset) len() int {
|
||||
if is.large == nil {
|
||||
// Suboptimal, but used only for error reporting.
|
||||
len := 0
|
||||
for i := 0; i < 64; i++ {
|
||||
if is.small&(1<<uint(i)) != 0 {
|
||||
len++
|
||||
}
|
||||
}
|
||||
return len
|
||||
}
|
||||
return len(is.large)
|
||||
}
|
||||
1500
vendor/go.starlark.net/starlark/value.go
generated
vendored
1500
vendor/go.starlark.net/starlark/value.go
generated
vendored
File diff suppressed because it is too large
Load Diff
43
vendor/go.starlark.net/starlarkstruct/module.go
generated
vendored
43
vendor/go.starlark.net/starlarkstruct/module.go
generated
vendored
@@ -1,43 +0,0 @@
|
||||
package starlarkstruct
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
)
|
||||
|
||||
// A Module is a named collection of values,
|
||||
// typically a suite of functions imported by a load statement.
|
||||
//
|
||||
// It differs from Struct primarily in that its string representation
|
||||
// does not enumerate its fields.
|
||||
type Module struct {
|
||||
Name string
|
||||
Members starlark.StringDict
|
||||
}
|
||||
|
||||
var _ starlark.HasAttrs = (*Module)(nil)
|
||||
|
||||
func (m *Module) Attr(name string) (starlark.Value, error) { return m.Members[name], nil }
|
||||
func (m *Module) AttrNames() []string { return m.Members.Keys() }
|
||||
func (m *Module) Freeze() { m.Members.Freeze() }
|
||||
func (m *Module) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: %s", m.Type()) }
|
||||
func (m *Module) String() string { return fmt.Sprintf("<module %q>", m.Name) }
|
||||
func (m *Module) Truth() starlark.Bool { return true }
|
||||
func (m *Module) Type() string { return "module" }
|
||||
|
||||
// MakeModule may be used as the implementation of a Starlark built-in
|
||||
// function, module(name, **kwargs). It returns a new module with the
|
||||
// specified name and members.
|
||||
func MakeModule(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
|
||||
var name string
|
||||
if err := starlark.UnpackPositionalArgs(b.Name(), args, nil, 1, &name); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
members := make(starlark.StringDict, len(kwargs))
|
||||
for _, kwarg := range kwargs {
|
||||
k := string(kwarg[0].(starlark.String))
|
||||
members[k] = kwarg[1]
|
||||
}
|
||||
return &Module{name, members}, nil
|
||||
}
|
||||
282
vendor/go.starlark.net/starlarkstruct/struct.go
generated
vendored
282
vendor/go.starlark.net/starlarkstruct/struct.go
generated
vendored
@@ -1,282 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 starlarkstruct defines the Starlark types 'struct' and
|
||||
// 'module', both optional language extensions.
|
||||
//
|
||||
package starlarkstruct // import "go.starlark.net/starlarkstruct"
|
||||
|
||||
// It is tempting to introduce a variant of Struct that is a wrapper
|
||||
// around a Go struct value, for stronger typing guarantees and more
|
||||
// efficient and convenient field lookup. However:
|
||||
// 1) all fields of Starlark structs are optional, so we cannot represent
|
||||
// them using more specific types such as String, Int, *Depset, and
|
||||
// *File, as such types give no way to represent missing fields.
|
||||
// 2) the efficiency gain of direct struct field access is rather
|
||||
// marginal: finding the index of a field by binary searching on the
|
||||
// sorted list of field names is quite fast compared to the other
|
||||
// overheads.
|
||||
// 3) the gains in compactness and spatial locality are also rather
|
||||
// marginal: the array behind the []entry slice is (due to field name
|
||||
// strings) only a factor of 2 larger than the corresponding Go struct
|
||||
// would be, and, like the Go struct, requires only a single allocation.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
"go.starlark.net/syntax"
|
||||
)
|
||||
|
||||
// Make is the implementation of a built-in function that instantiates
|
||||
// an immutable struct from the specified keyword arguments.
|
||||
//
|
||||
// An application can add 'struct' to the Starlark environment like so:
|
||||
//
|
||||
// globals := starlark.StringDict{
|
||||
// "struct": starlark.NewBuiltin("struct", starlarkstruct.Make),
|
||||
// }
|
||||
//
|
||||
func Make(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
|
||||
if len(args) > 0 {
|
||||
return nil, fmt.Errorf("struct: unexpected positional arguments")
|
||||
}
|
||||
return FromKeywords(Default, kwargs), nil
|
||||
}
|
||||
|
||||
// FromKeywords returns a new struct instance whose fields are specified by the
|
||||
// key/value pairs in kwargs. (Each kwargs[i][0] must be a starlark.String.)
|
||||
func FromKeywords(constructor starlark.Value, kwargs []starlark.Tuple) *Struct {
|
||||
if constructor == nil {
|
||||
panic("nil constructor")
|
||||
}
|
||||
s := &Struct{
|
||||
constructor: constructor,
|
||||
entries: make(entries, 0, len(kwargs)),
|
||||
}
|
||||
for _, kwarg := range kwargs {
|
||||
k := string(kwarg[0].(starlark.String))
|
||||
v := kwarg[1]
|
||||
s.entries = append(s.entries, entry{k, v})
|
||||
}
|
||||
sort.Sort(s.entries)
|
||||
return s
|
||||
}
|
||||
|
||||
// FromStringDict returns a new struct instance whose elements are those of d.
|
||||
// The constructor parameter specifies the constructor; use Default for an ordinary struct.
|
||||
func FromStringDict(constructor starlark.Value, d starlark.StringDict) *Struct {
|
||||
if constructor == nil {
|
||||
panic("nil constructor")
|
||||
}
|
||||
s := &Struct{
|
||||
constructor: constructor,
|
||||
entries: make(entries, 0, len(d)),
|
||||
}
|
||||
for k, v := range d {
|
||||
s.entries = append(s.entries, entry{k, v})
|
||||
}
|
||||
sort.Sort(s.entries)
|
||||
return s
|
||||
}
|
||||
|
||||
// Struct is an immutable Starlark type that maps field names to values.
|
||||
// It is not iterable and does not support len.
|
||||
//
|
||||
// A struct has a constructor, a distinct value that identifies a class
|
||||
// of structs, and which appears in the struct's string representation.
|
||||
//
|
||||
// Operations such as x+y fail if the constructors of the two operands
|
||||
// are not equal.
|
||||
//
|
||||
// The default constructor, Default, is the string "struct", but
|
||||
// clients may wish to 'brand' structs for their own purposes.
|
||||
// The constructor value appears in the printed form of the value,
|
||||
// and is accessible using the Constructor method.
|
||||
//
|
||||
// Use Attr to access its fields and AttrNames to enumerate them.
|
||||
type Struct struct {
|
||||
constructor starlark.Value
|
||||
entries entries // sorted by name
|
||||
}
|
||||
|
||||
// Default is the default constructor for structs.
|
||||
// It is merely the string "struct".
|
||||
const Default = starlark.String("struct")
|
||||
|
||||
type entries []entry
|
||||
|
||||
func (a entries) Len() int { return len(a) }
|
||||
func (a entries) Less(i, j int) bool { return a[i].name < a[j].name }
|
||||
func (a entries) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||
|
||||
type entry struct {
|
||||
name string
|
||||
value starlark.Value
|
||||
}
|
||||
|
||||
var (
|
||||
_ starlark.HasAttrs = (*Struct)(nil)
|
||||
_ starlark.HasBinary = (*Struct)(nil)
|
||||
)
|
||||
|
||||
// ToStringDict adds a name/value entry to d for each field of the struct.
|
||||
func (s *Struct) ToStringDict(d starlark.StringDict) {
|
||||
for _, e := range s.entries {
|
||||
d[e.name] = e.value
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Struct) String() string {
|
||||
buf := new(strings.Builder)
|
||||
switch constructor := s.constructor.(type) {
|
||||
case starlark.String:
|
||||
// NB: The Java implementation always prints struct
|
||||
// even for Bazel provider instances.
|
||||
buf.WriteString(constructor.GoString()) // avoid String()'s quotation
|
||||
default:
|
||||
buf.WriteString(s.constructor.String())
|
||||
}
|
||||
buf.WriteByte('(')
|
||||
for i, e := range s.entries {
|
||||
if i > 0 {
|
||||
buf.WriteString(", ")
|
||||
}
|
||||
buf.WriteString(e.name)
|
||||
buf.WriteString(" = ")
|
||||
buf.WriteString(e.value.String())
|
||||
}
|
||||
buf.WriteByte(')')
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// Constructor returns the constructor used to create this struct.
|
||||
func (s *Struct) Constructor() starlark.Value { return s.constructor }
|
||||
|
||||
func (s *Struct) Type() string { return "struct" }
|
||||
func (s *Struct) Truth() starlark.Bool { return true } // even when empty
|
||||
func (s *Struct) Hash() (uint32, error) {
|
||||
// Same algorithm as Tuple.hash, but with different primes.
|
||||
var x, m uint32 = 8731, 9839
|
||||
for _, e := range s.entries {
|
||||
namehash, _ := starlark.String(e.name).Hash()
|
||||
x = x ^ 3*namehash
|
||||
y, err := e.value.Hash()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
x = x ^ y*m
|
||||
m += 7349
|
||||
}
|
||||
return x, nil
|
||||
}
|
||||
func (s *Struct) Freeze() {
|
||||
for _, e := range s.entries {
|
||||
e.value.Freeze()
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Struct) Binary(op syntax.Token, y starlark.Value, side starlark.Side) (starlark.Value, error) {
|
||||
if y, ok := y.(*Struct); ok && op == syntax.PLUS {
|
||||
if side == starlark.Right {
|
||||
x, y = y, x
|
||||
}
|
||||
|
||||
if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil {
|
||||
return nil, fmt.Errorf("in %s + %s: error comparing constructors: %v",
|
||||
x.constructor, y.constructor, err)
|
||||
} else if !eq {
|
||||
return nil, fmt.Errorf("cannot add structs of different constructors: %s + %s",
|
||||
x.constructor, y.constructor)
|
||||
}
|
||||
|
||||
z := make(starlark.StringDict, x.len()+y.len())
|
||||
for _, e := range x.entries {
|
||||
z[e.name] = e.value
|
||||
}
|
||||
for _, e := range y.entries {
|
||||
z[e.name] = e.value
|
||||
}
|
||||
|
||||
return FromStringDict(x.constructor, z), nil
|
||||
}
|
||||
return nil, nil // unhandled
|
||||
}
|
||||
|
||||
// Attr returns the value of the specified field.
|
||||
func (s *Struct) Attr(name string) (starlark.Value, error) {
|
||||
// Binary search the entries.
|
||||
// This implementation is a specialization of
|
||||
// sort.Search that avoids dynamic dispatch.
|
||||
n := len(s.entries)
|
||||
i, j := 0, n
|
||||
for i < j {
|
||||
h := int(uint(i+j) >> 1)
|
||||
if s.entries[h].name < name {
|
||||
i = h + 1
|
||||
} else {
|
||||
j = h
|
||||
}
|
||||
}
|
||||
if i < n && s.entries[i].name == name {
|
||||
return s.entries[i].value, nil
|
||||
}
|
||||
|
||||
var ctor string
|
||||
if s.constructor != Default {
|
||||
ctor = s.constructor.String() + " "
|
||||
}
|
||||
return nil, starlark.NoSuchAttrError(
|
||||
fmt.Sprintf("%sstruct has no .%s attribute", ctor, name))
|
||||
}
|
||||
|
||||
func (s *Struct) len() int { return len(s.entries) }
|
||||
|
||||
// AttrNames returns a new sorted list of the struct fields.
|
||||
func (s *Struct) AttrNames() []string {
|
||||
names := make([]string, len(s.entries))
|
||||
for i, e := range s.entries {
|
||||
names[i] = e.name
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
func (x *Struct) CompareSameType(op syntax.Token, y_ starlark.Value, depth int) (bool, error) {
|
||||
y := y_.(*Struct)
|
||||
switch op {
|
||||
case syntax.EQL:
|
||||
return structsEqual(x, y, depth)
|
||||
case syntax.NEQ:
|
||||
eq, err := structsEqual(x, y, depth)
|
||||
return !eq, err
|
||||
default:
|
||||
return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type())
|
||||
}
|
||||
}
|
||||
|
||||
func structsEqual(x, y *Struct, depth int) (bool, error) {
|
||||
if x.len() != y.len() {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil {
|
||||
return false, fmt.Errorf("error comparing struct constructors %v and %v: %v",
|
||||
x.constructor, y.constructor, err)
|
||||
} else if !eq {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
for i, n := 0, x.len(); i < n; i++ {
|
||||
if x.entries[i].name != y.entries[i].name {
|
||||
return false, nil
|
||||
} else if eq, err := starlark.EqualDepth(x.entries[i].value, y.entries[i].value, depth-1); err != nil {
|
||||
return false, err
|
||||
} else if !eq {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
129
vendor/go.starlark.net/syntax/grammar.txt
generated
vendored
129
vendor/go.starlark.net/syntax/grammar.txt
generated
vendored
@@ -1,129 +0,0 @@
|
||||
|
||||
Grammar of Starlark
|
||||
==================
|
||||
|
||||
File = {Statement | newline} eof .
|
||||
|
||||
Statement = DefStmt | IfStmt | ForStmt | WhileStmt | SimpleStmt .
|
||||
|
||||
DefStmt = 'def' identifier '(' [Parameters [',']] ')' ':' Suite .
|
||||
|
||||
Parameters = Parameter {',' Parameter}.
|
||||
|
||||
Parameter = identifier | identifier '=' Test | '*' | '*' identifier | '**' identifier .
|
||||
|
||||
IfStmt = 'if' Test ':' Suite {'elif' Test ':' Suite} ['else' ':' Suite] .
|
||||
|
||||
ForStmt = 'for' LoopVariables 'in' Expression ':' Suite .
|
||||
|
||||
WhileStmt = 'while' Test ':' Suite .
|
||||
|
||||
Suite = [newline indent {Statement} outdent] | SimpleStmt .
|
||||
|
||||
SimpleStmt = SmallStmt {';' SmallStmt} [';'] '\n' .
|
||||
# NOTE: '\n' optional at EOF
|
||||
|
||||
SmallStmt = ReturnStmt
|
||||
| BreakStmt | ContinueStmt | PassStmt
|
||||
| AssignStmt
|
||||
| ExprStmt
|
||||
| LoadStmt
|
||||
.
|
||||
|
||||
ReturnStmt = 'return' [Expression] .
|
||||
BreakStmt = 'break' .
|
||||
ContinueStmt = 'continue' .
|
||||
PassStmt = 'pass' .
|
||||
AssignStmt = Expression ('=' | '+=' | '-=' | '*=' | '/=' | '//=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=') Expression .
|
||||
ExprStmt = Expression .
|
||||
|
||||
LoadStmt = 'load' '(' string {',' [identifier '='] string} [','] ')' .
|
||||
|
||||
Test = LambdaExpr
|
||||
| IfExpr
|
||||
| PrimaryExpr
|
||||
| UnaryExpr
|
||||
| BinaryExpr
|
||||
.
|
||||
|
||||
LambdaExpr = 'lambda' [Parameters] ':' Test .
|
||||
|
||||
IfExpr = Test 'if' Test 'else' Test .
|
||||
|
||||
PrimaryExpr = Operand
|
||||
| PrimaryExpr DotSuffix
|
||||
| PrimaryExpr CallSuffix
|
||||
| PrimaryExpr SliceSuffix
|
||||
.
|
||||
|
||||
Operand = identifier
|
||||
| int | float | string
|
||||
| ListExpr | ListComp
|
||||
| DictExpr | DictComp
|
||||
| '(' [Expression [',']] ')'
|
||||
| ('-' | '+') PrimaryExpr
|
||||
.
|
||||
|
||||
DotSuffix = '.' identifier .
|
||||
CallSuffix = '(' [Arguments [',']] ')' .
|
||||
SliceSuffix = '[' [Expression] [':' Test [':' Test]] ']' .
|
||||
|
||||
Arguments = Argument {',' Argument} .
|
||||
Argument = Test | identifier '=' Test | '*' Test | '**' Test .
|
||||
|
||||
ListExpr = '[' [Expression [',']] ']' .
|
||||
ListComp = '[' Test {CompClause} ']'.
|
||||
|
||||
DictExpr = '{' [Entries [',']] '}' .
|
||||
DictComp = '{' Entry {CompClause} '}' .
|
||||
Entries = Entry {',' Entry} .
|
||||
Entry = Test ':' Test .
|
||||
|
||||
CompClause = 'for' LoopVariables 'in' Test | 'if' Test .
|
||||
|
||||
UnaryExpr = 'not' Test .
|
||||
|
||||
BinaryExpr = Test {Binop Test} .
|
||||
|
||||
Binop = 'or'
|
||||
| 'and'
|
||||
| '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in' | 'not' 'in'
|
||||
| '|'
|
||||
| '^'
|
||||
| '&'
|
||||
| '-' | '+'
|
||||
| '*' | '%' | '/' | '//'
|
||||
.
|
||||
|
||||
Expression = Test {',' Test} .
|
||||
# NOTE: trailing comma permitted only when within [...] or (...).
|
||||
|
||||
LoopVariables = PrimaryExpr {',' PrimaryExpr} .
|
||||
|
||||
|
||||
# Notation (similar to Go spec):
|
||||
- lowercase and 'quoted' items are lexical tokens.
|
||||
- Capitalized names denote grammar productions.
|
||||
- (...) implies grouping
|
||||
- x | y means either x or y.
|
||||
- [x] means x is optional
|
||||
- {x} means x is repeated zero or more times
|
||||
- The end of each declaration is marked with a period.
|
||||
|
||||
# Tokens
|
||||
- spaces: newline, eof, indent, outdent.
|
||||
- identifier.
|
||||
- literals: string, int, float.
|
||||
- plus all quoted tokens such as '+=', 'return'.
|
||||
|
||||
# Notes:
|
||||
- Ambiguity is resolved using operator precedence.
|
||||
- The grammar does not enforce the legal order of params and args,
|
||||
nor that the first compclause must be a 'for'.
|
||||
|
||||
TODO:
|
||||
- explain how the lexer generates indent, outdent, and newline tokens.
|
||||
- why is unary NOT separated from unary - and +?
|
||||
- the grammar is (mostly) in LL(1) style so, for example,
|
||||
dot expressions are formed suffixes, not complete expressions,
|
||||
which makes the spec harder to read. Reorganize into non-LL(1) form?
|
||||
1028
vendor/go.starlark.net/syntax/parse.go
generated
vendored
1028
vendor/go.starlark.net/syntax/parse.go
generated
vendored
File diff suppressed because it is too large
Load Diff
309
vendor/go.starlark.net/syntax/quote.go
generated
vendored
309
vendor/go.starlark.net/syntax/quote.go
generated
vendored
@@ -1,309 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 syntax
|
||||
|
||||
// Starlark quoted string utilities.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// unesc maps single-letter chars following \ to their actual values.
|
||||
var unesc = [256]byte{
|
||||
'a': '\a',
|
||||
'b': '\b',
|
||||
'f': '\f',
|
||||
'n': '\n',
|
||||
'r': '\r',
|
||||
't': '\t',
|
||||
'v': '\v',
|
||||
'\\': '\\',
|
||||
'\'': '\'',
|
||||
'"': '"',
|
||||
}
|
||||
|
||||
// esc maps escape-worthy bytes to the char that should follow \.
|
||||
var esc = [256]byte{
|
||||
'\a': 'a',
|
||||
'\b': 'b',
|
||||
'\f': 'f',
|
||||
'\n': 'n',
|
||||
'\r': 'r',
|
||||
'\t': 't',
|
||||
'\v': 'v',
|
||||
'\\': '\\',
|
||||
'\'': '\'',
|
||||
'"': '"',
|
||||
}
|
||||
|
||||
// unquote unquotes the quoted string, returning the actual
|
||||
// string value, whether the original was triple-quoted,
|
||||
// whether it was a byte string, and an error describing invalid input.
|
||||
func unquote(quoted string) (s string, triple, isByte bool, err error) {
|
||||
// Check for raw prefix: means don't interpret the inner \.
|
||||
raw := false
|
||||
if strings.HasPrefix(quoted, "r") {
|
||||
raw = true
|
||||
quoted = quoted[1:]
|
||||
}
|
||||
// Check for bytes prefix.
|
||||
if strings.HasPrefix(quoted, "b") {
|
||||
isByte = true
|
||||
quoted = quoted[1:]
|
||||
}
|
||||
|
||||
if len(quoted) < 2 {
|
||||
err = fmt.Errorf("string literal too short")
|
||||
return
|
||||
}
|
||||
|
||||
if quoted[0] != '"' && quoted[0] != '\'' || quoted[0] != quoted[len(quoted)-1] {
|
||||
err = fmt.Errorf("string literal has invalid quotes")
|
||||
return
|
||||
}
|
||||
|
||||
// Check for triple quoted string.
|
||||
quote := quoted[0]
|
||||
if len(quoted) >= 6 && quoted[1] == quote && quoted[2] == quote && quoted[:3] == quoted[len(quoted)-3:] {
|
||||
triple = true
|
||||
quoted = quoted[3 : len(quoted)-3]
|
||||
} else {
|
||||
quoted = quoted[1 : len(quoted)-1]
|
||||
}
|
||||
|
||||
// Now quoted is the quoted data, but no quotes.
|
||||
// If we're in raw mode or there are no escapes or
|
||||
// carriage returns, we're done.
|
||||
var unquoteChars string
|
||||
if raw {
|
||||
unquoteChars = "\r"
|
||||
} else {
|
||||
unquoteChars = "\\\r"
|
||||
}
|
||||
if !strings.ContainsAny(quoted, unquoteChars) {
|
||||
s = quoted
|
||||
return
|
||||
}
|
||||
|
||||
// Otherwise process quoted string.
|
||||
// Each iteration processes one escape sequence along with the
|
||||
// plain text leading up to it.
|
||||
buf := new(strings.Builder)
|
||||
for {
|
||||
// Remove prefix before escape sequence.
|
||||
i := strings.IndexAny(quoted, unquoteChars)
|
||||
if i < 0 {
|
||||
i = len(quoted)
|
||||
}
|
||||
buf.WriteString(quoted[:i])
|
||||
quoted = quoted[i:]
|
||||
|
||||
if len(quoted) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
// Process carriage return.
|
||||
if quoted[0] == '\r' {
|
||||
buf.WriteByte('\n')
|
||||
if len(quoted) > 1 && quoted[1] == '\n' {
|
||||
quoted = quoted[2:]
|
||||
} else {
|
||||
quoted = quoted[1:]
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Process escape sequence.
|
||||
if len(quoted) == 1 {
|
||||
err = fmt.Errorf(`truncated escape sequence \`)
|
||||
return
|
||||
}
|
||||
|
||||
switch quoted[1] {
|
||||
default:
|
||||
// In Starlark, like Go, a backslash must escape something.
|
||||
// (Python still treats unnecessary backslashes literally,
|
||||
// but since 3.6 has emitted a deprecation warning.)
|
||||
err = fmt.Errorf("invalid escape sequence \\%c", quoted[1])
|
||||
return
|
||||
|
||||
case '\n':
|
||||
// Ignore the escape and the line break.
|
||||
quoted = quoted[2:]
|
||||
|
||||
case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"':
|
||||
// One-char escape.
|
||||
// Escapes are allowed for both kinds of quotation
|
||||
// mark, not just the kind in use.
|
||||
buf.WriteByte(unesc[quoted[1]])
|
||||
quoted = quoted[2:]
|
||||
|
||||
case '0', '1', '2', '3', '4', '5', '6', '7':
|
||||
// Octal escape, up to 3 digits, \OOO.
|
||||
n := int(quoted[1] - '0')
|
||||
quoted = quoted[2:]
|
||||
for i := 1; i < 3; i++ {
|
||||
if len(quoted) == 0 || quoted[0] < '0' || '7' < quoted[0] {
|
||||
break
|
||||
}
|
||||
n = n*8 + int(quoted[0]-'0')
|
||||
quoted = quoted[1:]
|
||||
}
|
||||
if !isByte && n > 127 {
|
||||
err = fmt.Errorf(`non-ASCII octal escape \%o (use \u%04X for the UTF-8 encoding of U+%04X)`, n, n, n)
|
||||
return
|
||||
}
|
||||
if n >= 256 {
|
||||
// NOTE: Python silently discards the high bit,
|
||||
// so that '\541' == '\141' == 'a'.
|
||||
// Let's see if we can avoid doing that in BUILD files.
|
||||
err = fmt.Errorf(`invalid escape sequence \%03o`, n)
|
||||
return
|
||||
}
|
||||
buf.WriteByte(byte(n))
|
||||
|
||||
case 'x':
|
||||
// Hexadecimal escape, exactly 2 digits, \xXX. [0-127]
|
||||
if len(quoted) < 4 {
|
||||
err = fmt.Errorf(`truncated escape sequence %s`, quoted)
|
||||
return
|
||||
}
|
||||
n, err1 := strconv.ParseUint(quoted[2:4], 16, 0)
|
||||
if err1 != nil {
|
||||
err = fmt.Errorf(`invalid escape sequence %s`, quoted[:4])
|
||||
return
|
||||
}
|
||||
if !isByte && n > 127 {
|
||||
err = fmt.Errorf(`non-ASCII hex escape %s (use \u%04X for the UTF-8 encoding of U+%04X)`,
|
||||
quoted[:4], n, n)
|
||||
return
|
||||
}
|
||||
buf.WriteByte(byte(n))
|
||||
quoted = quoted[4:]
|
||||
|
||||
case 'u', 'U':
|
||||
// Unicode code point, 4 (\uXXXX) or 8 (\UXXXXXXXX) hex digits.
|
||||
sz := 6
|
||||
if quoted[1] == 'U' {
|
||||
sz = 10
|
||||
}
|
||||
if len(quoted) < sz {
|
||||
err = fmt.Errorf(`truncated escape sequence %s`, quoted)
|
||||
return
|
||||
}
|
||||
n, err1 := strconv.ParseUint(quoted[2:sz], 16, 0)
|
||||
if err1 != nil {
|
||||
err = fmt.Errorf(`invalid escape sequence %s`, quoted[:sz])
|
||||
return
|
||||
}
|
||||
if n > unicode.MaxRune {
|
||||
err = fmt.Errorf(`code point out of range: %s (max \U%08x)`,
|
||||
quoted[:sz], n)
|
||||
return
|
||||
}
|
||||
// As in Go, surrogates are disallowed.
|
||||
if 0xD800 <= n && n < 0xE000 {
|
||||
err = fmt.Errorf(`invalid Unicode code point U+%04X`, n)
|
||||
return
|
||||
}
|
||||
buf.WriteRune(rune(n))
|
||||
quoted = quoted[sz:]
|
||||
}
|
||||
}
|
||||
|
||||
s = buf.String()
|
||||
return
|
||||
}
|
||||
|
||||
// indexByte returns the index of the first instance of b in s, or else -1.
|
||||
func indexByte(s string, b byte) int {
|
||||
for i := 0; i < len(s); i++ {
|
||||
if s[i] == b {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// Quote returns a Starlark literal that denotes s.
|
||||
// If b, it returns a bytes literal.
|
||||
func Quote(s string, b bool) string {
|
||||
const hex = "0123456789abcdef"
|
||||
var runeTmp [utf8.UTFMax]byte
|
||||
|
||||
buf := make([]byte, 0, 3*len(s)/2)
|
||||
if b {
|
||||
buf = append(buf, 'b')
|
||||
}
|
||||
buf = append(buf, '"')
|
||||
for width := 0; len(s) > 0; s = s[width:] {
|
||||
r := rune(s[0])
|
||||
width = 1
|
||||
if r >= utf8.RuneSelf {
|
||||
r, width = utf8.DecodeRuneInString(s)
|
||||
}
|
||||
if width == 1 && r == utf8.RuneError {
|
||||
// String (!b) literals accept \xXX escapes only for ASCII,
|
||||
// but we must use them here to represent invalid bytes.
|
||||
// The result is not a legal literal.
|
||||
buf = append(buf, `\x`...)
|
||||
buf = append(buf, hex[s[0]>>4])
|
||||
buf = append(buf, hex[s[0]&0xF])
|
||||
continue
|
||||
}
|
||||
if r == '"' || r == '\\' { // always backslashed
|
||||
buf = append(buf, '\\')
|
||||
buf = append(buf, byte(r))
|
||||
continue
|
||||
}
|
||||
if strconv.IsPrint(r) {
|
||||
n := utf8.EncodeRune(runeTmp[:], r)
|
||||
buf = append(buf, runeTmp[:n]...)
|
||||
continue
|
||||
}
|
||||
switch r {
|
||||
case '\a':
|
||||
buf = append(buf, `\a`...)
|
||||
case '\b':
|
||||
buf = append(buf, `\b`...)
|
||||
case '\f':
|
||||
buf = append(buf, `\f`...)
|
||||
case '\n':
|
||||
buf = append(buf, `\n`...)
|
||||
case '\r':
|
||||
buf = append(buf, `\r`...)
|
||||
case '\t':
|
||||
buf = append(buf, `\t`...)
|
||||
case '\v':
|
||||
buf = append(buf, `\v`...)
|
||||
default:
|
||||
switch {
|
||||
case r < ' ' || r == 0x7f:
|
||||
buf = append(buf, `\x`...)
|
||||
buf = append(buf, hex[byte(r)>>4])
|
||||
buf = append(buf, hex[byte(r)&0xF])
|
||||
case r > utf8.MaxRune:
|
||||
r = 0xFFFD
|
||||
fallthrough
|
||||
case r < 0x10000:
|
||||
buf = append(buf, `\u`...)
|
||||
for s := 12; s >= 0; s -= 4 {
|
||||
buf = append(buf, hex[r>>uint(s)&0xF])
|
||||
}
|
||||
default:
|
||||
buf = append(buf, `\U`...)
|
||||
for s := 28; s >= 0; s -= 4 {
|
||||
buf = append(buf, hex[r>>uint(s)&0xF])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
buf = append(buf, '"')
|
||||
return string(buf)
|
||||
}
|
||||
1123
vendor/go.starlark.net/syntax/scan.go
generated
vendored
1123
vendor/go.starlark.net/syntax/scan.go
generated
vendored
File diff suppressed because it is too large
Load Diff
525
vendor/go.starlark.net/syntax/syntax.go
generated
vendored
525
vendor/go.starlark.net/syntax/syntax.go
generated
vendored
@@ -1,525 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 syntax provides a Starlark parser and abstract syntax tree.
|
||||
package syntax // import "go.starlark.net/syntax"
|
||||
|
||||
// A Node is a node in a Starlark syntax tree.
|
||||
type Node interface {
|
||||
// Span returns the start and end position of the expression.
|
||||
Span() (start, end Position)
|
||||
|
||||
// Comments returns the comments associated with this node.
|
||||
// It returns nil if RetainComments was not specified during parsing,
|
||||
// or if AllocComments was not called.
|
||||
Comments() *Comments
|
||||
|
||||
// AllocComments allocates a new Comments node if there was none.
|
||||
// This makes possible to add new comments using Comments() method.
|
||||
AllocComments()
|
||||
}
|
||||
|
||||
// A Comment represents a single # comment.
|
||||
type Comment struct {
|
||||
Start Position
|
||||
Text string // without trailing newline
|
||||
}
|
||||
|
||||
// Comments collects the comments associated with an expression.
|
||||
type Comments struct {
|
||||
Before []Comment // whole-line comments before this expression
|
||||
Suffix []Comment // end-of-line comments after this expression (up to 1)
|
||||
|
||||
// For top-level expressions only, After lists whole-line
|
||||
// comments following the expression.
|
||||
After []Comment
|
||||
}
|
||||
|
||||
// A commentsRef is a possibly-nil reference to a set of comments.
|
||||
// A commentsRef is embedded in each type of syntax node,
|
||||
// and provides its Comments and AllocComments methods.
|
||||
type commentsRef struct{ ref *Comments }
|
||||
|
||||
// Comments returns the comments associated with a syntax node,
|
||||
// or nil if AllocComments has not yet been called.
|
||||
func (cr commentsRef) Comments() *Comments { return cr.ref }
|
||||
|
||||
// AllocComments enables comments to be associated with a syntax node.
|
||||
func (cr *commentsRef) AllocComments() {
|
||||
if cr.ref == nil {
|
||||
cr.ref = new(Comments)
|
||||
}
|
||||
}
|
||||
|
||||
// Start returns the start position of the expression.
|
||||
func Start(n Node) Position {
|
||||
start, _ := n.Span()
|
||||
return start
|
||||
}
|
||||
|
||||
// End returns the end position of the expression.
|
||||
func End(n Node) Position {
|
||||
_, end := n.Span()
|
||||
return end
|
||||
}
|
||||
|
||||
// A File represents a Starlark file.
|
||||
type File struct {
|
||||
commentsRef
|
||||
Path string
|
||||
Stmts []Stmt
|
||||
|
||||
Module interface{} // a *resolve.Module, set by resolver
|
||||
}
|
||||
|
||||
func (x *File) Span() (start, end Position) {
|
||||
if len(x.Stmts) == 0 {
|
||||
return
|
||||
}
|
||||
start, _ = x.Stmts[0].Span()
|
||||
_, end = x.Stmts[len(x.Stmts)-1].Span()
|
||||
return start, end
|
||||
}
|
||||
|
||||
// A Stmt is a Starlark statement.
|
||||
type Stmt interface {
|
||||
Node
|
||||
stmt()
|
||||
}
|
||||
|
||||
func (*AssignStmt) stmt() {}
|
||||
func (*BranchStmt) stmt() {}
|
||||
func (*DefStmt) stmt() {}
|
||||
func (*ExprStmt) stmt() {}
|
||||
func (*ForStmt) stmt() {}
|
||||
func (*WhileStmt) stmt() {}
|
||||
func (*IfStmt) stmt() {}
|
||||
func (*LoadStmt) stmt() {}
|
||||
func (*ReturnStmt) stmt() {}
|
||||
|
||||
// An AssignStmt represents an assignment:
|
||||
// x = 0
|
||||
// x, y = y, x
|
||||
// x += 1
|
||||
type AssignStmt struct {
|
||||
commentsRef
|
||||
OpPos Position
|
||||
Op Token // = EQ | {PLUS,MINUS,STAR,PERCENT}_EQ
|
||||
LHS Expr
|
||||
RHS Expr
|
||||
}
|
||||
|
||||
func (x *AssignStmt) Span() (start, end Position) {
|
||||
start, _ = x.LHS.Span()
|
||||
_, end = x.RHS.Span()
|
||||
return
|
||||
}
|
||||
|
||||
// A DefStmt represents a function definition.
|
||||
type DefStmt struct {
|
||||
commentsRef
|
||||
Def Position
|
||||
Name *Ident
|
||||
Params []Expr // param = ident | ident=expr | * | *ident | **ident
|
||||
Body []Stmt
|
||||
|
||||
Function interface{} // a *resolve.Function, set by resolver
|
||||
}
|
||||
|
||||
func (x *DefStmt) Span() (start, end Position) {
|
||||
_, end = x.Body[len(x.Body)-1].Span()
|
||||
return x.Def, end
|
||||
}
|
||||
|
||||
// An ExprStmt is an expression evaluated for side effects.
|
||||
type ExprStmt struct {
|
||||
commentsRef
|
||||
X Expr
|
||||
}
|
||||
|
||||
func (x *ExprStmt) Span() (start, end Position) {
|
||||
return x.X.Span()
|
||||
}
|
||||
|
||||
// An IfStmt is a conditional: If Cond: True; else: False.
|
||||
// 'elseif' is desugared into a chain of IfStmts.
|
||||
type IfStmt struct {
|
||||
commentsRef
|
||||
If Position // IF or ELIF
|
||||
Cond Expr
|
||||
True []Stmt
|
||||
ElsePos Position // ELSE or ELIF
|
||||
False []Stmt // optional
|
||||
}
|
||||
|
||||
func (x *IfStmt) Span() (start, end Position) {
|
||||
body := x.False
|
||||
if body == nil {
|
||||
body = x.True
|
||||
}
|
||||
_, end = body[len(body)-1].Span()
|
||||
return x.If, end
|
||||
}
|
||||
|
||||
// A LoadStmt loads another module and binds names from it:
|
||||
// load(Module, "x", y="foo").
|
||||
//
|
||||
// The AST is slightly unfaithful to the concrete syntax here because
|
||||
// Starlark's load statement, so that it can be implemented in Python,
|
||||
// binds some names (like y above) with an identifier and some (like x)
|
||||
// without. For consistency we create fake identifiers for all the
|
||||
// strings.
|
||||
type LoadStmt struct {
|
||||
commentsRef
|
||||
Load Position
|
||||
Module *Literal // a string
|
||||
From []*Ident // name defined in loading module
|
||||
To []*Ident // name in loaded module
|
||||
Rparen Position
|
||||
}
|
||||
|
||||
func (x *LoadStmt) Span() (start, end Position) {
|
||||
return x.Load, x.Rparen
|
||||
}
|
||||
|
||||
// ModuleName returns the name of the module loaded by this statement.
|
||||
func (x *LoadStmt) ModuleName() string { return x.Module.Value.(string) }
|
||||
|
||||
// A BranchStmt changes the flow of control: break, continue, pass.
|
||||
type BranchStmt struct {
|
||||
commentsRef
|
||||
Token Token // = BREAK | CONTINUE | PASS
|
||||
TokenPos Position
|
||||
}
|
||||
|
||||
func (x *BranchStmt) Span() (start, end Position) {
|
||||
return x.TokenPos, x.TokenPos.add(x.Token.String())
|
||||
}
|
||||
|
||||
// A ReturnStmt returns from a function.
|
||||
type ReturnStmt struct {
|
||||
commentsRef
|
||||
Return Position
|
||||
Result Expr // may be nil
|
||||
}
|
||||
|
||||
func (x *ReturnStmt) Span() (start, end Position) {
|
||||
if x.Result == nil {
|
||||
return x.Return, x.Return.add("return")
|
||||
}
|
||||
_, end = x.Result.Span()
|
||||
return x.Return, end
|
||||
}
|
||||
|
||||
// An Expr is a Starlark expression.
|
||||
type Expr interface {
|
||||
Node
|
||||
expr()
|
||||
}
|
||||
|
||||
func (*BinaryExpr) expr() {}
|
||||
func (*CallExpr) expr() {}
|
||||
func (*Comprehension) expr() {}
|
||||
func (*CondExpr) expr() {}
|
||||
func (*DictEntry) expr() {}
|
||||
func (*DictExpr) expr() {}
|
||||
func (*DotExpr) expr() {}
|
||||
func (*Ident) expr() {}
|
||||
func (*IndexExpr) expr() {}
|
||||
func (*LambdaExpr) expr() {}
|
||||
func (*ListExpr) expr() {}
|
||||
func (*Literal) expr() {}
|
||||
func (*ParenExpr) expr() {}
|
||||
func (*SliceExpr) expr() {}
|
||||
func (*TupleExpr) expr() {}
|
||||
func (*UnaryExpr) expr() {}
|
||||
|
||||
// An Ident represents an identifier.
|
||||
type Ident struct {
|
||||
commentsRef
|
||||
NamePos Position
|
||||
Name string
|
||||
|
||||
Binding interface{} // a *resolver.Binding, set by resolver
|
||||
}
|
||||
|
||||
func (x *Ident) Span() (start, end Position) {
|
||||
return x.NamePos, x.NamePos.add(x.Name)
|
||||
}
|
||||
|
||||
// A Literal represents a literal string or number.
|
||||
type Literal struct {
|
||||
commentsRef
|
||||
Token Token // = STRING | BYTES | INT | FLOAT
|
||||
TokenPos Position
|
||||
Raw string // uninterpreted text
|
||||
Value interface{} // = string | int64 | *big.Int | float64
|
||||
}
|
||||
|
||||
func (x *Literal) Span() (start, end Position) {
|
||||
return x.TokenPos, x.TokenPos.add(x.Raw)
|
||||
}
|
||||
|
||||
// A ParenExpr represents a parenthesized expression: (X).
|
||||
type ParenExpr struct {
|
||||
commentsRef
|
||||
Lparen Position
|
||||
X Expr
|
||||
Rparen Position
|
||||
}
|
||||
|
||||
func (x *ParenExpr) Span() (start, end Position) {
|
||||
return x.Lparen, x.Rparen.add(")")
|
||||
}
|
||||
|
||||
// A CallExpr represents a function call expression: Fn(Args).
|
||||
type CallExpr struct {
|
||||
commentsRef
|
||||
Fn Expr
|
||||
Lparen Position
|
||||
Args []Expr // arg = expr | ident=expr | *expr | **expr
|
||||
Rparen Position
|
||||
}
|
||||
|
||||
func (x *CallExpr) Span() (start, end Position) {
|
||||
start, _ = x.Fn.Span()
|
||||
return start, x.Rparen.add(")")
|
||||
}
|
||||
|
||||
// A DotExpr represents a field or method selector: X.Name.
|
||||
type DotExpr struct {
|
||||
commentsRef
|
||||
X Expr
|
||||
Dot Position
|
||||
NamePos Position
|
||||
Name *Ident
|
||||
}
|
||||
|
||||
func (x *DotExpr) Span() (start, end Position) {
|
||||
start, _ = x.X.Span()
|
||||
_, end = x.Name.Span()
|
||||
return
|
||||
}
|
||||
|
||||
// A Comprehension represents a list or dict comprehension:
|
||||
// [Body for ... if ...] or {Body for ... if ...}
|
||||
type Comprehension struct {
|
||||
commentsRef
|
||||
Curly bool // {x:y for ...} or {x for ...}, not [x for ...]
|
||||
Lbrack Position
|
||||
Body Expr
|
||||
Clauses []Node // = *ForClause | *IfClause
|
||||
Rbrack Position
|
||||
}
|
||||
|
||||
func (x *Comprehension) Span() (start, end Position) {
|
||||
return x.Lbrack, x.Rbrack.add("]")
|
||||
}
|
||||
|
||||
// A ForStmt represents a loop: for Vars in X: Body.
|
||||
type ForStmt struct {
|
||||
commentsRef
|
||||
For Position
|
||||
Vars Expr // name, or tuple of names
|
||||
X Expr
|
||||
Body []Stmt
|
||||
}
|
||||
|
||||
func (x *ForStmt) Span() (start, end Position) {
|
||||
_, end = x.Body[len(x.Body)-1].Span()
|
||||
return x.For, end
|
||||
}
|
||||
|
||||
// A WhileStmt represents a while loop: while X: Body.
|
||||
type WhileStmt struct {
|
||||
commentsRef
|
||||
While Position
|
||||
Cond Expr
|
||||
Body []Stmt
|
||||
}
|
||||
|
||||
func (x *WhileStmt) Span() (start, end Position) {
|
||||
_, end = x.Body[len(x.Body)-1].Span()
|
||||
return x.While, end
|
||||
}
|
||||
|
||||
// A ForClause represents a for clause in a list comprehension: for Vars in X.
|
||||
type ForClause struct {
|
||||
commentsRef
|
||||
For Position
|
||||
Vars Expr // name, or tuple of names
|
||||
In Position
|
||||
X Expr
|
||||
}
|
||||
|
||||
func (x *ForClause) Span() (start, end Position) {
|
||||
_, end = x.X.Span()
|
||||
return x.For, end
|
||||
}
|
||||
|
||||
// An IfClause represents an if clause in a list comprehension: if Cond.
|
||||
type IfClause struct {
|
||||
commentsRef
|
||||
If Position
|
||||
Cond Expr
|
||||
}
|
||||
|
||||
func (x *IfClause) Span() (start, end Position) {
|
||||
_, end = x.Cond.Span()
|
||||
return x.If, end
|
||||
}
|
||||
|
||||
// A DictExpr represents a dictionary literal: { List }.
|
||||
type DictExpr struct {
|
||||
commentsRef
|
||||
Lbrace Position
|
||||
List []Expr // all *DictEntrys
|
||||
Rbrace Position
|
||||
}
|
||||
|
||||
func (x *DictExpr) Span() (start, end Position) {
|
||||
return x.Lbrace, x.Rbrace.add("}")
|
||||
}
|
||||
|
||||
// A DictEntry represents a dictionary entry: Key: Value.
|
||||
// Used only within a DictExpr.
|
||||
type DictEntry struct {
|
||||
commentsRef
|
||||
Key Expr
|
||||
Colon Position
|
||||
Value Expr
|
||||
}
|
||||
|
||||
func (x *DictEntry) Span() (start, end Position) {
|
||||
start, _ = x.Key.Span()
|
||||
_, end = x.Value.Span()
|
||||
return start, end
|
||||
}
|
||||
|
||||
// A LambdaExpr represents an inline function abstraction.
|
||||
type LambdaExpr struct {
|
||||
commentsRef
|
||||
Lambda Position
|
||||
Params []Expr // param = ident | ident=expr | * | *ident | **ident
|
||||
Body Expr
|
||||
|
||||
Function interface{} // a *resolve.Function, set by resolver
|
||||
}
|
||||
|
||||
func (x *LambdaExpr) Span() (start, end Position) {
|
||||
_, end = x.Body.Span()
|
||||
return x.Lambda, end
|
||||
}
|
||||
|
||||
// A ListExpr represents a list literal: [ List ].
|
||||
type ListExpr struct {
|
||||
commentsRef
|
||||
Lbrack Position
|
||||
List []Expr
|
||||
Rbrack Position
|
||||
}
|
||||
|
||||
func (x *ListExpr) Span() (start, end Position) {
|
||||
return x.Lbrack, x.Rbrack.add("]")
|
||||
}
|
||||
|
||||
// CondExpr represents the conditional: X if COND else ELSE.
|
||||
type CondExpr struct {
|
||||
commentsRef
|
||||
If Position
|
||||
Cond Expr
|
||||
True Expr
|
||||
ElsePos Position
|
||||
False Expr
|
||||
}
|
||||
|
||||
func (x *CondExpr) Span() (start, end Position) {
|
||||
start, _ = x.True.Span()
|
||||
_, end = x.False.Span()
|
||||
return start, end
|
||||
}
|
||||
|
||||
// A TupleExpr represents a tuple literal: (List).
|
||||
type TupleExpr struct {
|
||||
commentsRef
|
||||
Lparen Position // optional (e.g. in x, y = 0, 1), but required if List is empty
|
||||
List []Expr
|
||||
Rparen Position
|
||||
}
|
||||
|
||||
func (x *TupleExpr) Span() (start, end Position) {
|
||||
if x.Lparen.IsValid() {
|
||||
return x.Lparen, x.Rparen
|
||||
} else {
|
||||
return Start(x.List[0]), End(x.List[len(x.List)-1])
|
||||
}
|
||||
}
|
||||
|
||||
// A UnaryExpr represents a unary expression: Op X.
|
||||
//
|
||||
// As a special case, UnaryOp{Op:Star} may also represent
|
||||
// the star parameter in def f(*args) or def f(*, x).
|
||||
type UnaryExpr struct {
|
||||
commentsRef
|
||||
OpPos Position
|
||||
Op Token
|
||||
X Expr // may be nil if Op==STAR
|
||||
}
|
||||
|
||||
func (x *UnaryExpr) Span() (start, end Position) {
|
||||
if x.X != nil {
|
||||
_, end = x.X.Span()
|
||||
} else {
|
||||
end = x.OpPos.add("*")
|
||||
}
|
||||
return x.OpPos, end
|
||||
}
|
||||
|
||||
// A BinaryExpr represents a binary expression: X Op Y.
|
||||
//
|
||||
// As a special case, BinaryExpr{Op:EQ} may also
|
||||
// represent a named argument in a call f(k=v)
|
||||
// or a named parameter in a function declaration
|
||||
// def f(param=default).
|
||||
type BinaryExpr struct {
|
||||
commentsRef
|
||||
X Expr
|
||||
OpPos Position
|
||||
Op Token
|
||||
Y Expr
|
||||
}
|
||||
|
||||
func (x *BinaryExpr) Span() (start, end Position) {
|
||||
start, _ = x.X.Span()
|
||||
_, end = x.Y.Span()
|
||||
return start, end
|
||||
}
|
||||
|
||||
// A SliceExpr represents a slice or substring expression: X[Lo:Hi:Step].
|
||||
type SliceExpr struct {
|
||||
commentsRef
|
||||
X Expr
|
||||
Lbrack Position
|
||||
Lo, Hi, Step Expr // all optional
|
||||
Rbrack Position
|
||||
}
|
||||
|
||||
func (x *SliceExpr) Span() (start, end Position) {
|
||||
start, _ = x.X.Span()
|
||||
return start, x.Rbrack
|
||||
}
|
||||
|
||||
// An IndexExpr represents an index expression: X[Y].
|
||||
type IndexExpr struct {
|
||||
commentsRef
|
||||
X Expr
|
||||
Lbrack Position
|
||||
Y Expr
|
||||
Rbrack Position
|
||||
}
|
||||
|
||||
func (x *IndexExpr) Span() (start, end Position) {
|
||||
start, _ = x.X.Span()
|
||||
return start, x.Rbrack
|
||||
}
|
||||
161
vendor/go.starlark.net/syntax/walk.go
generated
vendored
161
vendor/go.starlark.net/syntax/walk.go
generated
vendored
@@ -1,161 +0,0 @@
|
||||
// Copyright 2017 The Bazel 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 syntax
|
||||
|
||||
// Walk traverses a syntax tree in depth-first order.
|
||||
// It starts by calling f(n); n must not be nil.
|
||||
// If f returns true, Walk calls itself
|
||||
// recursively for each non-nil child of n.
|
||||
// Walk then calls f(nil).
|
||||
func Walk(n Node, f func(Node) bool) {
|
||||
if n == nil {
|
||||
panic("nil")
|
||||
}
|
||||
if !f(n) {
|
||||
return
|
||||
}
|
||||
|
||||
// TODO(adonovan): opt: order cases using profile data.
|
||||
switch n := n.(type) {
|
||||
case *File:
|
||||
walkStmts(n.Stmts, f)
|
||||
|
||||
case *ExprStmt:
|
||||
Walk(n.X, f)
|
||||
|
||||
case *BranchStmt:
|
||||
// no-op
|
||||
|
||||
case *IfStmt:
|
||||
Walk(n.Cond, f)
|
||||
walkStmts(n.True, f)
|
||||
walkStmts(n.False, f)
|
||||
|
||||
case *AssignStmt:
|
||||
Walk(n.LHS, f)
|
||||
Walk(n.RHS, f)
|
||||
|
||||
case *DefStmt:
|
||||
Walk(n.Name, f)
|
||||
for _, param := range n.Params {
|
||||
Walk(param, f)
|
||||
}
|
||||
walkStmts(n.Body, f)
|
||||
|
||||
case *ForStmt:
|
||||
Walk(n.Vars, f)
|
||||
Walk(n.X, f)
|
||||
walkStmts(n.Body, f)
|
||||
|
||||
case *ReturnStmt:
|
||||
if n.Result != nil {
|
||||
Walk(n.Result, f)
|
||||
}
|
||||
|
||||
case *LoadStmt:
|
||||
Walk(n.Module, f)
|
||||
for _, from := range n.From {
|
||||
Walk(from, f)
|
||||
}
|
||||
for _, to := range n.To {
|
||||
Walk(to, f)
|
||||
}
|
||||
|
||||
case *Ident, *Literal:
|
||||
// no-op
|
||||
|
||||
case *ListExpr:
|
||||
for _, x := range n.List {
|
||||
Walk(x, f)
|
||||
}
|
||||
|
||||
case *ParenExpr:
|
||||
Walk(n.X, f)
|
||||
|
||||
case *CondExpr:
|
||||
Walk(n.Cond, f)
|
||||
Walk(n.True, f)
|
||||
Walk(n.False, f)
|
||||
|
||||
case *IndexExpr:
|
||||
Walk(n.X, f)
|
||||
Walk(n.Y, f)
|
||||
|
||||
case *DictEntry:
|
||||
Walk(n.Key, f)
|
||||
Walk(n.Value, f)
|
||||
|
||||
case *SliceExpr:
|
||||
Walk(n.X, f)
|
||||
if n.Lo != nil {
|
||||
Walk(n.Lo, f)
|
||||
}
|
||||
if n.Hi != nil {
|
||||
Walk(n.Hi, f)
|
||||
}
|
||||
if n.Step != nil {
|
||||
Walk(n.Step, f)
|
||||
}
|
||||
|
||||
case *Comprehension:
|
||||
Walk(n.Body, f)
|
||||
for _, clause := range n.Clauses {
|
||||
Walk(clause, f)
|
||||
}
|
||||
|
||||
case *IfClause:
|
||||
Walk(n.Cond, f)
|
||||
|
||||
case *ForClause:
|
||||
Walk(n.Vars, f)
|
||||
Walk(n.X, f)
|
||||
|
||||
case *TupleExpr:
|
||||
for _, x := range n.List {
|
||||
Walk(x, f)
|
||||
}
|
||||
|
||||
case *DictExpr:
|
||||
for _, entry := range n.List {
|
||||
Walk(entry, f)
|
||||
}
|
||||
|
||||
case *UnaryExpr:
|
||||
if n.X != nil {
|
||||
Walk(n.X, f)
|
||||
}
|
||||
|
||||
case *BinaryExpr:
|
||||
Walk(n.X, f)
|
||||
Walk(n.Y, f)
|
||||
|
||||
case *DotExpr:
|
||||
Walk(n.X, f)
|
||||
Walk(n.Name, f)
|
||||
|
||||
case *CallExpr:
|
||||
Walk(n.Fn, f)
|
||||
for _, arg := range n.Args {
|
||||
Walk(arg, f)
|
||||
}
|
||||
|
||||
case *LambdaExpr:
|
||||
for _, param := range n.Params {
|
||||
Walk(param, f)
|
||||
}
|
||||
Walk(n.Body, f)
|
||||
|
||||
default:
|
||||
panic(n)
|
||||
}
|
||||
|
||||
f(nil)
|
||||
}
|
||||
|
||||
func walkStmts(stmts []Stmt, f func(Node) bool) {
|
||||
for _, stmt := range stmts {
|
||||
Walk(stmt, f)
|
||||
}
|
||||
}
|
||||
24
vendor/modules.txt
vendored
24
vendor/modules.txt
vendored
@@ -807,14 +807,6 @@ go.opentelemetry.io/proto/otlp/collector/trace/v1
|
||||
go.opentelemetry.io/proto/otlp/common/v1
|
||||
go.opentelemetry.io/proto/otlp/resource/v1
|
||||
go.opentelemetry.io/proto/otlp/trace/v1
|
||||
# go.starlark.net v0.0.0-20230525235612-a134d8f9ddca
|
||||
## explicit; go 1.16
|
||||
go.starlark.net/internal/compile
|
||||
go.starlark.net/internal/spell
|
||||
go.starlark.net/resolve
|
||||
go.starlark.net/starlark
|
||||
go.starlark.net/starlarkstruct
|
||||
go.starlark.net/syntax
|
||||
# go.uber.org/goleak v1.3.0
|
||||
## explicit; go 1.20
|
||||
go.uber.org/goleak
|
||||
@@ -1242,8 +1234,8 @@ sigs.k8s.io/json/internal/golang/encoding/json
|
||||
# sigs.k8s.io/knftables v0.0.17
|
||||
## explicit; go 1.20
|
||||
sigs.k8s.io/knftables
|
||||
# sigs.k8s.io/kustomize/api v0.17.2
|
||||
## explicit; go 1.21
|
||||
# sigs.k8s.io/kustomize/api v0.18.0
|
||||
## explicit; go 1.22.7
|
||||
sigs.k8s.io/kustomize/api/filters/annotations
|
||||
sigs.k8s.io/kustomize/api/filters/fieldspec
|
||||
sigs.k8s.io/kustomize/api/filters/filtersutil
|
||||
@@ -1288,11 +1280,11 @@ sigs.k8s.io/kustomize/api/provider
|
||||
sigs.k8s.io/kustomize/api/resmap
|
||||
sigs.k8s.io/kustomize/api/resource
|
||||
sigs.k8s.io/kustomize/api/types
|
||||
# sigs.k8s.io/kustomize/kustomize/v5 v5.4.2
|
||||
## explicit; go 1.21
|
||||
# sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
|
||||
## explicit; go 1.22.7
|
||||
sigs.k8s.io/kustomize/kustomize/v5/commands/build
|
||||
# sigs.k8s.io/kustomize/kyaml v0.17.1
|
||||
## explicit; go 1.21
|
||||
# sigs.k8s.io/kustomize/kyaml v0.18.1
|
||||
## explicit; go 1.22.7
|
||||
sigs.k8s.io/kustomize/kyaml/comments
|
||||
sigs.k8s.io/kustomize/kyaml/errors
|
||||
sigs.k8s.io/kustomize/kyaml/ext
|
||||
@@ -1301,10 +1293,7 @@ sigs.k8s.io/kustomize/kyaml/filesys
|
||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/container
|
||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/exec
|
||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil
|
||||
sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark
|
||||
sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util
|
||||
sigs.k8s.io/kustomize/kyaml/kio
|
||||
sigs.k8s.io/kustomize/kyaml/kio/filters
|
||||
sigs.k8s.io/kustomize/kyaml/kio/kioutil
|
||||
sigs.k8s.io/kustomize/kyaml/openapi
|
||||
sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi
|
||||
@@ -1324,7 +1313,6 @@ sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/merge2
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/merge3
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/schema
|
||||
sigs.k8s.io/kustomize/kyaml/yaml/walk
|
||||
# sigs.k8s.io/structured-merge-diff/v4 v4.4.1
|
||||
|
||||
10
vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go
generated
vendored
10
vendor/sigs.k8s.io/kustomize/api/internal/builtins/HelmChartInflationGenerator.go
generated
vendored
@@ -10,6 +10,7 @@ import (
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/kustomize/api/resmap"
|
||||
@@ -62,6 +63,9 @@ func (p *HelmChartInflationGeneratorPlugin) Config(
|
||||
if len(h.GeneralConfig().HelmConfig.ApiVersions) != 0 {
|
||||
p.HelmChart.ApiVersions = h.GeneralConfig().HelmConfig.ApiVersions
|
||||
}
|
||||
if h.GeneralConfig().HelmConfig.Debug {
|
||||
p.HelmChart.Debug = h.GeneralConfig().HelmConfig.Debug
|
||||
}
|
||||
|
||||
p.h = h
|
||||
if err = yaml.Unmarshal(config, p); err != nil {
|
||||
@@ -168,13 +172,17 @@ func (p *HelmChartInflationGeneratorPlugin) runHelmCommand(
|
||||
fmt.Sprintf("HELM_DATA_HOME=%s/.data", p.ConfigHome)}
|
||||
cmd.Env = append(os.Environ(), env...)
|
||||
err := cmd.Run()
|
||||
errorOutput := stderr.String()
|
||||
if slices.Contains(args, "--debug") {
|
||||
errorOutput = " Helm stack trace:\n" + errorOutput + "\nHelm template:\n" + stdout.String() + "\n"
|
||||
}
|
||||
if err != nil {
|
||||
helm := p.h.GeneralConfig().HelmConfig.Command
|
||||
err = errors.WrapPrefixf(
|
||||
fmt.Errorf(
|
||||
"unable to run: '%s %s' with env=%s (is '%s' installed?): %w",
|
||||
helm, strings.Join(args, " "), env, helm, err),
|
||||
stderr.String(),
|
||||
errorOutput,
|
||||
)
|
||||
}
|
||||
return stdout.Bytes(), err
|
||||
|
||||
3
vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go
generated
vendored
3
vendor/sigs.k8s.io/kustomize/api/internal/builtins/SortOrderTransformer.go
generated
vendored
@@ -151,6 +151,9 @@ func gvkLessThan(gvk1, gvk2 resid.Gvk, typeOrders map[string]int) bool {
|
||||
if index1 != index2 {
|
||||
return index1 < index2
|
||||
}
|
||||
if (gvk1.Kind == types.NamespaceKind && gvk2.Kind == types.NamespaceKind) && (gvk1.Group == "" || gvk2.Group == "") {
|
||||
return legacyGVKSortString(gvk1) > legacyGVKSortString(gvk2)
|
||||
}
|
||||
return legacyGVKSortString(gvk1) < legacyGVKSortString(gvk2)
|
||||
}
|
||||
|
||||
|
||||
@@ -421,6 +421,13 @@ nameReference:
|
||||
fieldSpecs:
|
||||
- path: spec/ingressClassName
|
||||
kind: Ingress
|
||||
|
||||
- kind: ValidatingAdmissionPolicy
|
||||
group: admissionregistration.k8s.io
|
||||
fieldSpecs:
|
||||
- path: spec/policyName
|
||||
kind: ValidatingAdmissionPolicyBinding
|
||||
group: admissionregistration.k8s.io
|
||||
`
|
||||
)
|
||||
|
||||
|
||||
1
vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go
generated
vendored
1
vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go
generated
vendored
@@ -77,7 +77,6 @@ func NewFnPlugin(o *types.FnPluginLoadingOptions) *FnPlugin {
|
||||
runFns: runfn.RunFns{
|
||||
Functions: []*yaml.RNode{},
|
||||
Network: o.Network,
|
||||
EnableStarlark: o.EnableStar,
|
||||
EnableExec: o.EnableExec,
|
||||
StorageMounts: toStorageMounts(o.Mounts),
|
||||
Env: o.Env,
|
||||
|
||||
5
vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go
generated
vendored
5
vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go
generated
vendored
@@ -449,9 +449,6 @@ func (kt *KustTarget) accumulateResources(
|
||||
ra, err = kt.accumulateDirectory(ra, ldr, false)
|
||||
}
|
||||
if err != nil {
|
||||
if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file
|
||||
return nil, errF
|
||||
}
|
||||
return nil, errors.WrapPrefixf(
|
||||
err, "accumulation err='%s'", errF.Error())
|
||||
}
|
||||
@@ -460,7 +457,7 @@ func (kt *KustTarget) accumulateResources(
|
||||
return ra, nil
|
||||
}
|
||||
|
||||
// accumulateResources fills the given resourceAccumulator
|
||||
// accumulateComponents fills the given resourceAccumulator
|
||||
// with resources read from the given list of paths.
|
||||
func (kt *KustTarget) accumulateComponents(
|
||||
ra *accumulator.ResAccumulator, paths []string) (*accumulator.ResAccumulator, error) {
|
||||
|
||||
5
vendor/sigs.k8s.io/kustomize/api/resource/factory.go
generated
vendored
5
vendor/sigs.k8s.io/kustomize/api/resource/factory.go
generated
vendored
@@ -202,7 +202,10 @@ func (rf *Factory) inlineAnyEmbeddedLists(
|
||||
}
|
||||
items, ok := m["items"]
|
||||
if !ok {
|
||||
// treat as an empty list
|
||||
// Items field is not present.
|
||||
// This is not a collections resource.
|
||||
// read more https://kubernetes.io/docs/reference/using-api/api-concepts/#collections
|
||||
result = append(result, n0)
|
||||
continue
|
||||
}
|
||||
slice, ok := items.([]interface{})
|
||||
|
||||
6
vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go
generated
vendored
6
vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go
generated
vendored
@@ -96,6 +96,9 @@ type HelmChart struct {
|
||||
|
||||
// SkipTests skips tests from templated output.
|
||||
SkipTests bool `json:"skipTests,omitempty" yaml:"skipTests,omitempty"`
|
||||
|
||||
// debug enables debug output from the Helm chart inflator generator.
|
||||
Debug bool `json:"debug,omitempty" yaml:"debug,omitempty"`
|
||||
}
|
||||
|
||||
// HelmChartArgs contains arguments to helm.
|
||||
@@ -188,5 +191,8 @@ func (h HelmChart) AsHelmArgs(absChartHome string) []string {
|
||||
if h.SkipHooks {
|
||||
args = append(args, "--no-hooks")
|
||||
}
|
||||
if h.Debug {
|
||||
args = append(args, "--debug")
|
||||
}
|
||||
return args
|
||||
}
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/api/types/kustomization.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/api/types/kustomization.go
generated
vendored
@@ -22,6 +22,7 @@ const (
|
||||
MetadataNamespacePath = "metadata/namespace"
|
||||
MetadataNamespaceApiVersion = "v1"
|
||||
MetadataNamePath = "metadata/name"
|
||||
NamespaceKind = "Namespace"
|
||||
|
||||
OriginAnnotations = "originAnnotations"
|
||||
TransformerAnnotations = "transformerAnnotations"
|
||||
@@ -55,6 +56,7 @@ type Kustomization struct {
|
||||
// Namespace to add to all objects.
|
||||
Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
|
||||
|
||||
// Deprecated: Use the Labels field instead, which provides a superset of the functionality of CommonLabels.
|
||||
// CommonLabels to add to all objects and selectors.
|
||||
CommonLabels map[string]string `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"`
|
||||
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go
generated
vendored
@@ -8,6 +8,7 @@ type HelmConfig struct {
|
||||
Command string
|
||||
ApiVersions []string
|
||||
KubeVersion string
|
||||
Debug bool
|
||||
}
|
||||
|
||||
// PluginConfig holds plugin configuration.
|
||||
@@ -27,7 +28,6 @@ type PluginConfig struct {
|
||||
|
||||
func EnabledPluginConfig(b BuiltinPluginLoadingOptions) (pc *PluginConfig) {
|
||||
pc = MakePluginConfig(PluginRestrictionsNone, b)
|
||||
pc.FnpLoadingOptions.EnableStar = true
|
||||
pc.HelmConfig.Enabled = true
|
||||
// If this command is not on PATH, tests needing it should skip.
|
||||
pc.HelmConfig.Command = "helmV3"
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go
generated
vendored
@@ -46,8 +46,6 @@ const (
|
||||
type FnPluginLoadingOptions struct {
|
||||
// Allow to run executables
|
||||
EnableExec bool
|
||||
// Allow to run starlark
|
||||
EnableStar bool
|
||||
// Allow container access to network
|
||||
Network bool
|
||||
NetworkName string
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/build.go
generated
vendored
@@ -30,6 +30,7 @@ var theFlags struct {
|
||||
helmCommand string
|
||||
helmApiVersions []string
|
||||
helmKubeVersion string
|
||||
helmDebug bool
|
||||
loadRestrictor string
|
||||
reorderOutput string
|
||||
fnOptions types.FnPluginLoadingOptions
|
||||
@@ -163,6 +164,7 @@ func HonorKustomizeFlags(kOpts *krusty.Options, flags *flag.FlagSet) *krusty.Opt
|
||||
kOpts.PluginConfig.HelmConfig.Command = theFlags.helmCommand
|
||||
kOpts.PluginConfig.HelmConfig.ApiVersions = theFlags.helmApiVersions
|
||||
kOpts.PluginConfig.HelmConfig.KubeVersion = theFlags.helmKubeVersion
|
||||
kOpts.PluginConfig.HelmConfig.Debug = theFlags.helmDebug
|
||||
kOpts.AddManagedbyLabel = isManagedByLabelEnabled()
|
||||
return kOpts
|
||||
}
|
||||
|
||||
5
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go
generated
vendored
5
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagenablehelm.go
generated
vendored
@@ -31,4 +31,9 @@ func AddFlagEnableHelm(set *pflag.FlagSet) {
|
||||
"helm-kube-version",
|
||||
"", // default
|
||||
"Kubernetes version used by Helm for Capabilities.KubeVersion")
|
||||
set.BoolVar(
|
||||
&theFlags.helmDebug,
|
||||
"helm-debug",
|
||||
false,
|
||||
"Enable debug output from the Helm chart inflator generator.")
|
||||
}
|
||||
|
||||
3
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go
generated
vendored
3
vendor/sigs.k8s.io/kustomize/kustomize/v5/commands/build/flagsforfunctions.go
generated
vendored
@@ -30,7 +30,4 @@ func AddFunctionAlphaEnablementFlags(set *pflag.FlagSet) {
|
||||
&theFlags.fnOptions.EnableExec, "enable-exec", false,
|
||||
"enable support for exec functions (raw executables); "+
|
||||
"do not use for untrusted configs! (Alpha)")
|
||||
set.BoolVar(
|
||||
&theFlags.fnOptions.EnableStar, "enable-star", false,
|
||||
"enable support for starlark functions. (Alpha)")
|
||||
}
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go
generated
vendored
@@ -167,7 +167,7 @@ func (c *Filter) setupExec() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// getArgs returns the command + args to run to spawn the container
|
||||
// getCommand returns the command + args to run to spawn the container
|
||||
func (c *Filter) getCommand() (string, []string) {
|
||||
network := runtimeutil.NetworkNameNone
|
||||
if c.ContainerSpec.Network {
|
||||
|
||||
14
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go
generated
vendored
14
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go
generated
vendored
@@ -132,9 +132,6 @@ type FunctionSpec struct {
|
||||
// Container is the spec for running a function as a container
|
||||
Container ContainerSpec `json:"container,omitempty" yaml:"container,omitempty"`
|
||||
|
||||
// Starlark is the spec for running a function as a starlark script
|
||||
Starlark StarlarkSpec `json:"starlark,omitempty" yaml:"starlark,omitempty"`
|
||||
|
||||
// ExecSpec is the spec for running a function as an executable
|
||||
Exec ExecSpec `json:"exec,omitempty" yaml:"exec,omitempty"`
|
||||
}
|
||||
@@ -158,17 +155,6 @@ type ContainerSpec struct {
|
||||
Env []string `json:"envs,omitempty" yaml:"envs,omitempty"`
|
||||
}
|
||||
|
||||
// StarlarkSpec defines how to run a function as a starlark program
|
||||
type StarlarkSpec struct {
|
||||
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||
|
||||
// Path specifies a path to a starlark script
|
||||
Path string `json:"path,omitempty" yaml:"path,omitempty"`
|
||||
|
||||
// URL specifies a url containing a starlark script
|
||||
URL string `json:"url,omitempty" yaml:"url,omitempty"`
|
||||
}
|
||||
|
||||
// StorageMount represents a container's mounted storage option(s)
|
||||
type StorageMount struct {
|
||||
// Type of mount e.g. bind mount, local volume, etc.
|
||||
|
||||
79
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go
generated
vendored
79
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go
generated
vendored
@@ -1,79 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package starlark
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
"go.starlark.net/starlarkstruct"
|
||||
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||
"sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util"
|
||||
"sigs.k8s.io/kustomize/kyaml/openapi"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
type Context struct {
|
||||
resourceList starlark.Value
|
||||
}
|
||||
|
||||
func (c *Context) predeclared() (starlark.StringDict, error) {
|
||||
e, err := env()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
oa, err := oa()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dict := starlark.StringDict{
|
||||
"resource_list": c.resourceList,
|
||||
"open_api": oa,
|
||||
"environment": e,
|
||||
}
|
||||
|
||||
return starlark.StringDict{
|
||||
"ctx": starlarkstruct.FromStringDict(starlarkstruct.Default, dict),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func oa() (starlark.Value, error) {
|
||||
return interfaceToValue(openapi.Schema())
|
||||
}
|
||||
|
||||
func env() (starlark.Value, error) {
|
||||
env := map[string]interface{}{}
|
||||
for _, e := range os.Environ() {
|
||||
pair := strings.SplitN(e, "=", 2)
|
||||
if len(pair) < 2 {
|
||||
continue
|
||||
}
|
||||
env[pair[0]] = pair[1]
|
||||
}
|
||||
value, err := util.Marshal(env)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func interfaceToValue(i interface{}) (starlark.Value, error) {
|
||||
b, err := json.Marshal(i)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var in map[string]interface{}
|
||||
if err := yaml.Unmarshal(b, &in); err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
|
||||
value, err := util.Marshal(in)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
36
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go
generated
vendored
36
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go
generated
vendored
@@ -1,36 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Package starlark contains a kio.Filter which can be applied to resources to transform
|
||||
// them through starlark program.
|
||||
//
|
||||
// Starlark has become a popular runtime embedding in go programs, especially for Kubernetes
|
||||
// and data processing.
|
||||
// Examples: https://github.com/cruise-automation/isopod, https://qri.io/docs/starlark/starlib,
|
||||
// https://github.com/stripe/skycfg, https://github.com/k14s/ytt
|
||||
//
|
||||
// The resources are provided to the starlark program through the global variable "resourceList".
|
||||
// "resourceList" is a dictionary containing an "items" field with a list of resources.
|
||||
// The starlark modified "resourceList" is the Filter output.
|
||||
//
|
||||
// After being run through the starlark program, the filter will copy the comments from the input
|
||||
// resources to restore them -- due to them being dropped as a result of serializing the resources
|
||||
// as starlark values.
|
||||
//
|
||||
// "resourceList" may also contain a "functionConfig" entry to configure the starlark script itself.
|
||||
// Changes made by the starlark program to the "functionConfig" will be reflected in the
|
||||
// Filter.FunctionConfig value.
|
||||
//
|
||||
// The Filter will also format the output so that output has the preferred field ordering
|
||||
// rather than an alphabetical field ordering.
|
||||
//
|
||||
// The resourceList variable adheres to the kustomize function spec as specified by:
|
||||
// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md
|
||||
//
|
||||
// All items in the resourceList are resources represented as starlark dictionaries/
|
||||
// The items in the resourceList respect the io spec specified by:
|
||||
// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/config-io.md
|
||||
//
|
||||
// The starlark language spec can be found here:
|
||||
// https://github.com/google/starlark-go/blob/master/doc/spec.md
|
||||
package starlark
|
||||
180
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go
generated
vendored
180
vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go
generated
vendored
@@ -1,180 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package starlark
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
|
||||
"sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio/filters"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
// Filter transforms a set of resources through the provided program
|
||||
type Filter struct {
|
||||
Name string
|
||||
|
||||
// Program is a starlark script which will be run against the resources
|
||||
Program string
|
||||
|
||||
// URL is the url of a starlark program to fetch and run
|
||||
URL string
|
||||
|
||||
// Path is the path to a starlark program to read and run
|
||||
Path string
|
||||
|
||||
runtimeutil.FunctionFilter
|
||||
}
|
||||
|
||||
func (sf *Filter) String() string {
|
||||
return fmt.Sprintf(
|
||||
"name: %v path: %v url: %v program: %v", sf.Name, sf.Path, sf.URL, sf.Program)
|
||||
}
|
||||
|
||||
func (sf *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
if err := sf.setup(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sf.FunctionFilter.Run = sf.Run
|
||||
|
||||
return sf.FunctionFilter.Filter(nodes)
|
||||
}
|
||||
|
||||
func (sf *Filter) setup() error {
|
||||
if (sf.URL != "" && sf.Path != "") ||
|
||||
(sf.URL != "" && sf.Program != "") ||
|
||||
(sf.Path != "" && sf.Program != "") {
|
||||
return errors.Errorf("Filter Path, Program and URL are mutually exclusive")
|
||||
}
|
||||
|
||||
// read the program from a file
|
||||
if sf.Path != "" {
|
||||
b, err := os.ReadFile(sf.Path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sf.Program = string(b)
|
||||
}
|
||||
|
||||
// read the program from a URL
|
||||
if sf.URL != "" {
|
||||
err := func() error {
|
||||
resp, err := http.Get(sf.URL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
b, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sf.Program = string(b)
|
||||
return nil
|
||||
}()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sf *Filter) Run(reader io.Reader, writer io.Writer) error {
|
||||
// retain map of inputs to outputs by id so if the name is changed by the
|
||||
// starlark program, we are able to match the same resources
|
||||
value, err := sf.readResourceList(reader)
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
// run the starlark as program as transformation function
|
||||
thread := &starlark.Thread{Name: sf.Name}
|
||||
|
||||
ctx := &Context{resourceList: value}
|
||||
pd, err := ctx.predeclared()
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
_, err = starlark.ExecFile(thread, sf.Name, sf.Program, pd)
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
return sf.writeResourceList(value, writer)
|
||||
}
|
||||
|
||||
// inputToResourceList transforms input into a starlark.Value
|
||||
func (sf *Filter) readResourceList(reader io.Reader) (starlark.Value, error) {
|
||||
// read and parse the inputs
|
||||
rl := bytes.Buffer{}
|
||||
_, err := rl.ReadFrom(reader)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
rn, err := yaml.Parse(rl.String())
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
|
||||
// convert to a starlark value
|
||||
b, err := yaml.Marshal(rn.Document()) // convert to bytes
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
var in map[string]interface{}
|
||||
err = yaml.Unmarshal(b, &in) // convert to map[string]interface{}
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
return util.Marshal(in) // convert to starlark value
|
||||
}
|
||||
|
||||
// resourceListToOutput converts the output of the starlark program to the filter output
|
||||
func (sf *Filter) writeResourceList(value starlark.Value, writer io.Writer) error {
|
||||
// convert the modified resourceList back into a slice of RNodes
|
||||
// by first converting to a map[string]interface{}
|
||||
out, err := util.Unmarshal(value)
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
b, err := yaml.Marshal(out)
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
rl, err := yaml.Parse(string(b))
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
// preserve the comments from the input
|
||||
items, err := rl.Pipe(yaml.Lookup("items"))
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
err = items.VisitElements(func(node *yaml.RNode) error {
|
||||
// starlark will serialize the resources sorting the fields alphabetically,
|
||||
// format them to have a better ordering
|
||||
_, err := filters.FormatFilter{}.Filter([]*yaml.RNode{node})
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
s, err := rl.String()
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
|
||||
_, err = writer.Write([]byte(s))
|
||||
return err
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 QRI, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
25
vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go
generated
vendored
25
vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go
generated
vendored
@@ -1,25 +0,0 @@
|
||||
// The MIT License (MIT)
|
||||
|
||||
// Copyright (c) 2018 QRI, Inc.
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
// Package util is forked from https://github.com/qri-io/starlib in order to prune
|
||||
// excessive transitive dependencies from pulling in that library.
|
||||
package util
|
||||
275
vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go
generated
vendored
275
vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go
generated
vendored
@@ -1,275 +0,0 @@
|
||||
// The MIT License (MIT)
|
||||
|
||||
// Copyright (c) 2018 QRI, Inc.
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"go.starlark.net/starlark"
|
||||
"go.starlark.net/starlarkstruct"
|
||||
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||
)
|
||||
|
||||
// // asString unquotes a starlark string value
|
||||
// func asString(x starlark.Value) (string, error) {
|
||||
// return strconv.Unquote(x.String())
|
||||
// }
|
||||
|
||||
// IsEmptyString checks is a starlark string is empty ("" for a go string)
|
||||
// starlark.String.String performs repr-style quotation, which is necessary
|
||||
// for the starlark.Value contract but a frequent source of errors in API
|
||||
// clients. This helper method makes sure it'll work properly
|
||||
func IsEmptyString(s starlark.String) bool {
|
||||
return s.String() == `""`
|
||||
}
|
||||
|
||||
// Unmarshal decodes a starlark.Value into it's golang counterpart
|
||||
//
|
||||
//nolint:nakedret
|
||||
func Unmarshal(x starlark.Value) (val interface{}, err error) {
|
||||
switch v := x.(type) {
|
||||
case starlark.NoneType:
|
||||
val = nil
|
||||
case starlark.Bool:
|
||||
val = v.Truth() == starlark.True
|
||||
case starlark.Int:
|
||||
val, err = starlark.AsInt32(x)
|
||||
case starlark.Float:
|
||||
if f, ok := starlark.AsFloat(x); !ok {
|
||||
err = fmt.Errorf("couldn't parse float")
|
||||
} else {
|
||||
val = f
|
||||
}
|
||||
case starlark.String:
|
||||
val = v.GoString()
|
||||
// case starlibtime.Time:
|
||||
// val = time.Time(v)
|
||||
case *starlark.Dict:
|
||||
var (
|
||||
dictVal starlark.Value
|
||||
pval interface{}
|
||||
kval interface{}
|
||||
keys []interface{}
|
||||
vals []interface{}
|
||||
// key as interface if found one key is not a string
|
||||
ki bool
|
||||
)
|
||||
|
||||
for _, k := range v.Keys() {
|
||||
dictVal, _, err = v.Get(k)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
pval, err = Unmarshal(dictVal)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("unmarshaling starlark value: %w", err)
|
||||
return
|
||||
}
|
||||
|
||||
kval, err = Unmarshal(k)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("unmarshaling starlark key: %w", err)
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := kval.(string); !ok {
|
||||
// found key as not a string
|
||||
ki = true
|
||||
}
|
||||
|
||||
keys = append(keys, kval)
|
||||
vals = append(vals, pval)
|
||||
}
|
||||
|
||||
// prepare result
|
||||
|
||||
rs := map[string]interface{}{}
|
||||
ri := map[interface{}]interface{}{}
|
||||
|
||||
for i, key := range keys {
|
||||
// key as interface
|
||||
if ki {
|
||||
ri[key] = vals[i]
|
||||
} else {
|
||||
rs[key.(string)] = vals[i]
|
||||
}
|
||||
}
|
||||
|
||||
if ki {
|
||||
val = ri // map[interface{}]interface{}
|
||||
} else {
|
||||
val = rs // map[string]interface{}
|
||||
}
|
||||
case *starlark.List:
|
||||
var (
|
||||
i int
|
||||
listVal starlark.Value
|
||||
iter = v.Iterate()
|
||||
value = make([]interface{}, v.Len())
|
||||
)
|
||||
|
||||
defer iter.Done()
|
||||
for iter.Next(&listVal) {
|
||||
value[i], err = Unmarshal(listVal)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
i++
|
||||
}
|
||||
val = value
|
||||
case starlark.Tuple:
|
||||
var (
|
||||
i int
|
||||
tupleVal starlark.Value
|
||||
iter = v.Iterate()
|
||||
value = make([]interface{}, v.Len())
|
||||
)
|
||||
|
||||
defer iter.Done()
|
||||
for iter.Next(&tupleVal) {
|
||||
value[i], err = Unmarshal(tupleVal)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
i++
|
||||
}
|
||||
val = value
|
||||
case *starlark.Set:
|
||||
fmt.Println("errnotdone: SET")
|
||||
err = fmt.Errorf("sets aren't yet supported")
|
||||
case *starlarkstruct.Struct:
|
||||
if _var, ok := v.Constructor().(Unmarshaler); ok {
|
||||
err = _var.UnmarshalStarlark(x)
|
||||
if err != nil {
|
||||
err = errors.WrapPrefixf(err, "failed marshal %q to Starlark object", v.Constructor().Type())
|
||||
return
|
||||
}
|
||||
val = _var
|
||||
} else {
|
||||
err = fmt.Errorf("constructor object from *starlarkstruct.Struct not supported Marshaler to starlark object: %s", v.Constructor().Type())
|
||||
}
|
||||
default:
|
||||
fmt.Println("errbadtype:", x.Type())
|
||||
err = fmt.Errorf("unrecognized starlark type: %s", x.Type())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Marshal turns go values into starlark types
|
||||
//
|
||||
//nolint:nakedret
|
||||
func Marshal(data interface{}) (v starlark.Value, err error) {
|
||||
switch x := data.(type) {
|
||||
case nil:
|
||||
v = starlark.None
|
||||
case bool:
|
||||
v = starlark.Bool(x)
|
||||
case string:
|
||||
v = starlark.String(x)
|
||||
case int:
|
||||
v = starlark.MakeInt(x)
|
||||
case int8:
|
||||
v = starlark.MakeInt(int(x))
|
||||
case int16:
|
||||
v = starlark.MakeInt(int(x))
|
||||
case int32:
|
||||
v = starlark.MakeInt(int(x))
|
||||
case int64:
|
||||
v = starlark.MakeInt64(x)
|
||||
case uint:
|
||||
v = starlark.MakeUint(x)
|
||||
case uint8:
|
||||
v = starlark.MakeUint(uint(x))
|
||||
case uint16:
|
||||
v = starlark.MakeUint(uint(x))
|
||||
case uint32:
|
||||
v = starlark.MakeUint(uint(x))
|
||||
case uint64:
|
||||
v = starlark.MakeUint64(x)
|
||||
case float32:
|
||||
v = starlark.Float(float64(x))
|
||||
case float64:
|
||||
v = starlark.Float(x)
|
||||
// case time.Time:
|
||||
// v = starlibtime.Time(x)
|
||||
case []interface{}:
|
||||
var elems = make([]starlark.Value, len(x))
|
||||
for i, val := range x {
|
||||
elems[i], err = Marshal(val)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
v = starlark.NewList(elems)
|
||||
case map[interface{}]interface{}:
|
||||
dict := &starlark.Dict{}
|
||||
var elem starlark.Value
|
||||
for ki, val := range x {
|
||||
var key starlark.Value
|
||||
key, err = Marshal(ki)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
elem, err = Marshal(val)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = dict.SetKey(key, elem); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
v = dict
|
||||
case map[string]interface{}:
|
||||
dict := &starlark.Dict{}
|
||||
var elem starlark.Value
|
||||
for key, val := range x {
|
||||
elem, err = Marshal(val)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = dict.SetKey(starlark.String(key), elem); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
v = dict
|
||||
case Marshaler:
|
||||
v, err = x.MarshalStarlark()
|
||||
default:
|
||||
return starlark.None, fmt.Errorf("unrecognized type: %#v", x)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Unmarshaler is the interface use to unmarshal starlark custom types.
|
||||
type Unmarshaler interface {
|
||||
// UnmarshalStarlark unmarshal a starlark object to custom type.
|
||||
UnmarshalStarlark(starlark.Value) error
|
||||
}
|
||||
|
||||
// Marshaler is the interface use to marshal starlark custom types.
|
||||
type Marshaler interface {
|
||||
// MarshalStarlark marshal a custom type to starlark object.
|
||||
MarshalStarlark() (starlark.Value, error)
|
||||
}
|
||||
210
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go
generated
vendored
210
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go
generated
vendored
@@ -1,210 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
// Filters are the list of known filters for unmarshalling a filter into a concrete
|
||||
// implementation.
|
||||
var Filters = map[string]func() kio.Filter{
|
||||
"FileSetter": func() kio.Filter { return &FileSetter{} },
|
||||
"FormatFilter": func() kio.Filter { return &FormatFilter{} },
|
||||
"GrepFilter": func() kio.Filter { return GrepFilter{} },
|
||||
"MatchModifier": func() kio.Filter { return &MatchModifyFilter{} },
|
||||
"Modifier": func() kio.Filter { return &Modifier{} },
|
||||
}
|
||||
|
||||
// filter wraps a kio.filter so that it can be unmarshalled from yaml.
|
||||
type KFilter struct {
|
||||
kio.Filter
|
||||
}
|
||||
|
||||
func (t KFilter) MarshalYAML() (interface{}, error) {
|
||||
return t.Filter, nil
|
||||
}
|
||||
|
||||
func (t *KFilter) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
i := map[string]interface{}{}
|
||||
if err := unmarshal(i); err != nil {
|
||||
return err
|
||||
}
|
||||
meta := &yaml.ResourceMeta{}
|
||||
if err := unmarshal(meta); err != nil {
|
||||
return err
|
||||
}
|
||||
filter, found := Filters[meta.Kind]
|
||||
if !found {
|
||||
var knownFilters []string
|
||||
for k := range Filters {
|
||||
knownFilters = append(knownFilters, k)
|
||||
}
|
||||
sort.Strings(knownFilters)
|
||||
return fmt.Errorf("unsupported filter Kind %v: may be one of: [%s]",
|
||||
meta, strings.Join(knownFilters, ","))
|
||||
}
|
||||
t.Filter = filter()
|
||||
|
||||
return unmarshal(t.Filter)
|
||||
}
|
||||
|
||||
// Modifier modifies the input Resources by invoking the provided pipeline.
|
||||
// Modifier will return any Resources for which the pipeline does not return an error.
|
||||
type Modifier struct {
|
||||
Kind string `yaml:"kind,omitempty"`
|
||||
|
||||
Filters yaml.YFilters `yaml:"pipeline,omitempty"`
|
||||
}
|
||||
|
||||
var _ kio.Filter = &Modifier{}
|
||||
|
||||
func (f Modifier) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
for i := range input {
|
||||
if _, err := input[i].Pipe(f.Filters.Filters()...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return input, nil
|
||||
}
|
||||
|
||||
type MatchModifyFilter struct {
|
||||
Kind string `yaml:"kind,omitempty"`
|
||||
|
||||
MatchFilters []yaml.YFilters `yaml:"match,omitempty"`
|
||||
|
||||
ModifyFilters yaml.YFilters `yaml:"modify,omitempty"`
|
||||
}
|
||||
|
||||
var _ kio.Filter = &MatchModifyFilter{}
|
||||
|
||||
func (f MatchModifyFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
var matches = input
|
||||
var err error
|
||||
for _, filter := range f.MatchFilters {
|
||||
matches, err = MatchFilter{Filters: filter}.Filter(matches)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
_, err = Modifier{Filters: f.ModifyFilters}.Filter(matches)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return input, nil
|
||||
}
|
||||
|
||||
type MatchFilter struct {
|
||||
Kind string `yaml:"kind,omitempty"`
|
||||
|
||||
Filters yaml.YFilters `yaml:"pipeline,omitempty"`
|
||||
}
|
||||
|
||||
var _ kio.Filter = &MatchFilter{}
|
||||
|
||||
func (f MatchFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
var output []*yaml.RNode
|
||||
for i := range input {
|
||||
if v, err := input[i].Pipe(f.Filters.Filters()...); err != nil {
|
||||
return nil, err
|
||||
} else if v == nil {
|
||||
continue
|
||||
}
|
||||
output = append(output, input[i])
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
|
||||
type FilenameFmtVerb string
|
||||
|
||||
const (
|
||||
// KindFmt substitutes kind
|
||||
KindFmt FilenameFmtVerb = "%k"
|
||||
|
||||
// NameFmt substitutes metadata.name
|
||||
NameFmt FilenameFmtVerb = "%n"
|
||||
|
||||
// NamespaceFmt substitutes metdata.namespace
|
||||
NamespaceFmt FilenameFmtVerb = "%s"
|
||||
)
|
||||
|
||||
// FileSetter sets the file name and mode annotations on Resources.
|
||||
type FileSetter struct {
|
||||
Kind string `yaml:"kind,omitempty"`
|
||||
|
||||
// FilenamePattern is the pattern to use for generating filenames. FilenameFmtVerb
|
||||
// FielnameFmtVerbs may be specified to substitute Resource metadata into the filename.
|
||||
FilenamePattern string `yaml:"filenamePattern,omitempty"`
|
||||
|
||||
// Mode is the filemode to write.
|
||||
Mode string `yaml:"mode,omitempty"`
|
||||
|
||||
// Override will override the existing filename if it is set on the pattern.
|
||||
// Otherwise the existing filename is kept.
|
||||
Override bool `yaml:"override,omitempty"`
|
||||
}
|
||||
|
||||
var _ kio.Filter = &FileSetter{}
|
||||
|
||||
const DefaultFilenamePattern = "%n_%k.yaml"
|
||||
|
||||
func (f *FileSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
if f.Mode == "" {
|
||||
f.Mode = fmt.Sprintf("%d", 0600)
|
||||
}
|
||||
if f.FilenamePattern == "" {
|
||||
f.FilenamePattern = DefaultFilenamePattern
|
||||
}
|
||||
|
||||
resources := map[string][]*yaml.RNode{}
|
||||
for i := range input {
|
||||
if err := kioutil.CopyLegacyAnnotations(input[i]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
m, err := input[i].GetMeta()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
file := f.FilenamePattern
|
||||
file = strings.ReplaceAll(file, string(KindFmt), strings.ToLower(m.Kind))
|
||||
file = strings.ReplaceAll(file, string(NameFmt), strings.ToLower(m.Name))
|
||||
file = strings.ReplaceAll(file, string(NamespaceFmt), strings.ToLower(m.Namespace))
|
||||
|
||||
if _, found := m.Annotations[kioutil.PathAnnotation]; !found || f.Override {
|
||||
if _, err := input[i].Pipe(yaml.SetAnnotation(kioutil.PathAnnotation, file)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, err := input[i].Pipe(yaml.SetAnnotation(kioutil.LegacyPathAnnotation, file)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
resources[file] = append(resources[file], input[i])
|
||||
}
|
||||
|
||||
var output []*yaml.RNode
|
||||
for i := range resources {
|
||||
if err := kioutil.SortNodes(resources[i]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for j := range resources[i] {
|
||||
if _, err := resources[i][j].Pipe(
|
||||
yaml.SetAnnotation(kioutil.IndexAnnotation, fmt.Sprintf("%d", j))); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, err := resources[i][j].Pipe(
|
||||
yaml.SetAnnotation(kioutil.LegacyIndexAnnotation, fmt.Sprintf("%d", j))); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
output = append(output, resources[i][j])
|
||||
}
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
314
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go
generated
vendored
314
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go
generated
vendored
@@ -1,314 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Package yamlfmt contains libraries for formatting yaml files containing
|
||||
// Kubernetes Resource configuration.
|
||||
//
|
||||
// Yaml files are formatted by:
|
||||
// - Sorting fields and map values
|
||||
// - Sorting unordered lists for whitelisted types
|
||||
// - Applying a canonical yaml Style
|
||||
//
|
||||
// Fields are ordered using a relative ordering applied to commonly
|
||||
// encountered Resource fields. All Resources, including non-builtin
|
||||
// Resources such as CRDs, share the same field precedence.
|
||||
//
|
||||
// Fields that do not appear in the explicit ordering are ordered
|
||||
// lexicographically.
|
||||
//
|
||||
// A subset of well known known unordered lists are sorted by element field
|
||||
// values.
|
||||
package filters
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"sort"
|
||||
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/openapi"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
type FormattingStrategy = string
|
||||
|
||||
const (
|
||||
// NoFmtAnnotation determines if the resource should be formatted.
|
||||
FmtAnnotation string = "config.kubernetes.io/formatting"
|
||||
|
||||
// FmtStrategyStandard means the resource will be formatted according
|
||||
// to the default rules.
|
||||
FmtStrategyStandard FormattingStrategy = "standard"
|
||||
|
||||
// FmtStrategyNone means the resource will not be formatted.
|
||||
FmtStrategyNone FormattingStrategy = "none"
|
||||
)
|
||||
|
||||
// FormatInput returns the formatted input.
|
||||
func FormatInput(input io.Reader) (*bytes.Buffer, error) {
|
||||
buff := &bytes.Buffer{}
|
||||
err := kio.Pipeline{
|
||||
Inputs: []kio.Reader{&kio.ByteReader{Reader: input}},
|
||||
Filters: []kio.Filter{FormatFilter{}},
|
||||
Outputs: []kio.Writer{kio.ByteWriter{Writer: buff}},
|
||||
}.Execute()
|
||||
|
||||
return buff, err
|
||||
}
|
||||
|
||||
// FormatFileOrDirectory reads the file or directory and formats each file's
|
||||
// contents by writing it back to the file.
|
||||
func FormatFileOrDirectory(path string) error {
|
||||
return kio.Pipeline{
|
||||
Inputs: []kio.Reader{kio.LocalPackageReader{
|
||||
PackagePath: path,
|
||||
}},
|
||||
Filters: []kio.Filter{FormatFilter{}},
|
||||
Outputs: []kio.Writer{kio.LocalPackageWriter{PackagePath: path}},
|
||||
}.Execute()
|
||||
}
|
||||
|
||||
type FormatFilter struct {
|
||||
Process func(n *yaml.Node) error
|
||||
UseSchema bool
|
||||
}
|
||||
|
||||
var _ kio.Filter = FormatFilter{}
|
||||
|
||||
func (f FormatFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
for i := range slice {
|
||||
fmtStrategy, err := getFormattingStrategy(slice[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if fmtStrategy == FmtStrategyNone {
|
||||
continue
|
||||
}
|
||||
|
||||
kindNode, err := slice[i].Pipe(yaml.Get("kind"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if kindNode == nil {
|
||||
continue
|
||||
}
|
||||
apiVersionNode, err := slice[i].Pipe(yaml.Get("apiVersion"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if apiVersionNode == nil {
|
||||
continue
|
||||
}
|
||||
kind, apiVersion := kindNode.YNode().Value, apiVersionNode.YNode().Value
|
||||
var s *openapi.ResourceSchema
|
||||
if f.UseSchema {
|
||||
s = openapi.SchemaForResourceType(yaml.TypeMeta{APIVersion: apiVersion, Kind: kind})
|
||||
} else {
|
||||
s = nil
|
||||
}
|
||||
err = (&formatter{apiVersion: apiVersion, kind: kind, process: f.Process}).
|
||||
fmtNode(slice[i].YNode(), "", s)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return slice, nil
|
||||
}
|
||||
|
||||
// getFormattingStrategy looks for the formatting annotation to determine
|
||||
// which strategy should be used for formatting. The default is standard
|
||||
// if no annotation is found.
|
||||
func getFormattingStrategy(node *yaml.RNode) (FormattingStrategy, error) {
|
||||
value, err := node.Pipe(yaml.GetAnnotation(FmtAnnotation))
|
||||
if err != nil || value == nil {
|
||||
return FmtStrategyStandard, err
|
||||
}
|
||||
|
||||
fmtStrategy := value.YNode().Value
|
||||
|
||||
switch fmtStrategy {
|
||||
case FmtStrategyStandard:
|
||||
return FmtStrategyStandard, nil
|
||||
case FmtStrategyNone:
|
||||
return FmtStrategyNone, nil
|
||||
default:
|
||||
return "", fmt.Errorf(
|
||||
"formatting annotation has illegal value %s", fmtStrategy)
|
||||
}
|
||||
}
|
||||
|
||||
type formatter struct {
|
||||
apiVersion string
|
||||
kind string
|
||||
process func(n *yaml.Node) error
|
||||
}
|
||||
|
||||
// fmtNode recursively formats the Document Contents.
|
||||
// See: https://godoc.org/gopkg.in/yaml.v3#Node
|
||||
func (f *formatter) fmtNode(n *yaml.Node, path string, schema *openapi.ResourceSchema) error {
|
||||
if n.Kind == yaml.ScalarNode && schema != nil && schema.Schema != nil {
|
||||
// ensure values that are interpreted as non-string values (e.g. "true")
|
||||
// are properly quoted
|
||||
yaml.FormatNonStringStyle(n, *schema.Schema)
|
||||
}
|
||||
|
||||
// sort the order of mapping fields
|
||||
if n.Kind == yaml.MappingNode {
|
||||
sort.Sort(sortedMapContents(*n))
|
||||
}
|
||||
|
||||
// sort the order of sequence elements if it is whitelisted
|
||||
if n.Kind == yaml.SequenceNode {
|
||||
if yaml.WhitelistedListSortKinds.Has(f.kind) &&
|
||||
yaml.WhitelistedListSortApis.Has(f.apiVersion) {
|
||||
if sortField, found := yaml.WhitelistedListSortFields[path]; found {
|
||||
sort.Sort(sortedSeqContents{Node: *n, sortField: sortField})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// format the Content
|
||||
for i := range n.Content {
|
||||
// MappingNode are structured as having their fields as Content,
|
||||
// with the field-key and field-value alternating. e.g. Even elements
|
||||
// are the keys and odd elements are the values
|
||||
isFieldKey := n.Kind == yaml.MappingNode && i%2 == 0
|
||||
isFieldValue := n.Kind == yaml.MappingNode && i%2 == 1
|
||||
isElement := n.Kind == yaml.SequenceNode
|
||||
|
||||
// run the process callback on the node if it has been set
|
||||
// don't process keys: their format should be fixed
|
||||
if f.process != nil && !isFieldKey {
|
||||
if err := f.process(n.Content[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// get the schema for this Node
|
||||
p := path
|
||||
var s *openapi.ResourceSchema
|
||||
switch {
|
||||
case isFieldValue:
|
||||
// if the node is a field, lookup the schema using the field name
|
||||
p = fmt.Sprintf("%s.%s", path, n.Content[i-1].Value)
|
||||
if schema != nil {
|
||||
s = schema.Field(n.Content[i-1].Value)
|
||||
}
|
||||
case isElement:
|
||||
// if the node is a list element, lookup the schema for the array items
|
||||
if schema != nil {
|
||||
s = schema.Elements()
|
||||
}
|
||||
}
|
||||
// format the node using the schema
|
||||
err := f.fmtNode(n.Content[i], p, s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// sortedMapContents sorts the Contents field of a MappingNode by the field names using a statically
|
||||
// defined field precedence, and falling back on lexicographical sorting
|
||||
type sortedMapContents yaml.Node
|
||||
|
||||
func (s sortedMapContents) Len() int {
|
||||
return len(s.Content) / 2
|
||||
}
|
||||
func (s sortedMapContents) Swap(i, j int) {
|
||||
// yaml MappingNode Contents are a list of field names followed by
|
||||
// field values, rather than a list of field <name, value> pairs.
|
||||
// increment.
|
||||
//
|
||||
// e.g. ["field1Name", "field1Value", "field2Name", "field2Value"]
|
||||
iFieldNameIndex := i * 2
|
||||
jFieldNameIndex := j * 2
|
||||
iFieldValueIndex := iFieldNameIndex + 1
|
||||
jFieldValueIndex := jFieldNameIndex + 1
|
||||
|
||||
// swap field names
|
||||
s.Content[iFieldNameIndex], s.Content[jFieldNameIndex] =
|
||||
s.Content[jFieldNameIndex], s.Content[iFieldNameIndex]
|
||||
|
||||
// swap field values
|
||||
s.Content[iFieldValueIndex], s.Content[jFieldValueIndex] = s.
|
||||
Content[jFieldValueIndex], s.Content[iFieldValueIndex]
|
||||
}
|
||||
|
||||
func (s sortedMapContents) Less(i, j int) bool {
|
||||
iFieldNameIndex := i * 2
|
||||
jFieldNameIndex := j * 2
|
||||
iFieldName := s.Content[iFieldNameIndex].Value
|
||||
jFieldName := s.Content[jFieldNameIndex].Value
|
||||
|
||||
// order by their precedence values looked up from the index
|
||||
iOrder, foundI := yaml.FieldOrder[iFieldName]
|
||||
jOrder, foundJ := yaml.FieldOrder[jFieldName]
|
||||
if foundI && foundJ {
|
||||
return iOrder < jOrder
|
||||
}
|
||||
|
||||
// known fields come before unknown fields
|
||||
if foundI {
|
||||
return true
|
||||
}
|
||||
if foundJ {
|
||||
return false
|
||||
}
|
||||
|
||||
// neither field is known, sort them lexicographically
|
||||
return iFieldName < jFieldName
|
||||
}
|
||||
|
||||
// sortedSeqContents sorts the Contents field of a SequenceNode by the value of
|
||||
// the elements sortField.
|
||||
// e.g. it will sort spec.template.spec.containers by the value of the container `name` field
|
||||
type sortedSeqContents struct {
|
||||
yaml.Node
|
||||
sortField string
|
||||
}
|
||||
|
||||
func (s sortedSeqContents) Len() int {
|
||||
return len(s.Content)
|
||||
}
|
||||
func (s sortedSeqContents) Swap(i, j int) {
|
||||
s.Content[i], s.Content[j] = s.Content[j], s.Content[i]
|
||||
}
|
||||
func (s sortedSeqContents) Less(i, j int) bool {
|
||||
// primitive lists -- sort by the element's primitive values
|
||||
if s.sortField == "" {
|
||||
iValue := s.Content[i].Value
|
||||
jValue := s.Content[j].Value
|
||||
return iValue < jValue
|
||||
}
|
||||
|
||||
// map lists -- sort by the element's sortField values
|
||||
var iValue, jValue string
|
||||
for a := range s.Content[i].Content {
|
||||
if a%2 != 0 {
|
||||
continue // not a fieldNameIndex
|
||||
}
|
||||
// locate the index of the sortField field
|
||||
if s.Content[i].Content[a].Value == s.sortField {
|
||||
// a is the yaml node for the field key, a+1 is the node for the field value
|
||||
iValue = s.Content[i].Content[a+1].Value
|
||||
}
|
||||
}
|
||||
for a := range s.Content[j].Content {
|
||||
if a%2 != 0 {
|
||||
continue // not a fieldNameIndex
|
||||
}
|
||||
|
||||
// locate the index of the sortField field
|
||||
if s.Content[j].Content[a].Value == s.sortField {
|
||||
// a is the yaml node for the field key, a+1 is the node for the field value
|
||||
jValue = s.Content[j].Content[a+1].Value
|
||||
}
|
||||
}
|
||||
|
||||
// compare the field values
|
||||
return iValue < jValue
|
||||
}
|
||||
117
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go
generated
vendored
117
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go
generated
vendored
@@ -1,117 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
type GrepType int
|
||||
|
||||
const (
|
||||
Regexp GrepType = 1 << iota
|
||||
GreaterThanEq
|
||||
GreaterThan
|
||||
LessThan
|
||||
LessThanEq
|
||||
)
|
||||
|
||||
// GrepFilter filters RNodes with a matching field
|
||||
type GrepFilter struct {
|
||||
Path []string `yaml:"path,omitempty"`
|
||||
Value string `yaml:"value,omitempty"`
|
||||
MatchType GrepType `yaml:"matchType,omitempty"`
|
||||
InvertMatch bool `yaml:"invertMatch,omitempty"`
|
||||
Compare func(a, b string) (int, error)
|
||||
}
|
||||
|
||||
var _ kio.Filter = GrepFilter{}
|
||||
|
||||
func (f GrepFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
// compile the regular expression 1 time if we are matching using regex
|
||||
var reg *regexp.Regexp
|
||||
var err error
|
||||
if f.MatchType == Regexp || f.MatchType == 0 {
|
||||
reg, err = regexp.Compile(f.Value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
var output kio.ResourceNodeSlice
|
||||
for i := range input {
|
||||
node := input[i]
|
||||
val, err := node.Pipe(&yaml.PathMatcher{Path: f.Path})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if val == nil || len(val.Content()) == 0 {
|
||||
if f.InvertMatch {
|
||||
output = append(output, input[i])
|
||||
}
|
||||
continue
|
||||
}
|
||||
found := false
|
||||
err = val.VisitElements(func(elem *yaml.RNode) error {
|
||||
// get the value
|
||||
var str string
|
||||
if f.MatchType == Regexp {
|
||||
style := elem.YNode().Style
|
||||
defer func() { elem.YNode().Style = style }()
|
||||
elem.YNode().Style = yaml.FlowStyle
|
||||
str, err = elem.String()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
str = strings.TrimSpace(strings.ReplaceAll(str, `"`, ""))
|
||||
} else {
|
||||
// if not regexp, then it needs to parse into a quantity and comments will
|
||||
// break that
|
||||
str = elem.YNode().Value
|
||||
if str == "" {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
if f.MatchType == Regexp || f.MatchType == 0 {
|
||||
if reg.MatchString(str) {
|
||||
found = true
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
comp, err := f.Compare(str, f.Value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if f.MatchType == GreaterThan && comp > 0 {
|
||||
found = true
|
||||
}
|
||||
if f.MatchType == GreaterThanEq && comp >= 0 {
|
||||
found = true
|
||||
}
|
||||
if f.MatchType == LessThan && comp < 0 {
|
||||
found = true
|
||||
}
|
||||
if f.MatchType == LessThanEq && comp <= 0 {
|
||||
found = true
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if found == f.InvertMatch {
|
||||
continue
|
||||
}
|
||||
|
||||
output = append(output, input[i])
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
38
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go
generated
vendored
38
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go
generated
vendored
@@ -1,38 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
|
||||
import (
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
const LocalConfigAnnotation = "config.kubernetes.io/local-config"
|
||||
|
||||
// IsLocalConfig filters Resources using the config.kubernetes.io/local-config annotation
|
||||
type IsLocalConfig struct {
|
||||
// IncludeLocalConfig will include local-config if set to true
|
||||
IncludeLocalConfig bool `yaml:"includeLocalConfig,omitempty"`
|
||||
|
||||
// ExcludeNonLocalConfig will exclude non local-config if set to true
|
||||
ExcludeNonLocalConfig bool `yaml:"excludeNonLocalConfig,omitempty"`
|
||||
}
|
||||
|
||||
// Filter implements kio.Filter
|
||||
func (c *IsLocalConfig) Filter(inputs []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
var out []*yaml.RNode
|
||||
for i := range inputs {
|
||||
meta, err := inputs[i].GetMeta()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, local := meta.Annotations[LocalConfigAnnotation]
|
||||
|
||||
if local && c.IncludeLocalConfig {
|
||||
out = append(out, inputs[i])
|
||||
} else if !local && !c.ExcludeNonLocalConfig {
|
||||
out = append(out, inputs[i])
|
||||
}
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
86
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go
generated
vendored
86
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go
generated
vendored
@@ -1,86 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Package merge contains libraries for merging Resources and Patches
|
||||
package filters
|
||||
|
||||
import (
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml/merge2"
|
||||
)
|
||||
|
||||
// MergeFilter merges Resources with the Group/Version/Kind/Namespace/Name together using
|
||||
// a 2-way merge strategy.
|
||||
//
|
||||
// - Fields set to null in the source will be cleared from the destination
|
||||
// - Fields with matching keys will be merged recursively
|
||||
// - Lists with an associative key (e.g. name) will have their elements merged using the key
|
||||
// - List without an associative key will have the dest list replaced by the source list
|
||||
type MergeFilter struct {
|
||||
Reverse bool
|
||||
}
|
||||
|
||||
var _ kio.Filter = MergeFilter{}
|
||||
|
||||
type mergeKey struct {
|
||||
apiVersion string
|
||||
kind string
|
||||
namespace string
|
||||
name string
|
||||
}
|
||||
|
||||
// MergeFilter implements kio.Filter by merging Resources with the same G/V/K/NS/N
|
||||
func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
// invert the merge precedence
|
||||
if c.Reverse {
|
||||
for i, j := 0, len(input)-1; i < j; i, j = i+1, j-1 {
|
||||
input[i], input[j] = input[j], input[i]
|
||||
}
|
||||
}
|
||||
|
||||
// index the Resources by G/V/K/NS/N
|
||||
index := map[mergeKey][]*yaml.RNode{}
|
||||
// retain the original ordering
|
||||
var order []mergeKey
|
||||
for i := range input {
|
||||
meta, err := input[i].GetMeta()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key := mergeKey{
|
||||
apiVersion: meta.APIVersion,
|
||||
kind: meta.Kind,
|
||||
namespace: meta.Namespace,
|
||||
name: meta.Name,
|
||||
}
|
||||
if _, found := index[key]; !found {
|
||||
order = append(order, key)
|
||||
}
|
||||
index[key] = append(index[key], input[i])
|
||||
}
|
||||
|
||||
// merge each of the G/V/K/NS/N lists
|
||||
var output []*yaml.RNode
|
||||
var err error
|
||||
for _, k := range order {
|
||||
var merged *yaml.RNode
|
||||
resources := index[k]
|
||||
for i := range resources {
|
||||
patch := resources[i]
|
||||
if merged == nil {
|
||||
// first resources, don't merge it
|
||||
merged = resources[i]
|
||||
} else {
|
||||
merged, err = merge2.Merge(patch, merged, yaml.MergeOptions{
|
||||
ListIncreaseDirection: yaml.MergeOptionsListPrepend,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
output = append(output, merged)
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
317
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go
generated
vendored
317
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go
generated
vendored
@@ -1,317 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml/merge3"
|
||||
)
|
||||
|
||||
const (
|
||||
mergeSourceAnnotation = "config.kubernetes.io/merge-source"
|
||||
mergeSourceOriginal = "original"
|
||||
mergeSourceUpdated = "updated"
|
||||
mergeSourceDest = "dest"
|
||||
)
|
||||
|
||||
// ResourceMatcher interface is used to match two resources based on IsSameResource implementation
|
||||
// This is the way to group same logical resources in upstream, local and origin for merge
|
||||
// The default way to group them is using GVKNN similar to how kubernetes server identifies resources
|
||||
// Users of this library might have their own interpretation of grouping similar resources
|
||||
// for e.g. if consumer adds a name-prefix to local resource, it should not be treated as new resource
|
||||
// for updates etc.
|
||||
// Hence, the callers of this library may pass different implementation for IsSameResource
|
||||
type ResourceMatcher interface {
|
||||
IsSameResource(node1, node2 *yaml.RNode) bool
|
||||
}
|
||||
|
||||
// ResourceMergeStrategy is the return type from the Handle function in the
|
||||
// ResourceHandler interface. It determines which version of a resource should
|
||||
// be included in the output (if any).
|
||||
type ResourceMergeStrategy int
|
||||
|
||||
const (
|
||||
// Merge means the output to dest should be the 3-way merge of original,
|
||||
// updated and dest.
|
||||
Merge ResourceMergeStrategy = iota
|
||||
// KeepDest means the version of the resource in dest should be the output.
|
||||
KeepDest
|
||||
// KeepUpdated means the version of the resource in updated should be the
|
||||
// output.
|
||||
KeepUpdated
|
||||
// KeepOriginal means the version of the resource in original should be the
|
||||
// output.
|
||||
KeepOriginal
|
||||
// Skip means the resource should not be included in the output.
|
||||
Skip
|
||||
)
|
||||
|
||||
// ResourceHandler interface is used to determine what should be done for a
|
||||
// resource once the versions in original, updated and dest has been
|
||||
// identified based on the ResourceMatcher. This allows users to customize
|
||||
// what should be the result in dest if a resource has been deleted from
|
||||
// upstream.
|
||||
type ResourceHandler interface {
|
||||
Handle(original, updated, dest *yaml.RNode) (ResourceMergeStrategy, error)
|
||||
}
|
||||
|
||||
// Merge3 performs a 3-way merge on the original, updated, and destination packages.
|
||||
type Merge3 struct {
|
||||
OriginalPath string
|
||||
UpdatedPath string
|
||||
DestPath string
|
||||
MatchFilesGlob []string
|
||||
Matcher ResourceMatcher
|
||||
Handler ResourceHandler
|
||||
}
|
||||
|
||||
func (m Merge3) Merge() error {
|
||||
// Read the destination package. The ReadWriter will take take of deleting files
|
||||
// for removed resources.
|
||||
var inputs []kio.Reader
|
||||
dest := &kio.LocalPackageReadWriter{
|
||||
PackagePath: m.DestPath,
|
||||
MatchFilesGlob: m.MatchFilesGlob,
|
||||
SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceDest},
|
||||
}
|
||||
inputs = append(inputs, dest)
|
||||
|
||||
// Read the original package
|
||||
inputs = append(inputs, kio.LocalPackageReader{
|
||||
PackagePath: m.OriginalPath,
|
||||
MatchFilesGlob: m.MatchFilesGlob,
|
||||
SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceOriginal},
|
||||
})
|
||||
|
||||
// Read the updated package
|
||||
inputs = append(inputs, kio.LocalPackageReader{
|
||||
PackagePath: m.UpdatedPath,
|
||||
MatchFilesGlob: m.MatchFilesGlob,
|
||||
SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceUpdated},
|
||||
})
|
||||
|
||||
return kio.Pipeline{
|
||||
Inputs: inputs,
|
||||
Filters: []kio.Filter{m},
|
||||
Outputs: []kio.Writer{dest},
|
||||
}.Execute()
|
||||
}
|
||||
|
||||
// Filter combines Resources with the same GVK + N + NS into tuples, and then merges them
|
||||
func (m Merge3) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
// index the nodes by their identity
|
||||
matcher := m.Matcher
|
||||
if matcher == nil {
|
||||
matcher = &DefaultGVKNNMatcher{MergeOnPath: true}
|
||||
}
|
||||
handler := m.Handler
|
||||
if handler == nil {
|
||||
handler = &DefaultResourceHandler{}
|
||||
}
|
||||
|
||||
tl := tuples{matcher: matcher}
|
||||
for i := range nodes {
|
||||
if err := tl.add(nodes[i]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// iterate over the inputs, merging as needed
|
||||
var output []*yaml.RNode
|
||||
for i := range tl.list {
|
||||
t := tl.list[i]
|
||||
strategy, err := handler.Handle(t.original, t.updated, t.dest)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
switch strategy {
|
||||
case Merge:
|
||||
node, err := t.merge()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if node != nil {
|
||||
output = append(output, node)
|
||||
}
|
||||
case KeepDest:
|
||||
output = append(output, t.dest)
|
||||
case KeepUpdated:
|
||||
output = append(output, t.updated)
|
||||
case KeepOriginal:
|
||||
output = append(output, t.original)
|
||||
case Skip:
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
|
||||
// tuples combines nodes with the same GVK + N + NS
|
||||
type tuples struct {
|
||||
list []*tuple
|
||||
|
||||
// matcher matches the resources for merge
|
||||
matcher ResourceMatcher
|
||||
}
|
||||
|
||||
// DefaultGVKNNMatcher holds the default matching of resources implementation based on
|
||||
// Group, Version, Kind, Name and Namespace of the resource
|
||||
type DefaultGVKNNMatcher struct {
|
||||
// MergeOnPath will use the relative filepath as part of the merge key.
|
||||
// This may be necessary if the directory contains multiple copies of
|
||||
// the same resource, or resources patches.
|
||||
MergeOnPath bool
|
||||
}
|
||||
|
||||
// IsSameResource returns true if metadata of node1 and metadata of node2 belongs to same logical resource
|
||||
func (dm *DefaultGVKNNMatcher) IsSameResource(node1, node2 *yaml.RNode) bool {
|
||||
if node1 == nil || node2 == nil {
|
||||
return false
|
||||
}
|
||||
if err := kioutil.CopyLegacyAnnotations(node1); err != nil {
|
||||
return false
|
||||
}
|
||||
if err := kioutil.CopyLegacyAnnotations(node2); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
meta1, err := node1.GetMeta()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
meta2, err := node2.GetMeta()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if meta1.Name != meta2.Name {
|
||||
return false
|
||||
}
|
||||
if meta1.Namespace != meta2.Namespace {
|
||||
return false
|
||||
}
|
||||
if meta1.APIVersion != meta2.APIVersion {
|
||||
return false
|
||||
}
|
||||
if meta1.Kind != meta2.Kind {
|
||||
return false
|
||||
}
|
||||
if dm.MergeOnPath {
|
||||
// directories may contain multiple copies of a resource with the same
|
||||
// name, namespace, apiVersion and kind -- e.g. kustomize patches, or
|
||||
// multiple environments
|
||||
// mergeOnPath configures the merge logic to use the path as part of the
|
||||
// resource key
|
||||
if meta1.Annotations[kioutil.PathAnnotation] != meta2.Annotations[kioutil.PathAnnotation] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// add adds a node to the list, combining it with an existing matching Resource if found
|
||||
func (ts *tuples) add(node *yaml.RNode) error {
|
||||
for i := range ts.list {
|
||||
t := ts.list[i]
|
||||
if ts.matcher.IsSameResource(addedNode(t), node) {
|
||||
return t.add(node)
|
||||
}
|
||||
}
|
||||
t := &tuple{}
|
||||
if err := t.add(node); err != nil {
|
||||
return err
|
||||
}
|
||||
ts.list = append(ts.list, t)
|
||||
return nil
|
||||
}
|
||||
|
||||
// addedNode returns one on the existing added nodes in the tuple
|
||||
func addedNode(t *tuple) *yaml.RNode {
|
||||
if t.updated != nil {
|
||||
return t.updated
|
||||
}
|
||||
if t.original != nil {
|
||||
return t.original
|
||||
}
|
||||
return t.dest
|
||||
}
|
||||
|
||||
// tuple wraps an original, updated, and dest tuple for a given Resource
|
||||
type tuple struct {
|
||||
original *yaml.RNode
|
||||
updated *yaml.RNode
|
||||
dest *yaml.RNode
|
||||
}
|
||||
|
||||
// add sets the corresponding tuple field for the node
|
||||
func (t *tuple) add(node *yaml.RNode) error {
|
||||
meta, err := node.GetMeta()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch meta.Annotations[mergeSourceAnnotation] {
|
||||
case mergeSourceDest:
|
||||
if t.dest != nil {
|
||||
return duplicateError("local", meta.Annotations[kioutil.PathAnnotation])
|
||||
}
|
||||
t.dest = node
|
||||
case mergeSourceOriginal:
|
||||
if t.original != nil {
|
||||
return duplicateError("original upstream", meta.Annotations[kioutil.PathAnnotation])
|
||||
}
|
||||
t.original = node
|
||||
case mergeSourceUpdated:
|
||||
if t.updated != nil {
|
||||
return duplicateError("updated upstream", meta.Annotations[kioutil.PathAnnotation])
|
||||
}
|
||||
t.updated = node
|
||||
default:
|
||||
return fmt.Errorf("no source annotation for Resource")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// merge performs a 3-way merge on the tuple
|
||||
func (t *tuple) merge() (*yaml.RNode, error) {
|
||||
return merge3.Merge(t.dest, t.original, t.updated)
|
||||
}
|
||||
|
||||
// duplicateError returns duplicate resources error
|
||||
func duplicateError(source, filePath string) error {
|
||||
return fmt.Errorf(`found duplicate %q resources in file %q, please refer to "update" documentation for the fix`, source, filePath)
|
||||
}
|
||||
|
||||
// DefaultResourceHandler is the default implementation of the ResourceHandler
|
||||
// interface. It uses the following rules:
|
||||
// * Keep dest if resource only exists in dest.
|
||||
// * Keep updated if resource added in updated.
|
||||
// * Delete dest if updated has been deleted.
|
||||
// * Don't add the resource back if removed from dest.
|
||||
// * Otherwise merge.
|
||||
type DefaultResourceHandler struct{}
|
||||
|
||||
func (*DefaultResourceHandler) Handle(original, updated, dest *yaml.RNode) (ResourceMergeStrategy, error) {
|
||||
switch {
|
||||
case original == nil && updated == nil && dest != nil:
|
||||
// added locally -- keep dest
|
||||
return KeepDest, nil
|
||||
case updated != nil && dest == nil:
|
||||
// added in the update -- add update
|
||||
return KeepUpdated, nil
|
||||
case original != nil && updated == nil:
|
||||
// deleted in the update
|
||||
return Skip, nil
|
||||
case original != nil && dest == nil:
|
||||
// deleted locally
|
||||
return Skip, nil
|
||||
default:
|
||||
// dest and updated are non-nil -- merge them
|
||||
return Merge, nil
|
||||
}
|
||||
}
|
||||
4
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go
generated
vendored
4
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go
generated
vendored
@@ -1,4 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
32
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go
generated
vendored
32
vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go
generated
vendored
@@ -1,32 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package filters
|
||||
|
||||
import (
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
)
|
||||
|
||||
type StripCommentsFilter struct{}
|
||||
|
||||
var _ kio.Filter = StripCommentsFilter{}
|
||||
|
||||
func (f StripCommentsFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
for i := range slice {
|
||||
stripComments(slice[i].YNode())
|
||||
}
|
||||
return slice, nil
|
||||
}
|
||||
|
||||
func stripComments(node *yaml.Node) {
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
node.HeadComment = ""
|
||||
node.LineComment = ""
|
||||
node.FootComment = ""
|
||||
for i := range node.Content {
|
||||
stripComments(node.Content[i])
|
||||
}
|
||||
}
|
||||
2
vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go
generated
vendored
@@ -86,7 +86,7 @@ func (i *ignoreFilesMatcher) matchFile(path string) bool {
|
||||
return i.matchers[len(i.matchers)-1].matcher.Match(path, false)
|
||||
}
|
||||
|
||||
// matchFile checks whether the directory given by the provided path matches
|
||||
// matchDir checks whether the directory given by the provided path matches
|
||||
// any of the patterns in the .krmignore file for the package.
|
||||
func (i *ignoreFilesMatcher) matchDir(path string) bool {
|
||||
if len(i.matchers) == 0 {
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go
generated
vendored
@@ -64,7 +64,7 @@ func (fi bindataFileInfo) Mode() os.FileMode {
|
||||
return fi.mode
|
||||
}
|
||||
|
||||
// Mode return file modify time
|
||||
// ModTime return file modify time
|
||||
func (fi bindataFileInfo) ModTime() time.Time {
|
||||
return fi.modTime
|
||||
}
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go
generated
vendored
@@ -182,7 +182,7 @@ type ResourceSchema struct {
|
||||
Schema *spec.Schema
|
||||
}
|
||||
|
||||
// IsEmpty returns true if the ResourceSchema is empty
|
||||
// IsMissingOrNull returns true if the ResourceSchema is missing or null
|
||||
func (rs *ResourceSchema) IsMissingOrNull() bool {
|
||||
if rs == nil || rs.Schema == nil {
|
||||
return true
|
||||
|
||||
41
vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go
generated
vendored
41
vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go
generated
vendored
@@ -19,7 +19,6 @@ import (
|
||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/container"
|
||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/exec"
|
||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
|
||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
@@ -61,9 +60,6 @@ type RunFns struct {
|
||||
// and only use explicit sources
|
||||
NoFunctionsFromInput *bool
|
||||
|
||||
// EnableStarlark will enable functions run as starlark scripts
|
||||
EnableStarlark bool
|
||||
|
||||
// EnableExec will enable exec functions
|
||||
EnableExec bool
|
||||
|
||||
@@ -209,8 +205,6 @@ func (r RunFns) runFunctions(
|
||||
identifier = filter.Image
|
||||
case *exec.Filter:
|
||||
identifier = filter.Path
|
||||
case *starlark.Filter:
|
||||
identifier = filter.String()
|
||||
default:
|
||||
identifier = "unknown-type function"
|
||||
}
|
||||
@@ -496,41 +490,6 @@ func (r *RunFns) ffp(spec runtimeutil.FunctionSpec, api *yaml.RNode, currentUser
|
||||
cf.Exec.DeferFailure = spec.DeferFailure
|
||||
return cf, nil
|
||||
}
|
||||
if r.EnableStarlark && (spec.Starlark.Path != "" || spec.Starlark.URL != "") {
|
||||
// the script path is relative to the function config file
|
||||
m, err := api.GetMeta()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err)
|
||||
}
|
||||
|
||||
var p string
|
||||
if spec.Starlark.Path != "" {
|
||||
pathAnno := m.Annotations[kioutil.PathAnnotation]
|
||||
if pathAnno == "" {
|
||||
pathAnno = m.Annotations[kioutil.LegacyPathAnnotation]
|
||||
}
|
||||
p = filepath.ToSlash(path.Clean(pathAnno))
|
||||
|
||||
spec.Starlark.Path = filepath.ToSlash(path.Clean(spec.Starlark.Path))
|
||||
if filepath.IsAbs(spec.Starlark.Path) || path.IsAbs(spec.Starlark.Path) {
|
||||
return nil, errors.Errorf(
|
||||
"absolute function path %s not allowed", spec.Starlark.Path)
|
||||
}
|
||||
if strings.HasPrefix(spec.Starlark.Path, "..") {
|
||||
return nil, errors.Errorf(
|
||||
"function path %s not allowed to start with ../", spec.Starlark.Path)
|
||||
}
|
||||
p = filepath.ToSlash(filepath.Join(r.Path, filepath.Dir(p), spec.Starlark.Path))
|
||||
}
|
||||
|
||||
sf := &starlark.Filter{Name: spec.Starlark.Name, Path: p, URL: spec.Starlark.URL}
|
||||
|
||||
sf.FunctionConfig = api
|
||||
sf.GlobalScope = r.GlobalScope
|
||||
sf.ResultsFile = resultsFile
|
||||
sf.DeferFailure = spec.DeferFailure
|
||||
return sf, nil
|
||||
}
|
||||
|
||||
if r.EnableExec && spec.Exec.Path != "" {
|
||||
ef := &exec.Filter{
|
||||
|
||||
2
vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go
generated
vendored
2
vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go
generated
vendored
@@ -20,7 +20,7 @@ const (
|
||||
BareSeqNodeWrappingKey = "bareSeqNodeWrappingKey"
|
||||
)
|
||||
|
||||
// SeqIndentType holds the indentation style for sequence nodes
|
||||
// SequenceIndentStyle holds the indentation style for sequence nodes
|
||||
type SequenceIndentStyle string
|
||||
|
||||
// EncoderOptions are options that can be used to configure the encoder,
|
||||
|
||||
45
vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go
generated
vendored
45
vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go
generated
vendored
@@ -1,45 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Package merge contains libraries for merging fields from one RNode to another
|
||||
// RNode
|
||||
package merge3
|
||||
|
||||
import (
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml/walk"
|
||||
)
|
||||
|
||||
func Merge(dest, original, update *yaml.RNode) (*yaml.RNode, error) {
|
||||
// if update == nil && original != nil => declarative deletion
|
||||
|
||||
return walk.Walker{
|
||||
Visitor: Visitor{},
|
||||
VisitKeysAsScalars: true,
|
||||
Sources: []*yaml.RNode{dest, original, update}}.Walk()
|
||||
}
|
||||
|
||||
func MergeStrings(dest, original, update string, infer bool) (string, error) {
|
||||
srcOriginal, err := yaml.Parse(original)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
srcUpdated, err := yaml.Parse(update)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
d, err := yaml.Parse(dest)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
result, err := walk.Walker{
|
||||
InferAssociativeLists: infer,
|
||||
Visitor: Visitor{},
|
||||
VisitKeysAsScalars: true,
|
||||
Sources: []*yaml.RNode{d, srcOriginal, srcUpdated}}.Walk()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return result.String()
|
||||
}
|
||||
172
vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go
generated
vendored
172
vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go
generated
vendored
@@ -1,172 +0,0 @@
|
||||
// Copyright 2019 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package merge3
|
||||
|
||||
import (
|
||||
"sigs.k8s.io/kustomize/kyaml/openapi"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||
"sigs.k8s.io/kustomize/kyaml/yaml/walk"
|
||||
)
|
||||
|
||||
type ConflictStrategy uint
|
||||
|
||||
const (
|
||||
// TODO: Support more strategies
|
||||
TakeUpdate ConflictStrategy = 1 + iota
|
||||
)
|
||||
|
||||
type Visitor struct{}
|
||||
|
||||
func (m Visitor) VisitMap(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) {
|
||||
if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
|
||||
// explicitly cleared from either dest or update
|
||||
return walk.ClearNode, nil
|
||||
}
|
||||
if nodes.Dest() == nil && nodes.Updated() == nil {
|
||||
// implicitly cleared missing from both dest and update
|
||||
return walk.ClearNode, nil
|
||||
}
|
||||
|
||||
if nodes.Dest() == nil {
|
||||
// not cleared, but missing from the dest
|
||||
// initialize a new value that can be recursively merged
|
||||
return yaml.NewRNode(&yaml.Node{Kind: yaml.MappingNode}), nil
|
||||
}
|
||||
|
||||
// recursively merge the dest with the original and updated
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
func (m Visitor) visitAList(nodes walk.Sources, _ *openapi.ResourceSchema) (*yaml.RNode, error) {
|
||||
if yaml.IsMissingOrNull(nodes.Updated()) && !yaml.IsMissingOrNull(nodes.Origin()) {
|
||||
// implicitly cleared from update -- element was deleted
|
||||
return walk.ClearNode, nil
|
||||
}
|
||||
if yaml.IsMissingOrNull(nodes.Dest()) {
|
||||
// not cleared, but missing from the dest
|
||||
// initialize a new value that can be recursively merged
|
||||
return yaml.NewRNode(&yaml.Node{Kind: yaml.SequenceNode}), nil
|
||||
}
|
||||
|
||||
// recursively merge the dest with the original and updated
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
func (m Visitor) VisitScalar(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) {
|
||||
if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
|
||||
// explicitly cleared from either dest or update
|
||||
return nil, nil
|
||||
}
|
||||
if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) {
|
||||
// value added or removed in update
|
||||
return nodes.Updated(), nil
|
||||
}
|
||||
if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) {
|
||||
// value added or removed in update
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
values, err := m.getStrValues(nodes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if (values.Dest == "" || values.Dest == values.Origin) && values.Origin != values.Update {
|
||||
// if local is nil or is unchanged but there is new update
|
||||
return nodes.Updated(), nil
|
||||
}
|
||||
|
||||
if nodes.Updated().YNode().Value != nodes.Origin().YNode().Value {
|
||||
// value changed in update
|
||||
return nodes.Updated(), nil
|
||||
}
|
||||
|
||||
// unchanged between origin and update, keep the dest
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
func (m Visitor) visitNAList(nodes walk.Sources) (*yaml.RNode, error) {
|
||||
if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() {
|
||||
// explicitly cleared from either dest or update
|
||||
return walk.ClearNode, nil
|
||||
}
|
||||
|
||||
if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) {
|
||||
// value added or removed in update
|
||||
return nodes.Updated(), nil
|
||||
}
|
||||
if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) {
|
||||
// value not present in source or dest
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
// compare origin and update values to see if they have changed
|
||||
values, err := m.getStrValues(nodes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if values.Update != values.Origin {
|
||||
// value changed in update
|
||||
return nodes.Updated(), nil
|
||||
}
|
||||
|
||||
// unchanged between origin and update, keep the dest
|
||||
return nodes.Dest(), nil
|
||||
}
|
||||
|
||||
func (m Visitor) VisitList(nodes walk.Sources, s *openapi.ResourceSchema, kind walk.ListKind) (*yaml.RNode, error) {
|
||||
if kind == walk.AssociativeList {
|
||||
return m.visitAList(nodes, s)
|
||||
}
|
||||
// non-associative list
|
||||
return m.visitNAList(nodes)
|
||||
}
|
||||
|
||||
func (m Visitor) getStrValues(nodes walk.Sources) (strValues, error) {
|
||||
var uStr, oStr, dStr string
|
||||
var err error
|
||||
if nodes.Updated() != nil && nodes.Updated().YNode() != nil {
|
||||
s := nodes.Updated().YNode().Style
|
||||
defer func() {
|
||||
nodes.Updated().YNode().Style = s
|
||||
}()
|
||||
nodes.Updated().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
|
||||
uStr, err = nodes.Updated().String()
|
||||
if err != nil {
|
||||
return strValues{}, err
|
||||
}
|
||||
}
|
||||
if nodes.Origin() != nil && nodes.Origin().YNode() != nil {
|
||||
s := nodes.Origin().YNode().Style
|
||||
defer func() {
|
||||
nodes.Origin().YNode().Style = s
|
||||
}()
|
||||
nodes.Origin().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
|
||||
oStr, err = nodes.Origin().String()
|
||||
if err != nil {
|
||||
return strValues{}, err
|
||||
}
|
||||
}
|
||||
if nodes.Dest() != nil && nodes.Dest().YNode() != nil {
|
||||
s := nodes.Dest().YNode().Style
|
||||
defer func() {
|
||||
nodes.Dest().YNode().Style = s
|
||||
}()
|
||||
nodes.Dest().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle
|
||||
dStr, err = nodes.Dest().String()
|
||||
if err != nil {
|
||||
return strValues{}, err
|
||||
}
|
||||
}
|
||||
|
||||
return strValues{Origin: oStr, Update: uStr, Dest: dStr}, nil
|
||||
}
|
||||
|
||||
type strValues struct {
|
||||
Origin string
|
||||
Update string
|
||||
Dest string
|
||||
}
|
||||
|
||||
var _ walk.Visitor = Visitor{}
|
||||
Reference in New Issue
Block a user