pkg/tool/os: remove env manualipulate tasks

Change-Id: Ieda7d1e6b0836384ffbce9f1557ea85ca3ed0c8e
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/4943
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/testdata/script/cmd_env.txt b/cmd/cue/cmd/testdata/script/cmd_env.txt
index bfda9d4..ac4329b 100644
--- a/cmd/cue/cmd/testdata/script/cmd_env.txt
+++ b/cmd/cue/cmd/testdata/script/cmd_env.txt
@@ -1,8 +1,9 @@
+env TESTNUM=10
+env MYTEXT=World
 cue cmd env
 cmp stdout cmd_env.out
 -- cmd_env.out --
 Hello World!
-Hello someone else!
 -- task_tool.cue --
 package home
 
@@ -12,28 +13,11 @@
 )
 
 command: env: {
-	setenv1: os.Setenv & {
-        TESTNUM: 10
-        MYTEXT:  "World"
-	}
-	env1: os.Getenv & {
-        $after: setenv1
-
+	env: os.Getenv & {
         TESTNUM: *<10 | string
         MYTEXT:  string
 	}
-	print1: cli.Print & {
-		text: "Hello \(env1.MYTEXT)!"
-	}
-    setenv2: os.Clearenv & {
-        $after: print1
-    }
-    env2: os.Environ & {
-        $after: setenv2
-
-        MYTEXT: string | *"someone else"
-    }
-	print2: cli.Print & {
-		text: "Hello \(env2.MYTEXT)!"
+	print: cli.Print & {
+		text: "Hello \(env.MYTEXT)!"
 	}
 }
diff --git a/pkg/tool/exec/exec.go b/pkg/tool/exec/exec.go
index 7c93e4b..7c2db97 100644
--- a/pkg/tool/exec/exec.go
+++ b/pkg/tool/exec/exec.go
@@ -154,9 +154,14 @@
 	for iter, _ := ctx.Obj.Lookup("env").Fields(); iter.Next(); {
 		label := iter.Label()
 		v := iter.Value()
-		str, err := v.String()
-		if err != nil {
-			return nil, "", errors.Wrapf(err, v.Pos(),
+		var str string
+		switch v.Kind() {
+		case cue.StringKind:
+			str, _ = v.String()
+		case cue.IntKind, cue.FloatKind, cue.NumberKind:
+			str = fmt.Sprint(v)
+		default:
+			return nil, "", errors.Newf(v.Pos(),
 				"invalid environment variable value %q", v)
 		}
 		cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", label, str))
diff --git a/pkg/tool/os/env.go b/pkg/tool/os/env.go
index 962ec03..5065ce8 100644
--- a/pkg/tool/os/env.go
+++ b/pkg/tool/os/env.go
@@ -17,7 +17,6 @@
 //go:generate go run gen.go
 
 import (
-	"fmt"
 	"os"
 	"strings"
 
@@ -29,10 +28,8 @@
 )
 
 func init() {
-	task.Register("tool/os.Setenv", newSetenvCmd)
 	task.Register("tool/os.Getenv", newGetenvCmd)
 	task.Register("tool/os.Environ", newEnvironCmd)
-	task.Register("tool/os.Clearenv", newClearenvCmd)
 
 	// TODO:
 	// Tasks:
@@ -44,72 +41,6 @@
 	// - UserCache/Home/Config (or in os/user?)
 }
 
-type clearenvCmd struct{}
-
-func newClearenvCmd(v cue.Value) (task.Runner, error) {
-	return &clearenvCmd{}, nil
-}
-
-func (c *clearenvCmd) Run(ctx *task.Context) (res interface{}, err error) {
-	os.Clearenv()
-	return map[string]interface{}{}, nil
-}
-
-type setenvCmd struct{}
-
-func newSetenvCmd(v cue.Value) (task.Runner, error) {
-	return &setenvCmd{}, nil
-}
-
-func (c *setenvCmd) Run(ctx *task.Context) (res interface{}, err error) {
-	iter, err := ctx.Obj.Fields()
-	if err != nil {
-		return nil, err
-	}
-
-	for iter.Next() {
-		name := iter.Label()
-		if strings.HasPrefix(name, "$") {
-			continue
-		}
-
-		v, _ := iter.Value().Default()
-
-		if !v.IsConcrete() {
-			return nil, errors.Newf(v.Pos(),
-				"non-concrete environment variable %s", name)
-		}
-		switch k := v.IncompleteKind(); k {
-		case cue.ListKind, cue.StructKind:
-			return nil, errors.Newf(v.Pos(),
-				"unsupported type %s for environment variable %s", k, name)
-
-		case cue.NullKind:
-			err = os.Unsetenv(name)
-
-		case cue.BoolKind:
-			if b, _ := v.Bool(); b {
-				err = os.Setenv(name, "1")
-			} else {
-				err = os.Setenv(name, "0")
-			}
-
-		case cue.StringKind:
-			s, _ := v.String()
-			err = os.Setenv(name, s)
-
-		default:
-			err = os.Setenv(name, fmt.Sprint(v))
-		}
-
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	return map[string]interface{}{}, err
-}
-
 type getenvCmd struct{}
 
 func newGetenvCmd(v cue.Value) (task.Runner, error) {
diff --git a/pkg/tool/os/env_test.go b/pkg/tool/os/env_test.go
index 40c6161..8a6d9fb 100644
--- a/pkg/tool/os/env_test.go
+++ b/pkg/tool/os/env_test.go
@@ -30,45 +30,6 @@
 	"cuelang.org/go/internal/task"
 )
 
-func TestSetenv(t *testing.T) {
-	os.Setenv("CUEOSTESTUNSET", "SET")
-	v := parse(t, "tool/os.Setenv", `{
-		CUEOSTESTMOOD:  "yippie"
-		CUEOSTESTTRUE:  true
-		CUEOSTESTFALSE: false
-		CUEOSTESTNUM:   34K
-		CUEOSTESTUNSET: null
-	}`)
-	_, err := (*setenvCmd).Run(nil, &task.Context{Obj: v})
-	if err != nil {
-		t.Fatal(err)
-	}
-	for _, p := range [][2]string{
-		{"CUEOSTESTMOOD", "yippie"},
-		{"CUEOSTESTTRUE", "1"},
-		{"CUEOSTESTFALSE", "0"},
-		{"CUEOSTESTNUM", "34000"},
-	} {
-		got := os.Getenv(p[0])
-		if got != p[1] {
-			t.Errorf("got %v; want %v", got, p[1])
-		}
-	}
-
-	if _, ok := os.LookupEnv("CUEOSTESTUNSET"); ok {
-		t.Error("CUEOSTESTUNSET should have been unset")
-	}
-
-	v = parse(t, "tool/os.Setenv", `{
-		CUEOSTESTMOOD: string
-	}`)
-	_, err = (*setenvCmd).Run(nil, &task.Context{Obj: v})
-	if err == nil {
-		t.Fatal("expected incomplete error")
-	}
-	// XXX: ensure error is not concrete.
-}
-
 func TestGetenv(t *testing.T) {
 
 	for _, p := range [][2]string{