Skip to content

Conversation

@2bndy5
Copy link
Collaborator

@2bndy5 2bndy5 commented Dec 7, 2025

addresses #192

This coverts functions that run and capture clang tools' suggestions from blocking to async API.

Other changes

  • mark env changes in tests as unsafe (satisfies newer lint rules)
  • properly parse xml with no replacements
  • update uv.lock file

Summary by CodeRabbit

  • Performance Improvements

    • Analysis tools migrated to asynchronous execution for better responsiveness and parallelism.
  • Dependencies

    • Runtime features expanded to enable filesystem and process handling.
  • User-facing Behavior

    • Diagnostic and progress messages now reference concise file names for clearer output.
  • Testing & Reliability

    • Test harness updated for async flows; error handling and logging across analysis workflows improved.

✏️ Tip: You can customize this high-level summary in your review settings.

addresses #192

This coverts functions that
run and capture clang tools' suggestions
from blocking to async API.
satisfies newer lint rules
@2bndy5 2bndy5 added the enhancement New feature or request label Dec 7, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 7, 2025

Walkthrough

The PR converts clang tool execution from synchronous to async (tokio), changes file handling to Arc<Mutex<FileObj>>, extends tokio features to include process and fs, adjusts tests to async and wraps test env var mutations in unsafe blocks.

Changes

Cohort / File(s) Summary
Tokio dependency expansion
cpp-linter/Cargo.toml
Added tokio features process and fs to the existing ["macros","rt-multi-thread"] feature set.
Async clang-format refactor
cpp-linter/src/clang_tools/clang_format.rs
Converted run_clang_format to async, changed parameter to &Arc<Mutex<FileObj>>, moved to tokio::process/tokio::fs usage, precompute file args before await, derive Default for FormatAdvice, add serde default/rename for replacements, and add test parse_xml_no_replacements.
Async clang-tidy refactor
cpp-linter/src/clang_tools/clang_tidy.rs
Converted run_clang_tidy to async, changed parameter to &Arc<Mutex<FileObj>>, switched to tokio::process/tokio::fs, consolidated argument construction before awaiting, updated patch caching and error handling, and converted tests to async.
Module orchestration & signatures
cpp-linter/src/clang_tools/mod.rs
Made analyze_single_file async and await tool runners, changed capture_clang_tools_output to accept &Vec<Arc<Mutex<FileObj>>>, captured file name upfront for filtering/messages, and derived Default for ClangVersions.
Run/test harness updates
cpp-linter/src/run.rs
Adjusted calls to new capture_clang_tools_output signature, adapted tests to async .await.unwrap() patterns, and moved env var manipulation into unsafe blocks in tests.
Test safety scoping
cpp-linter/tests/comments.rs, cpp-linter/tests/paginated_changed_files.rs, cpp-linter/tests/reviews.rs
Wrapped multiple env::set_var/env::remove_var calls inside unsafe { ... } blocks; no behavioral changes beyond scoping.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Verify locks are not held across await points in clang_format.rs and clang_tidy.rs.
  • Check command/argument construction is correct when built before async execution.
  • Validate serde defaulting/rename for replacements and FormatAdvice::default() usage.
  • Confirm all call sites updated for Arc<Mutex<FileObj>> and async signatures.
  • Review justification and concurrency safety for unsafe env var blocks in tests.

Possibly related issues

Possibly related PRs

Suggested labels

dependencies

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: converting from blocking synchronous commands to asynchronous tokio::Command for capturing clang tools' suggestions across multiple files.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch tokio-command

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
cpp-linter/src/clang_tools/mod.rs (1)

245-260: Consider simplifying the spawn pattern to avoid the double-await.

The current code spawns a future that returns another future, requiring output?.await?. This works but could be simplified.

