aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/flake/flake.cc10
-rw-r--r--src/libexpr/flake/flake.hh1
-rw-r--r--src/nix/flake.cc43
-rw-r--r--tests/github-flakes.nix4
4 files changed, 20 insertions, 38 deletions
diff --git a/src/libexpr/flake/flake.cc b/src/libexpr/flake/flake.cc
index f23c53a82..86bb05b5d 100644
--- a/src/libexpr/flake/flake.cc
+++ b/src/libexpr/flake/flake.cc
@@ -46,7 +46,7 @@ static FlakeRef lookupInFlakeCache(
return flakeRef;
}
-static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree(
+static std::tuple<fetchers::Tree, FlakeRef, FlakeRef> fetchOrSubstituteTree(
EvalState & state,
const FlakeRef & originalRef,
std::optional<TreeInfo> treeInfo,
@@ -76,6 +76,7 @@ static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree(
.storePath = std::move(storePath),
.info = *treeInfo,
},
+ originalRef,
originalRef
};
} catch (Error & e) {
@@ -101,7 +102,7 @@ static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree(
if (treeInfo)
assert(tree.storePath == treeInfo->computeStorePath(*state.store));
- return {std::move(tree), lockedRef};
+ return {std::move(tree), resolvedRef, lockedRef};
}
static void expectType(EvalState & state, ValueType type,
@@ -206,7 +207,7 @@ static Flake getFlake(
bool allowLookup,
FlakeCache & flakeCache)
{
- auto [sourceInfo, lockedRef] = fetchOrSubstituteTree(
+ auto [sourceInfo, resolvedRef, lockedRef] = fetchOrSubstituteTree(
state, originalRef, treeInfo, allowLookup, flakeCache);
// Guard against symlink attacks.
@@ -217,6 +218,7 @@ static Flake getFlake(
Flake flake {
.originalRef = originalRef,
+ .resolvedRef = resolvedRef,
.lockedRef = lockedRef,
.sourceInfo = std::make_shared<fetchers::Tree>(std::move(sourceInfo))
};
@@ -490,7 +492,7 @@ LockedFlake lockFlake(
}
else {
- auto [sourceInfo, lockedRef] = fetchOrSubstituteTree(
+ auto [sourceInfo, resolvedRef, lockedRef] = fetchOrSubstituteTree(
state, input.ref, {}, lockFlags.useRegistries, flakeCache);
node->inputs.insert_or_assign(id,
std::make_shared<LockedNode>(lockedRef, input.ref, sourceInfo.info, false));
diff --git a/src/libexpr/flake/flake.hh b/src/libexpr/flake/flake.hh
index 88e386be0..7ee9bbe76 100644
--- a/src/libexpr/flake/flake.hh
+++ b/src/libexpr/flake/flake.hh
@@ -28,6 +28,7 @@ struct FlakeInput
struct Flake
{
FlakeRef originalRef;
+ FlakeRef resolvedRef;
FlakeRef lockedRef;
std::optional<std::string> description;
std::shared_ptr<const fetchers::Tree> sourceInfo;
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index 93dbb9601..e79f4129a 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -80,7 +80,8 @@ struct CmdFlakeList : EvalCommand
static void printFlakeInfo(const Store & store, const Flake & flake)
{
- std::cout << fmt("URL: %s\n", flake.lockedRef.to_string());
+ std::cout << fmt("Resolved URL: %s\n", flake.resolvedRef.to_string());
+ std::cout << fmt("Locked URL: %s\n", flake.lockedRef.to_string());
std::cout << fmt("Edition: %s\n", flake.edition);
if (flake.description)
std::cout << fmt("Description: %s\n", *flake.description);
@@ -100,8 +101,11 @@ static nlohmann::json flakeToJson(const Store & store, const Flake & flake)
if (flake.description)
j["description"] = *flake.description;
j["edition"] = flake.edition;
- j["url"] = flake.lockedRef.to_string();
+ j["originalUrl"] = flake.originalRef.to_string();
j["original"] = attrsToJson(flake.originalRef.toAttrs());
+ j["resolvedUrl"] = flake.resolvedRef.to_string();
+ j["resolved"] = attrsToJson(flake.resolvedRef.toAttrs());
+ j["url"] = flake.lockedRef.to_string(); // FIXME: rename to lockedUrl
j["locked"] = attrsToJson(flake.lockedRef.toAttrs());
j["info"] = flake.sourceInfo->info.toJson();
if (auto rev = flake.lockedRef.input->getRev())
@@ -153,39 +157,14 @@ struct CmdFlakeInfo : FlakeCommand, MixJSON
void run(nix::ref<nix::Store> store) override
{
- if (json) {
- auto state = getEvalState();
- auto flake = lockFlake();
-
- auto json = flakeToJson(*store, flake.flake);
-
- auto vFlake = state->allocValue();
- flake::callFlake(*state, flake, *vFlake);
-
- auto outputs = nlohmann::json::object();
-
- enumerateOutputs(*state,
- *vFlake,
- [&](const std::string & name, Value & vProvide, const Pos & pos) {
- auto provide = nlohmann::json::object();
-
- if (name == "checks" || name == "packages") {
- state->forceAttrs(vProvide, pos);
- for (auto & aCheck : *vProvide.attrs)
- provide[aCheck.name] = nlohmann::json::object();
- }
-
- outputs[name] = provide;
- });
-
- json["outputs"] = std::move(outputs);
+ auto flake = getFlake();
+ stopProgressBar();
+ if (json) {
+ auto json = flakeToJson(*store, flake);
std::cout << json.dump() << std::endl;
- } else {
- auto flake = getFlake();
- stopProgressBar();
+ } else
printFlakeInfo(*store, flake);
- }
}
};
diff --git a/tests/github-flakes.nix b/tests/github-flakes.nix
index 195772ca7..02b78ffe0 100644
--- a/tests/github-flakes.nix
+++ b/tests/github-flakes.nix
@@ -44,7 +44,7 @@ let
dir=NixOS-nixpkgs-${nixpkgs.shortRev}
cp -prd ${nixpkgs} $dir
# Set the correct timestamp in the tarball.
- find $dir -print0 | xargs -0 touch -t ${builtins.substring 0 12 nixpkgs.lastModified}.${builtins.substring 12 2 nixpkgs.lastModified} --
+ find $dir -print0 | xargs -0 touch -t ${builtins.substring 0 12 nixpkgs.lastModifiedDate}.${builtins.substring 12 2 nixpkgs.lastModifiedDate} --
tar cfz $out/tarball/${nixpkgs.rev} $dir --hard-dereference
mkdir -p $out/commits
@@ -128,7 +128,7 @@ makeTest (
$github->succeed("systemctl stop httpd.service");
my $date = $client->succeed("nix flake info nixpkgs --json | jq -M .lastModified");
- strftime("%Y%m%d%H%M%S", gmtime($date)) eq "${nixpkgs.lastModified}" or die "time mismatch";
+ strftime("%Y%m%d%H%M%S", gmtime($date)) eq "${nixpkgs.lastModifiedDate}" or die "time mismatch";
$client->succeed("nix build nixpkgs#hello");