feat(language): distinct files from folders

resolves #1938
This commit is contained in:
Jan De Dobbeleer 2022-04-23 09:46:57 +02:00 committed by Jan De Dobbeleer
parent e4319b9584
commit 8dcd200e3e
4 changed files with 38 additions and 18 deletions

View file

@ -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) {

View file

@ -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",

View file

@ -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

View file

@ -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{