git blame: Display GitHub avatars in blame tooltips, if available (#10767)

Release Notes:

- Added GitHub avatars to tooltips that appear when hovering over a `git
blame` entry (either inline or in the blame gutter).

Demo:



https://github.com/zed-industries/zed/assets/1185253/295c5aee-3a4e-46aa-812d-495439d8840d
This commit is contained in:
Thorsten Ball 2024-04-19 15:15:19 +02:00 committed by GitHub
parent 37e4f83a78
commit 9247da77a3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 514 additions and 239 deletions

View file

@ -4,6 +4,7 @@ use anyhow::Result;
use collections::HashMap;
use git::{
blame::{Blame, BlameEntry},
hosting_provider::HostingProvider,
permalink::{build_commit_permalink, parse_git_remote_url},
Oid,
};
@ -13,6 +14,7 @@ use project::{Item, Project};
use smallvec::SmallVec;
use sum_tree::SumTree;
use url::Url;
use util::http::HttpClient;
#[derive(Clone, Debug, Default)]
pub struct GitBlameEntry {
@ -47,11 +49,34 @@ impl<'a> sum_tree::Dimension<'a, GitBlameEntrySummary> for u32 {
}
}
#[derive(Clone, Debug)]
pub struct GitRemote {
pub host: HostingProvider,
pub owner: String,
pub repo: String,
}
impl GitRemote {
pub fn host_supports_avatars(&self) -> bool {
self.host.supports_avatars()
}
pub async fn avatar_url(&self, commit: Oid, client: Arc<dyn HttpClient>) -> Option<Url> {
self.host
.commit_author_avatar_url(&self.owner, &self.repo, commit, client)
.await
.ok()
.flatten()
}
}
#[derive(Clone, Debug)]
pub struct CommitDetails {
pub message: String,
pub parsed_message: ParsedMarkdown,
pub permalink: Option<Url>,
pub avatar_url: Option<Url>,
pub remote: Option<GitRemote>,
}
pub struct GitBlame {
@ -337,7 +362,7 @@ impl GitBlame {
this.update(&mut cx, |this, cx| {
this.generate(cx);
})
});
})
}
}
@ -408,12 +433,20 @@ async fn parse_commit_messages(
deprecated_permalinks.get(&oid).cloned()
};
let remote = parsed_remote_url.as_ref().map(|remote| GitRemote {
host: remote.provider.clone(),
owner: remote.owner.to_string(),
repo: remote.repo.to_string(),
});
commit_details.insert(
oid,
CommitDetails {
message,
parsed_message,
permalink,
remote,
avatar_url: None,
},
);
}