14
14
15
15
set -e
16
16
17
+ RESULT_SUCCESS=" success"
18
+ RESULT_PATCH_FAILURE=" patch failure"
19
+ RESULT_GENERIC_ERROR=" generic error"
20
+ RESULT_DEPENDENCY_ERROR=" failed dependency"
21
+ RESULT_UNKNOWN=" unknown"
22
+ RESULT_SKIP=" skipped"
23
+
17
24
# Function to display script usage.
18
25
usage () {
19
26
echo " Usage: $0 [OPTIONS]"
@@ -62,7 +69,7 @@ validate_requirements() {
62
69
exit 1
63
70
fi
64
71
65
- BINARIES=" php composer sed jq" ;
72
+ local BINARIES=" php composer sed grep jq" ;
66
73
for BINARY in $BINARIES
67
74
do
68
75
if ! [ -x " $( command -v " $BINARY " ) " ]; then
@@ -80,19 +87,50 @@ update_project() {
80
87
CURRENT_VERSION=$2
81
88
LATEST_VERSION=$3
82
89
UPDATE_STATUS=$4
90
+ PATCH_LIST=$5
91
+ local COMPOSER_OUTPUT=
83
92
if [ " $UPDATE_STATUS " == " update-possible" ]; then
84
- composer require " $PROJECT_NAME " :" $LATEST_VERSION " -W -q -- ignore-platform-reqs
93
+ COMPOSER_OUTPUT= $( composer require " $PROJECT_NAME " :" $LATEST_VERSION " -W -q -n -- ignore-platform-reqs)
85
94
else
86
- composer update " $PROJECT_NAME " -W -q -- ignore-platform-reqs
95
+ COMPOSER_OUTPUT= $( composer update " $PROJECT_NAME " -W -q -n -- ignore-platform-reqs)
87
96
fi
88
97
89
- if [[ $LATEST_VERSION == dev-* ]]; then
90
- echo success
91
- elif grep -q " $LATEST_VERSION " composer.lock; then
92
- echo success
93
- else
94
- echo failed
95
- fi
98
+ local EXIT_CODE=$? ;
99
+
100
+ case " $EXIT_CODE " in
101
+ 0)
102
+ echo $RESULT_SUCCESS
103
+ ;;
104
+ 1)
105
+ # Do sanity check before comparing patches.
106
+ if [[ $LATEST_VERSION == dev-* ]]; then
107
+ RESULT=$RESULT_SUCCESS
108
+ elif grep -q " $LATEST_VERSION " composer.lock; then
109
+ RESULT=$RESULT_SUCCESS
110
+ else
111
+ RESULT=$RESULT_GENERIC_ERROR
112
+ fi
113
+
114
+ # Compare list of patches. We need to compare them, because if previous
115
+ # one failed, composer install is going to throw error.
116
+ if [ -n " $PATCH_LIST " ]; then
117
+ local PATCH=
118
+ for PATCH in $( echo " ${PATCH_LIST} " | jq -c ' .[]' ) ; do
119
+ if [ " $( grep -s -c -ic " $PATCH " " $COMPOSER_OUTPUT " ) " != 0 ]; then
120
+ RESULT=" $PATCH "
121
+ else
122
+ continue
123
+ fi
124
+ done
125
+ fi
126
+ echo " $RESULT "
127
+ ;;
128
+ 2)
129
+ echo " $RESULT_DEPENDENCY_ERROR "
130
+ ;;
131
+ * )
132
+ echo " $RESULT_UNKNOWN "
133
+ esac
96
134
}
97
135
98
136
# Set default values.
152
190
# Get full composer content for later usage.
153
191
COMPOSER_CONTENTS=$( < composer.json) ;
154
192
193
+ SUMMARY_INSTRUCTIONS=" ### Automated Drupal update summary\n"
194
+
155
195
# Define variable for writing summary table.
156
- SUMMARY_OUTPUT_TABLE=" | Project name | Old version | Proposed version | Update status | Patch review | Abandoned |\n"
196
+ SUMMARY_OUTPUT_TABLE=" | Project name | Old version | Proposed version | Status | Patches | Abandoned |\n"
157
197
SUMMARY_OUTPUT_TABLE+=" | ------ | ------ | ------ | ------ | ------ | ------ |\n"
158
198
# Read composer output. Remove whitespaces - jq 1.5 can break while parsing.
159
199
UPDATES=$( composer outdated " drupal/*" -f json -D --locked --ignore-platform-reqs | sed -r ' s/\s+//g' ) ;
@@ -170,18 +210,24 @@ for UPDATE in $(echo "${UPDATES}" | jq -c '.locked[]'); do
170
210
ABANDONED=$( echo " ${UPDATE} " | jq ' ."abandoned"' | sed " s/\" //g" )
171
211
PATCHES=$( echo " $COMPOSER_CONTENTS " | jq ' .extra.patches."' " $PROJECT_NAME " ' " | length' )
172
212
213
+ PATCH_LIST=
214
+ if [ " $PATCHES " -gt 0 ]; then
215
+ PATCH_LIST=$( echo " $COMPOSER_CONTENTS " | jq ' .extra.patches."' " $PROJECT_NAME " ' "' )
216
+ fi
217
+
173
218
PROJECT_RELEASE_URL=$PROJECT_URL
174
219
if [[ $LATEST_VERSION != dev-* ]]; then
175
220
PROJECT_RELEASE_URL=$PROJECT_URL " /releases/" $LATEST_VERSION
176
221
fi
177
222
178
- RESULT=" skipped "
223
+ RESULT=$RESULT_SKIP
179
224
180
225
# Go through excluded packages and skip them.
181
226
if [ -n " $UPDATE_EXCLUDE " ]; then
182
227
for EXCLUDE in $UPDATE_EXCLUDE
183
228
do
184
- if [ " $PROJECT_NAME " = " drupal/$EXCLUDE " ]; then
229
+ if [ " $PROJECT_NAME " == " drupal/$EXCLUDE " ]; then
230
+ SUMMARY_OUTPUT_TABLE+=" | [${PROJECT_NAME} ](${PROJECT_URL} ) | ${CURRENT_VERSION} | [${LATEST_VERSION} ]($PROJECT_RELEASE_URL ) | $RESULT | $PATCHES | $ABANDONED |\n"
185
231
continue
186
232
fi
187
233
done
@@ -191,40 +237,55 @@ for UPDATE in $(echo "${UPDATES}" | jq -c '.locked[]'); do
191
237
# Still write latest version for summary table.
192
238
if [ " $UPDATE_CORE " == false ]; then
193
239
if [[ " $PROJECT_NAME " =~ drupal/core-* ]] || [ " $PROJECT_NAME " = " drupal/core" ]; then
194
- SUMMARY_OUTPUT_TABLE+=" | [${PROJECT_NAME} ](${PROJECT_URL} ) | ${CURRENT_VERSION} | [${LATEST_VERSION} ]($PROJECT_RELEASE_URL ) | skipped | $PATCHES | $ABANDONED |\n"
240
+ echo " Skipping upgrades for $PROJECT_NAME "
241
+ SUMMARY_OUTPUT_TABLE+=" | [${PROJECT_NAME} ](${PROJECT_URL} ) | ${CURRENT_VERSION} | [${LATEST_VERSION} ]($PROJECT_RELEASE_URL ) | $RESULT | $PATCHES | $ABANDONED |\n"
195
242
continue
196
243
fi
197
244
fi
198
245
199
246
if [ " $UPDATE_TYPE " == ' major' ]; then
200
247
echo " Update $PROJECT_NAME from $CURRENT_VERSION to $LATEST_VERSION "
201
- RESULT=$( update_project " $PROJECT_NAME " " $CURRENT_VERSION " " $LATEST_VERSION " " $UPDATE_STATUS " )
248
+ RESULT=$( update_project " $PROJECT_NAME " " $CURRENT_VERSION " " $LATEST_VERSION " " $UPDATE_STATUS " , " $PATCH_LIST " )
202
249
else
203
250
if [ " $UPDATE_STATUS " == " $UPDATE_TYPE " ]; then
204
251
echo " Update $PROJECT_NAME from $CURRENT_VERSION to $LATEST_VERSION "
205
- RESULT=$( update_project " $PROJECT_NAME " " $CURRENT_VERSION " " $LATEST_VERSION " " $UPDATE_STATUS " )
252
+ RESULT=$( update_project " $PROJECT_NAME " " $CURRENT_VERSION " " $LATEST_VERSION " " $UPDATE_STATUS " , " $PATCH_LIST " )
253
+ else
254
+ echo " Skipping upgrades for $PROJECT_NAME "
206
255
fi
207
256
fi
208
257
258
+ # Write specific cases in highlights summary report.
259
+ if [ ${# RESULT} -gt 20 ]; then
260
+ SUMMARY_INSTRUCTIONS+=" - **$PROJECT_NAME ** had failure during applying of patch: *$RESULT *.\n"
261
+ RESULT=$RESULT_PATCH_FAILURE
262
+ fi
263
+
264
+ if [ " $RESULT " == " $RESULT_DEPENDENCY_ERROR " ]; then
265
+ SUMMARY_INSTRUCTIONS+=" - **$PROJECT_NAME ** had unresolved dependency.\n"
266
+ fi
267
+
209
268
SUMMARY_OUTPUT_TABLE+=" | [${PROJECT_NAME} ](${PROJECT_URL} ) | ${CURRENT_VERSION} | [${LATEST_VERSION} ]($PROJECT_RELEASE_URL ) | $RESULT | $PATCHES | $ABANDONED |\n"
210
269
done
211
270
271
+ SUMMARY_INSTRUCTIONS+=" \n$SUMMARY_OUTPUT_TABLE "
272
+
212
273
# For GitHub actions use GitHub step summary and environment variable DRUPAL_UPDATES_TABLE.
213
274
if [ " $GITHUB_RUNNING_ACTION " == true ]; then
214
- echo -e " $SUMMARY_OUTPUT_TABLE " >> " $GITHUB_STEP_SUMMARY "
275
+ echo -e " $SUMMARY_INSTRUCTIONS " >> " $GITHUB_STEP_SUMMARY "
215
276
{
216
277
echo ' DRUPAL_UPDATES_TABLE<<EOF'
217
278
cat " $GITHUB_STEP_SUMMARY "
218
279
echo ' EOF'
219
280
} >> " $GITHUB_ENV "
220
281
else
221
- echo -e " $SUMMARY_OUTPUT_TABLE "
282
+ echo -e " $SUMMARY_INSTRUCTIONS "
222
283
fi
223
284
224
285
# If we have summary file.
225
286
if [ -n " $SUMMARY_FILE " ]; then
226
287
if [ ! -f " $SUMMARY_FILE " ]; then
227
288
touch " $SUMMARY_FILE "
228
289
fi
229
- echo -e " $SUMMARY_OUTPUT_TABLE " > " $SUMMARY_FILE "
290
+ echo -e " $SUMMARY_INSTRUCTIONS " > " $SUMMARY_FILE "
230
291
fi
0 commit comments