diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc index bb7e77b61cb7..2a16c224ffbd 100644 --- a/src/libexpr/get-drvs.cc +++ b/src/libexpr/get-drvs.cc @@ -57,6 +57,36 @@ std::string DrvInfo::queryName() const } +std::optional DrvInfo::queryPname() const +{ + if (!attrs) { + pname = std::optional{std::nullopt}; + } else if (!pname.has_value()) { + auto i = attrs->find(state->symbols.create("pname")); + if (i != attrs->end() && i->value->type() == nString) + pname = state->forceStringNoCtx(*i->value); + else + pname = std::optional{std::nullopt}; + } + return *pname; +} + + +std::optional DrvInfo::queryVersion() const +{ + if (!attrs) { + version = std::optional{std::nullopt}; + } else if (!version.has_value()) { + auto i = attrs->find(state->symbols.create("version")); + if (i != attrs->end() && i->value->type() == nString) + version = state->forceStringNoCtx(*i->value); + else + version = std::optional{std::nullopt}; + } + return *version; +} + + std::string DrvInfo::querySystem() const { if (system == "" && attrs) { diff --git a/src/libexpr/get-drvs.hh b/src/libexpr/get-drvs.hh index 7cc1abef2def..247afc000e0a 100644 --- a/src/libexpr/get-drvs.hh +++ b/src/libexpr/get-drvs.hh @@ -19,6 +19,8 @@ private: EvalState * state; mutable std::string name; + mutable std::optional> pname; + mutable std::optional> version; mutable std::string system; mutable std::optional> drvPath; mutable std::optional outPath; @@ -41,6 +43,8 @@ public: DrvInfo(EvalState & state, ref store, const std::string & drvPathWithOutputs); std::string queryName() const; + std::optional queryPname() const; + std::optional queryVersion() const; std::string querySystem() const; std::optional queryDrvPath() const; StorePath requireDrvPath() const; diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 9a68899cdc46..ee8cd42f15d4 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -920,8 +920,8 @@ static void queryJSON(Globals & globals, std::vector & elems, bool prin auto drvName = DrvName(i.queryName()); pkgObj.attr("name", drvName.fullName); - pkgObj.attr("pname", drvName.name); - pkgObj.attr("version", drvName.version); + pkgObj.attr("pname", i.queryPname() ? *i.queryPname() : drvName.name); + pkgObj.attr("version", i.queryVersion() ? *i.queryVersion() : drvName.version); pkgObj.attr("system", i.querySystem()); pkgObj.attr("outputName", i.queryOutputName()); @@ -1115,8 +1115,8 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs) if (xmlOutput) { auto drvName = DrvName(i.queryName()); attrs["name"] = drvName.fullName; - attrs["pname"] = drvName.name; - attrs["version"] = drvName.version; + attrs["pname"] = i.queryPname() ? *i.queryPname() : drvName.name; + attrs["version"] = i.queryVersion() ? *i.queryVersion() : drvName.version; } else if (printName) { columns.push_back(i.queryName()); }