#!/bin/bash
#===-- tag.sh - Tag the LLVM release candidates ----------------------------===#
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License.
#
#===------------------------------------------------------------------------===#
#
# Create branches and release candidates for the LLVM release.
#
#===------------------------------------------------------------------------===#

set -e

release=""
rc=""
rebranch="no"
# All the projects that make it into the monorepo, plus test-suite.
projects="monorepo-root cfe clang-tools-extra compiler-rt debuginfo-tests libclc libcxx libcxxabi libunwind lld lldb llgo llvm openmp parallel-libs polly pstl test-suite"
dryrun=""
revision="HEAD"

base_url="https://llvm.org/svn/llvm-project"

usage() {
    echo "usage: `basename $0` -release <num> [-rebranch] [-revision <num>] [-dry-run]"
    echo "usage: `basename $0` -release <num> -rc <num> [-dry-run]"
    echo " "
    echo "  -release <num>   The version number of the release"
    echo "  -rc <num>        The release candidate number"
    echo "  -rebranch        Remove existing branch, if present, before branching"
    echo "  -final           Tag final release candidate"
    echo "  -revision <num>  Revision to branch off (default: HEAD)"
    echo "  -dry-run         Make no changes to the repository, just print the commands"
}

tag_version() {
    local remove_args=()
    local create_args=()
    local message_prefix
    set -x
    for proj in $projects; do
        if svn ls $base_url/$proj/branches/release_$branch_release > /dev/null 2>&1 ; then
            if [ $rebranch = "no" ]; then
                continue
            fi
            remove_args+=(rm "$proj/branches/release_$branch_release")
        fi
        create_args+=(cp ${revision} "$proj/trunk" "$proj/branches/release_$branch_release")
    done
    if [[ ${#remove_args[@]} -gt 0 ]]; then
        message_prefix="Removing and recreating"
    else
        message_prefix="Creating"
    fi
    if [[ ${#create_args[@]} -gt 0 ]]; then
        ${dryrun} svnmucc --root-url "$base_url" \
            -m "$message_prefix release_$branch_release branch off revision ${revision}" \
            "${remove_args[@]}" "${create_args[@]}"
    fi
    set +x
}

tag_release_candidate() {
    local create_args=()
    set -x
    for proj in $projects ; do
        if ! svn ls $base_url/$proj/tags/RELEASE_$tag_release > /dev/null 2>&1 ; then
            create_args+=(mkdir "$proj/tags/RELEASE_$tag_release")
        fi
        if ! svn ls $base_url/$proj/tags/RELEASE_$tag_release/$rc > /dev/null 2>&1 ; then
            create_args+=(cp HEAD
                          "$proj/branches/release_$branch_release"
                          "$proj/tags/RELEASE_$tag_release/$rc")
        fi
    done
    if [[ ${#create_args[@]} -gt 0 ]]; then
        ${dryrun} svnmucc --root-url "$base_url" \
            -m "Creating release candidate $rc from release_$tag_release branch" \
            "${create_args[@]}"
    fi
    set +x
}

while [ $# -gt 0 ]; do
    case $1 in
        -release | --release )
            shift
            release=$1
            ;;
        -rc | --rc )
            shift
            rc="rc$1"
            ;;
        -rebranch | --rebranch )
            rebranch="yes"
            ;;
        -final | --final )
            rc="final"
            ;;
        -revision | --revision )
            shift
            revision="$1"
            ;;
        -dry-run | --dry-run )
            dryrun="echo"
            ;;
        -h | --help | -help )
            usage
            exit 0
            ;;
        * )
            echo "unknown option: $1"
            usage
            exit 1
            ;;
    esac
    shift
done

if [ "$release" = "" ]; then
    echo "error: need to specify a release version"
    echo
    usage
    exit 1
fi

branch_release=`echo $release | sed -e 's,\([0-9]*\.[0-9]*\).*,\1,' | sed -e 's,\.,,g'`
tag_release=`echo $release | sed -e 's,\.,,g'`

if [ "$rc" = "" ]; then
    tag_version
else
    if [ "$revision" != "HEAD" ]; then
        echo "error: cannot use -revision with -rc"
        echo
        usage
        exit 1
    fi

    tag_release_candidate
fi

exit 0
