Skip to content

Commit 09fb579

Browse files
committed
Fine tuning of the PIO bot
1 parent 841fb39 commit 09fb579

3 files changed

Lines changed: 98 additions & 67 deletions

File tree

.github/scripts/platformio/GitHubCommit.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99

1010

1111
class GitHubCommit:
12+
logger: logging.Logger
1213
major: int = 90
1314
minor: int = 21
1415
patch: int = 3
15-
path: str = "platformio.ini"
1616
rest: httpx.Client
1717

1818
def __init__(self) -> None:
19+
self.logger = logging.getLogger("Frekvens")
1920
self.rest = httpx.Client(
2021
base_url="https://api.github.com",
2122
headers={
@@ -26,21 +27,20 @@ def __init__(self) -> None:
2627
},
2728
)
2829

29-
def parse(self) -> str:
30+
def matrix(self) -> str:
3031
seen: set[str] = set()
3132
fragments: list[typing.Tuple[str, str, str, str, str, str, str]] = []
32-
with open(self.path, encoding="utf-8") as f:
33+
with open("platformio.ini", encoding="utf-8") as f:
3334
for match in re.finditer(
3435
r"https://github\.com/(?P<owner>[^/]+)/(?P<repo>[^/]+)/archive/(?P<commit>[0-9a-f]{40})\.tar\.gz\s*;\s*(?P<tag>.+)",
3536
f.read(),
3637
):
3738
string = match.group(0)
3839
if string in seen:
39-
logging.debug("Skipping duplicate: %s", string)
4040
continue
4141
seen.add(string)
4242
package = match.groupdict()
43-
pending = self.check(package["owner"], package["repo"], package["commit"], package["tag"])
43+
pending = self.check(package["owner"], package["repo"], package["tag"])
4444
if pending:
4545
fragments.append(
4646
(
@@ -70,14 +70,16 @@ def parse(self) -> str:
7070
]
7171
)
7272

