From cfc168a3d628d5189ab06510250541f97b9f0114 Mon Sep 17 00:00:00 2001 From: Jiacheng Date: Mon, 24 Feb 2025 22:33:28 +0800 Subject: [PATCH] fix(nushell): cannot switch version (#412) --- cmd/commands/activate.go | 12 ++---------- cmd/commands/cd.go | 3 ++- cmd/commands/env.go | 19 +++++++------------ internal/manager.go | 18 ++++++++++++++++-- internal/sdk.go | 15 +++++++++++++++ internal/shell/nushell.go | 3 +++ 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/cmd/commands/activate.go b/cmd/commands/activate.go index 3fdad40a..6f80ddc1 100644 --- a/cmd/commands/activate.go +++ b/cmd/commands/activate.go @@ -44,23 +44,15 @@ func activateCmd(ctx *cli.Context) error { manager := internal.NewSdkManager() defer manager.Close() - sdkEnvs, err := manager.FullEnvKeys() + sdkEnvs, err := manager.GlobalEnvKeys() if err != nil { return err } - envKeys := sdkEnvs.ToEnvs() - - exportEnvs := make(env.Vars) - for k, v := range envKeys.Variables { - exportEnvs[k] = v - } + exportEnvs := sdkEnvs.ToExportEnvs() _ = os.Setenv(env.HookFlag, name) exportEnvs[env.HookFlag] = &name - osPaths := env.NewPaths(env.OsPaths) - pathsStr := envKeys.Paths.Merge(osPaths).String() - exportEnvs["PATH"] = &pathsStr exportEnvs[internal.HookCurTmpPath] = &manager.PathMeta.CurTmpPath path := manager.PathMeta.ExecutablePath diff --git a/cmd/commands/cd.go b/cmd/commands/cd.go index 5e56b990..817fdb09 100644 --- a/cmd/commands/cd.go +++ b/cmd/commands/cd.go @@ -2,11 +2,12 @@ package commands import ( "fmt" + "os" + "github.com/urfave/cli/v2" "github.com/version-fox/vfox/internal" "github.com/version-fox/vfox/internal/env" "github.com/version-fox/vfox/internal/shell" - "os" ) var Cd = &cli.Command{ diff --git a/cmd/commands/env.go b/cmd/commands/env.go index fff642ca..3c0f8f0f 100644 --- a/cmd/commands/env.go +++ b/cmd/commands/env.go @@ -127,9 +127,13 @@ func envFlag(ctx *cli.Context, mode string) error { var sdkEnvs internal.SdkEnvs var err error if mode == "full" { - sdkEnvs, err = manager.FullEnvKeys() + sdkEnvs, err = manager.SessionEnvKeys(internal.SessionEnvOptions{ + WithGlobalEnv: true, + }) } else { - sdkEnvs, err = manager.AggregateEnvKeys() + sdkEnvs, err = manager.SessionEnvKeys(internal.SessionEnvOptions{ + WithGlobalEnv: false, + }) } if err != nil { @@ -140,16 +144,7 @@ func envFlag(ctx *cli.Context, mode string) error { return nil } - envKeys := sdkEnvs.ToEnvs() - - exportEnvs := make(env.Vars) - for k, v := range envKeys.Variables { - exportEnvs[k] = v - } - - osPaths := env.NewPaths(env.OsPaths) - pathsStr := envKeys.Paths.Merge(osPaths).String() - exportEnvs["PATH"] = &pathsStr + exportEnvs := sdkEnvs.ToExportEnvs() exportStr := s.Export(exportEnvs) fmt.Println(exportStr) diff --git a/internal/manager.go b/internal/manager.go index 1fb84e27..8225be54 100644 --- a/internal/manager.go +++ b/internal/manager.go @@ -70,7 +70,7 @@ type Manager struct { Config *config.Config } -func (m *Manager) FullEnvKeys() (SdkEnvs, error) { +func (m *Manager) GlobalEnvKeys() (SdkEnvs, error) { workToolVersion, err := toolset.NewToolVersion(m.PathMeta.WorkingDirectory) if err != nil { return nil, err @@ -93,7 +93,11 @@ func (m *Manager) FullEnvKeys() (SdkEnvs, error) { }, ShellLocation) } -func (m *Manager) AggregateEnvKeys() (SdkEnvs, error) { +type SessionEnvOptions struct { + WithGlobalEnv bool +} + +func (m *Manager) SessionEnvKeys(opt SessionEnvOptions) (SdkEnvs, error) { workToolVersion, err := toolset.NewToolVersion(m.PathMeta.WorkingDirectory) if err != nil { return nil, err @@ -122,6 +126,16 @@ func (m *Manager) AggregateEnvKeys() (SdkEnvs, error) { } defer flushCache.Close() + if opt.WithGlobalEnv { + homeToolVersion, err := toolset.NewToolVersion(m.PathMeta.HomePath) + if err != nil { + return nil, err + } + // Here we need to add the global environment to the beginning of the slice, + // so that the global environment has the lower priority than the current environment. + tvs = append(toolset.MultiToolVersions{homeToolVersion}, tvs...) + } + var sdkEnvs []*SdkEnv tvs.FilterTools(func(name, version string) bool { diff --git a/internal/sdk.go b/internal/sdk.go index e2d01efc..9d99eac1 100644 --- a/internal/sdk.go +++ b/internal/sdk.go @@ -64,6 +64,21 @@ func (d *SdkEnvs) ToEnvs() *env.Envs { return envs } +func (d *SdkEnvs) ToExportEnvs() env.Vars { + envKeys := d.ToEnvs() + + exportEnvs := make(env.Vars) + for k, v := range envKeys.Variables { + exportEnvs[k] = v + } + + osPaths := env.NewPaths(env.OsPaths) + pathsStr := envKeys.Paths.Merge(osPaths).String() + exportEnvs["PATH"] = &pathsStr + + return exportEnvs +} + type Sdk struct { sdkManager *Manager Plugin *LuaPlugin diff --git a/internal/shell/nushell.go b/internal/shell/nushell.go index fb3a3e9a..faa6f5d0 100644 --- a/internal/shell/nushell.go +++ b/internal/shell/nushell.go @@ -22,6 +22,9 @@ const nushellConfig = ` export-env { def --env updateVfoxEnvironment [] { let envData = (^'{{.SelfPath}}' env -s nushell --full | from json) + if ($envData | is-empty) { + return + } load-env $envData.envsToSet hide-env ...$envData.envsToUnset }