milestone_prs.rs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use crate::{
  2. github::{Event, IssuesAction},
  3. handlers::Context,
  4. };
  5. use anyhow::Context as _;
  6. use reqwest::StatusCode;
  7. pub async fn handle(ctx: &Context, event: &Event) -> anyhow::Result<()> {
  8. let e = if let Event::Issue(e) = event {
  9. e
  10. } else {
  11. return Ok(());
  12. };
  13. // Only trigger on closed issues
  14. if e.action != IssuesAction::Closed {
  15. return Ok(());
  16. }
  17. let repo = e.issue.repository();
  18. if !(repo.organization == "rust-lang" && repo.repository == "rust") {
  19. return Ok(());
  20. }
  21. if !e.issue.merged {
  22. log::trace!(
  23. "Ignoring closing of rust-lang/rust#{}: not merged",
  24. e.issue.number
  25. );
  26. return Ok(());
  27. }
  28. let merge_sha = if let Some(s) = &e.issue.merge_commit_sha {
  29. s
  30. } else {
  31. log::error!(
  32. "rust-lang/rust#{}: no merge_commit_sha in event",
  33. e.issue.number
  34. );
  35. return Ok(());
  36. };
  37. // Fetch the version from the upstream repository.
  38. let version = if let Some(version) = get_version_standalone(ctx, merge_sha).await? {
  39. version
  40. } else {
  41. log::error!("could not find the version of {:?}", merge_sha);
  42. return Ok(());
  43. };
  44. if !version.starts_with("1.") && version.len() < 8 {
  45. log::error!("Weird version {:?} for {:?}", version, merge_sha);
  46. return Ok(());
  47. }
  48. // Associate this merged PR with the version it merged into.
  49. //
  50. // Note that this should work for rollup-merged PRs too. It will *not*
  51. // auto-update when merging a beta-backport, for example, but that seems
  52. // fine; we can manually update without too much trouble in that case, and
  53. // eventually automate it separately.
  54. e.issue.set_milestone(&ctx.github, &version).await?;
  55. Ok(())
  56. }
  57. async fn get_version_standalone(ctx: &Context, merge_sha: &str) -> anyhow::Result<Option<String>> {
  58. let resp = ctx
  59. .github
  60. .raw()
  61. .get(&format!(
  62. "https://raw.githubusercontent.com/rust-lang/rust/{}/src/version",
  63. merge_sha
  64. ))
  65. .send()
  66. .await
  67. .with_context(|| format!("retrieving src/version for {}", merge_sha))?;
  68. match resp.status() {
  69. StatusCode::OK => {}
  70. // Don't treat a 404 as a failure, we'll try another way to retrieve the version.
  71. StatusCode::NOT_FOUND => return Ok(None),
  72. status => anyhow::bail!(
  73. "unexpected status code {} while retrieving src/version for {}",
  74. status,
  75. merge_sha
  76. ),
  77. }
  78. Ok(Some(
  79. resp.text()
  80. .await
  81. .with_context(|| format!("deserializing src/version for {}", merge_sha))?
  82. .trim()
  83. .to_string(),
  84. ))
  85. }