Apply this diff to call .await inside the spawned task:

     for file in files {
         let arc_params = Arc::new(clang_params.clone());
         let arc_file = Arc::clone(file);
-        executors.spawn(async move { analyze_single_file(arc_file, arc_params) });
+        executors.spawn(async move { analyze_single_file(arc_file, arc_params).await });
     }
 
     while let Some(output) = executors.join_next().await {
-        let (file_name, logs) = output?.await?;
+        let (file_name, logs) = output??;

Alternatively, since analyze_single_file is already an async fn, you could spawn it directly:

executors.spawn(analyze_single_file(arc_file, arc_params));
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6523512 and 6e8ba1c.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (8)
  • cpp-linter/Cargo.toml (1 hunks)
  • cpp-linter/src/clang_tools/clang_format.rs (6 hunks)
  • cpp-linter/src/clang_tools/clang_tidy.rs (6 hunks)
  • cpp-linter/src/clang_tools/mod.rs (4 hunks)
  • cpp-linter/src/run.rs (2 hunks)
  • cpp-linter/tests/comments.rs (1 hunks)
  • cpp-linter/tests/paginated_changed_files.rs (2 hunks)
  • cpp-linter/tests/reviews.rs (1 hunks)
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2025-11-04T06:50:10.870Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 208
File: cpp-linter/src/clang_tools/mod.rs:60-115
Timestamp: 2025-11-04T06:50:10.870Z
Learning: In the cpp-linter-rs project, path validation (such as checking whether a path is a file or directory) should be performed in CLI parsing (cpp-linter/src/cli/structs.rs) rather than in the tool lookup logic (cpp-linter/src/clang_tools/mod.rs). This maintains proper separation of concerns.

Applied to files:

  • cpp-linter/tests/reviews.rs
  • cpp-linter/tests/paginated_changed_files.rs
  • cpp-linter/src/run.rs
  • cpp-linter/src/clang_tools/clang_tidy.rs
  • cpp-linter/src/clang_tools/mod.rs
  • cpp-linter/src/clang_tools/clang_format.rs
📚 Learning: 2024-10-02T07:55:08.948Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 52
File: cpp-linter/src/clang_tools/mod.rs:146-146
Timestamp: 2024-10-02T07:55:08.948Z
Learning: In the `cpp-linter` project, the function `capture_clang_tools_output` is only called in `cpp-linter/src/run.rs`, and there are no other calls to this function elsewhere in the codebase.

Applied to files:

  • cpp-linter/tests/reviews.rs
  • cpp-linter/tests/paginated_changed_files.rs
  • cpp-linter/src/run.rs
  • cpp-linter/src/clang_tools/clang_tidy.rs
  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2024-11-23T06:20:11.698Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 54
File: cpp-linter/src/rest_api/mod.rs:253-254
Timestamp: 2024-11-23T06:20:11.698Z
Learning: In `cpp-linter/src/rest_api/mod.rs`, it is safe to use `unwrap()` on `clang_versions.tidy_version` and `clang_versions.format_version` because they are guaranteed to be `Some` at that point in the code.

Applied to files:

  • cpp-linter/tests/reviews.rs
  • cpp-linter/tests/paginated_changed_files.rs
  • cpp-linter/src/run.rs
  • cpp-linter/tests/comments.rs
  • cpp-linter/src/clang_tools/clang_tidy.rs
  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2024-11-23T14:10:31.760Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 54
File: cpp-linter/src/clang_tools/mod.rs:149-159
Timestamp: 2024-11-23T14:10:31.760Z
Learning: Clang tools' `--version` output is consistent across all released versions, so adding extra error handling or unit tests for version extraction may be unnecessary. Tests are run after the clang tools are installed.

Applied to files:

  • cpp-linter/src/run.rs
  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2025-01-21T09:56:32.771Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 101
File: cpp-linter/src/clang_tools/clang_format.rs:155-161
Timestamp: 2025-01-21T09:56:32.771Z
Learning: In cpp-linter-rs, the XML output being parsed is generated programmatically by clang-format tool. The only failure case for XML parsing is when clang-format produces a blank XML document, in which case falling back to empty results (using unwrap_or) is the desired behavior.

Applied to files:

  • cpp-linter/src/run.rs
  • cpp-linter/src/clang_tools/clang_tidy.rs
  • cpp-linter/src/clang_tools/mod.rs
  • cpp-linter/src/clang_tools/clang_format.rs
🧬 Code graph analysis (5)
cpp-linter/tests/reviews.rs (1)
cpp-linter/tests/common/mod.rs (1)
  • mock_server (82-84)
cpp-linter/tests/paginated_changed_files.rs (1)
cpp-linter/src/rest_api/github/specific_api.rs (1)
  • new (33-80)
cpp-linter/tests/comments.rs (2)
cpp-linter/src/main.rs (1)
  • env (11-11)
cpp-linter/tests/common/mod.rs (1)
  • mock_server (82-84)
cpp-linter/src/clang_tools/clang_tidy.rs (2)
cpp-linter/src/common_fs/file_filter.rs (1)
  • new (17-24)
cpp-linter/src/common_fs/mod.rs (1)
  • new (44-53)
cpp-linter/src/clang_tools/clang_format.rs (1)
cpp-linter/src/common_fs/mod.rs (1)
  • new (44-53)
⏰ 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). (20)
  • GitHub Check: build-rustdoc
  • GitHub Check: x86_64-apple-darwin
  • GitHub Check: aarch64-apple-darwin
  • GitHub Check: x86_64-unknown-linux-musl
  • GitHub Check: x86_64-unknown-linux-gnu
  • GitHub Check: arm-unknown-linux-gnueabi
  • GitHub Check: test (windows-latest)
  • GitHub Check: aarch64-unknown-linux-musl
  • GitHub Check: Build aarch64-unknown-linux-musl
  • GitHub Check: Build armv7-unknown-linux-gnueabihf
  • GitHub Check: Build aarch64-apple-darwin
  • GitHub Check: Build aarch64-pc-windows-msvc
  • GitHub Check: Build x86_64-unknown-linux-gnu
  • GitHub Check: Build aarch64-unknown-linux-gnu
  • GitHub Check: Build x86_64-unknown-linux-musl
  • GitHub Check: Build x86_64-apple-darwin
  • GitHub Check: Build x86_64-pc-windows-msvc
  • GitHub Check: Build FreeBSD
  • GitHub Check: build-py-binding
  • GitHub Check: Build current binary
