Funktionen

Ein Testlauf, ein Urteil

Was du davon hast

Dein Agent startet Build, Test oder Linter wie gewohnt, nur mit greppy bash-smart -- davor. Die erste Zeile ist das Urteil, darunter stehen genau die Fehler und Warnungen. Der Rest des Logs liegt eingeklappt hinter einer expand-ID bereit. Exit-Code und Rohausgabe bleiben, wie der Befehl sie geliefert hat.

Vorher und nachher

Ein kleines Python-Projekt hat 300 Tests. Die Tests loggen auf DEBUG-Level, einer schlägt fehl. Die Frage: Was ist kaputt?

Ohne greppy

Der Agent startet die Tests und bekommt das ganze Log: jeden Test, jede Logzeile, am Ende den Fehler.

$ python3 -m unittest -v
test_empty_text_gives_defaults (tests.test_config.TestParseConfig.test_empty_text_gives_defaults) ... ok
test_port_override (tests.test_config.TestParseConfig.test_port_override) ... FAIL
test_tax_percent_00 (tests.test_config.TestParseConfig.test_tax_percent_00) ... ok
…
test_line_total_000 (tests.test_pricing.TestLineTotal.test_line_total_000) ... DEBUG shopcart.pricing: line_total: unit=100 qty=1
INFO shopcart.pricing: line_total: computed 100 cents
ok
…
FAIL: test_port_override (tests.test_config.TestParseConfig.test_port_override)
…
AssertionError: 80 != 8080
…
FAILED (failures=1)

Mit greppy

$ greppy bash-smart -- python3 -m unittest -v
FAILED — exit 1: 4 errors, 0 warnings
723  FAIL: test_port_override (tests.test_config.TestParseConfig.test_port_override)
725  Traceback (most recent call last):
…
727      self.assertEqual(cfg["port"], 8080)
728      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
729  AssertionError: 80 != 8080
730  
734  FAILED (failures=1)
…
test_tax_percent_18 (tests.test_config.TestParseConfig.test_tax_percent_18) ... ok
… lines 22-105 (84 collapsed lines) — greppy expand bbb7266558408ac3
…
… lines 199-674 (476 collapsed lines) — greppy expand bbb7266558408ac3
…

Urteil und Fehlerblock stehen ganz oben, mit ihrer Zeilennummer im Log. Danach folgen Anfang und Ende der Ausgabe; die Mitte ist eingeklappt.

ohne greppy mit greppy
Aufrufe 1 1
Zeilen Ausgabe 734 98
Zeichen Ausgabe 48.605 6.078
Token 13.094 1.651
Exit-Code 1 1

Braucht der Agent doch das ganze Log, holt er den eingeklappten Teil mit der expand-ID aus derselben Ausgabe. Jede Seite nennt am Ende die ID der nächsten.

$ greppy expand bbb7266558408ac3
test_tax_percent_19 (tests.test_config.TestParseConfig.test_tax_percent_19) ... ok
test_tax_percent_20 (tests.test_config.TestParseConfig.test_tax_percent_20) ... ok
…
test_line_total_081 (tests.test_pricing.TestLineTotal.test_line_total_081) ... DEBUG shopcart.pricing: line_total: unit=181 qty=5
… 250 lines — greppy expand 6e6a4500016662ed continues at 425

So funktioniert es

bash-smart startet den Befehl unverändert und fängt stdout und stderr byte-genau ab. Sein Exit-Code ist der Exit-Code des Befehls, Skripte und CI behandeln ihn also wie das Original. Die erste Zeile nennt das Ergebnis, den Exit-Code und die Zahl der Fehler und Warnungen. Darauf folgen die Fehler- und Warnungsblöcke mit ihrer Zeilennummer im Log, danach Anfang und Ende der Ausgabe. Die Mitte liegt hinter einer expand-ID, greppy expand ID gibt sie byte-genau und seitenweise zurück. Mit -e REGEX hebst du zusätzlich jede Zeile heraus, die auf ein eigenes Muster passt. Ausgaben bis 80 Zeilen erscheinen vollständig nach dem Urteil. Pipelines übergibst du als einen quotierten Ausdruck, sie laufen mit pipefail: Ein fehlschlagender Befehl vor | tail bleibt ein Fehlschlag.

Die Befehle

Befehl was er tut
greppy bash-smart -- CMD führt CMD unverändert aus: Urteil, Fehler und Warnungen zuerst, der Rest eingeklappt, Exit-Code wie das Original
greppy bash-smart -e REGEX -- CMD hebt zusätzlich jede Zeile, die auf REGEX passt, mit ihrer Zeilennummer heraus; mehrfach verwendbar
greppy bash-smart -- 'AUSDRUCK' Shell-Ausdrücke wie Pipelines als ein quotierter Ausdruck, ausgeführt in Bash mit pipefail
greppy expand ID den eingeklappten Teil des Logs, byte-genau und seitenweise

Mehr in der Doku