upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/lib/push.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/push.rs')
-rw-r--r--src/lib/push.rs55
1 files changed, 22 insertions, 33 deletions
diff --git a/src/lib/push.rs b/src/lib/push.rs
index bcd368b..4c2d8f1 100644
--- a/src/lib/push.rs
+++ b/src/lib/push.rs
@@ -4,7 +4,7 @@ use std::{
4 time::Instant, 4 time::Instant,
5}; 5};
6 6
7use anyhow::{Result, anyhow, bail}; 7use anyhow::{Result, anyhow};
8use auth_git2::GitAuthenticator; 8use auth_git2::GitAuthenticator;
9use console::Term; 9use console::Term;
10use nostr::{ 10use nostr::{
@@ -25,7 +25,7 @@ use crate::{
25 }, 25 },
26 git_events::generate_unsigned_pr_or_update_event, 26 git_events::generate_unsigned_pr_or_update_event,
27 login::user::UserRef, 27 login::user::UserRef,
28 repo_ref::{RepoRef, is_grasp_server, normalize_grasp_server_url}, 28 repo_ref::{RepoRef, normalize_grasp_server_url},
29 utils::{ 29 utils::{
30 Direction, get_short_git_server_name, get_write_protocols_to_try, join_with_and, 30 Direction, get_short_git_server_name, get_write_protocols_to_try, join_with_and,
31 set_protocol_preference, 31 set_protocol_preference,
@@ -329,19 +329,14 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event(
329 user_ref: &UserRef, 329 user_ref: &UserRef,
330 root_proposal: Option<&Event>, 330 root_proposal: Option<&Event>,
331 title_description_overide: &Option<(String, String)>, 331 title_description_overide: &Option<(String, String)>,
332 servers: &[String],
332 signer: &Arc<dyn NostrSigner>, 333 signer: &Arc<dyn NostrSigner>,
333 term: &Term, 334 term: &Term,
334) -> Result<Vec<Event>> { 335) -> Result<(Option<Vec<Event>>, Vec<(String, Result<()>)>)> {
335 let mut events: Vec<Event> = vec![]; 336 let mut responses = vec![];
336 let repo_grasps = repo_ref.grasp_servers();
337 let repo_grasp_clone_urls = repo_ref
338 .git_server
339 .iter()
340 .filter(|s| is_grasp_server(s, &repo_grasps));
341 337
342 let mut unsigned_pr_event: Option<UnsignedEvent> = None; 338 let mut unsigned_pr_event: Option<UnsignedEvent> = None;
343 let mut failed_clone_urls = vec![]; 339 for clone_url in servers {
344 for clone_url in repo_grasp_clone_urls {
345 let mut draft_pr_event = if let Some(ref unsigned_pr_event) = unsigned_pr_event { 340 let mut draft_pr_event = if let Some(ref unsigned_pr_event) = unsigned_pr_event {
346 unsigned_pr_event.clone() 341 unsigned_pr_event.clone()
347 } else { 342 } else {
@@ -360,7 +355,6 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event(
360 let refspec = format!("{}:refs/nostr/{}", tip, draft_pr_event.id()); 355 let refspec = format!("{}:refs/nostr/{}", tip, draft_pr_event.id());
361 356
362 if let Err(error) = push_to_remote_url(git_repo, clone_url, &[refspec], term) { 357 if let Err(error) = push_to_remote_url(git_repo, clone_url, &[refspec], term) {
363 failed_clone_urls.push(clone_url);
364 term.write_line( 358 term.write_line(
365 format!( 359 format!(
366 "push: error sending commit data to {}: {error}", 360 "push: error sending commit data to {}: {error}",
@@ -368,7 +362,9 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event(
368 ) 362 )
369 .as_str(), 363 .as_str(),
370 )?; 364 )?;
365 responses.push((clone_url.clone(), Err(error)));
371 } else { 366 } else {
367 responses.push((clone_url.clone(), Ok(())));
372 term.write_line( 368 term.write_line(
373 format!( 369 format!(
374 "push: commit data sent to {}", 370 "push: commit data sent to {}",
@@ -379,17 +375,6 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event(
379 unsigned_pr_event = Some(draft_pr_event); 375 unsigned_pr_event = Some(draft_pr_event);
380 } 376 }
381 } 377 }
382 if unsigned_pr_event.is_none() {
383 bail!(
384 "The repository doesnt list a grasp server which would otherwise be used to submit your proposal as nostr Pull Request. Soon ngit will support pushing your changes to a different git / grasp git server."
385 );
386
387 // TODO get grasp_default_set servers that aren't in repo_grasps
388 // cycle through until one succeeds TODO create
389 // personal-fork announcement with grasp servers and
390 // push, after a few seconds push ref/nostr/eventid. if
391 // one success break out of for loop and continue
392 }
393 if let Some(unsigned_pr_event) = unsigned_pr_event { 378 if let Some(unsigned_pr_event) = unsigned_pr_event {
394 let pr_event = sign_draft_event( 379 let pr_event = sign_draft_event(
395 unsigned_pr_event, 380 unsigned_pr_event,
@@ -404,21 +389,25 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event(
404 .to_string(), 389 .to_string(),
405 ) 390 )
406 .await?; 391 .await?;
407 events.push(pr_event);
408 if root_proposal.is_some_and(|proposal| proposal.kind.eq(&Kind::GitPatch)) { 392 if root_proposal.is_some_and(|proposal| proposal.kind.eq(&Kind::GitPatch)) {
409 events.push( 393 Ok((
410 create_close_status_for_original_patch(signer, repo_ref, root_proposal.unwrap()) 394 Some(vec![
395 pr_event,
396 create_close_status_for_original_patch(
397 signer,
398 repo_ref,
399 root_proposal.unwrap(),
400 )
411 .await?, 401 .await?,
412 ); 402 ]),
403 responses,
404 ))
405 } else {
406 Ok((Some(vec![pr_event]), responses))
413 } 407 }
414 } else { 408 } else {
415 bail!( 409 Ok((None, responses))
416 "a commit in your proposal is too big for a nostr patch. tried to use submit as a nostr Pull Request but could not find a grasp server that would accept your changes"
417 );
418 // TODO suggest `ngit send` where user could specify their own clone
419 // url to push to once that feature is added
420 } 410 }
421 Ok(events)
422} 411}
423 412
424async fn create_close_status_for_original_patch( 413async fn create_close_status_for_original_patch(