Skip to content

Commit 72e8cc2

Browse files
committed
CI: add weekly formula update check workflow
1 parent e44e143 commit 72e8cc2

1 file changed

Lines changed: 160 additions & 0 deletions

File tree

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
name: Check for formula updates
2+
3+
on:
4+
schedule:
5+
- cron: '0 6 * * 1'
6+
workflow_dispatch:
7+
8+
env:
9+
HOMEBREW_DEVELOPER: 1
10+
HOMEBREW_GITHUB_ACTIONS: 1
11+
HOMEBREW_NO_AUTO_UPDATE: 1
12+
13+
concurrency:
14+
group: "update-formulas"
15+
cancel-in-progress: true
16+
17+
permissions:
18+
contents: read
19+
20+
jobs:
21+
check-and-bump:
22+
if: github.repository == 'maxim-belkin/homebrew-xorg'
23+
runs-on: ubuntu-22.04
24+
container:
25+
image: ghcr.io/homebrew/ubuntu22.04:master
26+
env:
27+
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.BUMP_GITHUB_TOKEN }}
28+
GITHUB_TOKEN: ${{ secrets.BUMP_GITHUB_TOKEN }}
29+
GH_TOKEN: ${{ secrets.BUMP_GITHUB_TOKEN }}
30+
steps:
31+
- name: Set up Homebrew
32+
uses: Homebrew/actions/setup-homebrew@master
33+
34+
- name: Set up git
35+
uses: Homebrew/actions/git-user-config@master
36+
37+
- name: Run livecheck
38+
id: livecheck
39+
run: |
40+
brew livecheck --tap maxim-belkin/xorg --json --quiet \
41+
> livecheck.json 2>livecheck_stderr.txt || true
42+
OUTDATED_COUNT=$(jq '[.[] | select(.version.outdated == true)] | length' livecheck.json)
43+
TOTAL_COUNT=$(jq 'length' livecheck.json)
44+
echo "outdated_count=$OUTDATED_COUNT" >> "$GITHUB_OUTPUT"
45+
echo "total_count=$TOTAL_COUNT" >> "$GITHUB_OUTPUT"
46+
echo "Checked $TOTAL_COUNT formulas, $OUTDATED_COUNT outdated."
47+
48+
- name: Bump outdated formulas
49+
id: bump
50+
if: steps.livecheck.outputs.outdated_count != '0'
51+
run: |
52+
set -uo pipefail
53+
54+
OUTDATED=$(jq -r '.[] | select(.version.outdated == true) | .formula' livecheck.json)
55+
CREATED_PRS=""
56+
FAILED=""
57+
SKIPPED=""
58+
59+
for FORMULA in $OUTDATED; do
60+
SHORT_NAME="${FORMULA##*/}"
61+
CURRENT_VER=$(jq -r --arg f "$FORMULA" '.[] | select(.formula == $f) | .version.current' livecheck.json)
62+
LATEST_VER=$(jq -r --arg f "$FORMULA" '.[] | select(.formula == $f) | .version.latest' livecheck.json)
63+
64+
echo "::group::$SHORT_NAME ($CURRENT_VER -> $LATEST_VER)"
65+
66+
# Check for existing open PR
67+
EXISTING_PR=$(gh pr list --repo "$GITHUB_REPOSITORY" --state open \
68+
--search "$SHORT_NAME $LATEST_VER in:title" \
69+
--json number --jq '.[0].number // empty' 2>/dev/null || true)
70+
71+
if [ -n "$EXISTING_PR" ]; then
72+
echo "PR #$EXISTING_PR already exists, skipping."
73+
SKIPPED="$SKIPPED- $SHORT_NAME $CURRENT_VER → $LATEST_VER (PR #$EXISTING_PR exists)\n"
74+
echo "::endgroup::"
75+
continue
76+
fi
77+
78+
# Get current URL and construct new URL
79+
CURRENT_URL=$(brew info --json=v2 "$FORMULA" | jq -r '.formulae[0].urls.stable.url')
80+
NEW_URL=$(echo "$CURRENT_URL" | sed "s/$CURRENT_VER/$LATEST_VER/g")
81+
82+
# Probe for correct archive extension
83+
BASE_URL=$(echo "$NEW_URL" | sed 's/\.tar\.\(xz\|bz2\|gz\)$//')
84+
RESOLVED_URL=""
85+
86+
for EXT in tar.xz tar.bz2 tar.gz; do
87+
CANDIDATE="${BASE_URL}.${EXT}"
88+
HTTP_CODE=$(curl -sIL -o /dev/null -w "%{http_code}" "$CANDIDATE" 2>/dev/null || echo "000")
89+
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then
90+
RESOLVED_URL="$CANDIDATE"
91+
break
92+
fi
93+
done
94+
95+
if [ -z "$RESOLVED_URL" ]; then
96+
echo "::warning::No valid download URL found for $SHORT_NAME $LATEST_VER"
97+
FAILED="$FAILED- $SHORT_NAME $CURRENT_VER → $LATEST_VER (no valid download URL)\n"
98+
echo "::endgroup::"
99+
continue
100+
fi
101+
102+
# Download and compute SHA256
103+
TMPFILE=$(mktemp)
104+
if ! curl -fsSL "$RESOLVED_URL" -o "$TMPFILE"; then
105+
echo "::warning::Download failed for $SHORT_NAME"
106+
FAILED="$FAILED- $SHORT_NAME $CURRENT_VER → $LATEST_VER (download failed)\n"
107+
rm -f "$TMPFILE"
108+
echo "::endgroup::"
109+
continue
110+
fi
111+
SHA256=$(sha256sum "$TMPFILE" | awk '{print $1}')
112+
rm -f "$TMPFILE"
113+
114+
echo "URL: $RESOLVED_URL"
115+
echo "SHA256: $SHA256"
116+
117+
# Create PR
118+
if brew bump-formula-pr \
119+
--no-browse \
120+
--no-fork \
121+
--url "$RESOLVED_URL" \
122+
--sha256 "$SHA256" \
123+
"$FORMULA" 2>&1; then
124+
CREATED_PRS="$CREATED_PRS- $SHORT_NAME $CURRENT_VER → $LATEST_VER\n"
125+
else
126+
echo "::warning::bump-formula-pr failed for $SHORT_NAME"
127+
FAILED="$FAILED- $SHORT_NAME $CURRENT_VER → $LATEST_VER (bump-formula-pr failed)\n"
128+
fi
129+
130+
echo "::endgroup::"
131+
done
132+
133+
# Write summary
134+
{
135+
echo "## Formula Update Check"
136+
echo ""
137+
if [ -n "$CREATED_PRS" ]; then
138+
echo "### PRs Created"
139+
echo -e "$CREATED_PRS"
140+
fi
141+
if [ -n "$SKIPPED" ]; then
142+
echo "### Skipped (PR already exists)"
143+
echo -e "$SKIPPED"
144+
fi
145+
if [ -n "$FAILED" ]; then
146+
echo "### Failed"
147+
echo -e "$FAILED"
148+
fi
149+
} > summary.md
150+
151+
- name: Post summary
152+
if: always()
153+
run: |
154+
if [ -f summary.md ]; then
155+
cat summary.md >> "$GITHUB_STEP_SUMMARY"
156+
else
157+
echo "## Formula Update Check" >> "$GITHUB_STEP_SUMMARY"
158+
echo "" >> "$GITHUB_STEP_SUMMARY"
159+
echo "Checked ${{ steps.livecheck.outputs.total_count }} formulas. None outdated." >> "$GITHUB_STEP_SUMMARY"
160+
fi

0 commit comments

Comments
 (0)