diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bin/git_remote_nostr/push.rs | 85 | ||||
| -rw-r--r-- | src/lib/repo_ref.rs | 2 |
2 files changed, 84 insertions, 3 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 | }; |
| 32 | use nostr::nips::nip10::Marker; | 33 | use nostr::nips::nip10::Marker; |
| 33 | use nostr_sdk::{ | 34 | use 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 | }; |
| 36 | use repo_ref::RepoRef; | 38 | use repo_ref::RepoRef; |
| 37 | use repo_state::RepoState; | 39 | use 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 | ||
| 881 | async 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 | |||
| 866 | async fn get_merged_status_events( | 947 | async fn get_merged_status_events( |
| 867 | term: &console::Term, | 948 | term: &console::Term, |
| 868 | repo_ref: &RepoRef, | 949 | repo_ref: &RepoRef, |
diff --git a/src/lib/repo_ref.rs b/src/lib/repo_ref.rs index 8319c78..aa7a1d2 100644 --- a/src/lib/repo_ref.rs +++ b/src/lib/repo_ref.rs | |||
| @@ -20,7 +20,7 @@ use crate::{ | |||
| 20 | git::{nostr_url::NostrUrlDecoded, Repo, RepoActions}, | 20 | git::{nostr_url::NostrUrlDecoded, Repo, RepoActions}, |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | #[derive(Default)] | 23 | #[derive(Default, Clone)] |
| 24 | pub struct RepoRef { | 24 | pub struct RepoRef { |
| 25 | pub name: String, | 25 | pub name: String, |
| 26 | pub description: String, | 26 | pub description: String, |