73-
def check(self, owner: str, repo: str, commit: str, tag: str) -> typing.Optional[typing.Tuple[str, str]]:
74-
logging.info("Checking for updates to %s/%s %s", owner, repo, tag)
73+
def check(self, owner: str, repo: str, tag: str) -> typing.Optional[typing.Tuple[str, str]]:
7574
try:
7675
v_tag = packaging.version.Version(tag)
7776
for release in self.rest.get(f"/repos/{owner}/{repo}/releases").raise_for_status().json():
7877
try:
7978
v_release = packaging.version.Version(release["tag_name"])
80-
if v_release < v_tag:
79+
if v_release <= v_tag:
80+
continue
81+
elif v_release.is_prerelease:
82+
self.logger.info("Skipping pre-release: %s/%s %s", owner, repo, release["tag_name"])
8183
continue
8284
days = (
8385
datetime.datetime.now(datetime.timezone.utc)
@@ -88,24 +90,27 @@ def check(self, owner: str, repo: str, commit: str, tag: str) -> typing.Optional
8890
or (days < self.minor and v_release.minor > v_tag.minor and v_release.major == v_tag.major)
8991
or (days < self.patch and v_release.minor == v_tag.minor and v_release.major == v_tag.major)
9092
):
91-
logging.info("Skipping '%s', days since release: %d", release["tag_name"], days)
93+
self.logger.info("On cooldown, skipping: %s/%s %s", owner, repo, release["tag_name"])
9294
continue
93-
commits = (
94-
self.rest.get(f"/repos/{owner}/{repo}/commits/{release['tag_name']}").raise_for_status().json()
95+
self.logger.info("Update available: %s/%s %s", owner, repo, release["tag_name"])
96+
return (
97+
self.rest.get(f"/repos/{owner}/{repo}/commits/{release['tag_name']}")
98+
.raise_for_status()
99+
.json()["sha"],
100+
release["tag_name"],
95101
)
96-
if commits["sha"] == commit:
97-
logging.info("Up to date")
98-
return None
99-
return (commits["sha"], release["tag_name"])
100102
except (httpx.HTTPError, packaging.version.InvalidVersion) as e:
101-
logging.warning(e)
103+
self.logger.warning(e)
102104
except (httpx.HTTPError, packaging.version.InvalidVersion) as e:
103-
logging.error(e)
105+
self.logger.error(e)
106+
self.logger.info("Up to date: %s/%s %s", owner, repo, tag)
104107
return None
105108

106109

107110
def main() -> None:
108-
print(GitHubCommit().parse())
111+
logging.basicConfig()
112+
logging.getLogger("Frekvens").setLevel(logging.INFO)
113+
print(GitHubCommit().matrix())
109114

110115

111116
if __name__ == "__main__":

.github/scripts/platformio/PlatformIoRegistry.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010

1111
class PlatformIoRegistry:
1212
fragments: list[typing.Tuple[str, str, str, str, str, str]] = []
13+
logger: logging.Logger
1314
major: int = 90
1415
minor: int = 21
1516
patch: int = 3
1617
rest: httpx.Client
1718
seen: set[str] = set()
1819

1920
def __init__(self) -> None:
21+
self.logger = logging.getLogger("Frekvens")
2022
self.rest = httpx.Client(
2123
base_url="https://api.registry.platformio.org",
2224
headers={
@@ -26,7 +28,7 @@ def __init__(self) -> None:
2628
)
2729
self.regex = re.compile(r"^(?P<owner>[a-z0-9_-]+)\/(?P<name>[A-Za-z0-9_-]+)\s*@\s*(?P<version>\d+\.\d+\.\d+)$")
2830

29-
def load(self) -> str:
31+
def matrix(self) -> str:
3032
for _, entries in json.loads(
3133
subprocess.run(
3234
["pio", "project", "config", "--json-output"], capture_output=True, check=True, text=True
@@ -57,13 +59,11 @@ def load(self) -> str:
5759
)
5860

5961
def parse(self, type: str, query: str) -> None:
62+
if query in self.seen:
63+
return
64+
self.seen.add(query)
6065
match = self.regex.fullmatch(query)
6166
if match:
62-
string = match.group(0)
63-
if string in self.seen:
64-
logging.debug("Skipping duplicate: %s", query)
65-
return
66-
self.seen.add(string)
6767
pending = self.check(type, match["owner"], match["name"], match["version"])
6868
if pending:
6969
self.fragments.append(
@@ -73,25 +73,27 @@ def parse(self, type: str, query: str) -> None:
7373
match["name"],
7474
match["version"],
7575
pending,
76-
string,
76+
match.group(0),
7777
)
7878
)
7979
else:
80-
logging.debug("Unsupported format: %s", query)
80+
self.logger.debug("Unsupported format: %s", query)
8181

82-
def check(self, type: str, owner: str, name: str, _version: str) -> typing.Optional[str]:
83-
logging.info("Checking for updates to %s/%s %s", owner, name, _version)
82+
def check(self, type: str, owner: str, name: str, version: str) -> typing.Optional[str]:
8483
try:
85-
v_version = packaging.version.Version(_version)
84+
v_version = packaging.version.Version(version)
8685
package = self.rest.get(f"/v3/packages/{owner}/{type}/{name}").raise_for_status().json()
87-
for version in package["versions"]:
86+
for release in package["versions"]:
8887
try:
89-
v_package_version = packaging.version.Version(version["name"])
90-
if v_package_version < v_version:
88+
v_package_version = packaging.version.Version(release["name"])
89+
if v_package_version <= v_version:
90+
continue
91+
elif v_package_version.is_prerelease:
92+
self.logger.info("Skipping pre-release: %s/%s %s", owner, name, release["name"])
9193
continue
9294
days = (
9395
datetime.datetime.now(datetime.timezone.utc)
94-
- datetime.datetime.fromisoformat(version["released_at"].replace("Z", "+00:00"))
96+
- datetime.datetime.fromisoformat(release["released_at"].replace("Z", "+00:00"))
9597
).days
9698
if (
9799
(days < self.major and v_package_version.major > v_version.major)
@@ -106,21 +108,22 @@ def check(self, type: str, owner: str, name: str, _version: str) -> typing.Optio
106108
and v_package_version.major == v_version.major
107109
)
108110
):
109-
logging.info("Skipping '%s', days since release: %d", version["name"], days)
111+
self.logger.info("On cooldown, skipping: %s/%s %s", owner, name, release["name"])
110112
continue
111-
if version["name"] == _version:
112-
logging.info("Up to date")
113-
return None
114-
return version["name"]
113+
self.logger.info("Update available: %s/%s %s", owner, name, release["name"])
114+
return release["name"]
115115
except packaging.version.InvalidVersion as e:
116-
logging.warning(e)
116+
self.logger.warning(e)
117117
except (httpx.HTTPError, packaging.version.InvalidVersion) as e:
118-
logging.error(e)
118+
self.logger.error(e)
119+
self.logger.info("Up to date: %s/%s %s", owner, name, version)
119120
return None
120121

121122

122123
def main() -> None:
123-
print(PlatformIoRegistry().load())
124+
logging.basicConfig()
125+
logging.getLogger("Frekvens").setLevel(logging.INFO)
126+
print(PlatformIoRegistry().matrix())
124127

125128

126129
if __name__ == "__main__":

.github/workflows/platformio.yml

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
name: Idle check
1919
runs-on: ubuntu-latest
2020
outputs:
21-
days: ${{ steps.idle.outputs.days }}
21+
active: ${{ steps.idle.outputs.active }}
2222

2323
steps:
24-
- name: GitHub Script idle counter
24+
- name: GitHub Script idle check
2525
id: idle
2626
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
2727
with:
@@ -31,15 +31,15 @@ jobs:
3131
repo: context.repo.repo,
3232
branch: 'main',
3333
});
34-
const days = Math.floor((new Date() - new Date(branch.commit.commit.author.date)) / 86400000).toString();
35-
core.info(`Days: ${days}`);
36-
core.setOutput("days", days);
34+
const active = new Date() - new Date(branch.commit.commit.author.date) <= 90 * 86400000;
35+
core.info(`Active: ${active}`);
36+
core.setOutput("active", active);
3737
38-
github-commit:
39-
name: GitHub commit
38+
github-commits:
39+
name: GitHub commits
4040
needs: idle
4141
runs-on: ubuntu-latest
42-
if: needs.idle.outputs.days <= 90
42+
if: needs.idle.outputs.active
4343
outputs:
4444
dependency-fragments: ${{ steps.commits.outputs.fragments }}
4545

