commit ea454666bcf1d14152aa4ce8db151632e9977ef0
parent 300149339e83d6eff615d5421d83e2c4e05d11d0
Author: Nikolay Korotkiy <sikmir@gmail.com>
Date: Thu, 23 Jan 2020 22:26:01 +0300
Up
Diffstat:
2 files changed, 112 insertions(+), 74 deletions(-)
diff --git a/nix/sources.json b/nix/sources.json
@@ -125,10 +125,10 @@
"homepage": "https://www.gpxsee.org",
"owner": "tumic0",
"repo": "GPXSee",
- "rev": "42b4216d9c43ff22146bfa305da766a3d330b2f9",
- "sha256": "14pzcyy8kbnmr21yzml1hp7qmc055gyf48s27ff0jndd6f2dmxiq",
+ "rev": "2ff219511667d11b319877d0469954e2859a61ad",
+ "sha256": "0nwz0nafcm8bb9pc9cwx2fjl7kz9kr37hzkqm1hiynf14nld83in",
"type": "tarball",
- "url": "https://github.com/tumic0/GPXSee/archive/42b4216d9c43ff22146bfa305da766a3d330b2f9.tar.gz",
+ "url": "https://github.com/tumic0/GPXSee/archive/2ff219511667d11b319877d0469954e2859a61ad.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"gpxsee-maps": {
@@ -209,10 +209,10 @@
"homepage": "https://www.openorienteering.org/apps/mapper/",
"owner": "OpenOrienteering",
"repo": "mapper",
- "rev": "b4466b076612314fb4ec2fa724489ea169a3d765",
- "sha256": "1kp8pf7lcs1nya1bj28jpg6lb6xwh4m31cqp8m8fzkvgvk1ppf1s",
+ "rev": "43c0cb2b056a0f5a634e417fd0c2ccf8fb043386",
+ "sha256": "04jamq4an8abi3gfkd948kpgh6nln8zwahadsziwj8nw4giam06s",
"type": "tarball",
- "url": "https://github.com/OpenOrienteering/mapper/archive/b4466b076612314fb4ec2fa724489ea169a3d765.tar.gz",
+ "url": "https://github.com/OpenOrienteering/mapper/archive/43c0cb2b056a0f5a634e417fd0c2ccf8fb043386.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"mapsoft": {
diff --git a/nix/sources.nix b/nix/sources.nix
@@ -1,25 +1,91 @@
# This file has been generated by Niv.
-# A record, from name to path, of the third-party packages
-with rec
-{
- pkgs =
- if hasNixpkgsPath
- then
- if hasThisAsNixpkgsPath
- then import (builtins_fetchTarball { inherit (sources_nixpkgs) url sha256; }) {}
- else import <nixpkgs> {}
+let
+
+ #
+ # The fetchers. fetch_<type> fetches specs of type <type>.
+ #
+
+ fetch_file = pkgs: spec:
+ if spec.builtin or true then
+ builtins_fetchurl { inherit (spec) url sha256; }
else
- import (builtins_fetchTarball { inherit (sources_nixpkgs) url sha256; }) {};
+ pkgs.fetchurl { inherit (spec) url sha256; };
+
+ fetch_tarball = pkgs: spec:
+ if spec.builtin or true then
+ builtins_fetchTarball { inherit (spec) url sha256; }
+ else
+ pkgs.fetchzip { inherit (spec) url sha256; };
+
+ fetch_git = spec:
+ builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
- sources_nixpkgs =
- if builtins.hasAttr "nixpkgs" sources
- then sources.nixpkgs
- else abort
+ fetch_builtin-tarball = spec:
+ builtins.trace
''
- Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
- add a package called "nixpkgs" to your sources.json.
- '';
+ WARNING:
+ The niv type "builtin-tarball" will soon be deprecated. You should
+ instead use `builtin = true`.
+
+ $ niv modify <package> -a type=tarball -a builtin=true
+ ''
+ builtins_fetchTarball { inherit (spec) url sha256; };
+
+ fetch_builtin-url = spec:
+ builtins.trace
+ ''
+ WARNING:
+ The niv type "builtin-url" will soon be deprecated. You should
+ instead use `builtin = true`.
+
+ $ niv modify <package> -a type=file -a builtin=true
+ ''
+ (builtins_fetchurl { inherit (spec) url sha256; });
+
+ #
+ # Various helpers
+ #
+
+ # The set of packages used when specs are fetched using non-builtins.
+ mkPkgs = sources:
+ let
+ sourcesNixpkgs =
+ import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
+ hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
+ hasThisAsNixpkgsPath = <nixpkgs> == ./.;
+ in
+ if builtins.hasAttr "nixpkgs" sources
+ then sourcesNixpkgs
+ else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
+ import <nixpkgs> {}
+ else
+ abort
+ ''
+ Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
+ add a package called "nixpkgs" to your sources.json.
+ '';
+
+ # The actual fetching function.
+ fetch = pkgs: name: spec:
+
+ if ! builtins.hasAttr "type" spec then
+ abort "ERROR: niv spec ${name} does not have a 'type' attribute"
+ else if spec.type == "file" then fetch_file pkgs spec
+ else if spec.type == "tarball" then fetch_tarball pkgs spec
+ else if spec.type == "git" then fetch_git spec
+ else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec
+ else if spec.type == "builtin-url" then fetch_builtin-url spec
+ else
+ abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
+
+ # Ports of functions for older nix versions
+
+ # a Nix version of mapAttrs if the built-in doesn't exist
+ mapAttrs = builtins.mapAttrs or (
+ f: set: with builtins;
+ listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
+ );
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, sha256 }@attrs:
@@ -41,56 +107,28 @@ with rec
else
fetchurl attrs;
- # A wrapper around pkgs.fetchzip that has inspectable arguments,
- # annoyingly this means we have to specify them
- fetchzip = { url, sha256 }@attrs: pkgs.fetchzip attrs;
-
- # A wrapper around pkgs.fetchurl that has inspectable arguments,
- # annoyingly this means we have to specify them
- fetchurl = { url, sha256 }@attrs: pkgs.fetchurl attrs;
-
- hasNixpkgsPath = (builtins.tryEval <nixpkgs>).success;
- hasThisAsNixpkgsPath =
- (builtins.tryEval <nixpkgs>).success && <nixpkgs> == ./.;
+ # Create the final "sources" from the config
+ mkSources = config:
+ mapAttrs (
+ name: spec:
+ if builtins.hasAttr "outPath" spec
+ then abort
+ "The values in sources.json should not have an 'outPath' attribute"
+ else
+ spec // { outPath = fetch config.pkgs name spec; }
+ ) config.sources;
- sources = builtins.fromJSON (builtins.readFile ./sources.json);
+ # The "config" used by the fetchers
+ mkConfig =
+ { sourcesFile ? ./sources.json
+ , sources ? builtins.fromJSON (builtins.readFile sourcesFile)
+ , pkgs ? mkPkgs sources
+ }: rec {
+ # The sources, i.e. the attribute set of spec name to spec
+ inherit sources;
- mapAttrs = builtins.mapAttrs or (
- f: set: with builtins;
- listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
- );
-
- # borrowed from nixpkgs
- functionArgs = f: f.__functionArgs or (builtins.functionArgs f);
- callFunctionWith = autoArgs: f: args:
- let
- auto = builtins.intersectAttrs (functionArgs f) autoArgs;
- in
- f (auto // args);
-
- getFetcher = spec:
- let
- fetcherName =
- if builtins.hasAttr "type" spec
- then builtins.getAttr "type" spec
- else "builtin-tarball";
- in
- builtins.getAttr fetcherName {
- "tarball" = fetchzip;
- "builtin-tarball" = builtins_fetchTarball;
- "file" = fetchurl;
- "builtin-url" = builtins_fetchurl;
- };
-};
-# NOTE: spec must _not_ have an "outPath" attribute
-mapAttrs (
- _: spec:
- if builtins.hasAttr "outPath" spec
- then abort
- "The values in sources.json should not have an 'outPath' attribute"
- else
- if builtins.hasAttr "url" spec && builtins.hasAttr "sha256" spec
- then
- spec // { outPath = callFunctionWith spec (getFetcher spec) {}; }
- else spec
-) sources
+ # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
+ inherit pkgs;
+ };
+in
+mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }