glacier.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //! Allows team members to directly create a glacier PR with the code provided.
  2. use crate::{config::GlacierConfig, github::Event, handlers::Context};
  3. use octocrab::models::Object;
  4. use octocrab::params::repos::Reference;
  5. use parser::command::glacier::GlacierCommand;
  6. pub(super) async fn handle_command(
  7. ctx: &Context,
  8. _config: &GlacierConfig,
  9. event: &Event,
  10. cmd: GlacierCommand,
  11. ) -> anyhow::Result<()> {
  12. let is_team_member = event
  13. .user()
  14. .is_team_member(&ctx.github)
  15. .await
  16. .unwrap_or(false);
  17. if !is_team_member {
  18. return Ok(());
  19. };
  20. let body = ctx
  21. .github
  22. .raw_gist_from_url(&cmd.source, "playground.rs")
  23. .await?;
  24. let number = event.issue().unwrap().number;
  25. let user = event.user();
  26. let octocrab = &ctx.octocrab;
  27. let fork = octocrab.repos("rustbot", "glacier");
  28. let base = octocrab.repos("rust-lang", "glacier");
  29. let master = base
  30. .get_ref(&Reference::Branch("master".to_string()))
  31. .await?
  32. .object;
  33. let master = if let Object::Commit { sha, .. } = master {
  34. sha
  35. } else {
  36. log::error!("invalid commit sha - master {:?}", master);
  37. unreachable!()
  38. };
  39. fork.create_ref(
  40. &Reference::Branch(format!("triagebot-ice-{}", number)),
  41. master,
  42. )
  43. .await?;
  44. fork.create_file(
  45. format!("ices/{}.rs", number),
  46. format!("Add ICE reproduction for issue rust-lang/rust#{}.", number),
  47. body,
  48. )
  49. .branch(format!("triagebot-ice-{}", number))
  50. .send()
  51. .await?;
  52. octocrab
  53. .pulls("rust-lang", "glacier")
  54. .create(
  55. format!("ICE - rust-lang/rust#{}", number),
  56. format!("rustbot:triagebot-ice-{}", number),
  57. "master",
  58. )
  59. .body(format!(
  60. "Automatically created by @{} in issue rust-lang/rust#{}",
  61. user.login, number
  62. ))
  63. .send()
  64. .await?;
  65. Ok(())
  66. }