Release notes come from app-stores' changelog action, into the deb and rpm too
Build / Desktop, server and tools (push) Successful in 1m12s

The release's "What's new" is now written by the shared generator every Arasaka
release uses, from the same commit messages and with the same "me-web? x.y.z:" prefix
removed; the deb and rpm carry it as their changelog (apt changelog, rpm --changelog),
and CHANGELOG.md is attached beside the files and listed in SHA256SUMS.txt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-11-01 18:19:25 +01:00
1 parent f41e1e178f
commit ad33779356
2 files changed
+17 -21

No files matched your search

+12
View File
@@ -22,6 +22,15 @@ jobs:
- name: Prepare - name: Prepare
run: .gitea/scripts/prepare.sh run: .gitea/scripts/prepare.sh
- name: Release notes from the commit messages since the previous tag
uses: https://git.thepra.dev/Arasaka/app-stores/changelog@v1
with:
prefix: v
name: me-web?
strip: '^["“]?me-web\?["”]? [\d.]+:\s*'
packager: Arasaka di Hvozdikov Yevheniy <https://arasaka.software/contact>
output: artifacts/notes
- name: The server - name: The server
run: tools/release.sh server --commit "$COMMIT" run: tools/release.sh server --commit "$COMMIT"
@@ -43,6 +52,9 @@ jobs:
MEWEB_KEYSTORE_PASS: ${{ secrets.MEWEB_KEYSTORE_PASS }} MEWEB_KEYSTORE_PASS: ${{ secrets.MEWEB_KEYSTORE_PASS }}
run: .gitea/scripts/android.sh run: .gitea/scripts/android.sh
- name: The changelog beside the files
run: cp artifacts/notes/CHANGELOG.md "releases/$VERSION/"
- name: The rpm signed with the Arasaka packages key - name: The rpm signed with the Arasaka packages key
if: ${{ github.ref_type == 'tag' }} if: ${{ github.ref_type == 'tag' }}
env: env:
+5 -21
View File
@@ -78,7 +78,8 @@ return failed ? 1 : 0;
void WriteNotes() void WriteNotes()
{ {
var source = Path.Combine(root, "artifacts", "knowledge", "SOURCE.txt"); var source = Path.Combine(root, "artifacts", "knowledge", "SOURCE.txt");
var lines = Changes(); var notes = Path.Combine(root, "artifacts", "notes", "notes.md");
var lines = File.Exists(notes) ? [.. File.ReadAllLines(notes), ""] : new List<string>();
lines.AddRange( lines.AddRange(
[ [
$"me-web? {version}, commit {commit}, built {builtAt}.", $"me-web? {version}, commit {commit}, built {builtAt}.",
@@ -92,26 +93,6 @@ void WriteNotes()
File.WriteAllLines(Path.Combine(root, "artifacts", "release-notes.md"), lines); File.WriteAllLines(Path.Combine(root, "artifacts", "release-notes.md"), lines);
} }
List<string> Changes()
{
var previous = Capture("git", "-C", root, "describe", "--tags", "--abbrev=0", "--match", "v*", "HEAD^").Trim();
var log = Capture("git", "-C", root, "log", "--no-merges", "--reverse", "--format=%x1e%s%x1f%b", previous.Length > 0 ? $"{previous}..HEAD" : "HEAD");
var lines = new List<string>();
foreach (var entry in log.Split('\x1e', StringSplitOptions.RemoveEmptyEntries))
{
var parts = entry.Split('\x1f');
var subject = Regex.Replace(parts[0].Trim(), @"^[""“]?me-web\?[""”]? [\d.]+:\s*", "");
if (subject.Length == 0) continue;
var body = (parts.Length > 1 ? parts[1] : "").Split('\n').Select(l => l.TrimEnd())
.Where(l => !Regex.IsMatch(l, @"^[A-Za-z-]+-(By|Session|Off-By):", RegexOptions.IgnoreCase))
.Where(l => !l.Contains("claude", StringComparison.OrdinalIgnoreCase))
.SkipWhile(l => l.Length == 0).Reverse().SkipWhile(l => l.Length == 0).Reverse().ToList();
lines.AddRange([$"### {char.ToUpperInvariant(subject[0])}{subject[1..]}", ""]);
if (body.Count > 0) lines.AddRange([.. body, ""]);
}
return lines.Count == 0 ? [] : [$"## What's new in {version}", "", .. lines];
}
string[] Stamp() => [$"-p:Version={version}", $"-p:BuildCommit={commit}", $"-p:BuildTimeUtc={builtAt}"]; string[] Stamp() => [$"-p:Version={version}", $"-p:BuildCommit={commit}", $"-p:BuildTimeUtc={builtAt}"];
string Linux() string Linux()
@@ -151,6 +132,8 @@ string Linux()
var png = Path.Combine(branding, "meweb-512.png"); var png = Path.Combine(branding, "meweb-512.png");
var svg = Path.Combine(branding, "meweb.svg"); var svg = Path.Combine(branding, "meweb.svg");
var yaml = Path.Combine(stage, "nfpm.yaml"); var yaml = Path.Combine(stage, "nfpm.yaml");
var history = Path.Combine(root, "artifacts", "notes", "changelog.yml");
var changelog = File.Exists(history) ? $"changelog: {history}" : "";
File.WriteAllText(yaml, $""" File.WriteAllText(yaml, $"""
name: meweb name: meweb
arch: amd64 arch: amd64
@@ -163,6 +146,7 @@ string Linux()
vendor: Arasaka di Hvozdikov Yevheniy vendor: Arasaka di Hvozdikov Yevheniy
homepage: https://git.thepra.dev/Arasaka/MeWeb homepage: https://git.thepra.dev/Arasaka/MeWeb
license: AGPL-3.0-only license: AGPL-3.0-only
{changelog}
description: | description: |
Can you run your own server from here? “me-web?” checks your connection and device and Can you run your own server from here? “me-web?” checks your connection and device and
explains, in plain words, what you could host at home and what stands in the way. explains, in plain words, what you could host at home and what stands in the way.