Browse Source

Use niv for nix dependency management

Ioannis Koutras 6 months ago
parent
commit
d55706a26d
10 changed files with 217 additions and 40 deletions
  1. 8 0
      default.nix
  2. 2 2
      listsToIpTables.cabal
  3. 0 15
      liststoiptables.nix
  4. 10 0
      nix/default.nix
  5. 23 0
      nix/overlays.nix
  6. 7 0
      nix/release.nix
  7. 26 0
      nix/sources.json
  8. 134 0
      nix/sources.nix
  9. 0 5
      release.nix
  10. 7 18
      shell.nix

+ 8 - 0
default.nix

@@ -0,0 +1,8 @@
+let
+  pkgs = import ./nix {};
+in
+  {
+    inherit (pkgs.haskellPackages)
+      listsToIpTables
+      ;
+  }

+ 2 - 2
ListsToIpTables.cabal → listsToIpTables.cabal

@@ -1,5 +1,5 @@
 cabal-version:       >=1.10
-name:                ListsToIpTables
+name:                listsToIpTables
 version:             0.1.0.0
 synopsis:            Download IP lists and transform them to IP sets
 license:             GPL-3
@@ -10,7 +10,7 @@ maintainer:          ioannis.koutras@gmail.com
 build-type:          Simple
 extra-source-files:  CHANGELOG.md, README.md
 
-executable ListsToIpTables
+executable listsToIpTables
   main-is:             Main.hs
   build-depends:       base >=4.12 && <4.13,
                        bytestring,

+ 0 - 15
liststoiptables.nix

@@ -1,15 +0,0 @@
-{ mkDerivation, base, bytestring, HTTP, iproute, network-uri
-, stdenv, typed-process, zlib
-}:
-mkDerivation {
-  pname = "ListsToIpTables";
-  version = "0.1.0.0";
-  src = ./.;
-  isLibrary = false;
-  isExecutable = true;
-  executableHaskellDepends = [
-    base bytestring HTTP iproute network-uri typed-process zlib
-  ];
-  description = "Download IP lists and transform them to IP sets";
-  license = stdenv.lib.licenses.gpl3;
-}

+ 10 - 0
nix/default.nix

@@ -0,0 +1,10 @@
+{}:
+let
+  sources = import ./sources.nix;
+  pkgs = import sources.nixpkgs
+    {
+      config = { allowUnfree = true; };
+      overlays = import ./overlays.nix { inherit sources; };
+    };
+in
+pkgs // { niv = pkgs.haskellPackages.niv; }

+ 23 - 0
nix/overlays.nix

@@ -0,0 +1,23 @@
+{ sources }:
+[
+  # Some extra sources
+  (self: super:
+    { haskellPackages = super.haskellPackages.extend
+          (super.haskell.lib.packageSourceOverrides
+            { listsToIpTables = self.lib.cleanSourceWith
+                { filter = name: type:
+                    (name == builtins.toString ../Main.hs) ||
+                    (name == builtins.toString ../listsToIpTables.cabal) ||
+                    (name == builtins.toString ../README.md) ||
+                    (name == builtins.toString ../LICENSE) ||
+                    (name == builtins.toString ../Setup.hs)
+                    ;
+
+                  src = self.lib.cleanSource ../.;
+                };
+              niv = (import sources.niv { pkgs = super; }).niv-source;
+            }
+          );
+    }
+  )
+]

+ 7 - 0
nix/release.nix

@@ -0,0 +1,7 @@
+{ sources ? import ./sources.nix }:
+
+let
+  pkgs = import sources.nixpkgs { };
+
+in
+  pkgs.haskellPackages.callPackage ./liststoiptables.nix { }

+ 26 - 0
nix/sources.json

@@ -0,0 +1,26 @@
+{
+    "niv": {
+        "branch": "master",
+        "description": "Easy dependency management for Nix projects",
+        "homepage": "https://github.com/nmattia/niv",
+        "owner": "nmattia",
+        "repo": "niv",
+        "rev": "50600603b51432839c4b6267fd6a0d00ae6b0451",
+        "sha256": "1rrhlscbqdn9a77ws49acl536n3mz6bai68z08mpg8qqa4ahr2sn",
+        "type": "tarball",
+        "url": "https://github.com/nmattia/niv/archive/50600603b51432839c4b6267fd6a0d00ae6b0451.tar.gz",
+        "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
+    },
+    "nixpkgs": {
+        "branch": "nixos-19.09",
+        "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
+        "homepage": "https://github.com/NixOS/nixpkgs",
+        "owner": "NixOS",
+        "repo": "nixpkgs-channels",
+        "rev": "8731aaaf8b30888bc24994096db830993090d7c4",
+        "sha256": "1hcc89rxi47nb0mpk05nl9rbbb04kfw97xfydhpmmgh57yrp3zqa",
+        "type": "tarball",
+        "url": "https://github.com/NixOS/nixpkgs-channels/archive/8731aaaf8b30888bc24994096db830993090d7c4.tar.gz",
+        "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
+    }
+}

+ 134 - 0
nix/sources.nix

@@ -0,0 +1,134 @@
+# This file has been generated by Niv.
+
+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
+      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; };
+
+  fetch_builtin-tarball = spec:
+    builtins.trace
+      ''
+        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:
+    let
+      inherit (builtins) lessThan nixVersion fetchTarball;
+    in
+      if lessThan nixVersion "1.12" then
+        fetchTarball { inherit url; }
+      else
+        fetchTarball attrs;
+
+  # fetchurl version that is compatible between all the versions of Nix
+  builtins_fetchurl = { url, sha256 }@attrs:
+    let
+      inherit (builtins) lessThan nixVersion fetchurl;
+    in
+      if lessThan nixVersion "1.12" then
+        fetchurl { inherit url; }
+      else
+        fetchurl attrs;
+
+  # 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;
+
+  # 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;
+
+      # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
+      inherit pkgs;
+    };
+in
+mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }

+ 0 - 5
release.nix

@@ -1,5 +0,0 @@
-let
-  pkgs = import <nixpkgs> { };
-
-in
-  pkgs.haskellPackages.callPackage ./liststoiptables.nix { }

+ 7 - 18
shell.nix

@@ -1,19 +1,8 @@
-{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:
-
 let
-
-  inherit (nixpkgs) pkgs;
-
-  f = import ./liststoiptables.nix;
-
-  haskellPackages = if compiler == "default"
-                       then pkgs.haskellPackages
-                       else pkgs.haskell.packages.${compiler};
-
-  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;
-
-  drv = variant (haskellPackages.callPackage f {});
-
-in
-
-  if pkgs.lib.inNixShell then drv.env else drv
+  pkgs = import ./nix {};
+in pkgs.haskellPackages.shellFor
+  {
+    packages = p: [ p.listsToIpTables ];
+    withHoogle = false;
+    buildInputs = [ pkgs.cabal-install pkgs.niv ];
+  }