homepage-dashboard: add update script

Since we now need to patch dependencies through
pnpm, and that results in a changed lock file
that carries hashes for updated dependencies,
it seems sensible to script the generation of the
patch such that bots can do it, and the process
is somewhat documented.
This commit is contained in:
Jon Seager
2025-03-23 09:38:12 +00:00
parent 849dea57ac
commit f606c72fac
2 changed files with 68 additions and 2 deletions
+2 -2
View File
@@ -11,7 +11,6 @@
lib,
nixosTests,
enableLocalIcons ? false,
nix-update-script,
}:
let
dashboardIcons = fetchFromGitHub {
@@ -42,6 +41,7 @@ stdenv.mkDerivation (finalAttrs: {
# This patch ensures that the cache implementation respects the env
# variable `NIXPKGS_HOMEPAGE_CACHE_DIR`, which is set by default in the
# wrapper below.
# The patch is automatically generated by the `update.sh` script.
patches = [ ./prerender_cache_path.patch ];
pnpmDeps = pnpm_10.fetchDeps {
@@ -101,7 +101,7 @@ stdenv.mkDerivation (finalAttrs: {
tests = {
inherit (nixosTests) homepage-dashboard;
};
updateScript = nix-update-script { };
updateScript = ./update.sh;
};
meta = {
+66
View File
@@ -0,0 +1,66 @@
#!/usr/bin/env nix-shell
#!nix-shell -I nixpkgs=./. -i bash -p curl jq git pnpm_10 sd
# shellcheck shell=bash
set -euo pipefail
nixpkgs="$(pwd)"
cd $(readlink -e $(dirname "${BASH_SOURCE[0]}"))
# Generate the patch file that makes homepage-dashboard aware of the NIXPKGS_HOMEPAGE_CACHE_DIR environment variable.
# Generating the patch this way ensures that both the patch is included, and the lock file is updated.
generate_patch() {
local version; version="$1"
echo "Generating homepage-dashboard patch"
git clone -b "v$version" https://github.com/gethomepage/homepage.git src
pushd src
pnpm install
pnpm patch next
sd \
'this.serverDistDir = ctx.serverDistDir;' \
'this.serverDistDir = require("path").join((process.env.NIXPKGS_HOMEPAGE_CACHE_DIR || "/var/cache/homepage-dashboard"), "homepage");' \
node_modules/.pnpm_patches/next*/dist/server/lib/incremental-cache/file-system-cache.js
pnpm patch-commit node_modules/.pnpm_patches/next*
git add -A .
git diff -p --staged > ../prerender_cache_path.patch
popd
rm -rf src
}
# Update the hash of the homepage-dashboard source code in the Nix expression.
update_homepage_dashboard_source() {
local version; version="$1"
echo "Updating homepage-dashboard source"
old_hash="$(nix eval --json --impure --expr "(import $nixpkgs/default.nix {}).homepage-dashboard.src.outputHash" | jq -r)"
old_version="$(nix eval --json --impure --expr "(import $nixpkgs/default.nix {}).homepage-dashboard.version" | jq -r)"
new_hash="$(nix-build --impure --expr "let src = (import $nixpkgs/default.nix {}).homepage-dashboard.src; in (src.overrideAttrs or (f: src // f src)) (_: { version = \"$version\"; outputHash = \"\"; outputHashAlgo = \"sha256\"; })" 2>&1 | tr -s ' ' | grep -Po "got: \K.+$")" || true
sed -i "s|${old_hash}|${new_hash}|g" default.nix
sed -i "s|${old_version}|${version}|g" default.nix
}
# Update the hash of the homepage-dashboard pnpm dependencies in the Nix expression.
update_pnpm_deps_hash() {
echo "Updating homepage-dashboard pnpm deps hash"
old_hash="$(nix eval --json --impure --expr "(import $nixpkgs/default.nix {}).homepage-dashboard.pnpmDeps.outputHash" | jq -r)"
new_hash="$(nix-build --impure --expr "let src = (import $nixpkgs/default.nix {}).homepage-dashboard.pnpmDeps; in (src.overrideAttrs or (f: src // f src)) (_: { outputHash = \"\"; outputHashAlgo = \"sha256\"; })" 2>&1 | tr -s ' ' | grep -Po "got: \K.+$")" || true
sed -i "s|${old_hash}|${new_hash}|g" default.nix
}
LATEST_TAG="$(curl -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} https://api.github.com/repos/gethomepage/homepage/releases/latest | jq -r '.tag_name')"
LATEST_VERSION="$(expr "$LATEST_TAG" : 'v\(.*\)')"
CURRENT_VERSION="$(grep -Po "version = \"\K[^\"]+" default.nix)"
if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]]; then
echo "homepage-dashboard is up to date: ${CURRENT_VERSION}"
exit 0
fi
update_homepage_dashboard_source "$LATEST_VERSION"
generate_patch "$LATEST_VERSION"
update_pnpm_deps_hash