github.com/wmuizelaar/kpt@v0.0.0-20221018115725-bd564717b2ed/thirdparty/cmdconfig/commands/cmdtree/cmdtree.go (about)

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package cmdtree
     5  
     6  import (
     7  	"context"
     8  	"path/filepath"
     9  
    10  	"github.com/GoogleContainerTools/kpt/internal/docs/generated/pkgdocs"
    11  	"github.com/GoogleContainerTools/kpt/internal/printer"
    12  	"github.com/GoogleContainerTools/kpt/internal/util/argutil"
    13  	kptfilev1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
    14  	"github.com/GoogleContainerTools/kpt/thirdparty/cmdconfig/commands/runner"
    15  	"github.com/spf13/cobra"
    16  	"sigs.k8s.io/kustomize/kyaml/kio"
    17  	"sigs.k8s.io/kustomize/kyaml/kio/filters"
    18  )
    19  
    20  func GetTreeRunner(ctx context.Context, name string) *TreeRunner {
    21  	r := &TreeRunner{
    22  		Ctx: ctx,
    23  	}
    24  	c := &cobra.Command{
    25  		Use:     "tree [DIR]",
    26  		Short:   pkgdocs.TreeShort,
    27  		Long:    pkgdocs.TreeLong,
    28  		Example: pkgdocs.TreeExamples,
    29  		RunE:    r.runE,
    30  		Args:    cobra.MaximumNArgs(1),
    31  	}
    32  
    33  	r.Command = c
    34  	return r
    35  }
    36  
    37  func NewCommand(ctx context.Context, name string) *cobra.Command {
    38  	return GetTreeRunner(ctx, name).Command
    39  }
    40  
    41  // TreeRunner contains the run function
    42  type TreeRunner struct {
    43  	Command *cobra.Command
    44  	Ctx     context.Context
    45  }
    46  
    47  func (r *TreeRunner) runE(c *cobra.Command, args []string) error {
    48  	var input kio.Reader
    49  	var root = "."
    50  	if len(args) == 0 {
    51  		args = append(args, root)
    52  	}
    53  	root = filepath.Clean(args[0])
    54  	resolvedPath, err := argutil.ResolveSymlink(r.Ctx, args[0])
    55  	if err != nil {
    56  		return err
    57  	}
    58  	input = kio.LocalPackageReader{
    59  		PackagePath:       resolvedPath,
    60  		MatchFilesGlob:    r.getMatchFilesGlob(),
    61  		PreserveSeqIndent: true,
    62  		WrapBareSeqNode:   true,
    63  	}
    64  	fltrs := []kio.Filter{&filters.IsLocalConfig{
    65  		IncludeLocalConfig: true,
    66  	}}
    67  
    68  	return runner.HandleError(r.Ctx, kio.Pipeline{
    69  		Inputs:  []kio.Reader{input},
    70  		Filters: fltrs,
    71  		Outputs: []kio.Writer{TreeWriter{
    72  			Root:   root,
    73  			Writer: printer.FromContextOrDie(r.Ctx).OutStream(),
    74  		}},
    75  	}.Execute())
    76  }
    77  
    78  func (r *TreeRunner) getMatchFilesGlob() []string {
    79  	return append([]string{kptfilev1.KptFileName}, kio.DefaultMatch...)
    80  }