Skip to content

Commit fb9edc6

Browse files
feat: enhance version management with detailed help commands and release options
1 parent eaa0f94 commit fb9edc6

2 files changed

Lines changed: 216 additions & 9 deletions

File tree

Makefile

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,50 @@ BINARY=openmorph
44
VERSION_FILE=.version
55
VERSION=$(shell cat $(VERSION_FILE) 2>/dev/null || echo "0.0.0")
66

7-
.PHONY: all build test lint format lint-fix lint-all release clean install version-show version-bump-patch version-bump-minor version-bump-major version-set version-tag version-release
7+
.PHONY: all build test lint format lint-fix lint-all release clean install help version-show version-bump-patch version-bump-minor version-bump-major version-set version-tag version-release version-major-release version-minor-release version-patch-release version-preview setup-packages validate snapshot
88

99
all: build
1010

11+
# Show available commands
12+
help:
13+
@echo "OpenMorph Makefile Commands:"
14+
@echo ""
15+
@echo "Build & Test:"
16+
@echo " build Build the binary"
17+
@echo " test Run all tests"
18+
@echo " install Build and install to GOPATH/bin"
19+
@echo ""
20+
@echo "Code Quality:"
21+
@echo " format Format code with gofmt and goimports"
22+
@echo " lint Run linters (reports issues)"
23+
@echo " lint-fix Run linters with auto-fix"
24+
@echo " lint-all Format + lint (complete quality check)"
25+
@echo ""
26+
@echo "Version Management:"
27+
@echo " version-show Show current version"
28+
@echo " version-bump-patch Bump patch version"
29+
@echo " version-bump-minor Bump minor version"
30+
@echo " version-bump-major Bump major version"
31+
@echo " version-set Set specific version (interactive)"
32+
@echo " version-tag Create git tag from current version"
33+
@echo ""
34+
@echo "Release Commands:"
35+
@echo " version-release Generic release (defaults to patch)"
36+
@echo " version-patch-release Patch release (x.y.Z)"
37+
@echo " version-minor-release Minor release (x.Y.0)"
38+
@echo " version-major-release Major release (X.0.0)"
39+
@echo " version-preview Preview release actions (dry run)"
40+
@echo ""
41+
@echo "Release & Distribution:"
42+
@echo " release Create release with goreleaser"
43+
@echo " snapshot Create snapshot release"
44+
@echo ""
45+
@echo "Utilities:"
46+
@echo " clean Clean build artifacts"
47+
@echo " setup-packages Setup package managers"
48+
@echo " validate Validate setup"
49+
@echo " help Show this help message"
50+
1151
build:
1252
go build -ldflags "-X github.com/developerkunal/OpenMorph/cmd.version=v$(VERSION)" -o $(BINARY) .
1353

@@ -56,9 +96,12 @@ install:
5696
mv $(BINARY) "$(GOPATH)/bin/$(BINARY)"
5797

5898
# Version management targets
99+
100+
# Show current version
59101
version-show:
60102
@./scripts/version.sh show
61103

104+
# Version bumping (without release)
62105
version-bump-patch:
63106
@./scripts/version.sh bump patch
64107

@@ -68,15 +111,32 @@ version-bump-minor:
68111
version-bump-major:
69112
@./scripts/version.sh bump major
70113

114+
# Set specific version
71115
version-set:
72116
@read -p "Enter version: " version; ./scripts/version.sh set $$version
73117

118+
# Create git tag from current version
74119
version-tag:
75120
@./scripts/version.sh tag
76121

122+
# Generic release command (defaults to patch)
77123
version-release:
78124
@./scripts/version.sh release
79125

126+
# Version release commands
127+
version-major-release:
128+
@./scripts/version.sh major-release
129+
130+
version-minor-release:
131+
@./scripts/version.sh minor-release
132+
133+
version-patch-release:
134+
@./scripts/version.sh patch-release
135+
136+
# Version preview (dry run)
137+
version-preview:
138+
@read -p "Enter release level (major/minor/patch): " level; ./scripts/version.sh preview $$level
139+
80140
# Setup package managers
81141
setup-packages:
82142
@./scripts/setup-package-managers.sh

scripts/version.sh

Lines changed: 155 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
120129
do_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
161280
case "${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

Comments
 (0)