From 1d79ce85a551fa394e05d9be17457b3857504dac Mon Sep 17 00:00:00 2001 From: Stephan Lo Date: Sat, 25 Oct 2025 23:49:48 +0200 Subject: [PATCH] feat(ui): add git version info display in header - Display current branch/tag and commit hash in navbar center - Show dirty working directory indicator with yellow badge - Add automatic build info generation in Task workflow - Include build timestamp and user information - Style with responsive design (hidden on mobile) - Add .gitignore entries for generated build artifacts --- .gitignore | 6 +++ Taskfile.yml | 14 +++++++ layouts/partials/hooks/head-end.html | 4 ++ layouts/partials/navbar-version.html | 17 ++++++++ layouts/partials/version-info-script.html | 35 +++++++++++++++++ layouts/partials/version-info.html | 36 +++++++++++++++++ scripts/generate-build-info.sh | 48 +++++++++++++++++++++++ static/css/version-info.css | 36 +++++++++++++++++ 8 files changed, 196 insertions(+) create mode 100644 layouts/partials/navbar-version.html create mode 100644 layouts/partials/version-info-script.html create mode 100644 layouts/partials/version-info.html create mode 100755 scripts/generate-build-info.sh create mode 100644 static/css/version-info.css diff --git a/.gitignore b/.gitignore index d6893b7..67fecf1 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,12 @@ tmp/ # devbox .devbox/ +# Task cache +.task/ + +# Generated build data +data/ + # IDE .vscode/ .idea/ diff --git a/Taskfile.yml b/Taskfile.yml index acf0237..02efb4c 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -15,6 +15,7 @@ tasks: desc: Build Hugo site deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} --gc --minify" @@ -22,13 +23,25 @@ tasks: desc: Build Hugo site for development deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}}" + build:generate-info: + desc: Generate build information (git commit, version, etc.) + sources: + - .git/HEAD + - .git/refs/**/* + generates: + - data/build_info.json + cmds: + - ./scripts/generate-build-info.sh + serve: desc: Start Hugo dev server deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} server" @@ -56,6 +69,7 @@ tasks: desc: Test Hugo build deps: - deps:ensure-npm + - build:generate-info cmds: - "{{.HUGO_CMD}} --gc --minify --logLevel info" diff --git a/layouts/partials/hooks/head-end.html b/layouts/partials/hooks/head-end.html index 3439ee1..8c62718 100644 --- a/layouts/partials/hooks/head-end.html +++ b/layouts/partials/hooks/head-end.html @@ -3,3 +3,7 @@ {{ end }} + + + +{{ partial "version-info-script.html" . }} diff --git a/layouts/partials/navbar-version.html b/layouts/partials/navbar-version.html new file mode 100644 index 0000000..59a31ca --- /dev/null +++ b/layouts/partials/navbar-version.html @@ -0,0 +1,17 @@ +{{/* Header version info - compact display in navbar */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} + +{{ end }} \ No newline at end of file diff --git a/layouts/partials/version-info-script.html b/layouts/partials/version-info-script.html new file mode 100644 index 0000000..d1724af --- /dev/null +++ b/layouts/partials/version-info-script.html @@ -0,0 +1,35 @@ +{{/* Inline JavaScript to add version info to navbar */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} + +{{ end }} \ No newline at end of file diff --git a/layouts/partials/version-info.html b/layouts/partials/version-info.html new file mode 100644 index 0000000..ac3315e --- /dev/null +++ b/layouts/partials/version-info.html @@ -0,0 +1,36 @@ +{{/* Version info banner - displays git commit info and build time */}} +{{ $buildInfo := .Site.Data.build_info }} +{{ if $buildInfo }} +
+
+
+
+ + + {{ if $buildInfo.git_tag }} + {{ $buildInfo.git_tag }} + {{ if ne $buildInfo.git_tag $buildInfo.git_commit }} + (@{{ $buildInfo.git_commit_short }}) + {{ end }} + {{ else }} + {{ $buildInfo.git_branch }} + @{{ $buildInfo.git_commit_short }} + {{ end }} + {{ if $buildInfo.git_dirty }} + dirty + {{ end }} + +
+
+ + + Built {{ $buildInfo.build_time_human }} + {{ if $buildInfo.build_user }} + by {{ $buildInfo.build_user }} + {{ end }} + +
+
+
+
+{{ end }} \ No newline at end of file diff --git a/scripts/generate-build-info.sh b/scripts/generate-build-info.sh new file mode 100755 index 0000000..a10e2c2 --- /dev/null +++ b/scripts/generate-build-info.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Generate build information for Hugo +# This script collects git information and build metadata + +set -euo pipefail + +# Create data directory if it doesn't exist +mkdir -p data + +# Get git information +GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown") +GIT_COMMIT_SHORT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") +GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown") +GIT_TAG=$(git describe --tags --exact-match 2>/dev/null || echo "") +GIT_DIRTY="" + +# Check if working directory is dirty +if git diff-index --quiet HEAD -- 2>/dev/null; then + GIT_DIRTY="false" +else + GIT_DIRTY="true" +fi + +# Get build information +BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") +BUILD_TIME_HUMAN=$(date -u +"%Y-%m-%d %H:%M UTC") +BUILD_USER=$(whoami 2>/dev/null || echo "unknown") +BUILD_HOST=$(hostname 2>/dev/null || echo "unknown") + +# Create JSON file for Hugo +cat > data/build_info.json << EOF +{ + "git_commit": "${GIT_COMMIT}", + "git_commit_short": "${GIT_COMMIT_SHORT}", + "git_branch": "${GIT_BRANCH}", + "git_tag": "${GIT_TAG}", + "git_dirty": ${GIT_DIRTY}, + "build_time": "${BUILD_TIME}", + "build_time_human": "${BUILD_TIME_HUMAN}", + "build_user": "${BUILD_USER}", + "build_host": "${BUILD_HOST}" +} +EOF + +echo "✓ Build info generated: data/build_info.json" +echo " Git: ${GIT_BRANCH}@${GIT_COMMIT_SHORT}${GIT_TAG:+ (${GIT_TAG})}" +echo " Built: ${BUILD_TIME_HUMAN} by ${BUILD_USER}" \ No newline at end of file diff --git a/static/css/version-info.css b/static/css/version-info.css new file mode 100644 index 0000000..89c7631 --- /dev/null +++ b/static/css/version-info.css @@ -0,0 +1,36 @@ +/* Navbar version info styles */ +.navbar-version-info { + flex: 1; + justify-content: center; + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; +} + +.navbar-version-info code { + background: rgba(255, 255, 255, 0.1); + padding: 0.1rem 0.3rem; + border-radius: 0.2rem; + font-size: 0.8rem; +} + +.navbar-version-info .badge { + font-size: 0.6rem; + padding: 0.1rem 0.3rem; +} + +/* Hide on small screens */ +@media (max-width: 767px) { + .navbar-version-info { + display: none !important; + } +} + +/* Additional responsive tweaks */ +@media (min-width: 768px) and (max-width: 991px) { + .navbar-version-info { + flex: 0.5; + } + + .navbar-version-info small { + font-size: 0.75rem; + } +} \ No newline at end of file