Merge "nix flake show: add the description if it exists" into main

This commit is contained in:
Isabel 2024-08-02 07:56:06 +00:00 committed by Gerrit Code Review
commit 9eb374dc6d
5 changed files with 102 additions and 9 deletions

View file

@ -70,10 +70,17 @@ horrors:
iFreilicht: iFreilicht:
github: iFreilicht github: iFreilicht
isabelroses:
forgejo: isabelroses
github: isabelroses
jade: jade:
forgejo: jade forgejo: jade
github: lf- github: lf-
kjeremy:
github: kjeremy
kloenk: kloenk:
forgejo: kloenk forgejo: kloenk
github: kloenk github: kloenk

View file

@ -0,0 +1,37 @@
---
synopsis: "Lix will now show the package descriptions in when running `nix flake show`."
cls: [1540]
issues: []
credits: [kjeremy, isabelroses]
category: Improvements
---
When running `nix flake show`, Lix will now show the package descriptions, if they exist.
Before:
```shell
$ nix flake show
path:/home/isabel/dev/lix-show?lastModified=1721736108&narHash=sha256-Zo8HP1ur7Q2b39hKUEG8EAh/opgq8xJ2jvwQ/htwO4Q%3D
└───packages
└───x86_64-linux
├───aNoDescription: package 'simple'
├───bOneLineDescription: package 'simple'
├───cMultiLineDescription: package 'simple'
├───dLongDescription: package 'simple'
└───eEmptyDescription: package 'simple'
```
After:
```shell
$ nix flake show
path:/home/isabel/dev/lix-show?lastModified=1721736108&narHash=sha256-Zo8HP1ur7Q2b39hKUEG8EAh/opgq8xJ2jvwQ/htwO4Q%3D
└───packages
└───x86_64-linux
├───aNoDescription: package 'simple'
├───bOneLineDescription: package 'simple' - 'one line'
├───cMultiLineDescription: package 'simple' - 'line one'
├───dLongDescription: package 'simple' - 'abcdefghijklmnopqrstuvwxyz'
└───eEmptyDescription: package 'simple'
```

View file

@ -20,6 +20,7 @@
doxygen, doxygen,
editline-lix ? __forDefaults.editline-lix, editline-lix ? __forDefaults.editline-lix,
editline, editline,
expect,
git, git,
gtest, gtest,
jq, jq,
@ -254,6 +255,8 @@ stdenv.mkDerivation (finalAttrs: {
++ lib.optional (hostPlatform.canExecute buildPlatform) aws-sdk-cpp-nix ++ lib.optional (hostPlatform.canExecute buildPlatform) aws-sdk-cpp-nix
++ lib.optionals (finalAttrs.dontBuild) maybePropagatedInputs; ++ lib.optionals (finalAttrs.dontBuild) maybePropagatedInputs;
nativeCheckInputs = [ expect ];
checkInputs = [ checkInputs = [
gtest gtest
rapidcheck rapidcheck

View file

@ -15,6 +15,7 @@
#include "registry.hh" #include "registry.hh"
#include "eval-cache.hh" #include "eval-cache.hh"
#include "markdown.hh" #include "markdown.hh"
#include "terminal.hh"
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <queue> #include <queue>
@ -1225,25 +1226,42 @@ struct CmdFlakeShow : FlakeCommand, MixJSON
auto showDerivation = [&]() auto showDerivation = [&]()
{ {
auto name = visitor.getAttr(state->sName)->getString(); auto name = visitor.getAttr(state->sName)->getString();
if (json) {
std::optional<std::string> description; std::optional<std::string> description;
if (auto aMeta = visitor.maybeGetAttr(state->sMeta)) { if (auto aMeta = visitor.maybeGetAttr(state->sMeta)) {
if (auto aDescription = aMeta->maybeGetAttr(state->sDescription)) if (auto aDescription = aMeta->maybeGetAttr(state->sDescription))
description = aDescription->getString(); description = aDescription->getString();
} }
if (json) {
j.emplace("type", "derivation"); j.emplace("type", "derivation");
j.emplace("name", name); j.emplace("name", name);
if (description) if (description)
j.emplace("description", *description); j.emplace("description", *description);
} else { } else {
logger->cout("%s: %s '%s'", auto type =
headerPrefix,
attrPath.size() == 2 && attrPathS[0] == "devShell" ? "development environment" : attrPath.size() == 2 && attrPathS[0] == "devShell" ? "development environment" :
attrPath.size() >= 2 && attrPathS[0] == "devShells" ? "development environment" : attrPath.size() >= 2 && attrPathS[0] == "devShells" ? "development environment" :
attrPath.size() == 3 && attrPathS[0] == "checks" ? "derivation" : attrPath.size() == 3 && attrPathS[0] == "checks" ? "derivation" :
attrPath.size() >= 1 && attrPathS[0] == "hydraJobs" ? "derivation" : attrPath.size() >= 1 && attrPathS[0] == "hydraJobs" ? "derivation" :
"package", "package";
name); if (description && !description->empty()) {
// Trim the string and only display the first line of the description.
auto desc = nix::trim(*description);
auto firstLineDesc = desc.substr(0, desc.find('\n'));
std::string output = fmt("%s: %s '%s' - '%s'", headerPrefix, type, name, firstLineDesc);
if (output.size() > getWindowSize().second) {
// we resize to 4 less then the window size to account for the "...'" we append to
// the final string, we also include the ' since that is removed when we truncate the string
output.resize(getWindowSize().second - 4);
output.append("...'");
}
logger->cout("%s", output.c_str());
}
else {
logger->cout("%s: %s '%s'", headerPrefix, type, name);
}
} }
}; };

View file

@ -85,3 +85,31 @@ assert show_output.legacyPackages.${builtins.currentSystem}.AAAAAASomeThingsFail
assert show_output.legacyPackages.${builtins.currentSystem}.simple.name == "simple"; assert show_output.legacyPackages.${builtins.currentSystem}.simple.name == "simple";
true true
' '
cat >flake.nix<<EOF
{
outputs = inputs: {
packages.$system = {
aNoDescription = import ./simple.nix;
bOneLineDescription = import ./simple.nix // { meta.description = "one line"; };
cMultiLineDescription = import ./simple.nix // { meta.description = ''
line one
line two
''; };
dLongDescription = import ./simple.nix // { meta.description = ''
abcdefghijklmnopqrstuvwxyz
''; };
eEmptyDescription = import ./simple.nix // { meta.description = ""; };
};
};
}
EOF
unbuffer sh -c '
stty rows 20 cols 100
nix flake show > show-output.txt
'
test "$(awk -F '[:] ' '/aNoDescription/{print $NF}' ./show-output.txt)" = "package 'simple'"
test "$(awk -F '[:] ' '/bOneLineDescription/{print $NF}' ./show-output.txt)" = "package 'simple' - 'one line'"
test "$(awk -F '[:] ' '/cMultiLineDescription/{print $NF}' ./show-output.txt)" = "package 'simple' - 'line one'"
test "$(awk -F '[:] ' '/dLongDescription/{print $NF}' ./show-output.txt)" = "package 'simple' - 'abcdefghijklmnopqrs...'"
test "$(awk -F '[:] ' '/eEmptyDescription/{print $NF}' ./show-output.txt)" = "package 'simple'"