1# !/bin/bash 2#===-- merge-request.sh ---------------------------------------------------===# 3# 4# The LLVM Compiler Infrastructure 5# 6# This file is distributed under the University of Illinois Open Source 7# License. 8# 9#===------------------------------------------------------------------------===# 10# 11# Submit a merge request to bugzilla. 12# 13#===------------------------------------------------------------------------===# 14 15dryrun="" 16stable_version="" 17revisions="" 18BUGZILLA_BIN="" 19BUGZILLA_CMD="" 20release_metabug="" 21bugzilla_product="new-bugs" 22bugzilla_component="new bugs" 23bugzilla_assigned_to="" 24bugzilla_user="" 25bugzilla_version="" 26bugzilla_url="https://bugs.llvm.org/xmlrpc.cgi" 27 28function usage() { 29 echo "usage: `basename $0` -user EMAIL -stable-version X.Y -r NUM" 30 echo "" 31 echo " -user EMAIL Your email address for logging into bugzilla." 32 echo " -stable-version X.Y The stable release version (e.g. 4.0, 5.0)." 33 echo " -r NUM Revision number to merge (e.g. 1234567)." 34 echo " This option can be specified multiple times." 35 echo " -bugzilla-bin PATH Path to bugzilla binary (optional)." 36 echo " -assign-to EMAIL Assign bug to user with EMAIL (optional)." 37 echo " -dry-run Print commands instead of executing them." 38} 39 40while [ $# -gt 0 ]; do 41 case $1 in 42 -user) 43 shift 44 bugzilla_user="$1" 45 ;; 46 -stable-version) 47 shift 48 stable_version="$1" 49 ;; 50 -r) 51 shift 52 revisions="$revisions $1" 53 ;; 54 -project) 55 shift 56 project="$1" 57 ;; 58 -component) 59 shift 60 bugzilla_component="$1" 61 ;; 62 -bugzilla-bin) 63 shift 64 BUGZILLA_BIN="$1" 65 ;; 66 -assign-to) 67 shift 68 bugzilla_assigned_to="--assigned_to=$1" 69 ;; 70 -dry-run) 71 dryrun="echo" 72 ;; 73 -help | --help | -h | --h | -\? ) 74 usage 75 exit 0 76 ;; 77 * ) 78 echo "unknown option: $1" 79 usage 80 exit 1 81 ;; 82 esac 83 shift 84done 85 86if [ -z "$stable_version" ]; then 87 echo "error: no stable version specified" 88 exit 1 89fi 90 91case $stable_version in 92 4.0) 93 release_metabug="32061" 94 ;; 95 5.0) 96 release_metabug="34492" 97 ;; 98 6.0) 99 release_metabug="36649" 100 ;; 101 *) 102 echo "error: invalid stable version" 103 exit 1 104esac 105bugzilla_version=$stable_version 106 107if [ -z "$revisions" ]; then 108 echo "error: no revisions specified" 109 exit 1 110fi 111 112if [ -z "$bugzilla_user" ]; then 113 echo "error: bugzilla username not specified." 114 exit 1 115fi 116 117if [ -z "$BUGZILLA_BIN" ]; then 118 BUGZILLA_BIN=`which bugzilla` 119 if [ $? -ne 0 ]; then 120 echo "error: could not find bugzilla executable." 121 echo "Make sure the bugzilla cli tool is installed on your system: " 122 echo "pip install python-bugzilla (recommended)" 123 echo "" 124 echo "Fedora: dnf install python-bugzilla" 125 echo "Ubuntu/Debian: apt-get install bugzilla-cli" 126 exit 1 127 fi 128fi 129 130BUGZILLA_MAJOR_VERSION=`$BUGZILLA_BIN --version 2>&1 | cut -d . -f 1` 131 132if [ $BUGZILLA_MAJOR_VERSION -eq 1 ]; then 133 134 echo "***************************** Error ** ********************************" 135 echo "You are using an older version of the bugzilla cli tool, which is not " 136 echo "supported. You need to use bugzilla cli version 2.0.0 or higher:" 137 echo "***********************************************************************" 138 exit 1 139fi 140 141BUGZILLA_CMD="$BUGZILLA_BIN --bugzilla=$bugzilla_url" 142 143rev_string="" 144for r in $revisions; do 145 rev_string="$rev_string r$r" 146done 147 148echo "Checking for duplicate bugs..." 149 150check_duplicates=`$BUGZILLA_CMD query --blocked=$release_metabug --field="cf_fixed_by_commits=$rev_string"` 151 152if [ -n "$check_duplicates" ]; then 153 echo "Duplicate bug found:" 154 echo $check_duplicates 155 exit 1 156fi 157 158echo "Done" 159 160# Get short commit summary. To avoid having a huge summary, we just 161# use the commit message for the first commit. 162commit_summary='' 163for r in $revisions; do 164 commit_msg=`svn log -r $r https://llvm.org/svn/llvm-project/` 165 if [ $? -ne 0 ]; then 166 echo "warning: failed to get commit message." 167 commit_msg="" 168 fi 169 break 170done 171 172if [ -n "$commit_msg" ]; then 173 commit_summary=`echo "$commit_msg" | sed '4q;d' | cut -c1-80` 174 commit_summary=" : ${commit_summary}" 175fi 176 177bug_summary="Merge${rev_string} into the $stable_version branch${commit_summary}" 178 179set -x 180 181# Login to bugzilla 182$BUGZILLA_CMD login $bugzilla_user 183 184bug_id=`${dryrun} $BUGZILLA_CMD --ensure-logged-in new \ 185 -p "$bugzilla_product" \ 186 -c "$bugzilla_component" --blocked=$release_metabug \ 187 -o All --priority=P --arch All -v $bugzilla_version \ 188 --field="cf_fixed_by_commits=$rev_string" \ 189 --summary "${bug_summary}" \ 190 -l "Is it OK to merge the following revision(s) to the $stable_version branch?" \ 191 $bugzilla_assigned_to \ 192 -i` 193 194if [ -n "$dryrun" ]; then 195 exit 0 196fi 197 198set +x 199 200if [ -z "$bug_id" ]; then 201 echo "Failed to create bug." 202 exit 1 203fi 204 205echo " Created new bug:" 206echo https://llvm.org/PR$bug_id 207 208# Add links to revisions 209for r in $revisions; do 210 $BUGZILLA_CMD --ensure-logged-in modify -l "https://reviews.llvm.org/rL$r" $bug_id 211done 212