153 lines
4.3 KiB
Bash
Executable File
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 "$@"
|