feat(launcher): one-click update script for the desktop entry
update-keynctr.sh: fetch origin/master, ff-only pull (aborts on dirty tracked tree), cargo + frontend rebuild, notify-send result. Login-shell PATH is reconstructed for cargo/node. Idempotent: quiet no-op when already current. Installed as 'Keynctr Update' desktop entry + right-click 'Update Keynctr' action on the main entry (entries live in ~/.local/share/applications, not tracked).
This commit is contained in:
parent
33ab4fe113
commit
abc27819cb
1 changed files with 53 additions and 0 deletions
53
update-keynctr.sh
Executable file
53
update-keynctr.sh
Executable file
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Update Keynctr from origin/master and rebuild, then notify.
|
||||||
|
# Safe for the vault: touches only the repo + build outputs, never
|
||||||
|
# ~/.local/share/keynectr. If there is nothing new it exits quietly-fast.
|
||||||
|
# A dirty tracked tree aborts the pull (nothing is stashed or overwritten).
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
REPO="/home/avi/Projects/Keynctr"
|
||||||
|
LOG="$HOME/.local/state/keynctr-update.log"
|
||||||
|
mkdir -p "$(dirname "$LOG")"
|
||||||
|
|
||||||
|
notify() { notify-send "${1:-Keynctr update}" "$2" ${3:+-u "$3"}; }
|
||||||
|
|
||||||
|
# The desktop launcher env lacks login-shell PATH bits; cargo/node live there.
|
||||||
|
export PATH="$HOME/.cargo/bin:$HOME/.local/bin:$HOME/.bin:$PATH"
|
||||||
|
for dir in "$HOME"/.nvm/versions/node/*/bin "$HOME"/.local/share/mise/installs/node/*/bin; do
|
||||||
|
[[ -d "$dir" ]] && PATH="$dir:$PATH"
|
||||||
|
done
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "===== $(date -Is) update run ====="
|
||||||
|
cd "$REPO" || { notify "Keynctr update failed" "Repo not found." "critical"; exit 1; }
|
||||||
|
|
||||||
|
git fetch origin master 2>&1 || { notify "Keynctr update failed" "git fetch failed (offline?)" "critical"; exit 1; }
|
||||||
|
|
||||||
|
LOCAL=$(git rev-parse HEAD)
|
||||||
|
REMOTE=$(git rev-parse origin/master)
|
||||||
|
if [[ "$LOCAL" == "$REMOTE" ]]; then
|
||||||
|
echo "already up to date @ ${LOCAL:0:7}"
|
||||||
|
notify "Keynctr is up to date" "Already on the latest build (${LOCAL:0:7})."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Refuse to pull over uncommitted tracked changes.
|
||||||
|
if [[ -n "$(git status --porcelain --untracked-files=no)" ]]; then
|
||||||
|
echo "dirty tracked tree; aborting pull"
|
||||||
|
notify "Keynctr update aborted" "You have uncommitted changes in the repo — nothing was changed." "critical"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git pull --ff-only origin master 2>&1 || { notify "Keynctr update failed" "git pull failed." "critical"; exit 1; }
|
||||||
|
|
||||||
|
echo "-- cargo build --release"
|
||||||
|
cargo build --release 2>&1 | tail -2 || { notify "Keynctr update failed" "cargo build failed — see $LOG" "critical"; exit 1; }
|
||||||
|
|
||||||
|
echo "-- frontend build"
|
||||||
|
(cd frontend && npm run build 2>&1 | tail -2 && npm run electron:build 2>&1 | tail -1) \
|
||||||
|
|| { notify "Keynctr update failed" "frontend build failed — see $LOG" "critical"; exit 1; }
|
||||||
|
|
||||||
|
echo "updated ${LOCAL:0:7} -> ${REMOTE:0:7}"
|
||||||
|
notify "Keynctr updated" "Updated to ${REMOTE:0:7}. Launch Keynctr to use the new build." "normal"
|
||||||
|
} >>"$LOG" 2>&1
|
||||||
Loading…
Add table
Add a link
Reference in a new issue