aboutsummaryrefslogtreecommitdiff
path: root/mingling_ci/src/res
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-08-18 09:37:18 +0800
committer魏曹先生 <1992414357@qq.com>2026-08-18 09:37:18 +0800
commitff3293f123a8768fc3b24715b6404ff3a0ab63da (patch)
tree77a2a634c6e6e1d93ae8824cdeb58ad86f2990e2 /mingling_ci/src/res
parent3b56d50c16cf86429de9bf82b717ad4c13d7f968 (diff)
refactor(ci-new): aggregate successful package reports
Replace per-package `.ok` files with a single `ok` file listing successful packages per platform, flushed after all checks complete.
Diffstat (limited to 'mingling_ci/src/res')
-rw-r--r--mingling_ci/src/res/collect_logs.rs38
1 files changed, 18 insertions, 20 deletions
diff --git a/mingling_ci/src/res/collect_logs.rs b/mingling_ci/src/res/collect_logs.rs
index b764b49..df0af5b 100644
--- a/mingling_ci/src/res/collect_logs.rs
+++ b/mingling_ci/src/res/collect_logs.rs
@@ -26,7 +26,8 @@ pub struct ResCollectLogs {
}
impl ResCollectLogs {
- /// Reads `collect/{task}/{os}/{package}.{ok|err}` and the git info.
+ /// Reads `collect/{task}/{os}/` — the aggregate `ok` file (one package per
+ /// line) and per-package `{package}.err` files — plus the git info.
#[must_use]
pub fn read() -> Self {
let mut logs = Self::default();
@@ -52,16 +53,25 @@ impl ResCollectLogs {
};
for file in files.flatten() {
let file_name = file.file_name().to_string_lossy().into_owned();
- if let Some((package, ok)) = parse_log_name(&file_name) {
+ if file_name == "ok" {
+ // Aggregate success file: one package name per line.
+ if let Ok(content) = std::fs::read_to_string(file.path()) {
+ for package in content.lines().filter(|l| !l.is_empty()) {
+ logs.statuses
+ .entry((task.clone(), package.to_string()))
+ .or_default()
+ .insert(os.clone(), true);
+ }
+ }
+ } else if let Some(package) = file_name.strip_suffix(".err") {
+ let package = package.to_string();
logs.statuses
.entry((task.clone(), package.clone()))
.or_default()
- .insert(os.clone(), ok);
- if !ok {
- let err = std::fs::read_to_string(file.path()).unwrap_or_default();
- logs.err_outputs
- .insert((task.clone(), os.clone(), package), strip_ansi(&err));
- }
+ .insert(os.clone(), false);
+ let err = std::fs::read_to_string(file.path()).unwrap_or_default();
+ logs.err_outputs
+ .insert((task.clone(), os.clone(), package), strip_ansi(&err));
}
}
}
@@ -78,18 +88,6 @@ pub fn report_setup(p: &mut Program<ThisProgram>) {
p.with_resource(ResCollectLogs::read());
}
-/// Parses a `{package}.{ok|err}` file name into `(package, ok)`.
-fn parse_log_name(file_name: &str) -> Option<(String, bool)> {
- file_name
- .strip_suffix(".ok")
- .map(|n| (n.to_string(), true))
- .or_else(|| {
- file_name
- .strip_suffix(".err")
- .map(|n| (n.to_string(), false))
- })
-}
-
/// Strips ANSI escape sequences from `input`.
///
/// Handles CSI (`ESC [ ...`), OSC (`ESC ] ...` terminated by BEL or `ESC \`)