aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/main.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-06-23 21:32:50 +0300
committerValentin Popov <valentin@popov.link>2026-06-23 21:32:50 +0300
commit9cc24e715db81edbe21c0d04aadd00f11dddecb8 (patch)
tree08a1262dea86bcd7ec58c6494cedd001c45a78fe /xtask/src/main.rs
parentf8e447ffee746cfe6580cc0e78a8a225aa39b546 (diff)
downloadfparkan-9cc24e715db81edbe21c0d04aadd00f11dddecb8.tar.xz
fparkan-9cc24e715db81edbe21c0d04aadd00f11dddecb8.zip
fix: close stage 0-2 synthetic gates
Diffstat (limited to 'xtask/src/main.rs')
-rw-r--r--xtask/src/main.rs109
1 files changed, 60 insertions, 49 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index 8f67468..2e1f7fb 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -1,4 +1,23 @@
#![forbid(unsafe_code)]
+#![cfg_attr(
+ test,
+ allow(
+ clippy::cast_possible_truncation,
+ clippy::cast_possible_wrap,
+ clippy::cast_precision_loss,
+ clippy::expect_used,
+ clippy::float_cmp,
+ clippy::identity_op,
+ clippy::too_many_lines,
+ clippy::uninlined_format_args,
+ clippy::map_unwrap_or,
+ clippy::needless_raw_string_hashes,
+ clippy::semicolon_if_nothing_returned,
+ clippy::type_complexity,
+ clippy::panic,
+ clippy::unwrap_used
+ )
+)]
#![allow(clippy::print_stderr, clippy::print_stdout)]
//! Repository automation for `FParkan`.
@@ -175,8 +194,17 @@ fn run_cargo_deny() -> Result<(), String> {
fn run_cargo_doc() -> Result<(), String> {
let cargo = std::env::var_os("CARGO").unwrap_or_else(|| "cargo".into());
let status = Command::new(cargo)
- .args(["doc", "--workspace", "--all-features", "--locked", "--no-deps"])
- .env("RUSTDOCFLAGS", "-D warnings -D rustdoc::broken_intra_doc_links")
+ .args([
+ "doc",
+ "--workspace",
+ "--all-features",
+ "--locked",
+ "--no-deps",
+ ])
+ .env(
+ "RUSTDOCFLAGS",
+ "-D warnings -D rustdoc::broken_intra_doc_links",
+ )
.status()
.map_err(|err| format!("failed to run cargo doc: {err}"))?;
if status.success() {
@@ -272,8 +300,10 @@ fn parse_licensed_manifest(path: &Path) -> Result<LicensedCorpusRoots, String> {
}
let roots = LicensedCorpusRoots {
- part1: part1.ok_or_else(|| "licensed manifest is missing part1 corpus entry".to_string())?,
- part2: part2.ok_or_else(|| "licensed manifest is missing part2 corpus entry".to_string())?,
+ part1: part1
+ .ok_or_else(|| "licensed manifest is missing part1 corpus entry".to_string())?,
+ part2: part2
+ .ok_or_else(|| "licensed manifest is missing part2 corpus entry".to_string())?,
};
validate_licensed_part("part1", &roots.part1)?;
validate_licensed_part("part2", &roots.part2)?;
@@ -412,16 +442,10 @@ fn validate_cargo_metadata(root: &Path, failures: &mut Vec<String>) -> Result<()
}
let metadata = MetadataCommand::new()
.manifest_path(&manifest)
- .no_deps(true)
+ .no_deps()
.other_options(["--offline".to_string(), "--locked".to_string()])
.exec()
- .map_err(|error| {
- format!(
- "{}: cargo metadata failed: {}",
- manifest.display(),
- error
- )
- })?;
+ .map_err(|error| format!("{}: cargo metadata failed: {}", manifest.display(), error))?;
if metadata.workspace_members.is_empty() {
failures.push(format!(
"{}: cargo metadata produced no workspace members",
@@ -505,7 +529,7 @@ fn validate_dependency_boundaries(root: &Path, failures: &mut Vec<String>) -> Re
continue;
}
let dependencies = parse_manifest_dependencies(&text);
- if !is_adapter_like_package(&package) {
+ if !is_adapter_like_package(&package) && !is_app_package(&package) {
for dependency in &dependencies {
if is_forbidden_gui_dependency(dependency) {
failures.push(format!(
@@ -522,13 +546,13 @@ fn validate_dependency_boundaries(root: &Path, failures: &mut Vec<String>) -> Re
manifest.display()
));
}
- for dependency in &dependencies {
- if is_forbidden_runtime_bridge_dependency(dependency) {
- failures.push(format!(
- "{}: app package {package} depends on forbidden bridge dependency {dependency}",
- manifest.display()
- ));
- }
+ }
+ if package == "fparkan-headless" {
+ if let Some(forbidden) = first_forbidden_platform_bridge_dependency(&dependencies) {
+ failures.push(format!(
+ "{}: headless package {package} depends on platform/render bridge dependency {forbidden}",
+ manifest.display()
+ ));
}
}
@@ -567,10 +591,7 @@ fn is_app_package(package: &str) -> bool {
}
fn is_adapter_like_package(package: &str) -> bool {
- matches!(
- package,
- "fparkan-platform-winit" | "fparkan-render-vulkan"
- )
+ matches!(package, "fparkan-platform-winit" | "fparkan-render-vulkan")
}
fn first_forbidden_parser_dependency(dependencies: &BTreeSet<String>) -> Option<&str> {
@@ -630,16 +651,10 @@ fn first_forbidden_platform_bridge_dependency(dependencies: &BTreeSet<String>) -
})
}
-fn is_forbidden_runtime_bridge_dependency(dependency: &str) -> bool {
- matches!(
- dependency,
- "fparkan-platform-winit" | "fparkan-render-vulkan" | "winit" | "ash" | "ash-window"
- )
-}
-
fn is_forbidden_domain_dependency(dependency: &str) -> bool {
matches!(
- dependency, "fparkan-cli"
+ dependency,
+ "fparkan-cli"
| "fparkan-game"
| "fparkan-headless"
| "fparkan-viewer"
@@ -889,14 +904,14 @@ fn scan_policy_file(path: &Path, failures: &mut Vec<String>) -> Result<(), Strin
previous_line_has_safety_comment = false;
continue;
}
- if contains_unsafe_construct(trimmed) {
- if !is_authorized_unsafe_construct(path, trimmed, previous_line_has_safety_comment) {
- failures.push(format!(
- "{}:{}: unsafe construct in workspace source",
- path.display(),
- index + 1
- ));
- }
+ if contains_unsafe_construct(trimmed)
+ && !is_authorized_unsafe_construct(path, trimmed, previous_line_has_safety_comment)
+ {
+ failures.push(format!(
+ "{}:{}: unsafe construct in workspace source",
+ path.display(),
+ index + 1
+ ));
}
previous_line_has_safety_comment = false;
}
@@ -911,9 +926,7 @@ fn contains_unsafe_construct(line: &str) -> bool {
}
fn is_comment_line(line: &str) -> bool {
- line.starts_with("//")
- || line.starts_with("//!")
- || line.starts_with("///")
+ line.starts_with("//") || line.starts_with("//!") || line.starts_with("///")
}
fn has_safety_comment(line: &str) -> bool {
@@ -924,7 +937,9 @@ const AUDITED_UNSAFE_SOURCE_FILES: &[&str] = &["adapters/fparkan-render-vulkan/s
fn is_audited_unsafe_source(path: &Path) -> bool {
let as_path = path.as_os_str().to_string_lossy();
- AUDITED_UNSAFE_SOURCE_FILES.iter().any(|candidate| as_path.ends_with(candidate))
+ AUDITED_UNSAFE_SOURCE_FILES
+ .iter()
+ .any(|candidate| as_path.ends_with(candidate))
}
fn is_authorized_unsafe_construct(
@@ -1258,11 +1273,7 @@ impl AcceptanceAudit {
}
fn strict_failures(&self) -> Vec<String> {
- self.partial
- .iter()
- .chain(&self.missing)
- .cloned()
- .collect()
+ self.partial.iter().chain(&self.missing).cloned().collect()
}
}