339136ac0cee73613a881c0c07a3f8f6c16556a0
[gem5.git] / util / maint / create_patches.sh
1 #!/bin/bash
2 #
3 # Copyright (c) 2016 ARM Limited
4 # All rights reserved
5 #
6 # The license below extends only to copyright in the software and shall
7 # not be construed as granting a license to any other intellectual
8 # property including but not limited to intellectual property relating
9 # to a hardware implementation of the functionality of the software
10 # licensed hereunder. You may use the software subject to the license
11 # terms below provided that you ensure that this notice is replicated
12 # unmodified and in its entirety in all distributions of the software,
13 # modified or unmodified, in source code or in binary form.
14 #
15 # Redistribution and use in source and binary forms, with or without
16 # modification, are permitted provided that the following conditions are
17 # met: redistributions of source code must retain the above copyright
18 # notice, this list of conditions and the following disclaimer;
19 # redistributions in binary form must reproduce the above copyright
20 # notice, this list of conditions and the following disclaimer in the
21 # documentation and/or other materials provided with the distribution;
22 # neither the name of the copyright holders nor the names of its
23 # contributors may be used to endorse or promote products derived from
24 # this software without specific prior written permission.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #
38 # Authors: Andreas Sandberg
39 #
40
41 set -e
42
43 REL_SCRIPT_DIR=`dirname "$0"`
44 SCRIPT_NAME=`basename "$0"`
45 SCRIPT_DIR=$(cd "$REL_SCRIPT_DIR" && echo "$(pwd -P)")
46 MSG_FILTER="$SCRIPT_DIR"/upstream_msg_filter.sed
47
48 PATCH_DIR="./patches/"
49 UPSTREAM="upstream/master"
50
51 usage()
52 {
53 cat <<EOF
54 $SCRIPT_NAME [OPTION]... [BRANCH]
55 Format a patch series suitable for upstream consumption.
56
57 Options:
58 -u BRANCH Upstream branch
59 -d DIR Patch directory
60 -h Show this help string.
61
62 This script creates a series of patches suitable from upstream
63 consumption from a git branch. By default, the script works on the
64 currently checked out branch (HEAD). When invoked, the script executes
65 the following operations in order:
66
67 1. Rebase the patches in the current branch onto the upstream
68 branch.
69 2. Filter commit messages.
70 3. Generate a set of patches in git format.
71 EOF
72 }
73
74 branch_exists()
75 {
76 git rev-parse --verify -q "$1" > /dev/null
77 }
78
79 while getopts ":u:d:h" OPT; do
80 case $OPT in
81 d)
82 PATCH_DIR="$OPTARG"
83 ;;
84 u)
85 UPSTREAM="$OPTARG"
86 ;;
87 h)
88 usage
89 exit 0
90 ;;
91
92 \?)
93 echo "$0: invalid option -- '$OPTARG'" >&2
94 echo "Try '$0 -h' for more information." >&2
95 exit 1
96 ;;
97 :)
98 echo "$0: option requires an argument -- '$OPTARG'" >&2
99 exit 1
100 ;;
101 *)
102 echo "Unhandled getopt return:" >&2
103 echo "OPT: $OPT" >&2
104 echo "OPTARG: $OPTARG" >&2
105 exit 1
106 esac
107 done
108
109
110 shift $((OPTIND - 1))
111
112 BRANCH="${1:-HEAD}"
113
114 if ! branch_exists "$BRANCH"; then
115 echo "Error: Patch branch '$BRANCH' doesn't exist" 1>&2
116 exit 2
117 fi
118
119 if ! branch_exists "$UPSTREAM"; then
120 echo "Error: Upstream branch '$UPSTREAM' doesn't exist." 1>&2
121 exit 2
122 fi
123
124 SHA_PATCHES=`git rev-parse "$BRANCH"`
125 OLD_BRANCH=`git symbolic-ref --short -q HEAD`
126 SHA_UPSTREAM=`git rev-parse "$UPSTREAM"`
127
128 echo "Upstream branch: $UPSTREAM"
129 echo "Patch directory: $PATCH_DIR"
130
131 echo "Preparing detached head..."
132 git checkout -q --detach "$SHA_PATCHES"
133
134 # Create an exit trap to checkout the old branch when we're done
135 exit_trap() {
136 git checkout -q "$OLD_BRANCH"
137 }
138 trap exit_trap EXIT
139
140 echo "Rebasing onto upstream master..."
141 git rebase "$UPSTREAM"
142
143 echo "Filtering commit messages..."
144 git filter-branch -f \
145 --msg-filter "$MSG_FILTER" \
146 "$SHA_UPSTREAM"..HEAD > /dev/null
147
148 echo "Creating patches..."
149 git format-patch -p -o "$PATCH_DIR" "$UPSTREAM"