-
Notifications
You must be signed in to change notification settings - Fork 0
Development #7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Development #7
Conversation
|
Caution Review failedThe pull request is closed. WalkthroughCentralizes runtime/build constants, adds templated Concepts/Utils, broadens Command/ExecutionValidator/AsyncPipeReader APIs, removes compile-time EXIT_FAIL_EC from CMake, updates tests to use Utils::Expand, and refreshes README usage examples. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant Cmd as Command
participant Utils as Utils/Constants
participant EV as ExecutionValidator
participant Spawn as Child/Spawn
participant Pipes as AsyncPipeReader
participant Res as CommandResult
User->>Cmd: construct + Arg(s)/Args/Env/WD/Timeout
Cmd->>Utils: use Constants (timeouts, buffer sizes)
Cmd->>EV: IsCommandExecutable(args)
EV-->>Cmd: executable?
alt executable
Cmd->>Spawn: build command line & env (QuoteArgumentWindows on Win)
Spawn->>Pipes: open pipes
par read stdout & stderr
Pipes->>Pipes: ReadFromPipe (loop, POLL_TIMEOUT_MS)
and wait for exit / timeout
Spawn->>Spawn: wait / signal / timeout (SLEEP_INTERVAL)
end
Spawn-->>Cmd: exit code + usage
Pipes-->>Cmd: stdout/stderr blobs
Cmd->>Res: construct result (IsSuccessful/HasOutput)
Res-->>User: return result
else not executable
Cmd->>Res: construct with Constants::EXIT_FAIL_EC
Res-->>User: return result
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (2)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
CatalystCX.hpp (1)
584-611: waitpid + wait4 double‑reap bug; use wait4(WNOHANG) and avoid the second wait.Calling wait4 after waitpid likely fails (ECHILD) and loses rusage for the completed child.
- if (timeout) { - const auto timeout_time = start_time + *timeout; - while (std::chrono::steady_clock::now() < timeout_time) { - const int wait_result = waitpid(ProcessId, &status, WNOHANG); - if (wait_result == ProcessId) { - wait4(ProcessId, &status, 0, &usage); // Get resource usage - break; // Process finished - } - if (wait_result == -1) { - result.ExitCode = Constants::EXIT_FAIL_EC; - result.Stderr = "waitpid failed"; - break; - } - std::this_thread::sleep_for(Constants::SLEEP_INTERVAL); - } - if (std::chrono::steady_clock::now() >= timeout_time) { - if (const int wait_result = waitpid(ProcessId, &status, WNOHANG); wait_result == 0) { - Kill(); - result.TimedOut = true; - wait4(ProcessId, &status, 0, &usage); - } else if (wait_result == ProcessId) { - wait4(ProcessId, &status, 0, &usage); - } - } - } else { - wait4(ProcessId, &status, 0, &usage); - } + if (timeout) { + const auto deadline = start_time + *timeout; + for (;;) { + const pid_t wr = wait4(ProcessId, &status, WNOHANG, &usage); + if (wr == ProcessId) break; + if (wr == -1) { + result.ExitCode = Constants::EXIT_FAIL_EC; + result.Stderr = "wait4 failed"; + break; + } + if (std::chrono::steady_clock::now() >= deadline) { + Kill(); + result.TimedOut = true; + (void)wait4(ProcessId, &status, 0, &usage); + break; + } + std::this_thread::sleep_for(Constants::SLEEP_INTERVAL); + } + } else { + (void)wait4(ProcessId, &status, 0, &usage); + }
🧹 Nitpick comments (6)
Evaluate.cpp (1)
278-289: Small portability nit: dd may not exist or accept bs=1M on all distros.If CI runs on minimal images, consider gating these with a presence check (which you already do for Linux) or fallback to head -c to generate bytes.
- auto res = Command("sh").Args(Utils::Expand({"-c", "dd if=/dev/zero bs=1M count=5 2>/dev/null"})).Execute(); + auto res = Command("sh").Args(Utils::Expand({"-c", "command -v dd >/dev/null && dd if=/dev/zero bs=1M count=5 2>/dev/null || head -c $((5*1024*1024)) </dev/zero"})).Execute();README.md (1)
175-195: Clarify snippet context (define cmd).Add a quick preface line to avoid confusion for readers copying the snippet verbatim.
### Multiple Arguments ```cpp +auto cmd = Command("echo"); std::vector<std::string> args = {"arg1", "arg2"}; cmd.Args(args);CatalystCX.hpp (4)
298-317: Avoid constexpr on Expand with std::vector/std::string.Not all standard libraries support constexpr heap containers equally; this can degrade portability. These helpers aren’t used in constant expressions.
-[[nodiscard]] constexpr std::vector<std::string> Expand(std::initializer_list<T> args) { +[[nodiscard]] inline std::vector<std::string> Expand(std::initializer_list<T> args) {-[[nodiscard]] constexpr std::vector<std::string> Expand(R&& range) { +[[nodiscard]] inline std::vector<std::string> Expand(R&& range) {If you prefer keeping constexpr, please confirm CI covers GCC, Clang, and MSVC standard libraries with constexpr containers enabled.
474-486: tolower on possibly negative char is UB; cast to unsigned char.Fix the casing lambda used for env var keys.
-std::transform(lk.begin(), lk.end(), lk.begin(), [](char c) { return std::tolower(c); }); +std::transform(lk.begin(), lk.end(), lk.begin(), + [](unsigned char c) { return static_cast<char>(std::tolower(c)); });Apply in both places.
456-464: Minor: avoid binding to temporaries from transform_view.Copy instead of binding a const& to the prvalue from views::transform to make lifetime explicit.
- for (const auto& quoted_arg : quoted_args) { + for (const auto quoted_arg : quoted_args) { cmdline += ' '; cmdline += quoted_arg; }
782-789: Reserve on PipeData then re‑reserve here is redundant.PipeData’s ctor already reserves PIPE_BUFFER_SIZE; the extra reserve calls can be dropped.
- stdout_data.Buffer.reserve(Constants::PIPE_BUFFER_SIZE); - stderr_data.Buffer.reserve(Constants::STDERR_BUFFER_SIZE); + // Already reserved in PipeData; optional: keep stderr different if intentionally smaller.If you intend a smaller initial stderr capacity, move that into PipeData based on which fd is initialized.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
CMakeLists.txt(0 hunks)CatalystCX.hpp(23 hunks)Evaluate.cpp(6 hunks)README.md(2 hunks)
💤 Files with no reviewable changes (1)
- CMakeLists.txt
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: assembler-0
PR: assembler-0/CatalystCX#3
File: Evaluate.cpp:196-197
Timestamp: 2025-09-20T07:40:52.272Z
Learning: The CatalystCX project uses C++20 as confirmed by CMakeLists.txt setting CMAKE_CXX_STANDARD to 20. However, constexpr std::vector limitations still apply - it can only be used in constexpr functions as local variables due to transient allocation requirements.
🧬 Code graph analysis (1)
Evaluate.cpp (1)
CatalystCX.hpp (2)
Expand(299-299)Expand(312-312)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Static Analysis
🔇 Additional comments (5)
Evaluate.cpp (1)
48-48: Consistent migration to Utils::Expand looks good.The test suite uniformly uses Utils::Expand for Args, improving API consistency across examples and tests.
Also applies to: 132-132, 141-141, 155-155, 160-160, 278-289, 322-333
CatalystCX.hpp (4)
53-60: Constants centralization LGTM.Replacing macros with constexprs improves type-safety and discoverability.
62-71: Concepts are sensible and keep the surface generic.StringLike/DurationLike constraints are appropriate for this API surface.
372-394: Windows Wait(): robust and clear.Timeout handling and output collection sequencing look correct.
839-843: Execute(): good mapping to EXIT_FAIL_EC.Clear failure path and message.
| // Or use builtin expansion: | ||
| cmd.Args(Uitils::Expand({"arg1", "arg2"})); | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Typo: Uitils -> Utils.
Fix the namespace spelling in both snippets so examples compile as written.
- cmd.Args(Uitils::Expand({"arg1", "arg2"}));
+ cmd.Args(Utils::Expand({"arg1", "arg2"}));- return Command("wc").Args(Uitils::Expand({"-l", file})).Execute();
+ return Command("wc").Args(Utils::Expand({"-l", file})).Execute();Run to catch any remaining typos:
Also applies to: 204-205
🏁 Script executed:
#!/bin/bash
rg -n "Uitils::Expand|Uiti[l|]s" -g '!**/build/**'Length of output: 148
🏁 Script executed:
#!/bin/bash
set -uo pipefail
echo "PWD: $(pwd)"
echo "--- ls -la (root) ---"
ls -la | sed -n '1,200p' || true
echo "--- sample files (depth 2) ---"
find . -maxdepth 2 -type f | sed -n '1,200p' || true
echo "--- rg version ---"
rg --version || true
echo "--- rg debug search for 'Uitils' ---"
rg --debug -n --hidden -S "Uitils" || true
echo "--- rg search ignoring .gitignore for 'Uitils' ---"
rg -n --hidden --no-ignore -S "Uitils" || true
if [ -f README.md ]; then
echo "--- README.md lines 180-210 ---"
sed -n '180,210p' README.md || true
else
echo "README.md not found at repo root."
fiLength of output: 5347
Fix typo: 'Uitils' → 'Utils' in README examples (README.md:193, 204)
Replace both occurrences so the examples compile.
- cmd.Args(Uitils::Expand({"arg1", "arg2"}));
+ cmd.Args(Utils::Expand({"arg1", "arg2"}));- return Command("wc").Args(Uitils::Expand({"-l", file})).Execute();
+ return Command("wc").Args(Utils::Expand({"-l", file})).Execute();📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Or use builtin expansion: | |
| cmd.Args(Uitils::Expand({"arg1", "arg2"})); | |
| ``` | |
| // Or use builtin expansion: | |
| cmd.Args(Utils::Expand({"arg1", "arg2"})); |
🤖 Prompt for AI Agents
In README.md around lines 192 to 194 (and also at line ~204), there is a typo
where "Uitils" is used in code examples; replace both occurrences of "Uitils"
with the correct "Utils" so the examples compile and reference the correct
symbol.
Summary by CodeRabbit