From 872eead565416e007ccbab614f0f9b3610fdbea8 Mon Sep 17 00:00:00 2001 From: clover caruso Date: Mon, 5 Oct 2026 00:19:46 -0700 Subject: [PATCH] Read Shale issue status for standard accounts Use the visible sidebar status instead of the repository-owner form. Assisted-by: gpt-6-sol --- dashboard/src/shale.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/dashboard/src/shale.rs b/dashboard/src/shale.rs index df66a472331d41abf10aeba87decdffecb024456..3226ae2bc9368653b5879fc7700d81c436a8ad53 100644 --- a/dashboard/src/shale.rs +++ b/dashboard/src/shale.rs @@ -297,10 +297,14 @@ fn issue(html: &str, repository: &str, id: Option) -> Result { .unwrap_or((None, None)) } else { (None, None) } } else { (None, None) }; - let status = document - .select(&Selector::parse("select[name=status] option[selected]").unwrap()) - .next() - .and_then(|e| e.attr("value")); + let statuses: Vec<_> = document + .select(&Selector::parse("dl.sidebar dd span[class*='issuestatus-']").unwrap()) + .filter_map(|status| status.value().classes().find_map(|class| class.strip_prefix("issuestatus-"))) + .collect(); + let status = match statuses.as_slice() { + [status] => Some(*status), + _ => None, + }; if title.as_ref().is_none_or(|title| title.is_empty()) || issue_id.is_none_or(|n| n == 0 || id.is_some_and(|id| n != id)) || status.is_none() @@ -911,16 +915,20 @@ mod tests { } #[test] fn issue_pages_must_match_repository_identity_and_issue_number() { - let page = "

#3Snow & ☃

"; + let page = "

#3Snow & ☃

"; assert_eq!(issue(page, "owned", Some(3)).unwrap()["title"], "Snow & ☃"); + assert_eq!(issue(page, "owned", Some(3)).unwrap()["status"], "done"); + let owner = format!("{page}
"); + assert_eq!(issue(&owner, "owned", Some(3)).unwrap()["status"], "done"); assert!(issue(page, "other", Some(3)).is_err()); assert!(issue(page, "owned", Some(4)).is_err()); assert!(issue(&page.replace("page-issue", "page-login"), "owned", Some(3)).is_err()); - assert!(issue(&page.replace("selected", ""), "owned", Some(3)).is_err()); + assert!(issue(&page.replace("issuestatus-done", "unknown"), "owned", Some(3)).is_err()); + assert!(issue(&format!("{page}"), "owned", Some(3)).is_err()); } #[test] fn verified_r1616_issue_heading_keeps_identity_checks() { - let page = "

Issue #3: Snow & ☃

"; + let page = "

Issue #3: Snow & ☃

"; assert_eq!(issue(page, "owned", Some(3)).unwrap()["title"], "Snow & ☃"); assert!(issue(page, "other", Some(3)).is_err()); assert!(issue(page, "owned", Some(4)).is_err()); -- 2.54.0