From ee4bdd4138c7f31f9620a57c64f820677fe49768 Mon Sep 17 00:00:00 2001 From: Sourabh Mehta Date: Wed, 19 Jun 2024 17:40:14 +0200 Subject: [PATCH] Log error msgs --- cmd/cbuild/commands/build/buildcprj.go | 26 +++++-- cmd/cbuild/commands/list/list_contexts.go | 74 +++++++++++++++----- cmd/cbuild/commands/list/list_environment.go | 37 ++++++---- cmd/cbuild/commands/list/list_toolchains.go | 69 ++++++++++++------ cmd/cbuild/commands/root.go | 11 ++- cmd/cbuild/commands/setup/setup.go | 28 ++++++-- pkg/builder/csolution/builder.go | 24 +++---- pkg/builder/csolution/builder_test.go | 13 +--- pkg/errutils/errutils.go | 5 +- pkg/utils/utils.go | 17 ++++- 10 files changed, 215 insertions(+), 89 deletions(-) diff --git a/cmd/cbuild/commands/build/buildcprj.go b/cmd/cbuild/commands/build/buildcprj.go index 3fc4388..565589a 100644 --- a/cmd/cbuild/commands/build/buildcprj.go +++ b/cmd/cbuild/commands/build/buildcprj.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Arm Limited. All rights reserved. + * Copyright (c) 2023-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ @@ -12,16 +12,24 @@ import ( "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder/cproject" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/errutils" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) func BuildCPRJ(cmd *cobra.Command, args []string) error { var inputFile string - if len(args) == 1 { + argCnt := len(args) + if argCnt == 0 { + err := errutils.New(errutils.ErrRequireArg, "cbuild buildcprj --help") + log.Error(err) + return err + } else if argCnt == 1 { inputFile = args[0] } else { + err := errutils.New(errutils.ErrInvalidCmdLineArg) + log.Error(err) _ = cmd.Help() - return errutils.New(errutils.ErrInvalidCmdLineArg) + return err } intDir, _ := cmd.Flags().GetString("intdir") @@ -62,6 +70,7 @@ func BuildCPRJ(cmd *cobra.Command, args []string) error { configs, err := utils.GetInstallConfigs() if err != nil { + log.Error(err) return err } @@ -78,7 +87,15 @@ func BuildCPRJ(cmd *cobra.Command, args []string) error { if fileExtension == expectedExtension { b = cproject.CprjBuilder{BuilderParams: params} } else { - return errutils.New(errutils.ErrInvalidFileExtension, fileExtension, expectedExtension) + err := errutils.New(errutils.ErrInvalidFileExtension, fileExtension, expectedExtension) + log.Error(err) + return err + } + + _, err = utils.FileExists(inputFile) + if err != nil { + log.Error(err) + return err } return b.Build() @@ -87,7 +104,6 @@ func BuildCPRJ(cmd *cobra.Command, args []string) error { var BuildCPRJCmd = &cobra.Command{ Use: "buildcprj .cprj [options]", Short: "Use a *.CPRJ file as build input", - Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { return BuildCPRJ(cmd, args) }, diff --git a/cmd/cbuild/commands/list/list_contexts.go b/cmd/cbuild/commands/list/list_contexts.go index cc63ac9..5768579 100644 --- a/cmd/cbuild/commands/list/list_contexts.go +++ b/cmd/cbuild/commands/list/list_contexts.go @@ -1,41 +1,77 @@ /* - * Copyright (c) 2023 Arm Limited. All rights reserved. + * Copyright (c) 2023-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ package list import ( + "path/filepath" + "strings" + "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder/csolution" + "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/errutils" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) +func listContexts(cmd *cobra.Command, args []string) error { + var inputFile string + argCnt := len(args) + if argCnt == 0 { + return errutils.New(errutils.ErrRequireArg, "cbuild list contexts --help") + } else if argCnt == 1 { + inputFile = args[0] + } else { + err := errutils.New(errutils.ErrInvalidCmdLineArg) + log.Error(err) + _ = cmd.Help() + return err + } + + fileName := filepath.Base(inputFile) + expectedExtension := ".csolution.yml" + if !strings.HasSuffix(fileName, expectedExtension) { + return errutils.New(errutils.ErrInvalidFileExtension, fileName, expectedExtension) + } + + _, err := utils.FileExists(inputFile) + if err != nil { + return err + } + + configs, err := utils.GetInstallConfigs() + if err != nil { + return err + } + + schemaCheck, _ := cmd.Flags().GetBool("schema") + filter, _ := cmd.Flags().GetString("filter") + p := csolution.CSolutionBuilder{ + BuilderParams: builder.BuilderParams{ + Runner: utils.Runner{}, + Options: builder.Options{ + Schema: schemaCheck, + Filter: filter, + }, + InputFile: args[0], + InstallConfigs: configs, + }, + } + return p.ListContexts() +} + var ListContextsCmd = &cobra.Command{ Use: "contexts .csolution.yml [options]", Short: "Print list of contexts in a csolution.yml", - Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - configs, err := utils.GetInstallConfigs() + err := listContexts(cmd, args) if err != nil { - return err - } - - schemaCheck, _ := cmd.Flags().GetBool("schema") - filter, _ := cmd.Flags().GetString("filter") - p := csolution.CSolutionBuilder{ - BuilderParams: builder.BuilderParams{ - Runner: utils.Runner{}, - Options: builder.Options{ - Schema: schemaCheck, - Filter: filter, - }, - InputFile: args[0], - InstallConfigs: configs, - }, + log.Error(err) } - return p.ListContexts() + return err }, } diff --git a/cmd/cbuild/commands/list/list_environment.go b/cmd/cbuild/commands/list/list_environment.go index 27fdad2..c51deac 100644 --- a/cmd/cbuild/commands/list/list_environment.go +++ b/cmd/cbuild/commands/list/list_environment.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Arm Limited. All rights reserved. + * Copyright (c) 2023-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ @@ -8,27 +8,40 @@ package list import ( "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder/csolution" + "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/errutils" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) +func listEnvironment(cmd *cobra.Command, args []string) error { + if len(args) != 0 { + return errutils.New(errutils.ErrAcceptNoArgs, "cbuild list environment --help") + } + + configs, err := utils.GetInstallConfigs() + if err != nil { + return err + } + + p := csolution.CSolutionBuilder{ + BuilderParams: builder.BuilderParams{ + Runner: utils.Runner{}, + InstallConfigs: configs, + }, + } + return p.ListEnvironment() +} + var ListEnvironmentCmd = &cobra.Command{ Use: "environment", Short: "Print list of environment configurations", - Args: cobra.MaximumNArgs(0), RunE: func(cmd *cobra.Command, args []string) error { - configs, err := utils.GetInstallConfigs() + err := listEnvironment(cmd, args) if err != nil { - return err - } - - p := csolution.CSolutionBuilder{ - BuilderParams: builder.BuilderParams{ - Runner: utils.Runner{}, - InstallConfigs: configs, - }, + log.Error(err) } - return p.ListEnvironment() + return err }, } diff --git a/cmd/cbuild/commands/list/list_toolchains.go b/cmd/cbuild/commands/list/list_toolchains.go index 1a95799..8749281 100644 --- a/cmd/cbuild/commands/list/list_toolchains.go +++ b/cmd/cbuild/commands/list/list_toolchains.go @@ -1,45 +1,74 @@ /* - * Copyright (c) 2023 Arm Limited. All rights reserved. + * Copyright (c) 2023-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ package list import ( + "path/filepath" + "strings" + "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder/csolution" + "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/errutils" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) -var ListToolchainsCmd = &cobra.Command{ - Use: "toolchains [.csolution.yml] [options]", - Short: "Print list of installed toolchains", - Args: cobra.MaximumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var inputFile string - if len(args) == 1 { - inputFile = args[0] +func listToolchains(cmd *cobra.Command, args []string) error { + var inputFile string + argCnt := len(args) + if argCnt == 1 { + inputFile = args[0] + + fileName := filepath.Base(inputFile) + expectedExtension := ".csolution.yml" + if !strings.HasSuffix(fileName, expectedExtension) { + return errutils.New(errutils.ErrInvalidFileExtension, fileName, expectedExtension) } - configs, err := utils.GetInstallConfigs() + _, err := utils.FileExists(inputFile) if err != nil { return err } + } else if argCnt > 1 { + err := errutils.New(errutils.ErrInvalidCmdLineArg) + log.Error(err) + _ = cmd.Help() + return err + } + + configs, err := utils.GetInstallConfigs() + if err != nil { + return err + } - verbose, _ := cmd.Flags().GetBool("verbose") + verbose, _ := cmd.Flags().GetBool("verbose") - p := csolution.CSolutionBuilder{ - BuilderParams: builder.BuilderParams{ - Runner: utils.Runner{}, - Options: builder.Options{ - Verbose: verbose, - }, - InputFile: inputFile, - InstallConfigs: configs, + p := csolution.CSolutionBuilder{ + BuilderParams: builder.BuilderParams{ + Runner: utils.Runner{}, + Options: builder.Options{ + Verbose: verbose, }, + InputFile: inputFile, + InstallConfigs: configs, + }, + } + return p.ListToolchains() +} + +var ListToolchainsCmd = &cobra.Command{ + Use: "toolchains [.csolution.yml] [options]", + Short: "Print list of installed toolchains", + RunE: func(cmd *cobra.Command, args []string) error { + err := listToolchains(cmd, args) + if err != nil { + log.Error(err) } - return p.ListToolchains() + return err }, } diff --git a/cmd/cbuild/commands/root.go b/cmd/cbuild/commands/root.go index 1d719be..5a7c4ba 100644 --- a/cmd/cbuild/commands/root.go +++ b/cmd/cbuild/commands/root.go @@ -76,11 +76,13 @@ func preConfiguration(cmd *cobra.Command, args []string) error { parentLogDir := filepath.Dir(logFile) if _, err := os.Stat(parentLogDir); os.IsNotExist(err) { if err := os.MkdirAll(parentLogDir, 0755); err != nil { + log.Error(err) return err } } file, err := os.Create(logFile) if err != nil { + log.Error(err) return err } multiWriter := io.MultiWriter(os.Stdout, file) @@ -108,8 +110,10 @@ func NewRootCmd() *cobra.Command { if len(args) == 1 { inputFile = args[0] } else { + err := errutils.New(errutils.ErrInvalidCmdLineArg) + log.Error(err) _ = cmd.Help() - return errutils.New(errutils.ErrInvalidCmdLineArg) + return err } intDir, _ := cmd.Flags().GetString("intdir") outDir, _ := cmd.Flags().GetString("outdir") @@ -161,6 +165,7 @@ func NewRootCmd() *cobra.Command { configs, err := utils.GetInstallConfigs() if err != nil { + log.Error(err) return err } @@ -174,12 +179,14 @@ func NewRootCmd() *cobra.Command { // get builder for supported input file b, err := getBuilder(inputFile, params) if err != nil { + log.Error(err) return err } // check if input file exists _, err = utils.FileExists(inputFile) if err != nil { + log.Error(err) return err } @@ -247,6 +254,6 @@ func getBuilder(inputFile string, params builder.BuilderParams) (builder.IBuilde case strings.HasSuffix(fileName, ".cprj"): return cproject.CprjBuilder{BuilderParams: params}, nil default: - return nil, errutils.New(errutils.ErrInvalidFileExtension, fileName, ".csolution.yml & .cprj") + return nil, errutils.New(errutils.ErrInvalidFileExtension, fileName, ".csolution.yml or .cprj") } } diff --git a/cmd/cbuild/commands/setup/setup.go b/cmd/cbuild/commands/setup/setup.go index 2e959fd..22f1fd1 100644 --- a/cmd/cbuild/commands/setup/setup.go +++ b/cmd/cbuild/commands/setup/setup.go @@ -13,23 +13,39 @@ import ( "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/builder/csolution" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/errutils" "github.com/Open-CMSIS-Pack/cbuild/v2/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) -func SetUpProject(cmd *cobra.Command, args []string) error { +func setUpProject(cmd *cobra.Command, args []string) error { var inputFile string - if len(args) == 1 { + argCnt := len(args) + if argCnt == 0 { + err := errutils.New(errutils.ErrRequireArg, "cbuild setup --help") + log.Error(err) + return err + } else if argCnt == 1 { inputFile = args[0] } else { + err := errutils.New(errutils.ErrInvalidCmdLineArg) + log.Error(err) _ = cmd.Help() - return errutils.New(errutils.ErrInvalidCmdLineArg) + return err } fileName := filepath.Base(inputFile) expectedExtension := ".csolution.yml" if !strings.HasSuffix(fileName, expectedExtension) { - return errutils.New(errutils.ErrInvalidFileExtension, fileName, ".csolution.yml") + err := errutils.New(errutils.ErrInvalidFileExtension, fileName, expectedExtension) + log.Error(err) + return err + } + + _, err := utils.FileExists(inputFile) + if err != nil { + log.Error(err) + return err } logFile, _ := cmd.Flags().GetString("log") @@ -74,6 +90,7 @@ func SetUpProject(cmd *cobra.Command, args []string) error { configs, err := utils.GetInstallConfigs() if err != nil { + log.Error(err) return err } @@ -95,9 +112,8 @@ func SetUpProject(cmd *cobra.Command, args []string) error { var SetUpCmd = &cobra.Command{ Use: "setup .csolution.yml [options]", Short: "Generate project data for IDE environment", - Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - return SetUpProject(cmd, args) + return setUpProject(cmd, args) }, } diff --git a/pkg/builder/csolution/builder.go b/pkg/builder/csolution/builder.go index 4440e49..4d0dc02 100644 --- a/pkg/builder/csolution/builder.go +++ b/pkg/builder/csolution/builder.go @@ -128,10 +128,7 @@ func (b CSolutionBuilder) installMissingPacks() (err error) { func (b CSolutionBuilder) generateBuildFiles() (err error) { args := b.formulateArgs([]string{"convert"}) - cbuildSetFile, err := b.getCbuildSetFilePath() - if err != nil { - return err - } + cbuildSetFile := b.getCbuildSetFilePath() var selectedContexts []string if len(b.Options.Contexts) != 0 { @@ -292,15 +289,12 @@ func (b CSolutionBuilder) getProjectName(csolutionFile string) (projectName stri return nameTokens[0] } -func (b CSolutionBuilder) getCbuildSetFilePath() (string, error) { +// This function merely constructs the path for the cbuild-set.yml file. +// It is the caller's responsibility to verify if the file exists." +func (b CSolutionBuilder) getCbuildSetFilePath() string { projName := b.getProjectName(b.InputFile) setFilePath := utils.NormalizePath(filepath.Join(filepath.Dir(b.InputFile), projName+".cbuild-set.yml")) - - _, err := utils.FileExists(setFilePath) - if err != nil { - return "", err - } - return setFilePath, nil + return setFilePath } func (b CSolutionBuilder) getProjsBuilders(selectedContexts []string) (projBuilders []builder.IBuilderInterface, err error) { @@ -561,23 +555,27 @@ func (b CSolutionBuilder) build() (err error) { if len(b.Options.Contexts) != 0 && !b.Options.UseContextSet { allContexts, err = b.listContexts(true, true) if err != nil { + log.Error(err) return err } selectedContexts, err = utils.ResolveContexts(allContexts, b.Options.Contexts) } else { var filePath string if b.Options.UseContextSet { - filePath, err = b.getCbuildSetFilePath() + filePath = b.getCbuildSetFilePath() + _, err = utils.FileExists(filePath) } else { filePath, err = b.getIdxFilePath() } if err != nil { + log.Error(err) return err } selectedContexts, err = b.getSelectedContexts(filePath) } if err != nil { + log.Error(err) return err } @@ -587,6 +585,7 @@ func (b CSolutionBuilder) build() (err error) { // get builder for each selected context projBuilders, err := b.getProjsBuilders(selectedContexts) if err != nil { + log.Error(err) return err } @@ -594,6 +593,7 @@ func (b CSolutionBuilder) build() (err error) { if b.Options.Rebuild || b.Options.Clean { err = b.cleanContexts(projBuilders) if b.Options.Clean || err != nil { + log.Error(err) return err } } diff --git a/pkg/builder/csolution/builder_test.go b/pkg/builder/csolution/builder_test.go index 4c0f2aa..9402a97 100644 --- a/pkg/builder/csolution/builder_test.go +++ b/pkg/builder/csolution/builder_test.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Arm Limited. All rights reserved. + * Copyright (c) 2023-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ @@ -469,19 +469,10 @@ func TestGetCbuildSetFilePath(t *testing.T) { }, } - t.Run("test invalid input file", func(t *testing.T) { - b.InputFile = filepath.Join(testRoot, testDir, "TestSolution/invalid_file.yml") - - path, err := b.getCbuildSetFilePath() - assert.Error(err) - assert.Equal(path, "") - }) - t.Run("test get cbuild-set file path", func(t *testing.T) { b.InputFile = filepath.Join(testRoot, testDir, "TestSolution/test.csolution.yml") - path, err := b.getCbuildSetFilePath() - assert.Nil(err) + path := b.getCbuildSetFilePath() assert.Equal(path, utils.NormalizePath(filepath.Join(testRoot, testDir, "TestSolution/test.cbuild-set.yml"))) }) } diff --git a/pkg/errutils/errutils.go b/pkg/errutils/errutils.go index 069b737..016b5f8 100644 --- a/pkg/errutils/errutils.go +++ b/pkg/errutils/errutils.go @@ -13,7 +13,7 @@ import ( const ( ErrInvalidFileExtension = "invalid file extension: '%s'. Expected: '%s'" - ErrInvalidCmdLineArg = "multiple input files" + ErrInvalidCmdLineArg = "invalid command line argument" ErrFileNotExist = "file %s does not exist" ErrNoContextFound = "no context found to process" ErrBinaryNotFound = "%s not found %s" @@ -23,6 +23,9 @@ const ( ErrNoFilteredContextFound = "no valid context found for '%s'" ErrInvalidCommand = "invalid command '%s'. Run 'cbuild --help' for supported commands" ErrCPRJNotFound = "couldn't locate %s file" + ErrNinjaVersionNotFound = "unable to find 'ninja' version" + ErrAcceptNoArgs = "command does not accept any arguments. Run '%s' for more information about a command" + ErrRequireArg = "command requires an input file argument. Run '%s' for more information about a command" ) func New(errorFormat string, args ...any) error { diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 29eab4e..83cb652 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Arm Limited. All rights reserved. + * Copyright (c) 2022-2024 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ @@ -378,3 +378,18 @@ func FileExists(filePath string) (bool, error) { // Return error for any other issues (permission denied, etc.) return false, err } + +// Retrieves ninja version +func GetNinjaVersion() (string, error) { + versionStr, err := Runner{}.ExecuteCommand("ninja", false, "--version") + if err != nil { + return "", errutils.New(errutils.ErrBinaryNotFound, "ninja", "") + } + + re := regexp.MustCompile(`^\d+\.\d+\.\d+`) + version := re.FindString(versionStr) + if version == "" { + return "", errutils.New(errutils.ErrNinjaVersionNotFound) + } + return version, nil +}