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