ticket: move ticket settings into workspace config
This commit is contained in:
@@ -94,13 +94,13 @@ fn ensure_and_restore_use_configured_orchestration_layout() {
|
||||
write_test_ticket_config(
|
||||
&root,
|
||||
r#"
|
||||
[orchestration]
|
||||
[ticket.orchestration]
|
||||
branch = "orchestration/custom-panel"
|
||||
worktree_dir = "custom-worktrees"
|
||||
worktree_name = "panel"
|
||||
"#,
|
||||
);
|
||||
run_test_git(&root, &["add", ".yoi/ticket.config.toml"]).unwrap();
|
||||
run_test_git(&root, &["add", ".yoi/workspace.toml"]).unwrap();
|
||||
run_test_git(&root, &["commit", "-m", "ticket config"]).unwrap();
|
||||
|
||||
let resolved = resolved_orchestration_worktree_layout(&root).unwrap();
|
||||
@@ -126,7 +126,7 @@ fn invalid_configured_orchestration_branch_is_rejected_before_git_worktree_opera
|
||||
write_test_ticket_config(
|
||||
&root,
|
||||
r#"
|
||||
[orchestration]
|
||||
[ticket.orchestration]
|
||||
branch = "orchestration/bad:branch"
|
||||
"#,
|
||||
);
|
||||
@@ -145,11 +145,11 @@ fn restore_rejects_mismatched_configured_orchestration_branch_without_checkout()
|
||||
write_test_ticket_config(
|
||||
&root,
|
||||
r#"
|
||||
[orchestration]
|
||||
[ticket.orchestration]
|
||||
branch = "orchestration/custom-panel"
|
||||
"#,
|
||||
);
|
||||
run_test_git(&root, &["add", ".yoi/ticket.config.toml"]).unwrap();
|
||||
run_test_git(&root, &["add", ".yoi/workspace.toml"]).unwrap();
|
||||
run_test_git(&root, &["commit", "-m", "ticket config"]).unwrap();
|
||||
let layout = resolved_orchestration_worktree_layout(&root).unwrap();
|
||||
run_test_git(
|
||||
@@ -259,7 +259,7 @@ fn existing_unrelated_repo_with_expected_branch_is_rejected_without_cleanup() {
|
||||
fn write_test_ticket_config(root: &Path, content: &str) {
|
||||
let config_dir = root.join(".yoi");
|
||||
std::fs::create_dir_all(&config_dir).unwrap();
|
||||
std::fs::write(config_dir.join("ticket.config.toml"), content).unwrap();
|
||||
std::fs::write(config_dir.join("workspace.toml"), content).unwrap();
|
||||
}
|
||||
|
||||
fn init_test_repo(root: &Path) {
|
||||
@@ -337,8 +337,8 @@ fn ticket_workspace(
|
||||
)
|
||||
.unwrap();
|
||||
fs::write(
|
||||
temp.path().join(".yoi/ticket.config.toml"),
|
||||
"[backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
temp.path().join(".yoi/workspace.toml"),
|
||||
"[ticket]\n\n[ticket.backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
)
|
||||
.unwrap();
|
||||
let backend = LocalTicketBackend::new(temp.path().join(".yoi/tickets"));
|
||||
@@ -712,7 +712,7 @@ async fn ticket_close_action_blocks_non_done_ticket_without_mutation() {
|
||||
#[tokio::test]
|
||||
async fn ticket_action_rejects_stale_absent_config_without_mutation() {
|
||||
let (temp, ticket_id, backend) = ready_ticket_workspace("panel-no-config");
|
||||
fs::remove_file(temp.path().join(".yoi/ticket.config.toml")).unwrap();
|
||||
fs::remove_file(temp.path().join(".yoi/workspace.toml")).unwrap();
|
||||
|
||||
let error =
|
||||
dispatch_ticket_action(request_for(&temp, ticket_id.clone(), NextUserAction::Queue))
|
||||
@@ -1059,8 +1059,8 @@ fn dashboard_ticket_action_rows_precede_pods_and_pod_actions_still_work() {
|
||||
let temp = TempDir::new().unwrap();
|
||||
fs::create_dir_all(temp.path().join(".yoi")).unwrap();
|
||||
fs::write(
|
||||
temp.path().join(".yoi/ticket.config.toml"),
|
||||
"[backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
temp.path().join(".yoi/workspace.toml"),
|
||||
"[ticket]\n\n[ticket.backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
)
|
||||
.unwrap();
|
||||
let backend = LocalTicketBackend::new(temp.path().join(".yoi/tickets"));
|
||||
|
||||
@@ -7,7 +7,7 @@ use std::time::Instant;
|
||||
use protocol::WorkerStatus;
|
||||
use ticket::config::{
|
||||
DEFAULT_TICKET_BACKEND_RELATIVE_PATH, TICKET_CONFIG_RELATIVE_PATH, TicketConfig,
|
||||
TicketOrchestrationConfig,
|
||||
TicketOrchestrationConfig, WORKSPACE_SETTINGS_RELATIVE_PATH,
|
||||
};
|
||||
use ticket::{
|
||||
LocalTicketBackend, TicketBackend, TicketError, TicketEvent, TicketFilter, TicketIdOrSlug,
|
||||
@@ -567,8 +567,41 @@ pub(crate) fn decide_orchestrator_lifecycle(
|
||||
}
|
||||
|
||||
pub(crate) fn ticket_config_availability(workspace_root: &Path) -> TicketConfigAvailability {
|
||||
let config_path = workspace_root.join(TICKET_CONFIG_RELATIVE_PATH);
|
||||
match config_path.symlink_metadata() {
|
||||
let settings_path = workspace_root.join(WORKSPACE_SETTINGS_RELATIVE_PATH);
|
||||
match settings_path.symlink_metadata() {
|
||||
Ok(metadata) if !metadata.is_file() => TicketConfigAvailability::Unusable(format!(
|
||||
"{} exists but is not a regular file",
|
||||
WORKSPACE_SETTINGS_RELATIVE_PATH
|
||||
)),
|
||||
Ok(_) => match std::fs::read_to_string(&settings_path) {
|
||||
Ok(content) => {
|
||||
match TicketConfig::workspace_settings_has_ticket_config(&settings_path, &content) {
|
||||
Ok(true) => match TicketConfig::load_workspace(workspace_root) {
|
||||
Ok(_) => TicketConfigAvailability::Usable,
|
||||
Err(error) => TicketConfigAvailability::Unusable(error.to_string()),
|
||||
},
|
||||
Ok(false) => legacy_ticket_config_availability(workspace_root),
|
||||
Err(error) => TicketConfigAvailability::Unusable(error.to_string()),
|
||||
}
|
||||
}
|
||||
Err(error) => TicketConfigAvailability::Unusable(format!(
|
||||
"could not read {}: {error}",
|
||||
WORKSPACE_SETTINGS_RELATIVE_PATH
|
||||
)),
|
||||
},
|
||||
Err(error) if error.kind() == std::io::ErrorKind::NotFound => {
|
||||
legacy_ticket_config_availability(workspace_root)
|
||||
}
|
||||
Err(error) => TicketConfigAvailability::Unusable(format!(
|
||||
"could not inspect {}: {error}",
|
||||
WORKSPACE_SETTINGS_RELATIVE_PATH
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
fn legacy_ticket_config_availability(workspace_root: &Path) -> TicketConfigAvailability {
|
||||
let legacy_path = workspace_root.join(TICKET_CONFIG_RELATIVE_PATH);
|
||||
match legacy_path.symlink_metadata() {
|
||||
Ok(metadata) if !metadata.is_file() => TicketConfigAvailability::Unusable(format!(
|
||||
"{} exists but is not a regular file",
|
||||
TICKET_CONFIG_RELATIVE_PATH
|
||||
@@ -1766,8 +1799,8 @@ mod tests {
|
||||
let config_dir = workspace_root.join(".yoi");
|
||||
fs::create_dir_all(&config_dir).unwrap();
|
||||
fs::write(
|
||||
config_dir.join("ticket.config.toml"),
|
||||
"[backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
config_dir.join("workspace.toml"),
|
||||
"[ticket]\n\n[ticket.backend]\nprovider = \"builtin:yoi_local\"\nroot = \".yoi/tickets\"\n",
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
@@ -2233,8 +2266,8 @@ mod tests {
|
||||
let config_dir = temp.path().join(".yoi");
|
||||
fs::create_dir_all(&config_dir).unwrap();
|
||||
fs::write(
|
||||
config_dir.join("ticket.config.toml"),
|
||||
"[backend]\nprovider = \"unknown:provider\"\nroot = \".yoi/tickets\"\n",
|
||||
config_dir.join("workspace.toml"),
|
||||
"[ticket]\n\n[ticket.backend]\nprovider = \"unknown:provider\"\nroot = \".yoi/tickets\"\n",
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
@@ -2678,11 +2711,11 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn existing_non_file_ticket_config_is_unusable_not_absent() {
|
||||
fn existing_non_file_workspace_settings_is_unusable_not_absent() {
|
||||
let temp = TempDir::new().unwrap();
|
||||
let config_parent = temp.path().join(".yoi");
|
||||
fs::create_dir_all(&config_parent).unwrap();
|
||||
fs::create_dir(config_parent.join("ticket.config.toml")).unwrap();
|
||||
fs::create_dir(config_parent.join("workspace.toml")).unwrap();
|
||||
|
||||
assert!(matches!(
|
||||
ticket_config_availability(temp.path()),
|
||||
|
||||
Reference in New Issue
Block a user