upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/bin/git_remote_nostr
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2024-11-28 16:59:45 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2024-11-28 16:59:45 +0000
commit6bcac672e04cb316de1f952c08b07937c7db3cc6 (patch)
tree351088a937e0d06e87ffe109c565489bf8c16ce2 /src/bin/git_remote_nostr
parent9bee5f12efa5ed751468c68073c9122e12c22b5f (diff)
feat(push): update repo ann with maintainers.yaml
update the repo announcement event based on any updates to maintainers.yaml that are included in commits pushed to 'main' or 'master'
Diffstat (limited to 'src/bin/git_remote_nostr')
-rw-r--r--src/bin/git_remote_nostr/push.rs85
1 files changed, 83 insertions, 2 deletions
diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs
index d8ba65a..5b02483 100644
--- a/src/bin/git_remote_nostr/push.rs
+++ b/src/bin/git_remote_nostr/push.rs
@@ -27,11 +27,13 @@ use ngit::{
27 }, 27 },
28 git_events::{self, get_event_root}, 28 git_events::{self, get_event_root},
29 login::{self, get_curent_user}, 29 login::{self, get_curent_user},
30 repo_ref, repo_state, 30 repo_ref::{self, get_repo_config_from_yaml},
31 repo_state,
31}; 32};
32use nostr::nips::nip10::Marker; 33use nostr::nips::nip10::Marker;
33use nostr_sdk::{ 34use nostr_sdk::{
34 hashes::sha1::Hash as Sha1Hash, Event, EventBuilder, EventId, Kind, NostrSigner, PublicKey, Tag, 35 hashes::sha1::Hash as Sha1Hash, Event, EventBuilder, EventId, Kind, NostrSigner, PublicKey,
36 RelayUrl, Tag,
35}; 37};
36use repo_ref::RepoRef; 38use repo_ref::RepoRef;
37use repo_state::RepoState; 39use repo_state::RepoState;
@@ -170,6 +172,19 @@ pub async fn run_push(
170 { 172 {
171 events.push(event); 173 events.push(event);
172 } 174 }
175
176 if let Some(repo_ref_event) = get_maintainers_yaml_update(
177 &term,
178 repo_ref,
179 git_repo,
180 &decoded_nostr_url.original_string,
181 &signer,
182 &git_server_refspecs,
183 )
184 .await?
185 {
186 events.push(repo_ref_event);
187 }
173 } 188 }
174 189
175 let mut rejected_proposal_refspecs = vec![]; 190 let mut rejected_proposal_refspecs = vec![];
@@ -863,6 +878,72 @@ fn generate_updated_state(
863 Ok(new_state) 878 Ok(new_state)
864} 879}
865 880
881async fn get_maintainers_yaml_update(
882 term: &console::Term,
883 repo_ref: &RepoRef,
884 git_repo: &Repo,
885 remote_nostr_url: &str,
886 signer: &Arc<dyn NostrSigner>,
887 refspecs_to_git_server: &Vec<String>,
888) -> Result<Option<Event>> {
889 for refspec in refspecs_to_git_server {
890 let (from, to) = refspec_to_from_to(refspec)?;
891 if to.eq("refs/heads/main") || to.eq("refs/heads/master") {
892 let tip_of_pushed_branch = git_repo.get_commit_or_tip_of_reference(from)?;
893 let tip_of_remote_branch = git_repo.get_commit_or_tip_of_reference(
894 &refspec_remote_ref_name(&git_repo.git_repo, refspec, remote_nostr_url)?,
895 )?;
896 let diff = git_repo.git_repo.diff_tree_to_tree(
897 Some(
898 &git_repo
899 .git_repo
900 .find_commit(sha1_to_oid(&tip_of_pushed_branch)?)?
901 .tree()?,
902 ),
903 Some(
904 &git_repo
905 .git_repo
906 .find_commit(sha1_to_oid(&tip_of_remote_branch)?)?
907 .tree()?,
908 ),
909 None,
910 )?;
911 for delta in diff.deltas() {
912 // File was added or updated
913 if let Some(path) = delta.new_file().path() {
914 if path.to_string_lossy() == "maintainers.yaml" {
915 let config = get_repo_config_from_yaml(git_repo)?;
916 if config.identifier == Some(repo_ref.identifier.clone())
917 || config.identifier.is_none()
918 {
919 let config_maintainers = config
920 .maintainers
921 .iter()
922 .filter_map(|s| PublicKey::parse(s).ok())
923 .collect::<Vec<PublicKey>>();
924 let config_relays = config
925 .relays
926 .iter()
927 .filter_map(|s| RelayUrl::parse(s).ok())
928 .collect::<Vec<RelayUrl>>();
929 if repo_ref.maintainers != config_maintainers
930 || repo_ref.relays != config_relays
931 {
932 let mut repo_ref = repo_ref.clone();
933 repo_ref.maintainers = config_maintainers;
934 repo_ref.relays = config_relays;
935 term.write_line("maintainers.yaml update detected so publishing repo announcement update")?;
936 return Ok(Some(repo_ref.to_event(signer).await?));
937 }
938 }
939 }
940 }
941 }
942 }
943 }
944 Ok(None)
945}
946
866async fn get_merged_status_events( 947async fn get_merged_status_events(
867 term: &console::Term, 948 term: &console::Term,
868 repo_ref: &RepoRef, 949 repo_ref: &RepoRef,