summaryrefslogtreecommitdiff
path: root/scripts/create-pull-request
blob: b911a64f33ef81c44409fab46c60f39a12741904 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash
ODIR=pull-$$
RELATIVE_TO="master"
COMMIT_ID="HEAD"
PULL_URL="git://git.openembedded.org/openembedded-core-contrib"
WEB_URL_PREFIX="http://git.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h="
PREFIX="PATCH"

usage() {
CMD=$(basename $0)
cat <<EOM
Usage: $CMD [-h] [-o output_dir] [-m msg_body_file] [-s subject] [-r relative_to] [-i commit_id] -b contrib_branch
  -b contrib_branch   Branch-name in the $PULL_URL
  -h                  Display this help message
  -i commit_id        Ending commit (default: HEAD)
  -m msg_body_file    The file containing a blurb to be inserted into the summary email
  -o output_dir       Specify the output directory for the messages (default: pull-PID)
  -p prefix           Use [prefix N/M] instead of [PATCH N/M] as the subject prefix
  -r relative_to      Starting commit (default: master)
  -s subject          The subject to be inserted into the summary email

 Examples:
   $CMD -b nitin/basic
   $CMD -r distro/master -i nitin/distro -b nitin/distro
   $CMD -r master -i misc -b nitin/misc -o pull-misc
   $CMD -p "RFC PATCH" -b nitin/experimental
EOM
}

# Parse and validate arguments
while getopts "b:hi:m:o:p:r:s:" OPT; do
	case $OPT in
	b)
		CONTRIB_BRANCH="$OPTARG"
		;;
	h)
		usage
		exit 0
		;;
	i)
		COMMIT_ID="$OPTARG"
		;;
	m)
		BODY="$OPTARG"
		if [ ! -e "$BODY" ]; then
			echo "ERROR: Body file does not exist"
			exit 1
		fi
		;;
	o)
		ODIR="$OPTARG"
		;;
	p)
		PREFIX="$OPTARG"
		;;
	r)
		RELATIVE_TO="$OPTARG"
		;;
	s)
		SUBJECT="$OPTARG"
		;;
	esac
done

if [ -z "$CONTRIB_BRANCH" ]; then
	usage
	exit 1
fi


# Perform a sanity test on the web URL. Issue a warning if it is not
# accessible, but do not abort as users may want to run offline.
WEB_URL="$WEB_URL_PREFIX$CONTRIB_BRANCH"
wget -q $WEB_URL -O /dev/null
if [ $? -ne 0 ]; then
	echo "WARNING: Branch '$CONTRIB_BRANCH' was not found on the contrib git tree."
	echo "         Please check your contrib-branch parameter before sending."
	echo ""
fi

if [ -e $ODIR ]; then
	echo "ERROR: output directory $ODIR exists."
	exit 1
fi
mkdir $ODIR


# Generate the patches and cover letter
git format-patch -M --subject-prefix="$PREFIX" -n -o $ODIR --thread=shallow --cover-letter $RELATIVE_TO..$COMMIT_ID > /dev/null


# Customize the cover letter
CL="$ODIR/0000-cover-letter.patch"
(cat <<EOM

Pull URL: $PULL_URL
  Branch: $CONTRIB_BRANCH
  Browse: $WEB_URL

Thanks,
    $(git config user.name) <$(git config user.email)>
---

EOM
) | sed -i "/BLURB HERE/ r /dev/stdin" "$CL"

# If the user specified a message body, insert it into the cover letter and
# remove the BLURB token.
if [ -n "$BODY" ]; then
	sed -i "/BLURB HERE/ r $BODY" "$CL"
	sed -i "/BLURB HERE/ d" "$CL"
fi

# If the user specified a subject, replace the SUBJECT token with it.
if [ -n "$SUBJECT" ]; then
	sed -i -e "s/\*\*\* SUBJECT HERE \*\*\*/$SUBJECT/" "$CL"
fi


# Generate report for user
cat <<EOM
The following patches have been prepared:
$(for PATCH in $(ls $ODIR/*); do echo "    $PATCH"; done)

Review their content, especially the summary mail:
    $CL

When you are satisfied, you can send them with:
    send-pull-request -a -p $ODIR
EOM