git blame: Parse permalinks client side (#10714)

Release Notes:

- N/A
This commit is contained in:
Thorsten Ball 2024-04-18 12:36:22 +02:00 committed by GitHub
parent d5c5394693
commit c2428f9f5d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 40 additions and 18 deletions

View file

@ -21,6 +21,7 @@ pub struct Blame {
pub entries: Vec<BlameEntry>,
pub messages: HashMap<Oid, String>,
pub permalinks: HashMap<Oid, Url>,
pub remote_url: Option<String>,
}
impl Blame {
@ -41,6 +42,8 @@ impl Blame {
for entry in entries.iter_mut() {
unique_shas.insert(entry.sha);
// DEPRECATED (18 Apr 24): Sending permalinks over the wire is deprecated. Clients
// now do the parsing.
if let Some(remote) = parsed_remote_url.as_ref() {
permalinks.entry(entry.sha).or_insert_with(|| {
build_commit_permalink(BuildCommitPermalinkParams {
@ -59,6 +62,7 @@ impl Blame {
entries,
permalinks,
messages,
remote_url,
})
}
}

View file

@ -3,7 +3,7 @@ use std::ops::Range;
use anyhow::{anyhow, Result};
use url::Url;
pub(crate) enum GitHostingProvider {
pub enum GitHostingProvider {
Github,
Gitlab,
Gitee,
@ -90,18 +90,18 @@ pub fn build_permalink(params: BuildPermalinkParams) -> Result<Url> {
Ok(permalink)
}
pub(crate) struct ParsedGitRemote<'a> {
pub struct ParsedGitRemote<'a> {
pub provider: GitHostingProvider,
pub owner: &'a str,
pub repo: &'a str,
}
pub(crate) struct BuildCommitPermalinkParams<'a> {
pub struct BuildCommitPermalinkParams<'a> {
pub remote: &'a ParsedGitRemote<'a>,
pub sha: &'a str,
}
pub(crate) fn build_commit_permalink(params: BuildCommitPermalinkParams) -> Url {
pub fn build_commit_permalink(params: BuildCommitPermalinkParams) -> Url {
let BuildCommitPermalinkParams { sha, remote } = params;
let ParsedGitRemote {
@ -122,7 +122,7 @@ pub(crate) fn build_commit_permalink(params: BuildCommitPermalinkParams) -> Url
provider.base_url().join(&path).unwrap()
}
pub(crate) fn parse_git_remote_url(url: &str) -> Option<ParsedGitRemote> {
pub fn parse_git_remote_url(url: &str) -> Option<ParsedGitRemote> {
if url.starts_with("git@github.com:") || url.starts_with("https://github.com/") {
let repo_with_owner = url
.trim_start_matches("git@github.com:")