aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/rl-next/better-errors-in-nix-repl.md40
-rw-r--r--src/libexpr/print.cc2
-rw-r--r--tests/unit/libexpr/value/print.cc44
3 files changed, 45 insertions, 41 deletions
diff --git a/doc/manual/rl-next/better-errors-in-nix-repl.md b/doc/manual/rl-next/better-errors-in-nix-repl.md
new file mode 100644
index 000000000..4deaa8c70
--- /dev/null
+++ b/doc/manual/rl-next/better-errors-in-nix-repl.md
@@ -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!
+```
+
diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc
index fbd91e484..86eadfb17 100644
--- a/src/libexpr/print.cc
+++ b/src/libexpr/print.cc
@@ -407,7 +407,7 @@ private:
{
if (options.ansiColors)
output << ANSI_RED;
- output << "«" << e.msg() << "»";
+ output << "«error: " << filterANSIEscapes(e.info().msg.str(), true) << "»";
if (options.ansiColors)
output << ANSI_NORMAL;
}
diff --git a/tests/unit/libexpr/value/print.cc b/tests/unit/libexpr/value/print.cc
index c4264a38d..c1de3a6a9 100644
--- a/tests/unit/libexpr/value/print.cc
+++ b/tests/unit/libexpr/value/print.cc
@@ -460,19 +460,7 @@ TEST_F(ValuePrintingTests, ansiColorsError)
test(vError,
ANSI_RED
- "«"
- ANSI_RED
- "error:"
- ANSI_NORMAL
- "\n … while calling the '"
- ANSI_MAGENTA
- "throw"
- ANSI_NORMAL
- "' builtin\n\n "
- ANSI_RED
- "error:"
- ANSI_NORMAL
- " uh oh!»"
+ "«error: uh oh!»"
ANSI_NORMAL,
PrintOptions {
.ansiColors = true,
@@ -501,19 +489,7 @@ TEST_F(ValuePrintingTests, ansiColorsDerivationError)
test(vAttrs,
"{ drvPath = "
ANSI_RED
- "«"
- ANSI_RED
- "error:"
- ANSI_NORMAL
- "\n … while calling the '"
- ANSI_MAGENTA
- "throw"
- ANSI_NORMAL
- "' builtin\n\n "
- ANSI_RED
- "error:"
- ANSI_NORMAL
- " uh oh!»"
+ "«error: uh oh!»"
ANSI_NORMAL
"; type = "
ANSI_MAGENTA
@@ -527,19 +503,7 @@ TEST_F(ValuePrintingTests, ansiColorsDerivationError)
test(vAttrs,
ANSI_RED
- "«"
- ANSI_RED
- "error:"
- ANSI_NORMAL
- "\n … while calling the '"
- ANSI_MAGENTA
- "throw"
- ANSI_NORMAL
- "' builtin\n\n "
- ANSI_RED
- "error:"
- ANSI_NORMAL
- " uh oh!»"
+ "«error: uh oh!»"
ANSI_NORMAL,
PrintOptions {
.ansiColors = true,
@@ -560,7 +524,7 @@ TEST_F(ValuePrintingTests, ansiColorsAssert)
state.mkThunk_(v, &expr);
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 {
.ansiColors = true,
.force = true