authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-30 12:13:41-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-30 13:01:08-07:00
logb84975878e595dee72c6be1246a69dc46154a336
tree2318142403bf210f4d129f71bd156d372b0340c8
parentdf545058d6e66cccbce7f56c1814f5a922c8a6cb
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

feat(release): stable download names, linked from the readme

Assisted-by: claude-opus-5.5

2 files changed, 13 insertions(+), 0 deletions(-)

readme.md+2
......@@ -12,6 +12,8 @@ pen and drawing tools [(WIP)](https://shale.paperclover.net/snowbound/issues/21)
1212[(WIP)](https://shale.paperclover.net/snowbound/issues/36), revision
1313history, multi-machine live collaboration, and much more.
1414
15**Download**: macOS: [Silicon](https://file.paperclover.net/shr/snowbound/download/Snowbound-macos-aarch64.zip) • Linux: [x86_64](https://file.paperclover.net/shr/snowbound/download/snowbound-linux-x86_64), [aarch64](https://file.paperclover.net/shr/snowbound/download/snowbound-linux-aarch64) • Windows: [x64](https://file.paperclover.net/shr/snowbound/download/snowbound-windows-x86_64.exe), [Arm](https://file.paperclover.net/shr/snowbound/download/snowbound-windows-aarch64.exe) • [OS X](https://file.paperclover.net/shr/snowbound/download/Snowbound-macos-10.6.zip)
16
1517<!-- Regenerate from the sample notebook (edit it freely in OneNote or Snowbound):
1618python3 tools/canvas/build_macos.py --release && d=$(mktemp -d) && cp -R docs/sample-notebook/Personal "$d" && target/Snowbound.app/Contents/MacOS/Snowbound --notebook "$d/Personal" --cache "$d/cache" --settings "$d/settings.json" --screenshot docs/screenshot
1719-->
tools/release.py+11
......@@ -234,6 +234,17 @@ def main():
234234 partial.write_text(json.dumps(moved, indent=2, sort_keys=True) + '\n')
235235 os.replace(partial, latest_file)
236236 print(f'{latest_file}: {json.dumps(moved, sort_keys=True)}')
237 # Stable names for the readme's download links, always the newest build of each platform.
238 downloads = published / 'download'
239 downloads.mkdir(exist_ok=True)
240 for platform, newest_name in moved.items():
241 if newest_name != name(version):
242 continue
243 file = build['archives'][platform]['file']
244 stable = downloads / file.replace(f'-{name(version)}', '')
245 partial = stable.with_name(f'.{stable.name}.partial')
246 shutil.copy(target / file, partial)
247 os.replace(partial, stable)
237248 if not args.dry_run:
238249 print(f'{URL}{folder(version)}/')
239250