diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-07-18 09:33:48 +0100 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-07-18 09:37:46 +0100 |
| commit | 757c2f888b2be2b37ea01e02a6c020c5f8c7aa9c (patch) | |
| tree | 992e2aa26bf269a8c15c51380d0fcfa48b51fa13 /src/lib | |
| parent | 419b827f7c0d826f5eedf574bce0cf9b85cab4ca (diff) | |
feat: fetch PR and PRUpdate events
as the first stage of adding support
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/client.rs | 45 | ||||
| -rw-r--r-- | src/lib/git_events.rs | 3 |
2 files changed, 39 insertions, 9 deletions
diff --git a/src/lib/client.rs b/src/lib/client.rs index e808bea..ae3b414 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs | |||
| @@ -31,6 +31,7 @@ use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState, P | |||
| 31 | use mockall::*; | 31 | use mockall::*; |
| 32 | use nostr::{ | 32 | use nostr::{ |
| 33 | Event, | 33 | Event, |
| 34 | event::{TagKind, TagStandard}, | ||
| 34 | filter::Alphabet, | 35 | filter::Alphabet, |
| 35 | nips::{nip01::Coordinate, nip19::Nip19Coordinate}, | 36 | nips::{nip01::Coordinate, nip19::Nip19Coordinate}, |
| 36 | signer::SignerBackend, | 37 | signer::SignerBackend, |
| @@ -47,7 +48,8 @@ use crate::{ | |||
| 47 | get_dirs, | 48 | get_dirs, |
| 48 | git::{Repo, RepoActions, get_git_config_item}, | 49 | git::{Repo, RepoActions, get_git_config_item}, |
| 49 | git_events::{ | 50 | git_events::{ |
| 50 | event_is_cover_letter, event_is_patch_set_root, event_is_revision_root, status_kinds, | 51 | KIND_PULL_REQUEST, KIND_PULL_REQUEST_UPDATE, event_is_cover_letter, |
| 52 | event_is_patch_set_root, event_is_revision_root, status_kinds, | ||
| 51 | }, | 53 | }, |
| 52 | login::{get_likely_logged_in_user, user::get_user_ref_from_cache}, | 54 | login::{get_likely_logged_in_user, user::get_user_ref_from_cache}, |
| 53 | repo_ref::RepoRef, | 55 | repo_ref::RepoRef, |
| @@ -1459,7 +1461,7 @@ async fn process_fetched_events( | |||
| 1459 | report.updated_state = Some((event.created_at, event.id)); | 1461 | report.updated_state = Some((event.created_at, event.id)); |
| 1460 | } | 1462 | } |
| 1461 | } | 1463 | } |
| 1462 | } else if event_is_patch_set_root(event) { | 1464 | } else if event_is_patch_set_root(event) || event.kind.eq(&KIND_PULL_REQUEST) { |
| 1463 | fresh_proposal_roots.insert(event.id); | 1465 | fresh_proposal_roots.insert(event.id); |
| 1464 | report.proposals.insert(event.id); | 1466 | report.proposals.insert(event.id); |
| 1465 | if !request.contributors.contains(&event.pubkey) | 1467 | if !request.contributors.contains(&event.pubkey) |
| @@ -1487,12 +1489,23 @@ async fn process_fetched_events( | |||
| 1487 | } | 1489 | } |
| 1488 | for event in &events { | 1490 | for event in &events { |
| 1489 | if !request.existing_events.contains(&event.id) | 1491 | if !request.existing_events.contains(&event.id) |
| 1490 | && !event | 1492 | && (!event |
| 1491 | .tags | 1493 | .tags |
| 1492 | .event_ids() | 1494 | .event_ids() |
| 1493 | .any(|id| report.proposals.contains(id)) | 1495 | .any(|id| report.proposals.contains(id)) |
| 1496 | || event | ||
| 1497 | .tags | ||
| 1498 | .filter_standardized(TagKind::Custom(std::borrow::Cow::Borrowed("E"))) | ||
| 1499 | .filter_map(|t| match t { | ||
| 1500 | TagStandard::Event { event_id, .. } => Some(event_id), | ||
| 1501 | TagStandard::EventReport(event_id, ..) => Some(event_id), | ||
| 1502 | _ => None, | ||
| 1503 | }) | ||
| 1504 | .any(|id| report.proposals.contains(id))) | ||
| 1494 | { | 1505 | { |
| 1495 | if event.kind.eq(&Kind::GitPatch) && !event_is_patch_set_root(event) { | 1506 | if (event.kind.eq(&Kind::GitPatch) && !event_is_patch_set_root(event)) |
| 1507 | || event.kind.eq(&KIND_PULL_REQUEST_UPDATE) | ||
| 1508 | { | ||
| 1496 | report.commits.insert(event.id); | 1509 | report.commits.insert(event.id); |
| 1497 | } else if status_kinds().contains(&event.kind) { | 1510 | } else if status_kinds().contains(&event.kind) { |
| 1498 | report.statuses.insert(event.id); | 1511 | report.statuses.insert(event.id); |
| @@ -1570,7 +1583,7 @@ pub fn get_fetch_filters( | |||
| 1570 | get_filter_state_events(repo_coordinates), | 1583 | get_filter_state_events(repo_coordinates), |
| 1571 | get_filter_repo_events(repo_coordinates), | 1584 | get_filter_repo_events(repo_coordinates), |
| 1572 | nostr::Filter::default() | 1585 | nostr::Filter::default() |
| 1573 | .kinds(vec![Kind::GitPatch, Kind::EventDeletion]) | 1586 | .kinds(vec![Kind::GitPatch, Kind::EventDeletion, KIND_PULL_REQUEST]) |
| 1574 | .custom_tags( | 1587 | .custom_tags( |
| 1575 | SingleLetterTag::lowercase(nostr_sdk::Alphabet::A), | 1588 | SingleLetterTag::lowercase(nostr_sdk::Alphabet::A), |
| 1576 | repo_coordinates | 1589 | repo_coordinates |
| @@ -1584,15 +1597,29 @@ pub fn get_fetch_filters( | |||
| 1584 | vec![] | 1597 | vec![] |
| 1585 | } else { | 1598 | } else { |
| 1586 | vec![ | 1599 | vec![ |
| 1587 | nostr::Filter::default() | 1600 | nostr::Filter::default().events(proposal_ids.clone()).kinds( |
| 1588 | .events(proposal_ids.clone()) | 1601 | [ |
| 1589 | .kinds([vec![Kind::GitPatch, Kind::EventDeletion], status_kinds()].concat()), | 1602 | vec![ |
| 1603 | Kind::GitPatch, | ||
| 1604 | Kind::EventDeletion, | ||
| 1605 | KIND_PULL_REQUEST_UPDATE, | ||
| 1606 | ], | ||
| 1607 | status_kinds(), | ||
| 1608 | ] | ||
| 1609 | .concat(), | ||
| 1610 | ), | ||
| 1590 | nostr::Filter::default() | 1611 | nostr::Filter::default() |
| 1591 | .custom_tags( | 1612 | .custom_tags( |
| 1592 | SingleLetterTag::uppercase(Alphabet::E), | 1613 | SingleLetterTag::uppercase(Alphabet::E), |
| 1593 | proposal_ids.clone(), | 1614 | proposal_ids.clone(), |
| 1594 | ) | 1615 | ) |
| 1595 | .kinds([vec![Kind::GitPatch, Kind::EventDeletion], status_kinds()].concat()), | 1616 | .kinds( |
| 1617 | [ | ||
| 1618 | vec![Kind::EventDeletion, KIND_PULL_REQUEST_UPDATE], | ||
| 1619 | status_kinds(), | ||
| 1620 | ] | ||
| 1621 | .concat(), | ||
| 1622 | ), | ||
| 1596 | ] | 1623 | ] |
| 1597 | }, | 1624 | }, |
| 1598 | if required_profiles.is_empty() { | 1625 | if required_profiles.is_empty() { |
diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs index 69406c1..80793bd 100644 --- a/src/lib/git_events.rs +++ b/src/lib/git_events.rs | |||
| @@ -58,6 +58,9 @@ pub fn status_kinds() -> Vec<Kind> { | |||
| 58 | ] | 58 | ] |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | pub const KIND_PULL_REQUEST: Kind = Kind::Custom(1618); | ||
| 62 | pub const KIND_PULL_REQUEST_UPDATE: Kind = Kind::Custom(1619); | ||
| 63 | |||
| 61 | pub fn event_is_patch_set_root(event: &Event) -> bool { | 64 | pub fn event_is_patch_set_root(event: &Event) -> bool { |
| 62 | event.kind.eq(&Kind::GitPatch) | 65 | event.kind.eq(&Kind::GitPatch) |
| 63 | && event | 66 | && event |