nix flake info: Show resolved URL

This is useful for finding out what a registry lookup resolves to, e.g

  $ nix flake info patchelf
  Resolved URL:  github:NixOS/patchelf
  Locked URL:    github:NixOS/patchelf/cd7955af31698c571c30b7a0f78e59fd624d0229
This commit is contained in:
Eelco Dolstra 2020-04-06 14:56:13 +02:00
parent ce3173edc1
commit 68b43e01dd
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 13 additions and 6 deletions

View file

@ -46,7 +46,7 @@ static FlakeRef lookupInFlakeCache(
return flakeRef; return flakeRef;
} }
static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree( static std::tuple<fetchers::Tree, FlakeRef, FlakeRef> fetchOrSubstituteTree(
EvalState & state, EvalState & state,
const FlakeRef & originalRef, const FlakeRef & originalRef,
std::optional<TreeInfo> treeInfo, std::optional<TreeInfo> treeInfo,
@ -76,6 +76,7 @@ static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree(
.storePath = std::move(storePath), .storePath = std::move(storePath),
.info = *treeInfo, .info = *treeInfo,
}, },
originalRef,
originalRef originalRef
}; };
} catch (Error & e) { } catch (Error & e) {
@ -101,7 +102,7 @@ static std::pair<fetchers::Tree, FlakeRef> fetchOrSubstituteTree(
if (treeInfo) if (treeInfo)
assert(tree.storePath == treeInfo->computeStorePath(*state.store)); 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, static void expectType(EvalState & state, ValueType type,
@ -206,7 +207,7 @@ static Flake getFlake(
bool allowLookup, bool allowLookup,
FlakeCache & flakeCache) FlakeCache & flakeCache)
{ {
auto [sourceInfo, lockedRef] = fetchOrSubstituteTree( auto [sourceInfo, resolvedRef, lockedRef] = fetchOrSubstituteTree(
state, originalRef, treeInfo, allowLookup, flakeCache); state, originalRef, treeInfo, allowLookup, flakeCache);
// Guard against symlink attacks. // Guard against symlink attacks.
@ -217,6 +218,7 @@ static Flake getFlake(
Flake flake { Flake flake {
.originalRef = originalRef, .originalRef = originalRef,
.resolvedRef = resolvedRef,
.lockedRef = lockedRef, .lockedRef = lockedRef,
.sourceInfo = std::make_shared<fetchers::Tree>(std::move(sourceInfo)) .sourceInfo = std::make_shared<fetchers::Tree>(std::move(sourceInfo))
}; };
@ -490,7 +492,7 @@ LockedFlake lockFlake(
} }
else { else {
auto [sourceInfo, lockedRef] = fetchOrSubstituteTree( auto [sourceInfo, resolvedRef, lockedRef] = fetchOrSubstituteTree(
state, input.ref, {}, lockFlags.useRegistries, flakeCache); state, input.ref, {}, lockFlags.useRegistries, flakeCache);
node->inputs.insert_or_assign(id, node->inputs.insert_or_assign(id,
std::make_shared<LockedNode>(lockedRef, input.ref, sourceInfo.info, false)); std::make_shared<LockedNode>(lockedRef, input.ref, sourceInfo.info, false));

View file

@ -28,6 +28,7 @@ struct FlakeInput
struct Flake struct Flake
{ {
FlakeRef originalRef; FlakeRef originalRef;
FlakeRef resolvedRef;
FlakeRef lockedRef; FlakeRef lockedRef;
std::optional<std::string> description; std::optional<std::string> description;
std::shared_ptr<const fetchers::Tree> sourceInfo; std::shared_ptr<const fetchers::Tree> sourceInfo;

View file

@ -80,7 +80,8 @@ struct CmdFlakeList : EvalCommand
static void printFlakeInfo(const Store & store, const Flake & flake) 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); std::cout << fmt("Edition: %s\n", flake.edition);
if (flake.description) if (flake.description)
std::cout << fmt("Description: %s\n", *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) if (flake.description)
j["description"] = *flake.description; j["description"] = *flake.description;
j["edition"] = flake.edition; j["edition"] = flake.edition;
j["url"] = flake.lockedRef.to_string(); j["originalUrl"] = flake.originalRef.to_string();
j["original"] = attrsToJson(flake.originalRef.toAttrs()); 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["locked"] = attrsToJson(flake.lockedRef.toAttrs());
j["info"] = flake.sourceInfo->info.toJson(); j["info"] = flake.sourceInfo->info.toJson();
if (auto rev = flake.lockedRef.input->getRev()) if (auto rev = flake.lockedRef.input->getRev())