Files
coredesktop/version
T
david c3ac9f49d0
shellcheck / shellcheck (push) Failing after 14s
improve version and mirror updating
2026-11-04 07:08:44 -07:00

135 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
#
# Purpose : Show which version of CoreDesktop this machine is running
#
# CoreDesktop is a rolling release, so its version is the date of the commit
# the local checkout is on, plus the short hash to tell same-day commits apart,
# e.g. 2026.10.22 (c5f0651). The kernel and video driver are shown separately
# because they come from Arch, not CoreDesktop, along with any newer release of
# either that update would install.
#
# version --check prints the newer version and exits 0 if one is available,
# exits 1 if this machine is up to date, or 2 if it couldn't check.
COREDESKTOP="$HOME/.local/share/coredesktop"
source "$COREDESKTOP/utils.sh"
if ! git -C "$COREDESKTOP" rev-parse --git-dir &> /dev/null; then
echo "CoreDesktop isn't installed in $COREDESKTOP."
exit 2
fi
# Version string for a commit, e.g. 2026.10.22 (c5f0651)
describe() {
git -C "$COREDESKTOP" log -1 --format='%cd (%h)' --date=format:%Y.%m.%d "$1"
}
# Print the newer version if the remote has commits this checkout doesn't.
# Returns 1 if up to date, 2 if the remote couldn't be reached.
newer_version() {
GIT_TERMINAL_PROMPT=0 timeout 30 git -C "$COREDESKTOP" fetch --quiet &> /dev/null || return 2
local behind
behind="$(git -C "$COREDESKTOP" rev-list --count 'HEAD..@{upstream}' 2> /dev/null)" || return 2
(( behind > 0 )) || return 1
describe '@{upstream}'
}
if [ "$1" = "--check" ]; then
newer_version
exit
fi
version="$(describe HEAD)"
# Local edits to the checkout mean this isn't exactly the version above
if [ -n "$(git -C "$COREDESKTOP" status --porcelain --untracked-files=no)" ]; then
version="$version, modified"
fi
if latest="$(newer_version)"; then
version="$version, $latest is available (run update)"
fi
# A version without its epoch and pkgrel, e.g. 1:26.2.6-1 is 26.2.6. Arch's
# kernel puts its suffix in the version too (7.2.14.arch1), so drop that.
upstream() {
local v="${1#*:}"
v="${v%-*}"
echo "${v%.arch*}"
}
# Packages with a newer version in the repos, as "name old -> new" lines.
# checkupdates syncs a copy of the package database, so it needs no root and
# doesn't leave a partial upgrade behind. Empty if it couldn't check.
pending=""
if command -v checkupdates &> /dev/null; then
pending="$(timeout 30 checkupdates 2> /dev/null)"
fi
# Print the newer upstream version of package $1 if the repos have one. A
# rebuild of the same version (only the pkgrel changed) doesn't count.
newer_package() {
local name old _ new
while read -r name old _ new; do
[ "$name" = "$1" ] || continue
[ "$(upstream "$old")" != "$(upstream "$new")" ] && upstream "$new"
return
done <<< "$pending"
return 1
}
kernel="$(uname -r)"
# The package the running kernel came from (linux, linux-lts, ...)
kernel_pkg="$(cat "/usr/lib/modules/$kernel/pkgbase" 2> /dev/null)"
case "$kernel" in
*-lts) kernel_pkg="${kernel_pkg:-linux-lts}" ;;
*-zen) kernel_pkg="${kernel_pkg:-linux-zen}" ;;
*-hardened) kernel_pkg="${kernel_pkg:-linux-hardened}" ;;
*) kernel_pkg="${kernel_pkg:-linux}" ;;
esac
# If the running kernel's modules are gone, a newer kernel was installed
if [ ! -d "/usr/lib/modules/$kernel" ]; then
kernel="$kernel (newer kernel installed, reboot to use it)"
fi
if latest="$(newer_package "$kernel_pkg")"; then
kernel="$kernel, $latest is available (run update)"
fi
# NVIDIA's driver if nvidia.sh installed it, otherwise Mesa, which drives
# Intel and AMD graphics (vulkan-intel and vulkan-radeon are built with it)
driver=""
for pkg in nvidia-utils nvidia-580xx-utils mesa; do
if installed="$(pacman -Q "$pkg" 2> /dev/null)"; then
case "$pkg" in
nvidia*) driver="NVIDIA $(upstream "${installed#* }")" ;;
*) driver="Mesa $(upstream "${installed#* }")" ;;
esac
if latest="$(newer_package "$pkg")"; then
driver="$driver, $latest is available (run update)"
fi
break
fi
done
# 10-pacman.sh rewrites this log on every update
if [ -f "$PACMAN_UPDATE_LOG" ]; then
last_update="$(date -r "$PACMAN_UPDATE_LOG" '+%Y-%m-%d %H:%M')"
else
last_update="never"
fi
echo "CoreDesktop $version"
echo "Kernel $kernel"
[ -n "$driver" ] && echo "Video driver $driver"
echo "Last update $last_update"
# Packages newer than the mirror's last sync aren't shown above, or installed
if age="$(mirror_age_hours)" && (( age >= MIRROR_STALE_HOURS )); then
if (( age >= 48 )); then ago="$(( age / 24 )) days"; else ago="$age hours"; fi
echo
echo -e "\e[33mYour package mirror ($(first_mirror)) last synced with Arch $ago ago, so"
echo -e "newer packages may be missing. Run update to switch to up-to-date mirrors.\e[0m"
fi