# !/bin/bash #===-- merge-request.sh ---------------------------------------------------===# # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. # #===------------------------------------------------------------------------===# # # 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="41221" ;; *) 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