Files
visitor-signin/push-to-gitea.sh
T
2026-09-16 10:05:57 +10:00

94 lines
3.0 KiB
Bash

#!/usr/bin/env bash
# Pushes this folder to the Gitea repo. Run from inside the visitor-signin folder.
set -uo pipefail
REMOTE="https://gitea.hideawaygaming.com.au/jessikitty/visitor-signin.git"
fail() { printf '\n%s\n' "$1" >&2; exit 1; }
[ -f package.json ] || fail "Run this from inside the visitor-signin folder."
command -v git >/dev/null || fail "Git is not installed."
git config --global core.autocrlf input >/dev/null 2>&1 || true
if [ -z "$(git config user.email || git config --global user.email)" ]; then
cat >&2 <<'MSG'
Git does not know who you are. Set that once:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
MSG
exit 1
fi
[ -d .git ] || git init -b main || fail "git init failed."
if git remote | grep -qx origin; then
git remote set-url origin "$REMOTE"
else
git remote add origin "$REMOTE"
fi
# Whatever branch is checked out, not a hard-coded one.
BRANCH=$(git rev-parse --abbrev-ref HEAD)
[ -n "$BRANCH" ] && [ "$BRANCH" != "HEAD" ] || fail "No branch is checked out here."
echo "Branch: $BRANCH"
# An unfinished rebase or merge blocks everything below, and git's own error is
# easy to mistake for a push problem.
GIT_DIR_PATH=$(git rev-parse --git-dir 2>/dev/null || echo .git)
for marker in rebase-merge rebase-apply MERGE_HEAD CHERRY_PICK_HEAD; do
if [ -e "$GIT_DIR_PATH/$marker" ]; then
cat >&2 <<'MSG'
There is an unfinished rebase or merge in this folder.
Nothing else can happen until it is settled:
git rebase --abort throw the attempt away, back to how things were
git status see which files still need attention
git rebase --continue after fixing the files git listed
If unsure, "git rebase --abort" is the safe one.
MSG
exit 1
fi
done
git add -A
if [ -n "$(git status --porcelain)" ]; then
read -r -p "Describe this change (enter for a dated default): " MSG
[ -n "$MSG" ] || MSG="Update $(date '+%Y-%m-%d %H:%M')"
git commit -m "$MSG" || fail "git commit failed."
echo "Committed."
else
echo "No file changes to commit. Checking for anything unpushed..."
fi
git fetch origin || fail "Could not reach Gitea."
if git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then
BEHIND=$(git rev-list --count "HEAD..origin/$BRANCH" 2>/dev/null || echo 0)
if [ "$BEHIND" -gt 0 ]; then
echo "The server has $BEHIND commit(s) this folder does not. Replaying your work on top..."
if ! git pull --rebase origin "$BRANCH"; then
cat >&2 <<'MSG'
The two histories could not be joined automatically.
See what is on the server that you do not have:
git log --oneline HEAD..origin/$BRANCH
If that is nothing you need, and this folder is the good copy:
git push --force-with-lease origin $BRANCH
MSG
exit 1
fi
fi
fi
git push -u origin "$BRANCH" || fail "The push was rejected. Read the message above. Nothing was sent."
echo
echo "Pushed $BRANCH successfully."
git log --oneline -1
echo "https://gitea.hideawaygaming.com.au/jessikitty/visitor-signin"