From 455e006e86472a079f42340e3f14eccf09d8dfad Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Sat, 31 Oct 2026 13:13:43 -0700 Subject: Open the stats window at midnight on its first day --- source/ui-stats.c | 4 ++++ tests/t0112-stats.sh | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/source/ui-stats.c b/source/ui-stats.c index e4dcf8e..6cb2653 100644 --- a/source/ui-stats.c +++ b/source/ui-stats.c @@ -162,6 +162,10 @@ static void window_start(const struct cgit_period *period, struct tm *tm) time(&now); gmtime_r(&now, tm); period->trunc(tm); + // The window opens at midnight, not at the time of day it is now. + tm->tm_hour = 0; + tm->tm_min = 0; + tm->tm_sec = 0; for (i = 1; i < period->count; i++) period->dec(tm); } diff --git a/tests/t0112-stats.sh b/tests/t0112-stats.sh index 7b08a6b..7e1fcc5 100755 --- a/tests/t0112-stats.sh +++ b/tests/t0112-stats.sh @@ -96,4 +96,32 @@ test_expect_success 'every period renders its own columns' ' grep -E "]*>[0-9]{4}" tmp ' +# The yearly window opens on the first of January three years back. cgit reads +# the real clock, so the two commits sit either side of midnight on that day. +test_expect_success 'the window opens at midnight on its first day' ' + first=$(($(date -u +%Y) - 3)) && + test_create_repo repos/edge && + ( + cd repos/edge && + GIT_AUTHOR_NAME="Too Early" \ + GIT_AUTHOR_DATE="$((first - 1))-12-31 23:59:59 +0000" \ + GIT_COMMITTER_DATE="$((first - 1))-12-31 23:59:59 +0000" \ + git commit --allow-empty -m before && + GIT_AUTHOR_NAME="Early Bird" \ + GIT_AUTHOR_DATE="$first-01-01 00:00:00 +0000" \ + GIT_COMMITTER_DATE="$first-01-01 00:00:00 +0000" \ + git commit --allow-empty -m first + ) && + { + echo "virtual-root=/" && + echo "cache-size=0" && + echo "max-stats=year" && + echo "repo.url=edge" && + echo "repo.path=$PWD/repos/edge/.git" + } >edgerc && + CGIT_CONFIG="$PWD/edgerc" QUERY_STRING="url=edge/stats/&period=y" cgit >tmp && + grep ">Early Bird<" tmp && + ! grep ">Too Early<" tmp +' + test_done -- cgit