diff --git a/README.md b/README.md index de9fdf9..1cd2f96 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ As a program that can brick your system if something goes wrong, it's really imp Each language will be used to implement a simple command-line interface that fulfills the specification below. "Simple" means the goal is not to cover corner cases, but to prototype and make a decision based on language syntax, ergonomics, expressiveness, documentation, ecosystem, tooling and overall experience. - Iganaq Napkin Spec v0 + Iganaq Napkin Spec v0.1 A1. 'print' refers to messages for users. They MUST always be printed. A2. 'log' refers to messages for programmers. They MUST be printed only @@ -44,7 +44,7 @@ Each language will be used to implement a simple command-line interface that ful B2.1. version | -v | --version -> MUST print the version as in v0.8.0 B2.2. help | -h | --help -> MUST print '' - B2.3. os -> MUST print the contents of /etc/os-release + B2.3. os -> MUST print the OS name and MUST log contents of /etc/os-release B2.4. user -> MUST print the output of the 'whoami' command B2.5. pkg p -> MUST call the system package manager using the su_command to install and then uninstall package p. The user MUST be able to diff --git a/ocaml/TODO.md b/ocaml/TODO.md index 162cfcb..e7c683f 100644 --- a/ocaml/TODO.md +++ b/ocaml/TODO.md @@ -10,12 +10,15 @@ - [ ] Executability - [-] `true` exits with status 0 (see note 3) - [x] Add logging + - [ ] Logs only if DEBUG is set - [x] Print each command executed, not just package names - [x] Case with no packages provided - [x] Prints a message - [x] MUST NOT run any system commands - [x] Unrecognized command: exit code 1 - [x] Command `user`: print the output of `whoami` + - [x] Command `os`: print the OS name + - [x] log the contents of /etc/os-release - [ ] Refactorings - [ ] Simplify and analyze `System.File` @@ -34,3 +37,7 @@ and ensure no command is ever executed without being appended to it 3. INS v0 A3.4 "running 'true' with exit code 0" requires the user to input their password every time. This should be dropped from the spec instead + 4. INS v0.1 changes requirement B2.3 to "MUST print the OS name and MUST log + contents of /etc/os-release" in order to make the logging function testable + without user input. + diff --git a/ocaml/lib/parsers/argument.ml b/ocaml/lib/parsers/argument.ml index c849686..a70c90e 100644 --- a/ocaml/lib/parsers/argument.ml +++ b/ocaml/lib/parsers/argument.ml @@ -13,7 +13,7 @@ let interpret (past : Schema.schema) (input : string list) : Schema.schema = *) match input with | "pkg" :: tail -> System.Package.merge past tail - | "os" :: _ -> say (System.File.read "/etc/os-release") + | "os" :: _ -> say System.Os.identify | "user" :: _ -> say (System.Process.Reader.read [||] "whoami").output | "echo" :: tail -> say (String.concat " " tail) | ("version" | "-v" | "--version") :: _ -> diff --git a/ocaml/lib/system/os.ml b/ocaml/lib/system/os.ml new file mode 100644 index 0000000..0ae62f2 --- /dev/null +++ b/ocaml/lib/system/os.ml @@ -0,0 +1,10 @@ +(* the side effect could be extracted to a log list in the schema *) +let identify : string = + let os_release = String.split_on_char '\n' (File.read "/etc/os-release") in + Utilities.Log.elog (String.concat "\n" os_release); + + let os_equals = List.find (String.starts_with ~prefix:"NAME=") os_release in + match String.split_on_char '=' os_equals with + | [ _; s ] -> + String.trim @@ String.map (fun c -> if c = '"' then ' ' else c) s + | _ -> "Unknown" diff --git a/ocaml/test/cram.t b/ocaml/test/cram.t index c8af3d2..a4aeacb 100644 --- a/ocaml/test/cram.t +++ b/ocaml/test/cram.t @@ -1,5 +1,13 @@ This file tests this tori implementation against the Iganaq Napkin Spec v0 +A2. 'log' MUST print only if DEBUG is set and MUST be preceded by ' [log] ' + + $ without_debug=$(tori os 2>&1) + $ with_debug=$(DEBUG=1 tori os 2>&1) + $ test "$without_debug" != "$with_debug" + $ echo "$with_debug" | grep -Fq " [log] " + $ echo "$without_debug" | grep -Fqv " [log] " + B2.1. version | -v | --version -> MUST print the version as in v0.8.0 $ tori version @@ -22,13 +30,19 @@ B2.2. help | -h | --help -> MUST print '' $ tori --help -B2.3. os -> MUST print the contents of /etc/os-release +B2.3. os -> MUST print the os name - $ os_release=$(cat /etc/os-release) + $ os_name=$(cat /etc/os-release | grep '^NAME=' | cut -d = -f 2 | sed 's/"//g') $ tori_os=$(tori os) - $ test -n "$os_release" + $ test -n "$os_name" $ test -n "$tori_os" - $ test "$os_release" = "$tori_os" + $ test "$os_name" = "$tori_os" + +B2.3. os -> MUST log the contents of /etc/os-release + + $ tori_os=$(DEBUG=1 tori os 2>&1) + $ test -n "$tori_os" + $ echo "$tori_os" | grep -qFf /etc/os-release B2.4. user -> MUST print the output of the 'whoami' command @@ -58,3 +72,4 @@ a newline, '' and exit with status code 1 Unrecognized command: unrecognized_command [1] +