| #!/usr/bin/env bash | |
| # ====================================================================== | |
| # | |
| # Licensed to the Apache Software Foundation (ASF) under one or more | |
| # contributor license agreements. See the NOTICE file distributed with | |
| # this work for additional information regarding copyright ownership. | |
| # The ASF licenses this file to You under the Apache License, Version 2.0 | |
| # (the "License"); you may not use this file except in compliance with | |
| # the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # | |
| # ----------------------------------------------------------------------------- | |
| # getversion — determine the project version for packaging and diagnostics | |
| # ----------------------------------------------------------------------------- | |
| # | |
| # This script computes a version string using the following logic: | |
| # | |
| # 1. Extract the base PACKAGE_VERSION from the `configure` script. | |
| # | |
| # 2. If running inside a Git repository and `git describe` is usable: | |
| # | |
| # a. If the current commit matches an annotated tag exactly: | |
| # VERSION = <tag> | |
| # e.g., VERSION = 2.0.0+RC1 | |
| # | |
| # b. If the current commit is ahead of a tag: | |
| # VERSION = <PACKAGE_VERSION>+dev.<N>.g<commit> | |
| # e.g., VERSION = 2.0.1-devel+dev.3.gabcd123 | |
| # | |
| # 3. If *not* in a Git repo but a `VERSION` file exists: | |
| # | |
| # a. If the file contains a line like "<version> build <build_number>", both values are extracted. | |
| # | |
| # b. Otherwise, the VERSION is read from the file and the BUILDNUMBER is taken from BUILD_NUMBER if it exists. | |
| # | |
| # (This is the case for Apache Cloudberry packaging builds, where these files are created by the | |
| # release script and may also be leveraged by downstream users.) | |
| # | |
| # 4. If neither a Git repo nor a VERSION file is present: | |
| # VERSION = <PACKAGE_VERSION> from configure | |
| # BUILDNUMBER = dev | |
| # | |
| # 5. If a BUILD_NUMBER file is present and BUILDNUMBER is "dev", it will override the default: | |
| # BUILDNUMBER = $(cat BUILD_NUMBER) | |
| # | |
| # Output: | |
| # - Default: <version> build <build_number> | |
| # - With --short: just <version> | |
| # | |
| # Examples: | |
| # ./getversion | |
| # → 2.0.1-devel+dev.3.gabcd123 build dev | |
| # | |
| # ./getversion --short | |
| # → 2.0.1-devel+dev.3.gabcd123 | |
| # | |
| # (On exact tag) | |
| # → 2.0.0+RC1 build dev | |
| # | |
| # Supported Features: | |
| # - Handles annotated tags with special characters like `+` or `-` | |
| # - Produces semver-compatible version strings for CI/CD | |
| # - Works with or without Git | |
| # | |
| # Intended for use in: | |
| # - Release packaging | |
| # - Diagnostic reporting | |
| # - Embedding traceable version info into builds | |
| # | |
| # ====================================================================== | |
| # Make sure we're running from the root git repository | |
| pushd "$(dirname "$0")" > /dev/null | |
| # Extract PACKAGE_VERSION from the configure script | |
| VERSION=$(perl -ne 'print $1 if /^PACKAGE_VERSION='\''(.+)'\''$/' < configure) | |
| BUILDNUMBER=dev | |
| # Function to generate a dev suffix like "dev.1.gabcd123" | |
| generate_dev_version() { | |
| local latest_tag | |
| latest_tag=$(git describe --tags --abbrev=0) | |
| local full_desc | |
| full_desc=$(git describe --tags --long) | |
| local suffix="${full_desc#$latest_tag-}" | |
| echo "dev.${suffix//-/.}" | |
| } | |
| # Check if we're in a Git repo and git is available | |
| if type git >/dev/null 2>&1 && [ -e '.git' ]; then | |
| # Ensure git describe doesn't fail due to shallow clone | |
| if git describe --tags --long >/dev/null 2>&1; then | |
| if git describe --exact-match >/dev/null 2>&1; then | |
| # We're exactly on a tag | |
| VERSION=$(git describe --exact-match) | |
| else | |
| # Not on a tag: add dev version suffix | |
| VERSION+="+$(generate_dev_version)" | |
| fi | |
| fi | |
| # Not a git repo but VERSION file exists | |
| elif [[ -s ./VERSION ]]; then | |
| # Support both legacy "<version> build <build_number>" and newer single-version formats | |
| if grep -q ' build ' ./VERSION; then | |
| VERSION=$(awk -F' build ' '{print $1}' ./VERSION) | |
| BUILDNUMBER=$(awk -F' build ' '{print $2}' ./VERSION) | |
| else | |
| VERSION=$(<./VERSION) | |
| if [[ -f ./BUILD_NUMBER ]]; then | |
| BUILDNUMBER=$(<./BUILD_NUMBER) | |
| fi | |
| fi | |
| fi | |
| # Handle optional flag | |
| FLAG="${1:-noflag}" | |
| if [ "$FLAG" = "--short" ]; then | |
| echo "${VERSION}" | |
| else | |
| if [[ ${BUILDNUMBER} = "dev" && -f BUILD_NUMBER ]]; then | |
| BUILDNUMBER=$(<BUILD_NUMBER) | |
| fi | |
| echo "${VERSION} build ${BUILDNUMBER}" | |
| fi | |
| popd > /dev/null |