| # !/bin/bash |
| #===-- merge-request.sh ---------------------------------------------------===# |
| # |
| # 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 |
| # |
| #===------------------------------------------------------------------------===# |
| # |
| # Submit a merge request to bugzilla. |
| # |
| #===------------------------------------------------------------------------===# |
| |
| dryrun="" |
| stable_version="" |
| revisions="" |
| BUGZILLA_BIN="" |
| BUGZILLA_CMD="" |
| release_metabug="" |
| bugzilla_product="new-bugs" |
| bugzilla_component="new bugs" |
| bugzilla_assigned_to="" |
| bugzilla_user="" |
| bugzilla_version="" |
| bugzilla_url="https://bugs.llvm.org/xmlrpc.cgi" |
| |
| function usage() { |
| echo "usage: `basename $0` -user EMAIL -stable-version X.Y -r NUM" |
| echo "" |
| echo " -user EMAIL Your email address for logging into bugzilla." |
| echo " -stable-version X.Y The stable release version (e.g. 4.0, 5.0)." |
| echo " -r NUM Revision number to merge (e.g. 1234567)." |
| echo " This option can be specified multiple times." |
| echo " -bugzilla-bin PATH Path to bugzilla binary (optional)." |
| echo " -assign-to EMAIL Assign bug to user with EMAIL (optional)." |
| echo " -dry-run Print commands instead of executing them." |
| } |
| |
| while [ $# -gt 0 ]; do |
| case $1 in |
| -user) |
| shift |
| bugzilla_user="$1" |
| ;; |
| -stable-version) |
| shift |
| stable_version="$1" |
| ;; |
| -r) |
| shift |
| revisions="$revisions $1" |
| ;; |
| -project) |
| shift |
| project="$1" |
| ;; |
| -component) |
| shift |
| bugzilla_component="$1" |
| ;; |
| -bugzilla-bin) |
| shift |
| BUGZILLA_BIN="$1" |
| ;; |
| -assign-to) |
| shift |
| bugzilla_assigned_to="--assigned_to=$1" |
| ;; |
| -dry-run) |
| dryrun="echo" |
| ;; |
| -help | --help | -h | --h | -\? ) |
| usage |
| exit 0 |
| ;; |
| * ) |
| echo "unknown option: $1" |
| usage |
| exit 1 |
| ;; |
| esac |
| shift |
| done |
| |
| if [ -z "$stable_version" ]; then |
| echo "error: no stable version specified" |
| exit 1 |
| fi |
| |
| case $stable_version in |
| 4.0) |
| release_metabug="32061" |
| ;; |
| 5.0) |
| release_metabug="34492" |
| ;; |
| 6.0) |
| release_metabug="36649" |
| ;; |
| 7.0) |
| release_metabug="39106" |
| ;; |
| 8.0) |
| release_metabug="40331" |
| ;; |
| *) |
| echo "error: invalid stable version" |
| exit 1 |
| esac |
| bugzilla_version=$stable_version |
| |
| if [ -z "$revisions" ]; then |
| echo "error: no revisions specified" |
| exit 1 |
| fi |
| |
| if [ -z "$bugzilla_user" ]; then |
| echo "error: bugzilla username not specified." |
| exit 1 |
| fi |
| |
| if [ -z "$BUGZILLA_BIN" ]; then |
| BUGZILLA_BIN=`which bugzilla` |
| if [ $? -ne 0 ]; then |
| echo "error: could not find bugzilla executable." |
| echo "Make sure the bugzilla cli tool is installed on your system: " |
| echo "pip install python-bugzilla (recommended)" |
| echo "" |
| echo "Fedora: dnf install python-bugzilla" |
| echo "Ubuntu/Debian: apt-get install bugzilla-cli" |
| exit 1 |
| fi |
| fi |
| |
| BUGZILLA_MAJOR_VERSION=`$BUGZILLA_BIN --version 2>&1 | cut -d . -f 1` |
| |
| if [ $BUGZILLA_MAJOR_VERSION -eq 1 ]; then |
| |
| echo "***************************** Error ** ********************************" |
| echo "You are using an older version of the bugzilla cli tool, which is not " |
| echo "supported. You need to use bugzilla cli version 2.0.0 or higher:" |
| echo "***********************************************************************" |
| exit 1 |
| fi |
| |
| BUGZILLA_CMD="$BUGZILLA_BIN --bugzilla=$bugzilla_url" |
| |
| rev_string="" |
| for r in $revisions; do |
| rev_string="$rev_string r$r" |
| done |
| |
| echo "Checking for duplicate bugs..." |
| |
| check_duplicates=`$BUGZILLA_CMD query --blocked=$release_metabug --field="cf_fixed_by_commits=$rev_string"` |
| |
| if [ -n "$check_duplicates" ]; then |
| echo "Duplicate bug found:" |
| echo $check_duplicates |
| exit 1 |
| fi |
| |
| echo "Done" |
| |
| # Get short commit summary. To avoid having a huge summary, we just |
| # use the commit message for the first commit. |
| commit_summary='' |
| for r in $revisions; do |
| commit_msg=`svn log -r $r https://llvm.org/svn/llvm-project/` |
| if [ $? -ne 0 ]; then |
| echo "warning: failed to get commit message." |
| commit_msg="" |
| fi |
| break |
| done |
| |
| if [ -n "$commit_msg" ]; then |
| commit_summary=`echo "$commit_msg" | sed '4q;d' | cut -c1-80` |
| commit_summary=" : ${commit_summary}" |
| fi |
| |
| bug_summary="Merge${rev_string} into the $stable_version branch${commit_summary}" |
| |
| set -x |
| |
| # Login to bugzilla |
| $BUGZILLA_CMD login $bugzilla_user |
| |
| bug_id=`${dryrun} $BUGZILLA_CMD --ensure-logged-in new \ |
| -p "$bugzilla_product" \ |
| -c "$bugzilla_component" --blocked=$release_metabug \ |
| -o All --priority=P --arch All -v $bugzilla_version \ |
| --field="cf_fixed_by_commits=$rev_string" \ |
| --summary "${bug_summary}" \ |
| -l "Is it OK to merge the following revision(s) to the $stable_version branch?" \ |
| $bugzilla_assigned_to \ |
| -i` |
| |
| if [ -n "$dryrun" ]; then |
| exit 0 |
| fi |
| |
| set +x |
| |
| if [ -z "$bug_id" ]; then |
| echo "Failed to create bug." |
| exit 1 |
| fi |
| |
| echo " Created new bug:" |
| echo https://llvm.org/PR$bug_id |
| |
| # Add links to revisions |
| for r in $revisions; do |
| $BUGZILLA_CMD --ensure-logged-in modify -l "https://reviews.llvm.org/rL$r" $bug_id |
| done |