#!/usr/bin/env bash # Shared helpers for release and PR title CI scripts. SOURCE_DIR="python_repositories" # Returns bump type (major|minor|patch) or empty if no valid prefix. bump_type_from_title() { local title="$1" local lower lower=$(echo "$title" | tr '[:upper:]' '[:lower:]') if echo "$lower" | grep -qE '^\[(major|breaking)\]'; then echo "major" elif echo "$lower" | grep -qE '^\[(minor|feat)\]'; then echo "minor" elif echo "$lower" | grep -qE '^\[(patch|fix)\]'; then echo "patch" fi } title_has_bump_prefix() { [[ -n "$(bump_type_from_title "$1")" ]] } strip_bump_prefix() { local title="$1" echo "$title" | sed -E 's/^\[(patch|fix|minor|feat|major|breaking)\][[:space:]]*//i' } extract_pr_title_from_merge_commit() { local msg="$1" echo "$msg" | sed -n "s/^Merge pull request '\(.*\)' (#.*/\1/p" } changed_source_files() { grep -E "^${SOURCE_DIR}/" || true } has_source_changes() { local files="$1" echo "$files" | changed_source_files | grep -q . } read_pyproject_version() { sed -n 's/^version = "\(.*\)"/\1/p' pyproject.toml | head -1 } latest_tag_version() { local tag tag=$(git describe --tags --abbrev=0 2>/dev/null || true) if [[ -n "$tag" ]]; then echo "${tag#v}" else read_pyproject_version fi } set_pyproject_version() { local version="$1" sed -i.bak -E "s/^version = \".*\"/version = \"${version}\"/" pyproject.toml rm -f pyproject.toml.bak } bump_semver() { local current="$1" local bump_type="$2" local major minor patch IFS=. read -r major minor patch <<< "$current" case "$bump_type" in major) major=$((major + 1)) minor=0 patch=0 ;; minor) minor=$((minor + 1)) patch=0 ;; patch) patch=$((patch + 1)) ;; *) echo "Unknown bump type: $bump_type" >&2 return 1 ;; esac echo "${major}.${minor}.${patch}" }