From 91508de3152b4448b44d9e48b749570077ff473f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 24 Feb 2025 17:46:43 +0100 Subject: [PATCH 1/2] nix flake archive: Recurse into relative path inputs We can't ignore them entirely, since we do want to archive their transitive inputs. Fixes #12438. (cherry picked from commit 14c9755462cc8ee61ba7a34da48fcfc34d3b110c) --- src/nix/flake.cc | 22 +++++++++++----------- tests/functional/flakes/common.sh | 14 +++++++++++--- tests/functional/flakes/relative-paths.sh | 14 ++++++++++++-- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/nix/flake.cc b/src/nix/flake.cc index 87eaafd15..9259743f4 100644 --- a/src/nix/flake.cc +++ b/src/nix/flake.cc @@ -1088,21 +1088,21 @@ struct CmdFlakeArchive : FlakeCommand, MixJSON, MixDryRun nlohmann::json jsonObj2 = json ? json::object() : nlohmann::json(nullptr); for (auto & [inputName, input] : node.inputs) { if (auto inputNode = std::get_if<0>(&input)) { - if ((*inputNode)->lockedRef.input.isRelative()) - continue; - auto storePath = - dryRun - ? (*inputNode)->lockedRef.input.computeStorePath(*store) - : (*inputNode)->lockedRef.input.fetchToStore(store).first; + std::optional storePath; + if (!(*inputNode)->lockedRef.input.isRelative()) { + storePath = + dryRun + ? (*inputNode)->lockedRef.input.computeStorePath(*store) + : (*inputNode)->lockedRef.input.fetchToStore(store).first; + sources.insert(*storePath); + } if (json) { auto & jsonObj3 = jsonObj2[inputName]; - jsonObj3["path"] = store->printStorePath(storePath); - sources.insert(std::move(storePath)); + if (storePath) + jsonObj3["path"] = store->printStorePath(*storePath); jsonObj3["inputs"] = traverse(**inputNode); - } else { - sources.insert(std::move(storePath)); + } else traverse(**inputNode); - } } } return jsonObj2; diff --git a/tests/functional/flakes/common.sh b/tests/functional/flakes/common.sh index b1c3988e3..06e414e9d 100644 --- a/tests/functional/flakes/common.sh +++ b/tests/functional/flakes/common.sh @@ -99,6 +99,16 @@ writeTrivialFlake() { EOF } +initGitRepo() { + local repo="$1" + local extraArgs="${2-}" + + # shellcheck disable=SC2086 # word splitting of extraArgs is intended + git -C "$repo" init $extraArgs + git -C "$repo" config user.email "foobar@example.com" + git -C "$repo" config user.name "Foobar" +} + createGitRepo() { local repo="$1" local extraArgs="${2-}" @@ -107,7 +117,5 @@ createGitRepo() { mkdir -p "$repo" # shellcheck disable=SC2086 # word splitting of extraArgs is intended - git -C "$repo" init $extraArgs - git -C "$repo" config user.email "foobar@example.com" - git -C "$repo" config user.name "Foobar" + initGitRepo "$repo" $extraArgs } diff --git a/tests/functional/flakes/relative-paths.sh b/tests/functional/flakes/relative-paths.sh index ac4b07eb2..3f7ca3f46 100644 --- a/tests/functional/flakes/relative-paths.sh +++ b/tests/functional/flakes/relative-paths.sh @@ -45,7 +45,7 @@ EOF [[ $(nix eval "$rootFlake?dir=sub1#y") = 6 ]] -git init "$rootFlake" +initGitRepo "$rootFlake" git -C "$rootFlake" add flake.nix sub0/flake.nix sub1/flake.nix [[ $(nix eval "$subflake1#y") = 6 ]] @@ -77,7 +77,17 @@ fi (! grep narHash "$subflake2/flake.lock") # Test `nix flake archive` with relative path flakes. -nix flake archive --json "$rootFlake" +git -C "$rootFlake" add flake.lock +git -C "$rootFlake" commit -a -m Foo + +json=$(nix flake archive --json "$rootFlake" --to "$TEST_ROOT/store2") +[[ $(echo "$json" | jq .inputs.sub0.inputs) = {} ]] +[[ -n $(echo "$json" | jq .path) ]] + +nix flake prefetch --out-link "$TEST_ROOT/result" "$rootFlake" +outPath=$(readlink "$TEST_ROOT/result") + +[ -e "$TEST_ROOT/store2/nix/store/$(basename "$outPath")" ] # Test circular relative path flakes. FIXME: doesn't work at the moment. if false; then From 827f760ad7e12dd006e834045d46645869cd4c74 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 24 Feb 2025 23:00:07 +0100 Subject: [PATCH 2/2] Fix test We didn't backport `nix flake prefetch --out-link`. --- tests/functional/flakes/relative-paths.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/flakes/relative-paths.sh b/tests/functional/flakes/relative-paths.sh index 3f7ca3f46..9c0e6fd41 100644 --- a/tests/functional/flakes/relative-paths.sh +++ b/tests/functional/flakes/relative-paths.sh @@ -84,10 +84,10 @@ json=$(nix flake archive --json "$rootFlake" --to "$TEST_ROOT/store2") [[ $(echo "$json" | jq .inputs.sub0.inputs) = {} ]] [[ -n $(echo "$json" | jq .path) ]] -nix flake prefetch --out-link "$TEST_ROOT/result" "$rootFlake" -outPath=$(readlink "$TEST_ROOT/result") +#nix flake prefetch --out-link "$TEST_ROOT/result" "$rootFlake" +#outPath=$(readlink "$TEST_ROOT/result") -[ -e "$TEST_ROOT/store2/nix/store/$(basename "$outPath")" ] +#[ -e "$TEST_ROOT/store2/nix/store/$(basename "$outPath")" ] # Test circular relative path flakes. FIXME: doesn't work at the moment. if false; then