From bbc00edc6508ea1910c4d9e6a272f7859900950d Mon Sep 17 00:00:00 2001 From: seth Date: Fri, 16 Aug 2024 22:14:16 -0400 Subject: end of summer refactor (#31) * crates: `bot-*` -> `discord-bot` I didn't really need all these crates to be split :/ * discord-bot: revamp http impl also handles the new errors reported by teawieAPI * crates: split http backend this can be reused easily * git-tracker: short-circuit boolean logic We don't need to check if the commit is a descendant of the HEAD of the branch if it *is* the HEAD * nix: fenix -> nixpkgs * treefmt: add actionlint * nix: use docker arch names for containers * ci: use actions-rust-lang actions * nix: drop ci dev shell * git-tracker: init ManagedRepository this logic can be shared * ci: use nix for clippy scan * discord-bot: better handle unmerged PRs * ci: fix treefmt check * nix: fix clippy check * .env.template: update crate names * git-tracker: use remote name for remote name i was half asleep * discord-bot: handle merged PRs that aren't found in any tracked branches * git-tracker: make collect_statuses_in() return a Vec * discord-bot: add more PR info with response fixes #18 --- crates/bot-commands/src/track.rs | 121 --------------------------------------- 1 file changed, 121 deletions(-) delete mode 100644 crates/bot-commands/src/track.rs (limited to 'crates/bot-commands/src/track.rs') 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, -) -> Result, 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), - ) -} -- cgit v1.2.3