Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
91f20a4
fix: wip determine env and PATH
ShawkyZ Aug 6, 2025
cdf0a24
fix: rework environment fetching
rrama Aug 15, 2025
f2ff723
refactor(test): reduce usage of `CurrentConfig()`
rrama Aug 15, 2025
75187ff
fix: inject binary search paths
rrama Aug 18, 2025
9d8042f
fix(test): lsWorkflow test checks new config
rrama Aug 19, 2025
a281399
fix: remove env snapshotting
rrama Aug 19, 2025
f18e921
tmp: use GAF branch fix/IDE-1314_better-env
rrama Aug 19, 2025
938d80d
fix: change where wait on default env being ready
rrama Aug 19, 2025
fb047b0
fix(test): proper config setup for main_test
rrama Aug 19, 2025
957cdcc
fix(test): skip env loading when binary searching
rrama Aug 19, 2025
9aa032e
fix(test): use empty binary search paths
rrama Aug 19, 2025
b88d25a
fix(test): CLI test to work on Windows
rrama Aug 19, 2025
ca2e047
refactor(test): fake CLI not use `CurrentConfig()`
rrama Aug 18, 2025
8c82706
refactor(test): reduce usage of `CurrentConfig()`
rrama Aug 18, 2025
c42fa66
fix(test): bad merge
rrama Aug 19, 2025
38aef72
fix(test): CLI test to work on Windows
rrama Aug 19, 2025
d622b7d
Merge remote-tracking branch 'origin/main' into fix/IDE-1314_redo-env
rrama Aug 19, 2025
2714f52
tmp: use GAF branch fix/IDE-1314_better-env
rrama Aug 19, 2025
555ea2e
fix: defer close wait for env channel
rrama Aug 19, 2025
f578460
chore(test): move wait for env test
rrama Aug 20, 2025
0df229b
chore(test): unify CLI tests
rrama Aug 20, 2025
3820733
chore: use new GAF env read funcs
rrama Aug 21, 2025
f279d05
fix: race condition with settings path
rrama Aug 21, 2025
5b8fc83
style: use English (simplified)
rrama Aug 21, 2025
f1e0287
fix: settings Path passes ctx waiting for env
rrama Aug 22, 2025
640d7e2
fix: ensure user setting Path is prepended
rrama Aug 22, 2025
bcf26ff
fix: no need to wait in initial settings.Path
rrama Aug 22, 2025
21bba86
Merge remote-tracking branch 'origin/main' into fix/IDE-1314_redo-env
rrama Aug 22, 2025
d1a50da
chore: use latest GAF
rrama Aug 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions application/config/automatic_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import (
"runtime"
"strings"

"github.com/adrg/xdg"

"github.com/snyk/go-application-framework/pkg/envvars"
)

Expand All @@ -35,7 +37,7 @@ func (c *Config) determineJavaHome() {
envvars.UpdatePath(javaHome+string(os.PathSeparator)+"bin", false)
return
}
foundPath := c.FindBinaryInDirs(getJavaBinaryName())
foundPath := c.findBinaryInDirs(getJavaBinaryName())
if foundPath == "" {
return
}
Expand Down Expand Up @@ -116,15 +118,15 @@ func (c *Config) findBinary(binaryName string) string {
if path != "" {
return path
}
foundPath := c.FindBinaryInDirs(binaryName)
foundPath := c.findBinaryInDirs(binaryName)
c.Logger().Debug().Str("method", "findBinary").Msgf("found: %s", foundPath)
return foundPath
}

