Support other git hosting services (#312)

* Impl new mod `hosting` for detecting git hosting services
* Refactor: Make `guess_git_hosting_services` associated fn of `GitHostingService`
* Set default value of `PkgMeta::pkg_url` to `None`
* Impl new method `get_redirected_final_url`
* Use `get_redirected_final_url` in `GhCrateMeta::find` to make `guess_git_hosting_services` more accurate.
* Use redirected `repo` in `GhCrateMeta::launch_baseline_find_tasks`
* Refactor `<GhCrateMeta as Fetcher>::find`
* Mod `get_default_pkg_url_template` to ret `&[&str]`
* Add more default `pkg-url` templates
* Rm `pkg-url` in `bin/Cargo.toml`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-08-24 17:16:26 +10:00 committed by GitHub
parent 6b5e8f6875
commit 846e7ead91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 251 additions and 44 deletions

View file

@ -0,0 +1,56 @@
use url::Url;
use crate::errors::BinstallError;
#[derive(Copy, Clone, Debug)]
pub enum GitHostingServices {
GitHub,
GitLab,
BitBucket,
SourceForge,
Unknown,
}
impl GitHostingServices {
pub fn guess_git_hosting_services(repo: &Url) -> Result<Self, BinstallError> {
use GitHostingServices::*;
match repo.domain() {
Some(domain) if domain.starts_with("github") => Ok(GitHub),
Some(domain) if domain.starts_with("gitlab") => Ok(GitLab),
Some(domain) if domain == "bitbucket.org" => Ok(BitBucket),
Some(domain) if domain == "sourceforge.net" => Ok(SourceForge),
_ => Ok(Unknown),
}
}
pub fn get_default_pkg_url_template(self) -> Option<&'static [&'static str]> {
use GitHostingServices::*;
match self {
GitHub => Some(&[
"{ repo }/releases/download/v{ version }/{ name }-{ target }-v{ version }.{ archive-format }",
"{ repo }/releases/download/v{ version }/{ name }-v{ version }-{ target }.{ archive-format }",
"{ repo }/releases/download/v{ version }/{ name }-{ version }-{ target }.{ archive-format }",
"{ repo }/releases/download/v{ version }/{ name }-{ target }.{ archive-format }",
]),
GitLab => Some(&[
"{ repo }/-/releases/v{ version }/downloads/binaries/{ name }-{ target }-v{ version }.{ archive-format }",
"{ repo }/-/releases/v{ version }/downloads/binaries/{ name }-v{ version }-{ target }.{ archive-format }",
"{ repo }/-/releases/v{ version }/downloads/binaries/{ name }-{ version }-{ target }.{ archive-format }",
"{ repo }/-/releases/v{ version }/downloads/binaries/{ name }-{ target }.{ archive-format }",
]),
BitBucket => Some(&[
"{ repo }/downloads/{ name }-{ target }-v{ version }.{ archive-format }",
"{ repo }/downloads/{ name }-v{ version }-{ target }.{ archive-format }",
"{ repo }/downloads/{ name }-{ version }-{ target }.{ archive-format }",
]),
SourceForge => Some(&[
"{ repo }/files/binaries/v{ version }/{ name }-{ target }-v{ version }.{ archive-format }/download",
"{ repo }/files/binaries/v{ version }/{ name }-v{ version }-{ target }.{ archive-format }/download",
"{ repo }/files/binaries/v{ version }/{ name }-{ version }-{ target }.{ archive-format }/download",
"{ repo }/files/binaries/v{ version }/{ name }-{ target }.{ archive-format }/download",
]),
Unknown => None,
}
}
}