blob: 2ef4a5d75d73d6914e21eb82e2b10a1d8b195389 [file] [log] [blame]
Yvan Rouxa0a33672014-06-02 15:29:43 +02001#!/bin/bash
2
3# ==============================================================================
4# *** BackFLiP (a.k.a BACKporting Fun with LInaro People) ***
5#
6# Usage: backflip rev_number
7# ==============================================================================
8
9# ==============================================================================
10# Configuration
11# ==============================================================================
12VERSION=4.9
Yvan Rouxca4cddd2015-03-18 20:59:10 +010013REF_BRANCH=linaro-${VERSION}-branch
Yvan Rouxa0a33672014-06-02 15:29:43 +020014
15DATE=`date +%Y-%m-%d`
16NAME=`git config user.name`
Yvan Roux65b2fd22015-03-13 13:17:43 +010017FNAME=`echo ${NAME} | cut -d ' ' -f 1`
Yvan Rouxa0a33672014-06-02 15:29:43 +020018EMAIL=`git config user.email`
Charles Baylis5f590ee2015-02-25 16:10:21 +000019EDITOR="${EDITOR:-vim}"
Yvan Rouxca4cddd2015-03-18 20:59:10 +010020STACKED=false
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010021CMPTOOL="meld"
Yvan Rouxca4cddd2015-03-18 20:59:10 +010022
23# Arguments
24while getopts "b:r:v:" options
25do
26 case $options in
27 r ) REF_BRANCH=$OPTARG
28 ;;
29 b ) DEV_BRANCH=$OPTARG
30 STACKED=true
31 ;;
32 v ) VERSION=$OPTARG
Yvan Roux29eba8a2015-03-27 14:15:18 +010033 REF_BRANCH=linaro-${VERSION}-branch
Yvan Rouxca4cddd2015-03-18 20:59:10 +010034 ;;
35 esac
36done
37shift $(($OPTIND - 1))
38
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010039REV=$1
Yvan Rouxca4cddd2015-03-18 20:59:10 +010040if [ -z ${DEV_BRANCH+x} ]; then
41 DEV_BRANCH=${REF_BRANCH}
42fi
Yvan Rouxa0a33672014-06-02 15:29:43 +020043
44# Style
45NC='\e[0m'
46red='\e[0;31m'
47blue='\e[1;34m'
48green='\e[0;32m'
Charles Baylisfcaeede2015-02-25 16:12:16 +000049bold='\e[1m'
Yvan Rouxa0a33672014-06-02 15:29:43 +020050lines=`perl -E 'say "-" x 80'`
51
52# ==============================================================================
53# Functions
54# ==============================================================================
55print_step() {
56 echo -e "${blue}${lines}\n${red}** ${1}\n${blue}${lines}${NC}\n"
57}
58
59print_info() {
60 echo -e "${blue}** ${NC}${1}"
61}
62
Yvan Roux76b0cb22015-03-13 13:41:51 +010063die() {
64 echo -e "${red}${bold}ERROR: ${NC}${bold}${1}${NC}"
65 exit 1
66}
67
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010068open_shell() {
69 PROMPT_COMMAND="echo -n -e '${bold}[${red}BackFLiP${NC}${bold}]${NC} '" bash
70}
71
Yvan Rouxa0a33672014-06-02 15:29:43 +020072# arg1 : a sentence
73# arg2 : a variable
74# print arg1 and gather user input in arg2
75ask() {
76 echo -n -e "${blue}** ${NC}${1} ${NC}"
77 eval "read ${2}"
78}
79
80# arg1 : svn rev number
81# arg2 : ChangeLog file
Yvan Rouxca4cddd2015-03-18 20:59:10 +010082# Create ChangeLog entry for arg1 in arg2.arg1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020083forge_entry() {
Yvan Rouxca4cddd2015-03-18 20:59:10 +010084 echo -e $DATE" "$NAME" <"$EMAIL">\n\n\tBackport from trunk r"$1"." >> $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020085 git show --format=oneline ${SHA1} -- $2 \
86 | grep ^+ \
87 | sed -e '1d' -e 's:^+::' \
Yvan Rouxca4cddd2015-03-18 20:59:10 +010088 | awk '$1 ~ /^2.*$/ {print "\t"$0} $1 !~ /^2.*$/ {print $0}' >> $2.$1.frag
Charles Baylisfcaeede2015-02-25 16:12:16 +000089 print_info "${bold}Forged ChangeLog entry:${NC}"
Yvan Rouxca4cddd2015-03-18 20:59:10 +010090 cat $2.$1.frag
Charles Baylis804b3832015-02-25 16:12:41 +000091 ask "${bold}Edit ChangeLog entry [N/y] ?" user_edit
Yvan Rouxa0a33672014-06-02 15:29:43 +020092 if [ "$user_edit" == "y" ]; then
Yvan Rouxca4cddd2015-03-18 20:59:10 +010093 "$EDITOR" $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020094 fi
Yvan Rouxca4cddd2015-03-18 20:59:10 +010095 git add $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020096}
97
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010098# arg1 : backported revision sha1
99compare() {
100 git show $1 > $REV.orig
101 git diff --cached > $REV.linaro
102 print_info "Generated diff files: ${bold}$REV.orig $REV.linaro${NC}"
103 "$CMPTOOL" $REV.orig $REV.linaro
104 ask "${bold}Do you need a Shell [N/y] ?" user_shell
105 if [ "$user_shell" == "y" ]; then
106 open_shell
107 fi
108 rm $REV.orig $REV.linaro
109}
110
Yvan Rouxa0a33672014-06-02 15:29:43 +0200111# ==============================================================================
Yvan Roux5b3527e2015-03-19 11:22:21 +0100112# Checking Configuration
Yvan Roux76b0cb22015-03-13 13:41:51 +0100113# ==============================================================================
Yvan Roux4d4cbf72015-05-29 15:56:59 +0200114if ! git remote -v 2>&1 | grep "ssh.*git.*\.linaro\.org" > /dev/null ; then
Yvan Roux76b0cb22015-03-13 13:41:51 +0100115 die "You're not in the right directory !"
116fi
117if [ ! -e .gitreview ]; then
118 print_info "Gerrit configuration (.gitreview) is missing, creating it."
119 cat <<- EOF > .gitreview
120[gerrit]
121host=review.linaro.org
122port=29418
123project=toolchain/gcc
124EOF
125fi
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100126if ! which $CMPTOOL > /dev/null ; then
127 print_info "Default comparison tool is missing"
128 ask "Enter tool name: " CMPTOOL
129fi
Yvan Roux76b0cb22015-03-13 13:41:51 +0100130
Yvan Rouxe45aa7b2015-03-26 14:54:05 +0100131echo -e "${blue}${lines}"
132print_info "Backport will de done on top of branch: ${bold}$DEV_BRANCH${NC}"
133print_info "Reference branch used for review is: ${bold}$REF_BRANCH${NC}"
134print_info "To change GCC version in a Linaro branch use ${bold}-v${NC}"
135print_info "example: ${bold}backflip -v 4.8${NC}"
136print_info "To change reference branch use ${bold}-r${NC}"
137print_info "example: ${bold}backflip -r master${NC}"
138
Yvan Roux76b0cb22015-03-13 13:41:51 +0100139# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200140print_step "Finding SHA1"
141# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100142SHA1=`git log --format=format:"%H" --grep=trunk@${REV} master`
Charles Baylisfcaeede2015-02-25 16:12:16 +0000143print_info "${NC}SVN rev ${bold}${1}${NC} SHA1: ${bold}${SHA1}${NC}"
Charles Baylis804b3832015-02-25 16:12:41 +0000144ask "${bold}View the commit [N/y] ?" user_view
145if [ "$user_view" == "y" ]; then
Yvan Rouxa0a33672014-06-02 15:29:43 +0200146 git show $SHA1
147fi
148
149# ==============================================================================
150print_step "Cherry-picking Revision"
151# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100152git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200153git cherry-pick -n $SHA1
154
155# ==============================================================================
156print_step "Handling ChangeLogs Conflicts"
157# ==============================================================================
158CHLOGS=`git diff-tree --no-commit-id --name-only -r ${SHA1} | grep ChangeLog`
159for i in $CHLOGS; do
160 print_info "${green}$i"
161 # Revert ChangeLog corruption
162 git reset -q HEAD $i
163 git checkout $i
164 # Create ChangeLog entry
165 forge_entry $1 $i
Yvan Rouxa0a33672014-06-02 15:29:43 +0200166done
167
168# ==============================================================================
169print_step "Status Checking"
170# ==============================================================================
171git status
Charles Baylisfcaeede2015-02-25 16:12:16 +0000172ask "${bold}Open a Shell [N/y] ?" user_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200173if [ "$user_shell" == "y" ]; then
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100174 open_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200175fi
176
177# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100178print_step "Verification"
179# ==============================================================================
180compare $SHA1
181
182# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200183print_step "Branch/Commit/Push/Review"
184# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100185if $STACKED; then
186 bname=${DEV_BRANCH}-${1}
187else
188 bname=${FNAME}-${VERSION}-backport-${1}
189fi
Charles Baylisfcaeede2015-02-25 16:12:16 +0000190ask "${bold}Create backport branch [Y/n] ?" user_bc
Yvan Rouxa0a33672014-06-02 15:29:43 +0200191if [ "$user_bc" != "n" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000192 ask "${bold}Change name (${blue}${bname}${NC}${bold}) [N/y] ?" user_bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200193 if [ "$user_bname" == "y" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000194 ask "${bold}Enter name :" bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200195 fi
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100196 git checkout -b ${bname} ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200197
Charles Baylisfcaeede2015-02-25 16:12:16 +0000198 ask "${bold}Commit backport [Y/n] ?" user_commit
Yvan Rouxa0a33672014-06-02 15:29:43 +0200199 if [ "$user_commit" != "n" ]; then
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100200 if $STACKED; then
201 git commit --amend
202 else
203 git commit
204 fi
Yvan Rouxa0a33672014-06-02 15:29:43 +0200205
Yvan Rouxe45aa7b2015-03-26 14:54:05 +0100206 echo
207 print_info "If you want to stack another backport on top of this one"
208 print_info "you can stop here, and invoke backflip with command:"
209 print_info "${bold}backflip -b ${bname} REV_NUMBER${NC}"
210 print_info "The next steps are only needed for review and validation.\n"
211
Charles Baylisfcaeede2015-02-25 16:12:16 +0000212 ask "${bold}Create patch [Y/n] ?" user_patch
Yvan Rouxa0a33672014-06-02 15:29:43 +0200213 if [ "$user_patch" != "n" ]; then
214 git format-patch -o ../ --suffix=.${bname}.patch -1
215 fi
216
Yvan Roux400cbef2015-05-29 15:59:42 +0200217 ask "${bold}Request review (amend commit) [Y/n] ?" user_review
218 if [ "$user_review" != "n" ]; then
219 git review $REF_BRANCH
220 git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200221 fi
222 fi
223fi
224
225# ==============================================================================
Charles Baylisfcaeede2015-02-25 16:12:16 +0000226ask "${bold}Abort and Cleanup [N/y] ?" user_abort
Yvan Rouxa0a33672014-06-02 15:29:43 +0200227# ==============================================================================
228if [ "$user_abort" == "y" ]; then
229 git reset --hard
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100230 git checkout ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200231 if [ "$user_bc" != "n" ]; then
232 git branch -D ${bname}
233 if [ "$user_push" != "n" ]; then
234 git push origin :${bname}
235 fi
236 fi
237 exit 0
238fi