fix: separate merge request authority from thread projection
This commit is contained in:
@@ -807,14 +807,16 @@ fn truncate_body(value: &mut String) {
|
|||||||
if value.len() <= MAX_BODY_BYTES {
|
if value.len() <= MAX_BODY_BYTES {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const MARKER: &str = "\n[truncated]";
|
||||||
|
let limit = MAX_BODY_BYTES.saturating_sub(MARKER.len());
|
||||||
let boundary = value
|
let boundary = value
|
||||||
.char_indices()
|
.char_indices()
|
||||||
.map(|(index, _)| index)
|
.map(|(index, _)| index)
|
||||||
.take_while(|index| *index <= MAX_BODY_BYTES)
|
.take_while(|index| *index <= limit)
|
||||||
.last()
|
.last()
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
value.truncate(boundary);
|
value.truncate(boundary);
|
||||||
value.push_str("\n[truncated]");
|
value.push_str(MARKER);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bounded_body(name: &str, value: &str) -> Result<(), MergeRequestError> {
|
fn bounded_body(name: &str, value: &str) -> Result<(), MergeRequestError> {
|
||||||
@@ -889,7 +891,7 @@ fn load_mr(c: &Connection, w: &str, m: &str) -> Result<Option<MergeRequest>, Mer
|
|||||||
ticket_ids: tickets,
|
ticket_ids: tickets,
|
||||||
created_at: time(&created)?,
|
created_at: time(&created)?,
|
||||||
updated_at: time(&updated)?,
|
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(
|
fn load_thread(
|
||||||
|
|||||||
@@ -213,3 +213,23 @@ fn v11_migration_preserves_review_events_and_requires_selector_repair() {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert!(!old);
|
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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -3728,7 +3728,9 @@ async fn scoped_show_merge_request(
|
|||||||
AxumPath((workspace_id, ticket_id)): AxumPath<(String, String)>,
|
AxumPath((workspace_id, ticket_id)): AxumPath<(String, String)>,
|
||||||
) -> ApiResult<Json<serde_json::Value>> {
|
) -> ApiResult<Json<serde_json::Value>> {
|
||||||
let workspace_id = parse_workspace_id(&workspace_id)?;
|
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 reader = api.repository_reader();
|
||||||
let observed_at = Utc::now().to_rfc3339();
|
let observed_at = Utc::now().to_rfc3339();
|
||||||
let source = match mr.selector_from.as_deref() {
|
let source = match mr.selector_from.as_deref() {
|
||||||
|
|||||||
Reference in New Issue
Block a user