Skip to content

Commit 7bc0406

Browse files
alecthomasScott Robinson
authored andcommitted
fix: allow envars to be overriden in active environments
1 parent 5d83c83 commit 7bc0406

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

env.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ func (e *Env) Exec(l *ui.UI, pkg *manifest.Package, binary string, args []string
748748
return errors.WithStack(err)
749749
}
750750
ops := e.allEnvarOpsForPackages(runtimeDeps, pkg, installed...)
751+
ops = append(ops, e.systemEnvOverrideOps(ops)...)
751752
packageHermitBin, err := e.getPackageRuntimeEnvops(pkg)
752753
if err != nil {
753754
return errors.WithStack(err)
@@ -777,6 +778,23 @@ func (e *Env) Exec(l *ui.UI, pkg *manifest.Package, binary string, args []string
777778
return errors.Errorf("%s: could not find binary %q", pkg, binary)
778779
}
779780

781+
// systemEnvOverrideOps returns environment variables defined in the system environment that were previously overriden by Hermit
782+
func (e *Env) systemEnvOverrideOps(ops envars.Ops) envars.Ops {
783+
if activeEnv, ok := os.LookupEnv("HERMIT_ENV"); !ok || activeEnv != e.envDir {
784+
return envars.Ops{}
785+
}
786+
787+
var overrides envars.Ops
788+
for _, op := range ops {
789+
envar := op.Envar()
790+
if v, ok := os.LookupEnv(envar); ok {
791+
overrides = append(overrides, &envars.Force{Name: envar, Value: v})
792+
}
793+
}
794+
795+
return overrides
796+
}
797+
780798
func (e *Env) getPackageRuntimeEnvops(pkg *manifest.Package) (envars.Op, error) {
781799
// If the package contains a Hermit env, add that to the PATH for runtime dependencies
782800
pkgEnv, err := OpenEnv(pkg.Root, e.state, e.packageSource, nil, e.httpClient, e.scriptSums)

integration/integration_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,16 @@ func TestIntegration(t *testing.T) {
265265
assert test "$(testbin1.sh)" = "FOO=runtimefoo"
266266
assert test "$(testbin2.sh)" = "BAR=hermitbar"
267267
`},
268+
{name: "SystemEnvOverridesAlreadyAcitvatedHermitEnv",
269+
preparations: prep{fixture("testenv4"), activate(".")},
270+
script: `
271+
hermit install testbin1
272+
hermit install testbin2
273+
export FOO=systemfoo
274+
assert test "$(testbin1.sh)" = "FOO=systemfoo"
275+
export BAR=systembar
276+
assert test "$(testbin2.sh)" = "BAR=systembar"
277+
`},
268278
}
269279

270280
checkForShells(t)

0 commit comments

Comments
 (0)