diff options
| author | tranch <tranch.xiao@gmail.com> | 2026-10-22 15:13:49 +0800 |
|---|---|---|
| committer | tranch <tranch.xiao@gmail.com> | 2026-10-22 15:13:49 +0800 |
| commit | 9cc84b14b8805f964ee8772b44721c3ec1588f4e (patch) | |
| tree | 4088f09758b05f2349823080025453298d9afeee | |
| download | aerocore-os-gamemode-news-9cc84b14b8805f964ee8772b44721c3ec1588f4e.tar.gz aerocore-os-gamemode-news-9cc84b14b8805f964ee8772b44721c3ec1588f4e.zip | |
feat: publish AeroCore game mode news
Provide public update announcements for AeroCore OS using the upstream
game mode news format.
| -rw-r--r-- | .github/scripts/build-announcements.py | 642 | ||||
| -rw-r--r-- | .github/workflows/build-announcements.yml | 62 | ||||
| -rw-r--r-- | LICENSE | 21 | ||||
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | announcements.json | 42 | ||||
| -rw-r--r-- | docs/index.html | 170 | ||||
| -rw-r--r-- | tests/conftest.py | 30 | ||||
| -rw-r--r-- | tests/fixtures/bazzite-releases.json | 1 | ||||
| -rw-r--r-- | tests/test_build_announcements.py | 181 |
9 files changed, 1153 insertions, 0 deletions
diff --git a/.github/scripts/build-announcements.py b/.github/scripts/build-announcements.py new file mode 100644 index 0000000..85908b5 --- /dev/null +++ b/.github/scripts/build-announcements.py @@ -0,0 +1,642 @@ +#!/usr/bin/env python3 + +import html +import json +import os +import re +import urllib.request +from datetime import datetime, timezone + +MAX_ENTRIES = 20 +ROOT_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..")) +OUTPUT_FILE = os.path.join(ROOT_DIR, "announcements.json") +DOCS_DIR = os.path.join(ROOT_DIR, "docs") +HTML_FILE = os.path.join(DOCS_DIR, "index.html") + +SOURCE_REPO = os.environ.get("SOURCE_REPO", "AeroCore-IO/AeroCore-OS") + +# branch -> (prerelease_filter, channel) +BRANCH_CONFIG = { + "stable": (False, "rel"), + "testing": (True, "beta"), + "unstable": (True, "preview"), +} + + +def branch_config(branch): + """Return (prerelease, channel) for a git branch, or raise ValueError.""" + if branch not in BRANCH_CONFIG: + raise ValueError(f"unknown branch: {branch!r} (expected one of {sorted(BRANCH_CONFIG)})") + return BRANCH_CONFIG[branch] + + +def select_releases(releases, prerelease, limit=MAX_ENTRIES): + """Filter releases by prerelease flag, drop drafts, sort newest-first, cap at limit.""" + kept = [ + r for r in releases + if bool(r.get("prerelease")) == prerelease and not r.get("draft") + ] + kept.sort(key=lambda r: r.get("published_at") or "", reverse=True) + return kept[:limit] + + +KEEP_SECTIONS = {"Major packages", "Commits"} + + +def extract_sections(body): + """Keep only allowlisted '### <heading>' sections from a release body.""" + lines = (body or "").split("\n") + result = [] + keeping = False + for line in lines: + m = re.match(r"^#{1,6}\s+(.*)", line.strip()) + if m: + keeping = m.group(1).strip() in KEEP_SECTIONS + if keeping: + result.append(line) + return "\n".join(result).strip() + + +def normalize_release_date(published_at): + """Parse GitHub ISO-8601 UTC timestamp into (display_str, unix_ts).""" + dt = datetime.strptime(published_at, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc) + return dt.strftime("%Y-%m-%d %H:%M"), int(dt.timestamp()) + + +def release_to_entry(release, channel): + """Convert a GitHub release dict into an announcement entry.""" + body = extract_sections(release.get("body", "")) + date_str, timestamp = normalize_release_date(release["published_at"]) + return { + "title": release.get("name") or "", + "date": date_str, + "timestamp": timestamp, + "channel": channel, + "lang": "english", + "body": body, + "bbcode_body": md_to_bbcode(body), + "html_body": md_to_html(body), + } + + +def fetch_releases(repo, token, urlopen=None): + """Fetch all releases for a repo (paginated), newest first. stdlib only.""" + opener = urlopen or urllib.request.urlopen + results = [] + page = 1 + while True: + url = f"https://api.github.com/repos/{repo}/releases?per_page=100&page={page}" + req = urllib.request.Request(url) + req.add_header("Accept", "application/vnd.github+json") + req.add_header("User-Agent", "aerocore-os-gamemode-news") + if token: + req.add_header("Authorization", f"Bearer {token}") + with opener(req, timeout=30) as resp: + batch = json.loads(resp.read().decode("utf-8")) + if not batch: + break + results.extend(batch) + if len(batch) < 100: + break + page += 1 + return results + + +def _is_table_row(line): + """Check if a line is a Markdown table row (| ... | ... |).""" + return bool(re.match(r"^\|.*\|$", line.strip())) + + +def _is_table_separator(line): + """Check if a line is a Markdown table separator (|---|---|).""" + return bool(re.match(r"^\|[-:\s|]+\|$", line.strip())) + + +def _parse_table_cells(line): + """Extract cell contents from a Markdown table row.""" + return [c.strip() for c in line.strip().strip("|").split("|")] + + +def md_to_bbcode(text): + """Convert Markdown to Steam BBCode.""" + lines = text.split("\n") + result = [] + in_ul = False + in_ol = False + in_quote = False + in_code_block = False + in_table = False + table_header_done = False + + for line in lines: + stripped = line.strip() + + # Fenced code block + if stripped.startswith("```"): + if in_code_block: + result.append("[/code]") + in_code_block = False + else: + in_code_block = True + result.append("[code]") + continue + if in_code_block: + result.append(line.rstrip()) + continue + + # Table + if _is_table_row(stripped): + if _is_table_separator(stripped): + continue + cells = _parse_table_cells(stripped) + if not in_table: + result.append("[table]") + in_table = True + table_header_done = False + tag = "th" if not table_header_done else "td" + row = "[tr]" + "".join(f"[{tag}]{c}[/{tag}]" for c in cells) + "[/tr]" + result.append(row) + if not table_header_done: + table_header_done = True + continue + elif in_table: + result.append("[/table]") + in_table = False + + # Unordered list + if re.match(r"^[-*]\s+", stripped): + if in_ol: + result.append("[/olist]") + in_ol = False + item = re.sub(r"^[-*]\s+", "", stripped) + if not in_ul: + result.append("[list]") + in_ul = True + result.append(f"[*] {item}") + continue + elif in_ul: + result.append("[/list]") + in_ul = False + + # Ordered list + if re.match(r"^\d+\.\s+", stripped): + if in_ul: + result.append("[/list]") + in_ul = False + item = re.sub(r"^\d+\.\s+", "", stripped) + if not in_ol: + result.append("[olist]") + in_ol = True + result.append(f"[*] {item}") + continue + elif in_ol: + result.append("[/olist]") + in_ol = False + + # Blockquote + if stripped.startswith("> "): + content = stripped[2:] + if not in_quote: + result.append("[quote]") + in_quote = True + result.append(content) + continue + elif in_quote: + result.append("[/quote]") + in_quote = False + + # Horizontal rule + if re.match(r"^[-*_]{3,}$", stripped): + result.append("[hr][/hr]") + continue + + # Heading + m = re.match(r"^(#{1,3})\s+(.*)", stripped) + if m: + level = len(m.group(1)) + tag = f"h{level}" + result.append(f"[{tag}]{m.group(2)}[/{tag}]") + continue + + result.append(stripped) + + if in_table: + result.append("[/table]") + if in_ul: + result.append("[/list]") + if in_ol: + result.append("[/olist]") + if in_quote: + result.append("[/quote]") + if in_code_block: + result.append("[/code]") + + text = "\n".join(result) + # Protect [*] list markers from being caught by italic regex + text = text.replace("[*]", "\x00LI\x00") + # Images before links ( vs [text](url)) + text = re.sub(r"!\[([^\]]*)\]\(([^)]+)\)", r"[img]\2[/img]", text) + text = re.sub(r"\[([^\]]+)\]\(([^)]+)\)", r"[url=\2]\1[/url]", text) + text = re.sub(r"\*\*(.+?)\*\*", r"[b]\1[/b]", text) + text = re.sub(r"__(.+?)__", r"[u]\1[/u]", text) + text = re.sub(r"\*(.+?)\*", r"[i]\1[/i]", text) + text = re.sub(r"~~(.+?)~~", r"[strike]\1[/strike]", text) + text = re.sub(r"(?<!`)`([^`]+)`(?!`)", r"[code]\1[/code]", text) + text = text.replace("\x00LI\x00", "[*]") + return text + + +def md_to_html(text): + """Convert Markdown to HTML.""" + lines = text.split("\n") + result = [] + in_ul = False + in_ol = False + in_quote = False + in_code_block = False + in_table = False + table_header_done = False + + for line in lines: + stripped = line.strip() + + # Fenced code block + if stripped.startswith("```"): + if in_code_block: + result.append("</code></pre>") + in_code_block = False + else: + in_code_block = True + result.append("<pre><code>") + continue + if in_code_block: + result.append(html.escape(line.rstrip())) + continue + + # Table + if _is_table_row(stripped): + if _is_table_separator(stripped): + continue + cells = _parse_table_cells(stripped) + if not in_table: + result.append("<table>") + in_table = True + table_header_done = False + tag = "th" if not table_header_done else "td" + row = "<tr>" + "".join(f"<{tag}>{html.escape(c)}</{tag}>" for c in cells) + "</tr>" + result.append(row) + if not table_header_done: + table_header_done = True + continue + elif in_table: + result.append("</table>") + in_table = False + + # Unordered list + if re.match(r"^[-*]\s+", stripped): + if in_ol: + result.append("</ol>") + in_ol = False + item = re.sub(r"^[-*]\s+", "", stripped) + if not in_ul: + result.append("<ul>") + in_ul = True + result.append(f"<li>{html.escape(item)}</li>") + continue + elif in_ul: + result.append("</ul>") + in_ul = False + + # Ordered list + if re.match(r"^\d+\.\s+", stripped): + if in_ul: + result.append("</ul>") + in_ul = False + item = re.sub(r"^\d+\.\s+", "", stripped) + if not in_ol: + result.append("<ol>") + in_ol = True + result.append(f"<li>{html.escape(item)}</li>") + continue + elif in_ol: + result.append("</ol>") + in_ol = False + + # Blockquote + if stripped.startswith("> "): + content = stripped[2:] + if not in_quote: + result.append("<blockquote>") + in_quote = True + result.append(html.escape(content)) + continue + elif in_quote: + result.append("</blockquote>") + in_quote = False + + # Horizontal rule + if re.match(r"^[-*_]{3,}$", stripped): + result.append("<hr>") + continue + + # Heading + m = re.match(r"^(#{1,3})\s+(.*)", stripped) + if m: + level = len(m.group(1)) + result.append(f"<h{level}>{html.escape(m.group(2))}</h{level}>") + continue + + if stripped: + result.append(f"<p>{html.escape(stripped)}</p>") + else: + result.append("") + + if in_table: + result.append("</table>") + if in_ul: + result.append("</ul>") + if in_ol: + result.append("</ol>") + if in_quote: + result.append("</blockquote>") + if in_code_block: + result.append("</code></pre>") + + text = "\n".join(result) + # Images before links + text = re.sub( + r"!\[([^\]]*)\]\(([^)]+)\)", + r'<img src="\2" alt="\1" style="max-width:100%">', + text, + ) + text = re.sub( + r"\[([^\]]+)\]\(([^)]+)\)", + r'<a href="\2" target="_blank" rel="noopener">\1</a>', + text, + ) + text = re.sub(r"\*\*(.+?)\*\*", r"<strong>\1</strong>", text) + text = re.sub(r"__(.+?)__", r"<u>\1</u>", text) + text = re.sub(r"\*(.+?)\*", r"<em>\1</em>", text) + text = re.sub(r"~~(.+?)~~", r"<del>\1</del>", text) + text = re.sub(r"(?<!`)`([^`]+)`(?!`)", r"<code>\1</code>", text) + # unescape HTML tags generated by inline formatting inside escaped <p>/<li>/<td>/<th> + text = re.sub( + r"<(/?(?:strong|em|del|u|a|code|img|ul|ol|li|blockquote|pre|h[1-3]|hr|table|tr|td|th)(?:\s[^>]*)?)>", + r"<\1>", + text, + ) + return text + + +def main(): + branch = os.environ.get("RELEASE_BRANCH", "").strip() + prerelease, channel = branch_config(branch) + token = os.environ.get("GITHUB_TOKEN") or None + + releases = fetch_releases(SOURCE_REPO, token) + selected = select_releases(releases, prerelease, MAX_ENTRIES) + entries = [release_to_entry(r, channel) for r in selected] + + out_file = os.path.normpath(OUTPUT_FILE) + with open(out_file, "w", encoding="utf-8") as f: + json.dump(entries, f, ensure_ascii=False, indent=2) + f.write("\n") + print(f"Generated {out_file}: {len(entries)} entries " + f"from {len(releases)} releases (branch={branch}, channel={channel})") + + generate_html(entries) + print(f"Generated {HTML_FILE}") + + +def generate_html(entries): + """Build a static HTML page from announcement entries.""" + os.makedirs(DOCS_DIR, exist_ok=True) + + # Collect available languages and channels from data + langs = sorted({e["lang"] for e in entries if e["lang"]}) + data_channels = {e["channel"] for e in entries if e["channel"]} + channels = [ch for ch in CHANNEL_LABELS if ch in data_channels] + + data_json = json.dumps(entries, ensure_ascii=False) + + with open(HTML_FILE, "w", encoding="utf-8") as f: + f.write(_html_template(data_json, langs, channels)) + + +CHANNEL_LABELS = { + "rel": {"en": "Stable", "zh": "稳定版"}, + "beta": {"en": "Beta", "zh": "测试版"}, + "preview": {"en": "Preview", "zh": "预览版"}, + "main": {"en": "Super Preview", "zh": "超级前瞻版"}, +} + +CHANNEL_COLORS = { + "rel": "#4caf50", + "beta": "#ff9800", + "preview": "#f44336", + "main": "#e40336", +} + +LANG_LABELS = { + "schinese": "简体中文", + "tchinese": "繁體中文", + "english": "English", + "japanese": "日本語", + "koreana": "한국어", +} + + +def _html_template(data_json, langs, channels): + # Build channel tab HTML + channel_tabs = "" + for ch in channels: + label_en = CHANNEL_LABELS.get(ch, {}).get("en", ch) + label_zh = CHANNEL_LABELS.get(ch, {}).get("zh", ch) + color = CHANNEL_COLORS.get(ch, "#9e9e9e") + channel_tabs += ( + f'<button class="tab" data-channel="{ch}" ' + f'data-label-en="{label_en}" data-label-zh="{label_zh}" ' + f'style="--ch-color:{color}">{label_zh}</button>\n' + ) + + # Build language option HTML + lang_options = "" + for lang in langs: + label = LANG_LABELS.get(lang, lang) + lang_options += ( + f'<option value="{lang}" data-label-en="{label}" ' + f'data-label-zh="{label}">{label}</option>\n' + ) + + return f'''<!DOCTYPE html> +<html lang="zh"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<title>SkorionOS Updates</title> +<style> +*{{margin:0;padding:0;box-sizing:border-box}} +body{{background:#0f1923;color:#c7d5e0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;line-height:1.6;min-height:100vh}} +.container{{max-width:720px;margin:0 auto;padding:24px 16px}} +header{{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:24px}} +h1{{font-size:1.5rem;color:#fff;font-weight:700;letter-spacing:.5px}} +.lang-wrap{{display:flex;align-items:center;gap:6px;background:#1b2838;border:1px solid #2a475e;border-radius:6px;padding:4px 8px}} +.lang-wrap:focus-within{{border-color:#66c0f4}} +.lang-icon{{color:#8f98a0;flex-shrink:0}} +.lang-select{{background:transparent;color:#c7d5e0;border:none;font-size:.85rem;cursor:pointer;outline:none}} +.tabs{{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap}} +.tab{{background:transparent;color:#8f98a0;border:1px solid #2a475e;border-radius:20px;padding:6px 16px;font-size:.85rem;cursor:pointer;transition:all .2s}} +.tab:hover{{border-color:#66c0f4;color:#c7d5e0}} +.tab.active{{background:var(--ch-color,#66c0f4);color:#fff;border-color:var(--ch-color,#66c0f4)}} +.tab[data-channel="all"]{{--ch-color:#66c0f4}} +.cards{{display:flex;flex-direction:column;gap:16px}} +.card{{background:#1b2838;border:1px solid #2a475e;border-radius:10px;padding:20px;transition:border-color .2s}} +.card:hover{{border-color:#66c0f4}} +.card-header{{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}} +.card-title{{font-size:1.1rem;color:#fff;font-weight:600}} +.badge{{font-size:.75rem;padding:2px 10px;border-radius:10px;color:#fff;font-weight:500;white-space:nowrap}} +.card-date{{font-size:.8rem;color:#8f98a0;margin-left:auto}} +.card-body{{color:#acb2b8;font-size:.9rem}} +.card-body strong{{color:#c7d5e0}} +.card-body ul,.card-body ol{{padding-left:20px;margin:6px 0}} +.card-body li{{margin:3px 0}} +.card-body p{{margin:6px 0}} +.card-body a{{color:#66c0f4;text-decoration:none}} +.card-body a:hover{{text-decoration:underline}} +.card-body table{{border-collapse:collapse;margin:8px 0;width:100%}} +.card-body th,.card-body td{{border:1px solid #2a475e;padding:6px 12px;text-align:left}} +.card-body th{{background:#1e2a3a;color:#c7d5e0;font-weight:600}} +.empty{{text-align:center;color:#8f98a0;padding:40px 0;font-size:.95rem}} +footer{{text-align:center;color:#4a5568;font-size:.75rem;margin-top:40px;padding:20px 0;border-top:1px solid #1b2838}} +</style> +</head> +<body> +<div class="container"> +<header> + <h1>SkorionOS Updates</h1> + <div class="lang-wrap"><svg class="lang-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z"/></svg><select class="lang-select" id="langSelect"> + <option value="all" data-label-en="All Languages" data-label-zh="所有语言">所有语言</option> + {lang_options} + </select></div> +</header> +<div class="tabs" id="tabs"> + <button class="tab active" data-channel="all" data-label-en="All" data-label-zh="全部" style="--ch-color:#66c0f4">全部</button> + {channel_tabs} +</div> +<div class="cards" id="cards"></div> +<div class="empty" id="empty" style="display:none">No announcements / 暂无公告</div> +<footer>SkorionOS © 2026</footer> +</div> +<script> +var DATA={data_json}; +var CHANNEL_LABELS={json.dumps(CHANNEL_LABELS, ensure_ascii=False)}; +var LANG_LABELS={json.dumps(LANG_LABELS, ensure_ascii=False)}; +var BROWSER_LANG_MAP={{ + "zh":"schinese","zh-cn":"schinese","zh-hans":"schinese", + "zh-tw":"tchinese","zh-hk":"tchinese","zh-hant":"tchinese", + "en":"english","ja":"japanese","ko":"koreana", + "de":"german","fr":"french","es":"spanish","pt":"portuguese", + "pt-br":"brazilian","ru":"russian","it":"italian","nl":"dutch", + "pl":"polish","tr":"turkish","vi":"vietnamese","th":"thai", + "sv":"swedish","fi":"finnish","da":"danish","nb":"norwegian","no":"norwegian", + "hu":"hungarian","cs":"czech","ro":"romanian","bg":"bulgarian", + "el":"greek","uk":"ukrainian","id":"indonesian","ms":"indonesian" +}}; +var AVAILABLE_LANGS={{}}; +for(var i=0;i<DATA.length;i++) if(DATA[i].lang) AVAILABLE_LANGS[DATA[i].lang]=1; + +function detectBrowserLang(){{ + var langs=navigator.languages||[navigator.language||""]; + for(var i=0;i<langs.length;i++){{ + var tag=langs[i].toLowerCase(); + if(tag.startsWith("zh")) return "zh"; + }} + return "en"; +}} + +function detectContentLang(){{ + var langs=navigator.languages||[navigator.language||""]; + for(var i=0;i<langs.length;i++){{ + var tag=langs[i].toLowerCase(); + var match=BROWSER_LANG_MAP[tag]||BROWSER_LANG_MAP[tag.split("-")[0]]; + if(match&&AVAILABLE_LANGS[match]) return match; + }} + return "all"; +}} + +var curChannel="all",curLang=detectContentLang(); +document.getElementById("langSelect").value=curLang; + +var ZH_LANGS={{"schinese":1,"tchinese":1}}; +function getUILang(){{ + if(curLang==="all") return detectBrowserLang(); + return ZH_LANGS[curLang]?"zh":"en"; +}} + +function chLabel(labels){{var ui=getUILang();return ui==="zh"?(labels.zh||labels.en||""):(labels.en||labels.zh||"");}} + +function updateUILang(){{ + var ui=getUILang(); + document.querySelectorAll(".tab").forEach(function(t){{ + var en=t.dataset.labelEn,zh=t.dataset.labelZh; + t.textContent=ui==="zh"?(zh||en):(en||zh); + }}); + var sel=document.getElementById("langSelect"); + for(var i=0;i<sel.options.length;i++){{ + var o=sel.options[i]; + if(o.dataset.labelEn) o.textContent=ui==="zh"?(o.dataset.labelZh||o.dataset.labelEn):(o.dataset.labelEn||o.dataset.labelZh); + }} +}} +updateUILang(); + +function render(){{ + var cards=document.getElementById("cards"); + cards.innerHTML=""; + var count=0; + for(var i=0;i<DATA.length;i++){{ + var e=DATA[i]; + if(curChannel!=="all"&&e.channel!==curChannel) continue; + if(curLang!=="all"&&e.lang&&e.lang!==curLang) continue; + count++; + var ch=e.channel||""; + var labels=CHANNEL_LABELS[ch]||{{}}; + var labelText=chLabel(labels)||ch; + var color={json.dumps(CHANNEL_COLORS)}; + var c=document.createElement("div"); + c.className="card"; + c.innerHTML='<div class="card-header">' + +'<span class="card-title">'+esc(e.title)+'</span>' + +(ch?'<span class="badge" style="background:'+(color[ch]||"#9e9e9e")+'">'+esc(labelText)+'</span>':'') + +'<span class="card-date">'+esc(e.date.split(" ")[0])+'</span>' + +'</div>' + +'<div class="card-body">'+e.html_body+'</div>'; + cards.appendChild(c); + }} + document.getElementById("empty").style.display=count?"none":"block"; +}} + +function esc(s){{var d=document.createElement("span");d.textContent=s;return d.innerHTML;}} + +document.getElementById("tabs").addEventListener("click",function(ev){{ + var btn=ev.target.closest(".tab"); + if(!btn) return; + curChannel=btn.dataset.channel; + document.querySelectorAll(".tab").forEach(function(t){{t.classList.remove("active")}}); + btn.classList.add("active"); + render(); +}}); + +document.getElementById("langSelect").addEventListener("change",function(){{ + curLang=this.value; + updateUILang(); + render(); +}}); + +render(); +</script> +</body> +</html>''' + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/build-announcements.yml b/.github/workflows/build-announcements.yml new file mode 100644 index 0000000..17c2246 --- /dev/null +++ b/.github/workflows/build-announcements.yml @@ -0,0 +1,62 @@ +name: Build announcements.json + +on: + schedule: + - cron: '17 * * * *' + repository_dispatch: + types: [build-announcements] + workflow_dispatch: + inputs: + branch: + description: Target branch + required: true + type: choice + options: + - stable + - testing + - unstable + +permissions: + contents: write + +concurrency: + group: build-announcements-${{ github.event.client_payload.branch || github.event.inputs.branch }} + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Resolve target branch + id: target + env: + DISPATCH_BRANCH: ${{ github.event.client_payload.branch }} + INPUT_BRANCH: ${{ github.event.inputs.branch }} + run: | + BRANCH="${DISPATCH_BRANCH:-${INPUT_BRANCH:-stable}}" + case "$BRANCH" in + stable|testing|unstable) ;; + *) echo "::error::invalid or missing branch: '$BRANCH'"; exit 1 ;; + esac + echo "branch=$BRANCH" >> "$GITHUB_OUTPUT" + + - uses: actions/checkout@v4 + with: + ref: ${{ steps.target.outputs.branch }} + + - name: Build announcements.json + run: python3 .github/scripts/build-announcements.py + env: + RELEASE_BRANCH: ${{ steps.target.outputs.branch }} + SOURCE_REPO: AeroCore-IO/AeroCore-OS + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TZ: UTC + + - name: Commit if changed + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add announcements.json docs/ + git diff --cached --quiet || git commit -m "chore: rebuild game mode announcements" -m "Refresh Steam update notes from AeroCore OS releases." + git pull --rebase + git push @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 SkorionOS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a883dd --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# AeroCore OS Game Mode News + +Public update announcements for AeroCore OS, following the approach of +[Bazzite Game Mode News](https://github.com/ublue-os/bazzite-gamemode-news). diff --git a/announcements.json b/announcements.json new file mode 100644 index 0000000..1c279d6 --- /dev/null +++ b/announcements.json @@ -0,0 +1,42 @@ +[ + { + "title": "44.20261016.1", + "date": "2026-10-16 01:55", + "timestamp": 1792115753, + "channel": "rel", + "lang": "english", + "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.82.0-2.fc44 |\n| **Kernel** | 7.2.9-201.fc44 |\n| **Firmware** | 20260916-1.fc44 |\n| **Mesa** | 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-8.fc44 |\n| **KDE** | 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [5725363](https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c) | Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32 | Tranch |\n| [8f10d7f](https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416) | chore: refresh release CI actions | tranch |", + "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c]5725363[/url][/td][td]Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416]8f10d7f[/url][/td][td]chore: refresh release CI actions[/td][td]tranch[/td][/tr]\n[/table]", + "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c\" target=\"_blank\" rel=\"noopener\">5725363</a></td><td>Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416\" target=\"_blank\" rel=\"noopener\">8f10d7f</a></td><td>chore: refresh release CI actions</td><td>tranch</td></tr>\n</table>" + }, + { + "title": "44.20261016", + "date": "2026-10-16 00:25", + "timestamp": 1792110326, + "channel": "rel", + "lang": "english", + "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.82.0-2.fc44 |\n| **Kernel** | 7.2.9-201.fc44 |\n| **Firmware** | 20260916-1.fc44 |\n| **Mesa** | 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-8.fc44 |\n| **KDE** | 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [ea5df62](https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e) | Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2 | Tranch |\n| [b9a728b](https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd) | chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2 | dependabot[bot] |", + "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e]ea5df62[/url][/td][td]Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd]b9a728b[/url][/td][td]chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2[/td][td]dependabot[bot][/td][/tr]\n[/table]", + "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e\" target=\"_blank\" rel=\"noopener\">ea5df62</a></td><td>Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd\" target=\"_blank\" rel=\"noopener\">b9a728b</a></td><td>chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2</td><td>dependabot[bot]</td></tr>\n</table>" + }, + { + "title": "44.20261015", + "date": "2026-10-15 18:02", + "timestamp": 1792087349, + "channel": "rel", + "lang": "english", + "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.79.0-4.fc44 ➡️ 0.82.0-2.fc44 |\n| **Kernel** | 7.1.13-200.fc44 ➡️ 7.2.9-201.fc44 |\n| **Firmware** | 20260810-1.fc44 ➡️ 20260916-1.fc44 |\n| **Mesa** | 1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-4.fc44 ➡️ 0.46.1-8.fc44 |\n| **KDE** | 6.7.4-1.fc44 ➡️ 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.3-1.fc44 ➡️ 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [6c001a9](https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26) | Merge pull request #33 from AeroCore-IO/testing | Tranch |\n| [3fbfb2b](https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad) | Merge branch 'main' into testing | Tranch |\n| [0891c70](https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181) | fix: tolerate unavailable changelog revisions | tranch |\n| [f7c0955](https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521) | chore: align testing with Bazzite 44.20261012 | tranch |\n| [9fcb843](https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b) | fix: correct release commits section | tranch |\n| [3f7496d](https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde) | Align Live and installer ISO commands | tranch |\n| [01f191a](https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555) | Align Live and installer ISO commands | tranch |\n| [fa7a54f](https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68) | build: update Bazzite base to 44.20260921 | tranch |\n| [a2c9b4a](https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e) | feat: organize upstream release notes | tranch |\n| [0134725](https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba) | fix: fall back to anonymous release downloads | tranch |\n| [f513797](https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d) | fix: adapt instruments release layout | tranch |\n| [d571c3d](https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802) | build: Update base image tag | tranch |\n| [dd9d8b8](https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d) | Pin testing base to Bazzite 44.20260919 | tranch |", + "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.79.0-4.fc44 ➡️ 0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.1.13-200.fc44 ➡️ 7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260810-1.fc44 ➡️ 20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-4.fc44 ➡️ 0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.4-1.fc44 ➡️ 6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.3-1.fc44 ➡️ 0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26]6c001a9[/url][/td][td]Merge pull request #33 from AeroCore-IO/testing[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad]3fbfb2b[/url][/td][td]Merge branch 'main' into testing[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181]0891c70[/url][/td][td]fix: tolerate unavailable changelog revisions[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521]f7c0955[/url][/td][td]chore: align testing with Bazzite 44.20261012[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b]9fcb843[/url][/td][td]fix: correct release commits section[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde]3f7496d[/url][/td][td]Align Live and installer ISO commands[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555]01f191a[/url][/td][td]Align Live and installer ISO commands[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68]fa7a54f[/url][/td][td]build: update Bazzite base to 44.20260921[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e]a2c9b4a[/url][/td][td]feat: organize upstream release notes[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba]0134725[/url][/td][td]fix: fall back to anonymous release downloads[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d]f513797[/url][/td][td]fix: adapt instruments release layout[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802]d571c3d[/url][/td][td]build: Update base image tag[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d]dd9d8b8[/url][/td][td]Pin testing base to Bazzite 44.20260919[/td][td]tranch[/td][/tr]\n[/table]", + "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.79.0-4.fc44 ➡️ 0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.1.13-200.fc44 ➡️ 7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260810-1.fc44 ➡️ 20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-4.fc44 ➡️ 0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.4-1.fc44 ➡️ 6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.3-1.fc44 ➡️ 0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26\" target=\"_blank\" rel=\"noopener\">6c001a9</a></td><td>Merge pull request #33 from AeroCore-IO/testing</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad\" target=\"_blank\" rel=\"noopener\">3fbfb2b</a></td><td>Merge branch 'main' into testing</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181\" target=\"_blank\" rel=\"noopener\">0891c70</a></td><td>fix: tolerate unavailable changelog revisions</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521\" target=\"_blank\" rel=\"noopener\">f7c0955</a></td><td>chore: align testing with Bazzite 44.20261012</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b\" target=\"_blank\" rel=\"noopener\">9fcb843</a></td><td>fix: correct release commits section</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde\" target=\"_blank\" rel=\"noopener\">3f7496d</a></td><td>Align Live and installer ISO commands</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555\" target=\"_blank\" rel=\"noopener\">01f191a</a></td><td>Align Live and installer ISO commands</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68\" target=\"_blank\" rel=\"noopener\">fa7a54f</a></td><td>build: update Bazzite base to 44.20260921</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e\" target=\"_blank\" rel=\"noopener\">a2c9b4a</a></td><td>feat: organize upstream release notes</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba\" target=\"_blank\" rel=\"noopener\">0134725</a></td><td>fix: fall back to anonymous release downloads</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d\" target=\"_blank\" rel=\"noopener\">f513797</a></td><td>fix: adapt instruments release layout</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802\" target=\"_blank\" rel=\"noopener\">d571c3d</a></td><td>build: Update base image tag</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d\" target=\"_blank\" rel=\"noopener\">dd9d8b8</a></td><td>Pin testing base to Bazzite 44.20260919</td><td>tranch</td></tr>\n</table>" + }, + { + "title": "44.20260913.1", + "date": "2026-09-13 16:40", + "timestamp": 1789317620, + "channel": "rel", + "lang": "english", + "body": "### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| [a6a2705](https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12) | fix release changelog for unrelated histories | tranch |", + "bbcode_body": "[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12]a6a2705[/url][/td][td]fix release changelog for unrelated histories[/td][td]tranch[/td][/tr]\n[/table]", + "html_body": "<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12\" target=\"_blank\" rel=\"noopener\">a6a2705</a></td><td>fix release changelog for unrelated histories</td><td>tranch</td></tr>\n</table>" + } +] diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..7151790 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,170 @@ +<!DOCTYPE html> +<html lang="zh"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<title>SkorionOS Updates</title> +<style> +*{margin:0;padding:0;box-sizing:border-box} +body{background:#0f1923;color:#c7d5e0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;line-height:1.6;min-height:100vh} +.container{max-width:720px;margin:0 auto;padding:24px 16px} +header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:24px} +h1{font-size:1.5rem;color:#fff;font-weight:700;letter-spacing:.5px} +.lang-wrap{display:flex;align-items:center;gap:6px;background:#1b2838;border:1px solid #2a475e;border-radius:6px;padding:4px 8px} +.lang-wrap:focus-within{border-color:#66c0f4} +.lang-icon{color:#8f98a0;flex-shrink:0} +.lang-select{background:transparent;color:#c7d5e0;border:none;font-size:.85rem;cursor:pointer;outline:none} +.tabs{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap} +.tab{background:transparent;color:#8f98a0;border:1px solid #2a475e;border-radius:20px;padding:6px 16px;font-size:.85rem;cursor:pointer;transition:all .2s} +.tab:hover{border-color:#66c0f4;color:#c7d5e0} +.tab.active{background:var(--ch-color,#66c0f4);color:#fff;border-color:var(--ch-color,#66c0f4)} +.tab[data-channel="all"]{--ch-color:#66c0f4} +.cards{display:flex;flex-direction:column;gap:16px} +.card{background:#1b2838;border:1px solid #2a475e;border-radius:10px;padding:20px;transition:border-color .2s} +.card:hover{border-color:#66c0f4} +.card-header{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap} +.card-title{font-size:1.1rem;color:#fff;font-weight:600} +.badge{font-size:.75rem;padding:2px 10px;border-radius:10px;color:#fff;font-weight:500;white-space:nowrap} +.card-date{font-size:.8rem;color:#8f98a0;margin-left:auto} +.card-body{color:#acb2b8;font-size:.9rem} +.card-body strong{color:#c7d5e0} +.card-body ul,.card-body ol{padding-left:20px;margin:6px 0} +.card-body li{margin:3px 0} +.card-body p{margin:6px 0} +.card-body a{color:#66c0f4;text-decoration:none} +.card-body a:hover{text-decoration:underline} +.card-body table{border-collapse:collapse;margin:8px 0;width:100%} +.card-body th,.card-body td{border:1px solid #2a475e;padding:6px 12px;text-align:left} +.card-body th{background:#1e2a3a;color:#c7d5e0;font-weight:600} +.empty{text-align:center;color:#8f98a0;padding:40px 0;font-size:.95rem} +footer{text-align:center;color:#4a5568;font-size:.75rem;margin-top:40px;padding:20px 0;border-top:1px solid #1b2838} +</style> +</head> +<body> +<div class="container"> +<header> + <h1>SkorionOS Updates</h1> + <div class="lang-wrap"><svg class="lang-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z"/></svg><select class="lang-select" id="langSelect"> + <option value="all" data-label-en="All Languages" data-label-zh="所有语言">所有语言</option> + <option value="english" data-label-en="English" data-label-zh="English">English</option> + + </select></div> +</header> +<div class="tabs" id="tabs"> + <button class="tab active" data-channel="all" data-label-en="All" data-label-zh="全部" style="--ch-color:#66c0f4">全部</button> + <button class="tab" data-channel="rel" data-label-en="Stable" data-label-zh="稳定版" style="--ch-color:#4caf50">稳定版</button> + +</div> +<div class="cards" id="cards"></div> +<div class="empty" id="empty" style="display:none">No announcements / 暂无公告</div> +<footer>SkorionOS © 2026</footer> +</div> +<script> +var DATA=[{"title": "44.20261016.1", "date": "2026-10-16 01:55", "timestamp": 1792115753, "channel": "rel", "lang": "english", "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.82.0-2.fc44 |\n| **Kernel** | 7.2.9-201.fc44 |\n| **Firmware** | 20260916-1.fc44 |\n| **Mesa** | 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-8.fc44 |\n| **KDE** | 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [5725363](https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c) | Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32 | Tranch |\n| [8f10d7f](https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416) | chore: refresh release CI actions | tranch |", "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c]5725363[/url][/td][td]Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416]8f10d7f[/url][/td][td]chore: refresh release CI actions[/td][td]tranch[/td][/tr]\n[/table]", "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/5725363f633c31a0f96e70f1400fba4958a4356c\" target=\"_blank\" rel=\"noopener\">5725363</a></td><td>Merge pull request #35 from AeroCore-IO/codex/ci-deps-28-32</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/8f10d7f76966f8de6dfe0a97c97f258b78f2a416\" target=\"_blank\" rel=\"noopener\">8f10d7f</a></td><td>chore: refresh release CI actions</td><td>tranch</td></tr>\n</table>"}, {"title": "44.20261016", "date": "2026-10-16 00:25", "timestamp": 1792110326, "channel": "rel", "lang": "english", "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.82.0-2.fc44 |\n| **Kernel** | 7.2.9-201.fc44 |\n| **Firmware** | 20260916-1.fc44 |\n| **Mesa** | 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-8.fc44 |\n| **KDE** | 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [ea5df62](https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e) | Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2 | Tranch |\n| [b9a728b](https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd) | chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2 | dependabot[bot] |", "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e]ea5df62[/url][/td][td]Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd]b9a728b[/url][/td][td]chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2[/td][td]dependabot[bot][/td][/tr]\n[/table]", "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/ea5df624eb09078dfad7408c7810408f92aad85e\" target=\"_blank\" rel=\"noopener\">ea5df62</a></td><td>Merge pull request #31 from AeroCore-IO/dependabot/github_actions/oras-project/setup-oras-2.0.2</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/b9a728bf0bd18b8bd45bbf7d022b4f0a6a24ffcd\" target=\"_blank\" rel=\"noopener\">b9a728b</a></td><td>chore(deps): bump oras-project/setup-oras from 2.0.1 to 2.0.2</td><td>dependabot[bot]</td></tr>\n</table>"}, {"title": "44.20261015", "date": "2026-10-15 18:02", "timestamp": 1792087349, "channel": "rel", "lang": "english", "body": "### Major packages\n\n| Name | Version |\n| --- | --- |\n| **Bazaar** | 0.9.3-4.fc44 |\n| **Distrobox** | 1.8.2.5-1.fc44 |\n| **Gamescope Session** | 0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44 |\n| **InputPlumber** | 0.79.0-4.fc44 ➡️ 0.82.0-2.fc44 |\n| **Kernel** | 7.1.13-200.fc44 ➡️ 7.2.9-201.fc44 |\n| **Firmware** | 20260810-1.fc44 ➡️ 20260916-1.fc44 |\n| **Mesa** | 1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44 |\n| **OpenGamepadUI** | 0.46.1-4.fc44 ➡️ 0.46.1-8.fc44 |\n| **KDE** | 6.7.4-1.fc44 ➡️ 6.7.5-1.fc44 |\n| **PowerStation** | 0.8.3-1.fc44 ➡️ 0.8.4-1.fc44 |\n| **UMU Launcher** | 1.4.4-1.fc44 |\n| **Waydroid** | 1.6.3-1.fc44 |\n\n### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **Upstream Bazzite** | Commit range unavailable (previous image may predate base image metadata) | — |\n| **AeroCore OS** | | |\n| [6c001a9](https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26) | Merge pull request #33 from AeroCore-IO/testing | Tranch |\n| [3fbfb2b](https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad) | Merge branch 'main' into testing | Tranch |\n| [0891c70](https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181) | fix: tolerate unavailable changelog revisions | tranch |\n| [f7c0955](https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521) | chore: align testing with Bazzite 44.20261012 | tranch |\n| [9fcb843](https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b) | fix: correct release commits section | tranch |\n| [3f7496d](https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde) | Align Live and installer ISO commands | tranch |\n| [01f191a](https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555) | Align Live and installer ISO commands | tranch |\n| [fa7a54f](https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68) | build: update Bazzite base to 44.20260921 | tranch |\n| [a2c9b4a](https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e) | feat: organize upstream release notes | tranch |\n| [0134725](https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba) | fix: fall back to anonymous release downloads | tranch |\n| [f513797](https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d) | fix: adapt instruments release layout | tranch |\n| [d571c3d](https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802) | build: Update base image tag | tranch |\n| [dd9d8b8](https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d) | Pin testing base to Bazzite 44.20260919 | tranch |", "bbcode_body": "[h3]Major packages[/h3]\n\n[table]\n[tr][th]Name[/th][th]Version[/th][/tr]\n[tr][td][b]Bazaar[/b][/td][td]0.9.3-4.fc44[/td][/tr]\n[tr][td][b]Distrobox[/b][/td][td]1.8.2.5-1.fc44[/td][/tr]\n[tr][td][b]Gamescope Session[/b][/td][td]0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44[/td][/tr]\n[tr][td][b]InputPlumber[/b][/td][td]0.79.0-4.fc44 ➡️ 0.82.0-2.fc44[/td][/tr]\n[tr][td][b]Kernel[/b][/td][td]7.1.13-200.fc44 ➡️ 7.2.9-201.fc44[/td][/tr]\n[tr][td][b]Firmware[/b][/td][td]20260810-1.fc44 ➡️ 20260916-1.fc44[/td][/tr]\n[tr][td][b]Mesa[/b][/td][td]1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44[/td][/tr]\n[tr][td][b]OpenGamepadUI[/b][/td][td]0.46.1-4.fc44 ➡️ 0.46.1-8.fc44[/td][/tr]\n[tr][td][b]KDE[/b][/td][td]6.7.4-1.fc44 ➡️ 6.7.5-1.fc44[/td][/tr]\n[tr][td][b]PowerStation[/b][/td][td]0.8.3-1.fc44 ➡️ 0.8.4-1.fc44[/td][/tr]\n[tr][td][b]UMU Launcher[/b][/td][td]1.4.4-1.fc44[/td][/tr]\n[tr][td][b]Waydroid[/b][/td][td]1.6.3-1.fc44[/td][/tr]\n[/table]\n\n[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][b]Upstream Bazzite[/b][/td][td]Commit range unavailable (previous image may predate base image metadata)[/td][td]—[/td][/tr]\n[tr][td][b]AeroCore OS[/b][/td][td][/td][td][/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26]6c001a9[/url][/td][td]Merge pull request #33 from AeroCore-IO/testing[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad]3fbfb2b[/url][/td][td]Merge branch 'main' into testing[/td][td]Tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181]0891c70[/url][/td][td]fix: tolerate unavailable changelog revisions[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521]f7c0955[/url][/td][td]chore: align testing with Bazzite 44.20261012[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b]9fcb843[/url][/td][td]fix: correct release commits section[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde]3f7496d[/url][/td][td]Align Live and installer ISO commands[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555]01f191a[/url][/td][td]Align Live and installer ISO commands[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68]fa7a54f[/url][/td][td]build: update Bazzite base to 44.20260921[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e]a2c9b4a[/url][/td][td]feat: organize upstream release notes[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba]0134725[/url][/td][td]fix: fall back to anonymous release downloads[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d]f513797[/url][/td][td]fix: adapt instruments release layout[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802]d571c3d[/url][/td][td]build: Update base image tag[/td][td]tranch[/td][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d]dd9d8b8[/url][/td][td]Pin testing base to Bazzite 44.20260919[/td][td]tranch[/td][/tr]\n[/table]", "html_body": "<h3>Major packages</h3>\n\n<table>\n<tr><th>Name</th><th>Version</th></tr>\n<tr><td><strong>Bazaar</strong></td><td>0.9.3-4.fc44</td></tr>\n<tr><td><strong>Distrobox</strong></td><td>1.8.2.5-1.fc44</td></tr>\n<tr><td><strong>Gamescope Session</strong></td><td>0~20260905git.1ddd3a9-1.fc44 ➡️ 0~20261002git.08e65a6-1.fc44</td></tr>\n<tr><td><strong>InputPlumber</strong></td><td>0.79.0-4.fc44 ➡️ 0.82.0-2.fc44</td></tr>\n<tr><td><strong>Kernel</strong></td><td>7.1.13-200.fc44 ➡️ 7.2.9-201.fc44</td></tr>\n<tr><td><strong>Firmware</strong></td><td>20260810-1.fc44 ➡️ 20260916-1.fc44</td></tr>\n<tr><td><strong>Mesa</strong></td><td>1:26.2.2-1.fc44 ➡️ 1:26.2.4-1.fc44</td></tr>\n<tr><td><strong>OpenGamepadUI</strong></td><td>0.46.1-4.fc44 ➡️ 0.46.1-8.fc44</td></tr>\n<tr><td><strong>KDE</strong></td><td>6.7.4-1.fc44 ➡️ 6.7.5-1.fc44</td></tr>\n<tr><td><strong>PowerStation</strong></td><td>0.8.3-1.fc44 ➡️ 0.8.4-1.fc44</td></tr>\n<tr><td><strong>UMU Launcher</strong></td><td>1.4.4-1.fc44</td></tr>\n<tr><td><strong>Waydroid</strong></td><td>1.6.3-1.fc44</td></tr>\n</table>\n\n<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><strong>Upstream Bazzite</strong></td><td>Commit range unavailable (previous image may predate base image metadata)</td><td>—</td></tr>\n<tr><td><strong>AeroCore OS</strong></td><td></td><td></td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/6c001a951ae122b34c86eefcd9abc8f3a1e32a26\" target=\"_blank\" rel=\"noopener\">6c001a9</a></td><td>Merge pull request #33 from AeroCore-IO/testing</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/3fbfb2bd4bb5e27509e8697018cddd105fca8dad\" target=\"_blank\" rel=\"noopener\">3fbfb2b</a></td><td>Merge branch 'main' into testing</td><td>Tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/0891c70f559c7d23a306290334388853ff317181\" target=\"_blank\" rel=\"noopener\">0891c70</a></td><td>fix: tolerate unavailable changelog revisions</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/f7c095592475d22e6d1d263b988c8a7974882521\" target=\"_blank\" rel=\"noopener\">f7c0955</a></td><td>chore: align testing with Bazzite 44.20261012</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/9fcb843f225e9618155a6b9228006859e91f7f0b\" target=\"_blank\" rel=\"noopener\">9fcb843</a></td><td>fix: correct release commits section</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/3f7496d580f185c0974c5edc107570c471d0cdde\" target=\"_blank\" rel=\"noopener\">3f7496d</a></td><td>Align Live and installer ISO commands</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/01f191a5e2e3ca5ac6884b09f6ffcbfd5094f555\" target=\"_blank\" rel=\"noopener\">01f191a</a></td><td>Align Live and installer ISO commands</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/fa7a54f7d51f3086f35239d7117b9c5988a96c68\" target=\"_blank\" rel=\"noopener\">fa7a54f</a></td><td>build: update Bazzite base to 44.20260921</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/a2c9b4aa17b0c28d0f0d34de13fe14f35c3da39e\" target=\"_blank\" rel=\"noopener\">a2c9b4a</a></td><td>feat: organize upstream release notes</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/0134725c60a6ef58c270fe7c5ac17e07521c09ba\" target=\"_blank\" rel=\"noopener\">0134725</a></td><td>fix: fall back to anonymous release downloads</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/f51379753a1474154760fb8cef295dd8ec4c984d\" target=\"_blank\" rel=\"noopener\">f513797</a></td><td>fix: adapt instruments release layout</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/d571c3ddf55118e35f4cf5a567a52249e0a9a802\" target=\"_blank\" rel=\"noopener\">d571c3d</a></td><td>build: Update base image tag</td><td>tranch</td></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/dd9d8b89e8bb28eac34654536525916deddd9a9d\" target=\"_blank\" rel=\"noopener\">dd9d8b8</a></td><td>Pin testing base to Bazzite 44.20260919</td><td>tranch</td></tr>\n</table>"}, {"title": "44.20260913.1", "date": "2026-09-13 16:40", "timestamp": 1789317620, "channel": "rel", "lang": "english", "body": "### Commits\n\n| Hash | Subject | Author |\n| --- | --- | --- |\n| [a6a2705](https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12) | fix release changelog for unrelated histories | tranch |", "bbcode_body": "[h3]Commits[/h3]\n\n[table]\n[tr][th]Hash[/th][th]Subject[/th][th]Author[/th][/tr]\n[tr][td][url=https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12]a6a2705[/url][/td][td]fix release changelog for unrelated histories[/td][td]tranch[/td][/tr]\n[/table]", "html_body": "<h3>Commits</h3>\n\n<table>\n<tr><th>Hash</th><th>Subject</th><th>Author</th></tr>\n<tr><td><a href=\"https://github.com/AeroCore-IO/AeroCore-OS/commit/a6a27050efa50c444816905a4c628adc68e8dd12\" target=\"_blank\" rel=\"noopener\">a6a2705</a></td><td>fix release changelog for unrelated histories</td><td>tranch</td></tr>\n</table>"}]; +var CHANNEL_LABELS={"rel": {"en": "Stable", "zh": "稳定版"}, "beta": {"en": "Beta", "zh": "测试版"}, "preview": {"en": "Preview", "zh": "预览版"}, "main": {"en": "Super Preview", "zh": "超级前瞻版"}}; +var LANG_LABELS={"schinese": "简体中文", "tchinese": "繁體中文", "english": "English", "japanese": "日本語", "koreana": "한국어"}; +var BROWSER_LANG_MAP={ + "zh":"schinese","zh-cn":"schinese","zh-hans":"schinese", + "zh-tw":"tchinese","zh-hk":"tchinese","zh-hant":"tchinese", + "en":"english","ja":"japanese","ko":"koreana", + "de":"german","fr":"french","es":"spanish","pt":"portuguese", + "pt-br":"brazilian","ru":"russian","it":"italian","nl":"dutch", + "pl":"polish","tr":"turkish","vi":"vietnamese","th":"thai", + "sv":"swedish","fi":"finnish","da":"danish","nb":"norwegian","no":"norwegian", + "hu":"hungarian","cs":"czech","ro":"romanian","bg":"bulgarian", + "el":"greek","uk":"ukrainian","id":"indonesian","ms":"indonesian" +}; +var AVAILABLE_LANGS={}; +for(var i=0;i<DATA.length;i++) if(DATA[i].lang) AVAILABLE_LANGS[DATA[i].lang]=1; + +function detectBrowserLang(){ + var langs=navigator.languages||[navigator.language||""]; + for(var i=0;i<langs.length;i++){ + var tag=langs[i].toLowerCase(); + if(tag.startsWith("zh")) return "zh"; + } + return "en"; +} + +function detectContentLang(){ + var langs=navigator.languages||[navigator.language||""]; + for(var i=0;i<langs.length;i++){ + var tag=langs[i].toLowerCase(); + var match=BROWSER_LANG_MAP[tag]||BROWSER_LANG_MAP[tag.split("-")[0]]; + if(match&&AVAILABLE_LANGS[match]) return match; + } + return "all"; +} + +var curChannel="all",curLang=detectContentLang(); +document.getElementById("langSelect").value=curLang; + +var ZH_LANGS={"schinese":1,"tchinese":1}; +function getUILang(){ + if(curLang==="all") return detectBrowserLang(); + return ZH_LANGS[curLang]?"zh":"en"; +} + +function chLabel(labels){var ui=getUILang();return ui==="zh"?(labels.zh||labels.en||""):(labels.en||labels.zh||"");} + +function updateUILang(){ + var ui=getUILang(); + document.querySelectorAll(".tab").forEach(function(t){ + var en=t.dataset.labelEn,zh=t.dataset.labelZh; + t.textContent=ui==="zh"?(zh||en):(en||zh); + }); + var sel=document.getElementById("langSelect"); + for(var i=0;i<sel.options.length;i++){ + var o=sel.options[i]; + if(o.dataset.labelEn) o.textContent=ui==="zh"?(o.dataset.labelZh||o.dataset.labelEn):(o.dataset.labelEn||o.dataset.labelZh); + } +} +updateUILang(); + +function render(){ + var cards=document.getElementById("cards"); + cards.innerHTML=""; + var count=0; + for(var i=0;i<DATA.length;i++){ + var e=DATA[i]; + if(curChannel!=="all"&&e.channel!==curChannel) continue; + if(curLang!=="all"&&e.lang&&e.lang!==curLang) continue; + count++; + var ch=e.channel||""; + var labels=CHANNEL_LABELS[ch]||{}; + var labelText=chLabel(labels)||ch; + var color={"rel": "#4caf50", "beta": "#ff9800", "preview": "#f44336", "main": "#e40336"}; + var c=document.createElement("div"); + c.className="card"; + c.innerHTML='<div class="card-header">' + +'<span class="card-title">'+esc(e.title)+'</span>' + +(ch?'<span class="badge" style="background:'+(color[ch]||"#9e9e9e")+'">'+esc(labelText)+'</span>':'') + +'<span class="card-date">'+esc(e.date.split(" ")[0])+'</span>' + +'</div>' + +'<div class="card-body">'+e.html_body+'</div>'; + cards.appendChild(c); + } + document.getElementById("empty").style.display=count?"none":"block"; +} + +function esc(s){var d=document.createElement("span");d.textContent=s;return d.innerHTML;} + +document.getElementById("tabs").addEventListener("click",function(ev){ + var btn=ev.target.closest(".tab"); + if(!btn) return; + curChannel=btn.dataset.channel; + document.querySelectorAll(".tab").forEach(function(t){t.classList.remove("active")}); + btn.classList.add("active"); + render(); +}); + +document.getElementById("langSelect").addEventListener("change",function(){ + curLang=this.value; + updateUILang(); + render(); +}); + +render(); +</script> +</body> +</html>
\ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..3744830 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,30 @@ +import importlib.util +import json +import os +import sys + +import pytest + +_ROOT = os.path.dirname(os.path.dirname(__file__)) +_SCRIPT = os.path.join(_ROOT, ".github", "scripts", "build-announcements.py") + + +@pytest.fixture(scope="session") +def mod(): + spec = importlib.util.spec_from_file_location("build_announcements", _SCRIPT) + module = importlib.util.module_from_spec(spec) + sys.modules["build_announcements"] = module + spec.loader.exec_module(module) + return module + + +@pytest.fixture(scope="session") +def releases(): + path = os.path.join(os.path.dirname(__file__), "fixtures", "bazzite-releases.json") + with open(path, encoding="utf-8") as f: + return json.load(f) + + +@pytest.fixture +def stable_release(releases): + return next(r for r in releases if not r["prerelease"]) diff --git a/tests/fixtures/bazzite-releases.json b/tests/fixtures/bazzite-releases.json new file mode 100644 index 0000000..0a18166 --- /dev/null +++ b/tests/fixtures/bazzite-releases.json @@ -0,0 +1 @@ +[{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/357182161","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/357182161/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/357182161/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260721","id":357182161,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VSirR","tag_name":"testing-44.20260721","target_commitish":"main","name":"testing-44.20260721: Testing (F44.20260721, #a3281c7)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-21T06:39:30Z","updated_at":"2026-07-21T07:45:45Z","published_at":"2026-07-21T07:45:45Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260721","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260721","body":"This is an automatically generated changelog for release `testing-44.20260721`.\n\nFrom previous `testing` version `testing-44.20260717.1` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 ➡️ 7.1.3-ogc5.1 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 ➡️ 26.1.5-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.1-1 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-4 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 ➡️ 6.7.3-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[a3281c7](https://github.com/ublue-os/bazzite/commit/a3281c7b6303c8a367334ff42557d365ce433d3a)** | chore(deps): update actions/checkout digest to 3d3c42e (#5267) | ubot-7274[bot] |\n| **[6f997b7](https://github.com/ublue-os/bazzite/commit/6f997b7c93e3df37012156f9b3c37c14c1c52c82)** | chore(deps): update actions/checkout action to v7.0.1 (#5268) | ubot-7274[bot] |\n| **[6196d63](https://github.com/ublue-os/bazzite/commit/6196d63356af67afc1a3ccbdb18e66ca2f660381)** | chore(Portal): Add comma in Waydroid description (#5259) | Crono |\n| **[7cf5fbf](https://github.com/ublue-os/bazzite/commit/7cf5fbfb378af99372f430a97d65ac0a8f25a41a)** | chore: Use our fork for the news source | Kyle Gospodnetich |\n| **[ebfa91b](https://github.com/ublue-os/bazzite/commit/ebfa91b52b5039e9ddab7ce0d34c948e03bb9f0b)** | feat: Add gamemode-news-hook package | Kyle Gospodnetich |\n| **[d7faf89](https://github.com/ublue-os/bazzite/commit/d7faf89463b80bfffdfe215bed77fc95c5634103)** | feat: Update kernel to 7.1.3-ogc5 | Kyle Gospodnetich |\n| **[d0dee68](https://github.com/ublue-os/bazzite/commit/d0dee687a1e7506798eab2c8ceee8de5afe07c52)** | fix: Set caps for kdeconnectd | Kyle Gospodnetich |\n| **[99186f6](https://github.com/ublue-os/bazzite/commit/99186f67cab19125ef2a821a58b92b45c7eaa5f5)** | chore: Correct path | Kyle Gospodnetich |\n| **[32d2ebd](https://github.com/ublue-os/bazzite/commit/32d2ebd925244f3b1921c5dd7d578571e8589bc9)** | chore: Always run bazzite-iwd-migration.service for now | Kyle Gospodnetich |\n| **[41be055](https://github.com/ublue-os/bazzite/commit/41be055c1f3ca81d589bb19ea3f8d4fc9da0e7ec)** | fix: Enable notifier for Nvidia Flatpak Runtime Mismatch (#5251) | Alex Shek |\n| **[12b3a5f](https://github.com/ublue-os/bazzite/commit/12b3a5f491bd9fb9905caf08c88650a63d5395da)** | chore: Update bluez to 5.87 | Kyle Gospodnetich |\n| **[a98bb09](https://github.com/ublue-os/bazzite/commit/a98bb09afe8583951ea2257f010f11b635a153ba)** | chore: Add mangohud spec | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | ImageMagick | 7.1.2.13-2 | 7.1.2.27-1 |\n| 🔄 | LibRaw | 0.22.1-1 | 0.22.2-1 |\n| 🔄 | bluez | 5.86-2.bazzite.0.0.git.7579.e8f355ea | 5.87-2.bazzite.0.0.git.7950.32d2ebd9.dirty.3sl9q6 |\n| 🔄 | bootc | 1.15.2-1 | 1.16.4-1 |\n| 🔄 | cosign | 3.1.1-1 | 3.1.2-1 |\n| 🔄 | freerdp | 3.27.1-1 | 3.30.0-1 |\n| 🔄 | ibus | 1.5.34-2 | 1.5.34-4 |\n| 🔄 | kernel-tools | 7.1.3-201 | 7.1.4-200 |\n| 🔄 | less | 702-1 | 704-2 |\n| 🔄 | libnfsidmap | 2.8.7-5 | 2.8.7-6 |\n| 🔄 | libseccomp | 2.6.0-3 | 2.6.1-2 |\n| 🔄 | libtiff | 4.7.1-2 | 4.7.2-1 |\n| 🔄 | libuv | 1.51.0-3 | 1.52.1-2 |\n| 🔄 | mangohud | 0.8.3~rc1-2 | 0.8.4-1 |\n| 🔄 | openssh | 10.2p1-12 | 10.2p1-13 |\n| 🔄 | openssl | 3.5.7-1 | 3.5.7-2 |\n| 🔄 | passt | 0^20260611.ga9c61ff-1 | 0^20260716.g090d739-2 |\n| 🔄 | python-cryptography | 48.0.0-1 | 49.0.0-1 |\n| 🔄 | python3-boto3 | 1.43.44-1 | 1.43.50-1 |\n| 🔄 | python3-s3transfer | 0.19.0-1 | 0.19.1-1 |\n| 🔄 | qt6-qtdeclarative | 6.11.1-2 | 6.11.1-3 |\n| 🔄 | rpm-sequoia | 1.10.2-2 | 1.10.2-4 |\n| 🔄 | rsync | 3.4.1-7 | 3.4.4-1 |\n| 🔄 | vim | 9.2.780-1 | 9.2.782-1 |\n| 🔄 | virtualbox-guest-additions | 7.2.8-1 | 7.2.12-1 |\n| 🔄 | webapp-manager | master.mint22-1 | master.mint22-2 |\n| 🔄 | wlroots | 0.20.1-1 | 0.20.2-1 |\n| ❌ | kmod-sc0710 | 0^20260711git.b6ef85d-1 | |\n\n### Deck Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | gamemode-news-hook | | 1.4.0-1 |\n| 🔄 | mbedtls | 3.6.6-2 | 3.6.7-1 |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | gdb | 17.2-1 | 17.2-2 |\n| 🔄 | gpsd | 3.27.5-3 | 3.27.5-5 |\n| 🔄 | ibus-panel | 1.5.34-2 | 1.5.34-4 |\n| 🔄 | libtiff-devel | 4.7.1-2 | 4.7.2-1 |\n| 🔄 | m17n-db-devel | 1.8.13-1 | 1.8.14-1 |\n| 🔄 | mariadb-connector-c | 3.4.9-1 | 3.4.9-2 |\n| ❌ | plasma-discover | 6.7.2-1 | |\n\n### Gnome Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | NetworkManager-ssh | 1.4.5-1 | 1.4.5-2 |\n| 🔄 | ibus-gtk2 | 1.5.34-2 | 1.5.34-4 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260721\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/355514445","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/355514445/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/355514445/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260717.1","id":355514445,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VMLhN","tag_name":"testing-44.20260717.1","target_commitish":"main","name":"testing-44.20260717.1: Testing (F44.20260717, #a98bb09)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-16T18:08:17Z","updated_at":"2026-07-17T06:45:40Z","published_at":"2026-07-17T06:45:40Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260717.1","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260717.1","body":"This is an automatically generated changelog for release `testing-44.20260717.1`.\n\nFrom previous `testing` version `testing-44.20260717` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.1-1 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-4 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[a98bb09](https://github.com/ublue-os/bazzite/commit/a98bb09afe8583951ea2257f010f11b635a153ba)** | chore: Add mangohud spec | Kyle Gospodnetich |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | perl-HTTP-Date | 6.06-8 | 6.08-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260717.1\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/355432076","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/355432076/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/355432076/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260717","id":355432076,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VL3aM","tag_name":"testing-44.20260717","target_commitish":"main","name":"testing-44.20260717: Testing (F44.20260717, #e3b00ac)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-16T18:08:17Z","updated_at":"2026-07-17T01:48:07Z","published_at":"2026-07-17T01:48:07Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260717","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260717","body":"This is an automatically generated changelog for release `testing-44.20260717`.\n\nFrom previous `testing` version `testing-44.20260715` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.1-1 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 ➡️ 0~20260528.git37d1cb6-4 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[e3b00ac](https://github.com/ublue-os/bazzite/commit/e3b00aca29776f80aeba24254778d063aae3ad07)** | Revert \"chore: remove ppfeaturemask karg setup\" | Kyle Gospodnetich |\n| **[cb02688](https://github.com/ublue-os/bazzite/commit/cb026883922f794138683ae051cf76162837aba8)** | feat: Add notifier for Nvidia Flatpak Runtime Mismatch (#5242) | Alex Shek |\n| **[34c4155](https://github.com/ublue-os/bazzite/commit/34c415566f9b39d4b1d49bb85b2423374b5d98d0)** | chore(deps): update github/codeql-action digest to 7188fc3 (#5246) | ubot-7274[bot] |\n| **[93cd131](https://github.com/ublue-os/bazzite/commit/93cd131694c6924f4f8edb6ef8ea68dbbec6711e)** | chore(deps): update actions/attest action to v4.2.0 (#5248) | ubot-7274[bot] |\n| **[1ed0517](https://github.com/ublue-os/bazzite/commit/1ed051746b6ea26e0d2efdbfcb3f41e7aaf0c79a)** | chore(deps): update system_files/desktop/silverblue/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to a4e022e (#5244) | ubot-7274[bot] |\n| **[8452da3](https://github.com/ublue-os/bazzite/commit/8452da3dc2f499354a88adc8c30fd64dc7dfcfa6)** | fix: add kernel-tools back for useful tools like cpupower (#5231) | stellaberrant |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | kernel-tools | | 7.1.3-201 |\n| 🔄 | binutils | 2.46-3 | 2.46.1-1 |\n\n### Gnome Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | gnome-shell-extension-gsconnect | 72-2 | 72-3 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260717\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/354719876","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/354719876/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/354719876/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260715","id":354719876,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VJJiE","tag_name":"testing-44.20260715","target_commitish":"main","name":"testing-44.20260715: Testing (F44.20260715, #b0579fa)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-13T15:50:41Z","updated_at":"2026-07-15T21:21:48Z","published_at":"2026-07-15T21:21:48Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260715","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260715","body":"This is an automatically generated changelog for release `testing-44.20260715`.\n\nFrom previous `testing` version `testing-44.20260714.1` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 ➡️ 0.45.1-1 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[b0579fa](https://github.com/ublue-os/bazzite/commit/b0579fa401ced4f330804c7fa6c04f760f46cef8)** | Add Homebrew trust for LizardByte repository (#5237) | Andy East |\n| **[08eb204](https://github.com/ublue-os/bazzite/commit/08eb2044bd0421080da0862814527253513d3076)** | feat: add specs for search packages for bazzite portal (#5228) | Alex Shek |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | rust-topgrade | 17.7.0-1 | 17.8.0-1 |\n| 🔄 | tailscale | 1.98.8-1 | 1.98.9-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260715\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/353840759","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/353840759/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/353840759/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260714.1","id":353840759,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VFy53","tag_name":"testing-44.20260714.1","target_commitish":"main","name":"testing-44.20260714.1: Testing (F44.20260714, #1ab2112)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-13T15:50:41Z","updated_at":"2026-07-14T14:06:27Z","published_at":"2026-07-14T14:06:27Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260714.1","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260714.1","body":"This is an automatically generated changelog for release `testing-44.20260714.1`.\n\nFrom previous `testing` version `testing-44.20260714` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[1ab2112](https://github.com/ublue-os/bazzite/commit/1ab2112424d840c07476ac4fce69ffe4521cfcdd)** | fix: Add ignore configs for external controllers (#5223) | HikariKnight |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260714.1\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/353605641","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/353605641/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/353605641/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260714","id":353605641,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VE5gJ","tag_name":"testing-44.20260714","target_commitish":"main","name":"testing-44.20260714: Testing (F44.20260714, #e6787f7)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-13T15:50:41Z","updated_at":"2026-07-14T06:31:53Z","published_at":"2026-07-14T06:31:53Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260714","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260714","body":"This is an automatically generated changelog for release `testing-44.20260714`.\n\nFrom previous `testing` version `testing-44.20260711` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[e6787f7](https://github.com/ublue-os/bazzite/commit/e6787f76d127b8d37567b608fd8a56075620522b)** | feat(deck): Enable OGUI only on known handhelds for now | Kyle Gospodnetich |\n| **[9bef617](https://github.com/ublue-os/bazzite/commit/9bef61794ae5b0ebce725b350ebfeb76d4955847)** | chore: Standardize naming convention p2 | Kyle Gospodnetich |\n| **[2767693](https://github.com/ublue-os/bazzite/commit/2767693023b4dbd298d86229adc34ad123c3a1b4)** | chore: Standardize naming convention | Kyle Gospodnetich |\n| **[ef08047](https://github.com/ublue-os/bazzite/commit/ef080476e5c3d0c214a32df93883b53ad65aae11)** | chore: No need to check, this runs only once now. | Kyle Gospodnetich |\n| **[60f1b9f](https://github.com/ublue-os/bazzite/commit/60f1b9f3bb345f61e20d4e0e91591e1f59326523)** | fix: Temporary patch for OGUI crash for some users | Kyle Gospodnetich |\n| **[0416249](https://github.com/ublue-os/bazzite/commit/04162492ba8828e32d77487b1575a8c693d59927)** | fix: Clean up IWD script | Kyle Gospodnetich |\n| **[7d098c8](https://github.com/ublue-os/bazzite/commit/7d098c893cf1ff414ac806fb03cda96233416803)** | chore(deps): update softprops/action-gh-release digest to 3d0d988 (#5225) | ubot-7274[bot] |\n| **[087e65e](https://github.com/ublue-os/bazzite/commit/087e65e5db648aefe6607b6eb0ff3d9328952448)** | chore(deps): update oras-project/setup-oras action to v2.0.1 (#5215) | ubot-7274[bot] |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | acl | 2.3.2-6 | 2.4.0-1 |\n| 🔄 | attr | 2.5.2-8 | 2.6.0-1 |\n| 🔄 | breeze-icon-theme | 6.27.0-1 | 6.28.0-1 |\n| 🔄 | c-ares | 1.34.7-1 | 1.34.8-1 |\n| 🔄 | cage | 0.3.0-1 | 0.3.1-1 |\n| 🔄 | cjson | 1.7.18-5 | 1.7.19-1 |\n| 🔄 | fastfetch | 2.65.2-2 | 2.66.0-1 |\n| 🔄 | gstreamer1 | 1.28.4-1 | 1.28.5-1 |\n| 🔄 | javascriptcoregtk4.1 | 2.52.4-1 | 2.52.5-1 |\n| 🔄 | kmod-sc0710 | 0^20260702git.921ca8e-1 | 0^20260711git.b6ef85d-1 |\n| 🔄 | librabbitmq | 0.16.0-1 | 0.17.0-1 |\n| 🔄 | libsss_certmap | 2.13.1-1 | 2.13.1-2 |\n| 🔄 | python-pillow | 12.2.0-1 | 12.3.0-1 |\n| 🔄 | python3-boto3 | 1.43.42-1 | 1.43.44-1 |\n| 🔄 | python3-idna | 3.11-2 | 3.18-1 |\n\n### Deck Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | xorg-x11-server | 21.1.23-1 | 21.1.24-1 |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | kf6-attica | 6.27.0-1 | 6.28.0-1 |\n| ❌ | ebook-tools | 0.2.2-31 | |\n\n### Gnome Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | NetworkManager-ssh | 1.4.4-1 | 1.4.5-1 |\n| 🔄 | geoclue2-libs | 2.8.1-1 | 2.8.2-1 |\n| 🔄 | gst-editing-services | 1.28.4-1 | 1.28.5-1 |\n| 🔄 | xorg-x11-server | 21.1.23-1 | 21.1.24-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260714\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/352968339","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/352968339/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/352968339/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/44.20260713","id":352968339,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VCd6T","tag_name":"44.20260713","target_commitish":"main","name":"44.20260713: Stable (F44.20260713)","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-11T17:29:50Z","updated_at":"2026-07-13T06:47:03Z","published_at":"2026-07-13T06:47:03Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/44.20260713","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/44.20260713","body":"This is an automatically generated changelog for release `44.20260713`.\n\nFrom previous `stable` version `44.20260629` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.0.9-ogc3.2 ➡️ 7.1.3-ogc3.4 |\n| **Firmware** | 20260519-1 ➡️ 20260622-1 |\n| **Mesa** | 26.1.3-1 ➡️ 26.1.4-2 |\n| **Gamescope** | 137.7c5ebe99-1 ➡️ 137.9b021486-1 |\n| **Bazaar** | 0.8.3-3 ➡️ 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.1-1 ➡️ 6.7.2-1 |\n| **Nvidia Open** | 610.43.02-1 ➡️ 610.43.03-1 |\n| **Nvidia LTS** | 580.159.04-1 ➡️ 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[adfd221](https://github.com/ublue-os/bazzite/commit/adfd2215ed2a43c5dedd360478ba36816ffb3a76)** | chore(deps): update oras-project/setup-oras action to v2.0.1 (#5215) | ubot-7274[bot] |\n| **[938fe74](https://github.com/ublue-os/bazzite/commit/938fe74aa2693f2e179d10a66e1dbb46230b127f)** | feat: Update to new version of Bazaar config | Kyle Gospodnetich |\n| **[1c5b7bc](https://github.com/ublue-os/bazzite/commit/1c5b7bccfbbd43c4406ba3060e74a03dd748767f)** | chore: Drop CSS from Bazaar curated | Kyle Gospodnetich |\n| **[f2bd7b6](https://github.com/ublue-os/bazzite/commit/f2bd7b666a213a1d155912702b071146c1277eb6)** | feat: Add Waywallen to Bazaar Utilities section | Kyle Gospodnetich |\n| **[958d3e6](https://github.com/ublue-os/bazzite/commit/958d3e6850e585625ceb0d795bf9305dd4d621d4)** | chore: Update to latest 7.1.3 build | Kyle Gospodnetich |\n| **[67b65b5](https://github.com/ublue-os/bazzite/commit/67b65b502ff4916a0c289b713f046983deacaaa1)** | feat(kde): Add Oxygen theme by default | Kyle Gospodnetich |\n| **[4655b1c](https://github.com/ublue-os/bazzite/commit/4655b1c3398c21c3bf2ee98615f65d379562938d)** | chore(deps): update system_files/desktop/silverblue/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to 5a20b25 (#5207) | ubot-7274[bot] |\n| **[b5a5c46](https://github.com/ublue-os/bazzite/commit/b5a5c46f9b2517585fd13b75749b703a8ad628ae)** | chore(deps): update system_files/desktop/silverblue/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to 900c257 (#5164) | ubot-7274[bot] |\n| **[7da924b](https://github.com/ublue-os/bazzite/commit/7da924bf933943e549613cb55d5d34c771c26713)** | chore(deps): update github/codeql-action digest to 99df26d (#5201) | ubot-7274[bot] |\n| **[179291b](https://github.com/ublue-os/bazzite/commit/179291b11dc9a402d882d779aff416fbb93d68d5)** | chore: Add new files to spec | Kyle Gospodnetich |\n| **[f3fc546](https://github.com/ublue-os/bazzite/commit/f3fc546ed827f08bfa7ee12486734e566d5a3d51)** | chore: Update bazzite-updater to 0.8.0 | Kyle Gospodnetich |\n| **[17e598c](https://github.com/ublue-os/bazzite/commit/17e598c66a693a2116c226f52ae1496608164a0a)** | feat(kde): add fcitx5-table-extra for more Chinese IME (#5196) | Kyle Kwong |\n| **[5255289](https://github.com/ublue-os/bazzite/commit/52552896edbe500b4b784418623e5d90d6ff9439)** | chore(deps): update docker/login-action digest to af1e73f (#5185) | ubot-7274[bot] |\n| **[f415525](https://github.com/ublue-os/bazzite/commit/f41552593b837befe47fd27a62918afd711f00b3)** | chore(deps): update docker/login-action digest to c99871d (#5178) | ubot-7274[bot] |\n| **[f07c1a5](https://github.com/ublue-os/bazzite/commit/f07c1a53420fca76461736ea2c0ddfeaf1528402)** | chore(deps): update github/codeql-action digest to 54f647b (#5180) | ubot-7274[bot] |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | kmod-openrazer | | 100.0.0.git.723.878ab5a5-1 |\n| 🔄 | 7zip | 26.01-1 | 26.02-1 |\n| 🔄 | SDL3 | 3.4.10-1 | 3.4.12-1 |\n| 🔄 | acl | 2.3.2-6 | 2.4.0-1 |\n| 🔄 | appstream | 1.1.0-3 | 1.1.3-1 |\n| 🔄 | at-spi2-atk | 2.60.4-1 | 2.60.5-1 |\n| 🔄 | attr | 2.5.2-8 | 2.6.0-1 |\n| 🔄 | bootupd | 0.2.34-1 | 0.2.35-1 |\n| 🔄 | c-ares | 1.34.6-3 | 1.34.8-1 |\n| 🔄 | cage | 0.3.0-1 | 0.3.1-1 |\n| 🔄 | cifs-utils | 7.6-1 | 7.6-2 |\n| 🔄 | cjson | 1.7.18-5 | 1.7.19-1 |\n| 🔄 | cockpit-podman | 127-1 | 128-1 |\n| 🔄 | container-selinux | 2.249.0-1 | 2.250.0-1 |\n| 🔄 | criu | 4.2-13 | 4.2-21 |\n| 🔄 | edk2-ovmf | 20260508-4 | 20260508-6 |\n| 🔄 | enchant2 | 2.8.16-1 | 2.8.18-1 |\n| 🔄 | fastfetch | 2.63.1-1 | 2.65.2-2 |\n| 🔄 | ffmpeg | 8.1.1-2 | 8.1.2-1 |\n| 🔄 | firewall-config | 2.4.0-2 | 2.4.4-1 |\n| 🔄 | framework-system | 0.6.4-1 | 0.6.5-1 |\n| 🔄 | fzf | 0.73.1-1 | 0.74.0-1 |\n| 🔄 | git | 2.54.0-1 | 2.55.0-1 |\n| 🔄 | glibc | 2.43-6 | 2.43-7 |\n| 🔄 | glibmm2.68 | 2.88.0-1 | 2.88.1-1 |\n| 🔄 | glycin | 2.1.1-1 | 2.1.5-1 |\n| 🔄 | gpgme | 2.0.1-4 | 2.0.1-5 |\n| 🔄 | gssdp | 1.6.5-1 | 1.6.6-1 |\n| 🔄 | gstreamer1 | 1.28.4-1 | 1.28.5-1 |\n| 🔄 | hplip | 3.26.4-6 | 3.26.4-7 |\n| 🔄 | hwdata | 0.408-1 | 0.409-1 |\n| 🔄 | icu | 77.1-2 | 77.1-3 |\n| 🔄 | input-remapper | 2.2.0-2 | 2.2.1-1 |\n| 🔄 | intel-media-driver | 26.2.2-1 | 26.2.4-1 |\n| 🔄 | ipp-usb | 0.9.31-2 | 0.9.34-2 |\n| 🔄 | javascriptcoregtk4.1 | 2.52.4-1 | 2.52.5-1 |\n| 🔄 | just | 1.51.0-1 | 1.55.1-1 |\n| 🔄 | kf6-filesystem | 6.27.0-1 | 6.28.0-1 |\n| 🔄 | kmod-evdi | 1.14.16-1 | 1.15.0-1 |\n| 🔄 | kmod-sc0710 | 0^20260627git.ba67d19-1 | 0^20260711git.b6ef85d-1 |\n| 🔄 | kmod-v4l2loopback | 0.15.3-2 | 0.15.4-1 |\n| 🔄 | leptonica | 1.87.0-3 | 1.87.0-4 |\n| 🔄 | libXfont2 | 2.0.7-4 | 2.0.8-1 |\n| 🔄 | libadwaita | 1.9.1-1 | 1.9.2-1 |\n| 🔄 | libchewing | 0.11.0-2 | 0.13.0-1 |\n| 🔄 | libldb | 4.24.3-1 | 4.24.4-1 |\n| 🔄 | librabbitmq | 0.16.0-1 | 0.17.0-1 |\n| 🔄 | libsss_certmap | 2.13.1-1 | 2.13.1-2 |\n| 🔄 | libvpl | 2.16.0-2 | 2.17.0-1 |\n| 🔄 | libwayland-client | 1.24.0-3 | 1.25.0-1 |\n| 🔄 | libxmlb | 0.3.26-1 | 0.3.28-1 |\n| 🔄 | makemkv | 1.18.3-1 | 1.18.4-1 |\n| 🔄 | openssh | 10.2p1-10 | 10.2p1-12 |\n| 🔄 | openvpn | 2.7.3-1 | 2.7.5-1 |\n| 🔄 | openxr | 1.1.60-1 | 1.1.61-1 |\n| 🔄 | pam | 1.7.2-1 | 1.7.2-2 |\n| 🔄 | pipewire | 1.6.7-1 | 1.6.8-1 |\n| 🔄 | podman | 5.8.3-1 | 5.8.4-1 |\n| 🔄 | python-pillow | 12.2.0-1 | 12.3.0-1 |\n| 🔄 | python-rpds-py | 0.29.0-2 | 0.29.0-4 |\n| 🔄 | python3-beautifulsoup4 | 4.14.3-2 | 4.15.0-1 |\n| 🔄 | python3-boto3 | 1.43.31-1 | 1.43.44-1 |\n| 🔄 | python3-idna | 3.11-2 | 3.18-1 |\n| 🔄 | python3-yubikey-manager | 5.9.1-1.20260415gitbc866e8 | 5.9.2-1.20260630git60ab055 |\n| 🔄 | rar | 7.22-1 | 7.23-1 |\n| 🔄 | rpcbind | 1.2.9-0 | 1.2.9-2 |\n| 🔄 | rust-topgrade | 17.6.2-1 | 17.7.0-1 |\n| 🔄 | selinux-policy | 44.3-1 | 44.4-1 |\n| 🔄 | solaar-udev | 1.1.19-1 | 1.1.20-1 |\n| 🔄 | steam-devices | 1.0.0.101^git20260611.bbf6cf0-2 | 1.0.0.101^git20260625.22ec85e-1 |\n| 🔄 | tailscale | 1.98.4-1 | 1.98.8-1 |\n| 🔄 | tmux | 3.6b-1 | 3.7b-2 |\n| 🔄 | upower | 1.91.2-1 | 1.91.3-1 |\n| 🔄 | vim | 9.2.725-1 | 9.2.780-1 |\n| ❌ | python3-pydbus | 0.6.0-34 | |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | oxygen-icon-theme | | 6.27.0-2 |\n| 🔄 | MariaDB | 11.8.6-1 | 11.8.8-1 |\n| 🔄 | akonadi-server | 26.04.2-1 | 26.04.3-2 |\n| 🔄 | appstream-qt | 1.1.0-3 | 1.1.3-1 |\n| 🔄 | breeze-icon-theme | 6.27.0-1 | 6.28.0-1 |\n| 🔄 | fcitx5 | 5.1.19-1 | 5.1.21-1 |\n| 🔄 | fcitx5-chewing | 5.1.11-1 | 5.1.12-1 |\n| 🔄 | fcitx5-configtool | 5.1.13-1 | 5.1.14-1 |\n| 🔄 | fcitx5-gtk | 5.1.6-1 | 5.1.7-1 |\n| 🔄 | fcitx5-hangul | 5.1.9-1 | 5.1.10-1 |\n| 🔄 | fcitx5-lua | 5.0.16-1 | 5.0.17-1 |\n| 🔄 | gdb | 17.1-6 | 17.2-1 |\n| 🔄 | leptonica-devel | 1.87.0-3 | 1.87.0-4 |\n| 🔄 | libime | 1.1.14-1 | 1.1.15-1 |\n| 🔄 | libkworkspace6 | 6.7.1-1 | 6.7.2-2 |\n| 🔄 | libnetapi | 4.24.3-1 | 4.24.4-1 |\n| 🔄 | m17n-db-devel | 1.8.12-1 | 1.8.13-1 |\n| 🔄 | mariadb | 11.8.6-2 | 11.8.8-3 |\n| 🔄 | qtkeychain | 0.15.0-3 | 0.16.0-1 |\n| ❌ | ebook-tools | 0.2.2-31 | |\n| ❌ | openh264 | 2.6.0-1 | |\n\n### Gnome Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | NetworkManager-ssh | 1.4.4-1 | 1.4.5-1 |\n| 🔄 | geoclue2-libs | 2.8.1-1 | 2.8.2-1 |\n| 🔄 | gjs | 1.88.0-1 | 1.88.1-1 |\n| 🔄 | glycin-thumbnailer | 2.1.1-1 | 2.1.5-1 |\n| 🔄 | gnome-user-share | 48.2-1 | 48.3-1 |\n| 🔄 | gst-editing-services | 1.28.4-1 | 1.28.5-1 |\n| 🔄 | libgexiv2 | 0.16.0-2 | 0.16.1-1 |\n| 🔄 | papers | 49.6-1 | 49.7-1 |\n| 🔄 | xorg-x11-server | 21.1.23-1 | 21.1.24-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase stable\n# For this specific image:\nbazzite-rollback-helper rebase 44.20260713\n```\n","reactions":{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/352968339/reactions","total_count":18,"+1":6,"-1":0,"laugh":0,"hooray":3,"confused":0,"heart":6,"rocket":3,"eyes":0}},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/352555357","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/352555357/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/352555357/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260711","id":352555357,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4VA5Fd","tag_name":"testing-44.20260711","target_commitish":"main","name":"testing-44.20260711: Testing (F44.20260711, #054fa22)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-10T20:29:09Z","updated_at":"2026-07-11T16:08:33Z","published_at":"2026-07-11T16:08:33Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260711","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260711","body":"This is an automatically generated changelog for release `testing-44.20260711`.\n\nFrom previous `testing` version `testing-44.20260710.3` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.4-1 ➡️ 26.1.4-2 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[054fa22](https://github.com/ublue-os/bazzite/commit/054fa228a582d5dd3f4b8f8ccc446c5e44a2e8ce)** | chore(Bazaar): Update Thunderbird ID (#5211) | Crono |\n| **[429d6b3](https://github.com/ublue-os/bazzite/commit/429d6b3edbffd2364183787bfa64d9fb2214d477)** | chore(Bazaar): Add Mimic to the Utilities section (#5212) | Crono |\n| **[265cce5](https://github.com/ublue-os/bazzite/commit/265cce5b30397f1a5a0d551447dfbcdbc46221d0)** | chore(Bazaar): Give the pt_BR locale another pass (#5213) | Crono |\n| **[2598cb8](https://github.com/ublue-os/bazzite/commit/2598cb81a19cbe32c5f3fdbee82d0fe8bfed5bb5)** | feat: Update to new version of Bazaar config | Kyle Gospodnetich |\n| **[0a5163c](https://github.com/ublue-os/bazzite/commit/0a5163c21811822be12b3c621aa8c3f0d7700688)** | chore: typo correction | Kyle Gospodnetich |\n| **[829895e](https://github.com/ublue-os/bazzite/commit/829895e5faf1e7f0d2bbb38238a77b40a1c9e602)** | chore: Drop CSS from Bazaar curated | Kyle Gospodnetich |\n| **[ffc7acc](https://github.com/ublue-os/bazzite/commit/ffc7acc863ef05b5c83c5422b897676ee347a9c2)** | feat: Add Waywallen to Bazaar Utilities section | Kyle Gospodnetich |\n| **[240c081](https://github.com/ublue-os/bazzite/commit/240c081931d709a2d8c4e17409f50810930b0232)** | feat: Drop IWD due to discussion with Intel team, this may be maintained by Valve in the future (speculation), but that's not enough to continue using it given they often use an older kernel and it's speculated newer kernel releases will break IWD in the future. Originally this was added to sync with SteamOS & Improve streaming latency/stability with Sunshine. | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | edk2-ovmf | 20260508-4 | 20260508-6 |\n| 🔄 | fastfetch | 2.65.2-1 | 2.65.2-2 |\n| 🔄 | firewall-config | 2.4.0-2 | 2.4.4-1 |\n| 🔄 | kmod-v4l2loopback | 0.15.3-2 | 0.15.4-1 |\n| 🔄 | rust-topgrade | 17.6.2-1 | 17.7.0-1 |\n| 🔄 | tmux | 3.7-2 | 3.7b-2 |\n\n### Deck Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ❌ | iwd | 1000.3.10-1.bazzite | |\n| ❌ | libell | 0.83-1 | |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | fcitx5 | 5.1.19-1 | 5.1.21-1 |\n| 🔄 | fcitx5-chewing | 5.1.11-1 | 5.1.12-1 |\n| 🔄 | fcitx5-configtool | 5.1.13-1 | 5.1.14-1 |\n| 🔄 | fcitx5-gtk | 5.1.6-1 | 5.1.7-1 |\n| 🔄 | fcitx5-hangul | 5.1.9-1 | 5.1.10-1 |\n| 🔄 | fcitx5-lua | 5.0.16-1 | 5.0.17-1 |\n| 🔄 | libime | 1.1.14-1 | 1.1.15-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260711\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/352178543","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/352178543/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/352178543/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260710.2","id":352178543,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4U_dFv","tag_name":"testing-44.20260710.2","target_commitish":"main","name":"testing-44.20260710.2: Testing (F44.20260710, #982d035)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-10T05:27:49Z","updated_at":"2026-07-10T15:23:02Z","published_at":"2026-07-10T15:23:02Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260710.2","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260710.2","body":"This is an automatically generated changelog for release `testing-44.20260710.2`.\n\nFrom previous `testing` version `testing-44.20260710.1` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.3 ➡️ 7.1.3-ogc3.4 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[982d035](https://github.com/ublue-os/bazzite/commit/982d035e94ae025271bdcd642099ac4ded2ddc5d)** | chore: Update to latest 7.1.3 build | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | fzf | 0.73.1-1 | 0.74.0-1 |\n| 🔄 | just | 1.53.0-1 | 1.55.1-1 |\n| 🔄 | tmux | 3.6b-1 | 3.7-2 |\n\n### Deck Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | pipewire-module-filter-chain-lv2 | 1.6.7-1 | 1.6.8-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260710.2\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/351916793","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/351916793/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/351916793/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260710.1","id":351916793,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4U-dL5","tag_name":"testing-44.20260710.1","target_commitish":"main","name":"testing-44.20260710.1: Testing (F44.20260710, #982d035)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-10T05:27:49Z","updated_at":"2026-07-10T05:51:09Z","published_at":"2026-07-10T05:51:09Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260710.1","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260710.1","body":"This is an automatically generated changelog for release `testing-44.20260710.1`.\n\nFrom previous `testing` version `testing-44.20260710` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.3 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[982d035](https://github.com/ublue-os/bazzite/commit/982d035e94ae025271bdcd642099ac4ded2ddc5d)** | chore: Update to latest 7.1.3 build | Kyle Gospodnetich |\n| **[d11cb1f](https://github.com/ublue-os/bazzite/commit/d11cb1fc20b8a53839c82167b2ec8a2a3d7e9b80)** | chore(deps): update system_files/desktop/silverblue/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to 900c257 (#5164) | ubot-7274[bot] |\n| **[89e5750](https://github.com/ublue-os/bazzite/commit/89e575034fa16acdd08b4591b9de34db31d025dd)** | chore(deps): update github/codeql-action digest to 99df26d (#5201) | ubot-7274[bot] |\n| **[9946e34](https://github.com/ublue-os/bazzite/commit/9946e341f596f164b1c3710f11ca80d2888aaab7)** | chore(ba-hw): remove iwd fixup because upstream is dead (#5199) | Alex Shek |\n| **[0204b14](https://github.com/ublue-os/bazzite/commit/0204b141284e1647474b796ebe8a90717a99fb54)** | chore: Update logo menu | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | pipewire | 1.6.7-1 | 1.6.8-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260710.1\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/351875933","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/351875933/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/351875933/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260710","id":351875933,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4U-TNd","tag_name":"testing-44.20260710","target_commitish":"main","name":"testing-44.20260710: Testing (F44.20260710, #d11cb1f)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-10T01:54:59Z","updated_at":"2026-07-10T02:59:08Z","published_at":"2026-07-10T02:59:08Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260710","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260710","body":"This is an automatically generated changelog for release `testing-44.20260710`.\n\nFrom previous `testing` version `testing-44.20260709.1` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.1 ➡️ 7.1.3-ogc3.3 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.02-1 ➡️ 610.43.03-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | bazzite-updater | | 0.8.0-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260710\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/351325999","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/351325999/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/351325999/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260709.1","id":351325999,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4U8M8v","tag_name":"testing-44.20260709.1","target_commitish":"main","name":"testing-44.20260709.1: Testing (F44.20260709, #c83d064)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-06T04:13:06Z","updated_at":"2026-07-10T01:04:52Z","published_at":"2026-07-09T06:32:48Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260709.1","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260709.1","body":"This is an automatically generated changelog for release `testing-44.20260709.1`.\n\nFrom previous `testing` version `testing-44.20260709` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.3-ogc3.1 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.2-1 |\n| **Nvidia Open** | 610.43.02-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[c83d064](https://github.com/ublue-os/bazzite/commit/c83d064c55d8b001b242c0660704cb460bc3d0e0)** | chore: Update to latest 7.1.3 build | Kyle Gospodnetich |\n| **[034eff6](https://github.com/ublue-os/bazzite/commit/034eff62ee061ccae4556ab8e67e9ae84cba0919)** | chore: Don't use bazzite-updater from terra | Kyle Gospodnetich |\n| **[d541fd8](https://github.com/ublue-os/bazzite/commit/d541fd8b19780d9555d858ff5b51c48ed54dfb7c)** | chore: Ensure user services are enabled properly for steamos-manager | Kyle Gospodnetich |\n| **[ce64c5a](https://github.com/ublue-os/bazzite/commit/ce64c5acb33a8628a3f502914f4ce75207654b4a)** | chore: Update logo menu extension | Kyle Gospodnetich |\n| **[cfe1810](https://github.com/ublue-os/bazzite/commit/cfe181091a822c0e3a184d84dce418c5a58f9781)** | chore: Use new package name | Kyle Gospodnetich |\n| **[60be420](https://github.com/ublue-os/bazzite/commit/60be420e27498b43bfbaeba87dd2c32c3afa0eb3)** | Reapply \"feat: Use the new Bazzite GUI Updater\" | Kyle Gospodnetich |\n| **[3f0ab69](https://github.com/ublue-os/bazzite/commit/3f0ab6993d5e6ee1d3f32a87aacdec04209936b9)** | fix: Change default paths for steamos-manager to match ours | Kyle Gospodnetich |\n| **[a0018c3](https://github.com/ublue-os/bazzite/commit/a0018c3ceb2cbd476e098b68fc072562661750fd)** | chore: Update to latest 7.1.3 build | Kyle Gospodnetich |\n| **[548bb5d](https://github.com/ublue-os/bazzite/commit/548bb5d28458476a31b58fa7858918636bafff99)** | feat(kde): add fcitx5-table-extra for more Chinese IME (#5196) | Kyle Kwong |\n| **[4913e00](https://github.com/ublue-os/bazzite/commit/4913e00ea51f985466f0bc5e83dac9d8b7bfd4a7)** | chore(deps): update docker/login-action digest to af1e73f (#5185) | ubot-7274[bot] |\n| **[3d7de73](https://github.com/ublue-os/bazzite/commit/3d7de73f8d2ef5dcef915321889630e1940972f5)** | chore(deps): update docker/login-action digest to c99871d (#5178) | ubot-7274[bot] |\n| **[3815fc9](https://github.com/ublue-os/bazzite/commit/3815fc97d20572853ce09b8985a5f21c4756ae35)** | chore(deps): update github/codeql-action digest to 54f647b (#5180) | ubot-7274[bot] |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | glibc | 2.43-6 | 2.43-7 |\n| 🔄 | libwayland-client | 1.24.0-3 | 1.25.0-1 |\n| 🔄 | openssh | 10.2p1-10 | 10.2p1-12 |\n| 🔄 | openxr | 1.1.60-1 | 1.1.61-1 |\n| 🔄 | steam-devices | 1.0.0.101^git20260611.bbf6cf0-2 | 1.0.0.101^git20260625.22ec85e-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260709.1\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/351281376","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/351281376/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/351281376/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260709","id":351281376,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4U8CDg","tag_name":"testing-44.20260709","target_commitish":"main","name":"testing-44.20260709: Testing (F44.20260709, #1498c7d)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-06T04:13:06Z","updated_at":"2026-07-09T03:35:06Z","published_at":"2026-07-09T03:35:06Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260709","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260709","body":"This is an automatically generated changelog for release `testing-44.20260709`.\n\nFrom previous `testing` version `testing-44.20260705.1` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.0.9-ogc3.2 ➡️ 7.1.3-ogc3.1 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.7c5ebe99-1 ➡️ 137.9b021486-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.0-3 ➡️ 0.9.1-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.1-1 ➡️ 6.7.2-1 |\n| **Nvidia Open** | 610.43.02-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[1498c7d](https://github.com/ublue-os/bazzite/commit/1498c7d6630e6fe200050d7f73df33eacfec7caa)** | feat: Update kernel to 7.1.3-ogc3 | Kyle Gospodnetich |\n| **[f2fbd35](https://github.com/ublue-os/bazzite/commit/f2fbd357a8e6cfeb70f9df679b0f1bad98368bca)** | feat(troubleshooting): add inputplumber toggle (#5195) | Kurt Himebauch |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | kmod-openrazer | | 100.0.0.git.723.878ab5a5-1 |\n| 🔄 | appstream | 1.1.0-3 | 1.1.3-1 |\n| 🔄 | cifs-utils | 7.6-1 | 7.6-2 |\n| 🔄 | container-selinux | 2.249.0-1 | 2.250.0-1 |\n| 🔄 | criu | 4.2-13 | 4.2-21 |\n| 🔄 | fastfetch | 2.63.1-1 | 2.65.2-1 |\n| 🔄 | hplip | 3.26.4-6 | 3.26.4-7 |\n| 🔄 | hwdata | 0.408-1 | 0.409-1 |\n| 🔄 | input-remapper | 2.2.0-2 | 2.2.1-1 |\n| 🔄 | libldb | 4.24.3-1 | 4.24.4-1 |\n| 🔄 | libvpl | 2.16.0-2 | 2.17.0-1 |\n| 🔄 | podman | 5.8.3-1 | 5.8.4-1 |\n| 🔄 | python-rpds-py | 0.29.0-2 | 0.29.0-4 |\n| 🔄 | python3-yubikey-manager | 5.9.1-1.20260415gitbc866e8 | 5.9.2-1.20260630git60ab055 |\n| 🔄 | rar | 7.22-1 | 7.23-1 |\n| 🔄 | selinux-policy | 44.3-1 | 44.4-1 |\n| ❌ | python3-pydbus | 0.6.0-34 | |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | akonadi-server | 26.04.2-1 | 26.04.3-1 |\n| 🔄 | appstream-qt | 1.1.0-3 | 1.1.3-1 |\n| 🔄 | gdb | 17.1-6 | 17.2-1 |\n| 🔄 | libkworkspace6 | 6.7.1-1 | 6.7.2-2 |\n| 🔄 | libnetapi | 4.24.3-1 | 4.24.4-1 |\n\n### Gnome Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | gnome-user-share | 48.2-1 | 48.3-1 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260709\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/349091346","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/349091346/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/349091346/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260705.1","id":349091346,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4UzrYS","tag_name":"testing-44.20260705.1","target_commitish":"main","name":"testing-44.20260705.1: Testing (F44.20260705, #478073e)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-03T18:26:08Z","updated_at":"2026-07-05T04:35:43Z","published_at":"2026-07-05T04:35:43Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260705.1","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260705.1","body":"This is an automatically generated changelog for release `testing-44.20260705.1`.\n\nFrom previous `testing` version `testing-44.20260705` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.1.2-ogc2.1 ➡️ 7.0.9-ogc3.2 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.7c5ebe99-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.0-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.1-1 |\n| **Nvidia Open** | 610.43.02-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[478073e](https://github.com/ublue-os/bazzite/commit/478073e90ba311784a45fc31149e1aa8d2f51719)** | chore: Roll back kernel for now, need to debug amdgpu issue | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | vim | 9.2.725-1 | 9.2.780-1 |\n| ❌ | kmod-openrazer | 100.0.0.git.723.878ab5a5-1 | |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260705.1\n```\n"},{"url":"https://api.github.com/repos/ublue-os/bazzite/releases/349069940","assets_url":"https://api.github.com/repos/ublue-os/bazzite/releases/349069940/assets","upload_url":"https://uploads.github.com/repos/ublue-os/bazzite/releases/349069940/assets{?name,label}","html_url":"https://github.com/ublue-os/bazzite/releases/tag/testing-44.20260705","id":349069940,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOI78thc4UzmJ0","tag_name":"testing-44.20260705","target_commitish":"main","name":"testing-44.20260705: Testing (F44.20260705, #2c40074)","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-03T18:26:08Z","updated_at":"2026-07-05T01:23:34Z","published_at":"2026-07-05T01:23:34Z","assets":[],"tarball_url":"https://api.github.com/repos/ublue-os/bazzite/tarball/testing-44.20260705","zipball_url":"https://api.github.com/repos/ublue-os/bazzite/zipball/testing-44.20260705","body":"This is an automatically generated changelog for release `testing-44.20260705`.\n\nFrom previous `testing` version `testing-44.20260704` there have been the following changes. **One package per new version shown.**\n\n### Major packages\n| Name | Version |\n| --- | --- |\n| **Kernel** | 7.0.9-ogc3.2 ➡️ 7.1.2-ogc2.1 |\n| **Firmware** | 20260622-1 |\n| **Mesa** | 26.1.3-1 |\n| **Gamescope** | 137.7c5ebe99-1 |\n| **Gamescope Session** | 0~20260202git.b5c2d0d-4 |\n| **InputPlumber** | 0.77.7-1 |\n| **OpenGamepadUI** | 0.45.0-2 |\n| **PowerStation** | 0.8.1-1 |\n| **SteamOS-Manager** | 0~20260528.git37d1cb6-3 |\n| **Bazaar** | 0.9.0-3 |\n| **Gnome** | 50.3-1 |\n| **KDE** | 6.7.1-1 |\n| **Nvidia Open** | 610.43.02-1 |\n| **Nvidia LTS** | 580.173.02-1 |\n\n### Commits\n| Hash | Subject | Author |\n| --- | --- | --- |\n| **[2c40074](https://github.com/ublue-os/bazzite/commit/2c4007449bff8ad50d65a5fde4c9f1dc2da0ae41)** | chore: Update kernel to 7.1.2-ogc1 | Kyle Gospodnetich |\n\n### All Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| ✨ | kmod-openrazer | | 100.0.0.git.723.878ab5a5-1 |\n| 🔄 | SDL3 | 3.4.10-1 | 3.4.12-1 |\n| 🔄 | bootupd | 0.2.34-1 | 0.2.35-1 |\n| 🔄 | enchant2 | 2.8.16-1 | 2.8.17-1 |\n| 🔄 | leptonica | 1.87.0-3 | 1.87.0-4 |\n| 🔄 | openvpn | 2.7.3-1 | 2.7.5-1 |\n| 🔄 | rpcbind | 1.2.9-0 | 1.2.9-2 |\n\n### KDE Images\n| | Name | Previous | New |\n| --- | --- | --- | --- |\n| 🔄 | leptonica-devel | 1.87.0-3 | 1.87.0-4 |\n\n\n\n### How to rebase\nFor current users, type the following to rebase to this version:\n```bash\n# For this branch (if latest):\nbazzite-rollback-helper rebase testing\n# For this specific image:\nbazzite-rollback-helper rebase testing-44.20260705\n```\n"}]
\ No newline at end of file diff --git a/tests/test_build_announcements.py b/tests/test_build_announcements.py new file mode 100644 index 0000000..d830112 --- /dev/null +++ b/tests/test_build_announcements.py @@ -0,0 +1,181 @@ +import json as _json + +import pytest + + +def test_fetch_releases_uses_opener_and_parses(mod): + calls = [] + + class FakeResp: + def __init__(self, payload): + self._payload = payload + def read(self): + return _json.dumps(self._payload).encode() + def __enter__(self): + return self + def __exit__(self, *a): + return False + + pages = [ + [{"name": "r1", "prerelease": False, "published_at": "2026-07-13T06:47:03Z", "body": ""}], + [], # empty page ends pagination + ] + + def fake_urlopen(req, timeout=None): + calls.append(req.full_url) + return FakeResp(pages[len(calls) - 1]) + + out = mod.fetch_releases("ublue-os/bazzite", "tok", urlopen=fake_urlopen) + assert out[0]["name"] == "r1" + assert "ublue-os/bazzite" in calls[0] + + +def test_module_imports(mod): + assert hasattr(mod, "md_to_bbcode") + assert hasattr(mod, "md_to_html") + + +def test_branch_config_stable(mod): + assert mod.branch_config("stable") == (False, "rel") + + +def test_branch_config_testing(mod): + assert mod.branch_config("testing") == (True, "beta") + + +def test_branch_config_unstable(mod): + assert mod.branch_config("unstable") == (True, "preview") + + +def test_branch_config_unknown_raises(mod): + with pytest.raises(ValueError): + mod.branch_config("nope") + + +def test_select_releases_stable_only(mod, releases): + out = mod.select_releases(releases, prerelease=False) + assert out, "expected at least one stable release in fixture" + assert all(r["prerelease"] is False for r in out) + + +def test_select_releases_prerelease_only(mod, releases): + out = mod.select_releases(releases, prerelease=True) + assert out, "expected at least one prerelease in fixture" + assert all(r["prerelease"] is True for r in out) + + +def test_select_releases_sorted_desc(mod, releases): + out = mod.select_releases(releases, prerelease=True) + dates = [r["published_at"] for r in out] + assert dates == sorted(dates, reverse=True) + + +def test_select_releases_drops_drafts(mod): + data = [ + {"prerelease": False, "draft": True, "published_at": "2026-07-13T06:47:03Z"}, + {"prerelease": False, "draft": False, "published_at": "2026-07-12T06:47:03Z"}, + ] + out = mod.select_releases(data, prerelease=False) + assert len(out) == 1 + assert out[0]["published_at"] == "2026-07-12T06:47:03Z" + + +def test_select_releases_limit(mod, releases): + out = mod.select_releases(releases, prerelease=True, limit=1) + assert len(out) == 1 + + +SAMPLE_BODY = """This is an automatically generated changelog for release `44.20260713`. + +From previous `stable` version there have been the following changes. + +### Major packages +| Name | Version | +| --- | --- | +| **Kernel** | 7.0.9 ➡️ 7.1.3 | + +### Commits +| Hash | Subject | Author | +| --- | --- | --- | +| **abc123** | feat: do a thing | Someone | + +### All Images +| | Name | Previous | New | +| --- | --- | --- | --- | +| 🔄 | 7zip | 26.01-1 | 26.02-1 | +""" + + +def test_extract_keeps_major_and_commits(mod): + out = mod.extract_sections(SAMPLE_BODY) + assert "### Major packages" in out + assert "### Commits" in out + assert "**Kernel**" in out + assert "feat: do a thing" in out + + +def test_extract_drops_intro(mod): + out = mod.extract_sections(SAMPLE_BODY) + assert "automatically generated changelog" not in out + + +def test_extract_drops_all_images(mod): + out = mod.extract_sections(SAMPLE_BODY) + assert "### All Images" not in out + assert "7zip" not in out + + +def test_extract_order_major_before_commits(mod): + out = mod.extract_sections(SAMPLE_BODY) + assert out.index("### Major packages") < out.index("### Commits") + + +def test_extract_missing_sections_returns_empty(mod): + assert mod.extract_sections("just some text\n\n### All Images\n| a |\n") == "" + + +def test_extract_real_body(mod, stable_release): + out = mod.extract_sections(stable_release["body"]) + assert "### All Images" not in out + assert "### Major packages" in out or "### Commits" in out + + +def test_normalize_release_date(mod): + date_str, ts = mod.normalize_release_date("2026-07-13T06:47:03Z") + assert date_str == "2026-07-13 06:47" + assert ts == 1783925223 + + +def test_release_to_entry_fields(mod): + release = { + "name": "44.20260713: Stable (F44.20260713)", + "tag_name": "44.20260713", + "prerelease": False, + "published_at": "2026-07-13T06:47:03Z", + "body": SAMPLE_BODY, + } + e = mod.release_to_entry(release, "rel") + assert e["title"] == "44.20260713: Stable (F44.20260713)" + assert e["channel"] == "rel" + assert e["lang"] == "english" + assert e["date"] == "2026-07-13 06:47" + assert isinstance(e["timestamp"], int) + assert "### Major packages" in e["body"] + assert "[b]Kernel[/b]" in e["bbcode_body"] + assert "<strong>Kernel</strong>" in e["html_body"] + assert list(e.keys()) == [ + "title", "date", "timestamp", "channel", "lang", + "body", "bbcode_body", "html_body", + ] + + +def test_release_to_entry_null_name_coalesces_to_empty_title(mod): + release = { + "name": None, + "tag_name": "44.20260713", + "prerelease": False, + "published_at": "2026-07-13T06:47:03Z", + "body": SAMPLE_BODY, + } + e = mod.release_to_entry(release, "rel") + assert e["title"] == "" |
