From c3d4fa4336e412b49a9bd9fd5edd8808c92ce59b Mon Sep 17 00:00:00 2001 From: d1y Date: Wed, 31 Jan 2024 15:54:03 +0800 Subject: [PATCH] Permalink add Gitee host support (#7134) China's largest git code hosting platform About Gitee: https://gitee.com/about_us Release Notes: - Added Gitee host support with Git-Permalink --- crates/editor/src/git/permalink.rs | 104 ++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/git/permalink.rs b/crates/editor/src/git/permalink.rs index 1dc1aa395363086a1ef87d064b9c0432e974602f..39edae0dce56cda2aa1a2f3bc4720b385e32da0f 100644 --- a/crates/editor/src/git/permalink.rs +++ b/crates/editor/src/git/permalink.rs @@ -7,6 +7,7 @@ use url::Url; enum GitHostingProvider { Github, Gitlab, + Gitee, } impl GitHostingProvider { @@ -14,6 +15,7 @@ impl GitHostingProvider { let base_url = match self { Self::Github => "https://github.com", Self::Gitlab => "https://gitlab.com", + Self::Gitee => "https://gitee.com", }; Url::parse(&base_url).unwrap() @@ -26,7 +28,7 @@ impl GitHostingProvider { let line = selection.start.row + 1; match self { - Self::Github | Self::Gitlab => format!("L{}", line), + Self::Github | Self::Gitlab | Self::Gitee => format!("L{}", line), } } else { let start_line = selection.start.row + 1; @@ -35,6 +37,7 @@ impl GitHostingProvider { match self { Self::Github => format!("L{}-L{}", start_line, end_line), Self::Gitlab => format!("L{}-{}", start_line, end_line), + Self::Gitee => format!("L{}-{}", start_line, end_line), } } } @@ -65,6 +68,7 @@ pub fn build_permalink(params: BuildPermalinkParams) -> Result { let path = match provider { GitHostingProvider::Github => format!("{owner}/{repo}/blob/{sha}/{path}"), GitHostingProvider::Gitlab => format!("{owner}/{repo}/-/blob/{sha}/{path}"), + GitHostingProvider::Gitee => format!("{owner}/{repo}/blob/{sha}/{path}"), }; let line_fragment = selection.map(|selection| provider.line_fragment(&selection)); @@ -111,6 +115,21 @@ fn parse_git_remote_url(url: &str) -> Option { }); } + if url.starts_with("git@gitee.com:") || url.starts_with("https://gitee.com/") { + let repo_with_owner = url + .trim_start_matches("git@gitee.com:") + .trim_start_matches("https://gitee.com/") + .trim_end_matches(".git"); + + let (owner, repo) = repo_with_owner.split_once("/")?; + + return Some(ParsedGitRemote { + provider: GitHostingProvider::Gitee, + owner, + repo, + }); + } + None } @@ -285,4 +304,87 @@ mod tests { let expected_url = "https://gitlab.com/zed-industries/zed/-/blob/b2efec9824c45fcc90c9a7eb107a50d1772a60aa/crates/zed/src/main.rs#L24-48"; assert_eq!(permalink.to_string(), expected_url.to_string()) } + + #[test] + fn test_build_gitee_permalink_from_ssh_url() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "git@gitee.com:libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/editor/src/git/permalink.rs", + selection: None, + }) + .unwrap(); + + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } + + #[test] + fn test_build_gitee_permalink_from_ssh_url_single_line_selection() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "git@gitee.com:libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/editor/src/git/permalink.rs", + selection: Some(Point::new(6, 1)..Point::new(6, 10)), + }) + .unwrap(); + + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L7"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } + + #[test] + fn test_build_gitee_permalink_from_ssh_url_multi_line_selection() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "git@gitee.com:libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/editor/src/git/permalink.rs", + selection: Some(Point::new(23, 1)..Point::new(47, 10)), + }) + .unwrap(); + + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L24-48"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } + + #[test] + fn test_build_gitee_permalink_from_https_url() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "https://gitee.com/libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/zed/src/main.rs", + selection: None, + }) + .unwrap(); + + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } + + #[test] + fn test_build_gitee_permalink_from_https_url_single_line_selection() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "https://gitee.com/libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/zed/src/main.rs", + selection: Some(Point::new(6, 1)..Point::new(6, 10)), + }) + .unwrap(); + + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs#L7"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } + + #[test] + fn test_build_gitee_permalink_from_https_url_multi_line_selection() { + let permalink = build_permalink(BuildPermalinkParams { + remote_url: "https://gitee.com/libkitten/zed.git", + sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + path: "crates/zed/src/main.rs", + selection: Some(Point::new(23, 1)..Point::new(47, 10)), + }) + .unwrap(); + let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs#L24-48"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } }