diff --git a/crates/merge-request/src/lib.rs b/crates/merge-request/src/lib.rs index 812dac0d..aab25ac1 100644 --- a/crates/merge-request/src/lib.rs +++ b/crates/merge-request/src/lib.rs @@ -807,14 +807,16 @@ fn truncate_body(value: &mut String) { if value.len() <= MAX_BODY_BYTES { return; } + const MARKER: &str = "\n[truncated]"; + let limit = MAX_BODY_BYTES.saturating_sub(MARKER.len()); let boundary = value .char_indices() .map(|(index, _)| index) - .take_while(|index| *index <= MAX_BODY_BYTES) + .take_while(|index| *index <= limit) .last() .unwrap_or(0); value.truncate(boundary); - value.push_str("\n[truncated]"); + value.push_str(MARKER); } fn bounded_body(name: &str, value: &str) -> Result<(), MergeRequestError> { @@ -889,7 +891,7 @@ fn load_mr(c: &Connection, w: &str, m: &str) -> Result, Mer ticket_ids: tickets, created_at: time(&created)?, updated_at: time(&updated)?, - thread: load_thread(c, w, m, None, 100)?, + thread: load_thread(c, w, m, None, i64::MAX as usize)?, })) } fn load_thread( diff --git a/crates/merge-request/tests/store.rs b/crates/merge-request/tests/store.rs index 24a47e7c..faf230a4 100644 --- a/crates/merge-request/tests/store.rs +++ b/crates/merge-request/tests/store.rs @@ -213,3 +213,23 @@ fn v11_migration_preserves_review_events_and_requires_selector_repair() { .unwrap(); assert!(!old); } + +#[test] +fn authority_reads_full_thread_while_public_pages_remain_bounded() { + let (_d, store) = fixture(); + open(&store); + for index in 0..55 { + approve(&store, "same-subject", &format!("token-{index}")); + } + let mr = store.get("W", "T").unwrap(); + assert!(mr.thread.len() > 100); + assert_eq!( + mr.effective_review("same-subject").unwrap().decision, + ReviewDecision::Approve + ); + assert_eq!(store.thread_page("W", "T", None, 20).unwrap().len(), 20); + assert_eq!( + store.thread_page("W", "T", Some(100), 20).unwrap().len(), + 11 + ); +} diff --git a/crates/workspace-server/src/server.rs b/crates/workspace-server/src/server.rs index 2ec15e45..c66d55c6 100644 --- a/crates/workspace-server/src/server.rs +++ b/crates/workspace-server/src/server.rs @@ -3728,7 +3728,9 @@ async fn scoped_show_merge_request( AxumPath((workspace_id, ticket_id)): AxumPath<(String, String)>, ) -> ApiResult> { let workspace_id = parse_workspace_id(&workspace_id)?; - let mr = merge_request_store(&api, &workspace_id)?.get(&workspace_id, &ticket_id)?; + let store = merge_request_store(&api, &workspace_id)?; + let mut mr = store.get(&workspace_id, &ticket_id)?; + mr.thread = store.thread_page(&workspace_id, &ticket_id, None, 100)?; let reader = api.repository_reader(); let observed_at = Utc::now().to_rfc3339(); let source = match mr.selector_from.as_deref() {