Skip to content

Commit 8050793

Browse files
committed
build: refactor bump script
1 parent 4576700 commit 8050793

1 file changed

Lines changed: 63 additions & 23 deletions

File tree

scripts/bump.sh

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,85 @@
22
set -euo pipefail
33
set -f
44

5+
[ $# -ne 3 ] && {
6+
echo "Usage: $0 <tag-prefix> <manifest> <include-paths>" >&2
7+
exit 1
8+
}
9+
510
TAG_PREFIX=$1
611
MANIFEST=$2
7-
INCLUDE_PATHS=$3
12+
13+
git diff --quiet HEAD || {
14+
echo "Working directory is not clean. Commit or stash changes first." >&2
15+
exit 1
16+
}
17+
18+
INCLUDE_PATHS=($3)
819

920
COMMIT_SCOPE="$TAG_PREFIX"
1021
TAG_PATTERN="${TAG_PREFIX}@[0-9]+\.[0-9]+\.[0-9]+"
1122
CONFIG="$(git rev-parse --show-toplevel)/cliff.toml"
12-
CURRENT=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' "$MANIFEST" | head -1)
1323

14-
LATEST_TAG=$(git tag -l "${TAG_PREFIX}@*" --sort=-version:refname | head -1)
24+
extract_version() {
25+
local file=$1
26+
case "$file" in
27+
*.toml) grep -m1 -oE '^version = "[0-9]+\.[0-9]+\.[0-9]+"' "$file" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' ;;
28+
*.json) grep -m1 -oE '"version": "[0-9]+\.[0-9]+\.[0-9]+"' "$file" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' ;;
29+
*) echo "Unsupported manifest: $file" >&2; exit 1 ;;
30+
esac
31+
}
1532

16-
if [ -z "$LATEST_TAG" ]; then
17-
touch CHANGELOG.md && git-cliff --unreleased --tag "$CURRENT" $INCLUDE_PATHS --config "$CONFIG" --prepend CHANGELOG.md
18-
git add "$MANIFEST" CHANGELOG.md && git commit --no-verify -m "bump($COMMIT_SCOPE): $CURRENT"
19-
git tag -m "bump($COMMIT_SCOPE): $CURRENT" "${TAG_PREFIX}@$CURRENT"
20-
echo "✔ First release — tagged ${TAG_PREFIX}@$CURRENT"
33+
update_version() {
34+
local file=$1 current=$2 new=$3
35+
case "$file" in
36+
*.toml) sed -i.bak "s/^version = \"$current\"/version = \"$new\"/" "$file" ;;
37+
*.json) sed -i.bak "s/\"version\": \"$current\"/\"version\": \"$new\"/" "$file" ;;
38+
esac
39+
rm -f "$file.bak"
40+
}
41+
42+
commit_and_tag() {
43+
local version=$1
44+
git add "$MANIFEST" CHANGELOG.md
45+
git commit --no-verify -m "bump($COMMIT_SCOPE): $version"
46+
git tag -m "bump($COMMIT_SCOPE): $version" "${TAG_PREFIX}@$version"
47+
}
48+
49+
print_recent_changelog() {
50+
local version=$1
2151
echo "---"
2252
awk '/^## /{if(++c>1) exit} 1' CHANGELOG.md
2353
echo "---"
24-
echo " Run: git push origin ${TAG_PREFIX}@$CURRENT"
54+
echo " Run: git push origin ${TAG_PREFIX}@$version"
55+
}
56+
57+
CURRENT=$(extract_version "$MANIFEST")
58+
[ -z "$CURRENT" ] && { echo "Failed to extract current version from $MANIFEST" >&2; exit 1; }
59+
60+
LATEST_TAG=$(git tag -l "${TAG_PREFIX}@*" --sort=-version:refname | head -1)
61+
62+
if [ -z "$LATEST_TAG" ]; then
63+
touch CHANGELOG.md && git-cliff --unreleased --tag "$CURRENT" "${INCLUDE_PATHS[@]}" --config "$CONFIG" --prepend CHANGELOG.md
64+
commit_and_tag "$CURRENT"
65+
echo "✔ First release — tagged ${TAG_PREFIX}@$CURRENT"
66+
print_recent_changelog "$CURRENT"
2567
exit 0
2668
fi
2769

28-
OUTPUT=$(git-cliff --bump --tag-pattern "$TAG_PATTERN" $INCLUDE_PATHS --config "$CONFIG" 2>&1)
29-
echo "$OUTPUT" | grep -q 'There is nothing to bump' && { echo "No unreleased changes."; exit 0; }
70+
RAW=$(git-cliff --bumped-version --tag-pattern "$TAG_PATTERN" "${INCLUDE_PATHS[@]}" --config "$CONFIG" 2>&1) || {
71+
echo "git-cliff error:" >&2
72+
echo "$RAW" >&2
73+
exit 1
74+
}
3075

31-
NEW=$(echo "$OUTPUT" | grep '^## ' | head -1 | sed 's/^## *//; s/ (.*//; s/.*@//')
76+
NEW=$(echo "$RAW" | tail -1)
77+
NEW=${NEW#"${TAG_PREFIX}@"}
3278

33-
case "$MANIFEST" in
34-
*.toml) sed -i "s/version = \"$CURRENT\"/version = \"$NEW\"/" "$MANIFEST" ;;
35-
*.json) sed -i "s/\"version\": \"$CURRENT\"/\"version\": \"$NEW\"/" "$MANIFEST" ;;
36-
esac
79+
[ "$NEW" = "$CURRENT" ] && { echo "No unreleased changes."; exit 0; }
3780

38-
touch CHANGELOG.md && git-cliff --unreleased --tag "$NEW" $INCLUDE_PATHS --config "$CONFIG" --prepend CHANGELOG.md
39-
git add "$MANIFEST" CHANGELOG.md && git commit --no-verify -m "bump($COMMIT_SCOPE): $NEW"
40-
git tag -m "bump($COMMIT_SCOPE): $NEW" "${TAG_PREFIX}@$NEW"
81+
update_version "$MANIFEST" "$CURRENT" "$NEW"
82+
touch CHANGELOG.md && git-cliff --unreleased --tag "$NEW" "${INCLUDE_PATHS[@]}" --config "$CONFIG" --prepend CHANGELOG.md
83+
commit_and_tag "$NEW"
4184

4285
echo "✔ Bumped $CURRENT$NEW, tagged ${TAG_PREFIX}@$NEW"
43-
echo "---"
44-
awk '/^## /{if(++c>1) exit} 1' CHANGELOG.md
45-
echo "---"
46-
echo " Run: git push origin ${TAG_PREFIX}@$NEW"
86+
print_recent_changelog "$NEW"

0 commit comments

Comments
 (0)