Merge pull request #107322 from sternenseemann/fetch-github-leavedotgit

fetchFromGitHub: also use git if deepClone or leaveDotGit is used
This commit is contained in:
Léo Gaspard 2021-02-21 13:28:00 +01:00 committed by GitHub
commit 037936b7a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 6 deletions

View file

@ -31,6 +31,8 @@ Used with Subversion. Expects `url` to a Subversion directory, `rev`, and `sha25
Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`. Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
Additionally the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
## `fetchfossil` ## `fetchfossil`
Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `sha256`. Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `sha256`.
@ -49,6 +51,8 @@ A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are m
`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred. `fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
`fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
## `fetchFromGitLab` ## `fetchFromGitLab`
This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above. This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above.

View file

@ -1,17 +1,19 @@
{ lib, fetchgit, fetchzip }: { lib, fetchgit, fetchzip }:
{ owner, repo, rev, name ? "source" { owner, repo, rev, name ? "source"
, fetchSubmodules ? false, private ? false , fetchSubmodules ? false, leaveDotGit ? null
, deepClone ? false, private ? false
, githubBase ? "github.com", varPrefix ? null , githubBase ? "github.com", varPrefix ? null
, ... # For hash agility , ... # For hash agility
}@args: assert private -> !fetchSubmodules; }@args:
let let
baseUrl = "https://${githubBase}/${owner}/${repo}"; baseUrl = "https://${githubBase}/${owner}/${repo}";
passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "private" "githubBase" "varPrefix" ]; passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "private" "githubBase" "varPrefix" ];
varBase = "NIX${if varPrefix == null then "" else "_${varPrefix}"}_GITHUB_PRIVATE_"; varBase = "NIX${if varPrefix == null then "" else "_${varPrefix}"}_GITHUB_PRIVATE_";
useFetchGit = fetchSubmodules || (leaveDotGit == true) || deepClone;
# We prefer fetchzip in cases we don't need submodules as the hash # We prefer fetchzip in cases we don't need submodules as the hash
# is more stable in that case. # is more stable in that case.
fetcher = if fetchSubmodules then fetchgit else fetchzip; fetcher = if useFetchGit then fetchgit else fetchzip;
privateAttrs = lib.optionalAttrs private { privateAttrs = lib.optionalAttrs private {
netrcPhase = '' netrcPhase = ''
if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then
@ -26,8 +28,14 @@ let
''; '';
netrcImpureEnvVars = [ "${varBase}USERNAME" "${varBase}PASSWORD" ]; netrcImpureEnvVars = [ "${varBase}USERNAME" "${varBase}PASSWORD" ];
}; };
fetcherArgs = (if fetchSubmodules fetcherArgs = (if useFetchGit
then { inherit rev fetchSubmodules; url = "${baseUrl}.git"; } then {
inherit rev deepClone fetchSubmodules; url = "${baseUrl}.git";
} // lib.optionalAttrs (leaveDotGit != null) { inherit leaveDotGit; }
else ({ url = "${baseUrl}/archive/${rev}.tar.gz"; } // privateAttrs) else ({ url = "${baseUrl}/archive/${rev}.tar.gz"; } // privateAttrs)
) // passthruAttrs // { inherit name; }; ) // passthruAttrs // { inherit name; };
in fetcher fetcherArgs // { meta.homepage = baseUrl; inherit rev; } in
assert private -> !useFetchGit;
fetcher fetcherArgs // { meta.homepage = baseUrl; inherit rev; }