@@ -26,7 +26,11 @@ usage() {
2626 echo " bump LEVEL Bump version (major|minor|patch)"
2727 echo " set VERSION Set specific version"
2828 echo " tag Create and push git tag with current version"
29- echo " release Bump patch version, tag, and push"
29+ echo " release [LEVEL] Create release (defaults to patch)"
30+ echo " major-release Bump major version and create release"
31+ echo " minor-release Bump minor version and create release"
32+ echo " patch-release Bump patch version and create release (same as release)"
33+ echo " preview LEVEL Show preview of release actions (dry run)"
3034 echo " "
3135 echo " Examples:"
3236 echo " $0 show"
@@ -36,6 +40,11 @@ usage() {
3640 echo " $0 set 2.1.0"
3741 echo " $0 tag"
3842 echo " $0 release"
43+ echo " $0 release minor"
44+ echo " $0 major-release"
45+ echo " $0 minor-release"
46+ echo " $0 patch-release"
47+ echo " $0 preview major"
3948}
4049
4150# Function to get current version
@@ -118,7 +127,9 @@ create_tag() {
118127
119128# Function to do a full release
120129do_release () {
121- echo -e " ${BLUE} Starting release process...${NC} "
130+ local level=${1:- patch} # Default to patch if no level specified
131+
132+ echo -e " ${BLUE} Starting $level release process...${NC} "
122133
123134 # Check if working directory is clean
124135 if [ -n " $( git status --porcelain) " ]; then
@@ -141,22 +152,130 @@ do_release() {
141152 local current_version=$( get_version)
142153 echo -e " ${BLUE} Current version: $current_version ${NC} "
143154
144- # Bump patch version
145- bump_version patch
146- local new_version=$( get_version)
155+ # Validate release level
156+ case $level in
157+ major|minor|patch)
158+ ;;
159+ * )
160+ echo -e " ${RED} Error: Release level must be major, minor, or patch${NC} " >&2
161+ exit 1
162+ ;;
163+ esac
164+
165+ # Show what will happen
166+ IFS=' .' read -r major minor patch_num <<< " $current_version"
167+ case $level in
168+ major)
169+ new_major=$(( major + 1 ))
170+ new_minor=0
171+ new_patch=0
172+ ;;
173+ minor)
174+ new_major=$major
175+ new_minor=$(( minor + 1 ))
176+ new_patch=0
177+ ;;
178+ patch)
179+ new_major=$major
180+ new_minor=$minor
181+ new_patch=$(( patch_num + 1 ))
182+ ;;
183+ esac
184+ local new_version=" $new_major .$new_minor .$new_patch "
185+
186+ echo -e " ${YELLOW} This will create a $level release:${NC} "
187+ echo -e " Current version: ${RED} $current_version ${NC} "
188+ echo -e " New version: ${GREEN} $new_version ${NC} "
189+ echo " "
190+ read -p " Continue with $level release? (y/N): " -n 1 -r
191+ echo
192+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
193+ echo -e " ${RED} Aborted${NC} "
194+ exit 1
195+ fi
196+
197+ # Bump version
198+ bump_version " $level "
199+ local final_version=$( get_version)
147200
148201 # Commit version change
149202 git add " $VERSION_FILE_PATH "
150- git commit -m " Bump version to $new_version "
203+ git commit -m " Bump version to $final_version ( $level release) "
151204 git push
152205
153206 # Create and push tag
154207 create_tag
155208
156- echo -e " ${GREEN} Release $new_version completed!${NC} "
209+ echo -e " ${GREEN} $level release $final_version completed!${NC} "
157210 echo -e " ${BLUE} GitHub Actions will now build and publish the release.${NC} "
158211}
159212
213+ # Function to show what a release would do (dry run)
214+ show_release_preview () {
215+ local level=${1:- patch}
216+
217+ echo -e " ${BLUE} Release Preview (Dry Run)${NC} "
218+ echo -e " ${BLUE} =========================${NC} "
219+
220+ local current_version=$( get_version)
221+ echo -e " Current version: ${YELLOW} $current_version ${NC} "
222+
223+ # Calculate new version
224+ IFS=' .' read -r major minor patch_num <<< " $current_version"
225+ case $level in
226+ major)
227+ new_major=$(( major + 1 ))
228+ new_minor=0
229+ new_patch=0
230+ ;;
231+ minor)
232+ new_major=$major
233+ new_minor=$(( minor + 1 ))
234+ new_patch=0
235+ ;;
236+ patch)
237+ new_major=$major
238+ new_minor=$minor
239+ new_patch=$(( patch_num + 1 ))
240+ ;;
241+ * )
242+ echo -e " ${RED} Error: Release level must be major, minor, or patch${NC} " >&2
243+ exit 1
244+ ;;
245+ esac
246+ local new_version=" $new_major .$new_minor .$new_patch "
247+
248+ echo -e " Release level: ${BLUE} $level ${NC} "
249+ echo -e " New version: ${GREEN} $new_version ${NC} "
250+ echo -e " Git tag: ${GREEN} v$new_version ${NC} "
251+ echo " "
252+
253+ # Check working directory status
254+ if [ -n " $( git status --porcelain) " ]; then
255+ echo -e " ${RED} ⚠️ Working directory is not clean${NC} "
256+ else
257+ echo -e " ${GREEN} ✅ Working directory is clean${NC} "
258+ fi
259+
260+ # Check branch
261+ current_branch=$( git branch --show-current)
262+ if [ " $current_branch " = " main" ] || [ " $current_branch " = " master" ]; then
263+ echo -e " ${GREEN} ✅ On $current_branch branch${NC} "
264+ else
265+ echo -e " ${YELLOW} ⚠️ On $current_branch branch (not main/master)${NC} "
266+ fi
267+
268+ echo " "
269+ echo -e " ${BLUE} Actions that would be performed:${NC} "
270+ echo -e " 1. Bump version from $current_version to $new_version "
271+ echo -e " 2. Update .version file"
272+ echo -e " 3. Commit: 'Bump version to $new_version ($level release)'"
273+ echo -e " 4. Push commit to remote"
274+ echo -e " 5. Create git tag: v$new_version "
275+ echo -e " 6. Push tag to remote"
276+ echo -e " 7. Trigger GitHub Actions for release build"
277+ }
278+
160279# Main script logic
161280case " ${1:- } " in
162281 show)
@@ -182,7 +301,35 @@ case "${1:-}" in
182301 create_tag
183302 ;;
184303 release)
185- do_release
304+ # Handle optional level parameter (defaults to patch)
305+ level=${2:- patch}
306+ case $level in
307+ major|minor|patch)
308+ do_release " $level "
309+ ;;
310+ * )
311+ echo -e " ${RED} Error: Release level must be major, minor, or patch${NC} " >&2
312+ usage
313+ exit 1
314+ ;;
315+ esac
316+ ;;
317+ major-release)
318+ do_release major
319+ ;;
320+ minor-release)
321+ do_release minor
322+ ;;
323+ patch-release)
324+ do_release patch
325+ ;;
326+ preview)
327+ if [ -z " ${2:- } " ]; then
328+ echo -e " ${RED} Error: Please specify release level for preview (major|minor|patch)${NC} " >&2
329+ usage
330+ exit 1
331+ fi
332+ show_release_preview " $2 "
186333 ;;
187334 help|--help|-h)
188335 usage
0 commit comments