-
Notifications
You must be signed in to change notification settings - Fork 0
/
merge_subPR
executable file
·198 lines (182 loc) · 6.17 KB
/
merge_subPR
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#!/bin/bash
#
# merge_subPR
# ===========
#
# Small script to merge an open pull request from the submodule.
#
# Pre-Requisite: have github cli installed (https://cli.github.com/)
#
# This script is intended as counterpart to the request script.
# Once the opened pull request in the source has been merged back,
# this script is meant to be used to close the accompanying PR that
# was created for this change.
# After the PR in the submodule has been closed, update the repository
# to the main branch there.
# Then run merge_subPR in the super directory while on the branch of
# the pull request.
#
# *************************************************************************** #
#
# Copyright (c) 2024 Harald Klimach <[email protected]>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHORS “AS IS” AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL UNIVERSITY OF SIEGEN OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# **************************************************************************** #
if ! gh --version &>/dev/null; then
echo ""
echo "Need to install github cli (https://cli.github.com/) to close"
echo "Pull Requests!"
echo ""
exit 1
fi
superdir=$(git rev-parse --show-toplevel)
superbranch=$(git branch --show-current)
remote=$(cd $superdir && git remote get-url origin 2>/dev/null)
repogit=$(basename $remote 2>/dev/null)
repo=${repogit%.git}
sub=""
case "$repo" in
"ateles")
sub="atl"
;;
"musubi")
sub="mus"
;;
"seeder")
sub="sdr"
;;
"treelm")
sub="tem"
;;
*)
echo "Unknown repository $repo!"
echo "merge_subPR only works for ateles, musubi, seeder or treelm."
exit 1
;;
esac
echo "Working on branch $superbranch in $superdir"
if [ "$superbranch" = "main" ]; then
echo "Can't close any PR on main branch!"
exit 1
fi
PRnum=$(gh pr status --json number,headRefName --jq '.currentBranch.number')
if [ -z "$PRnum" ]; then
echo "ERROR: There doesn't seem to be a PR for the current branch!"
exit 1
fi
subdir=$superdir/$sub
owd=$(pwd)
stashed=1
if [ -d $subdir ]; then
cd $subdir
subbranch=$(git branch --show-current)
echo "Checking for merged PR of $superbranch in $sub..."
subPRnum=$(gh pr list -s merged --json number,headRefName --jq ".[] | select(.headRefName == \"$superbranch\") | .number")
subPRmerge=$(gh pr list -s merged --json number,headRefName,mergeCommit --jq ".[] | select(.headRefName == \"$superbranch\") | .mergeCommit.oid")
if [ -z "subPRnum" ]; then
echo "ERROR: did not find a merged pull-request in $sub for branch $subbranch!"
echo " The submodule PR needs to be merged back into main before"
echo " closing the PR here!"
cd $owd
exit 1
fi
echo "Found the corresponding PR in submodule with number: #$subPRnum"
if [ "$subbranch" != "main" ]; then
submsg=$(git show --pretty=format:%s -s HEAD)
echo ""
echo "The $sub subdirectory has to be on the main branch!"
echo "But I found:"
echo "$subbranch in $subdir"
echo "@: $submsg"
echo ""
echo "Can not close the merge request in this state."
echo ""
if [ $subbranch = $superbranch && ! git diff --quiet ]; then
git checkout main
git pull
git checkout $subPRmerge
else
echo "We can try to heal this by switching to the main branch now"
echo "and checkout the merge commit $subPRmerge."
echo "(This will also stash working directory changes)"
echo ""
echo "Do you want to proceed and do so now (y/n)? "
read proceed
if [ "$proceed" != "${proceed#[Yy]}" ]; then
git diff --quiet || stashed=$(git stash)
git stash 2>/dev/null
git checkout main
git pull
git checkout $subPRmerge
echo ""
else
echo ""
echo "Not changing the submodule. Bye."
echo ""
cd $owd
exit 1
fi
fi
fi
submsg=$(git show --pretty=format:%s -s HEAD)
cd $superdir
PRtitle=$(gh pr status --json title --jq '.currentBranch.title')
echo "This is going to close PR #$PRnum:"
echo ""
gh pr view
echo ""
echo "Do you want to proceed (y/n)? "
read proceed
echo ""
if [ "$proceed" != "${proceed#[Yy]}" ]; then
git submodule set-branch --default $sub
git diff --quiet || git add $sub .gitmodules
git diff --cached --quiet || git commit -m "$submsg"
git push && gh pr ready
gh pr merge --auto -s -t "$PRtitle (#$PRnum)"
git checkout --recurse-submodules main
echo ""
echo "Now on main branch, remember to pull the merge"
echo "once it succeeded in github!"
echo ""
else
echo ""
echo "Nothing done. Bye."
echo ""
fi
if [ "$subbranch" != "main" ]; then
cd $subdir
if [ "$subbranch" != "$superbranch" ]; then
# Only checkout the subbranch again if it wasn't the merged branch.
git checkout $subbranch
fi
if $stashed; then
git stash pop
fi
fi
else
echo "merge_subPR only works in the repository that contains"
echo "the $sub subdirectory."
exit 1
fi
cd $owd