1use url::Url;
2
3use git::{BuildCommitPermalinkParams, BuildPermalinkParams, GitHostingProvider, ParsedGitRemote};
4
5pub struct Gitee;
6
7impl GitHostingProvider for Gitee {
8 fn name(&self) -> String {
9 "Gitee".to_string()
10 }
11
12 fn base_url(&self) -> Url {
13 Url::parse("https://gitee.com").unwrap()
14 }
15
16 fn supports_avatars(&self) -> bool {
17 false
18 }
19
20 fn format_line_number(&self, line: u32) -> String {
21 format!("L{line}")
22 }
23
24 fn format_line_numbers(&self, start_line: u32, end_line: u32) -> String {
25 format!("L{start_line}-{end_line}")
26 }
27
28 fn parse_remote_url<'a>(&self, url: &'a str) -> Option<ParsedGitRemote<'a>> {
29 if url.starts_with("git@gitee.com:") || url.starts_with("https://gitee.com/") {
30 let repo_with_owner = url
31 .trim_start_matches("git@gitee.com:")
32 .trim_start_matches("https://gitee.com/")
33 .trim_end_matches(".git");
34
35 let (owner, repo) = repo_with_owner.split_once('/')?;
36
37 return Some(ParsedGitRemote { owner, repo });
38 }
39
40 None
41 }
42
43 fn build_commit_permalink(
44 &self,
45 remote: &ParsedGitRemote,
46 params: BuildCommitPermalinkParams,
47 ) -> Url {
48 let BuildCommitPermalinkParams { sha } = params;
49 let ParsedGitRemote { owner, repo } = remote;
50
51 self.base_url()
52 .join(&format!("{owner}/{repo}/commit/{sha}"))
53 .unwrap()
54 }
55
56 fn build_permalink(&self, remote: ParsedGitRemote, params: BuildPermalinkParams) -> Url {
57 let ParsedGitRemote { owner, repo } = remote;
58 let BuildPermalinkParams {
59 sha,
60 path,
61 selection,
62 } = params;
63
64 let mut permalink = self
65 .base_url()
66 .join(&format!("{owner}/{repo}/blob/{sha}/{path}"))
67 .unwrap();
68 permalink.set_fragment(
69 selection
70 .map(|selection| self.line_fragment(&selection))
71 .as_deref(),
72 );
73 permalink
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn test_build_gitee_permalink_from_ssh_url() {
83 let remote = ParsedGitRemote {
84 owner: "libkitten",
85 repo: "zed",
86 };
87 let permalink = Gitee.build_permalink(
88 remote,
89 BuildPermalinkParams {
90 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
91 path: "crates/editor/src/git/permalink.rs",
92 selection: None,
93 },
94 );
95
96 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs";
97 assert_eq!(permalink.to_string(), expected_url.to_string())
98 }
99
100 #[test]
101 fn test_build_gitee_permalink_from_ssh_url_single_line_selection() {
102 let remote = ParsedGitRemote {
103 owner: "libkitten",
104 repo: "zed",
105 };
106 let permalink = Gitee.build_permalink(
107 remote,
108 BuildPermalinkParams {
109 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
110 path: "crates/editor/src/git/permalink.rs",
111 selection: Some(6..6),
112 },
113 );
114
115 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L7";
116 assert_eq!(permalink.to_string(), expected_url.to_string())
117 }
118
119 #[test]
120 fn test_build_gitee_permalink_from_ssh_url_multi_line_selection() {
121 let remote = ParsedGitRemote {
122 owner: "libkitten",
123 repo: "zed",
124 };
125 let permalink = Gitee.build_permalink(
126 remote,
127 BuildPermalinkParams {
128 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
129 path: "crates/editor/src/git/permalink.rs",
130 selection: Some(23..47),
131 },
132 );
133
134 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L24-48";
135 assert_eq!(permalink.to_string(), expected_url.to_string())
136 }
137
138 #[test]
139 fn test_build_gitee_permalink_from_https_url() {
140 let remote = ParsedGitRemote {
141 owner: "libkitten",
142 repo: "zed",
143 };
144 let permalink = Gitee.build_permalink(
145 remote,
146 BuildPermalinkParams {
147 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
148 path: "crates/zed/src/main.rs",
149 selection: None,
150 },
151 );
152
153 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs";
154 assert_eq!(permalink.to_string(), expected_url.to_string())
155 }
156
157 #[test]
158 fn test_build_gitee_permalink_from_https_url_single_line_selection() {
159 let remote = ParsedGitRemote {
160 owner: "libkitten",
161 repo: "zed",
162 };
163 let permalink = Gitee.build_permalink(
164 remote,
165 BuildPermalinkParams {
166 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
167 path: "crates/zed/src/main.rs",
168 selection: Some(6..6),
169 },
170 );
171
172 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs#L7";
173 assert_eq!(permalink.to_string(), expected_url.to_string())
174 }
175
176 #[test]
177 fn test_build_gitee_permalink_from_https_url_multi_line_selection() {
178 let remote = ParsedGitRemote {
179 owner: "libkitten",
180 repo: "zed",
181 };
182 let permalink = Gitee.build_permalink(
183 remote,
184 BuildPermalinkParams {
185 sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194",
186 path: "crates/zed/src/main.rs",
187 selection: Some(23..47),
188 },
189 );
190
191 let expected_url = "https://gitee.com/libkitten/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/zed/src/main.rs#L24-48";
192 assert_eq!(permalink.to_string(), expected_url.to_string())
193 }
194}