|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -Eeuo pipefail |
| 3 | + |
| 4 | +# release-slides.sh |
| 5 | +# Skapar och pushar en eller flera taggar på formen: slides_<subject>_<version> |
| 6 | +# Dessa ska matcha ditt GitHub Actions-workflow som lyssnar på "slides_*_*". |
| 7 | + |
| 8 | +# ---- Konfiguration ---- |
| 9 | +ALLOWED_SUBJECTS=("intro" "git" "latex" "unix" "machine-code") |
| 10 | +REMOTE="origin" |
| 11 | + |
| 12 | +# ---- Hjälpfunktioner ---- |
| 13 | +usage() { |
| 14 | + cat <<'USAGE' |
| 15 | +Usage: |
| 16 | + release-slides.sh -v <version> -s <subject[,subject2,...]|all> [-m "message"] [-y] |
| 17 | +
|
| 18 | +Options: |
| 19 | + -v Versionssträng (t.ex. 2025-09-01 eller v1.2.3). REQ |
| 20 | + -s Ämnen att släppa: intro, git, latex, unix, machine-code eller "all". REQ |
| 21 | + Kan vara kommaseparerad lista eller flera -s-flaggor. |
| 22 | + -m Gemensamt taggmeddelande. Om utelämnas öppnas editor för att skriva ett. |
| 23 | + -y Svara "ja" på alla frågor (överskriv taggar utan att fråga). |
| 24 | +
|
| 25 | +Exempel: |
| 26 | + ./release-slides.sh -v 2025-09-01 -s intro |
| 27 | + ./release-slides.sh -v v1.0.0 -s intro,git,latex |
| 28 | + ./release-slides.sh -v v2 -s all -m "HT25 handout release" |
| 29 | +USAGE |
| 30 | +} |
| 31 | + |
| 32 | +contains() { |
| 33 | + local needle="$1"; shift |
| 34 | + for x in "$@"; do [[ "$x" == "$needle" ]] && return 0; done |
| 35 | + return 1 |
| 36 | +} |
| 37 | + |
| 38 | +ensure_allowed_subject() { |
| 39 | + local s="$1" |
| 40 | + if ! contains "$s" "${ALLOWED_SUBJECTS[@]}"; then |
| 41 | + echo "Fel: Ogiltigt ämne: '$s'" |
| 42 | + echo "Tillåtna: ${ALLOWED_SUBJECTS[*]}" |
| 43 | + exit 1 |
| 44 | + fi |
| 45 | +} |
| 46 | + |
| 47 | +confirm() { |
| 48 | + local prompt="${1:-Är du säker? (y/N) }" |
| 49 | + read -r -p "$prompt" ans |
| 50 | + [[ "$ans" == "y" || "$ans" == "Y" ]] |
| 51 | +} |
| 52 | + |
| 53 | +delete_tag_if_exists() { |
| 54 | + local tag="$1" |
| 55 | + if git rev-parse "$tag" >/dev/null 2>&1; then |
| 56 | + echo "Taggen $tag finns redan lokalt." |
| 57 | + if $ASSUME_YES || confirm "Vill du ersätta taggen $tag? (y/N) "; then |
| 58 | + git tag -d "$tag" || true |
| 59 | + # Ta även bort på remote om den finns |
| 60 | + if git ls-remote --tags "$REMOTE" | grep -q "refs/tags/$tag$"; then |
| 61 | + git push "$REMOTE" --delete "$tag" || true |
| 62 | + fi |
| 63 | + else |
| 64 | + echo "Hoppar över $tag." |
| 65 | + return 1 |
| 66 | + fi |
| 67 | + fi |
| 68 | + return 0 |
| 69 | +} |
| 70 | + |
| 71 | +# ---- Argumentparsing ---- |
| 72 | +VERSION="" |
| 73 | +declare -a SUBJECTS_RAW=() |
| 74 | +MESSAGE="" |
| 75 | +ASSUME_YES=false |
| 76 | + |
| 77 | +while getopts ":v:s:m:yh" opt; do |
| 78 | + case "$opt" in |
| 79 | + v) VERSION="$OPTARG" ;; |
| 80 | + s) SUBJECTS_RAW+=("$OPTARG") ;; |
| 81 | + m) MESSAGE="$OPTARG" ;; |
| 82 | + y) ASSUME_YES=true ;; |
| 83 | + h) usage; exit 0 ;; |
| 84 | + \?) echo "Okänd flagga: -$OPTARG"; usage; exit 1 ;; |
| 85 | + :) echo "Flagga -$OPTARG kräver ett värde."; usage; exit 1 ;; |
| 86 | + esac |
| 87 | +done |
| 88 | + |
| 89 | +[[ -z "$VERSION" ]] && echo "Fel: -v <version> krävs." && usage && exit 1 |
| 90 | +[[ ${#SUBJECTS_RAW[@]} -eq 0 ]] && echo "Fel: minst en -s <subject> krävs." && usage && exit 1 |
| 91 | + |
| 92 | +# Expandera subjects (komma-listor + flera -s) |
| 93 | +declare -a SUBJECTS=() |
| 94 | +for item in "${SUBJECTS_RAW[@]}"; do |
| 95 | + if [[ "$item" == "all" ]]; then |
| 96 | + SUBJECTS=("${ALLOWED_SUBJECTS[@]}") |
| 97 | + break |
| 98 | + fi |
| 99 | + IFS=',' read -r -a tmp <<< "$item" |
| 100 | + SUBJECTS+=("${tmp[@]}") |
| 101 | +done |
| 102 | + |
| 103 | +# Deduplikera SUBJECTS |
| 104 | +declare -A seen |
| 105 | +declare -a SUBJECTS_UNIQ=() |
| 106 | +for s in "${SUBJECTS[@]}"; do |
| 107 | + [[ -n "${seen[$s]:-}" ]] && continue |
| 108 | + SUBJECTS_UNIQ+=("$s") |
| 109 | + seen["$s"]=1 |
| 110 | +done |
| 111 | +SUBJECTS=("${SUBJECTS_UNIQ[@]}") |
| 112 | + |
| 113 | +# Validera subjects |
| 114 | +for s in "${SUBJECTS[@]}"; do |
| 115 | + ensure_allowed_subject "$s" |
| 116 | +done |
| 117 | + |
| 118 | +# Hämta senaste taggar från remote |
| 119 | +git fetch --tags "$REMOTE" >/dev/null 2>&1 || true |
| 120 | + |
| 121 | +# Om inget -m angavs: öppna editor EN gång för ett gemensamt meddelande |
| 122 | +if [[ -z "$MESSAGE" ]]; then |
| 123 | + tmpfile="$(mktemp)" |
| 124 | + { |
| 125 | + echo "Slides release $VERSION" |
| 126 | + echo |
| 127 | + echo "Ämnen: ${SUBJECTS[*]}" |
| 128 | + echo |
| 129 | + echo "(Skriv ditt meddelande ovan. Ta inte bort sista raden.)" |
| 130 | + echo "---" |
| 131 | + } > "$tmpfile" |
| 132 | + "${GIT_EDITOR:-${VISUAL:-vi}}" "$tmpfile" |
| 133 | + MESSAGE="$(sed '/^---$/,$d' "$tmpfile" | sed -e '${/^$/d}')" |
| 134 | + rm -f "$tmpfile" |
| 135 | + |
| 136 | + if [[ -z "$MESSAGE" ]]; then |
| 137 | + # Om användaren tömde meddelandet, fall tillbaka per-tag-standard |
| 138 | + MESSAGE="" |
| 139 | + fi |
| 140 | +fi |
| 141 | + |
| 142 | +echo "Version: $VERSION" |
| 143 | +echo "Ämnen: ${SUBJECTS[*]}" |
| 144 | +echo "Remote: $REMOTE" |
| 145 | +$ASSUME_YES || confirm "Skapa och pusha taggar nu? (y/N) " || { echo "Avbrutet."; exit 1; } |
| 146 | + |
| 147 | +# ---- Skapa & pusha taggar ---- |
| 148 | +overall_ok=true |
| 149 | +for s in "${SUBJECTS[@]}"; do |
| 150 | + tag="slides_${s}_${VERSION}" |
| 151 | + |
| 152 | + # Rensa ev. befintlig tag |
| 153 | + if ! delete_tag_if_exists "$tag"; then |
| 154 | + overall_ok=false |
| 155 | + continue |
| 156 | + fi |
| 157 | + |
| 158 | + # Välj meddelande |
| 159 | + msg="$MESSAGE" |
| 160 | + [[ -z "$msg" ]] && msg="Slides $s $VERSION" |
| 161 | + |
| 162 | + # Skapa annoterad tagg |
| 163 | + git tag -a "$tag" -m "$msg" |
| 164 | + # Pusha tagg |
| 165 | + git push "$REMOTE" "$tag" |
| 166 | + echo "Skapade och pushade: $tag" |
| 167 | +done |
| 168 | + |
| 169 | +if $overall_ok; then |
| 170 | + echo "Klart: alla begärda taggar skapades och pushades." |
| 171 | +else |
| 172 | + echo "Färdigt: vissa taggar hoppades över eller misslyckades (se loggen ovan)." |
| 173 | +fi |
0 commit comments