aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2024-06-25 12:31:52 +0200
committerJade Lovelace <lix@jade.fyi>2024-08-01 15:41:30 -0700
commit87fd1f024c7c979e5d96c41af4ef7e8bdb5792e1 (patch)
tree4b197ddf8aec8e08208ee5f40e2efab9c48e7e5a /tests
parent6abad7cb238c5c7bf59a83bed55e7590c544fc2e (diff)
Reapply "libfetchers: make attribute / URL query handling consistent"
The original attempt at this introduced a regression; this commit reverts the revert and fixes the regression. This reverts commit 3e151d4d77b5296b9da8c3ad209932d1dfa44c68. Fix to the regression: flakeref: fix handling of `?dir=` param for flakes in subdirs As reported in #419[1], accessing a flake in a subdir of a Git repository fails with the previous commit[2] applied with the error error: unsupported Git input attribute 'dir' The problem is that the `dir`-param is inserted into the parsed URL if a flake is fetched from the subdir of a Git repository. However, for the fetching part this isn't even needed. The fix is to just pass `subdir` as second argument to `FlakeRef` (which needs a `basedir` that can be empty) and leave the parsedURL as-is. Added a regression test to make sure we don't run into this again. [1] https://git.lix.systems/lix-project/lix/issues/419 [2] e22172aaf6b6a366cecd3c025590e68fa2b91bcc, originally 3e151d4d77b5296b9da8c3ad209932d1dfa44c68 Change-Id: I2c72d5a32e406a7ca308e271730bd0af01c5d18b
Diffstat (limited to 'tests')
-rw-r--r--tests/functional/fetchers.sh91
-rw-r--r--tests/functional/flakes/subdir-flake.sh20
-rw-r--r--tests/functional/meson.build2
-rw-r--r--tests/nixos/tarball-flakes.nix2
4 files changed, 114 insertions, 1 deletions
diff --git a/tests/functional/fetchers.sh b/tests/functional/fetchers.sh
new file mode 100644
index 000000000..0f888dc33
--- /dev/null
+++ b/tests/functional/fetchers.sh
@@ -0,0 +1,91 @@
+source common.sh
+
+requireGit
+
+clearStore
+
+testFetchTreeError() {
+ rawFetchTreeArg="${1?fetchTree arg missing}"
+ messageSubstring="${2?messageSubstring missing}"
+
+ output="$(nix eval --impure --raw --expr "(builtins.fetchTree $rawFetchTreeArg).outPath" 2>&1)" && status=0 || status=$?
+ grepQuiet "$messageSubstring" <<<"$output"
+ test "$status" -ne 0
+}
+
+# github/gitlab/sourcehut fetcher input validation
+for provider in github gitlab sourcehut; do
+ # ref/rev validation
+ testFetchTreeError \
+ "{ type = \"$provider\"; owner = \"foo\"; repo = \"bar\"; ref = \",\"; }" \
+ "URL '$provider:foo/bar' contains an invalid branch/tag name"
+
+ testFetchTreeError \
+ "\"$provider://host/foo/bar/,\"" \
+ "URL '$provider:foo/bar', ',' is not a commit hash or a branch/tag name"
+
+ testFetchTreeError \
+ "\"$provider://host/foo/bar/f16d8f43dd0998cdb315a2cccf2e4d10027e7ca4?rev=abc\"" \
+ "URL '$provider://host/foo/bar/f16d8f43dd0998cdb315a2cccf2e4d10027e7ca4?rev=abc' already contains a ref or rev"
+
+ testFetchTreeError \
+ "\"$provider://host/foo/bar/ref?ref=ref2\"" \
+ "URL '$provider://host/foo/bar/ref?ref=ref2' already contains a ref or rev"
+
+ # host validation
+ testFetchTreeError \
+ "{ type = \"$provider\"; owner = \"foo\"; repo = \"bar\"; host = \"git_hub.com\"; }" \
+ "URL '$provider:foo/bar' contains an invalid instance host"
+
+ testFetchTreeError \
+ "\"$provider://host/foo/bar/ref?host=git_hub.com\"" \
+ "URL '$provider:foo/bar' contains an invalid instance host"
+
+ # invalid attributes
+ testFetchTreeError \
+ "{ type = \"$provider\"; owner = \"foo\"; repo = \"bar\"; wrong = true; }" \
+ "unsupported input attribute 'wrong'"
+
+ testFetchTreeError \
+ "\"$provider://host/foo/bar/ref?wrong=1\"" \
+ "unsupported input attribute 'wrong'"
+done
+
+# unsupported attributes w/ tarball fetcher
+testFetchTreeError \
+ "\"https://host/foo?wrong=1\"" \
+ "unsupported tarball input attribute 'wrong'. If you wanted to fetch a tarball with a query parameter, please use '{ type = \"tarball\"; url = \"...\"; }"
+
+# test for unsupported attributes / validation in git fetcher
+testFetchTreeError \
+ "\"git+https://github.com/owner/repo?invalid=1\"" \
+ "unsupported Git input attribute 'invalid'"
+
+testFetchTreeError \
+ "\"git+https://github.com/owner/repo?url=foo\"" \
+ "URL 'git+https://github.com/owner/repo?url=foo' must not override url via query param!"
+
+testFetchTreeError \
+ "\"git+https://github.com/owner/repo?ref=foo.lock\"" \
+ "invalid Git branch/tag name 'foo.lock'"
+
+testFetchTreeError \
+ "{ type = \"git\"; url =\"https://github.com/owner/repo\"; ref = \"foo.lock\"; }" \
+ "invalid Git branch/tag name 'foo.lock'"
+
+# same for mercurial
+testFetchTreeError \
+ "\"hg+https://forge.tld/owner/repo?invalid=1\"" \
+ "unsupported Mercurial input attribute 'invalid'"
+
+testFetchTreeError \
+ "{ type = \"hg\"; url = \"https://forge.tld/owner/repo\"; invalid = 1; }" \
+ "unsupported Mercurial input attribute 'invalid'"
+
+testFetchTreeError \
+ "\"hg+https://forge.tld/owner/repo?ref=,\"" \
+ "invalid Mercurial branch/tag name ','"
+
+testFetchTreeError \
+ "{ type = \"hg\"; url = \"https://forge.tld/owner/repo\"; ref = \",\"; }" \
+ "invalid Mercurial branch/tag name ','"
diff --git a/tests/functional/flakes/subdir-flake.sh b/tests/functional/flakes/subdir-flake.sh
new file mode 100644
index 000000000..399518502
--- /dev/null
+++ b/tests/functional/flakes/subdir-flake.sh
@@ -0,0 +1,20 @@
+source common.sh
+requireGit
+clearStore
+
+container="$TEST_HOME"/flake-container
+flake_dir="$container"/flake-dir
+
+createGitRepo "$container"
+mkdir -p "$flake_dir"
+writeSimpleFlake "$flake_dir"
+git -C "$container" add flake-dir
+
+pushd "$flake_dir" &>/dev/null
+ info="$(nix flake info --json)"
+ [[ "$(jq -r '.resolvedUrl' <<<"$info")" == git+file://*/flake-container?dir=flake-dir ]]
+ [[ "$(jq -r '.url' <<<"$info")" == git+file://*/flake-container?dir=flake-dir ]]
+
+ # Make sure we can actually access & build stuff in this flake.
+ nix build "path:$flake_dir#foo" -L
+popd &>/dev/null
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index cbf6a1563..7a9c7182f 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -71,6 +71,7 @@ functional_tests_scripts = [
'flakes/build-paths.sh',
'flakes/flake-registry.sh',
'flakes/flake-in-submodule.sh',
+ 'flakes/subdir-flake.sh',
'gc.sh',
'nix-collect-garbage-d.sh',
'nix-collect-garbage-dry-run.sh',
@@ -94,6 +95,7 @@ functional_tests_scripts = [
'fetchGitRefs.sh',
'gc-runtime.sh',
'tarball.sh',
+ 'fetchers.sh',
'fetchGit.sh',
'fetchurl.sh',
'fetchPath.sh',
diff --git a/tests/nixos/tarball-flakes.nix b/tests/nixos/tarball-flakes.nix
index ca7627bd1..5deba4a12 100644
--- a/tests/nixos/tarball-flakes.nix
+++ b/tests/nixos/tarball-flakes.nix
@@ -69,7 +69,7 @@ in
# Check that we got redirected to the immutable URL.
locked_url = info["locked"]["url"]
- assert locked_url == "http://localhost/stable/${nixpkgs.rev}.tar.gz", f"{locked_url=} != http://localhost/stable/${nixpkgs.rev}.tar.gz"
+ assert locked_url == "http://localhost/stable/${nixpkgs.rev}.tar.gz?rev=${nixpkgs.rev}&revCount=1234", f"{locked_url=} != http://localhost/stable/${nixpkgs.rev}.tar.gz"
# Check that we got the rev and revCount attributes.
revision = info["revision"]