🔇 Additional comments (36)
cpp-linter/Cargo.toml (1)

31-31: LGTM!

The addition of process and fs features to tokio is appropriate for the async refactor. These enable tokio::process::Command and tokio::fs operations used in clang_tidy.rs and clang_format.rs.

cpp-linter/tests/paginated_changed_files.rs (3)

40-53: LGTM!

The unsafe blocks for environment variable mutations align with newer Rust lint rules that flag env::set_var as potentially unsafe due to thread safety concerns in multi-threaded test environments. This is a consistent pattern applied across the test suite.


57-66: LGTM!

Consistent with the pattern for wrapping env::set_var in unsafe blocks.


80-82: LGTM!

Consistent unsafe wrapping for environment variable setup.

cpp-linter/tests/reviews.rs (3)

75-85: LGTM!

Consistent unsafe block usage for environment variable mutations in test setup.


90-92: LGTM!

Consistent pattern for GITHUB_EVENT_PATH setup.


98-100: LGTM!

Consistent pattern for GITHUB_API_URL setup.

cpp-linter/tests/comments.rs (3)

65-75: LGTM!

Consistent unsafe block usage for environment variable setup in test code.


81-83: LGTM!

Consistent pattern for conditional GITHUB_EVENT_PATH setup.


90-92: LGTM!

Consistent pattern for GITHUB_API_URL setup.

cpp-linter/src/run.rs (7)

165-177: LGTM!

The unsafe block for env::remove_var and the switch to .unwrap() for successful test cases is appropriate for test code.


182-187: LGTM!

Consistent pattern applied to version_command test.


192-203: LGTM!

Consistent pattern applied to force_debug_output test.


208-218: LGTM!

Consistent pattern applied to no_version_input test.


