From e7ebc92f8376730477c8d0ff6ced7909e1231410 Mon Sep 17 00:00:00 2001 From: Hare Date: Fri, 30 Oct 2026 20:33:57 +0900 Subject: [PATCH] fix: preserve complete merge request reviews --- crates/merge-request/src/lib.rs | 11 +------- crates/merge-request/tests/store.rs | 43 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/crates/merge-request/src/lib.rs b/crates/merge-request/src/lib.rs index aa7409d14..c339c3a31 100644 --- a/crates/merge-request/src/lib.rs +++ b/crates/merge-request/src/lib.rs @@ -210,12 +210,7 @@ impl MergeRequestThreadEvent { } fn bound_bodies(&mut self) { match self { - Self::Review(value) => { - truncate_body(&mut value.body); - for finding in &mut value.findings { - truncate_body(&mut finding.body); - } - } + Self::Review(_) => {} Self::ReviewRevoked(value) => truncate_body(&mut value.reason), Self::ReviewCancelled(value) => truncate_body(&mut value.reason), Self::Comment(value) => truncate_body(&mut value.body), @@ -939,10 +934,6 @@ impl MergeRequestStore { &self, i: SubmitMergeRequestReview, ) -> Result { - bounded_body("review body", &i.body)?; - for finding in &i.findings { - bounded_body("review finding", &finding.body)?; - } let mut c = self.lock()?; let t = c.transaction()?; let g: Option<(String, String, String, String, String, String)> = t diff --git a/crates/merge-request/tests/store.rs b/crates/merge-request/tests/store.rs index 5cf2837b2..e9e3e83e5 100644 --- a/crates/merge-request/tests/store.rs +++ b/crates/merge-request/tests/store.rs @@ -376,6 +376,49 @@ fn approve_for( fn approve(s: &MergeRequestStore, subject: &str, token: &str) -> ReviewEvent { approve_for(s, "MR", "R", subject, token) } +#[test] +fn review_submission_preserves_long_body_and_findings_on_reload() { + for (body, finding_body) in [ + ("b".repeat(16 * 1024 + 1), "finding".into()), + ("review".into(), "指摘".repeat(4096)), + ] { + let (_dir, store) = fixture(); + open(&store); + request(&store, "source", "token"); + let findings = vec![ReviewFinding { + severity: FindingSeverity::Major, + code: None, + path: None, + line: None, + body: finding_body, + }]; + let submitted = store + .submit_review(SubmitMergeRequestReview { + merge_request_id: "MR".into(), + ticket_id: "T".into(), + current_subject_ref: "source".into(), + capability_token: "token".into(), + decision: ReviewDecision::RequestChanges, + body: body.clone(), + findings: findings.clone(), + now: at(4), + }) + .unwrap(); + assert_eq!(submitted.body, body); + assert_eq!(submitted.findings, findings); + let reloaded = store.get_by_id("W", "MR").unwrap(); + let saved = reloaded + .thread + .iter() + .find_map(|event| match event { + MergeRequestThreadEvent::Review(review) => Some(review), + _ => None, + }) + .unwrap(); + assert_eq!(saved, &submitted); + } +} + #[test] fn review_submission_authorization_rejects_invalid_grants_before_side_effects() { let (_d, store) = fixture();