Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nix
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: cc22cf662b69
Choose a base ref
...
head repository: NixOS/nix
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 5046233b5a6e
Choose a head ref
  • 1 commit
  • 3 files changed
  • 1 contributor

Commits on Jan 27, 2020

  1. Add Mercurial tests

    edolstra committed Jan 27, 2020

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    5046233 View commit details
Showing with 69 additions and 6 deletions.
  1. +8 −1 src/libexpr/flake/flake.cc
  2. +2 −0 src/libstore/fetchers/mercurial.cc
  3. +59 −5 tests/flakes.sh
9 changes: 8 additions & 1 deletion src/libexpr/flake/flake.cc
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 2 additions & 0 deletions src/libstore/fetchers/mercurial.cc
Original file line number Diff line number Diff line change
@@ -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" }) == "";
64 changes: 59 additions & 5 deletions tests/flakes.sh
Original file line number Diff line number Diff line change
@@ -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