Initial commit
This commit is contained in:
0
hw08_envdir_tool/.sync
Normal file
0
hw08_envdir_tool/.sync
Normal file
48
hw08_envdir_tool/README.md
Normal file
48
hw08_envdir_tool/README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
## Домашнее задание №8 «Утилита envdir»
|
||||
|
||||
Необходимо реализовать утилиту `envdir` на Go.
|
||||
|
||||
Эта утилита позволяет запускать программы, получая переменные окружения из определенной директории:
|
||||
- если директория содержит файл с именем `S`, первой строкой которого является `T`, то
|
||||
`envdir` удаляет переменную среды с именем `S`, если таковая существует, а затем добавляет
|
||||
переменную среды с именем `S` и значением `T`;
|
||||
- имя `S` не должно содержать `=`; пробелы и табуляция в конце `T` удаляются; терминальные нули (`0x00`) заменяются на перевод строки (`\n`);
|
||||
- если файл полностью пустой (длина - 0 байт), то `envdir` удаляет переменную окружения с именем `S`.
|
||||
|
||||
---
|
||||
Пример использования:
|
||||
```bash
|
||||
$ go-envdir /path/to/env/dir command arg1 arg2
|
||||
```
|
||||
Если в директории `/path/to/env/dir` содержатся файлы:
|
||||
* `FOO` с содержимым `123`;
|
||||
* `BAR` с содержимым `value`,
|
||||
|
||||
то вызов выше эквивалентен вызову
|
||||
```bash
|
||||
$ FOO=123 BAR=value command arg1 arg2
|
||||
```
|
||||
---
|
||||
|
||||
Также необходимо, чтобы:
|
||||
* стандартные потоки ввода/вывода/ошибок пробрасывались в вызываемую программу;
|
||||
* код выхода утилиты совпадал с кодом выхода программы.
|
||||
|
||||
При необходимости можно выделять дополнительные функции / ошибки.
|
||||
|
||||
Юнит-тесты могут использовать файлы из `testdata` или создавать свои директории / файлы,
|
||||
которые **обязаны** подчищать после своего выполнения.
|
||||
|
||||
### Критерии оценки
|
||||
- Пайплайн зелёный - 4 балла
|
||||
- Добавлены юнит-тесты - до 4 баллов
|
||||
- Понятность и чистота кода - до 2 баллов
|
||||
|
||||
#### Зачёт от 7 баллов
|
||||
|
||||
### Подсказки
|
||||
- https://www.unix.com/man-page/debian/8/envdir/
|
||||
- `os.Args`
|
||||
- `ioutil.ReadDir`
|
||||
- `bytes.Replace`, `strings.TrimRight`
|
||||
- `exec.Command`
|
||||
16
hw08_envdir_tool/env_reader.go
Normal file
16
hw08_envdir_tool/env_reader.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package main
|
||||
|
||||
type Environment map[string]EnvValue
|
||||
|
||||
// EnvValue helps to distinguish between empty files and files with the first empty line.
|
||||
type EnvValue struct {
|
||||
Value string
|
||||
NeedRemove bool
|
||||
}
|
||||
|
||||
// ReadDir reads a specified directory and returns map of env variables.
|
||||
// Variables represented as files where filename is name of variable, file first line is a value.
|
||||
func ReadDir(dir string) (Environment, error) {
|
||||
// Place your code here
|
||||
return nil, nil
|
||||
}
|
||||
7
hw08_envdir_tool/env_reader_test.go
Normal file
7
hw08_envdir_tool/env_reader_test.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestReadDir(t *testing.T) {
|
||||
// Place your code here
|
||||
}
|
||||
7
hw08_envdir_tool/executor.go
Normal file
7
hw08_envdir_tool/executor.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
// RunCmd runs a command + arguments (cmd) with environment variables from env.
|
||||
func RunCmd(cmd []string, env Environment) (returnCode int) {
|
||||
// Place your code here.
|
||||
return
|
||||
}
|
||||
7
hw08_envdir_tool/executor_test.go
Normal file
7
hw08_envdir_tool/executor_test.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestRunCmd(t *testing.T) {
|
||||
// Place your code here
|
||||
}
|
||||
3
hw08_envdir_tool/go.mod
Normal file
3
hw08_envdir_tool/go.mod
Normal file
@@ -0,0 +1,3 @@
|
||||
module github.com/fixme_my_friend/hw08_envdir_tool
|
||||
|
||||
go 1.19
|
||||
5
hw08_envdir_tool/main.go
Normal file
5
hw08_envdir_tool/main.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
// Place your code here.
|
||||
}
|
||||
25
hw08_envdir_tool/test.sh
Executable file
25
hw08_envdir_tool/test.sh
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -xeuo pipefail
|
||||
|
||||
go build -o go-envdir
|
||||
|
||||
export HELLO="SHOULD_REPLACE"
|
||||
export FOO="SHOULD_REPLACE"
|
||||
export UNSET="SHOULD_REMOVE"
|
||||
export ADDED="from original env"
|
||||
export EMPTY="SHOULD_BE_EMPTY"
|
||||
|
||||
result=$(./go-envdir "$(pwd)/testdata/env" "/bin/bash" "$(pwd)/testdata/echo.sh" arg1=1 arg2=2)
|
||||
expected='HELLO is ("hello")
|
||||
BAR is (bar)
|
||||
FOO is ( foo
|
||||
with new line)
|
||||
UNSET is ()
|
||||
ADDED is (from original env)
|
||||
EMPTY is ()
|
||||
arguments are arg1=1 arg2=2'
|
||||
|
||||
[ "${result}" = "${expected}" ] || (echo -e "invalid output: ${result}" && exit 1)
|
||||
|
||||
rm -f go-envdir
|
||||
echo "PASS"
|
||||
9
hw08_envdir_tool/testdata/echo.sh
vendored
Executable file
9
hw08_envdir_tool/testdata/echo.sh
vendored
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo -e "HELLO is (${HELLO})
|
||||
BAR is (${BAR})
|
||||
FOO is (${FOO})
|
||||
UNSET is (${UNSET})
|
||||
ADDED is (${ADDED})
|
||||
EMPTY is (${EMPTY})
|
||||
arguments are $*"
|
||||
2
hw08_envdir_tool/testdata/env/BAR
vendored
Normal file
2
hw08_envdir_tool/testdata/env/BAR
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
bar
|
||||
PLEASE IGNORE SECOND LINE
|
||||
1
hw08_envdir_tool/testdata/env/EMPTY
vendored
Normal file
1
hw08_envdir_tool/testdata/env/EMPTY
vendored
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
BIN
hw08_envdir_tool/testdata/env/FOO
vendored
Normal file
BIN
hw08_envdir_tool/testdata/env/FOO
vendored
Normal file
Binary file not shown.
1
hw08_envdir_tool/testdata/env/HELLO
vendored
Normal file
1
hw08_envdir_tool/testdata/env/HELLO
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"hello"
|
||||
0
hw08_envdir_tool/testdata/env/UNSET
vendored
Normal file
0
hw08_envdir_tool/testdata/env/UNSET
vendored
Normal file
Reference in New Issue
Block a user