Skip to content

build: include syncthing changelog in published release notes - #300

Open
ckesc wants to merge 1 commit into
syncthing:v2from
ckesc:feature/issue-295
Open

ckesc wants to merge 1 commit into
syncthing:v2from
ckesc:feature/issue-295

Conversation

@ckesc

@ckesc ckesc commented Sep 19, 2026

Copy link
Copy Markdown

What

Hey 👋 I noticed that when upgrade dialog appears I always wanted to know more about what's new features this release will bring to me. So I implemented this: include full changelog of upstream in release text (this edits release script)

Before / after

Before — the current v2.1.5-1 release body:

file-85ec2725e055563398d139996332f69e

After, one upstream release (the common case):

image

After, a bundle that skipped a release (what v2.1.5-1 actually was —
v2.1.3 and v2.1.5, both linked and both included):

image

After scrolls
image

The same three bodies as plain text, exactly as the workflow writes them:

Release body today — v2.1.5-1 (110 characters)
Bundles Syncthing v2.1.5.

Upstream release notes: https://github.com/syncthing/syncthing/releases/tag/v2.1.5
Release body with this PR, one upstream release (1259 characters)
Bundles Syncthing v2.1.5.

Here is what's new in it:

- [Syncthing v2.1.5 changelog](https://github.com/syncthing/syncthing/releases/tag/v2.1.5)

---

## Major changes in 2.1

- Devices and folders can now be grouped in the GUI by setting the new
  `group` attribute.

- HTTP and HTTPS proxies with support for CONNECT can now be used, in
  addition to the existing support for SOCKS proxies (the environment
  variable `all_proxy=https://...`).

- Block indexing can be turned off for folders where it's more desirable to
  optimise for reduced database size and overhead than minimal transfer
  size (the `blockIndexing` attribute on folder configuration).

- GUI login session duration can be configured to be longer or shorter than
  the default one week, or set to infinitely long. The cookie path can also
  be adjusted. (The `sessionCookieDurationS` and `sessionCookiePath`
  attributes in the GUI configuration.)

This release is also available as:

* APT repository: https://apt.syncthing.net/

* Docker image: `docker.io/syncthing/syncthing:2.1.5` or `ghcr.io/syncthing/syncthing:2.1.5`
  (`{docker,ghcr}.io/syncthing/syncthing:2` to follow just the major version)

**Full Changelog**: https://github.com/syncthing/syncthing/compare/v2.1.4...v2.1.5
Release body with this PR, a bundle that skipped v2.1.3 (6112 characters)
Bundles Syncthing v2.1.5.

Here is what's new in v2.1.3–v2.1.5:

- [Syncthing v2.1.5 changelog](https://github.com/syncthing/syncthing/releases/tag/v2.1.5)
- [Syncthing v2.1.3 changelog](https://github.com/syncthing/syncthing/releases/tag/v2.1.3)

---

# Syncthing v2.1.5

## Major changes in 2.1

- Devices and folders can now be grouped in the GUI by setting the new
  `group` attribute.

- HTTP and HTTPS proxies with support for CONNECT can now be used, in
  addition to the existing support for SOCKS proxies (the environment
  variable `all_proxy=https://...`).

- Block indexing can be turned off for folders where it's more desirable to
  optimise for reduced database size and overhead than minimal transfer
  size (the `blockIndexing` attribute on folder configuration).

- GUI login session duration can be configured to be longer or shorter than
  the default one week, or set to infinitely long. The cookie path can also
  be adjusted. (The `sessionCookieDurationS` and `sessionCookiePath`
  attributes in the GUI configuration.)

This release is also available as:

* APT repository: https://apt.syncthing.net/

* Docker image: `docker.io/syncthing/syncthing:2.1.5` or `ghcr.io/syncthing/syncthing:2.1.5`
  (`{docker,ghcr}.io/syncthing/syncthing:2` to follow just the major version)

**Full Changelog**: https://github.com/syncthing/syncthing/compare/v2.1.4...v2.1.5

---

# Syncthing v2.1.3

## Major changes in 2.1

- Devices and folders can now be grouped in the GUI by setting the new
  `group` attribute.

- HTTP and HTTPS proxies with support for CONNECT can now be used, in
  addition to the existing support for SOCKS proxies (the environment
  variable `all_proxy=https://...`).

- Block indexing can be turned off for folders where it's more desirable to
  optimise for reduced database size and overhead than minimal transfer
  size (the `blockIndexing` attribute on folder configuration).

- GUI login session duration can be configured to be longer or shorter than
  the default one week, or set to infinitely long. The cookie path can also
  be adjusted. (The `sessionCookieDurationS` and `sessionCookiePath`
  attributes in the GUI configuration.)

This release is also available as:

* APT repository: https://apt.syncthing.net/

* Docker image: `docker.io/syncthing/syncthing:2.1.3` or `ghcr.io/syncthing/syncthing:2.1.3`
  (`{docker,ghcr}.io/syncthing/syncthing:2` to follow just the major version)

## What's Changed
### Fixes
* fix(ignore, fs): allow loading ignore patterns behind symlink (fixes #10785) by @calmh in https://github.com/syncthing/syncthing/pull/10786
* fix: avoid warning on does-not-exist scan error (fixes #10465) by @calmh in https://github.com/syncthing/syncthing/pull/10791
* fix(strelaypoolsrv): locking correctness by @calmh in https://github.com/syncthing/syncthing/pull/10801
* fix(model): properly health-check up-to-date folders (fixes #10546) by @calmh in https://github.com/syncthing/syncthing/pull/10773
* fix(gui): fix expanding one folder not collapsing others in group by @tbodt in https://github.com/syncthing/syncthing/pull/10809
* fix(gui): add bottom margin to folder action buttons for wrapped spacing by @rohitanwar in https://github.com/syncthing/syncthing/pull/10728
* fix(upnp): guard against out of index string access by @calmh in https://github.com/syncthing/syncthing/pull/10834
* fix(ignore): handle pattern resulting in empty string by @calmh in https://github.com/syncthing/syncthing/pull/10835
* fix(versioner): handle invalid empty command by @calmh in https://github.com/syncthing/syncthing/pull/10836
* fix(api): handle empty path in static request by @calmh in https://github.com/syncthing/syncthing/pull/10837
* fix(db, model): better handle db connections, puller concurrency, avoid deadlock (fixes #10841) by @calmh in https://github.com/syncthing/syncthing/pull/10842
### Other
* chore(fs): use x/sys/windows where possible by @greatroar in https://github.com/syncthing/syncthing/pull/10766
* chore(model): simplify FileInfoBatch size computation by @calmh in https://github.com/syncthing/syncthing/pull/10776
* build: allow inotify on Android amd64 (ref #8710) by @chenxiaolong in https://github.com/syncthing/syncthing/pull/10783
* chore: fix a couple of unclosed http connections by @calmh in https://github.com/syncthing/syncthing/pull/10806
* chore(gui): lazy-render collapsed panels to reduce watcher count by @Finomosec in https://github.com/syncthing/syncthing/pull/10772
* build(deps): update dependencies by @calmh in https://github.com/syncthing/syncthing/pull/10824
* chore: new code contribution guidelines by @calmh in https://github.com/syncthing/syncthing/pull/10821
* chore: remove ignore file caching entirely by @calmh in https://github.com/syncthing/syncthing/pull/10813
* chore: slightly optimise rename detection (ref #10777) by @calmh in https://github.com/syncthing/syncthing/pull/10819
* chore(gui): better describe when a pending folder/device notification will reappear by @tbodt in https://github.com/syncthing/syncthing/pull/10808
* chore: deflake TestRecvOnlyRevertNeeds by @calmh in https://github.com/syncthing/syncthing/pull/10827
* chore(model): don't check existing file twice in rename detection by @imsodin in https://github.com/syncthing/syncthing/pull/10833
* chore(fs): optimise casefs caching performance by @calmh in https://github.com/syncthing/syncthing/pull/10830
* chore(model): optimise fsync calls by @calmh in https://github.com/syncthing/syncthing/pull/10831
* chore(syncthing): include local db entries in perfstats by @calmh in https://github.com/syncthing/syncthing/pull/10839

## New Contributors
* @chenxiaolong made their first contribution in https://github.com/syncthing/syncthing/pull/10783
* @Finomosec made their first contribution in https://github.com/syncthing/syncthing/pull/10772
* @tbodt made their first contribution in https://github.com/syncthing/syncthing/pull/10809
* @rohitanwar made their first contribution in https://github.com/syncthing/syncthing/pull/10728

**Full Changelog**: https://github.com/syncthing/syncthing/compare/v2.1.2...v2.1.3

Skipped releases

A bundle doesn't always advance one upstream version. v2.1.2-1v2.1.5-1
skipped upstream v2.1.3 (4.7 kB of release notes), which no user has ever
seen in the updater. So the step collects every stable upstream release newer
than the previously bundled version, up to the one being bundled, newest first.

With one release the header reads "Here is what's new in it:" and there are no
per-version sections. With several it reads "Here is what's new in
v2.1.3–v2.1.5:" and each release gets its own # Syncthing vX.Y.Z section.

How this works

gh api repos/syncthing/syncthing/releases lists stable upstream releases and
gh release view --json body fetches each body. The previously bundled version
comes from the most recent release of this repo. If nothing can be read the
step emits a ::warning:: and publishes with the bare link as before, so a
GitHub API hiccup can never block a release. Assembly stops at 100 kB (GitHub
caps a release body at 125 kB) and appends a pointer to the releases page.

Switched from --notes to --notes-file to avoid embedding a multi-line
string in a YAML block scalar.

Testing

The run: block was extracted from the workflow and executed against a stubbed
gh:

case result
one new upstream release flat body, single changelog link
skipped release (prev 2.1.2, bundling 2.1.5) "v2.1.3–v2.1.5", two links, two sections
upstream API fails plain link + ::warning::, exit 0, release still published
first release of the repo (no previous) full range, no crash
oversized notes stops at 60 kB, appends "Older release notes" pointer
release tag already exists published=false, nothing created

The single- and multi-release bodies in the screenshots were generated by this
step against the live GitHub API, then fed through cmd/ghreleases2appcast.

Known limitation

This fixes notes for upstream releases a bundle skipped. A user who skips
several app releases still sees only the newest appcast item's notes, because
Sparkle renders one item — that can't be fixed from this workflow.

Note

Re-running generate-appcast.yml re-reads every release body, so editing the
bodies of past releases by hand would backfill their changelogs in the appcast too.

@ckesc ckesc changed the title ci: Include Syncthing changelog in published release notes build: include syncthing changelog in published release notes Sep 21, 2026

This branch has not been deployed

No deployments
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.

1 participant