diff --git a/default.nix b/default.nix
index b33e9ec..59faee8 100644
--- a/default.nix
+++ b/default.nix
@@ -1,10 +1,22 @@
{ pkgs ? import ./nix {} }:
with rec
{ files = pkgs.callPackage ./nix/files.nix {};
- niv-source = files.sourceByRegex "niv" ./.
+ sourceByRegex = name: src: regexes:
+ builtins.path
+ { filter = (path: type:
+ let
+ relPath = pkgs.lib.removePrefix (toString src + "/") (toString path);
+ accept = pkgs.lib.any (re: builtins.match re relPath != null) regexes;
+ in accept);
+ inherit name;
+ path = src;
+ };
+ niv-source = sourceByRegex "niv" ./.
[ "^package.yaml$"
- "^app.*$"
+ "^app$"
+ "^app.*.hs$"
"^README.md$"
+ "^nix$"
"^nix.sources.nix$"
];
haskellPackages = pkgs.haskellPackages.override
@@ -76,8 +88,8 @@ rec
expected_hash=$(${pkgs.nix}/bin/nix-hash ${niv-svg-gen})
actual_hash=$(grep -oP 'id="\K[^"]+' ${./site/niv.svg} -m 1)
- echo expected $expected_hash
- echo actuall $actual_hash
+ echo "expected $expected_hash"
+ echo "actual $actual_hash"
[ $expected_hash == $actual_hash ] && echo dymmy > $out || err
'';
diff --git a/nix/files.nix b/nix/files.nix
deleted file mode 100644
index 5717a5e..0000000
--- a/nix/files.nix
+++ /dev/null
@@ -1,60 +0,0 @@
-{ lib
-, writeText
-, runCommand
-}:
-rec
-{
-
- # Lists all the (relative paths to the) files in the directory.
- listFilesInDir = dir:
- let
- go = dir: dirName:
- lib.lists.concatLists
- (
- lib.attrsets.mapAttrsToList
- (path: ty:
- if ty == "directory"
- then
- go "${dir}/${path}" "${dirName}${path}/"
- else
- [ "${dirName}${path}" ]
- )
- (builtins.readDir dir)
- );
- in go dir "";
-
- # Like nixpkgs' sourceByRegex but doesn't depend on the directory name when
- # computing the hash. Also doesn't require matching on the dir name to
- # actually enter the dir.
- sourceByRegex = name: src: regexes:
- let
- files = builtins.filter (x: x.keep) (map mk (listFilesInDir src));
- mk = path:
- let relPath = lib.removePrefix (toString src + "/") (toString path);
- in
- { inherit relPath;
- path = src + ("/" + path);
- keep = lib.any (re: builtins.match re relPath != null) regexes;
- };
-
- files' = map (x: x.path) files;
- paths' = map (x: x.relPath) files;
-
- filesAbs = writeText "foo" (lib.concatStringsSep "\n" files');
- filesRel = writeText "bar" (lib.concatStringsSep "\n" paths');
- in
- runCommand "source-${name}" {}
- ''
- mkdir -p $out
-
- paste ${filesAbs} ${filesRel} | while IFS="$(printf '\t')" read -r f1 f2
- do
- f="$out/$f2"
- mkdir -p $(dirname $f)
- echo $f1
- echo $f2
- echo $f
- cp $f1 $f
- done
- '';
-}
diff --git a/site/niv.svg b/site/niv.svg
index 0816c11..d6fa881 100644
--- a/site/niv.svg
+++ b/site/niv.svg
@@ -1,4 +1,4 @@
-
\ No newline at end of file
diff --git a/tests/default.nix b/tests/default.nix
index 46a5af5..c7e37f8 100644
--- a/tests/default.nix
+++ b/tests/default.nix
@@ -15,6 +15,9 @@
{ pkgs, niv }:
let
+ niv_HEAD = "a489b65a5c3a29983701069d1ce395b23d9bde64";
+ niv_HEAD- = "abc51449406ba3279c466b4d356b4ae8522ceb58";
+ nixpkgs-channels_HEAD = "571b40d3f50466d3e91c1e609d372de96d782793";
nivForTest = niv.overrideDerivation(old: {
# TODO: Remove this patch by adding an argument to the github
# subcommand to support GitHub entreprise.
@@ -23,18 +26,27 @@ let
sed "s|https://github.com|http://localhost:3333|" -i app/Niv.hs
'';
});
-in pkgs.runCommand "test" { buildInputs = [ pkgs.python nivForTest pkgs.nix pkgs.jq pkgs.netcat-gnu ]; }
+in pkgs.runCommand "test"
+ { buildInputs =
+ [ pkgs.haskellPackages.wai-app-static
+ nivForTest
+ pkgs.nix
+ pkgs.jq
+ pkgs.netcat-gnu
+ ];
+ }
''
set -euo pipefail
echo *** Starting the webserver...
- mkdir mock
- ( cd mock; python -m SimpleHTTPServer 3333 ) &
+ mkdir -p mock
- while ! nc -z 127.0.0.1 3333; do
- echo waiting for mock server
- sleep 1
- done
+ warp -d mock -p 3333 &
+
+ while ! nc -z 127.0.0.1 3333; do
+ echo waiting for mock server
+ sleep 1
+ done
# We can't access /nix or /var from the sandbox
export NIX_STATE_DIR=$PWD/nix/var/nix
@@ -42,17 +54,25 @@ in pkgs.runCommand "test" { buildInputs = [ pkgs.python nivForTest pkgs.nix pkgs
echo -e "\n*** niv init"
+
+ ## mock API behavior:
+ ## - niv points to HEAD
+ ## - nixpkgs-channels points to HEAD
+
mkdir -p mock/repos/nmattia/niv/
cp ${./data/repos/nmattia/niv/repository.json} mock/repos/nmattia/niv/index.html
- cat ${./data/repos/nmattia/niv/commits.json} | jq '.[0] | [.]' > mock/repos/nmattia/niv/commits
+ # XXX: cat so we don't inherit the read-only permissions
+ cat ${./data/repos/nmattia/niv/commits.json} > mock/repos/nmattia/niv/commits
mkdir -p mock/nmattia/niv/archive
- cp ${./data/archives/a489b65a5c3a29983701069d1ce395b23d9bde64.tar.gz} mock/nmattia/niv/archive/a489b65a5c3a29983701069d1ce395b23d9bde64.tar.gz
+ cp ${./data/archives + "/${niv_HEAD}.tar.gz"} \
+ mock/nmattia/niv/archive/${niv_HEAD}.tar.gz
mkdir -p mock/repos/NixOS/nixpkgs-channels
cp ${./data/repos/NixOS/nixpkgs-channels/repository.json} mock/repos/NixOS/nixpkgs-channels/index.html
- cat ${./data/repos/NixOS/nixpkgs-channels/commits.json} | jq '.[0] | [.]' > mock/repos/NixOS/nixpkgs-channels/commits
+ cat ${./data/repos/NixOS/nixpkgs-channels/commits.json} > mock/repos/NixOS/nixpkgs-channels/commits
mkdir -p mock/NixOS/nixpkgs-channels/archive
- cp ${./data/archives/571b40d3f50466d3e91c1e609d372de96d782793.tar.gz} mock/NixOS/nixpkgs-channels/archive/571b40d3f50466d3e91c1e609d372de96d782793.tar.gz
+ cp ${./data/archives + "/${nixpkgs-channels_HEAD}.tar.gz"} \
+ mock/NixOS/nixpkgs-channels/archive/${nixpkgs-channels_HEAD}.tar.gz
niv init
diff -h ${./expected/niv-init.json} nix/sources.json
@@ -65,25 +85,32 @@ in pkgs.runCommand "test" { buildInputs = [ pkgs.python nivForTest pkgs.nix pkgs
cat nix/sources.json | jq -e '. | has("niv") | not'
echo -e "*** ok."
+ ## mock API behavior:
+ ## - niv points to HEAD~
+ ## - nixpkgs-channels points to HEAD
echo -e "\n*** niv add nmattia/niv"
# We use the HEAD~1 commit to update it in the next step
- cat ${./data/repos/nmattia/niv/commits.json} | jq '.[1] | [.]' > mock/repos/nmattia/niv/commits
- cp ${./data/archives/abc51449406ba3279c466b4d356b4ae8522ceb58.tar.gz} mock/nmattia/niv/archive/abc51449406ba3279c466b4d356b4ae8522ceb58.tar.gz
+ # (e.g. we drop the first element of the commit array)
+ cat ${./data/repos/nmattia/niv/commits.json} | jq 'del(.[0])' > mock/repos/nmattia/niv/commits
+ cp ${./data/archives + "/${niv_HEAD-}.tar.gz"} \
+ mock/nmattia/niv/archive/${niv_HEAD-}.tar.gz
niv add nmattia/niv
- echo -n "niv.rev == abc51449406ba3279c466b4d356b4ae8522ceb58: "
- cat nix/sources.json | jq -e '.niv | .rev == "abc51449406ba3279c466b4d356b4ae8522ceb58"'
+ echo -n "niv.rev == ${niv_HEAD-} (HEAD~): "
+ cat nix/sources.json | jq -e '.niv | .rev == "${niv_HEAD-}"'
echo -e "*** ok."
+ ## mock API behavior:
+ ## - niv points to HEAD
+ ## - nixpkgs-channels points to HEAD
echo -e "\n*** niv update niv"
cat ${./data/repos/nmattia/niv/commits.json} | jq '.[0] | [.]' > mock/repos/nmattia/niv/commits
niv update niv
- echo -n "niv.rev == a489b65a5c3a29983701069d1ce395b23d9bde64: "
- cat nix/sources.json | jq -e '.niv | .rev == "a489b65a5c3a29983701069d1ce395b23d9bde64"'
+ echo -n "niv.rev == ${niv_HEAD} (HEAD): "
+ cat nix/sources.json | jq -e '.niv | .rev == "${niv_HEAD}"'
echo -e "*** ok."
-
echo -e "\n*** niv add foo -v 1 -t 'localhost:3333/foo-v'"
echo foo > mock/foo-v1
niv add foo -v 1 -t 'localhost:3333/foo-v'