diff --git a/packages/u/usysconf-epoch/files/epoch.service b/packages/u/usysconf-epoch/files/epoch.service
new file mode 100644
index 00000000000..0ab27a06fb1
--- /dev/null
+++ b/packages/u/usysconf-epoch/files/epoch.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Perform the epoch transition
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+EnvironmentFile=-/etc/sysconfig/epoch
+ExecStart=/usr/lib64/usysconf/epoch.sh
+Type=notify
+
+RemainAfterExit=yes
+TimeoutStartSec=60s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/packages/u/usysconf-epoch/files/epoch.sh b/packages/u/usysconf-epoch/files/epoch.sh
new file mode 100644
index 00000000000..2b24f551b0c
--- /dev/null
+++ b/packages/u/usysconf-epoch/files/epoch.sh
@@ -0,0 +1,186 @@
+#!/usr/bin/env bash
+set -euo pipefail
+shopt -s nullglob
+
+EPOCH_ENABLE="${EPOCH_ENABLE:=no}"
+
+STATE_DIR="${STATE_DIR:=/var/solus/usr-merge}"
+MERGE_FLAG_FILE="${MERGE_FLAG_FILE:=${STATE_DIR}/merge-complete}"
+
+OLD_REPO="https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"
+NEW_REPO="https://cdn.getsol.us/repo/polaris/eopkg-index.xml.xz"
+
+export LC_ALL=C
+
+declare -A DESKTOP_FLAG_FILES=(
+ ["budgie"]="/usr/bin/budgie-desktop"
+ ["gnome"]="/usr/bin/gnome-shell"
+ ["kde"]="/usr/bin/startplasma-wayland"
+ ["xfce"]="/usr/bin/xfce4-session"
+ ["mate"]="/usr/bin/mate-about"
+)
+declare -A DESKTOP_SOFTWARE_CENTRE=(
+ ["budgie"]="discover"
+ ["gnome"]="gnome-software"
+ ["kde"]="discover"
+ ["xfce"]="discover"
+ ["mate"]="discover"
+)
+declare -A SC_DESKTOP_FILES=(
+ ["discover"]="/usr/share/applications/org.kde.discover.desktop"
+ ["gnome-software"]="/usr/share/applications/org.gnome.Software.desktop"
+)
+
+function update_repo() {
+ local repo=""
+ local active=""
+ while read -r line
+ do
+ if [[ "${repo}" == "" ]]
+ then
+ repo="${line% *}"
+ active="${line##"${repo}" }"
+ continue
+ fi
+
+ url="${line## }"
+ if [[ "${url}" == "${OLD_REPO}" ]]
+ then
+ echo "Updating repo ${repo} to ${NEW_REPO}"
+
+ eopkg add-repo -y "${repo}" "${NEW_REPO}"
+
+ if [[ "${active}" == "[inactive]" ]]
+ then
+ eopkg disable-repo "${repo}"
+ fi
+ fi
+
+ repo=""
+ done <<< "$(eopkg list-repo --no-color)"
+}
+
+function is_installed() {
+ eopkg info --no-color --short "${1}" | grep -P '^\[inst\]' >/dev/null
+}
+
+function desktop_name() {
+ local field
+
+ if [[ "$2" != "" ]]
+ then
+ field="^Name\[$2\]="
+ else
+ field="^Name="
+ fi
+
+ local name
+ name="$(grep "${field}" "${SC_DESKTOP_FILES[$1]}" | head -n1 || true)"
+
+ echo "${name#*=}"
+}
+
+function sc_name() {
+ local name
+
+ for lang in "${LANG%.*}" "${LANG%_*}" ""
+ do
+ name="$(desktop_name "$1" "${lang}")"
+ if [[ "${name}" != "" ]]
+ then
+ echo "${name}"
+ return
+ fi
+ done
+}
+
+function wait_login() {
+ while true
+ do
+ for path in /run/user/*
+ do
+ if [[ "$(basename "$path")" -ge 1000 ]]
+ then
+ # wait for the login to complete
+ sleep 10
+ return
+ fi
+ done
+
+ sleep 10
+ done
+}
+
+# Based on StackOverflow post by Fabio A.
+# See https://stackoverflow.com/a/49533938
+function _notify-send() {
+ local user
+
+ for bus in /run/user/*/bus
+ do
+ user="$(stat -c '%U' "${bus}")"
+ sudo -u "${user}" env DBUS_SESSION_BUS_ADDRESS="unix:path=$bus" notify-send "$@"
+ done
+}
+
+if [[ "${EPOCH_ENABLE}" != "yes" ]]
+then
+ echo "Not enabled, refusing to transition"
+ exit 0
+fi
+
+if [[ ! -e "${MERGE_FLAG_FILE}" ]]
+then
+ echo "Not ready: not usr-merged"
+ exit 1
+fi
+
+if [[ "$(readlink /usr/bin/eopkg)" != "eopkg.bin" ]]
+then
+ echo "Not ready: eopkg is not python3"
+ exit 1
+fi
+
+desktop=""
+removed_sc=false
+
+# Install appropriate software centre
+for d in "${!DESKTOP_FLAG_FILES[@]}"
+do
+ if [[ -e "${DESKTOP_FLAG_FILES[$d]}" ]]
+ then
+ desktop="${d}"
+ break
+ fi
+done
+
+sc_package="${DESKTOP_SOFTWARE_CENTRE[$desktop]}"
+echo "Detected desktop: ${desktop}"
+
+if ! is_installed "${sc_package}"
+then
+ echo "Installing new SC: ${sc_package}"
+ eopkg install --yes-all "${DESKTOP_SOFTWARE_CENTRE[$desktop]}"
+fi
+
+if is_installed solus-sc
+then
+ echo "Removing old SC"
+ eopkg remove --yes-all solus-sc
+ removed_sc=true
+fi
+
+echo "Checking repository"
+update_repo
+
+echo "Finished! Welcome to the new epoch."
+systemd-notify --ready
+
+if [[ "${removed_sc}" == "true" ]]
+then
+ wait_login
+ _notify-send --urgency=critical \
+ --icon=software \
+ "Solus Software" \
+ "Software Center is now '$(sc_name "${sc_package}")'" || true
+fi
diff --git a/packages/u/usysconf-epoch/files/usysconf-epoch.preset b/packages/u/usysconf-epoch/files/usysconf-epoch.preset
new file mode 100644
index 00000000000..36e03e2f474
--- /dev/null
+++ b/packages/u/usysconf-epoch/files/usysconf-epoch.preset
@@ -0,0 +1,2 @@
+enable usr-merge.service
+enable epoch.service
diff --git a/packages/u/usysconf-epoch/package.yml b/packages/u/usysconf-epoch/package.yml
index 0cd22da458f..0dd1e165d47 100644
--- a/packages/u/usysconf-epoch/package.yml
+++ b/packages/u/usysconf-epoch/package.yml
@@ -1,6 +1,6 @@
name : usysconf-epoch
version : 1.0.0
-release : 17
+release : 18
source :
# We need something for a source
- https://getsol.us/sources/hotspot.txt : a12b7cb43c9d9134b5bb1b35e9096b66775d9e92e7611d1cc92b02edd6782a87
@@ -12,10 +12,9 @@ summary : Temporary package for hosting epoch and usr-merge scripts
description: |
Temporary package for hosting the epoch script
install : |
- install -Dm00755 $pkgfiles/usr-merge.sh -t $installdir/usr/lib64/usysconf/
+ install -Dm00755 -t $installdir/usr/lib64/usysconf/ $pkgfiles/*.sh
+ install -Dm00644 -t $installdir/%libdir%/systemd/system/ $pkgfiles/*.service
- # Systemd units to run this early in the boot
- install -Dm00644 $pkgfiles/usr-merge.service -t $installdir/%libdir%/systemd/system/
-
- install -Ddm00755 $installdir/%libdir%/systemd/system/sysinit.target.wants
+ install -Ddm00755 $installdir/%libdir%/systemd/system/{sysinit,multi-user}.target.wants
ln -srv $installdir/%libdir%/systemd/system/usr-merge.service $installdir/%libdir%/systemd/system/sysinit.target.wants/usr-merge.service
+ ln -srv $installdir/%libdir%/systemd/system/epoch.service $installdir/%libdir%/systemd/system/multi-user.target.wants/epoch.service
diff --git a/packages/u/usysconf-epoch/pspec_x86_64.xml b/packages/u/usysconf-epoch/pspec_x86_64.xml
index 047e467081b..b578a8bc08b 100644
--- a/packages/u/usysconf-epoch/pspec_x86_64.xml
+++ b/packages/u/usysconf-epoch/pspec_x86_64.xml
@@ -20,14 +20,17 @@
system.base
+ /usr/lib64/systemd/system/epoch.service
+ /usr/lib64/systemd/system/multi-user.target.wants/epoch.service
/usr/lib64/systemd/system/sysinit.target.wants/usr-merge.service
/usr/lib64/systemd/system/usr-merge.service
+ /usr/lib64/usysconf/epoch.sh
/usr/lib64/usysconf/usr-merge.sh
-
- 2024-10-22
+
+ 2025-10-04
1.0.0
Packaging update
Silke Hofstra