Skip to content

Commit 09edfc4

Browse files
committed
add release script for slides
1 parent e67ea97 commit 09edfc4

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed

release-slides.sh

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
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

Comments
 (0)