Skip to content

feat(updater): hiển thị changelog lấy từ GitHub cho cả hai kênh cập nhật - #53

Merged
ptrinh merged 1 commit into
ptrinh:mainfrom
J2TEAM:feat/update-changelog
Aug 15, 2026
Merged

feat(updater): hiển thị changelog lấy từ GitHub cho cả hai kênh cập nhật#53
ptrinh merged 1 commit into
ptrinh:mainfrom
J2TEAM:feat/update-changelog

Conversation

@J2TEAM

@J2TEAM J2TEAM commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Thêm changelog để người dùng biết có gì mới khi cập nhật phiên bản.

CleanShot 2026-08-15 at 1  36 09@2x

Trước đây cập nhật chỉ nói "Có bản mới: 1.6.3" — người dùng phải cài trong khi
không biết bản mới có gì. Release body đã nằm sẵn trong response của
/releases/latest nhưng bị bỏ đi, chỉ lấy tag_name và html_url.

Kênh manual lấy changelog miễn phí: body có sẵn trong response vừa parse, không
thêm request nào. Kênh weekly (stable) thì stable.json chỉ có version, nên phải
hỏi thêm /releases/tags/v{version} — đổi lại stable.json vẫn giữ hai dòng
maintainer sửa tay, không phải nhớ cập nhật changelog lúc promote. Notes của
kênh weekly lưu vào pendingUpdateNotes cạnh pendingUpdateVersion (ghi/xoá cùng
nhau) để sống sót qua lần IME khởi động lại giữa lúc check và lúc mở tab.

Fetch notes là best-effort: mọi lỗi trả nil chứ không throw, vì thiếu changelog
không bao giờ được biến một bản update thật thành .failed — số phiên bản là tin
chính, changelog là phần thêm. Có test pin 404.

Body đến từ mạng nên không tin nó ngắn hay đúng định dạng: lọc git trailer
(Co-Authored-By, Signed-off-by — plumbing của commit, không phải tin cho người
dùng), gộp các dòng trống thừa, cap 4000 ký tự. Quá cap thì link "Xem đầy đủ
thay đổi" dẫn ra trang release, URL suy ra từ version nên kênh weekly cũng có
link mà không phải lưu thêm key.

Render Markdown tối giản: Text chỉ hiểu inline markdown, nên tách ## và - thành
block riêng rồi giao phần inline cho AttributedString — không thêm dependency.
Heading theo đúng luật ATX (phải có dấu cách sau #), nếu không thì dòng mở đầu
bằng "ptrinh#42 sửa lỗi" sẽ bị ăn mất # và in đậm.

Cửa sổ Settings mặc định cao 560 → 660: tab Giới thiệu không có scroll container
và phần cố định của nó đã chiếm gần hết chiều cao, nên hộp changelog là thành
phần duy nhất co được và sẽ bị ép còn một vệt. 660 chỉ áp dụng lần tạo đầu, ai
đã chỉnh kích thước vẫn giữ nguyên.

Blocks parse một lần lúc gán vào @State thay vì parse trong ForEach: body chạy
lại mỗi lần model publish hoặc checking/installing/status đổi.

193 test pass. Layout chưa kiểm tra trực quan — mới đúng về mặt code.
@ptrinh
ptrinh merged commit 5464751 into ptrinh:main Aug 15, 2026
2 checks passed
ptrinh added a commit that referenced this pull request Aug 15, 2026
…B cho fetch changelog

Follow-up review PR #53: sanitizeNotes cap 4000 ký tự nhưng chỉ cắt SAU khi
URLSession.data(for:) đã buffer toàn bộ body vào RAM. Release body là dữ liệu
từ mạng — response thật chỉ vài KB, 1MB "release notes" không phải tin tức.

- boundedData(for:cap:) dùng URLSession.bytes: quá cap thì bỏ transfer, trả nil
  (đúng hợp đồng best-effort của releaseNotes — thiếu changelog không được phá update)
- test bằng data: URL, không chạm mạng: dưới cap / quá cap / đúng biên

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1mRMMTMr2v7SJQK2ABB9M
xkhanhs pushed a commit to xkhanhs/vtx that referenced this pull request Aug 17, 2026
…B cho fetch changelog

Follow-up review PR ptrinh#53: sanitizeNotes cap 4000 ký tự nhưng chỉ cắt SAU khi
URLSession.data(for:) đã buffer toàn bộ body vào RAM. Release body là dữ liệu
từ mạng — response thật chỉ vài KB, 1MB "release notes" không phải tin tức.

- boundedData(for:cap:) dùng URLSession.bytes: quá cap thì bỏ transfer, trả nil
  (đúng hợp đồng best-effort của releaseNotes — thiếu changelog không được phá update)
- test bằng data: URL, không chạm mạng: dưới cap / quá cap / đúng biên

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1mRMMTMr2v7SJQK2ABB9M
(cherry picked from commit 9868bb6)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants