From 2bf98e91e5b5a7d1b18557e65711b5ef3d1a54a3 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Fri, 17 Oct 2025 09:30:35 +0100 Subject: feat(send): add `merge-base` tag to PR (Update) following its inclusion in the NIP-34 spec --- src/bin/git_remote_nostr/push.rs | 6 +++++- src/bin/ngit/sub_commands/send.rs | 6 +++++- src/lib/git/mod.rs | 1 + src/lib/git_events.rs | 23 +++++++++++++++++++---- src/lib/push.rs | 8 ++++++++ 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs index 8c102ee..8a750ce 100644 --- a/src/bin/git_remote_nostr/push.rs +++ b/src/bin/git_remote_nostr/push.rs @@ -460,11 +460,15 @@ async fn generate_patches_or_pr_event_or_pr_updates( let use_pr = parent_is_pr || git_repo.are_commits_too_big_for_patches(ahead); if use_pr { + let tip = ahead.first().context("no commits")?; // ahead is youngest first + let first_commit = ahead.last().context("no commits")?; select_servers_push_refs_and_generate_pr_or_pr_update_event( client, git_repo, repo_ref, - ahead.first().context("no commits to push")?, + tip, + first_commit, + git_repo.get_commit_parent(first_commit).ok().as_ref(), user_ref, root_proposal, &None, diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs index 0e4a572..6ae0cda 100644 --- a/src/bin/ngit/sub_commands/send.rs +++ b/src/bin/ngit/sub_commands/send.rs @@ -206,11 +206,15 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs, no_fetch: bool) -> Re commits.reverse(); let events = if as_pr { + let tip = commits.last().context("no commits")?; // commits has been reversed to oldest first + let first_commit = commits.first().context("no commits")?; select_servers_push_refs_and_generate_pr_or_pr_update_event( &client, &git_repo, &repo_ref, - commits.last().context("no commits")?, + tip, + first_commit, + git_repo.get_commit_parent(first_commit).ok().as_ref(), &mut user_ref, root_proposal.as_ref(), &cover_letter_title_description, diff --git a/src/lib/git/mod.rs b/src/lib/git/mod.rs index 3d5297f..06573eb 100644 --- a/src/lib/git/mod.rs +++ b/src/lib/git/mod.rs @@ -420,6 +420,7 @@ impl RepoActions for Repo { Ok(diff.deltas().len().gt(&0)) } + // youngest first fn get_commits_ahead_behind( &self, base_commit: &Sha1Hash, diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs index 56ebcef..e907a9b 100644 --- a/src/lib/git_events.rs +++ b/src/lib/git_events.rs @@ -385,7 +385,9 @@ pub fn generate_unsigned_pr_or_update_event( signing_public_key: &PublicKey, root_proposal: Option<&Event>, title_description_overide: &Option<(String, String)>, - commit: &Sha1Hash, + tip: &Sha1Hash, + first_commit: &Sha1Hash, + merge_base: Option<&Sha1Hash>, clone_url_hint: &[&str], mentions: &[nostr::Tag], ) -> Result { @@ -404,7 +406,7 @@ pub fn generate_unsigned_pr_or_update_event( } else if let Some(cl) = &root_patch_cover_letter { cl.title.clone() } else { - git_repo.get_commit_message_summary(commit)? + git_repo.get_commit_message_summary(first_commit)? }; let description = if let Some((_, description)) = &title_description_overide { @@ -412,7 +414,10 @@ pub fn generate_unsigned_pr_or_update_event( } else if let Some(cl) = &root_patch_cover_letter { cl.description.clone() } else { - let mut description = git_repo.get_commit_message(commit)?.trim().to_string(); + let mut description = git_repo + .get_commit_message(first_commit)? + .trim() + .to_string(); if let Some(remaining_description) = description.strip_prefix(&title) { description = remaining_description.trim().to_string(); } @@ -471,6 +476,15 @@ pub fn generate_unsigned_pr_or_update_event( .concat() }; + let merge_base_tag = if let Some(merge_base) = merge_base { + vec![Tag::custom( + nostr::TagKind::Custom(std::borrow::Cow::Borrowed("merge-base")), + vec![format!("{merge_base}")], + )] + } else { + vec![] + }; + Ok( if root_proposal.is_some() && root_patch_cover_letter.is_none() { EventBuilder::new(KIND_PULL_REQUEST_UPDATE, "") @@ -508,7 +522,7 @@ pub fn generate_unsigned_pr_or_update_event( Tag::from_standardized(TagStandard::Reference(format!("{root_commit}"))), Tag::custom( nostr::TagKind::Custom(std::borrow::Cow::Borrowed("c")), - vec![format!("{commit}")], + vec![format!("{tip}")], ), Tag::custom( nostr::TagKind::Custom(std::borrow::Cow::Borrowed("clone")), @@ -518,6 +532,7 @@ pub fn generate_unsigned_pr_or_update_event( .collect::>(), ), ], + merge_base_tag, repo_ref .maintainers .iter() diff --git a/src/lib/push.rs b/src/lib/push.rs index 28692f3..aafcf35 100644 --- a/src/lib/push.rs +++ b/src/lib/push.rs @@ -378,6 +378,8 @@ pub async fn select_servers_push_refs_and_generate_pr_or_pr_update_event( git_repo: &Repo, repo_ref: &RepoRef, tip: &Sha1Hash, + first_commit: &Sha1Hash, + merge_base: Option<&Sha1Hash>, user_ref: &mut UserRef, root_proposal: Option<&Event>, title_description_overide: &Option<(String, String)>, @@ -441,6 +443,8 @@ pub async fn select_servers_push_refs_and_generate_pr_or_pr_update_event( git_repo, repo_ref, tip, + first_commit, + merge_base, user_ref, root_proposal, title_description_overide, @@ -673,6 +677,8 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event( git_repo: &Repo, repo_ref: &RepoRef, tip: &Sha1Hash, + first_commit: &Sha1Hash, + merge_base: Option<&Sha1Hash>, user_ref: &UserRef, root_proposal: Option<&Event>, title_description_overide: &Option<(String, String)>, @@ -695,6 +701,8 @@ pub async fn push_refs_and_generate_pr_or_pr_update_event( root_proposal, title_description_overide, tip, + first_commit, + merge_base, &[clone_url], &[], )? -- cgit v1.2.3