// makeSnapHookEnv returns an environment suitable for passing to // os/exec.Cmd.Env // // The returned environment contains additional SNAP_* variables that // are required when calling a meta/hook/ script and that will override // any already existing SNAP_* variables in os.Environment() func makeSnapHookEnv(snap *Snap) (env []string) { desc := struct { SnapName string SnapArch string SnapPath string Version string Revision int UdevAppName string }{ snap.Name(), arch.UbuntuArchitecture(), snap.Info().MountDir(), snap.Version(), snap.Revision(), snap.Name(), } vars := snapenv.GetBasicSnapEnvVars(desc) snapEnv := snapenv.MakeMapFromEnvList(vars) // merge regular env and new snapEnv envMap := snapenv.MakeMapFromEnvList(os.Environ()) for k, v := range snapEnv { envMap[k] = v } // force default locale envMap["LC_ALL"] = "C.UTF-8" // flatten for k, v := range envMap { env = append(env, fmt.Sprintf("%s=%s", k, v)) } return env }
func (s *SnapTestSuite) TestMakeConfigEnv(c *C) { yamlFile, err := makeInstalledMockSnap("", 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) c.Assert(snap, NotNil) os.Setenv("SNAP_NAME", "override-me") defer os.Setenv("SNAP_NAME", "") env := makeSnapHookEnv(snap) // now ensure that the environment we get back is what we want envMap := snapenv.MakeMapFromEnvList(env) // regular env is unaltered c.Assert(envMap["PATH"], Equals, os.Getenv("PATH")) // SNAP_* is overriden c.Assert(envMap["SNAP_NAME"], Equals, "hello-snap") c.Assert(envMap["SNAP_VERSION"], Equals, "1.10") c.Check(envMap["LC_ALL"], Equals, "C.UTF-8") }