222-234: LGTM!

The pre_commit_env test correctly places both env::remove_var and env::set_var inside the unsafe block, and appropriately uses assert!(result.is_err()) since this test expects failure.


240-253: LGTM!

Consistent pattern applied to no_analysis test.


257-267: LGTM!

The bad_repo_root test correctly uses assert!(result.is_err()) for expected failure scenario.

cpp-linter/src/clang_tools/clang_tidy.rs (5)

251-286: LGTM!

The async signature change and the pattern of extracting file_name and building args while holding the lock briefly, then releasing it before async I/O operations, is the correct approach. This avoids holding MutexGuard across .await points which would prevent Send requirements.


287-300: LGTM!

Using tokio::fs::read_to_string for async file reading is appropriate for the async context.


301-317: LGTM!

The command construction and async execution using tokio::process::Command with .output().await is correctly implemented.


334-352: LGTM!

The pattern of reading patched content, restoring original content using async I/O, and then acquiring the lock again to update tidy_advice is well-structured. The lock is held only for the brief mutation of file.tidy_advice.


435-483: LGTM!

Test properly updated to async with Arc<Mutex<FileObj>> pattern matching the new function signature.

cpp-linter/src/clang_tools/mod.rs (4)

138-148: LGTM!

The pattern of acquiring the lock briefly to extract file_name, then releasing it before async operations, correctly avoids holding MutexGuard across await points.


149-187: LGTM!

Using the extracted file_name for filter checks and logging avoids repeated lock acquisitions during the async operations.


191-191: LGTM!

Deriving Default for ClangVersions is a clean way to initialize the struct with None values.


204-205: LGTM!

Taking an immutable reference &Vec<Arc<Mutex<FileObj>>> is appropriate since the function only needs to clone Arcs for spawning tasks.

cpp-linter/src/clang_tools/clang_format.rs (10)

18-21: LGTM! Default handling correctly addresses XML parsing edge cases.

The Default derive and #[serde(default)] attribute work together to handle two scenarios:

  • When clang-format produces empty stdout, FormatAdvice::default() is used (line 154)
  • When XML has no <replacement> elements, the default attribute provides an empty Vec instead of failing deserialization

This aligns with the learning that valid XML with no replacements should parse successfully.


81-84: LGTM! Function signature correctly adapted for async execution.

The signature change from &mut FileObj to &Arc<Mutex<FileObj>> enables thread-safe shared access required by the async runtime, and the async fn return type supports non-blocking command execution.


87-99: LGTM! Excellent mutex usage pattern.

The code locks the mutex only to extract necessary data (file_name, ranges), then releases it before awaiting I/O operations. This minimizes lock contention and prevents holding the lock across async suspension points.


100-121: LGTM! Async command execution properly implemented.

The optional format fixes retrieval correctly uses tokio::process::Command with .await, includes clear logging, and provides helpful error context.


122-136: LGTM! Second command execution correctly structured.

The code properly constructs a separate command instance with modified arguments to retrieve XML replacements, and includes appropriate error context.


146-156: LGTM! Robust default handling for empty output.

The explicit check for empty stdout before parsing avoids errors when clang-format produces no output, falling back to FormatAdvice::default() as intended. Based on learnings, this correctly handles the case where clang-format produces blank output.


158-162: LGTM! Async file reading correctly implemented.

The tokio::fs::read call properly awaits file I/O, and the file path (derived from file.name.to_string_lossy()) is consistent with what's passed to clang-format commands.


181-186: LGTM! Second mutex lock properly scoped.

The function locks the mutex a second time only to write the final result, after all async I/O has completed. The two lock scopes are separate and non-overlapping, avoiding deadlocks while maintaining thread safety.


201-215: LGTM! Test validates the serde default behavior.

This test confirms that XML with a valid structure but no <replacement> elements parses successfully, which is essential for the #[serde(default)] attribute added on line 21. This complements the existing parse_blank_xml test and addresses the PR objective of properly parsing XML with no replacements.


