upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/bin/ngit/sub_commands/send.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/ngit/sub_commands/send.rs')
-rw-r--r--src/bin/ngit/sub_commands/send.rs64
1 files changed, 49 insertions, 15 deletions
diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs
index 0aefb03..69ad1e6 100644
--- a/src/bin/ngit/sub_commands/send.rs
+++ b/src/bin/ngit/sub_commands/send.rs
@@ -1,11 +1,13 @@
1use std::path::Path; 1use std::{path::Path, str::FromStr};
2 2
3use anyhow::{Context, Result, bail}; 3use anyhow::{Context, Result, bail};
4use console::Style; 4use console::Style;
5use ngit::{ 5use ngit::{
6 client::{Params, send_events}, 6 client::{Params, send_events},
7 git::nostr_url::CloneUrl,
7 git_events::{EventRefType, KIND_PULL_REQUEST, generate_cover_letter_and_patch_events}, 8 git_events::{EventRefType, KIND_PULL_REQUEST, generate_cover_letter_and_patch_events},
8 push::push_refs_and_generate_pr_or_pr_update_event, 9 push::push_refs_and_generate_pr_or_pr_update_event,
10 repo_ref::is_grasp_server,
9 utils::proposal_tip_is_pr_or_pr_update, 11 utils::proposal_tip_is_pr_or_pr_update,
10}; 12};
11use nostr::{ToBech32, event::Event, nips::nip19::Nip19Event}; 13use nostr::{ToBech32, event::Event, nips::nip19::Nip19Event};
@@ -192,20 +194,52 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs, no_fetch: bool) -> Re
192 commits.reverse(); 194 commits.reverse();
193 195
194 let events = if as_pr { 196 let events = if as_pr {
195 push_refs_and_generate_pr_or_pr_update_event( 197 let repo_grasps = repo_ref.grasp_servers();
196 &git_repo, 198 let repo_grasp_clone_urls: Vec<String> = repo_ref
197 &repo_ref, 199 .git_server
198 commits.last().context("no commits")?, 200 .iter()
199 &user_ref, 201 .filter(|s| is_grasp_server(s, &repo_grasps))
200 root_proposal.as_ref(), 202 .cloned()
201 &cover_letter_title_description, 203 .collect();
202 &signer, 204 if repo_grasp_clone_urls.is_empty() {
203 &console::Term::stdout(), 205 println!(
204 ) 206 "The repository doesn't list a grasp server which would otherwise be used to submit your proposal as nostr Pull Request."
205 .await? 207 );
206 208 }
207 // TODO 209 let mut to_try = repo_grasp_clone_urls.clone();
208 // - allow specifying clone url and ref 210 let mut tried = vec![];
211 loop {
212 let (events, _server_responses) = push_refs_and_generate_pr_or_pr_update_event(
213 &git_repo,
214 &repo_ref,
215 commits.last().context("no commits")?,
216 &user_ref,
217 root_proposal.as_ref(),
218 &cover_letter_title_description,
219 &repo_grasp_clone_urls,
220 &signer,
221 &console::Term::stdout(),
222 )
223 .await?;
224 for url in to_try {
225 tried.push(url);
226 }
227 to_try = vec![];
228 if let Some(events) = events {
229 break events;
230 }
231 let clone_url = Interactor::default()
232 .input(
233 PromptInputParms::default().with_prompt("git repo url with write permission"),
234 )?
235 .clone();
236 if CloneUrl::from_str(&clone_url).is_ok() {
237 to_try.push(clone_url);
238 // TODO customise ref to push
239 } else {
240 println!("invalid clone url");
241 }
242 }
209 } else { 243 } else {
210 let events = generate_cover_letter_and_patch_events( 244 let events = generate_cover_letter_and_patch_events(
211 cover_letter_title_description.clone(), 245 cover_letter_title_description.clone(),