diff --git a/crates/apr-cli/src/commands_enum.rs b/crates/apr-cli/src/commands_enum.rs index 5da86438e9..90903cc498 100644 --- a/crates/apr-cli/src/commands_enum.rs +++ b/crates/apr-cli/src/commands_enum.rs @@ -1067,3 +1067,7 @@ pub enum DebugCommands { #[cfg(all(test, feature = "training"))] #[path = "code_output_format_help_tests.rs"] mod code_output_format_help_tests; + +#[cfg(test)] +#[path = "ptx_help_marker_tests.rs"] +mod ptx_help_marker_tests; diff --git a/crates/apr-cli/src/extended_commands.rs b/crates/apr-cli/src/extended_commands.rs index f89c669ed2..1c245cd941 100644 --- a/crates/apr-cli/src/extended_commands.rs +++ b/crates/apr-cli/src/extended_commands.rs @@ -400,7 +400,8 @@ pub enum ExtendedCommands { not(feature = "trueno-explain"), command( name = "ptx", - about = "PTX analysis and bug detection [unavailable in this build: cargo install aprender --features ptx; `apr ptx-debug` is always built]" + about = "PTX analysis and bug detection [unavailable in this build: cargo install aprender --features ptx; `apr ptx-debug` is always built]", + long_about = "PTX analysis and bug detection [unavailable in this build: cargo install aprender --features ptx; `apr ptx-debug` is always built]" ) )] Ptx { diff --git a/crates/apr-cli/src/ptx_help_marker_tests.rs b/crates/apr-cli/src/ptx_help_marker_tests.rs new file mode 100644 index 0000000000..7f3ec12b90 --- /dev/null +++ b/crates/apr-cli/src/ptx_help_marker_tests.rs @@ -0,0 +1,40 @@ +//! `apr ptx --help` must carry the "unavailable in this build" marker (#4474, #2399 finding 1). +//! +//! Clap derives `long_about` from the doc comment unless it is set explicitly, so +//! overriding only `about` left `--help` (the long form) without the marker. + +const MARKER: &str = "unavailable in this build"; + +/// Clap's recursive build of the full `Commands` enum overflows the default +/// test-thread stack in debug builds, as in code_output_format_help_tests.rs. +#[test] +fn ptx_help_says_when_the_analyzer_is_not_built_in() { + std::thread::Builder::new() + .stack_size(16 * 1024 * 1024) + .spawn(ptx_help_body) + .expect("spawn") + .join() + .expect("ptx help row panicked"); +} + +fn ptx_help_body() { + use clap::CommandFactory; + let cmd = crate::Cli::command(); + let ptx = cmd.find_subcommand("ptx").expect("ptx subcommand"); + let short = ptx.get_about().map(ToString::to_string).unwrap_or_default(); + let long = ptx + .get_long_about() + .or_else(|| ptx.get_about()) + .map(ToString::to_string) + .unwrap_or_default(); + let built = cfg!(feature = "trueno-explain"); + for (what, text) in [("about", &short), ("long_about", &long)] { + assert_eq!( + text.contains(MARKER), + !built, + "apr ptx {what} marker presence must be {} when trueno-explain is {}: {text}", + !built, + if built { "on" } else { "off" } + ); + } +} diff --git a/docs/audits/surface_audit.csv b/docs/audits/surface_audit.csv index f59b14d503..050400c383 100644 --- a/docs/audits/surface_audit.csv +++ b/docs/audits/surface_audit.csv @@ -251,7 +251,7 @@ apr,apr pretrain,6,x86_64-linux,pytorch,yes,1,apr-lint-diag,crates/apr-cli/src/e apr,apr profile,3,x86_64-linux;nvidia-cuda,llama.cpp,yes,9,profiling,crates/apr-cli/src/extended_commands.rs:186,high apr,apr prometheus-lint,1,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:1138,high apr,apr prune,4,x86_64-linux,unsloth,yes,10,apr-core-commands,crates/apr-cli/src/model_ops_commands.rs:113,high -apr,apr ptx,4,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:387,high +apr,apr ptx,4,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:407,high apr,apr ptx-map,6,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:355,high apr,apr publish,6,x86_64-linux,llama.cpp,yes,10,apr-core-commands,crates/apr-cli/src/tool_commands.rs:46,high apr,apr pull,4,x86_64-linux,llama.cpp,yes,10,apr-core-commands,crates/apr-cli/src/commands_enum.rs:552,high @@ -453,7 +453,7 @@ apr,apr train sweep,6,x86_64-linux,pytorch,no,10,apr-core-commands,crates/apr-cl apr,apr train watch,6,x86_64-linux,pytorch,no,10,apr-core-commands,crates/apr-cli/src/train_commands.rs:172,low apr,apr tree,4,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:691,high apr,apr tui,9,x86_64-linux,NONE,yes,10,apr-core-commands,crates/apr-cli/src/commands_enum.rs:820,medium -apr,apr tune,4,x86_64-linux,pytorch,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:409,high +apr,apr tune,4,x86_64-linux,pytorch,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:429,high apr,apr typical-p-lint,1,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:1162,high apr,apr unified-search-lint,1,x86_64-linux,NONE,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:1215,high apr,apr unshard,9,x86_64-linux,llama.cpp,yes,1,apr-lint-diag,crates/apr-cli/src/extended_commands.rs:1254,medium