From 8dcd200e3e2715790d369f465639a95e5771bd83 Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Sat, 23 Apr 2022 09:46:57 +0200 Subject: [PATCH] feat(language): distinct files from folders resolves #1938 --- src/environment/shell.go | 24 +++++++++++++++++------- src/segments/dart.go | 3 ++- src/segments/language.go | 26 +++++++++++++++++--------- src/segments/python.go | 3 ++- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/environment/shell.go b/src/environment/shell.go index 15b9293f..ac6ca0f2 100644 --- a/src/environment/shell.go +++ b/src/environment/shell.go @@ -356,9 +356,16 @@ func (env *ShellEnvironment) HasFiles(pattern string) bool { env.log(Error, "HasFiles", err.Error()) return false } - hasFiles := len(matches) > 0 - env.debugF("HasFiles", func() string { return strconv.FormatBool(hasFiles) }) - return hasFiles + for _, match := range matches { + f, _ := os.Stat(match) + if f.IsDir() { + continue + } + env.log(Debug, "HasFiles", "true") + return true + } + env.log(Debug, "HasFiles", "false") + return false } func (env *ShellEnvironment) HasFilesInDir(dir, pattern string) bool { @@ -397,10 +404,13 @@ func (env *ShellEnvironment) HasFileInParentDirs(pattern string, depth uint) boo func (env *ShellEnvironment) HasFolder(folder string) bool { defer env.trace(time.Now(), "HasFolder", folder) - _, err := os.Stat(folder) - hasFolder := !os.IsNotExist(err) - env.debugF("HasFolder", func() string { return strconv.FormatBool(hasFolder) }) - return hasFolder + f, err := os.Stat(folder) + if err != nil { + env.log(Debug, "HasFolder", "false") + return false + } + env.debugF("HasFolder", func() string { return strconv.FormatBool(f.IsDir()) }) + return f.IsDir() } func (env *ShellEnvironment) ResolveSymlink(path string) (string, error) { diff --git a/src/segments/dart.go b/src/segments/dart.go index 051c5c92..9767b860 100644 --- a/src/segments/dart.go +++ b/src/segments/dart.go @@ -17,7 +17,8 @@ func (d *Dart) Init(props properties.Properties, env environment.Environment) { d.language = language{ env: env, props: props, - extensions: []string{"*.dart", "pubspec.yaml", "pubspec.yml", "pubspec.lock", ".dart_tool"}, + extensions: []string{"*.dart", "pubspec.yaml", "pubspec.yml", "pubspec.lock"}, + folders: []string{".dart_tool"}, commands: []*cmd{ { executable: "dart", diff --git a/src/segments/language.go b/src/segments/language.go index f19399a2..6df2c5d2 100644 --- a/src/segments/language.go +++ b/src/segments/language.go @@ -58,6 +58,7 @@ type language struct { props properties.Properties env environment.Environment extensions []string + folders []string commands []*cmd versionURLTemplate string exitCode int @@ -89,11 +90,14 @@ const ( HomeEnabled properties.Property = "home_enabled" // LanguageExtensions the list of extensions to validate LanguageExtensions properties.Property = "extensions" + // LanguageFolders the list of folders to validate + LanguageFolders properties.Property = "folders" ) func (l *language) Enabled() bool { // override default extensions if needed l.extensions = l.props.GetStringArray(LanguageExtensions, l.extensions) + l.folders = l.props.GetStringArray(LanguageFolders, l.folders) inHomeDir := func() bool { return l.env.Pwd() == l.env.Home() } @@ -113,11 +117,11 @@ func (l *language) Enabled() bool { case DisplayModeEnvironment: enabled = l.inLanguageContext() case DisplayModeFiles: - enabled = l.hasLanguageFiles() + enabled = l.hasLanguageFiles() || l.hasLanguageFolders() case DisplayModeContext: fallthrough default: - enabled = l.hasLanguageFiles() || l.inLanguageContext() + enabled = l.hasLanguageFiles() || l.hasLanguageFolders() || l.inLanguageContext() } } if !enabled || !l.props.GetBool(properties.FetchVersion, true) { @@ -130,18 +134,22 @@ func (l *language) Enabled() bool { return enabled } -// hasLanguageFiles will return true at least one file matching the extensions is found func (l *language) hasLanguageFiles() bool { - for i, extension := range l.extensions { + for _, extension := range l.extensions { if l.env.HasFiles(extension) { - break - } - if i == len(l.extensions)-1 { - return false + return true } } + return false +} - return true +func (l *language) hasLanguageFolders() bool { + for _, folder := range l.folders { + if l.env.HasFolder(folder) { + return true + } + } + return false } // setVersion parses the version string returned by the command diff --git a/src/segments/python.go b/src/segments/python.go index 66c52ece..c59b90a5 100644 --- a/src/segments/python.go +++ b/src/segments/python.go @@ -27,7 +27,8 @@ func (p *Python) Init(props properties.Properties, env environment.Environment) p.language = language{ env: env, props: props, - extensions: []string{"*.py", "*.ipynb", "pyproject.toml", "venv.bak", "venv", ".venv"}, + extensions: []string{"*.py", "*.ipynb", "pyproject.toml", "venv.bak"}, + folders: []string{".venv", "venv", "virtualenv", "env", "venv-win", "pyenv-win"}, loadContext: p.loadContext, inContext: p.inContext, commands: []*cmd{