4-9: Imports are correctly configured for async conversion.

The imports properly support the async refactoring: Arc<Mutex<>> for thread-safe sharing, anyhow for error context, and tokio's fs and process::Command for async I/O operations. The required tokio features (process and fs) are already enabled in cpp-linter/Cargo.toml.

@2bndy5 2bndy5 changed the title Tokio command feat: use tokio::Command to capture suggestions Dec 7, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
cpp-linter/src/clang_tools/mod.rs (3)

138-188: Async per-file analysis looks sound; minor cleanups possible

The async refactor here looks correct: the mutex is only held while copying FileObj.name, so no lock is held across await, and poisoned locks are handled explicitly.

Two small polish suggestions:

  • You can avoid the extra allocation at the end by moving file_name instead of cloning it:
-    Ok((file_name.clone(), logs))
+    Ok((file_name, logs))
  • The filter checks can be simplified to avoid the duplicated is_some_and(..) || is_none() pattern, e.g.:
-        if clang_params
-            .format_filter
-            .as_ref()
-            .is_some_and(|f| f.is_source_or_ignored(file_name.as_path()))
-            || clang_params.format_filter.is_none()
-        {
+        if clang_params
+            .format_filter
+            .as_ref()
+            .map_or(true, |f| f.is_source_or_ignored(file_name.as_path()))
+        {

and similarly for tidy_filter. Behavior is unchanged; it’s just more idiomatic.


191-198: Consider also deriving Debug for ClangVersions

Now that ClangVersions derives Default, you might also want Debug for easier logging and diagnostics, especially around tool version discovery:

-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ClangVersions {

If Debug was intentionally dropped (e.g., to reduce public API surface), feel free to ignore this.


18-18: JoinSet-based concurrency works, but reduce cloning and consider bounding parallelism

The async fan-out via JoinSet is a good fit here, but there are a few refinements worth considering:

  1. Avoid cloning ClangParams per file

Right now a full ClangParams clone is created for every file:

for file in files {
    let arc_params = Arc::new(clang_params.clone());
    let arc_file = Arc::clone(file);
    executors.spawn(analyze_single_file(arc_file, arc_params));
}

If clang_params contains a large database_json, this can get expensive. You can clone it once and just clone the Arc per task:

-    let mut executors = JoinSet::new();
-    // iterate over the discovered files and run the clang tools
-    for file in files {
-        let arc_params = Arc::new(clang_params.clone());
-        let arc_file = Arc::clone(file);
-        executors.spawn(analyze_single_file(arc_file, arc_params));
-    }
+    let shared_params = Arc::new(clang_params.clone());
+    let mut executors = JoinSet::new();
+    // iterate over the discovered files and run the clang tools
+    for file in files {
+        let arc_file = Arc::clone(file);
+        let arc_params = Arc::clone(&shared_params);
+        executors.spawn(analyze_single_file(arc_file, arc_params));
+    }
  1. Bound concurrency to avoid spawning too many clang jobs at once

JoinSet will happily run one task per file; on very large PRs this could translate into a large number of concurrent clang-tidy/clang-format processes and potentially thrash the machine. If that’s a concern, consider enforcing a max concurrency (e.g., with a tokio::sync::Semaphore or by using a for_each_concurrent-style pattern) so you only process N files in parallel.

  1. More generic parameter type for files

Since capture_clang_tools_output doesn’t mutate files, taking a slice instead of &Vec would make the API more flexible:

-pub async fn capture_clang_tools_output(
-    files: &Vec<Arc<Mutex<FileObj>>>,
+pub async fn capture_clang_tools_output(
+    files: &[Arc<Mutex<FileObj>>],

Given the earlier learning that this function is only called from run.rs, adjusting the call site should be straightforward. Based on learnings, this keeps the API cleaner while preserving behavior.

  1. Error handling behavior with output??

Using output?? means the first failing task (either join error or inner Result::Err) will cause the function to return early and drop the remaining tasks in the JoinSet. If that’s intended (fail-fast behavior), it’s fine. If you’d rather attempt to collect diagnostics for all files even when one fails, you’d need to accumulate per-task errors instead of bailing on the first one.

Also applies to: 205-262

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6e8ba1c and 30a6bd6.

📒 Files selected for processing (2)
  • cpp-linter/src/clang_tools/mod.rs (4 hunks)
  • cpp-linter/src/run.rs (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • cpp-linter/src/run.rs
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2025-11-04T06:50:10.870Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 208
File: cpp-linter/src/clang_tools/mod.rs:60-115
Timestamp: 2025-11-04T06:50:10.870Z
Learning: In the cpp-linter-rs project, path validation (such as checking whether a path is a file or directory) should be performed in CLI parsing (cpp-linter/src/cli/structs.rs) rather than in the tool lookup logic (cpp-linter/src/clang_tools/mod.rs). This maintains proper separation of concerns.

Applied to files:

  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2024-10-02T07:55:08.948Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 52
File: cpp-linter/src/clang_tools/mod.rs:146-146
Timestamp: 2024-10-02T07:55:08.948Z
Learning: In the `cpp-linter` project, the function `capture_clang_tools_output` is only called in `cpp-linter/src/run.rs`, and there are no other calls to this function elsewhere in the codebase.

Applied to files:

  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2024-11-23T06:20:11.698Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 54
File: cpp-linter/src/rest_api/mod.rs:253-254
Timestamp: 2024-11-23T06:20:11.698Z
Learning: In `cpp-linter/src/rest_api/mod.rs`, it is safe to use `unwrap()` on `clang_versions.tidy_version` and `clang_versions.format_version` because they are guaranteed to be `Some` at that point in the code.

Applied to files:

  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2025-01-21T09:56:32.771Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 101
File: cpp-linter/src/clang_tools/clang_format.rs:155-161
Timestamp: 2025-01-21T09:56:32.771Z
Learning: In cpp-linter-rs, the XML output being parsed is generated programmatically by clang-format tool. The only failure case for XML parsing is when clang-format produces a blank XML document, in which case falling back to empty results (using unwrap_or) is the desired behavior.

Applied to files:

  • cpp-linter/src/clang_tools/mod.rs
📚 Learning: 2024-11-23T14:10:31.760Z
Learnt from: 2bndy5
Repo: cpp-linter/cpp-linter-rs PR: 54
File: cpp-linter/src/clang_tools/mod.rs:149-159
Timestamp: 2024-11-23T14:10:31.760Z
Learning: Clang tools' `--version` output is consistent across all released versions, so adding extra error handling or unit tests for version extraction may be unnecessary. Tests are run after the clang tools are installed.

Applied to files:

  • cpp-linter/src/clang_tools/mod.rs
⏰ 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). (20)
  • GitHub Check: test (windows-latest)
  • GitHub Check: test (ubuntu-latest)
  • GitHub Check: arm-unknown-linux-gnueabi
  • GitHub Check: powerpc64-unknown-linux-gnu
  • GitHub Check: aarch64-pc-windows-msvc
  • GitHub Check: powerpc-unknown-linux-gnu
  • GitHub Check: armv7-unknown-linux-gnueabihf
  • GitHub Check: powerpc64le-unknown-linux-gnu
  • GitHub Check: x86_64-unknown-linux-musl
  • GitHub Check: x86_64-unknown-linux-gnu
  • GitHub Check: aarch64-unknown-linux-gnu
  • GitHub Check: aarch64-unknown-linux-musl
  • GitHub Check: Build x86_64-apple-darwin
  • GitHub Check: Build armv7-unknown-linux-gnueabihf
  • GitHub Check: Build aarch64-unknown-linux-musl
  • GitHub Check: Build aarch64-apple-darwin
  • GitHub Check: Build x86_64-unknown-linux-musl
  • GitHub Check: Build x86_64-pc-windows-msvc
  • GitHub Check: Build x86_64-unknown-linux-gnu
  • GitHub Check: Build FreeBSD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants