|
| 1 | +#!/bin/bash |
| 2 | +# Release script for SQLMap UI. |
| 3 | +# Validates changelog, syncs version across files, creates tag, and pushes. |
| 4 | +# |
| 5 | +# Usage: |
| 6 | +# ./scripts/release.sh 0.3.0 |
| 7 | +# ./scripts/release.sh 0.3.0 --dry-run # Preview without changes |
| 8 | +# |
| 9 | +# Prerequisites: |
| 10 | +# - Clean working tree (no uncommitted changes) |
| 11 | +# - Version documented in CHANGELOG.md under ## [x.x.x] - YYYY-MM-DD |
| 12 | +# - Comparison link at bottom of CHANGELOG.md |
| 13 | + |
| 14 | +set -e |
| 15 | + |
| 16 | +RED='\033[0;31m' |
| 17 | +GREEN='\033[0;32m' |
| 18 | +YELLOW='\033[1;33m' |
| 19 | +NC='\033[0m' |
| 20 | + |
| 21 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 22 | +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" |
| 23 | +CHANGELOG="$PROJECT_DIR/CHANGELOG.md" |
| 24 | +PACKAGE_JSON="$PROJECT_DIR/package.json" |
| 25 | +TAURI_CONF="$PROJECT_DIR/src-tauri/tauri.conf.json" |
| 26 | + |
| 27 | +VERSION="$1" |
| 28 | +DRY_RUN=false |
| 29 | + |
| 30 | +if [ "$2" = "--dry-run" ]; then |
| 31 | + DRY_RUN=true |
| 32 | +fi |
| 33 | + |
| 34 | +# ── Validate input ── |
| 35 | + |
| 36 | +if [ -z "$VERSION" ]; then |
| 37 | + echo -e "${RED}Error: version required${NC}" |
| 38 | + echo "" |
| 39 | + echo "Usage: ./scripts/release.sh <version> [--dry-run]" |
| 40 | + echo "Example: ./scripts/release.sh 0.4.0" |
| 41 | + echo "" |
| 42 | + echo "Before running, document the release in CHANGELOG.md:" |
| 43 | + echo " ## [$VERSION] - $(date +%Y-%m-%d)" |
| 44 | + exit 1 |
| 45 | +fi |
| 46 | + |
| 47 | +# Strip leading 'v' if provided |
| 48 | +VERSION="${VERSION#v}" |
| 49 | + |
| 50 | +echo "" |
| 51 | +echo "=== SQLMap UI Release v$VERSION ===" |
| 52 | +echo "" |
| 53 | + |
| 54 | +# ── Check clean working tree ── |
| 55 | + |
| 56 | +if [ -n "$(git -C "$PROJECT_DIR" status --porcelain)" ]; then |
| 57 | + echo -e "${RED}Error: working tree is not clean${NC}" |
| 58 | + echo "Commit or stash your changes before releasing." |
| 59 | + git -C "$PROJECT_DIR" status --short |
| 60 | + exit 1 |
| 61 | +fi |
| 62 | + |
| 63 | +# ── Validate CHANGELOG.md exists ── |
| 64 | + |
| 65 | +if [ ! -f "$CHANGELOG" ]; then |
| 66 | + echo -e "${RED}Error: CHANGELOG.md not found${NC}" |
| 67 | + exit 1 |
| 68 | +fi |
| 69 | + |
| 70 | +# ── Validate version is documented in CHANGELOG.md ── |
| 71 | + |
| 72 | +CHANGELOG_ENTRY=$(grep -E "^## \[$VERSION\]" "$CHANGELOG" || true) |
| 73 | + |
| 74 | +if [ -z "$CHANGELOG_ENTRY" ]; then |
| 75 | + echo -e "${RED}Error: version $VERSION not found in CHANGELOG.md${NC}" |
| 76 | + echo "" |
| 77 | + echo "Add an entry before releasing:" |
| 78 | + echo "" |
| 79 | + echo " ## [$VERSION] - $(date +%Y-%m-%d)" |
| 80 | + echo "" |
| 81 | + echo " ### Added" |
| 82 | + echo " - ..." |
| 83 | + echo "" |
| 84 | + exit 1 |
| 85 | +fi |
| 86 | + |
| 87 | +# Validate it has a date |
| 88 | +if ! echo "$CHANGELOG_ENTRY" | grep -qE "\d{4}-\d{2}-\d{2}"; then |
| 89 | + echo -e "${RED}Error: version $VERSION in CHANGELOG.md has no date${NC}" |
| 90 | + echo "Expected format: ## [$VERSION] - YYYY-MM-DD" |
| 91 | + exit 1 |
| 92 | +fi |
| 93 | + |
| 94 | +# Validate comparison link exists |
| 95 | +if ! grep -q "\[$VERSION\]:" "$CHANGELOG"; then |
| 96 | + echo -e "${YELLOW}Warning: no comparison link for [$VERSION] at bottom of CHANGELOG.md${NC}" |
| 97 | + echo "Add: [$VERSION]: https://github.com/javierpr0/sqlmap-ui/compare/vPREV...v$VERSION" |
| 98 | +fi |
| 99 | + |
| 100 | +echo -e "${GREEN}CHANGELOG.md:${NC} $CHANGELOG_ENTRY" |
| 101 | + |
| 102 | +# ── Validate tag doesn't already exist ── |
| 103 | + |
| 104 | +if git -C "$PROJECT_DIR" tag -l "v$VERSION" | grep -q "v$VERSION"; then |
| 105 | + echo -e "${RED}Error: tag v$VERSION already exists${NC}" |
| 106 | + exit 1 |
| 107 | +fi |
| 108 | + |
| 109 | +# ── Show what will change ── |
| 110 | + |
| 111 | +CURRENT_PKG=$(grep '"version"' "$PACKAGE_JSON" | head -1 | sed 's/.*"version": "\(.*\)".*/\1/') |
| 112 | +CURRENT_TAURI=$(grep '"version"' "$TAURI_CONF" | head -1 | sed 's/.*"version": "\(.*\)".*/\1/') |
| 113 | + |
| 114 | +echo "" |
| 115 | +echo "Version updates:" |
| 116 | +echo " package.json: $CURRENT_PKG -> $VERSION" |
| 117 | +echo " tauri.conf.json: $CURRENT_TAURI -> $VERSION" |
| 118 | +echo " git tag: v$VERSION" |
| 119 | +echo "" |
| 120 | + |
| 121 | +if [ "$DRY_RUN" = true ]; then |
| 122 | + echo -e "${YELLOW}Dry run complete. No changes made.${NC}" |
| 123 | + exit 0 |
| 124 | +fi |
| 125 | + |
| 126 | +# ── Confirm ── |
| 127 | + |
| 128 | +read -p "Proceed with release v$VERSION? (y/N) " -n 1 -r |
| 129 | +echo "" |
| 130 | +if [[ ! $REPLY =~ ^[Yy]$ ]]; then |
| 131 | + echo "Aborted." |
| 132 | + exit 0 |
| 133 | +fi |
| 134 | + |
| 135 | +# ── Update versions ── |
| 136 | + |
| 137 | +# package.json |
| 138 | +sed -i.bak "s/\"version\": \"$CURRENT_PKG\"/\"version\": \"$VERSION\"/" "$PACKAGE_JSON" |
| 139 | +rm -f "$PACKAGE_JSON.bak" |
| 140 | + |
| 141 | +# tauri.conf.json |
| 142 | +sed -i.bak "s/\"version\": \"$CURRENT_TAURI\"/\"version\": \"$VERSION\"/" "$TAURI_CONF" |
| 143 | +rm -f "$TAURI_CONF.bak" |
| 144 | + |
| 145 | +echo -e "${GREEN}Updated versions in package.json and tauri.conf.json${NC}" |
| 146 | + |
| 147 | +# ── Commit version bump ── |
| 148 | + |
| 149 | +cd "$PROJECT_DIR" |
| 150 | +git add package.json src-tauri/tauri.conf.json |
| 151 | +git commit -m "chore: bump version to $VERSION" |
| 152 | + |
| 153 | +echo -e "${GREEN}Committed version bump${NC}" |
| 154 | + |
| 155 | +# ── Create tag ── |
| 156 | + |
| 157 | +git tag -a "v$VERSION" -m "Release v$VERSION" |
| 158 | +echo -e "${GREEN}Created tag v$VERSION${NC}" |
| 159 | + |
| 160 | +# ── Push ── |
| 161 | + |
| 162 | +echo "" |
| 163 | +read -p "Push to origin? (y/N) " -n 1 -r |
| 164 | +echo "" |
| 165 | +if [[ $REPLY =~ ^[Yy]$ ]]; then |
| 166 | + git push origin master --tags |
| 167 | + echo -e "${GREEN}Pushed to origin. GitHub Actions will build and create the release.${NC}" |
| 168 | +else |
| 169 | + echo "" |
| 170 | + echo "To push manually:" |
| 171 | + echo " git push origin master --tags" |
| 172 | +fi |
| 173 | + |
| 174 | +echo "" |
| 175 | +echo -e "${GREEN}=== Release v$VERSION complete ===${NC}" |
0 commit comments