#!/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
