Merge pull request #9928 from 9999years/error-messages-in-nix-repl

Improve error printing in `nix repl`

(cherry picked from commit a8050d9b83052e4b5c52bf2d116381aedec3a93e)
Change-Id: I588f92d1dd4c546c98788b71403cc034f5e7129a
This commit is contained in:
eldritch horrors 2024-03-08 06:50:31 +01:00
parent c864923928
commit 7673312ccc
3 changed files with 45 additions and 41 deletions

View file

@ -0,0 +1,40 @@
---
synopsis: Concise error printing in `nix repl`
prs: 9928
---
Previously, if an element of a list or attribute set threw an error while
evaluating, `nix repl` would print the entire error (including source location
information) inline. This output was clumsy and difficult to parse:
```
nix-repl> { err = builtins.throw "uh oh!"; }
{ err = «error:
… while calling the 'throw' builtin
at «string»:1:9:
1| { err = builtins.throw "uh oh!"; }
| ^
error: uh oh!»; }
```
Now, only the error message is displayed, making the output much more readable.
```
nix-repl> { err = builtins.throw "uh oh!"; }
{ err = «error: uh oh!»; }
```
However, if the whole expression being evaluated throws an error, source
locations and (if applicable) a stack trace are printed, just like you'd expect:
```
nix-repl> builtins.throw "uh oh!"
error:
… while calling the 'throw' builtin
at «string»:1:1:
1| builtins.throw "uh oh!"
| ^
error: uh oh!
```

View file

@ -407,7 +407,7 @@ private:
{ {
if (options.ansiColors) if (options.ansiColors)
output << ANSI_RED; output << ANSI_RED;
output << "«" << e.msg() << "»"; output << "«error: " << filterANSIEscapes(e.info().msg.str(), true) << "»";
if (options.ansiColors) if (options.ansiColors)
output << ANSI_NORMAL; output << ANSI_NORMAL;
} }

View file

@ -460,19 +460,7 @@ TEST_F(ValuePrintingTests, ansiColorsError)
test(vError, test(vError,
ANSI_RED ANSI_RED
"«" "«error: uh oh!»"
ANSI_RED
"error:"
ANSI_NORMAL
"\n … while calling the '"
ANSI_MAGENTA
"throw"
ANSI_NORMAL
"' builtin\n\n "
ANSI_RED
"error:"
ANSI_NORMAL
" uh oh!»"
ANSI_NORMAL, ANSI_NORMAL,
PrintOptions { PrintOptions {
.ansiColors = true, .ansiColors = true,
@ -501,19 +489,7 @@ TEST_F(ValuePrintingTests, ansiColorsDerivationError)
test(vAttrs, test(vAttrs,
"{ drvPath = " "{ drvPath = "
ANSI_RED ANSI_RED
"«" "«error: uh oh!»"
ANSI_RED
"error:"
ANSI_NORMAL
"\n … while calling the '"
ANSI_MAGENTA
"throw"
ANSI_NORMAL
"' builtin\n\n "
ANSI_RED
"error:"
ANSI_NORMAL
" uh oh!»"
ANSI_NORMAL ANSI_NORMAL
"; type = " "; type = "
ANSI_MAGENTA ANSI_MAGENTA
@ -527,19 +503,7 @@ TEST_F(ValuePrintingTests, ansiColorsDerivationError)
test(vAttrs, test(vAttrs,
ANSI_RED ANSI_RED
"«" "«error: uh oh!»"
ANSI_RED
"error:"
ANSI_NORMAL
"\n … while calling the '"
ANSI_MAGENTA
"throw"
ANSI_NORMAL
"' builtin\n\n "
ANSI_RED
"error:"
ANSI_NORMAL
" uh oh!»"
ANSI_NORMAL, ANSI_NORMAL,
PrintOptions { PrintOptions {
.ansiColors = true, .ansiColors = true,
@ -560,7 +524,7 @@ TEST_F(ValuePrintingTests, ansiColorsAssert)
state.mkThunk_(v, &expr); state.mkThunk_(v, &expr);
test(v, test(v,
ANSI_RED "«" ANSI_RED "error:" ANSI_NORMAL " assertion '" ANSI_MAGENTA "false" ANSI_NORMAL "' failed»" ANSI_NORMAL, ANSI_RED "«error: assertion 'false' failed»" ANSI_NORMAL,
PrintOptions { PrintOptions {
.ansiColors = true, .ansiColors = true,
.force = true .force = true