From 05480184260e274a14232d256640c95255175ab7 Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Sat, 29 Aug 2026 10:44:51 +0700 Subject: [PATCH] add nak --- .../src/views/repo_detail/commits.rs | 2 -- crates/workspace/src/views/repo_detail/mod.rs | 31 ++++++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/crates/workspace/src/views/repo_detail/commits.rs b/crates/workspace/src/views/repo_detail/commits.rs index 6900101..a20e8b2 100644 --- a/crates/workspace/src/views/repo_detail/commits.rs +++ b/crates/workspace/src/views/repo_detail/commits.rs @@ -25,8 +25,6 @@ fn commit_row( cx: &App, ) -> AnyElement { let view = view.clone(); - // Only the id is needed by the click handler: the diff panel fetches - // the full commit itself. let id = commit.id.clone(); h_flex() diff --git a/crates/workspace/src/views/repo_detail/mod.rs b/crates/workspace/src/views/repo_detail/mod.rs index b2ffae7..9a26175 100644 --- a/crates/workspace/src/views/repo_detail/mod.rs +++ b/crates/workspace/src/views/repo_detail/mod.rs @@ -1057,7 +1057,9 @@ impl RepoDetailView { let commits_count = self.all_commits.as_ref().map(|list| list.total); let worktree_empty = self.switching_ref || self.worktree.is_none(); - let ngit_command = ngit_clone_command(announcement, cx); + let nostr_url = nostr_clone_url(announcement, cx); + let ngit_command = SharedString::from(format!("git clone {nostr_url}")); + let nak_command = SharedString::from(format!("nak git clone {nostr_url}")); let git_commands = announcement.clone_urls(); v_flex() @@ -1240,6 +1242,7 @@ impl RepoDetailView { .child({ let view = cx.entity(); let ngit_command = ngit_command.clone(); + let nak_command = nak_command.clone(); let git_commands = git_commands.clone(); Popover::new("clone") @@ -1255,6 +1258,7 @@ impl RepoDetailView { .content(move |_, _window, cx| { let state = cx.entity(); let ngit_row = command_row("copy-ngit", &ngit_command, cx); + let nak_row = command_row("copy-nak", &nak_command, cx); v_flex() .w(px(440.)) @@ -1282,7 +1286,19 @@ impl RepoDetailView { .text_xs() .font_semibold() .text_color(cx.theme().muted_foreground) - .child("Git"), + .child("Clone with nak"), + ) + .child(nak_row), + ) + .child( + v_flex() + .gap_1() + .child( + div() + .text_xs() + .font_semibold() + .text_color(cx.theme().muted_foreground) + .child("Grasp Servers"), ) .when(!git_commands.is_empty(), |this| { this.children( @@ -1312,7 +1328,6 @@ impl RepoDetailView { .icon(CustomIconName::GitClone) .label("Download") .primary() - .small() .on_click(move |_event, window, cx| { state.update(cx, |state, cx| { state.dismiss(window, cx); @@ -1613,10 +1628,10 @@ fn load_repo_data(repo: &Repository) -> Result { }) } -/// The `ngit clone nostr://...` command for an announcement (NIP-34): the -/// owner as a NIP-05 identifier when known (npub otherwise), the first -/// announced relay as a hint, and the repository identifier. -fn ngit_clone_command(announcement: &Announcement, cx: &App) -> SharedString { +/// The `nostr://...` clone URL of an announcement (NIP-34): the owner as a +/// NIP-05 identifier when known (npub otherwise), the first announced relay +/// as a hint, and the repository identifier. +fn nostr_clone_url(announcement: &Announcement, cx: &App) -> SharedString { let owner = announcement.owner; let user = ProfileStore::global(cx) .read(cx) @@ -1636,7 +1651,7 @@ fn ngit_clone_command(announcement: &Announcement, cx: &App) -> SharedString { url.push('/'); url.push_str(&announcement.id); - SharedString::from(format!("ngit clone {url}")) + SharedString::from(url) } fn command_row(copy_id: E, command: &SharedString, cx: &mut App) -> Div