From b7d4c5a81f0a008524dcc5b4f286f0cf700013c0 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Mon, 18 Aug 2025 17:25:50 +0100 Subject: feat(list): add PR fetch and checkout support abstracted git remote helper fetch functions added support to `ngit list` to fetch PR data and checkout as proposal branch --- src/lib/git_events.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/lib/git_events.rs') diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs index 5ea630a..56ebcef 100644 --- a/src/lib/git_events.rs +++ b/src/lib/git_events.rs @@ -1,4 +1,4 @@ -use std::{str::FromStr, sync::Arc}; +use std::{collections::HashMap, str::FromStr, sync::Arc}; use anyhow::{Context, Result, bail}; use nostr::{ @@ -15,6 +15,7 @@ use crate::{ client::sign_event, git::{Repo, RepoActions}, repo_ref::RepoRef, + utils::get_open_or_draft_proposals, }; pub fn tag_value(event: &Event, tag_name: &str) -> Result { @@ -925,6 +926,36 @@ pub fn get_status( } } +pub async fn identify_clone_urls_for_oids_from_pr_pr_update_events( + oids: Vec<&String>, + git_repo: &Repo, + repo_ref: &RepoRef, +) -> Result>> { + let mut map: HashMap> = HashMap::new(); + + let open_and_draft_proposals = get_open_or_draft_proposals(git_repo, repo_ref).await?; + + for (_, (_, events)) in open_and_draft_proposals { + for event in events { + if [KIND_PULL_REQUEST, KIND_PULL_REQUEST_UPDATE].contains(&event.kind) { + if let Ok(c) = tag_value(&event, "c") { + if oids.contains(&&c) { + for tag in event.tags.as_slice() { + if tag.kind().eq(&nostr::event::TagKind::Clone) { + for clone_url in tag.as_slice().iter().skip(1) { + map.entry(c.clone()).or_default().push(clone_url.clone()); + } + } + } + } + } + } + } + } + + Ok(map) +} + #[cfg(test)] mod tests { use super::*; -- cgit v1.2.3