aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-01-27 13:45:49 +0100
committerEelco Dolstra <edolstra@gmail.com>2020-01-27 13:45:49 +0100
commit5046233b5a6e544eedb4720d81f21d37a7c35d3b (patch)
treec98939c94a99fe202214b7a9fd96a35e887ee259
parentcc22cf662b6998abbb5a08afce7678c5b149d204 (diff)
Add Mercurial tests
-rw-r--r--src/libexpr/flake/flake.cc9
-rw-r--r--src/libstore/fetchers/mercurial.cc2
-rw-r--r--tests/flakes.sh64
3 files changed, 69 insertions, 6 deletions
diff --git a/src/libexpr/flake/flake.cc b/src/libexpr/flake/flake.cc
index cabc12738..15b852c7c 100644
--- a/src/libexpr/flake/flake.cc
+++ b/src/libexpr/flake/flake.cc
@@ -509,7 +509,14 @@ LockedFlake lockFlake(
if (settings.warnDirty)
warn("will not write lock file of flake '%s' because it has a mutable input", topRef);
} else {
- newLockFile.write(*sourcePath + (topRef.subdir == "" ? "" : "/" + topRef.subdir) + "/flake.lock");
+ auto path = *sourcePath + (topRef.subdir == "" ? "" : "/" + topRef.subdir) + "/flake.lock";
+
+ if (pathExists(path))
+ warn("updating lock file '%s'", path);
+ else
+ warn("creating lock file '%s'", path);
+
+ newLockFile.write(path);
// FIXME: rewriting the lockfile changed the
// top-level repo, so we should re-read it.
diff --git a/src/libstore/fetchers/mercurial.cc b/src/libstore/fetchers/mercurial.cc
index 304b2d967..e6f252700 100644
--- a/src/libstore/fetchers/mercurial.cc
+++ b/src/libstore/fetchers/mercurial.cc
@@ -89,6 +89,8 @@ struct MercurialInput : Input
// FIXME: return lastModified.
+ // FIXME: don't clone local repositories.
+
if (!input->ref && !input->rev && isLocal && pathExists(actualUrl + "/.hg")) {
bool clean = runProgram("hg", true, { "status", "-R", actualUrl, "--modified", "--added", "--removed" }) == "";
diff --git a/tests/flakes.sh b/tests/flakes.sh
index f3409647e..5b844a784 100644
--- a/tests/flakes.sh
+++ b/tests/flakes.sh
@@ -14,6 +14,7 @@ flake1Dir=$TEST_ROOT/flake1
flake2Dir=$TEST_ROOT/flake2
flake3Dir=$TEST_ROOT/flake3
flake4Dir=$TEST_ROOT/flake4
+flake5Dir=$TEST_ROOT/flake5
flake7Dir=$TEST_ROOT/flake7
nonFlakeDir=$TEST_ROOT/nonFlake
@@ -101,6 +102,9 @@ cat > $registry <<EOF
"flake:flake4": {
"url": "flake:flake3"
},
+ "flake:flake5": {
+ "url": "hg+file://$flake5Dir"
+ },
"flake:nixpkgs": {
"url": "flake:flake1"
}
@@ -110,7 +114,7 @@ cat > $registry <<EOF
EOF
# Test 'nix flake list'.
-(( $(nix flake list --flake-registry $registry | wc -l) == 5 ))
+(( $(nix flake list --flake-registry $registry | wc -l) == 6 ))
# Test 'nix flake info'.
nix flake info --flake-registry $registry flake1 | grep -q 'URL: .*flake1.*'
@@ -142,7 +146,8 @@ nix build -o $flake1Dir/result --flake-registry $registry git+file://$flake1Dir
nix path-info $flake1Dir/result
# Building a flake with an unlocked dependency should fail in pure mode.
-(! nix eval "(builtins.getFlake "$flake2Dir")")
+(! nix build -o $TEST_ROOT/result --flake-registry $registry flake2#bar --no-registries)
+(! nix eval --expr "builtins.getFlake \"$flake2Dir\"")
# But should succeed in impure mode.
nix build -o $TEST_ROOT/result --flake-registry $registry flake2#bar --impure
@@ -159,6 +164,7 @@ nix build -o $TEST_ROOT/result --flake-registry $registry $flake2Dir#bar
# Building with a lockfile should not require a fetch of the registry.
nix build -o $TEST_ROOT/result --flake-registry file:///no-registry.json $flake2Dir#bar --tarball-ttl 0
+nix build -o $TEST_ROOT/result --no-registries $flake2Dir#bar --tarball-ttl 0
# Updating the flake should not change the lockfile.
nix flake update --flake-registry $registry $flake2Dir
@@ -344,11 +350,11 @@ nix build -o $TEST_ROOT/result --flake-registry $registry flake4/removeXyzzy#sth
# Testing the nix CLI
nix flake add --flake-registry $registry flake1 flake3
-(( $(nix flake list --flake-registry $registry | wc -l) == 6 ))
+(( $(nix flake list --flake-registry $registry | wc -l) == 7 ))
nix flake pin --flake-registry $registry flake1
-(( $(nix flake list --flake-registry $registry | wc -l) == 6 ))
+(( $(nix flake list --flake-registry $registry | wc -l) == 7 ))
nix flake remove --flake-registry $registry flake1
-(( $(nix flake list --flake-registry $registry | wc -l) == 5 ))
+(( $(nix flake list --flake-registry $registry | wc -l) == 6 ))
# Test 'nix flake init'.
(cd $flake7Dir && nix flake init)
@@ -519,3 +525,51 @@ EOF
nix flake update --flake-registry $registry $flake3Dir --recreate-lock-file
[[ $(jq .inputs.flake2.inputs.flake1.url $flake3Dir/flake.lock) =~ flake7 ]]
+
+# Test Mercurial flakes.
+if [[ -z $(type -p hg) ]]; then
+ echo "Git not installed; skipping Mercurial flake tests"
+ exit 99
+fi
+
+rm -rf $flake5Dir
+hg init $flake5Dir
+
+cat > $flake5Dir/flake.nix <<EOF
+{
+ edition = 201909;
+
+ outputs = { self, flake1 }: {
+ defaultPackage.$system = flake1.defaultPackage.$system;
+
+ expr = assert builtins.pathExists ./flake.lock; 123;
+ };
+}
+EOF
+
+hg add $flake5Dir/flake.nix
+hg commit --config ui.username=foobar@example.org $flake5Dir -m 'Initial commit'
+
+nix build -o $TEST_ROOT/result --flake-registry $registry hg+file://$flake5Dir
+[[ -e $TEST_ROOT/result/hello ]]
+
+nix flake info --flake-registry $registry --json hg+file://$flake5Dir | jq -e -r .revision
+
+# This will fail because flake.lock is not tracked by Mercurial.
+(! nix eval --flake-registry $registry hg+file://$flake5Dir#expr)
+
+hg add $flake5Dir/flake.lock
+
+nix eval --flake-registry $registry hg+file://$flake5Dir#expr
+
+(! nix eval --flake-registry $registry hg+file://$flake5Dir#expr --no-allow-dirty)
+
+(! nix flake info --flake-registry $registry --json hg+file://$flake5Dir | jq -e -r .revision)
+
+hg commit --config ui.username=foobar@example.org $flake5Dir -m 'Add lock file'
+
+nix flake info --flake-registry $registry --json hg+file://$flake5Dir --refresh | jq -e -r .revision
+nix flake info --flake-registry $registry --json hg+file://$flake5Dir
+[[ $(nix flake info --flake-registry $registry --json hg+file://$flake5Dir | jq -e -r .revCount) = 1 ]]
+
+nix build -o $TEST_ROOT/result hg+file://$flake5Dir --no-registries --no-allow-dirty