diff --git a/crates/git_graph/src/git_graph.rs b/crates/git_graph/src/git_graph.rs index 605c595663..80acde23c2 100644 --- a/crates/git_graph/src/git_graph.rs +++ b/crates/git_graph/src/git_graph.rs @@ -2,6 +2,7 @@ use collections::{BTreeMap, HashMap, IndexSet}; use editor::Editor; use git::{ BuildCommitPermalinkParams, GitHostingProviderRegistry, GitRemote, Oid, ParsedGitRemote, + commit::ParsedCommitMessage, parse_git_remote_url, repository::{ CommitDiff, CommitFile, InitialGraphCommitData, LogOrder, LogSource, RepoPath, @@ -9,7 +10,11 @@ use git::{ }, status::{FileStatus, StatusCode, TrackedStatus}, }; -use git_ui::{commit_tooltip::CommitAvatar, commit_view::CommitView, git_status_icon}; +use git_ui::{ + commit_tooltip::{CommitAvatar, CommitDetails, CommitTooltip}, + commit_view::CommitView, + git_status_icon, +}; use gpui::{ Action, Anchor, AnyElement, App, Bounds, ClickEvent, ClipboardItem, DefiniteLength, DismissEvent, DragMoveEvent, ElementId, Empty, Entity, EventEmitter, FocusHandle, Focusable, @@ -1539,7 +1544,7 @@ impl GitGraph { let subject: SharedString; let author_name: SharedString; - if let CommitDataState::Loaded(data) = data { + if let CommitDataState::Loaded(ref data) = data { subject = data.subject.clone(); author_name = data.author_name.clone(); formatted_time = format_timestamp(data.commit_timestamp); @@ -1594,12 +1599,12 @@ impl GitGraph { (!ranges.is_empty()).then_some(ranges) }) .unwrap_or_default(); - HighlightedLabel::from_ranges(subject.clone(), highlight_ranges) + HighlightedLabel::from_ranges(subject, highlight_ranges) .when(!is_selected, |c| c.color(Color::Muted)) .truncate() .into_any_element() } else { - column_label(subject.clone()) + column_label(subject) }; vec![ @@ -1607,7 +1612,46 @@ impl GitGraph { .id(ElementId::NamedInteger("commit-subject".into(), idx as u64)) .overflow_hidden() .when(!has_context_menu, |this| { - this.tooltip(Tooltip::text(subject)) + if let CommitDataState::Loaded(commit_data) = &data { + let sha = commit.data.sha.to_string(); + let author_name = commit_data.author_name.clone(); + let author_email = commit_data.author_email.clone(); + let message = commit_data.message.clone(); + let commit_timestamp = commit_data.commit_timestamp; + let workspace = self.workspace.clone(); + let repository = repository.clone(); + this.hoverable_tooltip(move |_window, cx| { + let remote_url = repository.read(cx).default_remote_url(); + let provider_registry = + GitHostingProviderRegistry::default_global(cx); + let commit_details = CommitDetails { + sha: sha.clone().into(), + author_name: author_name.clone(), + author_email: author_email.clone(), + commit_time: OffsetDateTime::from_unix_timestamp( + commit_timestamp, + ) + .unwrap_or_else(|_| OffsetDateTime::now_utc()), + message: Some(ParsedCommitMessage::parse( + sha.clone(), + message.to_string(), + remote_url.as_deref(), + Some(provider_registry), + )), + }; + cx.new(|cx| { + CommitTooltip::new( + commit_details, + repository.clone(), + workspace.clone(), + cx, + ) + }) + .into() + }) + } else { + this + } }) .child( h_flex() diff --git a/crates/git_ui/src/commit_tooltip.rs b/crates/git_ui/src/commit_tooltip.rs index 1921de7887..a355d7355b 100644 --- a/crates/git_ui/src/commit_tooltip.rs +++ b/crates/git_ui/src/commit_tooltip.rs @@ -299,11 +299,10 @@ impl Render for CommitTooltip { .child( v_flex() .w(gpui::rems(30.)) - .gap_4() .child( h_flex() - .pb_1p5() - .gap_x_2() + .pb_1() + .gap_2() .overflow_x_hidden() .flex_wrap() .child(avatar) @@ -321,23 +320,24 @@ impl Render for CommitTooltip { .child( div() .id("inline-blame-commit-message") - .child(message) + .track_scroll(&self.scroll_handle) + .py_1p5() .max_h(message_max_height) .overflow_y_scroll() - .track_scroll(&self.scroll_handle), + .child(message), ) .child( h_flex() .text_color(cx.theme().colors().text_muted) .w_full() .justify_between() - .pt_1p5() + .pt_1() .border_t_1() .border_color(cx.theme().colors().border_variant) .child(absolute_timestamp) .child( h_flex() - .gap_1p5() + .gap_1() .when_some(pull_request, |this, pr| { this.child( Button::new( @@ -347,9 +347,9 @@ impl Render for CommitTooltip { .color(Color::Muted) .start_icon( Icon::new(IconName::PullRequest) + .size(IconSize::Small) .color(Color::Muted), ) - .style(ButtonStyle::Subtle) .on_click(move |_, _, cx| { cx.stop_propagation(); cx.open_url(pr.url.as_str()) @@ -362,10 +362,11 @@ impl Render for CommitTooltip { "commit-sha-button", short_commit_id.clone(), ) - .style(ButtonStyle::Subtle) .color(Color::Muted) .start_icon( - Icon::new(IconName::FileGit).color(Color::Muted), + Icon::new(IconName::FileGit) + .size(IconSize::Small) + .color(Color::Muted), ) .on_click( move |_, window, cx| {