diff --git a/hw08_envdir_tool/env_reader.go b/hw08_envdir_tool/env_reader.go index aa0e5c6..4fadd53 100644 --- a/hw08_envdir_tool/env_reader.go +++ b/hw08_envdir_tool/env_reader.go @@ -5,7 +5,6 @@ import ( "io" "io/ioutil" "os" - "regexp" "strings" ) @@ -25,11 +24,10 @@ func ReadDir(dir string) (Environment, error) { if err != nil { return nil, err } - // TODO: Не правильно! key := file.Name() - key = strings.ReplaceAll(key, `=`, ``) - key = strings.ReplaceAll(key, `;`, ``) - e[key] = ExtractEnv(val) + if !strings.Contains(key, `=`) && !strings.Contains(key, `;`) { + e[key] = ExtractEnv(val) + } } } @@ -56,14 +54,8 @@ func ReadFile(filePath string) (string, error) { } func ExtractEnv(text string) string { - text = strings.TrimSpace(text) - r := regexp.MustCompile("\"+") - text = r.ReplaceAllString(text, "") - // Удаляем все после /000 - i := strings.IndexByte(text, 0) - if i > 0 { - text = text[:i] - } + text = strings.TrimRight(text, " ") + text = strings.Replace(text, "\x00", "\n", -1) return text } diff --git a/hw08_envdir_tool/env_reader_test.go b/hw08_envdir_tool/env_reader_test.go index 183cec3..bf08849 100644 --- a/hw08_envdir_tool/env_reader_test.go +++ b/hw08_envdir_tool/env_reader_test.go @@ -13,26 +13,41 @@ func TestReadDir(t *testing.T) { return } env, err := ReadDir("testdata/env/no") - os.RemoveAll("testdata/env/no") require.Equal(t, env, Environment{}) require.NoError(t, err) + os.RemoveAll("testdata/env/no") }) t.Run("Проверка = и ; в именах", func(t *testing.T) { - os.RemoveAll("testdata/env/no") + if err := os.RemoveAll("testdata/env/no"); err != nil { + return + } if err := os.Mkdir("testdata/env/no", os.ModePerm); err != nil { return } - if _, err := os.Create("testdata/env/no/TES=T1"); err != nil { + f1, err := os.Create("testdata/env/no/TES=T1") + if err != nil { return } - if _, err := os.Create("testdata/env/no/TES;T2"); err != nil { + f2, err := os.Create("testdata/env/no/TES;T2") + if err != nil { return } env, err := ReadDir("testdata/env/no") - os.RemoveAll("testdata/env/no") - require.Equal(t, env, Environment{"TEST1": "", "TEST2": ""}) + if err != nil { + return + } + require.Equal(t, env, Environment{}) require.NoError(t, err) + if err = f1.Close(); err != nil { + return + } + if err = f2.Close(); err != nil { + return + } + if err = os.RemoveAll("testdata/env/no"); err != nil { + return + } }) } @@ -52,22 +67,22 @@ func TestReadFile(t *testing.T) { func TestExtractEnv(t *testing.T) { t.Run("Zero escaping", func(t *testing.T) { - require.Equal(t, "zero_escape", ExtractEnv("zero_escape\x00with new line")) + require.Equal(t, "zero_escape\nwith new line", ExtractEnv("zero_escape\x00with new line")) }) t.Run("Quotes", func(t *testing.T) { - require.Equal(t, "quotes", ExtractEnv("\"quotes\"")) + require.Equal(t, `"quotes"`, ExtractEnv("\"quotes\"")) }) t.Run("Pre spacing", func(t *testing.T) { - require.Equal(t, "pre_spased", ExtractEnv(" pre_spased")) + require.Equal(t, " pre_spased", ExtractEnv(" pre_spased")) }) t.Run("Post spacing", func(t *testing.T) { - require.Equal(t, "post_spased", ExtractEnv("post_spased ")) + require.Equal(t, "post_spased", ExtractEnv("post_spased ")) }) t.Run("Multy spacing", func(t *testing.T) { - require.Equal(t, "multy spased", ExtractEnv(" multy spased ")) + require.Equal(t, " multy spased", ExtractEnv(" multy spased ")) }) } diff --git a/hw08_envdir_tool/executor.go b/hw08_envdir_tool/executor.go index a0aded9..998cb99 100644 --- a/hw08_envdir_tool/executor.go +++ b/hw08_envdir_tool/executor.go @@ -8,7 +8,17 @@ import ( func RunCmd(cmd []string, env Environment) (returnCode int) { c := exec.Command(cmd[0], cmd[1:]...) for k, v := range env { - c.Env = append(os.Environ(), k+"="+v) + _, ok := os.LookupEnv(k) + if ok { + if err := os.Unsetenv(k); err != nil { + return -1 + } + } + if v != "" { + if err := os.Setenv(k, v); err != nil { + return -1 + } + } } c.Stdout = os.Stdout c.Stderr = os.Stderr diff --git a/hw08_envdir_tool/executor_test.go b/hw08_envdir_tool/executor_test.go index 233736e..c54d629 100644 --- a/hw08_envdir_tool/executor_test.go +++ b/hw08_envdir_tool/executor_test.go @@ -11,7 +11,7 @@ func TestRunCmd(t *testing.T) { require.Equal(t, code, -1) }) t.Run("Команда выполнилась", func(t *testing.T) { - code := RunCmd([]string{"ls"}, Environment{"E1": "val1"}) + code := RunCmd([]string{"cmd"}, Environment{"E1": "val1"}) require.Equal(t, code, 0) }) } diff --git a/hw08_envdir_tool/test.sh b/hw08_envdir_tool/test.sh old mode 100755 new mode 100644