nur-packages

My NUR packages
git clone git://git.sikmir.ru/nur-packages
Log | Files | Refs | README | LICENSE

commit ea454666bcf1d14152aa4ce8db151632e9977ef0
parent 300149339e83d6eff615d5421d83e2c4e05d11d0
Author: Nikolay Korotkiy <sikmir@gmail.com>
Date:   Thu, 23 Jan 2020 22:26:01 +0300

Up

Diffstat:
Mnix/sources.json | 12++++++------
Mnix/sources.nix | 174++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
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); }