Files
.dotfile/.build_scripts/version.sh
T
2025-10-22 11:40:12 +08:00

153 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
# Version management script
# Args:
# 1. ARGS: arguments, optional
# 2. VERSION_VAR: version variable, optional
set -e
ARGS="$1"
VERSION_VAR="$2"
CURRENT_VERSION=$(cat VERSION)
show_usage() {
echo "Current version: $CURRENT_VERSION"
echo "Usage:"
echo " make version VERSION=v1.0.0 # Set specific version"
echo " make version v1.0.0 # Set specific version"
echo " make version patch # Increment patch version"
echo " make version minor # Increment minor version"
echo " make version major # Increment major version"
echo " make version pre # Add/increment pre-release (default: rc)"
echo " make version pre alpha # Add alpha pre-release"
echo " make version pre beta # Add beta pre-release"
echo " make version pre rc # Add rc pre-release"
echo " make version pre alpha 2 # Add specific alpha version"
}
parse_version() {
local version="$1"
# Remove 'v' prefix and split by '-'
local clean_version="${version#v}"
local base_version="${clean_version%-*}"
local pre_release=""
if [[ "$clean_version" == *"-"* ]]; then
pre_release="${clean_version#*-}"
fi
# Split base version
IFS='.' read -r major minor patch <<< "$base_version"
echo "$major $minor $patch $pre_release"
}
increment_version() {
local type="$1"
local version_parts
read -r major minor patch pre_release <<< "$(parse_version "$CURRENT_VERSION")"
case "$type" in
"patch")
patch=$((patch + 1))
echo "v$major.$minor.$patch"
;;
"minor")
minor=$((minor + 1))
patch=0
echo "v$major.$minor.$patch"
;;
"major")
major=$((major + 1))
minor=0
patch=0
echo "v$major.$minor.$patch"
;;
esac
}
handle_prerelease() {
local args=($1)
local version_parts
read -r major minor patch pre_release <<< "$(parse_version "$CURRENT_VERSION")"
local base_version="$major.$minor.$patch"
local pre_type="rc"
local pre_num="1"
# Parse arguments
if [[ ${#args[@]} -ge 3 ]]; then
# make version pre alpha 2 (明确指定版本号)
pre_type="${args[1]}"
pre_num="${args[2]}"
elif [[ ${#args[@]} -ge 2 ]]; then
# make version pre alpha (指定类型,智能处理版本号)
pre_type="${args[1]}"
if [[ -n "$pre_release" ]]; then
# 当前已经是 pre-release
IFS='.' read -r current_type current_num <<< "$pre_release"
if [[ "$current_type" == "$pre_type" ]]; then
# 相同类型,递增版本号
pre_num=$((current_num + 1))
else
# 不同类型,重置为 1
pre_num="1"
fi
else
# 当前是正式版本,从 1 开始
pre_num="1"
fi
else
# make version pre (智能处理)
if [[ -n "$pre_release" ]]; then
# 当前已经是 pre-release,递增版本号
IFS='.' read -r current_type current_num <<< "$pre_release"
pre_type="$current_type"
pre_num=$((current_num + 1))
else
# 当前是正式版本,添加默认 pre-release
pre_type="rc"
pre_num="1"
fi
fi
echo "v$base_version-$pre_type.$pre_num"
}
update_version() {
local new_version="$1"
echo "Updating version from $CURRENT_VERSION to $new_version"
echo "$new_version" > VERSION
git add .
git commit -m "update version to $new_version"
git push origin HEAD
echo "[$new_version] Version file updated and pushed successfully"
}
main() {
if [[ -n "$ARGS" ]]; then
local first_arg="${ARGS%% *}"
case "$first_arg" in
"patch"|"minor"|"major")
new_version=$(increment_version "$first_arg")
;;
"pre")
new_version=$(handle_prerelease "$ARGS")
;;
*)
new_version="$first_arg"
;;
esac
update_version "$new_version"
elif [[ -n "$VERSION_VAR" ]]; then
update_version "$VERSION_VAR"
else
show_usage
fi
}
main "$@"