[DEPRECATED] Go implementation of plcbundle
1#!/bin/bash
2
3set -e
4
5# Colors
6RED='\033[0;31m'
7GREEN='\033[0;32m'
8YELLOW='\033[1;33m'
9BLUE='\033[0;34m'
10NC='\033[0m' # No Color
11
12# Check if git is clean
13if [[ -n $(git status -s) ]]; then
14 echo -e "${RED}Error: Git working directory is not clean${NC}"
15 echo "Please commit or stash your changes first"
16 exit 1
17fi
18
19# Get current version from git tags
20CURRENT_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
21
22# Remove 'v' prefix if present
23CURRENT_VERSION=${CURRENT_VERSION#v}
24
25# Parse version (supports semver with pre-release)
26# Format: MAJOR.MINOR.PATCH[-PRERELEASE]
27if [[ $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.
33else
34 echo -e "${RED}Error: Could not parse version: ${CURRENT_VERSION}${NC}"
35 exit 1
36fi
37
38# Function to show usage
39show_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}
71
72# Parse optional flags (--minor, --patch)
73BUMP_TYPE=""
74if [[ "$2" == "--minor" ]]; then
75 BUMP_TYPE="minor"
76elif [[ "$2" == "--patch" ]]; then
77 BUMP_TYPE="patch"
78fi
79
80# Determine new version based on command
81case "$1" in
82 major)
83 MAJOR=$((MAJOR + 1))
84 MINOR=0
85 PATCH=0
86 PRERELEASE=""
87 PRERELEASE_NUM=""
88 ;;
89 minor)
90 MINOR=$((MINOR + 1))
91 PATCH=0
92 PRERELEASE=""
93 PRERELEASE_NUM=""
94 ;;
95 patch)
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
149 ;;
150 *)
151 echo -e "${RED}Error: Invalid command: $1${NC}"
152 echo ""
153 show_usage
154 ;;
155esac
156
157# Build new version string
158if [[ -z "$PRERELEASE" ]]; then
159 NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}"
160else
161 NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}-${PRERELEASE}.${PRERELEASE_NUM}"
162fi
163
164# Show version change
165echo ""
166echo -e "${YELLOW}Current version: ${CURRENT_VERSION}${NC}"
167echo -e "${GREEN}New version: ${NEW_VERSION#v}${NC}"
168
169# Show what changed
170if [[ -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}"
173else
174 echo -e "${GREEN}✓ Stable release${NC}"
175fi
176
177echo ""
178
179# Confirm
180read -p "Create tag ${NEW_VERSION}? (y/N) " -n 1 -r
181echo
182if [[ ! $REPLY =~ ^[Yy]$ ]]; then
183 echo "Cancelled"
184 exit 0
185fi
186
187# Create git tag
188if [[ -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}"
192else
193 # Stable release tag
194 git tag -a "${NEW_VERSION}" -m "Release ${NEW_VERSION}"
195 echo -e "${GREEN}✓ Created release tag ${NEW_VERSION}${NC}"
196fi
197
198echo ""
199echo "To push the tag, run:"
200echo " git push origin ${NEW_VERSION}"
201echo ""
202echo "Or use 'make release' to push automatically"