diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc index 6eb321c43..2ee11d9d3 100644 --- a/src/libexpr/print.cc +++ b/src/libexpr/print.cc @@ -277,13 +277,10 @@ private: void printAttrs(Value & v, size_t depth) { - if (seen && !seen->insert(v.attrs).second) { - printRepeated(); - return; - } - if (options.force && options.derivationPaths && state.isDerivation(v)) { printDerivation(v); + } else if (seen && !v.attrs->empty() && !seen->insert(v.attrs).second) { + printRepeated(); } else if (depth < options.maxDepth) { increaseIndent(); output << "{"; diff --git a/tests/unit/libexpr/value/print.cc b/tests/unit/libexpr/value/print.cc index cdbc8f8f9..1f99b562d 100644 --- a/tests/unit/libexpr/value/print.cc +++ b/tests/unit/libexpr/value/print.cc @@ -641,20 +641,24 @@ TEST_F(ValuePrintingTests, ansiColorsBlackhole) TEST_F(ValuePrintingTests, ansiColorsAttrsRepeated) { - BindingsBuilder emptyBuilder(state, state.allocBindings(1)); + Value vZero; + vZero.mkInt(0); - Value vEmpty; - vEmpty.mkAttrs(emptyBuilder.finish()); + BindingsBuilder innerBuilder(state, state.allocBindings(1)); + innerBuilder.insert(state.symbols.create("x"), &vZero); + + Value vInner; + vInner.mkAttrs(innerBuilder.finish()); BindingsBuilder builder(state, state.allocBindings(10)); - builder.insert(state.symbols.create("a"), &vEmpty); - builder.insert(state.symbols.create("b"), &vEmpty); + builder.insert(state.symbols.create("a"), &vInner); + builder.insert(state.symbols.create("b"), &vInner); Value vAttrs; vAttrs.mkAttrs(builder.finish()); test(vAttrs, - "{ a = { }; b = " ANSI_MAGENTA "«repeated»" ANSI_NORMAL "; }", + "{ a = { x = " ANSI_CYAN "0" ANSI_NORMAL "; }; b = " ANSI_MAGENTA "«repeated»" ANSI_NORMAL "; }", PrintOptions { .ansiColors = true }); @@ -662,19 +666,23 @@ TEST_F(ValuePrintingTests, ansiColorsAttrsRepeated) TEST_F(ValuePrintingTests, ansiColorsListRepeated) { - BindingsBuilder emptyBuilder(state, state.allocBindings(1)); + Value vZero; + vZero.mkInt(0); - Value vEmpty; - vEmpty.mkAttrs(emptyBuilder.finish()); + BindingsBuilder innerBuilder(state, state.allocBindings(1)); + innerBuilder.insert(state.symbols.create("x"), &vZero); + + Value vInner; + vInner.mkAttrs(innerBuilder.finish()); Value vList; state.mkList(vList, 3); - vList.bigList.elems[0] = &vEmpty; - vList.bigList.elems[1] = &vEmpty; + vList.bigList.elems[0] = &vInner; + vList.bigList.elems[1] = &vInner; vList.bigList.size = 2; test(vList, - "[ { } " ANSI_MAGENTA "«repeated»" ANSI_NORMAL " ]", + "[ { x = " ANSI_CYAN "0" ANSI_NORMAL "; } " ANSI_MAGENTA "«repeated»" ANSI_NORMAL " ]", PrintOptions { .ansiColors = true }); @@ -682,20 +690,24 @@ TEST_F(ValuePrintingTests, ansiColorsListRepeated) TEST_F(ValuePrintingTests, listRepeated) { - BindingsBuilder emptyBuilder(state, state.allocBindings(1)); + Value vZero; + vZero.mkInt(0); - Value vEmpty; - vEmpty.mkAttrs(emptyBuilder.finish()); + BindingsBuilder innerBuilder(state, state.allocBindings(1)); + innerBuilder.insert(state.symbols.create("x"), &vZero); + + Value vInner; + vInner.mkAttrs(innerBuilder.finish()); Value vList; state.mkList(vList, 3); - vList.bigList.elems[0] = &vEmpty; - vList.bigList.elems[1] = &vEmpty; + vList.bigList.elems[0] = &vInner; + vList.bigList.elems[1] = &vInner; vList.bigList.size = 2; - test(vList, "[ { } «repeated» ]", PrintOptions { }); + test(vList, "[ { x = 0; } «repeated» ]", PrintOptions { }); test(vList, - "[ { } { } ]", + "[ { x = 0; } { x = 0; } ]", PrintOptions { .trackRepeated = false });