diff options
author | Cyril Cohen <cohen@crans.org> | 2020-08-28 23:05:46 +0200 |
---|---|---|
committer | Vincent Laporte <vbgl@users.noreply.github.com> | 2021-01-09 11:56:17 +0100 |
commit | 9ffd16b3850536094ca36bc31520bb15a6d5a9ef (patch) | |
tree | a837e242f85684e721a9d5fa65d1de869a559e11 /pkgs/build-support/coq/meta-fetch | |
parent | 04065a73547d3c93a25225531ee1e9d9642ff761 (diff) | |
download | nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar.gz nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar.bz2 nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar.lz nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar.xz nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.tar.zst nixpkgs-9ffd16b3850536094ca36bc31520bb15a6d5a9ef.zip |
coqPackages: refactor
Diffstat (limited to 'pkgs/build-support/coq/meta-fetch')
-rw-r--r-- | pkgs/build-support/coq/meta-fetch/default.nix | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/pkgs/build-support/coq/meta-fetch/default.nix b/pkgs/build-support/coq/meta-fetch/default.nix new file mode 100644 index 00000000000..580d58395ef --- /dev/null +++ b/pkgs/build-support/coq/meta-fetch/default.nix @@ -0,0 +1,66 @@ +{ stdenv, fetchzip }@args: +let lib = import ../extra-lib.nix {inherit (args.stdenv) lib;}; in +with builtins; with lib; +let + default-fetcher = {domain ? "github.com", owner ? "", repo, rev, name ? "source", sha256 ? null, ...}@args: + let ext = if args?sha256 then "zip" else "tar.gz"; + fmt = if args?sha256 then "zip" else "tarball"; + pr = match "^#(.*)$" rev; + url = switch-if [ + { cond = isNull pr && !isNull (match "^github.*" domain); + out = "https://${domain}/${owner}/${repo}/archive/${rev}.${ext}"; } + { cond = !isNull pr && !isNull (match "^github.*" domain); + out = "https://api.${domain}/repos/${owner}/${repo}/${fmt}/pull/${head pr}/head"; } + { cond = isNull pr && !isNull (match "^gitlab.*" domain); + out = "https://${domain}/${owner}/${repo}/-/archive/${rev}/${repo}-${rev}.${ext}"; } + { cond = !isNull (match "(www.)?mpi-sws.org" domain); + out = "https://www.mpi-sws.org/~${owner}/${repo}/download/${repo}-${rev}.${ext}";} + ] (throw "meta-fetch: no fetcher found for domain ${domain} on ${rev}"); + fetch = x: if args?sha256 then fetchzip (x // { inherit sha256; }) else fetchTarball x; + in fetch { inherit url ; }; +in +{ + fetcher ? default-fetcher, + location, + release ? {}, + releaseRev ? (v: v), +}: +let isVersion = x: isString x && match "^/.*" x == null && release?${x}; + shortVersion = x: if (isString x && match "^/.*" x == null) + then findFirst (v: versions.majorMinor v == x) null + (sort versionAtLeast (attrNames release)) + else null; + isShortVersion = x: shortVersion x != null; + isPathString = x: isString x && match "^/.*" x != null && pathExists x; in +arg: +switch arg [ + { case = isNull; out = { version = "broken"; src = ""; broken = true; }; } + { case = isPathString; out = { version = "dev"; src = arg; }; } + { case = pred.union isVersion isShortVersion; + out = let v = if isVersion arg then arg else shortVersion arg; in + if !release.${v}?sha256 then throw "meta-fetch: a sha256 must be provided for each release" + else { + version = release.${v}.version or v; + src = release.${v}.src or fetcher (location // { rev = releaseRev v; } // release.${v}); + }; + } + { case = isString; + out = let + splitted = filter isString (split ":" arg); + rev = last splitted; + has-owner = length splitted > 1; + version = "dev"; in { + inherit version; + src = fetcher (location // { inherit rev; } // + (optionalAttrs has-owner { owner = head splitted; })); + }; } + { case = isAttrs; + out = let + { version = arg.version or "dev"; + src = (arg.fetcher or fetcher) (location // (arg.location or {})); + }; } + { case = isPath; + out = { + version = "dev" ; + src = builtins.path {path = arg; name = location.name or "source";}; }; } +] (throw "not a valid source description") |