Skip to content

Commit e165a51

Browse files
committed
Tweaks
1 parent e78817b commit e165a51

File tree

3 files changed

+87
-35
lines changed

3 files changed

+87
-35
lines changed

.github/beta-bot.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
22
"auto_merge": false,
3+
"git_user": {
4+
"name": "GitHub Actions",
5+
"email": "actions@github.com"
6+
},
37
"directories": [
48
{
59
"directory": "beta/32bit",
@@ -10,7 +14,7 @@
1014
},
1115
{
1216
"name": "homebridge",
13-
"tag": "beta"
17+
"pattern": "^2.0.0-beta\\."
1418
},
1519
{
1620
"name": "node",
@@ -27,11 +31,11 @@
2731
},
2832
{
2933
"name": "homebridge",
30-
"tag": "beta"
34+
"pattern": "^2.0.0-beta\\."
3135
},
3236
{
3337
"name": "node",
34-
"tag": "^22.x.x"
38+
"tag": "^24.x.x"
3539
}
3640
]
3741
}

.github/workflows/beta-bot.yml

Lines changed: 79 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ jobs:
1010
runs-on: ubuntu-latest
1111
outputs:
1212
changes_detected: ${{ steps.check-changes.outputs.changes_detected }}
13-
changed_dir: ${{ steps.check-changes.outputs.changed_dir }}
13+
changed_dirs: ${{ steps.check-changes.outputs.changed_dirs }}
1414
branch_name: ${{ steps.create-branch.outputs.branch_name }}
1515
pr_number: ${{ steps.create-pr.outputs.pr_number }}
16-
auto_merge: ${{ steps.check-changes.outputs.auto_merge }}
16+
auto_merge: ${{ steps.load-config.outputs.auto_merge }}
17+
user_name: ${{ steps.load-config.outputs.user_name }}
18+
user_email: ${{ steps.load-config.outputs.user_email }}
19+
dirs_length: ${{ steps.load-config.outputs.dirs_length }}
1720
steps:
1821
- uses: actions/checkout@v4
1922
with:
@@ -36,30 +39,79 @@ jobs:
3639
echo "::error::Config file not found: $config_abs. Please ensure .github/beta-bot.json exists in the repository."
3740
exit 1
3841
fi
42+
user_name=$(jq -r '.git_user.name // "GitHub Actions"' "$config_abs")
43+
user_email=$(jq -r '.git_user.email // "actions@github.com"' "$config_abs")
44+
auto_merge=$(jq -r '.auto_merge // false' "$config_abs")
45+
dirs_length=$(jq '.directories | length' "$config_abs")
46+
dirs_json=$(jq -c '.directories' "$config_abs")
47+
# Validate that each package has either tag or pattern, but not both
48+
for i in $(seq 0 $(($dirs_length - 1))); do
49+
pkgs_length=$(jq ".directories[$i].packages | length" "$config_abs")
50+
for j in $(seq 0 $(($pkgs_length - 1))); do
51+
pkg=$(jq -r ".directories[$i].packages[$j].name" "$config_abs")
52+
has_tag=$(jq -r ".directories[$i].packages[$j].tag // null" "$config_abs")
53+
has_pattern=$(jq -r ".directories[$i].packages[$j].pattern // null" "$config_abs")
54+
if [ "$has_tag" != "null" ] && [ "$has_pattern" != "null" ]; then
55+
echo "::error::Package $pkg in directory $i has both tag and pattern defined. Specify only one."
56+
exit 1
57+
fi
58+
if [ "$has_tag" = "null" ] && [ "$has_pattern" = "null" ]; then
59+
echo "::error::Package $pkg in directory $i has neither tag nor pattern defined. Specify one."
60+
exit 1
61+
fi
62+
done
63+
done
3964
echo "Config file loaded: $config_abs"
4065
echo "config_abs=$config_abs" >> $GITHUB_OUTPUT
66+
echo "user_name=$user_name" >> $GITHUB_OUTPUT
67+
echo "user_email=$user_email" >> $GITHUB_OUTPUT
68+
echo "auto_merge=$auto_merge" >> $GITHUB_OUTPUT
69+
echo "dirs_length=$dirs_length" >> $GITHUB_OUTPUT
70+
echo "dirs_json=$dirs_json" >> $GITHUB_OUTPUT
71+
72+
- name: Configure Git identity
73+
run: |
74+
git config user.name "${{ steps.load-config.outputs.user_name }}"
75+
git config user.email "${{ steps.load-config.outputs.user_email }}"
76+
echo "Git identity configured: ${{ steps.load-config.outputs.user_name }} <${{ steps.load-config.outputs.user_email }}>"
4177
4278
- name: Process directories and packages
4379
id: process-dirs
4480
run: |
45-
config="${{ steps.load-config.outputs.config_abs }}"
46-
dirs_length=$(jq '.directories | length' "$config")
81+
dirs_length="${{ steps.load-config.outputs.dirs_length }}"
82+
dirs_json="${{ steps.load-config.outputs.dirs_json }}"
4783
echo "Found $dirs_length directories in config"
4884
for i in $(seq 0 $(($dirs_length - 1))); do
49-
dir=$(jq -r ".directories[$i].directory" "$config")
85+
dir=$(echo "$dirs_json" | jq -r ".[$i].directory")
5086
if [ ! -d "$dir" ]; then
5187
echo "Directory not found: $dir"
5288
continue
5389
fi
5490
echo "Processing directory: $dir"
5591
cd "$dir"
56-
pkgs_length=$(jq ".directories[$i].packages | length" "$config")
92+
pkgs_length=$(echo "$dirs_json" | jq ".[$i].packages | length")
5793
echo "Found $pkgs_length packages in $dir"
5894
for j in $(seq 0 $(($pkgs_length - 1))); do
59-
pkg=$(jq -r ".directories[$i].packages[$j].name" "$config")
60-
tag=$(jq -r ".directories[$i].packages[$j].tag" "$config")
61-
echo "Installing $pkg@$tag in $dir"
62-
npm install "$pkg@$tag" || { echo "Failed to install $pkg@$tag"; exit 1; }
95+
pkg=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].name")
96+
tag=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].tag // null")
97+
pattern=$(echo "$dirs_json" | jq -r ".[$i].packages[$j].pattern // null")
98+
if [ "$tag" != "null" ]; then
99+
latest_version=$(npm view "$pkg@$tag" version)
100+
if [ -z "$latest_version" ]; then
101+
echo "::error::No version found for $pkg@$tag"
102+
exit 1
103+
fi
104+
echo "Installing $pkg@$latest_version in $dir"
105+
npm install "$pkg@$latest_version" || { echo "::error::Failed to install $pkg@$latest_version"; exit 1; }
106+
else
107+
latest_version=$(npm view "$pkg" versions --json | jq -r ".[] | select(test(\"$pattern\"))" | sort -V | tail -n 1)
108+
if [ -z "$latest_version" ]; then
109+
echo "::error::No versions found for $pkg matching pattern $pattern"
110+
exit 1
111+
fi
112+
echo "Installing $pkg@$latest_version in $dir"
113+
npm install "$pkg@$latest_version" || { echo "::error::Failed to install $pkg@$latest_version"; exit 1; }
114+
fi
63115
done
64116
cd - > /dev/null
65117
echo "Completed processing $dir"
@@ -68,13 +120,12 @@ jobs:
68120
- name: Check for changes
69121
id: check-changes
70122
run: |
71-
config="${{ steps.load-config.outputs.config_abs }}"
72-
auto_merge=$(jq -r ".auto_merge // false" "$config")
73-
dirs_length=$(jq '.directories | length' "$config")
123+
dirs_length="${{ steps.load-config.outputs.dirs_length }}"
124+
dirs_json="${{ steps.load-config.outputs.dirs_json }}"
74125
changes_detected=false
75-
changed_dir=""
126+
changed_dirs=""
76127
for i in $(seq 0 $(($dirs_length - 1))); do
77-
dir=$(jq -r ".directories[$i].directory" "$config")
128+
dir=$(echo "$dirs_json" | jq -r ".[$i].directory")
78129
if [ ! -d "$dir" ]; then
79130
continue
80131
fi
@@ -84,27 +135,26 @@ jobs:
84135
else
85136
echo "Changes detected in $dir"
86137
changes_detected=true
87-
changed_dir="$dir"
88-
break # Stop at first change to handle one directory per run
138+
if [ -z "$changed_dirs" ]; then
139+
changed_dirs="$dir"
140+
else
141+
changed_dirs="$changed_dirs,$dir"
142+
fi
143+
git add package.json package-lock.json
89144
fi
90145
cd - > /dev/null
91146
done
92147
echo "changes_detected=$changes_detected" >> $GITHUB_OUTPUT
93-
echo "changed_dir=$changed_dir" >> $GITHUB_OUTPUT
94-
echo "auto_merge=$auto_merge" >> $GITHUB_OUTPUT
148+
echo "changed_dirs=$changed_dirs" >> $GITHUB_OUTPUT
95149
96150
- name: Create and push branch
97151
id: create-branch
98152
if: steps.check-changes.outputs.changes_detected == 'true'
99153
run: |
100-
dir="${{ steps.check-changes.outputs.changed_dir }}"
154+
changed_dirs="${{ steps.check-changes.outputs.changed_dirs }}"
101155
branch="update/beta-$(date +%s)"
102-
cd "$dir"
103-
git config user.name "GitHub Actions"
104-
git config user.email "actions@github.com"
105156
git checkout -b "$branch"
106-
git add package.json package-lock.json
107-
git commit -m "Update beta dependencies in $dir"
157+
git commit -m "Update beta dependencies in $changed_dirs"
108158
git push origin "$branch"
109159
echo "Branch pushed: $branch"
110160
echo "branch_name=$branch" >> $GITHUB_OUTPUT
@@ -116,8 +166,8 @@ jobs:
116166
if: steps.check-changes.outputs.changes_detected == 'true'
117167
run: |
118168
branch="${{ steps.create-branch.outputs.branch_name }}"
119-
dir="${{ steps.check-changes.outputs.changed_dir }}"
120-
pr_url=$(gh pr create --title "Update beta dependencies in $dir" --body "Automated dependency update")
169+
changed_dirs="${{ steps.check-changes.outputs.changed_dirs }}"
170+
pr_url=$(gh pr create --title "Update beta dependencies in $changed_dirs" --body "Automated dependency update")
121171
pr_number="${pr_url##*/}"
122172
echo "PR created: $pr_url"
123173
echo "pr_number=$pr_number" >> $GITHUB_OUTPUT
@@ -126,12 +176,10 @@ jobs:
126176

