From a815774e5ece79bd7d6732d9b32c8013aef1b5e8 Mon Sep 17 00:00:00 2001 From: monopole Date: Thu, 11 Feb 2021 16:25:27 -0800 Subject: [PATCH] Drop the go-getter dependence. --- api/go.mod | 1 - api/loader/fileloader.go | 48 +++++-------- api/loader/fileloader_test.go | 10 +-- api/loader/getter.go | 114 ------------------------------ api/loader/loader.go | 25 +++---- kustomize/commands/build/build.go | 53 +++++++++----- kustomize/commands/commands.go | 5 +- 7 files changed, 66 insertions(+), 190 deletions(-) delete mode 100644 api/loader/getter.go diff --git a/api/go.mod b/api/go.mod index 64c3972e9..0427f8663 100644 --- a/api/go.mod +++ b/api/go.mod @@ -12,7 +12,6 @@ require ( github.com/imdario/mergo v0.3.5 github.com/pkg/errors v0.8.1 github.com/stretchr/testify v1.4.0 - github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e gopkg.in/yaml.v2 v2.3.0 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c diff --git a/api/loader/fileloader.go b/api/loader/fileloader.go index 2d8e126da..9e8412de4 100644 --- a/api/loader/fileloader.go +++ b/api/loader/fileloader.go @@ -95,13 +95,6 @@ type fileLoader struct { // Used to clone repositories. cloner git.Cloner - // If this is non-nil, the files were - // obtained from the given resource - rscSpec *remoteTargetSpec - - // Used to get resources - getter remoteTargetGetter - // Used to clean up, as needed. cleaner func() error } @@ -134,21 +127,20 @@ func newLoaderOrDie( log.Fatalf("unable to make loader at '%s'; %v", path, err) } return newLoaderAtConfirmedDir( - lr, root, fSys, nil, git.ClonerUsingGitExec, getRemoteTarget) + lr, root, fSys, nil, git.ClonerUsingGitExec) } // newLoaderAtConfirmedDir returns a new fileLoader with given root. func newLoaderAtConfirmedDir( lr LoadRestrictorFunc, root filesys.ConfirmedDir, fSys filesys.FileSystem, - referrer *fileLoader, cloner git.Cloner, getter remoteTargetGetter) *fileLoader { + referrer *fileLoader, cloner git.Cloner) *fileLoader { return &fileLoader{ loadRestrictor: lr, root: root, referrer: referrer, fSys: fSys, cloner: cloner, - getter: getter, cleaner: func() error { return nil }, } } @@ -179,45 +171,38 @@ func (fl *fileLoader) New(path string) (ifc.Loader, error) { return nil, fmt.Errorf("new root cannot be empty") } - ldr, errGet := newLoaderAtGetter(path, fl.fSys, nil, fl.cloner, fl.getter) - if errGet == nil { - return ldr, nil - } - - repoSpec, errGit := git.NewRepoSpecFromUrl(path) - if errGit == nil { + repoSpec, err := git.NewRepoSpecFromUrl(path) + if err == nil { // Treat this as git repo clone request. - if errGit := fl.errIfRepoCycle(repoSpec); errGit != nil { - return nil, errGit + if err = fl.errIfRepoCycle(repoSpec); err != nil { + return nil, err } return newLoaderAtGitClone( - repoSpec, fl.fSys, fl, fl.cloner, fl.getter) + repoSpec, fl.fSys, fl, fl.cloner) } if filepath.IsAbs(path) { return nil, fmt.Errorf("new root '%s' cannot be absolute", path) } - root, errDir := demandDirectoryRoot(fl.fSys, fl.root.Join(path)) - if errDir != nil { - return nil, fmt.Errorf( - "error loading %s with git: %v, dir: %v, get: %v", - path, errGit, errDir, errGet) + root, err := demandDirectoryRoot(fl.fSys, fl.root.Join(path)) + if err != nil { + return nil, err } - if errDir := fl.errIfGitContainmentViolation(root); errDir != nil { - return nil, errDir + if err = fl.errIfGitContainmentViolation(root); err != nil { + return nil, err } - if errDir := fl.errIfArgEqualOrHigher(root); errDir != nil { - return nil, errDir + if err = fl.errIfArgEqualOrHigher(root); err != nil { + return nil, err } return newLoaderAtConfirmedDir( - fl.loadRestrictor, root, fl.fSys, fl, fl.cloner, fl.getter), nil + fl.loadRestrictor, root, fl.fSys, fl, fl.cloner), nil } // newLoaderAtGitClone returns a new Loader pinned to a temporary // directory holding a cloned git repo. func newLoaderAtGitClone( repoSpec *git.RepoSpec, fSys filesys.FileSystem, - referrer *fileLoader, cloner git.Cloner, getter remoteTargetGetter) (ifc.Loader, error) { + referrer *fileLoader, cloner git.Cloner) (ifc.Loader, error) { cleaner := repoSpec.Cleaner(fSys) err := cloner(repoSpec) if err != nil { @@ -247,7 +232,6 @@ func newLoaderAtGitClone( repoSpec: repoSpec, fSys: fSys, cloner: cloner, - getter: getter, cleaner: cleaner, }, nil } diff --git a/api/loader/fileloader_test.go b/api/loader/fileloader_test.go index ae3423f8d..983bb41b3 100644 --- a/api/loader/fileloader_test.go +++ b/api/loader/fileloader_test.go @@ -388,7 +388,7 @@ whatever } l, err := newLoaderAtGitClone( repoSpec, fSys, nil, - git.DoNothingCloner(filesys.ConfirmedDir(coRoot)), getNothing) + git.DoNothingCloner(filesys.ConfirmedDir(coRoot))) if err != nil { t.Fatalf("unexpected err: %v\n", err) } @@ -467,7 +467,7 @@ func TestLoaderDisallowsLocalBaseFromRemoteOverlay(t *testing.T) { } l1, err = newLoaderAtGitClone( repoSpec, fSys, nil, - git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot)), getNothing) + git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot))) if err != nil { t.Fatalf("unexpected err: %v\n", err) } @@ -506,7 +506,7 @@ func TestLocalLoaderReferencingGitBase(t *testing.T) { } l1 := newLoaderAtConfirmedDir( RestrictionRootOnly, root, fSys, nil, - git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot)), getNothing) + git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot))) if l1.Root() != topDir { t.Fatalf("unexpected root %s", l1.Root()) } @@ -532,7 +532,7 @@ func TestRepoDirectCycleDetection(t *testing.T) { } l1 := newLoaderAtConfirmedDir( RestrictionRootOnly, root, fSys, nil, - git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot)), getNothing) + git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot))) p1 := "github.com/someOrg/someRepo/foo" rs1, err := git.NewRepoSpecFromUrl(p1) if err != nil { @@ -561,7 +561,7 @@ func TestRepoIndirectCycleDetection(t *testing.T) { } l0 := newLoaderAtConfirmedDir( RestrictionRootOnly, root, fSys, nil, - git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot)), getNothing) + git.DoNothingCloner(filesys.ConfirmedDir(cloneRoot))) p1 := "github.com/someOrg/someRepo1" p2 := "github.com/someOrg/someRepo2" diff --git a/api/loader/getter.go b/api/loader/getter.go deleted file mode 100644 index 257ad4208..000000000 --- a/api/loader/getter.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2020 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package loader - -import ( - "context" - "log" - "os" - "time" - - "github.com/yujunz/go-getter" - "sigs.k8s.io/kustomize/api/filesys" - "sigs.k8s.io/kustomize/api/ifc" - "sigs.k8s.io/kustomize/api/internal/git" - "sigs.k8s.io/kustomize/api/internal/utils" -) - -type remoteTargetSpec struct { - // Raw is the original resource in kustomization.yaml - Raw string - - // Dir is where the resource is saved - Dir filesys.ConfirmedDir - - // TempDir is the directory created to hold all resources, including Dir - TempDir filesys.ConfirmedDir -} - -// Getter is a function that can gets resource -type remoteTargetGetter func(rs *remoteTargetSpec) error - -func newLoaderAtGetter( - raw string, - fSys filesys.FileSystem, - referrer *fileLoader, - cloner git.Cloner, - getter remoteTargetGetter) (ifc.Loader, error) { - rs := &remoteTargetSpec{ - Raw: raw, - } - - cleaner := func() error { - return fSys.RemoveAll(rs.TempDir.String()) - } - - if err := getter(rs); err != nil { - cleaner() - return nil, err - } - - return &fileLoader{ - loadRestrictor: RestrictionRootOnly, - // TODO(yujunz): limit to getter root - root: rs.Dir, - referrer: referrer, - fSys: fSys, - cloner: cloner, - rscSpec: rs, - getter: getter, - cleaner: cleaner, - }, nil -} - -func getRemoteTarget(rs *remoteTargetSpec) error { - var err error - - rs.TempDir, err = filesys.NewTmpConfirmedDir() - if err != nil { - return err - } - - rs.Dir = filesys.ConfirmedDir(rs.TempDir.Join("repo")) - - // Get the pwd - pwd, err := os.Getwd() - if err != nil { - log.Fatalf("Error getting wd: %s", err) - } - - opts := []getter.ClientOption{} - client := &getter.Client{ - Ctx: context.TODO(), - Src: rs.Raw, - Dst: rs.Dir.String(), - Pwd: pwd, - Mode: getter.ClientModeAny, - Detectors: []getter.Detector{ - new(getter.GitHubDetector), - new(getter.GitLabDetector), - new(getter.GitDetector), - new(getter.BitBucketDetector), - }, - Options: opts, - } - return utils.TimedCall("go-getter client.Get", 21*time.Second, client.Get) -} - -func getNothing(rs *remoteTargetSpec) error { - var err error - rs.Dir, err = filesys.NewTmpConfirmedDir() - if err != nil { - return err - } - - // Get the pwd - pwd, err := os.Getwd() - if err != nil { - log.Fatalf("Error getting wd: %s", err) - } - - _, err = getter.Detect(rs.Raw, pwd, []getter.Detector{}) - return err -} diff --git a/api/loader/loader.go b/api/loader/loader.go index 3bbb5d4d4..c72a95965 100644 --- a/api/loader/loader.go +++ b/api/loader/loader.go @@ -5,8 +5,6 @@ package loader import ( - "fmt" - "sigs.k8s.io/kustomize/api/filesys" "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/git" @@ -21,23 +19,16 @@ import ( func NewLoader( lr LoadRestrictorFunc, target string, fSys filesys.FileSystem) (ifc.Loader, error) { - ldr, errGet := newLoaderAtGetter( - target, fSys, nil, git.ClonerUsingGitExec, getRemoteTarget) - if errGet == nil { - return ldr, nil - } - repoSpec, errGit := git.NewRepoSpecFromUrl(target) - if errGit == nil { + repoSpec, err := git.NewRepoSpecFromUrl(target) + if err == nil { // The target qualifies as a remote git target. return newLoaderAtGitClone( - repoSpec, fSys, nil, git.ClonerUsingGitExec, getRemoteTarget) + repoSpec, fSys, nil, git.ClonerUsingGitExec) } - root, errDir := demandDirectoryRoot(fSys, target) - if errDir == nil { - return newLoaderAtConfirmedDir( - lr, root, fSys, nil, git.ClonerUsingGitExec, getRemoteTarget), nil + root, err := demandDirectoryRoot(fSys, target) + if err != nil { + return nil, err } - return nil, fmt.Errorf( - "error creating new loader with git: %v, dir: %v, get: %v", - errGit, errDir, errGet) + return newLoaderAtConfirmedDir( + lr, root, fSys, nil, git.ClonerUsingGitExec), nil } diff --git a/kustomize/commands/build/build.go b/kustomize/commands/build/build.go index 99a797754..de749de70 100644 --- a/kustomize/commands/build/build.go +++ b/kustomize/commands/build/build.go @@ -4,6 +4,7 @@ package build import ( + "fmt" "io" "log" "path/filepath" @@ -36,31 +37,45 @@ func NewOptions(p, o string) *Options { } } -var examples = ` -To generate the resources specified in 'someDir/kustomization.yaml', run +type Help struct { + Use string + Short string + Long string + Example string +} - kustomize build someDir +func MakeHelp(pgmName, cmdName string) Help { + fN := konfig.DefaultKustomizationFileName() + return Help{ + Use: cmdName + " ", + Short: "Build a kustomization target from a directory or URL.", + Long: fmt.Sprintf(`Build a set of KRM resources using a '%s' file. +The argument must be a path to a directory containing +'%s', or a git repository URL with a path suffix +specifying same with respect to the repository root. +If is omitted, '.' is assumed. +`, fN, fN), + Example: fmt.Sprintf(`# Build the current working directory + %s %s -The default argument to 'build' is '.' (the current working directory). +# Build some shared configuration directory + %s %s /home/config/production -The argument can be a URL resolving to a directory -with a kustomization.yaml file, e.g. - - kustomize build \ - github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 - -The URL should be formulated as described at -https://github.com/hashicorp/go-getter#url-format -` +# Build from github + %s %s \ + https://github.com/kubernetes-sigs/kustomize.git/examples/helloWorld?ref=v1.0.6 +`, pgmName, cmdName, pgmName, cmdName, pgmName, cmdName), + } +} // NewCmdBuild creates a new build command. -func NewCmdBuild(cmdName string, out io.Writer) *cobra.Command { +func NewCmdBuild(help Help, out io.Writer) *cobra.Command { var o Options cmd := &cobra.Command{ - Use: cmdName + " {path}", - Short: "Print configuration per contents of " + - konfig.DefaultKustomizationFileName(), - Example: examples, + Use: help.Use, + Short: help.Short, + Long: help.Long, + Example: help.Example, SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { err := o.Validate(args) @@ -74,7 +89,7 @@ func NewCmdBuild(cmdName string, out io.Writer) *cobra.Command { cmd.Flags().StringVarP( &o.outputPath, "output", "o", "", - "If specified, write the build output to this path.") + "If specified, write output to this path.") cmd.Flags().BoolVar( &o.fnOptions.EnableExec, "enable-exec", false, /*do not change!*/ "enable support for exec functions -- note: exec functions run arbitrary code -- do not use for untrusted configs!!! (Alpha)") diff --git a/kustomize/commands/commands.go b/kustomize/commands/commands.go index 563c69a6c..0a75f556b 100644 --- a/kustomize/commands/commands.go +++ b/kustomize/commands/commands.go @@ -37,14 +37,15 @@ See https://sigs.k8s.io/kustomize pvd := provider.NewDefaultDepProvider() c.AddCommand( completion.NewCommand(), - build.NewCmdBuild("build", stdOut), + build.NewCmdBuild( + build.MakeHelp(konfig.ProgramName, "build"), stdOut), edit.NewCmdEdit( fSys, pvd.GetFieldValidator(), pvd.GetKunstructuredFactory()), create.NewCmdCreate(fSys, pvd.GetKunstructuredFactory()), version.NewCmdVersion(stdOut), openapi.NewCmdOpenAPI(stdOut), ) - configcobra.AddCommands(c, "kustomize") + configcobra.AddCommands(c, konfig.ProgramName) c.PersistentFlags().AddGoFlagSet(flag.CommandLine)