111786Sandreas.sandberg@arm.com#!/bin/bash
211786Sandreas.sandberg@arm.com#
311786Sandreas.sandberg@arm.com# Copyright (c) 2016 ARM Limited
411786Sandreas.sandberg@arm.com# All rights reserved
511786Sandreas.sandberg@arm.com#
611786Sandreas.sandberg@arm.com# The license below extends only to copyright in the software and shall
711786Sandreas.sandberg@arm.com# not be construed as granting a license to any other intellectual
811786Sandreas.sandberg@arm.com# property including but not limited to intellectual property relating
911786Sandreas.sandberg@arm.com# to a hardware implementation of the functionality of the software
1011786Sandreas.sandberg@arm.com# licensed hereunder.  You may use the software subject to the license
1111786Sandreas.sandberg@arm.com# terms below provided that you ensure that this notice is replicated
1211786Sandreas.sandberg@arm.com# unmodified and in its entirety in all distributions of the software,
1311786Sandreas.sandberg@arm.com# modified or unmodified, in source code or in binary form.
1411786Sandreas.sandberg@arm.com#
1511786Sandreas.sandberg@arm.com# Redistribution and use in source and binary forms, with or without
1611786Sandreas.sandberg@arm.com# modification, are permitted provided that the following conditions are
1711786Sandreas.sandberg@arm.com# met: redistributions of source code must retain the above copyright
1811786Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer;
1911786Sandreas.sandberg@arm.com# redistributions in binary form must reproduce the above copyright
2011786Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer in the
2111786Sandreas.sandberg@arm.com# documentation and/or other materials provided with the distribution;
2211786Sandreas.sandberg@arm.com# neither the name of the copyright holders nor the names of its
2311786Sandreas.sandberg@arm.com# contributors may be used to endorse or promote products derived from
2411786Sandreas.sandberg@arm.com# this software without specific prior written permission.
2511786Sandreas.sandberg@arm.com#
2611786Sandreas.sandberg@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2711786Sandreas.sandberg@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2811786Sandreas.sandberg@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2911786Sandreas.sandberg@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3011786Sandreas.sandberg@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3111786Sandreas.sandberg@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3211786Sandreas.sandberg@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3311786Sandreas.sandberg@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3411786Sandreas.sandberg@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3511786Sandreas.sandberg@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3611786Sandreas.sandberg@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3711786Sandreas.sandberg@arm.com#
3811786Sandreas.sandberg@arm.com# Authors: Andreas Sandberg
3911786Sandreas.sandberg@arm.com#
4011786Sandreas.sandberg@arm.com
4111786Sandreas.sandberg@arm.comset -e
4211786Sandreas.sandberg@arm.com
4311786Sandreas.sandberg@arm.comREL_SCRIPT_DIR=`dirname "$0"`
4411786Sandreas.sandberg@arm.comSCRIPT_NAME=`basename "$0"`
4511786Sandreas.sandberg@arm.comSCRIPT_DIR=$(cd "$REL_SCRIPT_DIR" && echo "$(pwd -P)")
4611786Sandreas.sandberg@arm.comMSG_FILTER="$SCRIPT_DIR"/upstream_msg_filter.sed
4711786Sandreas.sandberg@arm.com
4811786Sandreas.sandberg@arm.comPATCH_DIR="./patches/"
4911786Sandreas.sandberg@arm.comUPSTREAM="upstream/master"
5011786Sandreas.sandberg@arm.com
5111786Sandreas.sandberg@arm.comusage()
5211786Sandreas.sandberg@arm.com{
5311786Sandreas.sandberg@arm.com    cat <<EOF
5411786Sandreas.sandberg@arm.com$SCRIPT_NAME [OPTION]...  [BRANCH]
5511786Sandreas.sandberg@arm.comFormat a patch series suitable for upstream consumption.
5611786Sandreas.sandberg@arm.com
5711786Sandreas.sandberg@arm.comOptions:
5811786Sandreas.sandberg@arm.com  -u BRANCH      Upstream branch
5911786Sandreas.sandberg@arm.com  -d DIR         Patch directory
6011786Sandreas.sandberg@arm.com  -h             Show this help string.
6111786Sandreas.sandberg@arm.com
6211786Sandreas.sandberg@arm.comThis script creates a series of patches suitable from upstream
6311786Sandreas.sandberg@arm.comconsumption from a git branch. By default, the script works on the
6411786Sandreas.sandberg@arm.comcurrently checked out branch (HEAD). When invoked, the script executes
6511786Sandreas.sandberg@arm.comthe following operations in order:
6611786Sandreas.sandberg@arm.com
6711786Sandreas.sandberg@arm.com  1. Rebase the patches in the current branch onto the upstream
6811786Sandreas.sandberg@arm.com     branch.
6911786Sandreas.sandberg@arm.com  2. Filter commit messages.
7012257Sandreas.sandberg@arm.com  3. Generate a set of patches in git format.
7111786Sandreas.sandberg@arm.comEOF
7211786Sandreas.sandberg@arm.com}
7311786Sandreas.sandberg@arm.com
7411786Sandreas.sandberg@arm.combranch_exists()
7511786Sandreas.sandberg@arm.com{
7611786Sandreas.sandberg@arm.com    git rev-parse --verify -q "$1" > /dev/null
7711786Sandreas.sandberg@arm.com}
7811786Sandreas.sandberg@arm.com
7912257Sandreas.sandberg@arm.comwhile getopts ":u:d:h" OPT; do
8011786Sandreas.sandberg@arm.com    case $OPT in
8111786Sandreas.sandberg@arm.com        d)
8211786Sandreas.sandberg@arm.com            PATCH_DIR="$OPTARG"
8311786Sandreas.sandberg@arm.com            ;;
8411786Sandreas.sandberg@arm.com        u)
8511786Sandreas.sandberg@arm.com            UPSTREAM="$OPTARG"
8611786Sandreas.sandberg@arm.com            ;;
8711786Sandreas.sandberg@arm.com        h)
8811786Sandreas.sandberg@arm.com            usage
8911786Sandreas.sandberg@arm.com            exit 0
9011786Sandreas.sandberg@arm.com            ;;
9111786Sandreas.sandberg@arm.com
9211786Sandreas.sandberg@arm.com        \?)
9311786Sandreas.sandberg@arm.com            echo "$0: invalid option --  '$OPTARG'" >&2
9411786Sandreas.sandberg@arm.com            echo "Try '$0 -h' for more information." >&2
9511786Sandreas.sandberg@arm.com            exit 1
9611786Sandreas.sandberg@arm.com            ;;
9711786Sandreas.sandberg@arm.com        :)
9811786Sandreas.sandberg@arm.com            echo "$0: option requires an argument -- '$OPTARG'" >&2
9911786Sandreas.sandberg@arm.com            exit 1
10011786Sandreas.sandberg@arm.com            ;;
10111786Sandreas.sandberg@arm.com        *)
10211786Sandreas.sandberg@arm.com            echo "Unhandled getopt return:" >&2
10311786Sandreas.sandberg@arm.com            echo "OPT: $OPT" >&2
10411786Sandreas.sandberg@arm.com            echo "OPTARG: $OPTARG" >&2
10511786Sandreas.sandberg@arm.com            exit 1
10611786Sandreas.sandberg@arm.com    esac
10711786Sandreas.sandberg@arm.comdone
10811786Sandreas.sandberg@arm.com
10911786Sandreas.sandberg@arm.com
11011786Sandreas.sandberg@arm.comshift $((OPTIND - 1))
11111786Sandreas.sandberg@arm.com
11211786Sandreas.sandberg@arm.comBRANCH="${1:-HEAD}"
11311786Sandreas.sandberg@arm.com
11411786Sandreas.sandberg@arm.comif ! branch_exists "$BRANCH"; then
11511786Sandreas.sandberg@arm.com    echo "Error: Patch branch '$BRANCH' doesn't exist" 1>&2
11611786Sandreas.sandberg@arm.com    exit 2
11711786Sandreas.sandberg@arm.comfi
11811786Sandreas.sandberg@arm.com
11911786Sandreas.sandberg@arm.comif ! branch_exists "$UPSTREAM"; then
12011786Sandreas.sandberg@arm.com    echo "Error: Upstream branch '$UPSTREAM' doesn't exist." 1>&2
12111786Sandreas.sandberg@arm.com    exit 2
12211786Sandreas.sandberg@arm.comfi
12311786Sandreas.sandberg@arm.com
12411786Sandreas.sandberg@arm.comSHA_PATCHES=`git rev-parse "$BRANCH"`
12511786Sandreas.sandberg@arm.comOLD_BRANCH=`git symbolic-ref --short -q HEAD`
12611786Sandreas.sandberg@arm.comSHA_UPSTREAM=`git rev-parse "$UPSTREAM"`
12711786Sandreas.sandberg@arm.com
12811786Sandreas.sandberg@arm.comecho "Upstream branch: $UPSTREAM"
12911786Sandreas.sandberg@arm.comecho "Patch directory: $PATCH_DIR"
13011786Sandreas.sandberg@arm.com
13111786Sandreas.sandberg@arm.comecho "Preparing detached head..."
13211786Sandreas.sandberg@arm.comgit checkout -q --detach "$SHA_PATCHES"
13311786Sandreas.sandberg@arm.com
13411786Sandreas.sandberg@arm.com# Create an exit trap to checkout the old branch when we're done
13511786Sandreas.sandberg@arm.comexit_trap() {
13611786Sandreas.sandberg@arm.com    git checkout -q "$OLD_BRANCH"
13711786Sandreas.sandberg@arm.com}
13811786Sandreas.sandberg@arm.comtrap exit_trap EXIT
13911786Sandreas.sandberg@arm.com
14011786Sandreas.sandberg@arm.comecho "Rebasing onto upstream master..."
14111786Sandreas.sandberg@arm.comgit rebase "$UPSTREAM"
14211786Sandreas.sandberg@arm.com
14311786Sandreas.sandberg@arm.comecho "Filtering commit messages..."
14411786Sandreas.sandberg@arm.comgit filter-branch -f \
14511786Sandreas.sandberg@arm.com    --msg-filter "$MSG_FILTER" \
14611786Sandreas.sandberg@arm.com    "$SHA_UPSTREAM"..HEAD > /dev/null
14711786Sandreas.sandberg@arm.com
14811786Sandreas.sandberg@arm.comecho "Creating patches..."
14911786Sandreas.sandberg@arm.comgit format-patch -p -o "$PATCH_DIR" "$UPSTREAM"
150