main 4509ec7

next-release-tag.sh RawHistoryFolder

1#!/usr/bin/env bash
2# Print the release tag for HEAD, or nothing when its unreleased commits do not
3# require a release. A tag already pointing to HEAD is emitted again so a
4# failed GoReleaser job can be retried without minting a second tag.
5set -euo pipefail
6
7latest=$(git tag --list 'v*.*.*' --sort=-v:refname | head -n1)
8head=$(git rev-parse HEAD)
9if [ -n "$latest" ] && [ "$(git rev-parse "$latest^{}")" = "$head" ]; then
10	printf '%s\n' "$latest"
11	exit 0
12fi
13
14if [ -n "$latest" ]; then
15	range="${latest}..HEAD"
16else
17	range="HEAD"
18fi
19
20minor=false
21patch=false
22# A here-string, not a process substitution: the ermite runner has no /dev/fd.
23commits=$(git rev-list "$range")
24while IFS= read -r commit; do
25	[ -n "$commit" ] || continue
26	subject=$(git log -1 --format=%s "$commit")
27	body=$(git log -1 --format=%b "$commit")
28
29	# A breaking change is a v0.x minor release.
30	if grep -Eq '^[[:alpha:]]+(\([^)]+\))?!:' <<<"$subject" || grep -Eiq '^BREAKING[ -]CHANGE:' <<<"$body"; then
31		minor=true
32		continue
33	fi
34
35	type=${subject%%(*}
36	type=${type%%:*}
37	type=${type%%!*}
38	type=$(tr '[:upper:]' '[:lower:]' <<<"$type")
39	case "$type" in
40		feat) minor=true ;;
41		fix|perf|refactor|build|chore|ci) patch=true ;;
42		docs|test|style) ;;
43		*) ;;
44	esac
45done <<<"$commits"
46
47if [ "$minor" != true ] && [ "$patch" != true ]; then
48	exit 0
49fi
50
51# The renamed project starts a new public release line at v0.1.0.
52if [ -z "$latest" ]; then
53	printf '%s\n' 'v0.1.0'
54	exit 0
55fi
56
57version=${latest#v}
58IFS=. read -r major minor_version patch_version <<<"$version"
59if [ "$minor" = true ]; then
60	printf 'v%s.%s.0\n' "$major" "$((minor_version + 1))"
61else
62	printf 'v%s.%s.%s\n' "$major" "$minor_version" "$((patch_version + 1))"
63fi

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close