forked from lix-project/lix
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:
parent
c864923928
commit
7673312ccc
40
doc/manual/rl-next/better-errors-in-nix-repl.md
Normal file
40
doc/manual/rl-next/better-errors-in-nix-repl.md
Normal 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!
|
||||||
|
```
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue