From 08cd7682605d2c9e54f920f49077c451d2e459bf Mon Sep 17 00:00:00 2001 From: Luke Street Date: Mon, 30 Sep 2024 21:41:57 -0600 Subject: [PATCH] Add total_units, complete_units to progress report --- Cargo.lock | 6 +-- Cargo.toml | 2 +- objdiff-cli/src/cmd/report.rs | 3 +- objdiff-core/protos/proto_descriptor.bin | Bin 17154 -> 17396 bytes objdiff-core/protos/report.proto | 4 ++ objdiff-core/src/bindings/report.rs | 62 +++++++++++++++++++---- 6 files changed, 63 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c55faa9..c3144b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2861,7 +2861,7 @@ dependencies = [ [[package]] name = "objdiff-cli" -version = "2.2.0" +version = "2.2.1" dependencies = [ "anyhow", "argp", @@ -2883,7 +2883,7 @@ dependencies = [ [[package]] name = "objdiff-core" -version = "2.2.0" +version = "2.2.1" dependencies = [ "anyhow", "arm-attr", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "objdiff-gui" -version = "2.2.0" +version = "2.2.1" dependencies = [ "anyhow", "bytes", diff --git a/Cargo.toml b/Cargo.toml index cd1b3dc..c46832c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ strip = "debuginfo" codegen-units = 1 [workspace.package] -version = "2.2.0" +version = "2.2.1" authors = ["Luke Street "] edition = "2021" license = "MIT OR Apache-2.0" diff --git a/objdiff-cli/src/cmd/report.rs b/objdiff-cli/src/cmd/report.rs index 4bda109..169e3da 100644 --- a/objdiff-cli/src/cmd/report.rs +++ b/objdiff-cli/src/cmd/report.rs @@ -199,7 +199,7 @@ fn report_object( .unwrap_or_default(), auto_generated: object.metadata.as_ref().and_then(|m| m.auto_generated), }; - let mut measures = Measures::default(); + let mut measures = Measures { total_units: 1, ..Default::default() }; let mut sections = vec![]; let mut functions = vec![]; @@ -280,6 +280,7 @@ fn report_object( if metadata.complete.unwrap_or(false) { measures.complete_code = measures.total_code; measures.complete_data = measures.total_data; + measures.complete_units = 1; } measures.calc_fuzzy_match_percent(); measures.calc_matched_percent(); diff --git a/objdiff-core/protos/proto_descriptor.bin b/objdiff-core/protos/proto_descriptor.bin index 4551eea4e9c0fea4e8491f2714fcf73e87b9380f..88b01fdf9d94ed4c931dc8dd9bb7bc23037ac476 100644 GIT binary patch delta 2936 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 diff --git a/objdiff-core/protos/report.proto b/objdiff-core/protos/report.proto index 3a4bbe7..ed7ebb8 100644 --- a/objdiff-core/protos/report.proto +++ b/objdiff-core/protos/report.proto @@ -32,6 +32,10 @@ message Measures { uint64 complete_data = 13; // Completed (or "linked") data percent float complete_data_percent = 14; + // Total number of units + uint32 total_units = 15; + // Completed (or "linked") units + uint32 complete_units = 16; } // Project progress report diff --git a/objdiff-core/src/bindings/report.rs b/objdiff-core/src/bindings/report.rs index f8e4962..7f2f561 100644 --- a/objdiff-core/src/bindings/report.rs +++ b/objdiff-core/src/bindings/report.rs @@ -8,9 +8,10 @@ use serde_json::error::Category; include!(concat!(env!("OUT_DIR"), "/objdiff.report.rs")); include!(concat!(env!("OUT_DIR"), "/objdiff.report.serde.rs")); -pub const REPORT_VERSION: u32 = 1; +pub const REPORT_VERSION: u32 = 2; impl Report { + /// Attempts to parse the report as binary protobuf or JSON. pub fn parse(data: &[u8]) -> Result { if data.is_empty() { bail!(std::io::Error::from(std::io::ErrorKind::UnexpectedEof)); @@ -25,6 +26,7 @@ impl Report { Ok(report) } + /// Attempts to parse the report as JSON, migrating from the legacy report format if necessary. fn from_json(bytes: &[u8]) -> Result { match serde_json::from_slice::(bytes) { Ok(report) => Ok(report), @@ -43,16 +45,23 @@ impl Report { } } + /// Migrates the report to the latest version. + /// Fails if the report version is newer than supported. pub fn migrate(&mut self) -> Result<()> { if self.version == 0 { self.migrate_v0()?; } + if self.version == 1 { + self.migrate_v1()?; + } if self.version != REPORT_VERSION { bail!("Unsupported report version: {}", self.version); } Ok(()) } + /// Adds `complete_code`, `complete_data`, `complete_code_percent`, and `complete_data_percent` + /// to measures, and sets `progress_categories` in unit metadata. fn migrate_v0(&mut self) -> Result<()> { let Some(measures) = &mut self.measures else { bail!("Missing measures in report"); @@ -61,15 +70,16 @@ impl Report { let Some(unit_measures) = &mut unit.measures else { bail!("Missing measures in report unit"); }; - let Some(metadata) = &mut unit.metadata else { - bail!("Missing metadata in report unit"); + let mut complete = false; + if let Some(metadata) = &mut unit.metadata { + if metadata.module_name.is_some() || metadata.module_id.is_some() { + metadata.progress_categories = vec!["modules".to_string()]; + } else { + metadata.progress_categories = vec!["dol".to_string()]; + } + complete = metadata.complete.unwrap_or(false); }; - if metadata.module_name.is_some() || metadata.module_id.is_some() { - metadata.progress_categories = vec!["modules".to_string()]; - } else { - metadata.progress_categories = vec!["dol".to_string()]; - } - if metadata.complete.unwrap_or(false) { + if complete { unit_measures.complete_code = unit_measures.total_code; unit_measures.complete_data = unit_measures.total_data; unit_measures.complete_code_percent = 100.0; @@ -84,10 +94,42 @@ impl Report { measures.complete_data += unit_measures.complete_data; } measures.calc_matched_percent(); + self.calculate_progress_categories(); self.version = 1; Ok(()) } + /// Adds `total_units` and `complete_units` to measures. + fn migrate_v1(&mut self) -> Result<()> { + let Some(total_measures) = &mut self.measures else { + bail!("Missing measures in report"); + }; + for unit in &mut self.units { + let Some(measures) = &mut unit.measures else { + bail!("Missing measures in report unit"); + }; + let complete = unit.metadata.as_ref().and_then(|m| m.complete).unwrap_or(false) as u32; + let progress_categories = + unit.metadata.as_ref().map(|m| m.progress_categories.as_slice()).unwrap_or(&[]); + measures.total_units = 1; + measures.complete_units = complete; + total_measures.total_units += 1; + total_measures.complete_units += complete; + for id in progress_categories { + if let Some(category) = self.categories.iter_mut().find(|c| &c.id == id) { + let Some(measures) = &mut category.measures else { + bail!("Missing measures in category"); + }; + measures.total_units += 1; + measures.complete_units += complete; + } + } + } + self.version = 2; + Ok(()) + } + + /// Calculate progress categories based on unit metadata. pub fn calculate_progress_categories(&mut self) { for unit in &self.units { let Some(metadata) = unit.metadata.as_ref() else { @@ -242,6 +284,8 @@ impl AddAssign for Measures { self.matched_functions += other.matched_functions; self.complete_code += other.complete_code; self.complete_data += other.complete_data; + self.total_units += other.total_units; + self.complete_units += other.complete_units; } }