fetchFromGitHub: Allow private repos, hosted githubs

Changed files
+34 -5
pkgs
build-support
fetchurl
top-level
+15 -1
pkgs/build-support/fetchurl/default.nix
···
, recursiveHash ? false
+
, # Shell code to build a netrc file for BASIC auth
+
netrcPhase ? null
+
+
, # Impure env vars (http://nixos.org/nix/manual/#sec-advanced-attributes)
+
# needed for netrcPhase
+
netrcImpureEnvVars ? []
+
, # Shell code executed after the file has been fetched
# successfully. This can do things like check or transform the file.
postFetch ? ""
···
outputHashMode = if (recursiveHash || executable) then "recursive" else "flat";
-
inherit curlOpts showURLs mirrorsFile impureEnvVars postFetch downloadToTemp executable;
+
inherit curlOpts showURLs mirrorsFile postFetch downloadToTemp executable;
+
+
impureEnvVars = impureEnvVars ++ netrcImpureEnvVars;
# Doing the download on a remote machine just duplicates network
# traffic, so don't do that.
preferLocalBuild = true;
+
+
postHook = if netrcPhase == null then null else ''
+
${netrcPhase}
+
curlOpts="$curlOpts --netrc-file $PWD/netrc"
+
'';
inherit meta;
}
+19 -4
pkgs/top-level/all-packages.nix
···
fetchFromGitHub = {
owner, repo, rev, name ? "${repo}-${rev}-src",
-
fetchSubmodules ? false,
+
fetchSubmodules ? false, private ? false,
+
githubBase ? "github.com", varPrefix ? null,
... # For hash agility
-
}@args:
+
}@args: assert private -> !fetchSubmodules;
let
-
baseUrl = "https://github.com/${owner}/${repo}";
-
passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" ];
+
baseUrl = "https://${githubBase}/${owner}/${repo}";
+
passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "private" "githubBase" "varPrefix" ];
+
varBase = "NIX${if varPrefix == null then "" else "_${varPrefix}"}_GITHUB_PRIVATE_";
in if fetchSubmodules then
fetchgit ({
inherit name rev fetchSubmodules;
···
inherit name;
url = "${baseUrl}/archive/${rev}.tar.gz";
meta.homepage = "${baseUrl}/";
+
} // lib.optionalAttrs private {
+
netrcPhase = ''
+
if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then
+
echo "Error: Private fetchFromGitHub requires the nix building process (nix-daemon in multi user mode) to have the ${varBase}USERNAME and ${varBase}PASSWORD env vars set." >&2
+
exit 1
+
fi
+
cat > netrc <<EOF
+
machine ${githubBase}
+
login ''$${varBase}USERNAME
+
password ''$${varBase}PASSWORD
+
EOF
+
'';
+
netrcImpureEnvVars = [ "${varBase}USERNAME" "${varBase}PASSWORD" ];
} // passthruAttrs) // { inherit rev; };
fetchFromBitbucket = {