From 4f76e3eacf9f34150778bfd6658b01cbc954aabf Mon Sep 17 00:00:00 2001 From: David Gamero Date: Wed, 29 Jan 2025 12:34:35 -0500 Subject: [PATCH 1/2] select language when none detected --- cmd/create.go | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index c93609306..f5d708341 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -7,22 +7,22 @@ import ( "os" "strings" - "gopkg.in/yaml.v3" - - "github.com/Azure/draft/pkg/handlers" - "github.com/Azure/draft/pkg/reporeader" - "github.com/Azure/draft/pkg/reporeader/readers" "github.com/manifoldco/promptui" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "gopkg.in/yaml.v3" "github.com/Azure/draft/pkg/config" dryrunpkg "github.com/Azure/draft/pkg/dryrun" "github.com/Azure/draft/pkg/filematches" + "github.com/Azure/draft/pkg/handlers" "github.com/Azure/draft/pkg/linguist" "github.com/Azure/draft/pkg/prompts" + "github.com/Azure/draft/pkg/reporeader" + "github.com/Azure/draft/pkg/reporeader/readers" "github.com/Azure/draft/pkg/templatewriter" "github.com/Azure/draft/pkg/templatewriter/writers" + "github.com/Azure/draft/template" ) // ErrNoLanguageDetected is raised when `draft create` does not detect source @@ -37,6 +37,22 @@ const TWO_SPACES = " " const emptyDefaultFlagValue = "" const currentDirDefaultFlagValue = "." +const DOCKERFILES_DIR = "dockerfiles" + +func ListSupportedLanguages() ([]string, error) { + var supportedLanguages []string + entries, err := template.Templates.ReadDir(DOCKERFILES_DIR) + if err != nil { + return supportedLanguages, fmt.Errorf("reading supported languages from embedded fs: %w", err) + } + for _, d := range entries { + if d.IsDir() { + supportedLanguages = append(supportedLanguages, d.Name()) + } + } + return supportedLanguages, nil +} + type createCmd struct { lang string dest string @@ -152,6 +168,11 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) { hasGoMod := false var langs []*linguist.Language var err error + supportedLanguages, err := ListSupportedLanguages() + if err != nil { + log.Errorf("loading supported languages: %s", err.Error()) + } + log.Debugf("loaded supported languages: %v", supportedLanguages) if cc.createConfig.LanguageType == "" { if cc.lang != "" { cc.createConfig.LanguageType = cc.lang @@ -162,6 +183,17 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) { if err != nil { return nil, "", fmt.Errorf("there was an error detecting the language: %s", err) } + if len(langs) == 0 { + selection := &promptui.Select{ + Label: "Unable to detect a supported language, please select one:", + Items: supportedLanguages, + } + _, selectResponse, err := selection.Run() + if err != nil { + return nil, "", fmt.Errorf("manually selecting language: %w", err) + } + langs = []*linguist.Language{{Language: selectResponse}} + } for _, lang := range langs { log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color) // For now let's check here for weird stuff like go module support From 48b9aa4eb95591d7708671228a4c19e00bb12d66 Mon Sep 17 00:00:00 2001 From: David Gamero Date: Wed, 5 Feb 2025 18:00:42 -0500 Subject: [PATCH 2/2] dont export listlanguages, abstract prompt to function --- cmd/create.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index f5d708341..a947ccf1f 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -39,7 +39,7 @@ const currentDirDefaultFlagValue = "." const DOCKERFILES_DIR = "dockerfiles" -func ListSupportedLanguages() ([]string, error) { +func listSupportedLanguages() ([]string, error) { var supportedLanguages []string entries, err := template.Templates.ReadDir(DOCKERFILES_DIR) if err != nil { @@ -168,7 +168,7 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) { hasGoMod := false var langs []*linguist.Language var err error - supportedLanguages, err := ListSupportedLanguages() + supportedLanguages, err := listSupportedLanguages() if err != nil { log.Errorf("loading supported languages: %s", err.Error()) } @@ -184,15 +184,10 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) { return nil, "", fmt.Errorf("there was an error detecting the language: %s", err) } if len(langs) == 0 { - selection := &promptui.Select{ - Label: "Unable to detect a supported language, please select one:", - Items: supportedLanguages, - } - _, selectResponse, err := selection.Run() + langs, err = promptLanguageSelection(supportedLanguages) if err != nil { - return nil, "", fmt.Errorf("manually selecting language: %w", err) + return nil, "", fmt.Errorf("prompting for language: %w", err) } - langs = []*linguist.Language{{Language: selectResponse}} } for _, lang := range langs { log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color) @@ -494,3 +489,16 @@ func validateConfigInputsToPrompts(draftConfig *config.DraftConfig, provided []U return nil } + +func promptLanguageSelection(supportedLanguages []string) ([]*linguist.Language, error) { + selection := &promptui.Select{ + Label: "Unable to detect a supported language, please select one:", + Items: supportedLanguages, + } + _, selectResponse, err := selection.Run() + if err != nil { + return nil, fmt.Errorf("manually selecting language: %w", err) + } + langs := []*linguist.Language{{Language: selectResponse}} + return langs, nil +}