func (c *Config) FindBinaryInDirs(binaryName string) (foundPath string) {
method := "FindBinaryInDirs"
func (c *Config) findBinaryInDirs(binaryName string) (foundPath string) {
method := "findBinaryInDirs"
var foundFilePaths []string
for _, dir := range c.defaultDirs {
for _, dir := range c.binarySearchPaths {
_, err := os.Stat(dir)
if err != nil {
continue
Expand All @@ -136,12 +138,33 @@ func (c *Config) FindBinaryInDirs(binaryName string) (foundPath string) {
}
return err
})
count := len(foundFilePaths)
if count > 0 {
// take newest, as the dirwalk is lexical
foundPath = foundFilePaths[count-1]
c.Logger().Debug().Str("method", method).Msgf("using '%s' in '%s'", binaryName, foundPath)
}
}
count := len(foundFilePaths)
if count > 0 {
// take newest, as the dirwalk is lexical
foundPath = foundFilePaths[count-1]
c.Logger().Debug().Str("method", method).Msgf("using '%s' in '%s'", binaryName, foundPath)
}
return foundPath
}

// getDefaultBinarySearchPaths returns the default system binary search paths based on the OS.
func getDefaultBinarySearchPaths() []string {
//goland:noinspection GoBoolExpressions
if runtime.GOOS == "windows" {
return []string{
"C:\\Program Files",
"C:\\Program Files (x86)",
}
} else {
return []string{
filepath.Join(xdg.Home, ".sdkman"),
"/usr/lib",
"/usr/java",
"/usr/local/bin",
"/opt/homebrew/bin",
"/opt",
"/Library",
}
}
}
101 changes: 59 additions & 42 deletions application/config/automatic_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,56 +19,60 @@ package config
import (
"os"
"path/filepath"
"runtime"
"strings"
"testing"

"github.com/adrg/xdg"
"github.com/rs/zerolog"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/snyk/snyk-ls/internal/testsupport"
)

func Test_updatePathWithDefaults(t *testing.T) {
t.Run("initialize path from environment", func(t *testing.T) {
t.Setenv("PATH", "ORIGINAL_PATH")
c := New()
assert.Contains(t, c.Path(), "ORIGINAL_PATH")
someOriginalPath := "some_original_path"
t.Run("initialize keeps path from environment", func(t *testing.T) {
t.Setenv("PATH", someOriginalPath)
c := New(WithBinarySearchPaths([]string{}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))
assert.Contains(t, os.Getenv("PATH"), someOriginalPath)
})

t.Run("automatically add /usr/local/bin on linux and macOS", func(t *testing.T) {
if //goland:noinspection GoBoolExpressions
runtime.GOOS == windows {
t.Skipf("only added to the path on linux and macOS, this is windows")
}
c := New()
assert.Contains(t, c.Path(), pathListSeparator+"/usr/local/bin")
testsupport.NotOnWindows(t, "only added to the path on linux and macOS")
t.Setenv("PATH", someOriginalPath)
c := New(WithBinarySearchPaths([]string{}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))
assert.Contains(t, os.Getenv("PATH"), pathListSeparator+"/usr/local/bin")
assert.Contains(t, os.Getenv("PATH"), someOriginalPath)
})

t.Run("automatically add /bin on linux and macOS", func(t *testing.T) {
if //goland:noinspection GoBoolExpressions
runtime.GOOS == windows {
t.Skipf("only added to the path on linux and macOS, this is windows")
}
c := New()
assert.Contains(t, c.Path(), pathListSeparator+"/bin")
testsupport.NotOnWindows(t, "only added to the path on linux and macOS")
t.Setenv("PATH", someOriginalPath)
c := New(WithBinarySearchPaths([]string{}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))
assert.Contains(t, os.Getenv("PATH"), pathListSeparator+"/bin")
assert.Contains(t, os.Getenv("PATH"), someOriginalPath)
})

t.Run("automatically add $HOME/bin on linux and macOS", func(t *testing.T) {
if //goland:noinspection GoBoolExpressions
runtime.GOOS == windows {
t.Skipf("only added to the path on linux and macOS, this is windows")
}
c := New()
assert.Contains(t, c.Path(), pathListSeparator+xdg.Home+"/bin")
testsupport.NotOnWindows(t, "only added to the path on linux and macOS")
t.Setenv("PATH", someOriginalPath)
c := New(WithBinarySearchPaths([]string{}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))
assert.Contains(t, os.Getenv("PATH"), pathListSeparator+xdg.Home+"/bin")
assert.Contains(t, os.Getenv("PATH"), someOriginalPath)
})

t.Run("automatically add $JAVA_HOME/bin if set", func(t *testing.T) {
javaHome := "JAVA_HOME_DUMMY"
t.Setenv("JAVA_HOME", javaHome)
New()
actual := os.Getenv("PATH")
prefix := javaHome + string(os.PathSeparator) + "bin"
assert.True(t, strings.Contains(actual, prefix), actual+" does not contain "+prefix)
t.Setenv("PATH", someOriginalPath)
c := New(WithBinarySearchPaths([]string{}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))
assert.Contains(t, os.Getenv("PATH"), filepath.Join(javaHome, "bin"))
assert.Contains(t, os.Getenv("PATH"), someOriginalPath)
})
}

Expand Down Expand Up @@ -102,18 +106,21 @@ func Test_FindBinaries(t *testing.T) {
t.Fatal(err)
}

c := New()
c.AddBinaryLocationsToPath([]string{dir})
c := New(WithBinarySearchPaths([]string{dir}))
require.NoError(t, c.WaitForDefaultEnv(t.Context()))

assert.Contains(t, os.Getenv("JAVA_HOME"), javaBaseDir)
})

t.Run("search for binary in default places", func(t *testing.T) {
t.Run("search for java binary in binary search paths", func(t *testing.T) {
t.Setenv("JAVA_HOME", "")
t.Setenv("PATH", "")

javaHome := t.TempDir()
err := os.MkdirAll(javaHome, 0770)
javaHome, err := filepath.EvalSymlinks(t.TempDir())
if err != nil {
t.Fatal(err)
}
err = os.MkdirAll(javaHome, 0770)
if err != nil {
t.Fatal(err)
}
Expand All @@ -134,19 +141,26 @@ func Test_FindBinaries(t *testing.T) {
}

nop := zerolog.Nop()
c := &Config{defaultDirs: []string{filepath.Dir(javaHome)}, logger: &nop}
c := &Config{binarySearchPaths: []string{filepath.Dir(javaHome)}, logger: &nop}

java := c.findBinary(getJavaBinaryName())
c.determineJavaHome()

assert.Equal(t, file.Name(), java)
assert.Equal(t, javaHome, os.Getenv("JAVA_HOME"))
assert.Contains(t, os.Getenv("PATH"), binDir)
})

t.Run("search for maven in path", func(t *testing.T) {
dir := t.TempDir()
t.Run("search for maven in binary search paths", func(t *testing.T) {
t.Setenv("MAVEN_HOME", "")
binDir := filepath.Join(dir, "bin")
t.Setenv("PATH", binDir)
err := os.MkdirAll(binDir, 0700)
t.Setenv("PATH", "")

dir, err := filepath.EvalSymlinks(t.TempDir())
if err != nil {
t.Fatal(err)
}

mavenBaseDir := filepath.Join(dir, "maven", "somewhere")
binDir := filepath.Join(mavenBaseDir, "bin")
err = os.MkdirAll(binDir, 0700)
if err != nil {
t.Fatal(err)
}
Expand All @@ -157,7 +171,10 @@ func Test_FindBinaries(t *testing.T) {
}
defer func(file *os.File) { _ = file.Close() }(file)

New()
nop := zerolog.Nop()
c := &Config{binarySearchPaths: []string{dir}, logger: &nop}

c.mavenDefaults()

assert.Contains(t, os.Getenv("PATH"), binDir)
})
Expand Down
1 change: 0 additions & 1 deletion application/config/client_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ func (c *Config) clientSettingsFromEnv() {
c.productEnablementFromEnv()
c.errorReportsEnablementFromEnv()
c.orgFromEnv()
c.path = os.Getenv("PATH")
}

func (c *Config) orgFromEnv() {
Expand Down
Loading
Loading