blob: 01922f405ea1e9a4eb368fca3d1aed6cc5003088 [file] [log] [blame]
#!/bin/bash
#===-- tag.sh - Tag the LLVM release candidates ----------------------------===#
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===------------------------------------------------------------------------===#
#
# 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