From 010b8bc699c5b130cbde02a3aa69834aba3dbe22 Mon Sep 17 00:00:00 2001 From: Venelin Date: Mon, 16 Dec 2024 18:22:01 +0200 Subject: [PATCH] $() removes trailing newlines from the output --- run_tests.sh | 4 ++-- src/commands.hpp | 4 ++-- src/commands.inl | 13 +++++++++++-- test/functions_test.cppipe | 33 +++++++++++++++++++-------------- todo.txt | 1 - 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/run_tests.sh b/run_tests.sh index e617fa8..34255c9 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -3,9 +3,9 @@ set -e # Test cppipe functions OKs=$(cppipe test/functions_test.cppipe 2>/dev/null | grep OK | wc -l) -if ! [ $OKs = 12 ] +if ! [ $OKs = 13 ] then - echo "Functions test failed: EXPECTED 12 OKs, got $OKs" + echo "Functions test failed: EXPECTED 13 OKs, got $OKs" exit 1 fi echo Functions test OK! diff --git a/src/commands.hpp b/src/commands.hpp index b6a4ba9..b2599ad 100644 --- a/src/commands.hpp +++ b/src/commands.hpp @@ -82,7 +82,7 @@ private: void exec(const Cmd&); /* todo: take Pending? */ /* Execute the command, like the operator() */ -DeadProc run(Cmd&); +DeadProc run(const Cmd&); /* Run commands in sequence shell: @@ -156,7 +156,7 @@ PendingCmd operator&(const PendingCmd&, const Cmd&); // operator const char*() { return c_str();} // }; -/* Execute a command and capture the output +/* Execute a command and capture the output, remove trailing newlines like the shell version shell: var=$(ls) becomes: diff --git a/src/commands.inl b/src/commands.inl index b996a22..adbc705 100644 --- a/src/commands.inl +++ b/src/commands.inl @@ -141,8 +141,17 @@ inline std::string $(const PendingCmd& cmd) while(read_count > 0); // p finished? + // Remove trailing newlines + // i is on the past the end element, go back to end + int j = i - 1; + + while(j > 0 && output[j] == '\n') + --j; + + i = j + 1; + // erase the extra elements - output.erase(i, output.size() - i); + output.erase(i, -1); // till the end close(p.out); @@ -154,7 +163,7 @@ inline void exec(const Cmd& cmd) exec_or_die(cmd.argv.data()); } -DeadProc run(const Cmd& cmd) +inline DeadProc run(const Cmd& cmd) { return cmd(); } diff --git a/test/functions_test.cppipe b/test/functions_test.cppipe index 956eb95..0245e48 100644 --- a/test/functions_test.cppipe +++ b/test/functions_test.cppipe @@ -24,16 +24,17 @@ int main(int argc, char* argv[]) string out1 = $(ll + "src" | grep + "inl" | grep + "child"); if(out1.find("childProcess.inl") != string::npos) - cout << "OK 0/11" << endl; + cout << "OK 0/12" << endl; string out2 = $(echo + "abc" + "def"); - if(auto len = out2.size(); len != 8) + // "abc def" = 7 chars, trailing newlines are stripped by $() + if(auto len = out2.size(); len != 7) { cerr << "FAILURE: unexpected output length " << len << endl; exit(1); } - Cmd success("echo", "OK 1/11"); + Cmd success("echo", "OK 1/12"); Cmd fail("mkdir", "."); Cmd unexpected("echo", "FAILURE"); success && @@ -45,30 +46,34 @@ int main(int argc, char* argv[]) // unexpected && // unexpected; - Cmd write_file("echo", "Existing ", " ", "file. OK 2/11"); + Cmd write_file("echo", "Existing ", " ", "file. OK 2/12"); write_file > "file.txt"; grep + "Existing" < "file.txt"; - echo + "Appended to file OK 3/11" >> "file.txt"; + echo + "Appended to file OK 3/12" >> "file.txt"; grep + "Appended" < "file.txt" && rm + "file.txt" && fail || - Cmd("echo", "OK 4/11"); + Cmd("echo", "OK 4/12"); - echo + "OK 5/11" && - echo + "OK 6/11", - Cmd("echo", "OK 7/11"); + echo + "OK 5/12" && + echo + "OK 6/12", + Cmd("echo", "OK 7/12"); - echo + "OK 8/11" & - echo + "OK 9/11" && - echo + "OK 10/11"; + echo + "OK 8/12" & + echo + "OK 9/12" && + echo + "OK 10/12"; // wait for all detached while(wait(nullptr) != -1); - exec( echo + "OK 11/11" ); + Cmd run_OK = echo; + run_OK.append_args({ "OK 11/12" }); + run( run_OK ); + + exec( echo + "OK 12/12" ); // todo - // exec( echo + $(echo + "OK 11/11") ); + // exec( echo + $(echo + "OK 11/12") ); } diff --git a/todo.txt b/todo.txt index d3db373..6218faf 100644 --- a/todo.txt +++ b/todo.txt @@ -13,7 +13,6 @@ precompiled header cppipe.h -Wno-unused-result in install.sh file operations, lack of uniformity (C++ vs POSIX) Check all return codes and report errors -shaded obj uninstall improve debug (the src file shown is the .ii) no optimizations option