github.com/GoogleContainerTools/kpt@v1.0.0-beta.50.0.20240520170205-c25345ffcbee/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 }