1be644f0d4
Change-Id: Ic4687dfea7c71a193922d5286106d1783e9a6bdf
118 lines
3.4 KiB
Bash
Executable File
118 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Tool to take a dirty working tree and create a 'flat' gerrit topic (per team)
|
|
# for all the changes
|
|
#
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
|
|
function usage {
|
|
echo "Usage: bulk_review.sh -t topic -s subject -b message_body"
|
|
echo
|
|
echo " topic: local branch names will be of the form $team-$topic"
|
|
echo " and gerrit topic will be set to $topic"
|
|
echo " subject: This will be the subject in the git commit"
|
|
echo " body: This will be the message body for the git commit"
|
|
echo
|
|
echo "This script operates on a dirty repo (such as one created by"
|
|
echo "running tools/make_missing_releases.sh. It will then create a"
|
|
echo "local branch per-team of the modified deliverable files and then"
|
|
echo "submit that branch for review"
|
|
echo
|
|
echo "PTLs and liaisons will be CC'd on the review"
|
|
}
|
|
|
|
# NOTE: It might be worth switching getopt but I don't know if that is
|
|
# available and the same on MacOS
|
|
while getopts "t:s:b:" arg ; do
|
|
case "$arg" in
|
|
t)
|
|
topic=$OPTARG
|
|
;;
|
|
s)
|
|
subject=$OPTARG
|
|
;;
|
|
b)
|
|
body=$OPTARG
|
|
;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "$topic" -o -z "$subject" -o -z "$body" ] ; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
echo 'This script will modifiy git branches and and submit reviews.'
|
|
echo 'It relies on master being a safe/clean branch.'
|
|
echo
|
|
echo 'If master contains private changes, abort now'
|
|
echo 'If you have any unrelated work, abort now'
|
|
echo 'If you have not saved the modified deliverables somewhere, abort now'
|
|
echo
|
|
echo 'Press return to continue or <ctrl>-C to abort'
|
|
|
|
read _continue
|
|
|
|
declare -A files_by_team_release=()
|
|
|
|
# Find the team associated with each modified deliverable file
|
|
declare -a deliverables=($(git ls-files -m deliverables))
|
|
for file in "${deliverables[@]}" ; do
|
|
team="$(get-deliverable-owner --file $file)"
|
|
files_by_team_release["$team"]+=" $file"
|
|
done
|
|
|
|
#for x in "${!files_by_team_release[@]}"; do printf "[%q]=%q\n" "$x" "${files_by_team_release[$x]}" ; done
|
|
|
|
for team in "${!files_by_team_release[@]}" ; do
|
|
branch_name=${team/ /_}-${topic}
|
|
echo "[$team] :: [$branch_name] ${files_by_team_release[$team]}"
|
|
|
|
git checkout -b $branch_name -t origin/master
|
|
|
|
git add ${files_by_team_release[$team]}
|
|
git commit \
|
|
-m "[$team] $subject" \
|
|
-m "$body"
|
|
|
|
git stash
|
|
git checkout master
|
|
git stash pop
|
|
done
|
|
|
|
git checkout master
|
|
git stash list
|
|
git branch -va | grep -E "$topic"
|
|
|
|
for team in "${!files_by_team_release[@]}" ; do
|
|
declare -a emails=(
|
|
$(get-contacts --all "$team"| awk -F': ' '/Email/ {print $2}')
|
|
)
|
|
review_args=''
|
|
for email in ${emails[@]} ; do
|
|
review_args+=" --reviewers $email"
|
|
done
|
|
|
|
branch_name=${team/ /_}-${topic}
|
|
git checkout $branch_name
|
|
git review -y -t $topic $review_args
|
|
done
|
|
git checkout master
|