diff --git a/src/github.rs b/src/github.rs index d6a92688..e878a1d7 100644 --- a/src/github.rs +++ b/src/github.rs @@ -416,6 +416,18 @@ pub enum ReportedContentClassifiers { Spam, } +#[derive(Debug, serde::Deserialize, serde::Serialize, Eq, PartialEq)] +pub enum LockReason { + #[serde(rename = "off-topic")] + OffTopic, + #[serde(rename = "too heated")] + TooHeated, + #[serde(rename = "resolved")] + Resolved, + #[serde(rename = "spam")] + Spam, +} + #[derive(Debug, serde::Deserialize, Eq, PartialEq)] #[serde(rename_all = "snake_case")] pub enum PullRequestReviewState { @@ -855,6 +867,36 @@ impl Issue { Ok(()) } + /// Lock an issue with an optional reason. + pub async fn lock( + &self, + client: &GithubClient, + reason: Option, + ) -> anyhow::Result<()> { + let lock_url = format!( + "{}/issues/{}/lock", + self.repository().url(client), + self.number + ); + #[derive(serde::Serialize)] + struct LockReasonIssue { + lock_reason: LockReason, + } + client + .send_req({ + let req = client.put(&lock_url); + + if let Some(lock_reason) = reason { + req.json(&LockReasonIssue { lock_reason }) + } else { + req + } + }) + .await + .context("failed to lock issue")?; + Ok(()) + } + pub async fn close(&self, client: &GithubClient) -> anyhow::Result<()> { let edit_url = format!("{}/issues/{}", self.repository().url(client), self.number); #[derive(serde::Serialize)] diff --git a/src/handlers/major_change.rs b/src/handlers/major_change.rs index 0678ea42..834bda4c 100644 --- a/src/handlers/major_change.rs +++ b/src/handlers/major_change.rs @@ -294,6 +294,10 @@ async fn handle( .post_comment(&ctx.github, &comment) .await .context("post major change comment")?; + issue + .lock(&ctx.github, None) + .await + .context("lock major change issue")?; } let zulip_req = zulip_req.send(&ctx.github.raw());