in cmd/create.go [167:279]
func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) {
hasGo := false
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
} else {
log.Info("--- Detecting Language ---")
langs, err = linguist.ProcessDir(cc.dest)
log.Debugf("linguist.ProcessDir(%v) result:\n\nError: %v", cc.dest, err)
if err != nil {
return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
}
if len(langs) == 0 {
if !interactive {
return nil, "", ErrNoLanguageDetected
}
langs, err = promptLanguageSelection(supportedLanguages)
if err != nil {
return nil, "", fmt.Errorf("prompting for language: %w", err)
}
}
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
hasGoMod = true
if interactive && lang.Language == "Go" {
hasGo = true
selection := &promptui.Select{
Label: "Linguist detected Go, do you use Go Modules?",
Items: []string{"yes", "no"},
}
_, selectResponse, err := selection.Run()
if err != nil {
return nil, "", err
}
hasGoMod = strings.EqualFold(selectResponse, "yes")
}
if interactive && lang.Language == "Java" {
selection := &promptui.Select{
Label: "Linguist detected Java, are you using maven or gradle?",
Items: []string{"maven", "gradle", "gradlew"},
}
_, selectResponse, err := selection.Run()
if err != nil {
return nil, "", err
}
if selectResponse == "gradle" {
lang.Language = "Gradle"
} else if selectResponse == "gradlew" {
lang.Language = "Gradlew"
}
}
}
log.Debugf("detected %d langs", len(langs))
if len(langs) == 0 {
return nil, "", ErrNoLanguageDetected
}
}
}
if cc.createConfig.LanguageType != "" {
log.Debug("using configuration language")
lowerLang := strings.ToLower(cc.createConfig.LanguageType)
langDockerfileTemplate, err := handlers.GetTemplate(fmt.Sprintf("dockerfile-%s", lowerLang), "", cc.dest, cc.templateWriter)
if err != nil {
return nil, "", err
}
if langDockerfileTemplate == nil {
return nil, "", fmt.Errorf("could not find a template for %s", cc.createConfig.LanguageType)
}
return langDockerfileTemplate, lowerLang, nil
}
for _, lang := range langs {
detectedLang := linguist.Alias(lang)
log.Infof("--> Draft detected %s (%f%%)\n", detectedLang.Language, detectedLang.Percent)
lowerLang := strings.ToLower(detectedLang.Language)
if handlers.IsValidTemplate(fmt.Sprintf("dockerfile-%s", lowerLang)) {
if lowerLang == "go" && hasGo && hasGoMod {
log.Debug("detected go and go module")
lowerLang = "gomodule"
}
langDockerfileTemplate, err := handlers.GetTemplate(fmt.Sprintf("dockerfile-%s", lowerLang), "", cc.dest, cc.templateWriter)
if err != nil {
return nil, "", err
}
if langDockerfileTemplate == nil {
return nil, "", fmt.Errorf("could not find a template for detected language %s", detectedLang.Language)
}
return langDockerfileTemplate, lowerLang, nil
}
log.Infof("--> Could not find a pack for %s. Trying to find the next likely language match...", detectedLang.Language)
}
return nil, "", ErrNoLanguageDetected
}