blob: 6b44c4d688ce4256c18303fc73c4bbfc46352f06 [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# ==============================================================================
Christophe Lyon045b0c12015-06-15 19:18:50 +020012VERSION=5
13REF_BRANCH=linaro-local/gcc-${VERSION}-integration-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
Christophe Lyon045b0c12015-06-15 19:18:50 +020033 REF_BRANCH=linaro-local/gcc-${VERSION}-integration-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
95}
96
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010097# arg1 : backported revision sha1
98compare() {
99 git show $1 > $REV.orig
100 git diff --cached > $REV.linaro
101 print_info "Generated diff files: ${bold}$REV.orig $REV.linaro${NC}"
102 "$CMPTOOL" $REV.orig $REV.linaro
103 ask "${bold}Do you need a Shell [N/y] ?" user_shell
104 if [ "$user_shell" == "y" ]; then
105 open_shell
106 fi
107 rm $REV.orig $REV.linaro
108}
109
Yvan Rouxa0a33672014-06-02 15:29:43 +0200110# ==============================================================================
Yvan Roux5b3527e2015-03-19 11:22:21 +0100111# Checking Configuration
Yvan Roux76b0cb22015-03-13 13:41:51 +0100112# ==============================================================================
Yvan Roux4d4cbf72015-05-29 15:56:59 +0200113if ! git remote -v 2>&1 | grep "ssh.*git.*\.linaro\.org" > /dev/null ; then
Yvan Roux76b0cb22015-03-13 13:41:51 +0100114 die "You're not in the right directory !"
115fi
116if [ ! -e .gitreview ]; then
117 print_info "Gerrit configuration (.gitreview) is missing, creating it."
118 cat <<- EOF > .gitreview
119[gerrit]
120host=review.linaro.org
121port=29418
122project=toolchain/gcc
123EOF
124fi
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100125if ! which $CMPTOOL > /dev/null ; then
126 print_info "Default comparison tool is missing"
127 ask "Enter tool name: " CMPTOOL
128fi
Yvan Roux76b0cb22015-03-13 13:41:51 +0100129
Yvan Rouxe45aa7b2015-03-26 14:54:05 +0100130echo -e "${blue}${lines}"
131print_info "Backport will de done on top of branch: ${bold}$DEV_BRANCH${NC}"
132print_info "Reference branch used for review is: ${bold}$REF_BRANCH${NC}"
133print_info "To change GCC version in a Linaro branch use ${bold}-v${NC}"
134print_info "example: ${bold}backflip -v 4.8${NC}"
135print_info "To change reference branch use ${bold}-r${NC}"
136print_info "example: ${bold}backflip -r master${NC}"
137
Yvan Roux76b0cb22015-03-13 13:41:51 +0100138# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200139print_step "Finding SHA1"
140# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100141SHA1=`git log --format=format:"%H" --grep=trunk@${REV} master`
Charles Baylisfcaeede2015-02-25 16:12:16 +0000142print_info "${NC}SVN rev ${bold}${1}${NC} SHA1: ${bold}${SHA1}${NC}"
Charles Baylis804b3832015-02-25 16:12:41 +0000143ask "${bold}View the commit [N/y] ?" user_view
144if [ "$user_view" == "y" ]; then
Yvan Rouxa0a33672014-06-02 15:29:43 +0200145 git show $SHA1
146fi
147
148# ==============================================================================
149print_step "Cherry-picking Revision"
150# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100151git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200152git cherry-pick -n $SHA1
153
154# ==============================================================================
155print_step "Handling ChangeLogs Conflicts"
156# ==============================================================================
157CHLOGS=`git diff-tree --no-commit-id --name-only -r ${SHA1} | grep ChangeLog`
158for i in $CHLOGS; do
159 print_info "${green}$i"
160 # Revert ChangeLog corruption
161 git reset -q HEAD $i
162 git checkout $i
163 # Create ChangeLog entry
164 forge_entry $1 $i
Yvan Rouxa0a33672014-06-02 15:29:43 +0200165done
166
167# ==============================================================================
168print_step "Status Checking"
169# ==============================================================================
170git status
Charles Baylisfcaeede2015-02-25 16:12:16 +0000171ask "${bold}Open a Shell [N/y] ?" user_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200172if [ "$user_shell" == "y" ]; then
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100173 open_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200174fi
175
176# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100177print_step "Verification"
178# ==============================================================================
179compare $SHA1
180
181# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200182print_step "Branch/Commit/Push/Review"
183# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100184if $STACKED; then
185 bname=${DEV_BRANCH}-${1}
186else
187 bname=${FNAME}-${VERSION}-backport-${1}
188fi
Charles Baylisfcaeede2015-02-25 16:12:16 +0000189ask "${bold}Create backport branch [Y/n] ?" user_bc
Yvan Rouxa0a33672014-06-02 15:29:43 +0200190if [ "$user_bc" != "n" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000191 ask "${bold}Change name (${blue}${bname}${NC}${bold}) [N/y] ?" user_bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200192 if [ "$user_bname" == "y" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000193 ask "${bold}Enter name :" bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200194 fi
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100195 git checkout -b ${bname} ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200196
Charles Baylisfcaeede2015-02-25 16:12:16 +0000197 ask "${bold}Commit backport [Y/n] ?" user_commit
Yvan Rouxa0a33672014-06-02 15:29:43 +0200198 if [ "$user_commit" != "n" ]; then
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100199 if $STACKED; then
200 git commit --amend
201 else
202 git commit
203 fi
Yvan Rouxa0a33672014-06-02 15:29:43 +0200204
Yvan Rouxe45aa7b2015-03-26 14:54:05 +0100205 echo
206 print_info "If you want to stack another backport on top of this one"
207 print_info "you can stop here, and invoke backflip with command:"
208 print_info "${bold}backflip -b ${bname} REV_NUMBER${NC}"
209 print_info "The next steps are only needed for review and validation.\n"
210
Charles Baylisfcaeede2015-02-25 16:12:16 +0000211 ask "${bold}Create patch [Y/n] ?" user_patch
Yvan Rouxa0a33672014-06-02 15:29:43 +0200212 if [ "$user_patch" != "n" ]; then
213 git format-patch -o ../ --suffix=.${bname}.patch -1
214 fi
215
Yvan Roux400cbef2015-05-29 15:59:42 +0200216 ask "${bold}Request review (amend commit) [Y/n] ?" user_review
217 if [ "$user_review" != "n" ]; then
218 git review $REF_BRANCH
219 git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200220 fi
221 fi
222fi
223
224# ==============================================================================
Charles Baylisfcaeede2015-02-25 16:12:16 +0000225ask "${bold}Abort and Cleanup [N/y] ?" user_abort
Yvan Rouxa0a33672014-06-02 15:29:43 +0200226# ==============================================================================
227if [ "$user_abort" == "y" ]; then
228 git reset --hard
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100229 git checkout ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200230 if [ "$user_bc" != "n" ]; then
231 git branch -D ${bname}
232 if [ "$user_push" != "n" ]; then
233 git push origin :${bname}
234 fi
235 fi
236 exit 0
237fi