@@ -67,42 +67,53 @@ jobs:
6767
run: |
6868
echo "fragments=$(python .github/scripts/platformio/GitHubCommit.py)" >> "$GITHUB_OUTPUT"
6969
70-
github-commit-handler:
71-
name: GitHub commit
72-
needs: github-commit
70+
github-commit-dependency:
71+
name: GitHub commit dependency
72+
needs: github-commits
7373
runs-on: ubuntu-latest
74-
if: needs.github-commit.outputs.dependency-fragments != '[]'
74+
if: needs.github-commits.outputs.dependency-fragments != '[]'
7575

7676
strategy:
7777
matrix:
78-
fragments: ${{ fromJson(needs.github-commit.outputs.dependency-fragments) }}
78+
fragments: ${{ fromJson(needs.github-commits.outputs.dependency-fragments) }}
7979

8080
steps:
8181
- name: Checkout
8282
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
8383

84+
- name: Git branch check
85+
id: branch
86+
run: |
87+
if git ls-remote --exit-code --heads origin "dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}-${{ matrix.fragments.version_new }}"; then
88+
echo "exists=1" >> "$GITHUB_OUTPUT"
89+
else
90+
echo "exists=0" >> "$GITHUB_OUTPUT"
91+
fi
92+
8493
- name: Update platformio.ini
94+
if: steps.branch.outputs.exists == false
8595
run: sed -i "s|${{ matrix.fragments.string_old }}|${{ matrix.fragments.string_new }}|g" platformio.ini
8696

