veyron/lib/modules: make the Start method take an env parameter and delete StartWithEnv.

Change-Id: Iecb9d3b0de653138ce4edcbadaeb828c86790a98
diff --git a/lib/modules/core/core_test.go b/lib/modules/core/core_test.go
index c108b72..19ee38b 100644
--- a/lib/modules/core/core_test.go
+++ b/lib/modules/core/core_test.go
@@ -21,10 +21,10 @@
 )
 
 func TestCommands(t *testing.T) {
-	shell := core.NewShell()
-	defer shell.Cleanup(nil, os.Stderr)
+	sh := core.NewShell()
+	defer sh.Cleanup(nil, os.Stderr)
 	for _, c := range []string{core.RootMTCommand, core.MTCommand} {
-		if len(shell.Help(c)) == 0 {
+		if len(sh.Help(c)) == 0 {
 			t.Fatalf("missing command %q", c)
 		}
 	}
@@ -53,9 +53,9 @@
 }
 
 func TestRoot(t *testing.T) {
-	shell, fn := newShell()
+	sh, fn := newShell()
 	defer fn()
-	root, err := shell.Start(core.RootMTCommand, testArgs()...)
+	root, err := sh.Start(core.RootMTCommand, nil, testArgs()...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -68,7 +68,7 @@
 
 func startMountTables(t *testing.T, sh *modules.Shell, mountPoints ...string) (map[string]string, func(), error) {
 	// Start root mount table
-	root, err := sh.Start(core.RootMTCommand, testArgs()...)
+	root, err := sh.Start(core.RootMTCommand, nil, testArgs()...)
 	if err != nil {
 		t.Fatalf("unexpected error for root mt: %s", err)
 	}
@@ -84,7 +84,7 @@
 
 	// Start the mount tables
 	for _, mp := range mountPoints {
-		h, err := sh.Start(core.MTCommand, testArgs(mp)...)
+		h, err := sh.Start(core.MTCommand, nil, testArgs(mp)...)
 		if err != nil {
 			return nil, nil, fmt.Errorf("unexpected error for mt %q: %s", mp, err)
 		}
@@ -126,18 +126,18 @@
 }
 
 func TestMountTableAndGlob(t *testing.T) {
-	shell, fn := newShell()
+	sh, fn := newShell()
 	defer fn()
 
 	mountPoints := []string{"a", "b", "c", "d", "e"}
-	mountAddrs, fn, err := startMountTables(t, shell, mountPoints...)
+	mountAddrs, fn, err := startMountTables(t, sh, mountPoints...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
 	defer fn()
 
 	rootName := mountAddrs["root"]
-	ls, err := shell.Start(core.LSCommand, rootName+"/...")
+	ls, err := sh.Start(core.LSCommand, nil, rootName+"/...")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -167,7 +167,7 @@
 	}
 
 	// Run the ls command in a subprocess, with NAMESPACE_ROOT as set above.
-	lse, err := shell.Start(core.LSExternalCommand, "...")
+	lse, err := sh.Start(core.LSExternalCommand, nil, "...")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -198,10 +198,10 @@
 }
 
 func TestEcho(t *testing.T) {
-	shell, fn := newShell()
+	sh, fn := newShell()
 	defer fn()
 
-	srv, err := shell.Start(core.EchoServerCommand, testArgs("test", "")...)
+	srv, err := sh.Start(core.EchoServerCommand, nil, testArgs("test", "")...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -210,7 +210,7 @@
 	if len(name) == 0 {
 		t.Fatalf("failed to get name")
 	}
-	clt, err := shell.Start(core.EchoClientCommand, name, "a message")
+	clt, err := sh.Start(core.EchoClientCommand, nil, name, "a message")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -220,11 +220,11 @@
 }
 
 func TestResolve(t *testing.T) {
-	shell, fn := newShell()
+	sh, fn := newShell()
 	defer fn()
 
 	mountPoints := []string{"a", "b"}
-	mountAddrs, fn, err := startMountTables(t, shell, mountPoints...)
+	mountAddrs, fn, err := startMountTables(t, sh, mountPoints...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -232,7 +232,7 @@
 	rootName := mountAddrs["root"]
 	mtName := "b"
 	echoName := naming.Join(mtName, "echo")
-	srv, err := shell.Start(core.EchoServerCommand, testArgs("test", echoName)...)
+	srv, err := sh.Start(core.EchoServerCommand, nil, testArgs("test", echoName)...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -242,7 +242,7 @@
 	addr = naming.JoinAddressName(addr, "//")
 
 	// Resolve an object
-	resolver, err := shell.Start(core.ResolveCommand, rootName+"/"+echoName)
+	resolver, err := sh.Start(core.ResolveCommand, nil, rootName+"/"+echoName)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -259,7 +259,7 @@
 
 	// Resolve to a mount table using a rooted name.
 	addr = naming.JoinAddressName(mountAddrs[mtName], "//echo")
-	resolver, err = shell.Start(core.ResolveMTCommand, rootName+"/"+echoName)
+	resolver, err = sh.Start(core.ResolveMTCommand, nil, rootName+"/"+echoName)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -275,7 +275,7 @@
 	}
 
 	// Resolve to a mount table, but using a relative name.
-	nsroots, err := shell.Start(core.SetNamespaceRootsCommand, rootName)
+	nsroots, err := sh.Start(core.SetNamespaceRootsCommand, nil, rootName)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -283,7 +283,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 
-	resolver, err = shell.Start(core.ResolveMTCommand, echoName)
+	resolver, err = sh.Start(core.ResolveMTCommand, nil, echoName)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/lib/modules/modules_internal_test.go b/lib/modules/modules_internal_test.go
index f60b2bb..07e76bc 100644
--- a/lib/modules/modules_internal_test.go
+++ b/lib/modules/modules_internal_test.go
@@ -35,9 +35,9 @@
 	sh.AddFunction("echof", Echo, "[args]*")
 	assertNumHandles(t, sh, 0)
 
-	_, _ = sh.Start("echonotregistered") // won't start.
-	hs, _ := sh.Start("echos", "a")
-	hf, _ := sh.Start("echof", "b")
+	_, _ = sh.Start("echonotregistered", nil) // won't start.
+	hs, _ := sh.Start("echos", nil, "a")
+	hf, _ := sh.Start("echof", nil, "b")
 	assertNumHandles(t, sh, 2)
 
 	for i, h := range []Handle{hs, hf} {
@@ -47,8 +47,8 @@
 	}
 	assertNumHandles(t, sh, 0)
 
-	hs, _ = sh.Start("echos", "a", "b")
-	hf, _ = sh.Start("echof", "c")
+	hs, _ = sh.Start("echos", nil, "a", "b")
+	hf, _ = sh.Start("echof", nil, "c")
 	assertNumHandles(t, sh, 2)
 
 	sh.Cleanup(nil, nil)
diff --git a/lib/modules/modules_test.go b/lib/modules/modules_test.go
index 0c611d6..e155934 100644
--- a/lib/modules/modules_test.go
+++ b/lib/modules/modules_test.go
@@ -75,7 +75,7 @@
 }
 
 func testCommand(t *testing.T, sh *modules.Shell, name, key, val string) {
-	h, err := sh.Start(name, key)
+	h, err := sh.Start(name, nil, key)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -124,7 +124,7 @@
 	key, val := "simpleVar", "foo & bar"
 	sh.SetVar(key, val)
 	testCommand(t, sh, "envtest", key, val)
-	_, err := sh.Start("non-existent-command", "random", "args")
+	_, err := sh.Start("non-existent-command", nil, "random", "args")
 	if err == nil || err.Error() != `Shell command "non-existent-command" not registered` {
 		t.Fatalf("unexpected error %v", err)
 	}
@@ -142,7 +142,7 @@
 func TestErrorChild(t *testing.T) {
 	sh := modules.NewShell("errortest")
 	defer sh.Cleanup(nil, nil)
-	h, err := sh.Start("errortest")
+	h, err := sh.Start("errortest", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -154,7 +154,7 @@
 func testShutdown(t *testing.T, sh *modules.Shell, isfunc bool) {
 	result := ""
 	args := []string{"a", "b c", "ddd"}
-	if _, err := sh.Start("echo", args...); err != nil {
+	if _, err := sh.Start("echo", nil, args...); err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
 	var stdoutBuf bytes.Buffer
@@ -191,7 +191,7 @@
 	sh := modules.NewShell()
 	defer sh.Cleanup(nil, nil)
 	sh.AddFunction("errortest", ErrorMain, "")
-	h, err := sh.Start("errortest")
+	h, err := sh.Start("errortest", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -215,7 +215,7 @@
 	sh.SetVar("a", "1")
 	sh.SetVar("b", "2")
 	args := []string{"oh", "ah"}
-	h, err := sh.Start("printenv", args...)
+	h, err := sh.Start("printenv", nil, args...)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -265,7 +265,7 @@
 	sh.SetVar("b", "2 also wrong")
 	os.Setenv("b", "wrong, should be 2")
 
-	h, err := sh.StartWithEnv("printenv", []string{"b=2"})
+	h, err := sh.Start("printenv", []string{"b=2"})
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/lib/modules/shell.go b/lib/modules/shell.go
index cb68856..6919bd3 100644
--- a/lib/modules/shell.go
+++ b/lib/modules/shell.go
@@ -176,8 +176,13 @@
 }
 
 // Start starts the specified command, it returns a Handle which can be used
-// for interacting with that command. The Shell tracks all of the Handles
-// that it creates so that it can shut them down when asked to.
+// for interacting with that command. The OS and shell environment variables
+// are merged with the ones supplied as a parameter; the parameter specified
+// ones override the Shell and the Shell ones override the OS ones.
+//
+// The Shell tracks all of the Handles that it creates so that it can shut
+// them down when asked to.
+//
 // Commands may have already been registered with the Shell using AddFunction
 // or AddSubprocess, but if not, they will treated as subprocess commands
 // and an attempt made to run them. Such 'dynamically' started subprocess
@@ -185,13 +190,7 @@
 // message etc; their handles are remembered and will be acted on by
 // the Cleanup method. If the non-registered subprocess command does not
 // exist then the Start command will return an error.
-func (sh *Shell) Start(name string, args ...string) (Handle, error) {
-	return sh.StartWithEnv(name, nil, args...)
-}
-
-// StartWithEnv is like Start except with a set of environment variables
-// that override those in the Shell and the OS' environment.
-func (sh *Shell) StartWithEnv(name string, env []string, args ...string) (Handle, error) {
+func (sh *Shell) Start(name string, env []string, args ...string) (Handle, error) {
 	cenv := sh.MergedEnv(env)
 	cmd := sh.getCommand(name)
 	expanded := append([]string{name}, sh.expand(args...)...)
diff --git a/lib/signals/signals_test.go b/lib/signals/signals_test.go
index 636bbdb..b045ef9 100644
--- a/lib/signals/signals_test.go
+++ b/lib/signals/signals_test.go
@@ -113,7 +113,7 @@
 func newShell(t *testing.T, command string) (*modules.Shell, modules.Handle, *expect.Session) {
 	sh := modules.NewShell()
 	sh.AddSubprocess(command, "")
-	handle, err := sh.Start(command)
+	handle, err := sh.Start(command, nil)
 	if err != nil {
 		sh.Cleanup(os.Stderr, os.Stderr)
 		t.Fatalf("unexpected error: %s", err)
@@ -340,7 +340,7 @@
 	defer configServer.Stop()
 	sh.SetVar("VEYRON_CREDENTIALS", childcreds)
 	sh.SetVar(mgmt.ParentNodeManagerConfigKey, configServiceName)
-	h, err := sh.Start("handleDefaults")
+	h, err := sh.Start("handleDefaults", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index 9718c2a..8a8020f 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -29,7 +29,7 @@
 	defer b.cleanup(t)
 	sh := modules.NewShell()
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	server, err := sh.Start("runServer", "127.0.0.1:0")
+	server, err := sh.Start("runServer", nil, "127.0.0.1:0")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -64,7 +64,7 @@
 
 	// Resurrect the server with the same address, verify client
 	// re-establishes the connection.
-	server, err = sh.Start("runServer", addr)
+	server, err = sh.Start("runServer", nil, addr)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -85,7 +85,7 @@
 
 func (h *proxyHandle) Start(t *testing.T) error {
 	sh := modules.NewShell()
-	server, err := sh.Start("runProxy")
+	server, err := sh.Start("runProxy", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/ipc/stream/manager/manager_test.go b/runtimes/google/ipc/stream/manager/manager_test.go
index cd66579..873d882 100644
--- a/runtimes/google/ipc/stream/manager/manager_test.go
+++ b/runtimes/google/ipc/stream/manager/manager_test.go
@@ -438,7 +438,7 @@
 	client := InternalNew(naming.FixedRoutingID(0xcccccccc))
 	sh := modules.NewShell(".*")
 	defer sh.Cleanup(nil, nil)
-	h, err := sh.Start("runServer", "127.0.0.1:0")
+	h, err := sh.Start("runServer", nil, "127.0.0.1:0")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -459,7 +459,7 @@
 		t.Fatal("Expected client.Dial to fail since server is dead")
 	}
 
-	h, err = sh.Start("runServer", addr)
+	h, err = sh.Start("runServer", nil, addr)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/rt/mgmt_test.go b/runtimes/google/rt/mgmt_test.go
index 4b3b757..0737a1e 100644
--- a/runtimes/google/rt/mgmt_test.go
+++ b/runtimes/google/rt/mgmt_test.go
@@ -113,7 +113,7 @@
 func TestNoWaiters(t *testing.T) {
 	sh := modules.NewShell(noWaitersCmd)
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start(noWaitersCmd)
+	h, err := sh.Start(noWaitersCmd, nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -139,7 +139,7 @@
 func TestForceStop(t *testing.T) {
 	sh := modules.NewShell(forceStopCmd)
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start(forceStopCmd)
+	h, err := sh.Start(forceStopCmd, nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -291,7 +291,7 @@
 	sh := modules.NewShell(appCmd)
 	sh.SetVar("VEYRON_CREDENTIALS", childcreds)
 	sh.SetVar(mgmt.ParentNodeManagerConfigKey, configServiceName)
-	h, err := sh.Start("app")
+	h, err := sh.Start("app", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/rt/rt_test.go b/runtimes/google/rt/rt_test.go
index 8b23035..cb1832e 100644
--- a/runtimes/google/rt/rt_test.go
+++ b/runtimes/google/rt/rt_test.go
@@ -78,7 +78,7 @@
 func TestInitArgs(t *testing.T) {
 	sh := modules.NewShell("child")
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start("child", "--logtostderr=true", "--vv=3", "--", "foobar")
+	h, err := sh.Start("child", nil, "--logtostderr=true", "--vv=3", "--", "foobar")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/rt/signal_test.go b/runtimes/google/rt/signal_test.go
index 5aa1b3d..e37f883 100644
--- a/runtimes/google/rt/signal_test.go
+++ b/runtimes/google/rt/signal_test.go
@@ -47,7 +47,7 @@
 func TestWithRuntime(t *testing.T) {
 	sh := modules.NewShell("withRuntime")
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start("withRuntime")
+	h, err := sh.Start("withRuntime", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
@@ -64,7 +64,7 @@
 func TestWithoutRuntime(t *testing.T) {
 	sh := modules.NewShell("withoutRuntime")
 	defer sh.Cleanup(os.Stderr, os.Stderr)
-	h, err := sh.Start("withoutRuntime")
+	h, err := sh.Start("withoutRuntime", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/runtimes/google/security/identity_test.go b/runtimes/google/security/identity_test.go
index 315e9cd..1dae49c 100644
--- a/runtimes/google/security/identity_test.go
+++ b/runtimes/google/security/identity_test.go
@@ -352,7 +352,7 @@
 	// registers all values encoded within the same process.
 	sh := modules.NewShell(".*")
 	defer sh.Cleanup(nil, nil)
-	h, err := sh.Start("encodeUnregisteredCaveat")
+	h, err := sh.Start("encodeUnregisteredCaveat", nil)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
diff --git a/services/mgmt/node/impl/util_test.go b/services/mgmt/node/impl/util_test.go
index 8c098dc..c039bbd 100644
--- a/services/mgmt/node/impl/util_test.go
+++ b/services/mgmt/node/impl/util_test.go
@@ -39,7 +39,7 @@
 }
 
 func startRootMT(t *testing.T, sh *modules.Shell) (string, modules.Handle, *expect.Session) {
-	h, err := sh.Start(core.RootMTCommand, "--", "--veyron.tcp.address=127.0.0.1:0")
+	h, err := sh.Start(core.RootMTCommand, nil, "--", "--veyron.tcp.address=127.0.0.1:0")
 	if err != nil {
 		t.Fatalf("failed to start root mount table: %s", err)
 	}
@@ -72,10 +72,10 @@
 		vlog.VI(1).Info("---------------------------------")
 		sh.Cleanup(nil, os.Stderr)
 		mtHandle.Shutdown(nil, os.Stderr)
-		sh.Start(core.SetNamespaceRootsCommand, "")
+		sh.Start(core.SetNamespaceRootsCommand, nil, "")
 	}
 
-	if _, err := sh.Start(core.SetNamespaceRootsCommand, mtName); err != nil {
+	if _, err := sh.Start(core.SetNamespaceRootsCommand, nil, mtName); err != nil {
 		t.Fatalf("%s: unexpected error: %s", loc(1), err)
 	}
 	sh.SetVar("NAMESPACE_ROOT", mtName)
@@ -83,7 +83,7 @@
 }
 
 func runShellCommand(t *testing.T, sh *modules.Shell, env []string, cmd string, args ...string) (modules.Handle, *expect.Session) {
-	h, err := sh.StartWithEnv(cmd, env, args...)
+	h, err := sh.Start(cmd, env, args...)
 	if err != nil {
 		t.Fatalf("%s: failed to start %q: %s", loc(1), cmd, err)
 		return nil, nil
diff --git a/tools/naming/simulator/driver.go b/tools/naming/simulator/driver.go
index c6abba2..4f944ca 100644
--- a/tools/naming/simulator/driver.go
+++ b/tools/naming/simulator/driver.go
@@ -189,7 +189,7 @@
 		}
 		output(lineno, l)
 	} else {
-		handle, err := sh.Start(name, sub...)
+		handle, err := sh.Start(name, nil, sub...)
 		if err != nil {
 			return err
 		}