mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
Reinstate #4652 without url-related code
Remove code that changes remotes-loading code path, as mandated by #4756
This commit is contained in:
@@ -28,12 +28,20 @@ type KvLoader interface {
|
|||||||
|
|
||||||
// Loader interface exposes methods to read bytes.
|
// Loader interface exposes methods to read bytes.
|
||||||
type Loader interface {
|
type Loader interface {
|
||||||
|
|
||||||
|
// Repo returns the repo location and true if this Loader
|
||||||
|
// was created from a url; otherwise the empty string and false.
|
||||||
|
Repo() (string, bool)
|
||||||
|
|
||||||
// Root returns the root location for this Loader.
|
// Root returns the root location for this Loader.
|
||||||
Root() string
|
Root() string
|
||||||
|
|
||||||
// New returns Loader located at newRoot.
|
// New returns Loader located at newRoot.
|
||||||
New(newRoot string) (Loader, error)
|
New(newRoot string) (Loader, error)
|
||||||
|
|
||||||
// Load returns the bytes read from the location or an error.
|
// Load returns the bytes read from the location or an error.
|
||||||
Load(location string) ([]byte, error)
|
Load(location string) ([]byte, error)
|
||||||
|
|
||||||
// Cleanup cleans the loader
|
// Cleanup cleans the loader
|
||||||
Cleanup() error
|
Cleanup() error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ type RepoSpec struct {
|
|||||||
// TODO(monopole): Drop raw, use processed fields instead.
|
// TODO(monopole): Drop raw, use processed fields instead.
|
||||||
raw string
|
raw string
|
||||||
|
|
||||||
// Host, e.g. github.com
|
// Host, e.g. https://github.com/
|
||||||
Host string
|
Host string
|
||||||
|
|
||||||
// orgRepo name (organization/repoName),
|
// orgRepo name (organization/repoName),
|
||||||
|
|||||||
7
api/internal/localizer/doc.go
Normal file
7
api/internal/localizer/doc.go
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// Copyright 2022 The Kubernetes Authors.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
// Package localizer contains utilities for the command kustomize localize, which is
|
||||||
|
// documented under proposals/localize-command or at
|
||||||
|
// https://github.com/kubernetes-sigs/kustomize/blob/master/proposals/22-04-localize-command.md
|
||||||
|
package localizer
|
||||||
146
api/internal/localizer/locloader.go
Normal file
146
api/internal/localizer/locloader.go
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
// Copyright 2022 The Kubernetes Authors.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package localizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"sigs.k8s.io/kustomize/api/ifc"
|
||||||
|
"sigs.k8s.io/kustomize/api/internal/git"
|
||||||
|
"sigs.k8s.io/kustomize/api/loader"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||||
|
)
|
||||||
|
|
||||||
|
const dstPrefix = "localized"
|
||||||
|
|
||||||
|
// LocArgs holds localize arguments
|
||||||
|
type LocArgs struct {
|
||||||
|
// target; local copy if remote
|
||||||
|
Target filesys.ConfirmedDir
|
||||||
|
|
||||||
|
// directory that bounds target's local references, empty string if target is remote
|
||||||
|
Scope filesys.ConfirmedDir
|
||||||
|
|
||||||
|
// localize destination
|
||||||
|
NewDir filesys.ConfirmedDir
|
||||||
|
}
|
||||||
|
|
||||||
|
// locLoader is the Loader for kustomize localize. It is an ifc.Loader that enforces localize constraints.
|
||||||
|
type locLoader struct {
|
||||||
|
fSys filesys.FileSystem
|
||||||
|
|
||||||
|
args *LocArgs
|
||||||
|
|
||||||
|
// loader at locLoader's current directory
|
||||||
|
ifc.Loader
|
||||||
|
|
||||||
|
// whether locLoader and all its ancestors are the result of local references
|
||||||
|
local bool
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ ifc.Loader = &locLoader{}
|
||||||
|
|
||||||
|
// NewLocLoader is the factory method for Loader, under localize constraints, at targetArg. For invalid localize arguments,
|
||||||
|
// NewLocLoader returns an error.
|
||||||
|
func NewLocLoader(targetArg string, scopeArg string, newDirArg string, fSys filesys.FileSystem) (ifc.Loader, LocArgs, error) {
|
||||||
|
// check earlier to avoid cleanup
|
||||||
|
repoSpec, err := git.NewRepoSpecFromURL(targetArg)
|
||||||
|
if err == nil && repoSpec.Ref == "" {
|
||||||
|
return nil, LocArgs{},
|
||||||
|
errors.Errorf("localize remote root '%s' missing ref query string parameter", targetArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// for security, should enforce load restrictions
|
||||||
|
ldr, err := loader.NewLoader(loader.RestrictionRootOnly, targetArg, fSys)
|
||||||
|
if err != nil {
|
||||||
|
return nil, LocArgs{}, errors.WrapPrefixf(err, "unable to establish localize target '%s'", targetArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
scope, err := establishScope(scopeArg, targetArg, ldr, fSys)
|
||||||
|
if err != nil {
|
||||||
|
_ = ldr.Cleanup()
|
||||||
|
return nil, LocArgs{}, errors.WrapPrefixf(err, "invalid localize scope '%s'", scopeArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
newDir, err := createNewDir(newDirArg, ldr, repoSpec, fSys)
|
||||||
|
if err != nil {
|
||||||
|
_ = ldr.Cleanup()
|
||||||
|
return nil, LocArgs{}, errors.WrapPrefixf(err, "invalid localize destination '%s'", newDirArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
args := LocArgs{
|
||||||
|
Target: filesys.ConfirmedDir(ldr.Root()),
|
||||||
|
Scope: scope,
|
||||||
|
NewDir: newDir,
|
||||||
|
}
|
||||||
|
return &locLoader{
|
||||||
|
fSys: fSys,
|
||||||
|
args: &args,
|
||||||
|
Loader: ldr,
|
||||||
|
local: scope != "",
|
||||||
|
}, args, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load returns the contents of path if path is a valid localize file.
|
||||||
|
// Otherwise, Load returns an error.
|
||||||
|
func (ll *locLoader) Load(path string) ([]byte, error) {
|
||||||
|
// checks in root, and thus in scope
|
||||||
|
content, err := ll.Loader.Load(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.WrapPrefixf(err, "invalid file reference")
|
||||||
|
}
|
||||||
|
if filepath.IsAbs(path) {
|
||||||
|
return nil, errors.Errorf("absolute paths not yet supported in alpha: file path '%s' is absolute", path)
|
||||||
|
}
|
||||||
|
if ll.local {
|
||||||
|
abs := filepath.Join(ll.Root(), path)
|
||||||
|
dir, f, err := ll.fSys.CleanedAbs(abs)
|
||||||
|
if err != nil {
|
||||||
|
// should never happen
|
||||||
|
log.Fatalf(errors.WrapPrefixf(err, "cannot clean validated file path '%s'", abs).Error())
|
||||||
|
}
|
||||||
|
// target cannot reference newDir, as this load would've failed prior to localize;
|
||||||
|
// not a problem if remote because then reference could only be in newDir if repo copy,
|
||||||
|
// which will be cleaned, is inside newDir
|
||||||
|
if dir.HasPrefix(ll.args.NewDir) {
|
||||||
|
return nil, errors.Errorf(
|
||||||
|
"file path '%s' references into localize destination '%s'", dir.Join(f), ll.args.NewDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return content, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a Loader at path if path is a valid localize root.
|
||||||
|
// Otherwise, New returns an error.
|
||||||
|
func (ll *locLoader) New(path string) (ifc.Loader, error) {
|
||||||
|
repoSpec, err := git.NewRepoSpecFromURL(path)
|
||||||
|
if err == nil && repoSpec.Ref == "" {
|
||||||
|
return nil, errors.Errorf("localize remote root '%s' missing ref query string parameter", path)
|
||||||
|
}
|
||||||
|
|
||||||
|
ldr, err := ll.Loader.New(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.WrapPrefixf(err, "invalid root reference")
|
||||||
|
}
|
||||||
|
|
||||||
|
var isRemote bool
|
||||||
|
if _, isRemote = ldr.Repo(); !isRemote {
|
||||||
|
if ll.local && !filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.Scope) {
|
||||||
|
return nil, errors.Errorf("root '%s' outside localize scope '%s'", ldr.Root(), ll.args.Scope)
|
||||||
|
}
|
||||||
|
if ll.local && filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.NewDir) {
|
||||||
|
return nil, errors.Errorf(
|
||||||
|
"root '%s' references into localize destination '%s'", ldr.Root(), ll.args.NewDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &locLoader{
|
||||||
|
fSys: ll.fSys,
|
||||||
|
args: ll.args,
|
||||||
|
Loader: ldr,
|
||||||
|
local: ll.local && !isRemote,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
311
api/internal/localizer/locloader_test.go
Normal file
311
api/internal/localizer/locloader_test.go
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
// Copyright 2022 The Kubernetes Authors.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package localizer_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"log"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"sigs.k8s.io/kustomize/api/ifc"
|
||||||
|
lclzr "sigs.k8s.io/kustomize/api/internal/localizer"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||||
|
)
|
||||||
|
|
||||||
|
const dstPrefix = "localized"
|
||||||
|
|
||||||
|
func makeMemoryFs(t *testing.T) filesys.FileSystem {
|
||||||
|
t.Helper()
|
||||||
|
req := require.New(t)
|
||||||
|
|
||||||
|
fSys := filesys.MakeFsInMemory()
|
||||||
|
req.NoError(fSys.MkdirAll("/a/b"))
|
||||||
|
req.NoError(fSys.WriteFile("/a/kustomization.yaml", []byte("/a")))
|
||||||
|
|
||||||
|
dirChain := "/alpha/beta/gamma/delta"
|
||||||
|
req.NoError(fSys.MkdirAll(dirChain))
|
||||||
|
req.NoError(fSys.WriteFile(dirChain+"/kustomization.yaml", []byte(dirChain)))
|
||||||
|
req.NoError(fSys.Mkdir("/alpha/beta/c"))
|
||||||
|
return fSys
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkNewLocLoader(req *require.Assertions, ldr ifc.Loader, args *lclzr.LocArgs, target string, scope string, newDir string, fSys filesys.FileSystem) {
|
||||||
|
checkLoader(req, ldr, target)
|
||||||
|
checkLocArgs(req, args, target, scope, newDir, fSys)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkLoader(req *require.Assertions, ldr ifc.Loader, root string) {
|
||||||
|
req.Equal(root, ldr.Root())
|
||||||
|
repo, isRemote := ldr.Repo()
|
||||||
|
req.Equal(false, isRemote)
|
||||||
|
req.Equal("", repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkLocArgs(req *require.Assertions, args *lclzr.LocArgs, target string, scope string, newDir string, fSys filesys.FileSystem) {
|
||||||
|
req.Equal(target, args.Target.String())
|
||||||
|
req.Equal(scope, args.Scope.String())
|
||||||
|
req.Equal(newDir, args.NewDir.String())
|
||||||
|
req.True(fSys.Exists(newDir))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLocalLoadNewAndCleanup(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
log.SetOutput(&buf)
|
||||||
|
// typical setup
|
||||||
|
ldr, args, err := lclzr.NewLocLoader("a", "/", "/newDir", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkNewLocLoader(req, ldr, &args, "/a", "/", "/newDir", fSys)
|
||||||
|
|
||||||
|
fSysCopy := makeMemoryFs(t)
|
||||||
|
req.NoError(fSysCopy.Mkdir("/newDir"))
|
||||||
|
req.Equal(fSysCopy, fSys)
|
||||||
|
|
||||||
|
// easy load directly in root
|
||||||
|
content, err := ldr.Load("kustomization.yaml")
|
||||||
|
req.NoError(err)
|
||||||
|
req.Equal([]byte("/a"), content)
|
||||||
|
|
||||||
|
// typical sibling root reference
|
||||||
|
sibLdr, err := ldr.New("../alpha")
|
||||||
|
req.NoError(err)
|
||||||
|
checkLoader(req, sibLdr, "/alpha")
|
||||||
|
|
||||||
|
// only need to test once, since don't need to call Cleanup() on local target
|
||||||
|
req.NoError(sibLdr.Cleanup())
|
||||||
|
req.NoError(ldr.Cleanup())
|
||||||
|
|
||||||
|
// file system and buffer checks are also one-time
|
||||||
|
req.Equal(fSysCopy, fSys)
|
||||||
|
req.Empty(buf.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewLocLoaderDefaultForRootTarget(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
target string
|
||||||
|
scope string
|
||||||
|
}{
|
||||||
|
"explicit": {
|
||||||
|
"/",
|
||||||
|
".",
|
||||||
|
},
|
||||||
|
"implicit": {
|
||||||
|
".",
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for name, params := range cases {
|
||||||
|
params := params
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
ldr, args, err := lclzr.NewLocLoader(params.target, params.scope, "", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkNewLocLoader(req, ldr, &args, "/", "/", "/"+dstPrefix, fSys)
|
||||||
|
|
||||||
|
// file in root, but nested
|
||||||
|
content, err := ldr.Load("a/kustomization.yaml")
|
||||||
|
req.NoError(err)
|
||||||
|
req.Equal([]byte("/a"), content)
|
||||||
|
|
||||||
|
childLdr, err := ldr.New("a")
|
||||||
|
req.NoError(err)
|
||||||
|
checkLoader(req, childLdr, "/a")
|
||||||
|
|
||||||
|
// messy, uncleaned path
|
||||||
|
content, err = childLdr.Load("./../a/kustomization.yaml")
|
||||||
|
req.NoError(err)
|
||||||
|
req.Equal([]byte("/a"), content)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewMultiple(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
// default destination for non-file system root target
|
||||||
|
// destination outside of scope
|
||||||
|
ldr, args, err := lclzr.NewLocLoader("/alpha/beta", "/alpha", "", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkNewLocLoader(req, ldr, &args, "/alpha/beta", "/alpha", "/"+dstPrefix+"-beta", fSys)
|
||||||
|
|
||||||
|
// nested child root that isn't cleaned
|
||||||
|
descLdr, err := ldr.New("../beta/gamma/delta")
|
||||||
|
req.NoError(err)
|
||||||
|
checkLoader(req, descLdr, "/alpha/beta/gamma/delta")
|
||||||
|
|
||||||
|
// upwards traversal
|
||||||
|
higherLdr, err := descLdr.New("../../c")
|
||||||
|
req.NoError(err)
|
||||||
|
checkLoader(req, higherLdr, "/alpha/beta/c")
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeWdFs(t *testing.T) map[string]filesys.FileSystem {
|
||||||
|
t.Helper()
|
||||||
|
req := require.New(t)
|
||||||
|
|
||||||
|
root := filesys.MakeEmptyDirInMemory()
|
||||||
|
req.NoError(root.MkdirAll("a/b/c/d/e"))
|
||||||
|
|
||||||
|
outer, err := root.Find("a")
|
||||||
|
req.NoError(err)
|
||||||
|
middle, err := root.Find("a/b/c")
|
||||||
|
req.NoError(err)
|
||||||
|
|
||||||
|
return map[string]filesys.FileSystem{
|
||||||
|
"a": outer,
|
||||||
|
"a/b/c": middle,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewLocLoaderCwdNotRoot(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
wd string
|
||||||
|
target string
|
||||||
|
scope string
|
||||||
|
newDir string
|
||||||
|
}{
|
||||||
|
// target not immediate child of scope
|
||||||
|
"outer dir": {
|
||||||
|
"a",
|
||||||
|
"b/c/d/e",
|
||||||
|
"b/c",
|
||||||
|
"b/newDir",
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"a/b/c",
|
||||||
|
"d/e",
|
||||||
|
".",
|
||||||
|
"d/e/newDir",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, test := range cases {
|
||||||
|
test := test
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeWdFs(t)[test.wd]
|
||||||
|
|
||||||
|
ldr, args, err := lclzr.NewLocLoader(test.target, test.scope, test.newDir, fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkLoader(req, ldr, "a/b/c/d/e")
|
||||||
|
|
||||||
|
req.Equal("a/b/c/d/e", args.Target.String())
|
||||||
|
req.Equal("a/b/c", args.Scope.String())
|
||||||
|
req.Equal(test.wd+"/"+test.newDir, args.NewDir.String())
|
||||||
|
// memory file system can only find paths rooted at current node
|
||||||
|
req.True(fSys.Exists(test.newDir))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewLocLoaderFails(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
target string
|
||||||
|
scope string
|
||||||
|
dest string
|
||||||
|
}{
|
||||||
|
"non-existent target": {
|
||||||
|
"/b",
|
||||||
|
"/",
|
||||||
|
"/newDir",
|
||||||
|
},
|
||||||
|
"file target": {
|
||||||
|
"/a/kustomization.yaml",
|
||||||
|
"/",
|
||||||
|
"/newDir",
|
||||||
|
},
|
||||||
|
"inner scope": {
|
||||||
|
"/alpha",
|
||||||
|
"/alpha/beta",
|
||||||
|
"/newDir",
|
||||||
|
},
|
||||||
|
"side scope": {
|
||||||
|
"/alpha",
|
||||||
|
"/a",
|
||||||
|
"/newDir",
|
||||||
|
},
|
||||||
|
"existing dst": {
|
||||||
|
"/alpha",
|
||||||
|
"/",
|
||||||
|
"/a",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for name, params := range cases {
|
||||||
|
params := params
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
log.SetOutput(&buf)
|
||||||
|
_, _, err := lclzr.NewLocLoader(params.target, params.scope, params.dest, makeMemoryFs(t))
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Empty(t, buf.String())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewFails(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
ldr, args, err := lclzr.NewLocLoader("/alpha/beta/gamma", "alpha", "alpha/beta/gamma/newDir", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkNewLocLoader(req, ldr, &args, "/alpha/beta/gamma", "/alpha", "/alpha/beta/gamma/newDir", fSys)
|
||||||
|
|
||||||
|
cases := map[string]string{
|
||||||
|
"outside scope": "../../../a",
|
||||||
|
"at dst": "newDir",
|
||||||
|
"ancestor": "../../beta",
|
||||||
|
"non-existent root": "delt",
|
||||||
|
"file": "delta/kustomization.yaml",
|
||||||
|
}
|
||||||
|
for name, root := range cases {
|
||||||
|
root := root
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
ldr, _, err := lclzr.NewLocLoader("/alpha/beta/gamma", "alpha", "alpha/beta/gamma/newDir", fSys)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = ldr.New(root)
|
||||||
|
require.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoadFails(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
ldr, args, err := lclzr.NewLocLoader("./a/../a", "/a/../a", "/a/newDir", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
checkNewLocLoader(req, ldr, &args, "/a", "/a", "/a/newDir", fSys)
|
||||||
|
|
||||||
|
cases := map[string]string{
|
||||||
|
"absolute path": "/a/kustomization.yaml",
|
||||||
|
"directory": "b",
|
||||||
|
"non-existent file": "kubectl.yaml",
|
||||||
|
"file outside root": "../alpha/beta/gamma/delta/kustomization.yaml",
|
||||||
|
"inside dst": "newDir/kustomization.yaml",
|
||||||
|
}
|
||||||
|
for name, file := range cases {
|
||||||
|
file := file
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
req := require.New(t)
|
||||||
|
fSys := makeMemoryFs(t)
|
||||||
|
|
||||||
|
ldr, _, err := lclzr.NewLocLoader("./a/../a", "/a/../a", "/a/newDir", fSys)
|
||||||
|
req.NoError(err)
|
||||||
|
|
||||||
|
req.NoError(fSys.WriteFile("/a/newDir/kustomization.yaml", []byte("/a/newDir")))
|
||||||
|
|
||||||
|
_, err = ldr.Load(file)
|
||||||
|
req.Error(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
91
api/internal/localizer/util.go
Normal file
91
api/internal/localizer/util.go
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
// Copyright 2022 The Kubernetes Authors.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package localizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"sigs.k8s.io/kustomize/api/ifc"
|
||||||
|
"sigs.k8s.io/kustomize/api/internal/git"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/errors"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||||
|
)
|
||||||
|
|
||||||
|
// establishScope returns the scope given localize arguments and targetLdr at targetArg
|
||||||
|
func establishScope(scopeArg string, targetArg string, targetLdr ifc.Loader, fSys filesys.FileSystem) (filesys.ConfirmedDir, error) {
|
||||||
|
if _, isRemote := targetLdr.Repo(); isRemote {
|
||||||
|
if scopeArg != "" {
|
||||||
|
return "", errors.Errorf("scope '%s' specified for remote localize target '%s'", scopeArg, targetArg)
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
// default scope
|
||||||
|
if scopeArg == "" {
|
||||||
|
return filesys.ConfirmedDir(targetLdr.Root()), nil
|
||||||
|
}
|
||||||
|
scope, err := filesys.ConfirmDir(fSys, scopeArg)
|
||||||
|
if err != nil {
|
||||||
|
return "", errors.WrapPrefixf(err, "unable to establish localize scope")
|
||||||
|
}
|
||||||
|
if !filesys.ConfirmedDir(targetLdr.Root()).HasPrefix(scope) {
|
||||||
|
return scope, errors.Errorf("localize scope '%s' does not contain target '%s' at '%s'",
|
||||||
|
scopeArg, targetArg, targetLdr.Root())
|
||||||
|
}
|
||||||
|
return scope, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// createNewDir returns the localize destination directory or error. Note that spec is nil if targetLdr is at local
|
||||||
|
// target.
|
||||||
|
func createNewDir(newDirArg string, targetLdr ifc.Loader, spec *git.RepoSpec, fSys filesys.FileSystem) (filesys.ConfirmedDir, error) {
|
||||||
|
if newDirArg == "" {
|
||||||
|
newDirArg = defaultNewDir(targetLdr, spec)
|
||||||
|
}
|
||||||
|
if fSys.Exists(newDirArg) {
|
||||||
|
return "", errors.Errorf("localize destination '%s' already exists", newDirArg)
|
||||||
|
}
|
||||||
|
// destination directory must sit in an existing directory
|
||||||
|
if err := fSys.Mkdir(newDirArg); err != nil {
|
||||||
|
return "", errors.WrapPrefixf(err, "unable to create localize destination directory")
|
||||||
|
}
|
||||||
|
newDir, err := filesys.ConfirmDir(fSys, newDirArg)
|
||||||
|
if err != nil {
|
||||||
|
if errCleanup := fSys.RemoveAll(newDir.String()); errCleanup != nil {
|
||||||
|
log.Printf("%s", errors.WrapPrefixf(errCleanup, "unable to clean localize destination").Error())
|
||||||
|
}
|
||||||
|
return "", errors.WrapPrefixf(err, "unable to establish localize destination")
|
||||||
|
}
|
||||||
|
|
||||||
|
return newDir, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultNewDir calculates the default localize destination directory name from targetLdr at the localize target
|
||||||
|
// and spec of target, which is nil if target is local
|
||||||
|
func defaultNewDir(targetLdr ifc.Loader, spec *git.RepoSpec) string {
|
||||||
|
targetDir := filepath.Base(targetLdr.Root())
|
||||||
|
if repo, isRemote := targetLdr.Repo(); isRemote {
|
||||||
|
// kustomize doesn't download repo into repo-named folder
|
||||||
|
// must find repo folder name from url
|
||||||
|
if repo == targetLdr.Root() {
|
||||||
|
targetDir = urlBase(spec.OrgRepo)
|
||||||
|
}
|
||||||
|
return strings.Join([]string{dstPrefix, targetDir, strings.ReplaceAll(spec.Ref, "/", "-")}, "-")
|
||||||
|
}
|
||||||
|
// special case for local target directory since destination directory cannot have "/" in name
|
||||||
|
if targetDir == string(filepath.Separator) {
|
||||||
|
return dstPrefix
|
||||||
|
}
|
||||||
|
return strings.Join([]string{dstPrefix, targetDir}, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
// urlBase is the url equivalent of filepath.Base
|
||||||
|
func urlBase(url string) string {
|
||||||
|
cleaned := strings.TrimRight(url, "/")
|
||||||
|
i := strings.LastIndex(cleaned, "/")
|
||||||
|
if i < 0 {
|
||||||
|
return cleaned
|
||||||
|
}
|
||||||
|
return cleaned[i+1:]
|
||||||
|
}
|
||||||
18
api/internal/localizer/util_test.go
Normal file
18
api/internal/localizer/util_test.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// Copyright 2022 The Kubernetes Authors.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package localizer //nolint:testpackage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestUrlBase(t *testing.T) {
|
||||||
|
require.Equal(t, "repo", urlBase("https://github.com/org/repo"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUrlBaseTrailingSlash(t *testing.T) {
|
||||||
|
require.Equal(t, "repo", urlBase("github.com/org/repo//"))
|
||||||
|
}
|
||||||
@@ -18,6 +18,13 @@ import (
|
|||||||
"sigs.k8s.io/kustomize/kyaml/filesys"
|
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// HasRemoteFileScheme returns whether path has a url scheme that kustomize allows for
|
||||||
|
// remote files. See https://github.com/kubernetes-sigs/kustomize/blob/master/examples/remoteBuild.md
|
||||||
|
func HasRemoteFileScheme(path string) bool {
|
||||||
|
u, err := url.Parse(path)
|
||||||
|
return err == nil && (u.Scheme == "http" || u.Scheme == "https")
|
||||||
|
}
|
||||||
|
|
||||||
// fileLoader is a kustomization's interface to files.
|
// fileLoader is a kustomization's interface to files.
|
||||||
//
|
//
|
||||||
// The directory in which a kustomization file sits
|
// The directory in which a kustomization file sits
|
||||||
@@ -114,6 +121,15 @@ func NewFileLoaderAtRoot(fSys filesys.FileSystem) *fileLoader {
|
|||||||
RestrictionRootOnly, fSys, filesys.Separator)
|
RestrictionRootOnly, fSys, filesys.Separator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Repo returns the absolute path to the repo that contains Root and true
|
||||||
|
// if this fileLoader was created from a url; otherwise, the empty string and false
|
||||||
|
func (fl *fileLoader) Repo() (string, bool) {
|
||||||
|
if fl.repoSpec != nil {
|
||||||
|
return fl.repoSpec.Dir.String(), true
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
// Root returns the absolute path that is prepended to any
|
// Root returns the absolute path that is prepended to any
|
||||||
// relative paths used in Load.
|
// relative paths used in Load.
|
||||||
func (fl *fileLoader) Root() string {
|
func (fl *fileLoader) Root() string {
|
||||||
@@ -283,6 +299,7 @@ func (fl *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error {
|
|||||||
// else an error. Relative paths are taken relative
|
// else an error. Relative paths are taken relative
|
||||||
// to the root.
|
// to the root.
|
||||||
func (fl *fileLoader) Load(path string) ([]byte, error) {
|
func (fl *fileLoader) Load(path string) ([]byte, error) {
|
||||||
|
// TODO(annasong): replace check with HasRemoteFileScheme
|
||||||
if u, err := url.Parse(path); err == nil && (u.Scheme == "http" || u.Scheme == "https") {
|
if u, err := url.Parse(path); err == nil && (u.Scheme == "http" || u.Scheme == "https") {
|
||||||
var hc *http.Client
|
var hc *http.Client
|
||||||
if fl.http != nil {
|
if fl.http != nil {
|
||||||
|
|||||||
@@ -21,6 +21,40 @@ import (
|
|||||||
"sigs.k8s.io/kustomize/kyaml/filesys"
|
"sigs.k8s.io/kustomize/kyaml/filesys"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestHasRemoteFileScheme(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
url string
|
||||||
|
valid bool
|
||||||
|
}{
|
||||||
|
"https file": {
|
||||||
|
"https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/examples/helloWorld/configMap.yaml",
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"https dir": {
|
||||||
|
"https://github.com/kubernetes-sigs/kustomize//examples/helloWorld/",
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"no scheme": {
|
||||||
|
"github.com/kubernetes-sigs/kustomize//examples/helloWorld/",
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
"ssh": {
|
||||||
|
"ssh://git@github.com/kubernetes-sigs/kustomize.git",
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"pod.yaml",
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for name, test := range cases {
|
||||||
|
test := test
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
require.Equal(t, test.valid, HasRemoteFileScheme(test.url))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type testData struct {
|
type testData struct {
|
||||||
path string
|
path string
|
||||||
expectedContent string
|
expectedContent string
|
||||||
@@ -61,6 +95,8 @@ func TestLoaderLoad(t *testing.T) {
|
|||||||
require := require.New(t)
|
require := require.New(t)
|
||||||
|
|
||||||
l1 := makeLoader()
|
l1 := makeLoader()
|
||||||
|
_, remote := l1.Repo()
|
||||||
|
require.False(remote)
|
||||||
require.Equal("/", l1.Root())
|
require.Equal("/", l1.Root())
|
||||||
|
|
||||||
for _, x := range testCases {
|
for _, x := range testCases {
|
||||||
@@ -73,6 +109,9 @@ func TestLoaderLoad(t *testing.T) {
|
|||||||
}
|
}
|
||||||
l2, err := l1.New("foo/project")
|
l2, err := l1.New("foo/project")
|
||||||
require.NoError(err)
|
require.NoError(err)
|
||||||
|
|
||||||
|
_, remote = l2.Repo()
|
||||||
|
require.False(remote)
|
||||||
require.Equal("/foo/project", l2.Root())
|
require.Equal("/foo/project", l2.Root())
|
||||||
|
|
||||||
for _, x := range testCases {
|
for _, x := range testCases {
|
||||||
@@ -322,6 +361,9 @@ whatever
|
|||||||
repoSpec, fSys, nil,
|
repoSpec, fSys, nil,
|
||||||
git.DoNothingCloner(filesys.ConfirmedDir(coRoot)))
|
git.DoNothingCloner(filesys.ConfirmedDir(coRoot)))
|
||||||
require.NoError(err)
|
require.NoError(err)
|
||||||
|
repo, remote := l.Repo()
|
||||||
|
require.True(remote)
|
||||||
|
require.Equal(coRoot, repo)
|
||||||
require.Equal(coRoot+"/"+pathInRepo, l.Root())
|
require.Equal(coRoot+"/"+pathInRepo, l.Root())
|
||||||
|
|
||||||
_, err = l.New(url)
|
_, err = l.New(url)
|
||||||
@@ -335,6 +377,10 @@ whatever
|
|||||||
url = rootURL + "/" + pathInRepo
|
url = rootURL + "/" + pathInRepo
|
||||||
l2, err := l.New(url)
|
l2, err := l.New(url)
|
||||||
require.NoError(err)
|
require.NoError(err)
|
||||||
|
|
||||||
|
repo, remote = l2.Repo()
|
||||||
|
require.True(remote)
|
||||||
|
require.Equal(coRoot, repo)
|
||||||
require.Equal(coRoot+"/"+pathInRepo, l2.Root())
|
require.Equal(coRoot+"/"+pathInRepo, l2.Root())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,6 +435,8 @@ func TestLoaderDisallowsLocalBaseFromRemoteOverlay(t *testing.T) {
|
|||||||
// This is okay.
|
// This is okay.
|
||||||
l2, err = l1.New("../base")
|
l2, err = l1.New("../base")
|
||||||
require.NoError(err)
|
require.NoError(err)
|
||||||
|
_, remote := l2.Repo()
|
||||||
|
require.False(remote)
|
||||||
require.Equal(cloneRoot+"/foo/base", l2.Root())
|
require.Equal(cloneRoot+"/foo/base", l2.Root())
|
||||||
|
|
||||||
// This is not okay.
|
// This is not okay.
|
||||||
@@ -414,6 +462,9 @@ func TestLocalLoaderReferencingGitBase(t *testing.T) {
|
|||||||
|
|
||||||
l2, err := l1.New("github.com/someOrg/someRepo/foo/base")
|
l2, err := l1.New("github.com/someOrg/someRepo/foo/base")
|
||||||
require.NoError(err)
|
require.NoError(err)
|
||||||
|
repo, remote := l2.Repo()
|
||||||
|
require.True(remote)
|
||||||
|
require.Equal(cloneRoot, repo)
|
||||||
require.Equal(cloneRoot+"/foo/base", l2.Root())
|
require.Equal(cloneRoot+"/foo/base", l2.Root())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xe1\xa4\xf2T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00go.mod.srcUT\x05\x00\x01\xe7\xc4\xd5bt\xca\xb1\x0e\xc2 \x10\x06\xe0\xb9\xf7\x14\x8c\xba\xfc\x80U\xa3\x8fC+\xe2\x85\xe2U\xae4\xd1\xa77\xc6\xc9\xc1\xf9\xfb\x8a\\\xda\x14M |'Jb<\xfc\x81\xa8\xc6G\xe3\x1a\xcd\x86\xba\xc4\xcb\xad\x0d\x18\xa5X\x9d\xaf\xbe\xb7\xa3\x0c5\x98\xd5\xc3\xc1Q\xa7\x9c\x14\xf9\xa4`\xb1\xb9\xe9\"\x85_\xd1\x86\x99\xcd\xeap\xc4\xfe\xdf\xc8\xcfP\xa6\xcf9\xa3\xff=_\xf0\xd8\xc1\xd1\x96\xe8\x1d\x00\x00\xff\xffPK\x07\x08`;Y\xf4u\x00\x00\x00\xa1\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xd1\x9d\xb4T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00 \x00main.goUT\x05\x00\x01\x1a\xf0\x87b\x94R\xc1n\xe36\x10=\x93_1\xd5\xa1\xa0\n\x87\xda\xfaT\xec\xc2\x87\xc5z\xbd]4 \x8c$\x08\n\x14=\xd0\xd2H&L\x91\xc4\x90\x8a\xe3\x16\xfe\xf7\x82\x92\xec\xd8i\x12d\xaf\xe4\x9b\xf7\xe6\xbdyE\x01_\x9c\xdf\x91n\xd6\x11\xa6\x1f\xa6S\xb8[#\xfc\xd1\xad\x90,F\x0c\xf0\xb9\x8bkGA\xf2\xa2\x80\xdb\xe5\xfc\xcf\x8bK]\xa2\x0dx\xf1\xbdB\x1bu\xad\x91>\xc2g\xaf\xca5^L\xe5\x07\x9epwk\x1d\xa0\xd6\x06a\xab\x8d\x81\x15\x82'Wb\x08X\x81\xb2\x15`\xbb\xc2\xaa\xc2\n\xa2\x03o\xbaF[\x15\x1dI\xce\xbd*7\xaaA\xa8;[nIy\x8f\x14\xa8\xe4\\\xb7\xdeQ\x04\xc1YV\xb71\xe3,s!\xe3\x9ceA7An~\x0bR\xbbb\xd3\x85\xe8Z\xfd\x0f\x16\xca\xeb\xc2\x93{\xd0\x15R\xf6&\x8a0\xb4\xca\xbf\x8d\x89;\x8f\xe1u\xc8f\xa7ZS\xd4\xb6\xa8I\xb5\xb8u\xb4\xc9x\x9eb\xb0\xceh\x1by\xf2\x02\xad\xd2V\xe4\xf0/g\x0f\x8aF\xcf0\x88\xcb/\xce\xd6\xba\xe9H\xad\x0cr\xe6\xe1\xe3\x0c\x0e\xcb\xcbk\xdc\xce\xb1V\x9d\x89s\xf4\xcb\xf1U\xe4\x9c\x0d\xb3\x0bUFG\xbb42\x92]\xe3v|\x14^~\xc3x\x83\xc1uT\xe2\xe11\xcf9\x1b\xe4\x7fG\x93\xe2=\x9f]\x9e~ \xce\x98\xd5f\x02=\xd3B\xa3\xa9\xee\x95\xd1U:\x96\xc8'p\xb6\xc3\x04\xfa\x9c\xe4\\\x87d\xa4\x1a\x98\x06oI\x95\xb3\xb1\x03\x8e\x92\xe41,y\xd8\xf0R\x87\xb8<@\x16\x9d-EJN\xd0\xc97\xfc\xf2\xf2X\x0eH\xe4(\xc5\x9b\x82\xb9R~\x92^\x9e\xac\x8d;&\x877\xfd\xff\x82\\{s\xed*\xbc5\xba\xc43\x11\xf9=b\x1br\xce\x98\xae{\x96\x9ff`\xb5\xe9\xc9\x19a\xec\xc8\xa6g\xce\xd8\x9e3V\xa9\xa8\xee\x95\xe9\xf0T\xf1\x89+\xf9\x88\xda\x8d9\xc8>C\x91\xa5\xa1,\x97\xfd\x9c\xbc\x8d\xa4m#\xde'\xc8\x19K\x88\xd9X\xa1\xb1;\xe2\xec\xa2\x13\xf8\xeb\xef\xd5.\xa28\xee\x96\xbf\x8f\xbc\xc7\xc4 \xb8M\xdf\xc1AA\x8c\xe5\xb8#eC\xed\xa8E\x1aN\x9b\x7fJ\xc0\x9egX)>a\xc4p\x85$\xfb\x92\xee\xb9p\xaf\xbc\x074\x01A\xd7\xd0\xbc\xb2\xc07\xb4H\xa9z\xff\x93?=\xf9\x0c\x9a\x03\x12\xc5\x8f\xe8\xf3\xa1;\xcfj\x00\xfd=\xaf\x92\x7fw\xd2\x97\x9c\x1f9\xac6\x9c\xeds~\xd09\xeb\xf6\xd7G,\xbb\x88\xe2\xe7c\xf7'i \xff\xf4|\xa5\xba\x8drI\xdaFc\x05\x12%~\x17\xe4\xd7G\x1d\xc5\xaf9g{\xbe\xe7\xff\x05\x00\x00\xff\xffPK\x07\x08P\xaa\x84\xd0\x8f\x02\x00\x00\xaa\x05\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xe1\xa4\xf2T`;Y\xf4u\x00\x00\x00\xa1\x00\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00go.mod.srcUT\x05\x00\x01\xe7\xc4\xd5bPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd1\x9d\xb4TP\xaa\x84\xd0\x8f\x02\x00\x00\xaa\x05\x00\x00\x07\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6\x00\x00\x00main.goUT\x05\x00\x01\x1a\xf0\x87bPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x7f\x00\x00\x00\x83\x03\x00\x00\x00\x00"
|
data := "PK\x03\x04\x14\x00\x08\x00\x08\x00H\x08\x1aU\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00go.mod.srcUT\x05\x00\x01\x98\x1b\x08ct\xca\xb1\x0e\xc2 \x10\x06\xe0\xb9\xf7\x14\x8c\xba\xfc\x80U\xa3\x8fC+\xe2\x85\xe2U\xae4\xd1\xa77\xc6\xc9\xc1\xf9\xfb\x8a\\\xda\x14M |'Jb<\xfc\x81\xa8\xc6G\xe3\x1a\xcd\x86\xba\xc4\xcb\xad\x0d\x18\xa5X\x9d\xaf\xbe\xb7\xa3\x0c5\x98\xd5\xc3\xc1Q\xa7\x9c\x14\xf9\xa4`\xb1\xb9\xe9\"\x85_\xd1\x86\x99\xcd\xeap\xc4\xfe\xdf\xc8\xcfP\xa6\xcf9\xa3\xff=_\xf0\xd8\xc1\xd1\x96\xe8\x1d\x00\x00\xff\xffPK\x07\x08`;Y\xf4u\x00\x00\x00\xa1\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00l\xab\xc2T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00 \x00main.goUT\x05\x00\x01<+\x99b\x94R\xc1n\xe36\x10=\x93_1\xd5\xa1\xa0\n\x87\xda\xfaT\xec\xc2\x87\xc5z\xbd]4 \x8c$\x08\n\x14=\xd0\xd2H&L\x91\xc4\x90\x8a\xe3\x16\xfe\xf7\x82\x92\xec\xd8i\x12d\xaf\xe4\x9b\xf7\xe6\xbdyE\x01_\x9c\xdf\x91n\xd6\x11\xa6\x1f\xa6S\xb8[#\xfc\xd1\xad\x90,F\x0c\xf0\xb9\x8bkGA\xf2\xa2\x80\xdb\xe5\xfc\xcf\x8bK]\xa2\x0dx\xf1\xbdB\x1bu\xad\x91>\xc2g\xaf\xca5^L\xe5\x07\x9epwk\x1d\xa0\xd6\x06a\xab\x8d\x81\x15\x82'Wb\x08X\x81\xb2\x15`\xbb\xc2\xaa\xc2\n\xa2\x03o\xbaF[\x15\x1dI\xce\xbd*7\xaaA\xa8;[nIy\x8f\x14\xa8\xe4\\\xb7\xdeQ\x04\xc1YV\xb71\xe3,s!\xe3\x9ceA7An~\x0bR\xbbb\xd3\x85\xe8Z\xfd\x0f\x16\xca\xeb\xc2\x93{\xd0\x15R\xf6&\x8a0\xb4\xca\xbf\x8d\x89;\x8f\xe1u\xc8f\xa7ZS\xd4\xb6\xa8I\xb5\xb8u\xb4\xc9x\x9eb\xb0\xceh\x1by\xf2\x02\xad\xd2V\xe4\xf0/g\x0f\x8aF\xcf0\x88\xcb/\xce\xd6\xba\xe9H\xad\x0cr\xe6\xe1\xe3\x0c\x0e\xcb\xcbk\xdc\xce\xb1V\x9d\x89s\xf4\xcb\xf1U\xe4\x9c\x0d\xb3\x0bUFG\xbb42\x92]\xe3v|\x14^~\xc3x\x83\xc1uT\xe2\xe11\xcf9\x1b\xe4\x7fG\x93\xe2=\x9f]\x9e~ \xce\x98\xd5f\x02=\xd3B\xa3\xa9\xee\x95\xd1U:\x96\xc8'p\xb6\xc3\x04\xfa\x9c\xe4\\\x87d\xa4\x1a\x98\x06oI\x95\xb3\xb1\x03\x8e\x92\xe41,y\xd8\xf0R\x87\xb8<@\x16\x9d-EJN\xd0\xc97\xfc\xf2\xf2X\x0eH\xe4(\xc5\x9b\x82\xb9R~\x92^\x9e\xac\x8d;&\x877\xfd\xff\x82\\{s\xed*\xbc5\xba\xc43\x11\xf9=b\x1br\xce\x98\xae{\x96\x9ff`\xb5\xe9\xc9\x19a\xec\xc8\xa6g\xce\xd8\x9e3V\xa9\xa8\xee\x95\xe9\xf0T\xf1\x89+\xf9\x88\xda\x8d9\xc8>C\x91\xa5\xa1,\x97\xfd\x9c\xbc\x8d\xa4m#\xde'\xc8\x19K\x88\xd9X\xa1\xb1;\xe2\xec\xa2\x13\xf8\xeb\xef\xd5.\xa28\xee\x96\xbf\x8f\xbc\xc7\xc4 \xb8M\xdf\xc1AA\x8c\xe5\xb8#eC\xed\xa8E\x1aN\x9b\x7fJ\xc0\x9egX)>a\xc4p\x85$\xfb\x92\xee\xb9p\xaf\xbc\x074\x01A\xd7\xd0\xbc\xb2\xc07\xb4H\xa9z\xff\x93?=\xf9\x0c\x9a\x03\x12\xc5\x8f\xe8\xf3\xa1;\xcfj\x00\xfd=\xaf\x92\x7fw\xd2\x97\x9c\x1f9\xac6\x9c\xeds~\xd09\xeb\xf6\xd7G,\xbb\x88\xe2\xe7c\xf7'i \xff\xf4|\xa5\xba\x8drI\xdaFc\x05\x12%~\x17\xe4\xd7G\x1d\xc5\xaf9g{\xbe\xe7\xff\x05\x00\x00\xff\xffPK\x07\x08P\xaa\x84\xd0\x8f\x02\x00\x00\xaa\x05\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00H\x08\x1aU`;Y\xf4u\x00\x00\x00\xa1\x00\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00go.mod.srcUT\x05\x00\x01\x98\x1b\x08cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00l\xab\xc2TP\xaa\x84\xd0\x8f\x02\x00\x00\xaa\x05\x00\x00\x07\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x81\xb6\x00\x00\x00main.goUT\x05\x00\x01<+\x99bPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x7f\x00\x00\x00\x83\x03\x00\x00\x00\x00"
|
||||||
fs.Register(data)
|
fs.Register(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,6 +102,9 @@ type fakeLoader struct {
|
|||||||
path string
|
path string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l fakeLoader) Repo() (string, bool) {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
func (l fakeLoader) Root() string {
|
func (l fakeLoader) Root() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ require (
|
|||||||
github.com/xlab/treeprint v1.1.0 // indirect
|
github.com/xlab/treeprint v1.1.0 // indirect
|
||||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -449,6 +449,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -663,8 +665,9 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk=
|
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ require (
|
|||||||
github.com/xlab/treeprint v1.1.0 // indirect
|
github.com/xlab/treeprint v1.1.0 // indirect
|
||||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -449,6 +449,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -663,8 +665,9 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk=
|
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ require (
|
|||||||
github.com/xlab/treeprint v1.1.0 // indirect
|
github.com/xlab/treeprint v1.1.0 // indirect
|
||||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -449,6 +449,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -663,8 +665,9 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk=
|
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ require (
|
|||||||
github.com/xlab/treeprint v1.1.0 // indirect
|
github.com/xlab/treeprint v1.1.0 // indirect
|
||||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -449,6 +449,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -663,8 +665,9 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk=
|
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ require (
|
|||||||
github.com/xlab/treeprint v1.1.0 // indirect
|
github.com/xlab/treeprint v1.1.0 // indirect
|
||||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|||||||
@@ -449,6 +449,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -663,8 +665,9 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
|||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag=
|
||||||
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk=
|
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
|
||||||
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
Reference in New Issue
Block a user