8797
- name: Create Pull Request
88-
98+
if: steps.branch.outputs.exists == false
8999
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
90100
id: pr
91101
with:
92-
title: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
93-
branch: dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}-${{ matrix.fragments.version_new }}
102+
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
94103
body: |
95104
Bumps [${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}](https://github.com/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}) from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }}.
96-
- [Release notes](https://github.com/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}/releases)
97-
- [Diff](https://github.com/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}/compare/${{ matrix.fragments.commit_old }}...${{ matrix.fragments.commit_new }})
105+
- [Releases](https://github.com/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}/releases)
106+
- [Compare changes](https://github.com/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}/compare/${{ matrix.fragments.commit_old }}...${{ matrix.fragments.commit_new }})
107+
branch: dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }}-${{ matrix.fragments.version_new }}
98108
commit-message: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
99109
labels: |
100110
dependencies
101111
firmware
102112
milestone: ${{ env.milestone }}
113+
title: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.repo }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
103114

104115
- name: GitHub Script close superseded
105-
if: steps.pr.outputs.pull-request-operation == 'created'
116+
if: steps.branch.outputs.exists == false
106117
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
107118
with:
108119
script: |
@@ -142,10 +153,10 @@ jobs:
142153
}
143154
144155
platformio-registry:
145-
name: PlatformIO registry
156+
name: PlatformIO Registry
146157
needs: idle
147158
runs-on: ubuntu-latest
148-
if: needs.idle.outputs.days <= 90
159+
if: needs.idle.outputs.active
149160
outputs:
150161
dependency-fragments: ${{ steps.registry.outputs.fragments }}
151162

@@ -173,8 +184,8 @@ jobs:
173184
run: |
174185
echo "fragments=$(python .github/scripts/platformio/PlatformIoRegistry.py)" >> "$GITHUB_OUTPUT"
175186
176-
platformio-registry-handler:
177-
name: PlatformIO Registry
187+
platformio-registry-dependency:
188+
name: PlatformIO Registry dependency
178189
needs: platformio-registry
179190
runs-on: ubuntu-latest
180191
if: needs.platformio-registry.outputs.dependency-fragments != '[]'
@@ -187,26 +198,38 @@ jobs:
187198
- name: Checkout
188199
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
189200

201+
- name: Git branch check
202+
id: branch
203+
run: |
204+
if git ls-remote --exit-code --heads origin "dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}-${{ matrix.fragments.version_new }}"; then
205+
echo "exists=1" >> "$GITHUB_OUTPUT"
206+
else
207+
echo "exists=0" >> "$GITHUB_OUTPUT"
208+
fi
209+
190210
- name: Update platformio.ini
211+
if: steps.branch.outputs.exists == false
191212
run: sed -i "s|${{ matrix.fragments.string_old }}|${{ matrix.fragments.string_new }}|g" platformio.ini
192213

193214
- name: Create Pull Request
215+
if: steps.branch.outputs.exists == false
194216
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
195217
id: pr
196218
with:
197-
title: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.name }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
198-
branch: dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}-${{ matrix.fragments.version_new }}
219+
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
199220
body: |
200221
Bumps [${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}](https://registry.platformio.org/${{ matrix.fragments.type }}/${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}) from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }}.
201222
- [Releases](https://registry.platformio.org/${{ matrix.fragments.type }}/${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}/versions)
223+
branch: dependabot/platformio/${{ matrix.fragments.owner }}/${{ matrix.fragments.name }}-${{ matrix.fragments.version_new }}
202224
commit-message: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.name }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
203225
labels: |
204226
dependencies
205227
firmware
206228
milestone: ${{ env.milestone }}
229+
title: Bump ${{ matrix.fragments.owner }}/${{ matrix.fragments.name }} from ${{ matrix.fragments.version_old }} to ${{ matrix.fragments.version_new }} in /
207230

208231
- name: GitHub Script close superseded
209-
if: steps.pr.outputs.pull-request-operation == 'created'
232+
if: steps.branch.outputs.exists == false
210233
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
211234
with:
212235
script: |

0 commit comments

Comments
 (0)