From 2b47f4624af9777deb0f5059876d5582aca35692 Mon Sep 17 00:00:00 2001 From: figsoda Date: Sun, 29 Jan 2023 22:50:09 -0500 Subject: [PATCH] git: allow fetching tags without prefixing refs/tags/ work around for https://github.com/NixOS/nix/issues/5291 --- src/fetcher/git.rs | 25 ++++++++++++++----------- src/prefetch.rs | 18 ++++++++++++++++++ tests/cmd/fetcher/git/basic.stdout | 2 +- tests/cmd/fetcher/git/basic.toml | 2 +- tests/cmd/fetcher/git/scheme.stdout | 2 +- tests/cmd/fetcher/git/scheme.toml | 2 +- 6 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/fetcher/git.rs b/src/fetcher/git.rs index 43f12b8..d5d9636 100644 --- a/src/fetcher/git.rs +++ b/src/fetcher/git.rs @@ -1,8 +1,6 @@ -use crate::{ - impl_fetcher, - simple::{SimpleFetcher, SimpleFlakeFetcher}, - GitScheme, Url, -}; +use anyhow::Result; + +use crate::{impl_fetcher, prefetch::git_prefetch, simple::SimpleFetcher, GitScheme, Url}; pub struct Fetchgit(pub GitScheme); impl_fetcher!(Fetchgit); @@ -20,13 +18,18 @@ impl<'a> SimpleFetcher<'a, 1> for Fetchgit { } } -impl<'a> SimpleFlakeFetcher<'a, 1> for Fetchgit { - fn get_flake_ref(&self, [url]: &[&str; 1], rev: &str) -> String { - let rev_type = if rev.len() == 40 { "rev" } else { "ref" }; - if matches!(self.0, GitScheme::Yes) { - format!("{url}?{rev_type}={rev}&submodules=1") +impl<'a> Fetchgit { + fn fetch( + &'a self, + values @ [url]: &[&str; 1], + rev: &str, + args: &[(String, String)], + args_str: &[(String, String)], + ) -> Result { + if args.is_empty() && args_str.is_empty() { + git_prefetch(matches!(self.0, GitScheme::Yes), url, rev) } else { - format!("git+{url}?{rev_type}={rev}&submodules=1") + self.fetch_fod(values, rev, args, args_str) } } } diff --git a/src/prefetch.rs b/src/prefetch.rs index b8d5b69..a0e19fe 100644 --- a/src/prefetch.rs +++ b/src/prefetch.rs @@ -51,6 +51,24 @@ pub fn flake_prefetch(flake_ref: String) -> Result { .hash) } +// work around for https://github.com/NixOS/nix/issues/5291 +pub fn git_prefetch(git_scheme: bool, url: &str, rev: &str) -> Result { + let prefix = if git_scheme { "" } else { "git+" }; + + if rev.len() == 40 { + flake_prefetch(format!("{prefix}{url}?rev={rev}&submodules=1")) + } else { + if !rev.starts_with("refs/") { + if let hash @ Ok(_) = + flake_prefetch(format!("{prefix}{url}?ref=refs/tags/{rev}&submodules=1")) + { + return hash; + } + } + flake_prefetch(format!("{prefix}{url}?ref={rev}&submodules=1")) + } +} + pub fn url_prefetch(url: String, unpack: bool) -> Result { let mut cmd = Command::new("nix-prefetch-url"); if unpack { diff --git a/tests/cmd/fetcher/git/basic.stdout b/tests/cmd/fetcher/git/basic.stdout index b8815d8..ca3d301 100644 --- a/tests/cmd/fetcher/git/basic.stdout +++ b/tests/cmd/fetcher/git/basic.stdout @@ -1,5 +1,5 @@ fetchgit { url = "https://github.com/nix-community/nurl"; - rev = "refs/tags/v0.3.0"; + rev = "v0.3.0"; hash = "sha256-jZ+cCp1THDhfHH5yMmRPjGuthOqsgcF/3OjZ61FMdA4="; } \ No newline at end of file diff --git a/tests/cmd/fetcher/git/basic.toml b/tests/cmd/fetcher/git/basic.toml index 5e43477..439df7e 100644 --- a/tests/cmd/fetcher/git/basic.toml +++ b/tests/cmd/fetcher/git/basic.toml @@ -1,6 +1,6 @@ args = [ "https://github.com/nix-community/nurl", - "refs/tags/v0.3.0", + "v0.3.0", "--fetcher", "fetchgit", ] diff --git a/tests/cmd/fetcher/git/scheme.stdout b/tests/cmd/fetcher/git/scheme.stdout index 23a0a1b..301efc1 100644 --- a/tests/cmd/fetcher/git/scheme.stdout +++ b/tests/cmd/fetcher/git/scheme.stdout @@ -1,5 +1,5 @@ fetchgit { url = "git://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git"; - rev = "refs/tags/v1.9.0"; + rev = "v1.9.0"; hash = "sha256-W38CWoPnkt0+VkVp+uW+sjWjo6MXYq2eTXRxWKyQph8="; } \ No newline at end of file diff --git a/tests/cmd/fetcher/git/scheme.toml b/tests/cmd/fetcher/git/scheme.toml index fd4d444..1e5bada 100644 --- a/tests/cmd/fetcher/git/scheme.toml +++ b/tests/cmd/fetcher/git/scheme.toml @@ -1,6 +1,6 @@ args = [ "git://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git", - "refs/tags/v1.9.0", + "v1.9.0", "--fetcher", "fetchgit", ]