+142
-12
scripts/bump-version.sh
+142
-12
scripts/bump-version.sh
···
6
6
RED='\033[0;31m'
7
7
GREEN='\033[0;32m'
8
8
YELLOW='\033[1;33m'
9
+
BLUE='\033[0;34m'
9
10
NC='\033[0m' # No Color
10
11
11
12
# Check if git is clean
···
21
22
# Remove 'v' prefix if present
22
23
CURRENT_VERSION=${CURRENT_VERSION#v}
23
24
24
-
# Parse version
25
-
IFS='.' read -r -a VERSION_PARTS <<< "$CURRENT_VERSION"
26
-
MAJOR="${VERSION_PARTS[0]}"
27
-
MINOR="${VERSION_PARTS[1]}"
28
-
PATCH="${VERSION_PARTS[2]}"
25
+
# Parse version (supports semver with pre-release)
26
+
# Format: MAJOR.MINOR.PATCH[-PRERELEASE]
27
+
if [[ $CURRENT_VERSION =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(-([a-zA-Z]+)\.?([0-9]+)?)?$ ]]; then
28
+
MAJOR="${BASH_REMATCH[1]}"
29
+
MINOR="${BASH_REMATCH[2]}"
30
+
PATCH="${BASH_REMATCH[3]}"
31
+
PRERELEASE="${BASH_REMATCH[5]}" # alpha, beta, rc, etc.
32
+
PRERELEASE_NUM="${BASH_REMATCH[6]}" # 1, 2, 3, etc.
33
+
else
34
+
echo -e "${RED}Error: Could not parse version: ${CURRENT_VERSION}${NC}"
35
+
exit 1
36
+
fi
37
+
38
+
# Function to show usage
39
+
show_usage() {
40
+
echo "Usage: $0 {major|minor|patch|alpha|beta|rc|pre|release} [--minor|--patch]"
41
+
echo ""
42
+
echo "Stable releases:"
43
+
echo " major Bump major version (x.0.0)"
44
+
echo " minor Bump minor version (0.x.0)"
45
+
echo " patch Bump patch version (0.0.x)"
46
+
echo ""
47
+
echo "Pre-releases:"
48
+
echo " alpha Create/bump alpha (0.x.0-alpha.1 by default)"
49
+
echo " beta Create/bump beta (0.x.0-beta.1 by default)"
50
+
echo " rc Create/bump RC (0.x.0-rc.1 by default)"
51
+
echo " pre Bump current pre-release number"
52
+
echo ""
53
+
echo "Combined (create pre-release with specific bump):"
54
+
echo " alpha --minor Bump minor and create alpha (0.x.0-alpha.1)"
55
+
echo " alpha --patch Bump patch and create alpha (0.0.x-alpha.1)"
56
+
echo " beta --minor Bump minor and create beta"
57
+
echo " rc --patch Bump patch and create rc"
58
+
echo ""
59
+
echo "Promotion:"
60
+
echo " release Remove pre-release suffix (promote to stable)"
61
+
echo ""
62
+
echo "Examples:"
63
+
echo " v0.4.26 → minor → v0.5.0"
64
+
echo " v0.4.26 → alpha --minor → v0.5.0-alpha.1"
65
+
echo " v0.4.26 → alpha --patch → v0.4.27-alpha.1"
66
+
echo " v0.5.0-alpha.1 → pre → v0.5.0-alpha.2"
67
+
echo " v0.5.0-alpha.2 → beta → v0.5.0-beta.1"
68
+
echo " v0.5.0-rc.1 → release → v0.5.0"
69
+
exit 1
70
+
}
29
71
30
-
# Bump version based on argument
72
+
# Parse optional flags (--minor, --patch)
73
+
BUMP_TYPE=""
74
+
if [[ "$2" == "--minor" ]]; then
75
+
BUMP_TYPE="minor"
76
+
elif [[ "$2" == "--patch" ]]; then
77
+
BUMP_TYPE="patch"
78
+
fi
79
+
80
+
# Determine new version based on command
31
81
case "$1" in
32
82
major)
33
83
MAJOR=$((MAJOR + 1))
34
84
MINOR=0
35
85
PATCH=0
86
+
PRERELEASE=""
87
+
PRERELEASE_NUM=""
36
88
;;
37
89
minor)
38
90
MINOR=$((MINOR + 1))
39
91
PATCH=0
92
+
PRERELEASE=""
93
+
PRERELEASE_NUM=""
40
94
;;
41
95
patch)
42
96
PATCH=$((PATCH + 1))
97
+
PRERELEASE=""
98
+
PRERELEASE_NUM=""
99
+
;;
100
+
alpha|beta|rc)
101
+
# If already on this pre-release type, bump the number
102
+
if [[ "$PRERELEASE" == "$1" ]]; then
103
+
PRERELEASE_NUM=$((PRERELEASE_NUM + 1))
104
+
else
105
+
# Creating new pre-release type
106
+
if [[ -z "$PRERELEASE" ]]; then
107
+
# Coming from stable - determine what to bump
108
+
if [[ "$BUMP_TYPE" == "minor" ]]; then
109
+
MINOR=$((MINOR + 1))
110
+
PATCH=0
111
+
elif [[ "$BUMP_TYPE" == "patch" ]]; then
112
+
PATCH=$((PATCH + 1))
113
+
else
114
+
# Default: bump minor for new pre-release
115
+
MINOR=$((MINOR + 1))
116
+
PATCH=0
117
+
fi
118
+
fi
119
+
# Set new pre-release
120
+
PRERELEASE="$1"
121
+
PRERELEASE_NUM=1
122
+
fi
123
+
;;
124
+
pre|prerelease)
125
+
if [[ -z "$PRERELEASE" ]]; then
126
+
echo -e "${RED}Error: Not currently on a pre-release version${NC}"
127
+
echo "Current version: ${CURRENT_VERSION}"
128
+
echo "Use 'alpha', 'beta', or 'rc' to create a pre-release"
129
+
exit 1
130
+
fi
131
+
PRERELEASE_NUM=$((PRERELEASE_NUM + 1))
132
+
;;
133
+
release|stable)
134
+
if [[ -z "$PRERELEASE" ]]; then
135
+
echo -e "${YELLOW}Already on stable version: ${CURRENT_VERSION}${NC}"
136
+
exit 0
137
+
fi
138
+
# Remove pre-release suffix
139
+
PRERELEASE=""
140
+
PRERELEASE_NUM=""
141
+
;;
142
+
-h|--help|help)
143
+
show_usage
144
+
;;
145
+
"")
146
+
echo -e "${RED}Error: No command specified${NC}"
147
+
echo ""
148
+
show_usage
43
149
;;
44
150
*)
45
-
echo "Usage: $0 {major|minor|patch}"
46
-
exit 1
151
+
echo -e "${RED}Error: Invalid command: $1${NC}"
152
+
echo ""
153
+
show_usage
47
154
;;
48
155
esac
49
156
50
-
NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}"
157
+
# Build new version string
158
+
if [[ -z "$PRERELEASE" ]]; then
159
+
NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}"
160
+
else
161
+
NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}-${PRERELEASE}.${PRERELEASE_NUM}"
162
+
fi
51
163
164
+
# Show version change
165
+
echo ""
52
166
echo -e "${YELLOW}Current version: ${CURRENT_VERSION}${NC}"
53
-
echo -e "${GREEN}New version: ${NEW_VERSION}${NC}"
167
+
echo -e "${GREEN}New version: ${NEW_VERSION#v}${NC}"
168
+
169
+
# Show what changed
170
+
if [[ -n "$PRERELEASE" ]]; then
171
+
echo -e "${BLUE}Pre-release: ${PRERELEASE}.${PRERELEASE_NUM}${NC}"
172
+
echo -e "${YELLOW}⚠️ This is a pre-release (no stability guarantees)${NC}"
173
+
else
174
+
echo -e "${GREEN}✓ Stable release${NC}"
175
+
fi
176
+
54
177
echo ""
55
178
56
179
# Confirm
···
62
185
fi
63
186
64
187
# Create git tag
65
-
git tag -a "${NEW_VERSION}" -m "Release ${NEW_VERSION}"
188
+
if [[ -n "$PRERELEASE" ]]; then
189
+
# Pre-release tag
190
+
git tag -a "${NEW_VERSION}" -m "Pre-release ${NEW_VERSION}"
191
+
echo -e "${GREEN}✓ Created pre-release tag ${NEW_VERSION}${NC}"
192
+
else
193
+
# Stable release tag
194
+
git tag -a "${NEW_VERSION}" -m "Release ${NEW_VERSION}"
195
+
echo -e "${GREEN}✓ Created release tag ${NEW_VERSION}${NC}"
196
+
fi
66
197
67
-
echo -e "${GREEN}✓ Created tag ${NEW_VERSION}${NC}"
68
198
echo ""
69
199
echo "To push the tag, run:"
70
200
echo " git push origin ${NEW_VERSION}"