gitee.rs

  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}