Release v0.9.21: the watcher's reach into origin is visible

Also fixes the log-capture test added with step 19: the test JVM logs at
WARN, so the INFO line reporting the recovered fetch never reached the
appender. The helper now lowers the level explicitly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-30 11:19:42 +02:00
co-authored by Claude Opus 5
parent e4e4cd1899
commit 0229081570
3 changed files with 22 additions and 2 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ group = "de.hoennig"
// bump at least the patch version for every deployment — and only then, not per commit —
// so the UI footer (BuildProperties), --version and the release notes identify what is
// actually running; a deployment bundles whatever was committed since the last one
version = "0.9.20"
version = "0.9.21"
java {
toolchain {
@@ -7,6 +7,20 @@
<div th:replace="~{fragments :: nav(${view})}"></div>
<div class="panel release-notes">
<h2>v0.9.21 <span class="muted">— 2026-08-30</span></h2>
<ul>
<li>An origin the watcher cannot reach is now visible in the web UI: a banner above the
table says that the list below is not updating, since when, and why. Until now the
page kept showing its last known state, calm and plausible, while GitTally had not
been able to fetch for an hour — the failure lived in the log alone. The banner is
deliberately separate from the live indicator: that one says whether your browser
reaches the server, this one whether the server reaches origin.</li>
<li>A lasting fetch failure is logged when its message changes instead of on every poll
cycle, and the recovery is logged once. One wrong token used to write several hundred
identical warnings an hour. An invalid <code>atTimes</code> slot is likewise reported
once per slot.</li>
</ul>
<h2>v0.9.20 <span class="muted">— 2026-08-29</span></h2>
<ul>
<li>A build definition is now split in two: a <code>trigger</code> block says when the
@@ -1,5 +1,6 @@
package de.hoennig.gittally.watcher
import ch.qos.logback.classic.Level
import ch.qos.logback.classic.Logger
import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.read.ListAppender
@@ -773,11 +774,16 @@ class WatcherTest : FunSpec() {
}
}
/** Collects this spec's [Watcher] log messages; the returned lambda reads them at any point. */
/**
* Collects this spec's [Watcher] log messages; the returned lambda reads them at any point.
* The level is lowered explicitly — the test JVM logs at WARN, which would drop the very
* INFO line that says the fetch recovered.
*/
private fun captureWatcherLog(): () -> List<String> {
val logger = LoggerFactory.getLogger(Watcher::class.java) as Logger
val appender = ListAppender<ILoggingEvent>()
appender.start()
logger.level = Level.INFO
logger.addAppender(appender)
return { appender.list.map { it.formattedMessage } }
}