127177
- name: Auto-merge PR
128178
id: auto-merge
129-
if: steps.check-changes.outputs.changes_detected == 'true' && steps.check-changes.outputs.auto_merge == 'true'
179+
if: steps.check-changes.outputs.changes_detected == 'true' && steps.load-config.outputs.auto_merge == 'true'
130180
run: |
131181
pr_number="${{ steps.create-pr.outputs.pr_number }}"
132182
echo "Auto-merging PR #$pr_number"
133-
git config user.name "GitHub Actions"
134-
git config user.email "actions@github.com"
135-
gh pr merge "$pr_number" --merge --delete-branch || { echo "Failed to merge PR #$pr_number"; exit 1; }
183+
gh pr merge "$pr_number" --merge --delete-branch || { echo "::error::Failed to merge PR #$pr_number"; exit 1; }
136184
env:
137185
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

beta/32bit/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"homepage": "https://github.com/homebridge/homebridge-apt-pkg#readme",
2222
"private": false,
2323
"dependencies": {
24-
"homebridge": "^2.0.0-beta.29",
24+
"homebridge": "^2.0.0-beta.28",
2525
"homebridge-config-ui-x": "^5.4.2-beta.2",
2626
"node": "^22.18.0"
2727
}

0 commit comments

Comments
 (0)