Skip to content

Commit 1513be0

Browse files
authored
Merge pull request #8 from valicm/5-read-composer-updates-to-catch-failures
Read composer failures and extract main highlights for TODO
2 parents 0e6fe35 + 5f95989 commit 1513be0

File tree

1 file changed

+80
-19
lines changed

1 file changed

+80
-19
lines changed

drupal-update.sh

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414

1515
set -e
1616

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+
1724
# Function to display script usage.
1825
usage() {
1926
echo "Usage: $0 [OPTIONS]"
@@ -62,7 +69,7 @@ validate_requirements() {
6269
exit 1
6370
fi
6471

65-
BINARIES="php composer sed jq";
72+
local BINARIES="php composer sed grep jq";
6673
for BINARY in $BINARIES
6774
do
6875
if ! [ -x "$(command -v "$BINARY")" ]; then
@@ -80,19 +87,50 @@ update_project() {
8087
CURRENT_VERSION=$2
8188
LATEST_VERSION=$3
8289
UPDATE_STATUS=$4
90+
PATCH_LIST=$5
91+
local COMPOSER_OUTPUT=
8392
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)
8594
else
86-
composer update "$PROJECT_NAME" -W -q --ignore-platform-reqs
95+
COMPOSER_OUTPUT=$(composer update "$PROJECT_NAME" -W -q -n --ignore-platform-reqs)
8796
fi
8897

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
96134
}
97135

98136
# Set default values.
@@ -152,8 +190,10 @@ fi
152190
# Get full composer content for later usage.
153191
COMPOSER_CONTENTS=$(< composer.json);
154192

193+
SUMMARY_INSTRUCTIONS="### Automated Drupal update summary\n"
194+
155195
# 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"
157197
SUMMARY_OUTPUT_TABLE+="| ------ | ------ | ------ | ------ | ------ | ------ |\n"
158198
# Read composer output. Remove whitespaces - jq 1.5 can break while parsing.
159199
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
170210
ABANDONED=$(echo "${UPDATE}" | jq '."abandoned"' | sed "s/\"//g")
171211
PATCHES=$(echo "$COMPOSER_CONTENTS" | jq '.extra.patches."'"$PROJECT_NAME"'" | length')
172212

213+
PATCH_LIST=
214+
if [ "$PATCHES" -gt 0 ]; then
215+
PATCH_LIST=$(echo "$COMPOSER_CONTENTS" | jq '.extra.patches."'"$PROJECT_NAME"'"')
216+
fi
217+
173218
PROJECT_RELEASE_URL=$PROJECT_URL
174219
if [[ $LATEST_VERSION != dev-* ]]; then
175220
PROJECT_RELEASE_URL=$PROJECT_URL"/releases/"$LATEST_VERSION
176221
fi
177222

178-
RESULT="skipped"
223+
RESULT=$RESULT_SKIP
179224

180225
# Go through excluded packages and skip them.
181226
if [ -n "$UPDATE_EXCLUDE" ]; then
182227
for EXCLUDE in $UPDATE_EXCLUDE
183228
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"
185231
continue
186232
fi
187233
done
@@ -191,40 +237,55 @@ for UPDATE in $(echo "${UPDATES}" | jq -c '.locked[]'); do
191237
# Still write latest version for summary table.
192238
if [ "$UPDATE_CORE" == false ]; then
193239
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"
195242
continue
196243
fi
197244
fi
198245

199246
if [ "$UPDATE_TYPE" == 'major' ]; then
200247
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")
202249
else
203250
if [ "$UPDATE_STATUS" == "$UPDATE_TYPE" ]; then
204251
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"
206255
fi
207256
fi
208257

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+
209268
SUMMARY_OUTPUT_TABLE+="| [${PROJECT_NAME}](${PROJECT_URL}) | ${CURRENT_VERSION} | [${LATEST_VERSION}]($PROJECT_RELEASE_URL) | $RESULT | $PATCHES | $ABANDONED |\n"
210269
done
211270

271+
SUMMARY_INSTRUCTIONS+="\n$SUMMARY_OUTPUT_TABLE"
272+
212273
# For GitHub actions use GitHub step summary and environment variable DRUPAL_UPDATES_TABLE.
213274
if [ "$GITHUB_RUNNING_ACTION" == true ]; then
214-
echo -e "$SUMMARY_OUTPUT_TABLE" >> "$GITHUB_STEP_SUMMARY"
275+
echo -e "$SUMMARY_INSTRUCTIONS" >> "$GITHUB_STEP_SUMMARY"
215276
{
216277
echo 'DRUPAL_UPDATES_TABLE<<EOF'
217278
cat "$GITHUB_STEP_SUMMARY"
218279
echo 'EOF'
219280
} >>"$GITHUB_ENV"
220281
else
221-
echo -e "$SUMMARY_OUTPUT_TABLE"
282+
echo -e "$SUMMARY_INSTRUCTIONS"
222283
fi
223284

224285
# If we have summary file.
225286
if [ -n "$SUMMARY_FILE" ]; then
226287
if [ ! -f "$SUMMARY_FILE" ]; then
227288
touch "$SUMMARY_FILE"
228289
fi
229-
echo -e "$SUMMARY_OUTPUT_TABLE" > "$SUMMARY_FILE"
290+
echo -e "$SUMMARY_INSTRUCTIONS" > "$SUMMARY_FILE"
230291
fi

0 commit comments

Comments
 (0)