blob: d1221051b92444c053d85bc2ac15cc7762833580 [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
33 ;;
34 esac
35done
36shift $(($OPTIND - 1))
37
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010038REV=$1
Yvan Rouxca4cddd2015-03-18 20:59:10 +010039if [ -z ${DEV_BRANCH+x} ]; then
40 DEV_BRANCH=${REF_BRANCH}
41fi
Yvan Rouxa0a33672014-06-02 15:29:43 +020042
43# Style
44NC='\e[0m'
45red='\e[0;31m'
46blue='\e[1;34m'
47green='\e[0;32m'
Charles Baylisfcaeede2015-02-25 16:12:16 +000048bold='\e[1m'
Yvan Rouxa0a33672014-06-02 15:29:43 +020049lines=`perl -E 'say "-" x 80'`
50
51# ==============================================================================
52# Functions
53# ==============================================================================
54print_step() {
55 echo -e "${blue}${lines}\n${red}** ${1}\n${blue}${lines}${NC}\n"
56}
57
58print_info() {
59 echo -e "${blue}** ${NC}${1}"
60}
61
Yvan Roux76b0cb22015-03-13 13:41:51 +010062die() {
63 echo -e "${red}${bold}ERROR: ${NC}${bold}${1}${NC}"
64 exit 1
65}
66
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +010067open_shell() {
68 PROMPT_COMMAND="echo -n -e '${bold}[${red}BackFLiP${NC}${bold}]${NC} '" bash
69}
70
Yvan Rouxa0a33672014-06-02 15:29:43 +020071# arg1 : a sentence
72# arg2 : a variable
73# print arg1 and gather user input in arg2
74ask() {
75 echo -n -e "${blue}** ${NC}${1} ${NC}"
76 eval "read ${2}"
77}
78
79# arg1 : svn rev number
80# arg2 : ChangeLog file
Yvan Rouxca4cddd2015-03-18 20:59:10 +010081# Create ChangeLog entry for arg1 in arg2.arg1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020082forge_entry() {
Yvan Rouxca4cddd2015-03-18 20:59:10 +010083 echo -e $DATE" "$NAME" <"$EMAIL">\n\n\tBackport from trunk r"$1"." >> $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020084 git show --format=oneline ${SHA1} -- $2 \
85 | grep ^+ \
86 | sed -e '1d' -e 's:^+::' \
Yvan Rouxca4cddd2015-03-18 20:59:10 +010087 | awk '$1 ~ /^2.*$/ {print "\t"$0} $1 !~ /^2.*$/ {print $0}' >> $2.$1.frag
Charles Baylisfcaeede2015-02-25 16:12:16 +000088 print_info "${bold}Forged ChangeLog entry:${NC}"
Yvan Rouxca4cddd2015-03-18 20:59:10 +010089 cat $2.$1.frag
Charles Baylis804b3832015-02-25 16:12:41 +000090 ask "${bold}Edit ChangeLog entry [N/y] ?" user_edit
Yvan Rouxa0a33672014-06-02 15:29:43 +020091 if [ "$user_edit" == "y" ]; then
Yvan Rouxca4cddd2015-03-18 20:59:10 +010092 "$EDITOR" $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020093 fi
Yvan Rouxca4cddd2015-03-18 20:59:10 +010094 git add $2.$1.frag
Yvan Rouxa0a33672014-06-02 15:29:43 +020095}
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 Rouxc60a7882015-03-19 11:13:36 +0100113if ! 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
130# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200131print_step "Finding SHA1"
132# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100133SHA1=`git log --format=format:"%H" --grep=trunk@${REV} master`
Charles Baylisfcaeede2015-02-25 16:12:16 +0000134print_info "${NC}SVN rev ${bold}${1}${NC} SHA1: ${bold}${SHA1}${NC}"
Charles Baylis804b3832015-02-25 16:12:41 +0000135ask "${bold}View the commit [N/y] ?" user_view
136if [ "$user_view" == "y" ]; then
Yvan Rouxa0a33672014-06-02 15:29:43 +0200137 git show $SHA1
138fi
139
140# ==============================================================================
141print_step "Cherry-picking Revision"
142# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100143git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200144git cherry-pick -n $SHA1
145
146# ==============================================================================
147print_step "Handling ChangeLogs Conflicts"
148# ==============================================================================
149CHLOGS=`git diff-tree --no-commit-id --name-only -r ${SHA1} | grep ChangeLog`
150for i in $CHLOGS; do
151 print_info "${green}$i"
152 # Revert ChangeLog corruption
153 git reset -q HEAD $i
154 git checkout $i
155 # Create ChangeLog entry
156 forge_entry $1 $i
Yvan Rouxa0a33672014-06-02 15:29:43 +0200157done
158
159# ==============================================================================
160print_step "Status Checking"
161# ==============================================================================
162git status
Charles Baylisfcaeede2015-02-25 16:12:16 +0000163ask "${bold}Open a Shell [N/y] ?" user_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200164if [ "$user_shell" == "y" ]; then
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100165 open_shell
Yvan Rouxa0a33672014-06-02 15:29:43 +0200166fi
167
168# ==============================================================================
Yvan Rouxa4c4f5d2015-03-18 21:21:25 +0100169print_step "Verification"
170# ==============================================================================
171compare $SHA1
172
173# ==============================================================================
Yvan Rouxa0a33672014-06-02 15:29:43 +0200174print_step "Branch/Commit/Push/Review"
175# ==============================================================================
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100176if $STACKED; then
177 bname=${DEV_BRANCH}-${1}
178else
179 bname=${FNAME}-${VERSION}-backport-${1}
180fi
Charles Baylisfcaeede2015-02-25 16:12:16 +0000181ask "${bold}Create backport branch [Y/n] ?" user_bc
Yvan Rouxa0a33672014-06-02 15:29:43 +0200182if [ "$user_bc" != "n" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000183 ask "${bold}Change name (${blue}${bname}${NC}${bold}) [N/y] ?" user_bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200184 if [ "$user_bname" == "y" ]; then
Charles Baylisfcaeede2015-02-25 16:12:16 +0000185 ask "${bold}Enter name :" bname
Yvan Rouxa0a33672014-06-02 15:29:43 +0200186 fi
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100187 git checkout -b ${bname} ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200188
Charles Baylisfcaeede2015-02-25 16:12:16 +0000189 ask "${bold}Commit backport [Y/n] ?" user_commit
Yvan Rouxa0a33672014-06-02 15:29:43 +0200190 if [ "$user_commit" != "n" ]; then
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100191 if $STACKED; then
192 git commit --amend
193 else
194 git commit
195 fi
Yvan Rouxa0a33672014-06-02 15:29:43 +0200196
Charles Baylisfcaeede2015-02-25 16:12:16 +0000197 ask "${bold}Create patch [Y/n] ?" user_patch
Yvan Rouxa0a33672014-06-02 15:29:43 +0200198 if [ "$user_patch" != "n" ]; then
199 git format-patch -o ../ --suffix=.${bname}.patch -1
200 fi
201
Charles Baylisfcaeede2015-02-25 16:12:16 +0000202 ask "${bold}Push ${bname} branch [Y/n] ?" user_push
Yvan Rouxa0a33672014-06-02 15:29:43 +0200203 if [ "$user_push" != "n" ]; then
204 git push origin ${bname}:${bname}
205
Charles Baylisfcaeede2015-02-25 16:12:16 +0000206 ask "${bold}Request review (amend commit) [Y/n] ?" user_review
Yvan Rouxa0a33672014-06-02 15:29:43 +0200207 if [ "$user_review" != "n" ]; then
208 git commit --amend
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100209 git review $REF_BRANCH
210 git checkout $DEV_BRANCH
Yvan Rouxa0a33672014-06-02 15:29:43 +0200211 fi
212 fi
213 fi
214fi
215
216# ==============================================================================
Charles Baylisfcaeede2015-02-25 16:12:16 +0000217ask "${bold}Abort and Cleanup [N/y] ?" user_abort
Yvan Rouxa0a33672014-06-02 15:29:43 +0200218# ==============================================================================
219if [ "$user_abort" == "y" ]; then
220 git reset --hard
Yvan Rouxca4cddd2015-03-18 20:59:10 +0100221 git checkout ${DEV_BRANCH}
Yvan Rouxa0a33672014-06-02 15:29:43 +0200222 if [ "$user_bc" != "n" ]; then
223 git branch -D ${bname}
224 if [ "$user_push" != "n" ]; then
225 git push origin :${bname}
226 fi
227 fi
228 exit 0
229fi