huskies: merge 984
This commit is contained in:
@@ -54,7 +54,8 @@ pub use types::{
|
||||
pub use write::{
|
||||
bump_retry_count, migrate_legacy_stage_strings, migrate_merge_job, migrate_names_from_slugs,
|
||||
migrate_story_ids_to_numeric, name_from_story_id, set_agent, set_depends_on, set_epic,
|
||||
set_item_type, set_name, set_qa_mode, set_resume_to, set_retry_count, write_item,
|
||||
set_item_type, set_name, set_qa_mode, set_resume_to, set_resume_to_raw, set_retry_count,
|
||||
write_item,
|
||||
};
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -487,6 +487,15 @@ fn project_stage_for_view(
|
||||
archived_at: Utc::now(),
|
||||
reason: ArchiveReason::Completed,
|
||||
}),
|
||||
"abandoned" => Some(Stage::Abandoned { ts: Utc::now() }),
|
||||
"superseded" => Some(Stage::Superseded {
|
||||
ts: Utc::now(),
|
||||
superseded_by: crate::pipeline_state::StoryId(resume_to.unwrap_or("").to_string()),
|
||||
}),
|
||||
"rejected" => Some(Stage::Rejected {
|
||||
ts: Utc::now(),
|
||||
reason: resume_to.unwrap_or("").to_string(),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -504,7 +513,14 @@ pub fn dep_is_done_crdt(dep_number: u32) -> bool {
|
||||
let prefix = format!("{dep_number}_");
|
||||
read_all_typed().into_iter().any(|item| {
|
||||
(item.story_id.0 == exact || item.story_id.0.starts_with(&prefix))
|
||||
&& matches!(item.stage, Stage::Done { .. } | Stage::Archived { .. })
|
||||
&& matches!(
|
||||
item.stage,
|
||||
Stage::Done { .. }
|
||||
| Stage::Archived { .. }
|
||||
| Stage::Abandoned { .. }
|
||||
| Stage::Superseded { .. }
|
||||
| Stage::Rejected { .. }
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -520,7 +536,13 @@ pub fn dep_is_archived_crdt(dep_number: u32) -> bool {
|
||||
let prefix = format!("{dep_number}_");
|
||||
read_all_typed().into_iter().any(|item| {
|
||||
(item.story_id.0 == exact || item.story_id.0.starts_with(&prefix))
|
||||
&& matches!(item.stage, Stage::Archived { .. })
|
||||
&& matches!(
|
||||
item.stage,
|
||||
Stage::Archived { .. }
|
||||
| Stage::Abandoned { .. }
|
||||
| Stage::Superseded { .. }
|
||||
| Stage::Rejected { .. }
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -92,6 +92,10 @@ pub struct PipelineItemCrdt {
|
||||
/// `Stage::ReviewHold` variants. Stored as a clean wire-form stage
|
||||
/// name (e.g. `"coding"`, `"qa"`). Empty string means "no resume target
|
||||
/// stored" (defaults to `Coding` on read).
|
||||
/// Story 984: also reused to carry `superseded_by` (story ID) when the
|
||||
/// stage is `"superseded"`, and the rejection `reason` when the stage is
|
||||
/// `"rejected"`. These stages never have a resume target, so the
|
||||
/// register is exclusively available for their metadata.
|
||||
pub resume_to: LwwRegisterCrdt<String>,
|
||||
}
|
||||
|
||||
|
||||
@@ -111,6 +111,30 @@ pub fn set_resume_to(story_id: &str, stage: &Stage) -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
/// Set the `resume_to` CRDT register to an arbitrary raw string.
|
||||
///
|
||||
/// Story 984: reuses `resume_to` to carry metadata for `Superseded`
|
||||
/// (`superseded_by` story ID) and `Rejected` (`reason` string). These
|
||||
/// stages never have a resume target, so the register is exclusively
|
||||
/// available for their metadata.
|
||||
///
|
||||
/// Returns `true` if the item was found and the op was applied.
|
||||
pub fn set_resume_to_raw(story_id: &str, value: &str) -> bool {
|
||||
let Some(state_mutex) = get_crdt() else {
|
||||
return false;
|
||||
};
|
||||
let Ok(mut state) = state_mutex.lock() else {
|
||||
return false;
|
||||
};
|
||||
let Some(&idx) = state.index.get(story_id) else {
|
||||
return false;
|
||||
};
|
||||
apply_and_persist(&mut state, |s| {
|
||||
s.crdt.doc.items[idx].resume_to.set(value.to_string())
|
||||
});
|
||||
true
|
||||
}
|
||||
|
||||
/// Set the `name` field for a pipeline item by its story ID.
|
||||
///
|
||||
/// `Some(name)` writes the human-readable name into the CRDT register.
|
||||
|
||||
@@ -11,7 +11,7 @@ mod tests;
|
||||
|
||||
pub use item::{
|
||||
bump_retry_count, set_agent, set_depends_on, set_epic, set_item_type, set_name, set_qa_mode,
|
||||
set_resume_to, set_retry_count, write_item,
|
||||
set_resume_to, set_resume_to_raw, set_retry_count, write_item,
|
||||
};
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
Reference in New Issue
Block a user