You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
64 lines
2.1 KiB
{stdenv, git, cacert}: let |
|
urlToName = url: rev: let |
|
base = baseNameOf (stdenv.lib.removeSuffix "/" url); |
|
|
|
matched = builtins.match "(.*).git" base; |
|
|
|
short = builtins.substring 0 7 rev; |
|
|
|
appendShort = if (builtins.match "[a-f0-9]*" rev) != null |
|
then "-${short}" |
|
else ""; |
|
in "${if matched == null then base else builtins.head matched}${appendShort}"; |
|
in |
|
{ url, rev ? "HEAD", md5 ? "", sha256 ? "", leaveDotGit ? deepClone |
|
, fetchSubmodules ? true, deepClone ? false |
|
, branchName ? null |
|
, name ? urlToName url rev |
|
}: |
|
|
|
/* NOTE: |
|
fetchgit has one problem: git fetch only works for refs. |
|
This is because fetching arbitrary (maybe dangling) commits may be a security risk |
|
and checking whether a commit belongs to a ref is expensive. This may |
|
change in the future when some caching is added to git (?) |
|
Usually refs are either tags (refs/tags/*) or branches (refs/heads/*) |
|
Cloning branches will make the hash check fail when there is an update. |
|
But not all patches we want can be accessed by tags. |
|
|
|
The workaround is getting the last n commits so that it's likely that they |
|
still contain the hash we want. |
|
|
|
for now : increase depth iteratively (TODO) |
|
|
|
real fix: ask git folks to add a |
|
git fetch $HASH contained in $BRANCH |
|
facility because checking that $HASH is contained in $BRANCH is less |
|
expensive than fetching --depth $N. |
|
Even if git folks implemented this feature soon it may take years until |
|
server admins start using the new version? |
|
*/ |
|
|
|
assert md5 != "" || sha256 != ""; |
|
assert deepClone -> leaveDotGit; |
|
|
|
stdenv.mkDerivation { |
|
inherit name; |
|
builder = ./builder.sh; |
|
fetcher = "${./nix-prefetch-git}"; # This must be a string to ensure it's called with bash. |
|
buildInputs = [git]; |
|
|
|
outputHashAlgo = if sha256 == "" then "md5" else "sha256"; |
|
outputHashMode = "recursive"; |
|
outputHash = if sha256 == "" then md5 else sha256; |
|
|
|
inherit url rev leaveDotGit fetchSubmodules deepClone branchName; |
|
|
|
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; |
|
|
|
impureEnvVars = stdenv.lib.fetchers.proxyImpureEnvVars ++ [ |
|
"GIT_PROXY_COMMAND" "SOCKS_SERVER" |
|
]; |
|
|
|
preferLocalBuild = true; |
|
}
|
|
|