summaryrefslogtreecommitdiff
path: root/crates/bot-commands/src/track.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/bot-commands/src/track.rs')
-rw-r--r--crates/bot-commands/src/track.rs121
1 files changed, 0 insertions, 121 deletions
diff --git a/crates/bot-commands/src/track.rs b/crates/bot-commands/src/track.rs
deleted file mode 100644
index 1f22d0e..0000000
--- a/crates/bot-commands/src/track.rs
+++ /dev/null
@@ -1,121 +0,0 @@
-use bot_config::Config;
-use bot_consts::{NIXPKGS_REMOTE, NIXPKGS_URL};
-use bot_error::Error;
-use bot_http::{self as http, GithubClientExt};
-use git_tracker::Tracker;
-
-use log::trace;
-use serenity::all::CreateEmbed;
-use serenity::builder::{CreateCommand, CreateCommandOption, CreateInteractionResponseFollowup};
-use serenity::model::application::{
- CommandInteraction, CommandOptionType, InstallationContext, ResolvedOption, ResolvedValue,
-};
-use serenity::prelude::Context;
-
-const REPO_OWNER: &str = "NixOS";
-const REPO_NAME: &str = "nixpkgs";
-
-/// Collect the status of the commit SHA [`commit_sha`] in each of the nixpkgs
-/// branches in [`branches`], using the repository at path [`repository_path`]
-///
-/// # Errors
-///
-/// Will return [`Err`] if we can't start tracking a repository at the given path,
-/// or if we can't determine if the branch has given commit
-fn collect_statuses_in<'a>(
- repository_path: &str,
- commit_sha: &str,
- branches: impl IntoIterator<Item = &'a String>,
-) -> Result<Vec<String>, Error> {
- // start tracking nixpkgs
- let tracker = Tracker::from_path(repository_path)?;
-
- // check to see what branches it's in
- let mut status_results = vec![];
- for branch_name in branches {
- trace!("Checking for commit in {branch_name}");
- let full_branch_name = format!("{NIXPKGS_REMOTE}/{branch_name}");
- let has_pr = tracker.branch_contains_sha(&full_branch_name, commit_sha)?;
-
- if has_pr {
- status_results.push(format!("`{branch_name}` ✅"));
- }
- }
-
- Ok(status_results)
-}
-
-pub async fn respond(
- ctx: &Context,
- http: &http::Client,
- config: &Config,
- command: &CommandInteraction,
-) -> Result<(), Error> {
- // this will probably take a while
- command.defer(&ctx).await?;
-
- let options = command.data.options();
- let Some(ResolvedOption {
- value: ResolvedValue::Integer(pr),
- ..
- }) = options.first()
- else {
- let resp = CreateInteractionResponseFollowup::new()
- .content("Please provide a valid pull request!");
- command.create_followup(&ctx, resp).await?;
-
- return Ok(());
- };
-
- let Ok(pr_id) = u64::try_from(*pr) else {
- let resp =
- CreateInteractionResponseFollowup::new().content("PR numbers aren't negative...");
- command.create_followup(&ctx, resp).await?;
-
- return Ok(());
- };
-
- // find out what commit our PR was merged in
- let Some(commit_sha) = http.merge_commit_for(REPO_OWNER, REPO_NAME, pr_id).await? else {
- let response = CreateInteractionResponseFollowup::new()
- .content("It seems this pull request is very old. I can't track it");
- command.create_followup(&ctx, response).await?;
-
- return Ok(());
- };
-
- let status_results = collect_statuses_in(
- &config.nixpkgs_path,
- &commit_sha,
- config.nixpkgs_branches.iter(),
- )?;
-
- // if we don't find the commit in any branches from above, we can pretty safely assume
- // it's an unmerged PR
- let embed_description: String = if status_results.is_empty() {
- "It doesn't look like this PR has been merged yet! (or maybe I just haven't updated)"
- .to_string()
- } else {
- status_results.join("\n")
- };
-
- let embed = CreateEmbed::new()
- .title(format!("Nixpkgs PR #{} Status", *pr))
- .url(format!("{NIXPKGS_URL}/pull/{pr}"))
- .description(embed_description);
-
- let resp = CreateInteractionResponseFollowup::new().embed(embed);
- command.create_followup(&ctx, resp).await?;
-
- Ok(())
-}
-
-pub fn register() -> CreateCommand {
- CreateCommand::new("track")
- .description("Track a nixpkgs PR")
- .add_integration_type(InstallationContext::User)
- .add_option(
- CreateCommandOption::new(CommandOptionType::Integer, "pull_request", "PR to track")
- .required(true),
- )
-}