220 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env 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="41221"
 | 
						|
    ;;
 | 
						|
  9.0)
 | 
						|
    release_metabug="43360"
 | 
						|
    ;;
 | 
						|
  *)
 | 
						|
    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
 |