fetchHex support

This commit is contained in:
figsoda 2023-01-12 19:57:42 -05:00
parent d102bc36e6
commit 4c227cac30
8 changed files with 59 additions and 11 deletions

View File

@ -98,6 +98,7 @@ pub enum FetcherFunction {
FetchFromGitiles, FetchFromGitiles,
FetchFromRepoOrCz, FetchFromRepoOrCz,
FetchFromSourcehut, FetchFromSourcehut,
FetchHex,
Fetchgit, Fetchgit,
Fetchhg, Fetchhg,
Fetchsvn, Fetchsvn,

28
src/fetcher/hex.rs Normal file
View File

@ -0,0 +1,28 @@
use url::Url;
use crate::{
impl_fetcher,
simple::{SimpleFetcher, SimpleUrlFetcher},
};
pub struct FetchHex;
impl_fetcher!(FetchHex);
impl<'a> SimpleFetcher<'a, 1> for FetchHex {
const HASH_KEY: &'static str = "sha256";
const KEYS: [&'static str; 1] = ["pkg"];
const NAME: &'static str = "fetchHex";
const REV_KEY: &'static str = "version";
fn get_values(&self, url: &'a Url) -> Option<[&'a str; 1]> {
Some([url.path_segments()?.nth(1)?])
}
}
impl<'a> SimpleUrlFetcher<'a, 1> for FetchHex {
const UNPACK: bool = false;
fn get_url(&self, [pkg]: &[&str; 1], version: &str) -> String {
format!("https://repo.hex.pm/tarballs/{pkg}-{version}.tar")
}
}

View File

@ -5,6 +5,7 @@ mod gitea;
mod github; mod github;
mod gitiles; mod gitiles;
mod gitlab; mod gitlab;
mod hex;
mod hg; mod hg;
mod repo_or_cz; mod repo_or_cz;
mod sourcehut; mod sourcehut;
@ -17,6 +18,7 @@ pub use gitea::FetchFromGitea;
pub use github::FetchFromGitHub; pub use github::FetchFromGitHub;
pub use gitiles::FetchFromGitiles; pub use gitiles::FetchFromGitiles;
pub use gitlab::FetchFromGitLab; pub use gitlab::FetchFromGitLab;
pub use hex::FetchHex;
pub use hg::Fetchhg; pub use hg::Fetchhg;
pub use repo_or_cz::FetchFromRepoOrCz; pub use repo_or_cz::FetchFromRepoOrCz;
pub use sourcehut::FetchFromSourcehut; pub use sourcehut::FetchFromSourcehut;
@ -80,6 +82,7 @@ pub enum FetcherDispatch<'a> {
FetchFromGitiles(FetchFromGitiles), FetchFromGitiles(FetchFromGitiles),
FetchFromRepoOrCz(FetchFromRepoOrCz), FetchFromRepoOrCz(FetchFromRepoOrCz),
FetchFromSourcehut(FetchFromSourcehut<'a>), FetchFromSourcehut(FetchFromSourcehut<'a>),
FetchHex(FetchHex),
Fetchgit(Fetchgit), Fetchgit(Fetchgit),
Fetchhg(Fetchhg), Fetchhg(Fetchhg),
Fetchsvn(Fetchsvn), Fetchsvn(Fetchsvn),

View File

@ -14,8 +14,8 @@ use crate::{
cli::{FetcherFunction, Opts}, cli::{FetcherFunction, Opts},
fetcher::{ fetcher::{
FetchCrate, FetchFromBitbucket, FetchFromGitHub, FetchFromGitLab, FetchFromGitea, FetchCrate, FetchFromBitbucket, FetchFromGitHub, FetchFromGitLab, FetchFromGitea,
FetchFromGitiles, FetchFromRepoOrCz, FetchFromSourcehut, Fetcher, FetcherDispatch, FetchFromGitiles, FetchFromRepoOrCz, FetchFromSourcehut, FetchHex, Fetcher,
Fetchgit, Fetchhg, Fetchsvn, FetcherDispatch, Fetchgit, Fetchhg, Fetchsvn,
}, },
}; };
@ -126,6 +126,11 @@ fn main() -> Result<()> {
bail!("{fetcher:?} does not support URLs without a host"); bail!("{fetcher:?} does not support URLs without a host");
} }
(None | Some(FetcherFunction::FetchHex), Some("hex.pm"), _) => FetchHex.into(),
(Some(FetcherFunction::FetchHex), ..) => {
bail!("fetchHex only supports hex.pm");
}
(None | Some(FetcherFunction::Fetchgit), _, "git") => Fetchgit(GitScheme::Yes).into(), (None | Some(FetcherFunction::Fetchgit), _, "git") => Fetchgit(GitScheme::Yes).into(),
(None | Some(FetcherFunction::Fetchgit), _, scheme) if scheme.starts_with("git+") => { (None | Some(FetcherFunction::Fetchgit), _, scheme) if scheme.starts_with("git+") => {
Fetchgit(GitScheme::Plus).into() Fetchgit(GitScheme::Plus).into()

View File

@ -51,14 +51,17 @@ pub fn flake_prefetch(flake_ref: String) -> Result<String> {
.hash) .hash)
} }
pub fn url_prefetch(url: String) -> Result<String> { pub fn url_prefetch(url: String, unpack: bool) -> Result<String> {
info!("$ nix-prefetch-url --unpack {url}"); let mut cmd = Command::new("nix-prefetch-url");
let hash = String::from_utf8( if unpack {
Command::new("nix-prefetch-url") cmd.arg("--unpack");
.arg("--unpack") info!("$ nix-prefetch-url --unpack {url}");
.arg(url) } else {
.get_stdout()?, info!("$ nix-prefetch-url {url}");
)?; }
cmd.arg(url);
let hash = String::from_utf8(cmd.get_stdout()?)?;
let hash = hash.trim_end(); let hash = hash.trim_end();
info!("$ nix hash to-sri --experimental-features nix-command --type sha256 {hash}"); info!("$ nix hash to-sri --experimental-features nix-command --type sha256 {hash}");

View File

@ -237,6 +237,8 @@ pub trait SimpleFlakeFetcher<'a, const N: usize>: SimpleFetcher<'a, N> {
} }
pub trait SimpleUrlFetcher<'a, const N: usize>: SimpleFetcher<'a, N> { pub trait SimpleUrlFetcher<'a, const N: usize>: SimpleFetcher<'a, N> {
const UNPACK: bool = true;
fn get_url(&self, values: &[&str; N], rev: &str) -> String; fn get_url(&self, values: &[&str; N], rev: &str) -> String;
fn fetch( fn fetch(
@ -247,7 +249,7 @@ pub trait SimpleUrlFetcher<'a, const N: usize>: SimpleFetcher<'a, N> {
args_str: &[(String, String)], args_str: &[(String, String)],
) -> Result<String> { ) -> Result<String> {
if args.is_empty() && args_str.is_empty() { if args.is_empty() && args_str.is_empty() {
url_prefetch(self.get_url(values, rev)) url_prefetch(self.get_url(values, rev), Self::UNPACK)
} else { } else {
self.fetch_fod(values, rev, args, args_str) self.fetch_fod(values, rev, args, args_str)
} }

View File

@ -0,0 +1,5 @@
fetchHex {
pkg = "phoenix";
version = "1.6.0";
sha256 = "sha256-Uv/dMfLa6zmbLh61fUaPmaGtbu5djqGdI1NJLwbJ/JY=";
}

View File

@ -0,0 +1 @@
args = ["https://hex.pm/packages/phoenix", "1.6.0"]