github.com/SamarSidharth/kpt@v0.0.0-20231122062228-c7d747ae3ace/main.go (about)

     1  // Copyright 2019 The kpt Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  //go:generate $GOBIN/mdtogo site/reference/cli/live internal/docs/generated/livedocs --license=none --recursive=true --strategy=cmdDocs
    16  //go:generate $GOBIN/mdtogo site/reference/cli/pkg internal/docs/generated/pkgdocs --license=none --recursive=true --strategy=cmdDocs
    17  //go:generate $GOBIN/mdtogo site/reference/cli/fn internal/docs/generated/fndocs --license=none --recursive=true --strategy=cmdDocs
    18  //go:generate $GOBIN/mdtogo site/reference/cli/alpha internal/docs/generated/alphadocs --license=none --recursive=false --strategy=cmdDocs
    19  //go:generate $GOBIN/mdtogo site/reference/cli/alpha/repo internal/docs/generated/repodocs --license=none --recursive=true --strategy=cmdDocs
    20  //go:generate $GOBIN/mdtogo site/reference/cli/alpha/rpkg internal/docs/generated/rpkgdocs --license=none --recursive=true --strategy=cmdDocs
    21  //go:generate $GOBIN/mdtogo site/reference/cli/alpha/sync internal/docs/generated/syncdocs --license=none --recursive=true --strategy=cmdDocs
    22  //go:generate $GOBIN/mdtogo site/reference/cli/alpha/wasm internal/docs/generated/wasmdocs --license=none --recursive=true --strategy=cmdDocs
    23  //go:generate $GOBIN/mdtogo site/reference/cli/alpha/license internal/docs/generated/licensedocs --license=none --recursive=true --strategy=cmdDocs
    24  //go:generate $GOBIN/mdtogo site/reference/cli/README.md internal/docs/generated/overview --license=none --strategy=cmdDocs
    25  package main
    26  
    27  import (
    28  	"context"
    29  	"fmt"
    30  	"os"
    31  
    32  	"github.com/GoogleContainerTools/kpt/internal/errors"
    33  	"github.com/GoogleContainerTools/kpt/internal/errors/resolver"
    34  	"github.com/GoogleContainerTools/kpt/internal/util/cmdutil"
    35  	"github.com/GoogleContainerTools/kpt/run"
    36  	"github.com/spf13/cobra"
    37  	_ "k8s.io/client-go/plugin/pkg/client/auth"
    38  	"k8s.io/component-base/cli"
    39  	"k8s.io/klog/v2"
    40  	k8scmdutil "k8s.io/kubectl/pkg/cmd/util"
    41  )
    42  
    43  func main() {
    44  	// Handle all setup in the runMain function so os.Exit doesn't interfere
    45  	// with defer.
    46  	os.Exit(runMain())
    47  }
    48  
    49  // runMain does the initial setup in order to run kpt. The return value from
    50  // this function will be the exit code when kpt terminates.
    51  func runMain() int {
    52  	var err error
    53  
    54  	ctx := context.Background()
    55  
    56  	// Enable commandline flags for klog.
    57  	// logging will help in collecting debugging information from users
    58  	klog.InitFlags(nil)
    59  
    60  	cmd := run.GetMain(ctx)
    61  
    62  	err = cli.RunNoErrOutput(cmd)
    63  	if err != nil {
    64  		return handleErr(cmd, err)
    65  	}
    66  	return 0
    67  }
    68  
    69  // handleErr takes care of printing an error message for a given error.
    70  func handleErr(cmd *cobra.Command, err error) int {
    71  	// First attempt to see if we can resolve the error into a specific
    72  	// error message.
    73  	if re, resolved := resolver.ResolveError(err); resolved {
    74  		if re.Message != "" {
    75  			fmt.Fprintf(cmd.ErrOrStderr(), "%s \n", re.Message)
    76  		}
    77  		return re.ExitCode
    78  	}
    79  
    80  	// Then try to see if it is of type *errors.Error
    81  	var kptErr *errors.Error
    82  	if errors.As(err, &kptErr) {
    83  		unwrapped, ok := errors.UnwrapErrors(kptErr)
    84  		if ok && !cmdutil.PrintErrorStacktrace() {
    85  			fmt.Fprintf(cmd.ErrOrStderr(), "Error: %s \n", unwrapped.Error())
    86  			return 1
    87  		}
    88  		fmt.Fprintf(cmd.ErrOrStderr(), "%s \n", kptErr.Error())
    89  		return 1
    90  	}
    91  
    92  	// Finally just let the error handler for kubectl handle it. This handles
    93  	// printing of several error types used in kubectl
    94  	// TODO: See if we can handle this in kpt and get a uniform experience
    95  	// across all of kpt.
    96  	k8scmdutil.CheckErr(err)
    97  	return 1
    98  }