148 lines
3.6 KiB
Bash
Executable File
148 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# nt increment + push script
|
|
# Canonical version source is latest git tag (vX.Y.Z)
|
|
# This script increments the tag and updates NT_VERSION macros in src/main.c
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
print_status() { echo -e "${BLUE}[INFO]${NC} $1" >&2; }
|
|
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" >&2; }
|
|
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" >&2; }
|
|
print_error() { echo -e "${RED}[ERROR]${NC} $1" >&2; }
|
|
|
|
COMMIT_MESSAGE=""
|
|
VERSION_INCREMENT_TYPE="patch" # patch|minor|major
|
|
|
|
show_usage() {
|
|
echo "nt increment and push"
|
|
echo ""
|
|
echo "USAGE:"
|
|
echo " $0 [OPTIONS] \"commit message\""
|
|
echo ""
|
|
echo "OPTIONS:"
|
|
echo " -p, --patch Increment patch version (default)"
|
|
echo " -m, --minor Increment minor version"
|
|
echo " -M, --major Increment major version"
|
|
echo " -h, --help Show help"
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-p|--patch)
|
|
VERSION_INCREMENT_TYPE="patch"
|
|
shift
|
|
;;
|
|
-m|--minor)
|
|
VERSION_INCREMENT_TYPE="minor"
|
|
shift
|
|
;;
|
|
-M|--major)
|
|
VERSION_INCREMENT_TYPE="major"
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
show_usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
|
COMMIT_MESSAGE="$1"
|
|
fi
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$COMMIT_MESSAGE" ]]; then
|
|
print_error "Commit message is required"
|
|
echo ""
|
|
show_usage
|
|
exit 1
|
|
fi
|
|
|
|
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
print_error "Not in a git repository"
|
|
exit 1
|
|
fi
|
|
|
|
LATEST_TAG=$(git tag -l 'v*.*.*' | sort -V | tail -n 1 || true)
|
|
if [[ -z "$LATEST_TAG" ]]; then
|
|
LATEST_TAG="v0.0.0"
|
|
print_warning "No version tags found, starting from $LATEST_TAG"
|
|
fi
|
|
|
|
VERSION=${LATEST_TAG#v}
|
|
if [[ $VERSION =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
|
|
MAJOR=${BASH_REMATCH[1]}
|
|
MINOR=${BASH_REMATCH[2]}
|
|
PATCH=${BASH_REMATCH[3]}
|
|
else
|
|
print_error "Invalid version format in tag: $LATEST_TAG"
|
|
exit 1
|
|
fi
|
|
|
|
case "$VERSION_INCREMENT_TYPE" in
|
|
major)
|
|
NEW_MAJOR=$((MAJOR + 1))
|
|
NEW_MINOR=0
|
|
NEW_PATCH=0
|
|
;;
|
|
minor)
|
|
NEW_MAJOR=$MAJOR
|
|
NEW_MINOR=$((MINOR + 1))
|
|
NEW_PATCH=0
|
|
;;
|
|
*)
|
|
NEW_MAJOR=$MAJOR
|
|
NEW_MINOR=$MINOR
|
|
NEW_PATCH=$((PATCH + 1))
|
|
;;
|
|
esac
|
|
|
|
NEW_VERSION="v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}"
|
|
print_status "Current version: $LATEST_TAG"
|
|
print_status "New version: $NEW_VERSION"
|
|
|
|
if [[ ! -f "src/main.c" ]]; then
|
|
print_error "src/main.c not found"
|
|
exit 1
|
|
fi
|
|
|
|
print_status "Updating version macros in src/main.c"
|
|
sed -i "s/^#define NT_VERSION_MAJOR .*/#define NT_VERSION_MAJOR ${NEW_MAJOR}/" src/main.c
|
|
sed -i "s/^#define NT_VERSION_MINOR .*/#define NT_VERSION_MINOR ${NEW_MINOR}/" src/main.c
|
|
sed -i "s/^#define NT_VERSION_PATCH .*/#define NT_VERSION_PATCH ${NEW_PATCH}/" src/main.c
|
|
sed -i "s/^#define NT_VERSION \".*\"/#define NT_VERSION \"${NEW_VERSION}\"/" src/main.c
|
|
|
|
print_success "Updated version in src/main.c to $NEW_VERSION"
|
|
|
|
print_status "Staging changes"
|
|
git add src/main.c CMakeLists.txt build.sh increment_and_push.sh README.md plans/planning.md include/*.h src/*.c .test_mnemonic 2>/dev/null || git add .
|
|
|
|
if git diff --staged --quiet; then
|
|
print_warning "No changes to commit"
|
|
else
|
|
git commit -m "$NEW_VERSION - $COMMIT_MESSAGE"
|
|
print_success "Committed changes"
|
|
fi
|
|
|
|
if git rev-parse "$NEW_VERSION" >/dev/null 2>&1; then
|
|
print_warning "Tag $NEW_VERSION already exists locally; recreating"
|
|
git tag -d "$NEW_VERSION" >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
git tag "$NEW_VERSION"
|
|
print_success "Created tag: $NEW_VERSION"
|
|
|
|
print_status "Pushing commit and tag"
|
|
git push
|
|
git push origin "$NEW_VERSION"
|
|
|
|
print_success "Done. Pushed $NEW_VERSION"
|