Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
461 commits
Select commit Hold shift + click to select a range
18d5f75
Test stored strip layouts
Varitras Oct 21, 2026
fced098
Store strip layouts per model in the settings
Varitras Oct 21, 2026
b9e2abf
Test the strip layout rules
Varitras Oct 21, 2026
46bff68
Resolve and change strip layouts per model
Varitras Oct 21, 2026
e07f14b
Test toggling any switch path
Varitras Oct 21, 2026
b2c2c4d
Toggle any switch path
Varitras Oct 21, 2026
894f210
Test strips drawn from their layout
Varitras Oct 21, 2026
8298aea
Draw each strip from its model's layout
Varitras Oct 21, 2026
ccff8e6
Test the strip layout menus
Varitras Oct 21, 2026
bf075df
Change strip layouts from a context menu
Varitras Oct 21, 2026
bda1d92
Test the strip edit mode
Varitras Oct 22, 2026
926e657
Edit strip layouts on the desk
Varitras Oct 22, 2026
c63dd67
Document customizable strips
Varitras Oct 22, 2026
9f1d78c
Say that the narrow toolbar leaves the count out
Varitras Oct 22, 2026
43949f9
Test that the app looks for moved speakers by itself
Varitras Oct 22, 2026
b83c995
Look for remembered speakers at the start and when they stay away
Varitras Oct 22, 2026
211c3a6
Document the automatic search for moved speakers
Varitras Oct 22, 2026
c3c826c
Test that the strip's button row keeps one line
Varitras Oct 22, 2026
27de246
Keep the strip's buttons in their row
Varitras Oct 22, 2026
c089c03
Test that an edit-mode × covers no other control
Varitras Oct 22, 2026
78797c4
Put the edit-mode × in its element's corner
Varitras Oct 22, 2026
33bea1c
Test that the edit-mode × covers no knob, its own included
Varitras Oct 22, 2026
957e1bf
Put the edit-mode × under its element
Varitras Oct 22, 2026
afd3063
Test that strips and meters hold still while values change
Varitras Oct 22, 2026
d69c757
Size meter columns for every peak readout
Varitras Oct 22, 2026
65c4b80
Draw falling meters 20 times a second
Varitras Oct 22, 2026
9d437c5
Speed up the tests and the mutation runs
Varitras Oct 23, 2026
60b3ffc
Test when a lost speaker is looked for and panel keys
Varitras Oct 23, 2026
6e263a9
Test speaker removal and group deletion edges
Varitras Oct 23, 2026
8f5f23f
Show working values on strips by default
Varitras Oct 23, 2026
340efbc
Read the input interface and current input often
Varitras Oct 23, 2026
ff60679
Keep the logo brightness off the default strip
Varitras Oct 23, 2026
fc2186f
Open the device panel in a window of its own
Varitras Oct 23, 2026
8f1b125
Show delays in meters when chosen
Varitras Oct 23, 2026
084d60a
Note delays in meters in the changelog
Varitras Oct 23, 2026
984c05e
Let the scan dialog scan again
Varitras Oct 23, 2026
cf4225e
Keep empty meters on a strip before its first reading
Varitras Oct 23, 2026
4f2b430
Drag strip elements with the left button only
Varitras Oct 23, 2026
3800bb1
Remember each speaker's name and model
Varitras Oct 23, 2026
5d2f8f8
Add a Details button to group strips
Varitras Oct 23, 2026
0a3e7bf
Draw a pen on the edit button
Varitras Oct 23, 2026
7f9c26b
Order the device panel by topic
Varitras Oct 23, 2026
4816f46
Show where a dragged strip element lands
Varitras Oct 23, 2026
9f88d8f
Choose the meter floor in 10 dB steps
Varitras Oct 23, 2026
d6ddec2
Open the device panel within the screen
Varitras Oct 23, 2026
9083ac1
Give scroll bars room of their own
Varitras Oct 23, 2026
7531171
Label the temperature line and drop empty trends
Varitras Oct 23, 2026
589d887
Let the master strip be hidden
Varitras Oct 23, 2026
e3b9aa7
Fit the first window to the desk
Varitras Oct 23, 2026
20121b5
Open All values in a window of its own
Varitras Oct 23, 2026
97d8c05
Let compact rows' buttons be chosen per model
Varitras Oct 23, 2026
2804280
Add the manual and a help menu with an update check
Varitras Oct 23, 2026
39e1a14
Add the wiki to the help menu
Varitras Oct 23, 2026
e76851f
Show the current desk, EQ window and panel in the README
Varitras Oct 23, 2026
f8c9c4c
Bring the README in line with the build
Varitras Oct 23, 2026
b822406
Leave the build machine out of the README
Varitras Oct 23, 2026
45da3ae
Write only what an EQ point or knob gesture moved
Varitras Oct 24, 2026
dc8610b
Write a number field only for the value it is left with
Varitras Oct 24, 2026
7742e08
Write an EQ gesture to the EQ it was drawn for
Varitras Oct 24, 2026
ecfa598
Let only writable members shape group and master controls
Varitras Oct 24, 2026
0a3da11
Copy to the group what the member will hold
Varitras Oct 24, 2026
0125284
Base panel switches and lists on the value last sent
Varitras Oct 24, 2026
546b8e4
Refuse EQ files without a usable Q or for several channels
Varitras Oct 24, 2026
420d20f
Run one app per folder
Varitras Oct 24, 2026
e5c50a0
Never write over a settings file that was not understood
Varitras Oct 24, 2026
66948a8
Keep layout elements this version does not show
Varitras Oct 24, 2026
353330c
Ask before replacing or deleting presets and groups
Varitras Oct 24, 2026
0e0f6c5
Sum the KH 750 EQ per input
Varitras Oct 24, 2026
4bb71d5
Darken device LEDs of an unreachable speaker
Varitras Oct 24, 2026
a96111c
Mask identifiers the same way everywhere
Varitras Oct 24, 2026
dbfe715
Finish queued writes before stopping a worker
Varitras Oct 24, 2026
8ca37b2
Let Escape and the wheel act within each window
Varitras Oct 24, 2026
3a79582
Ask for the window before taking the context lock
Varitras Oct 24, 2026
6cc177d
Tell a range in the unit it is typed in
Varitras Oct 24, 2026
06ad1b8
Word scan and value failures instead of showing raw text
Varitras Oct 24, 2026
d7aeb31
Show history values as the panel does
Varitras Oct 24, 2026
a2204b4
Name the output in a KH 750 EQ export
Varitras Oct 24, 2026
7706583
Tell an unusable update answer from no answer
Varitras Oct 24, 2026
1c2f389
Load only whole stored presets, without identify
Varitras Oct 24, 2026
ac2804a
Write a settings preset all or nothing
Varitras Oct 24, 2026
81cc7ae
Tell take-back outcomes as they happened
Varitras Oct 24, 2026
42e9135
Let the peak follow the falling bar after its hold
Varitras Oct 24, 2026
0017dde
Count a running beta older than its final release
Varitras Oct 24, 2026
b721aa5
Take back an array of another length whole
Varitras Oct 24, 2026
2e5ca4b
Redact a short speaker name as a word only
Varitras Oct 24, 2026
adb5c45
Keep both scan reports written in one second
Varitras Oct 24, 2026
658f9ba
Drop meters a shorter level list leaves out
Varitras Oct 24, 2026
ad21464
Keep the first reported serial of an address-only speaker
Varitras Oct 24, 2026
fd470eb
Tell two serials at one address apart
Varitras Oct 24, 2026
56ed271
Start an hour-long trend axis at one hour
Varitras Oct 24, 2026
b72840d
Reload all values only from a connected speaker
Varitras Oct 24, 2026
d55912d
Keep the connection message over a not-connected refusal
Varitras Oct 24, 2026
3b6ccf7
Write the input mix in the speaker's number type
Varitras Oct 24, 2026
4150836
Put knobs without a catalog step on a decimal grid
Varitras Oct 24, 2026
7c22a53
Number Windows channels beyond stereo instead of guessing
Varitras Oct 24, 2026
eaaca60
Tell a trend's unrecorded start from an outage
Varitras Oct 24, 2026
04a2964
Keep a refused container schema to its own line
Varitras Oct 24, 2026
9a2dde5
Use is_multiple_of for the trend hour check
Varitras Oct 24, 2026
eb17952
Pick the same scope on every scan
Varitras Oct 24, 2026
979d1c9
Let a due path in between two meter rounds
Varitras Oct 24, 2026
69f151f
Note the single fixes in the changelog
Varitras Oct 24, 2026
5466b75
Bring the README in line with the build
Varitras Oct 24, 2026
40b630a
Correct stale doc comments
Varitras Oct 24, 2026
45fdc0c
Name undo, menus and the crossover lock consistently
Varitras Oct 24, 2026
408227a
Name each output's settings apart in the menus
Varitras Oct 24, 2026
f70d45c
Read warnings one way for the LED and the trend
Varitras Oct 24, 2026
c849a32
Keep the write rule in one place
Varitras Oct 24, 2026
57d8305
Drop the take-back notice's unused fields
Varitras Oct 24, 2026
ec46582
Tell the local time in one place
Varitras Oct 24, 2026
995db2a
Name the repository once, in the manifest
Varitras Oct 24, 2026
465f85d
Take EQ leaf names, types and range from the catalog
Varitras Oct 24, 2026
27bca54
Share the EQ table's units and band keys with their owners
Varitras Oct 24, 2026
a002a29
Name EQ outputs A and B as the panel does
Varitras Oct 24, 2026
7010859
Name the speakers' error codes once, in the protocol
Varitras Oct 24, 2026
cbbb196
Share the strip frame and name the grip's columns
Varitras Oct 24, 2026
4588a70
Map a theme to its tokens once
Varitras Oct 24, 2026
a60a600
Name the EQ graph's label room
Varitras Oct 24, 2026
c4d11ca
Write the scope suffix in one place
Varitras Oct 24, 2026
71f44b9
Drop the unused number setter, share the line rules
Varitras Oct 24, 2026
98de0fc
Make the edge drag test reach the boost limit
Varitras Oct 24, 2026
f577706
Make two catalog and layout tests check what they name
Varitras Oct 24, 2026
9ceea63
Put test docs where they belong and name tests for what they check
Varitras Oct 24, 2026
9ea75bc
Name core tests for their case and use the shared port and file name
Varitras Oct 24, 2026
8997888
Take test serials and the settings file name from one place
Varitras Oct 24, 2026
837c7bb
Take test paths and knob names from one place
Varitras Oct 24, 2026
f3f76c1
Share the tests' set helpers
Varitras Oct 24, 2026
801e322
Size the narrowest-window tests by the window's minimum
Varitras Oct 24, 2026
d34c564
Reuse the removal helpers, time speaker tests by the reply timeout
Varitras Oct 24, 2026
a319fb3
Set up two speakers in one test helper
Varitras Oct 24, 2026
44e5a5a
Name codes and band counts in the simulator tests
Varitras Oct 24, 2026
b756ecc
Test that a write never reaches a speaker of another serial
Varitras Oct 24, 2026
6e88749
Test that a refusal without xid is the reply
Varitras Oct 24, 2026
20381a2
Test the Windows volume scale and the chosen device
Varitras Oct 24, 2026
3319daf
Test the export of filters APO cannot hold
Varitras Oct 24, 2026
154fc8a
Test that a refused EQ preset writes nothing
Varitras Oct 24, 2026
65b4c39
Test the text length rule, forgotten meters and the depth limit
Varitras Oct 24, 2026
1301974
Test that an input clip lights the clip LED
Varitras Oct 24, 2026
9a8f871
Test an emptied group name and a failed save
Varitras Oct 24, 2026
1e01885
Test an empty answer to a write
Varitras Oct 24, 2026
8c9af12
Make the set test wait for the write's own answer
Varitras Oct 24, 2026
ae39c80
Test the import's size limit and lossy reading
Varitras Oct 24, 2026
5565a50
Test the crossover switch and cancelling a changed-since question
Varitras Oct 24, 2026
0a96174
Test an arrow key step in a number field
Varitras Oct 24, 2026
aac8aa4
Write a number field's arrow key and screen reader steps
Varitras Oct 24, 2026
ccd5ec3
Test a write just before the stop during a meter round
Varitras Oct 24, 2026
8f48222
Let writes that came before a stop go out first
Varitras Oct 24, 2026
a55c0a7
Test refused and outage-lost take-back bookkeeping
Varitras Oct 24, 2026
f92f16d
Close refused writes in the history, count lost ones as failed
Varitras Oct 24, 2026
76458d3
Tell a missing lock file from an unsupported lock
Varitras Oct 24, 2026
b950bc3
Test that another serial's announcement names no remembered speaker
Varitras Oct 24, 2026
2eb7bb9
Give a speaker only its own announcement
Varitras Oct 24, 2026
e62d664
Test filters before a single channel line
Varitras Oct 24, 2026
dcab2a5
Refuse filters before a single channel line
Varitras Oct 24, 2026
3196ed3
Name filters before a channel line among the refused imports
Varitras Oct 24, 2026
0e5800a
Start every point drag with its own offset
Varitras Oct 24, 2026
e6ac30a
Fix the docs, names and test ties the re-audit found
Varitras Oct 24, 2026
fad8a2a
Note the announcement sibling in the changelog
Varitras Oct 24, 2026
c274dd5
Wrap and tidy README and changelog lines
Varitras Oct 24, 2026
9dec0af
Test channel names from the speaker mask
Varitras Oct 24, 2026
1a57ecf
Name the Windows channels from the speaker mask
Varitras Oct 24, 2026
da48915
Share one drag gesture between fader and knob
Varitras Oct 24, 2026
0085536
Describe the Windows strip's channel names
Varitras Oct 24, 2026
acf7d92
Open the windows of their own where they were left
Varitras Oct 24, 2026
91fd19a
Close the settings at their top right, drop the panel's own close
Varitras Oct 24, 2026
862bc35
Delete a group from its strip's context menu
Varitras Oct 24, 2026
61f2a56
Choose a strip colour for groups and speakers
Varitras Oct 24, 2026
2211495
Let each speaker keep its own layout
Varitras Oct 24, 2026
244cd48
Raise the patch version with each release build
Varitras Oct 24, 2026
3f6ec5b
Ask for a Full scan of models the app only reads
Varitras Oct 24, 2026
e1bceb1
Bump version to 0.1.1
Varitras Oct 24, 2026
60e306c
Test choosing members in the group dialog
Varitras Oct 24, 2026
5cffc1d
Choose a group's speakers in its dialog
Varitras Oct 24, 2026
5247278
Bump version to 0.1.2
Varitras Oct 24, 2026
3e498f5
Leave an open window of its own where the user has it
Varitras Oct 24, 2026
98c26c8
Test that a drag stays with its speaker's own layout
Varitras Oct 24, 2026
5ec2cd5
Keep a drag within the layout it belongs to
Varitras Oct 24, 2026
21ae0f1
Test that a settings map keeps its readable entries
Varitras Oct 24, 2026
3c2ef81
Keep the readable entries of every settings map
Varitras Oct 24, 2026
16d0192
Bring the panel, group dialog and README docs up to date
Varitras Oct 24, 2026
abb7682
Bump version to 0.1.3
Varitras Oct 24, 2026
0bb5805
Remember a maximized window as maximized
Varitras Oct 24, 2026
84f7828
Open windows of a kind at one place, settings in a window
Varitras Oct 24, 2026
17f57fa
Say where a panel opens
Varitras Oct 24, 2026
8616f19
Bump version to 0.1.4
Varitras Oct 24, 2026
7ccc3b6
Test the detailed log setting and its text redaction
Varitras Oct 25, 2026
01a5824
Add a detailed log setting for troubleshooting
Varitras Oct 25, 2026
c40b0eb
Bump version to 0.1.5
Varitras Oct 25, 2026
55f732a
Keep the detailed log test off the shared log level
Varitras Oct 25, 2026
55ca577
Build tagged releases on GitHub
Varitras Oct 25, 2026
fb6bb20
Sort the device panel into tabs
Varitras Oct 25, 2026
4740b84
Bump version to 0.1.6
Varitras Oct 25, 2026
ef1bae9
Test that the name is edited on the overview only
Varitras Oct 25, 2026
d713852
Edit the name on the overview, show it on the device tab
Varitras Oct 25, 2026
43d1cbe
Test the trend on the device tab and a panel starting on the overview
Varitras Oct 25, 2026
e684482
Move the trend to the device tab, open panels on the overview
Varitras Oct 25, 2026
8524140
Open preset dialogs in front of the panel, compare a loaded preset
Varitras Oct 25, 2026
5d51119
Bump version to 0.1.7
Varitras Oct 25, 2026
c905ea8
Test the new defaults for the master strip and crossovers
Varitras Oct 25, 2026
aff35ad
Hide the master strip and leave crossovers open by default
Varitras Oct 25, 2026
1e6c93d
Bump version to 0.1.8
Varitras Oct 25, 2026
ece0d10
Test a preset window drawn twice in one frame
Varitras Oct 25, 2026
398301b
Let a preset window be drawn again in one frame
Varitras Oct 25, 2026
e32b3b4
Write a crash to the log
Varitras Oct 25, 2026
0278071
Bump version to 0.1.9
Varitras Oct 25, 2026
54e61b7
Test that a shown delay reads back as its sample
Varitras Oct 25, 2026
2f51ae6
Show a delay field rounded, meters to the millimetre
Varitras Oct 25, 2026
c69498e
Test the EQ preset comparison
Varitras Oct 25, 2026
f33be06
Compare an EQ preset per band and value before loading
Varitras Oct 25, 2026
d81975a
Bump version to 0.1.10
Varitras Oct 25, 2026
4e92696
Test a REW plain high pass without Q
Varitras Oct 25, 2026
27cd605
Import a REW plain high pass with its Q of 1/sqrt(2)
Varitras Oct 25, 2026
02904ec
Bump version to 0.1.11
Varitras Oct 25, 2026
db46e8f
Test deleting a group from its compact row
Varitras Oct 25, 2026
4c38f25
Delete a group from its compact row, frame a speaker row in its colour
Varitras Oct 25, 2026
3cb5462
Test a REW plain low pass and its two-word all pass
Varitras Oct 25, 2026
3459932
Import REW's plain low pass and its two-word all pass
Varitras Oct 25, 2026
1bd641a
Wait for a write's answer before a test stops its speaker
Varitras Oct 25, 2026
a878096
Test the desk's keyboard shortcuts
Varitras Oct 25, 2026
5f456f4
Add desk shortcuts: master up and down, mute all, dim
Varitras Oct 25, 2026
e4c6218
Show the dim button only while dim is on
Varitras Oct 25, 2026
0424e00
Test global shortcuts and add the hot key listener
Varitras Oct 25, 2026
9aaf57f
Listen for the desk's shortcuts from other programs when chosen
Varitras Oct 25, 2026
c5627d5
Test that strips, knob fields and EQ type choices are named
Varitras Oct 25, 2026
c0fe738
Name strips, rows, knob fields and EQ type choices for screen readers
Varitras Oct 25, 2026
b75c731
Describe the screen reader names
Varitras Oct 25, 2026
d2dad6b
Bump version to 0.1.12
Varitras Oct 25, 2026
a8da404
Draw worker news at most once a meter frame
Varitras Oct 25, 2026
2b9d778
Turn the busy spinner at a bounded frame rate
Varitras Oct 25, 2026
cc84c39
Read the Windows peaks half as often in silence
Varitras Oct 25, 2026
48b2e18
Take global shortcuts with Ctrl+Shift+Alt
Varitras Oct 25, 2026
82fd74a
Bring a speaker back from dim once it is reached
Varitras Oct 25, 2026
fd78567
Refuse EQ lines that name a Q but have none
Varitras Oct 25, 2026
671224d
Keep shortcuts while a button has the focus
Varitras Oct 25, 2026
87dd310
Bring stale comments and the shortcut note up to date
Varitras Oct 25, 2026
e5995a3
Bump version to 0.1.13
Varitras Oct 25, 2026
1d338a6
Name what asks for the frames in the detailed log
Varitras Oct 25, 2026
421ef99
Bump version to 0.1.14
Varitras Oct 25, 2026
e34f50f
Log the process CPU beside the frame time
Varitras Oct 25, 2026
ddd208d
Bump version to 0.1.15
Varitras Oct 25, 2026
651d2c8
Keep frames a sixtieth of a second apart
Varitras Oct 25, 2026
0e3d3c2
Bump version to 0.1.16
Varitras Oct 25, 2026
61ef8d9
Fit the first window with its scroll bars counted
Varitras Oct 25, 2026
960faa3
Open windows over the middle of the main window
Varitras Oct 25, 2026
2611cb6
Continue the EQ table in columns to the right
Varitras Oct 25, 2026
8a14c40
Bump version to 0.1.17
Varitras Oct 25, 2026
ca07c02
Start the frame summary anew when the detailed log is switched on
Varitras Oct 25, 2026
5a1b7b0
Show the device panel's outputs and inputs tabs in the README
Varitras Oct 25, 2026
1574be9
Join the history of the published README and screenshots
Varitras Oct 25, 2026
e353350
Bring the README and the CHANGELOG up to date
Varitras Oct 25, 2026
6744fcc
Let tests wait for every write before checking it
Varitras Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# cargo-mutants: `cargo mutants --workspace` (see README, "Building from source").
exclude_globs = [
# Test infrastructure; its own faults show up as failing tests elsewhere.
"crates/core/src/simulator/**",
# Drawing code: a moved pixel survives every test by design, which would bury real gaps.
"crates/app/src/views/**",
"crates/app/src/ui_kit/**",
"crates/app/src/main.rs",
# The manual generator only runs in the release build, which fails on a broken manual.
"crates/manual/src/main.rs",
]
# Windows' browser and WinHTTP: no test may start one or go online.
exclude_re = ["windows_help"]
# nextest runs the tests of all test binaries at once and stops at the first failure; the
# tests themselves are short, run one binary after another they were most of a mutant's time.
test_tool = "nextest"
# Kittests wait on real sockets; a slow mutant is not a caught one.
timeout_multiplier = 3.0
4 changes: 4 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# A mutation run only needs to know whether some test fails: the first failure ends the run and
# stops the tests still running (`NEXTEST_PROFILE=mutants`, see README "Building from source").
[profile.mutants]
fail-fast = { max-fail = 1, terminate = "immediate" }
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* text=auto eol=lf
*.ttf binary
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/new-model.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Support for another model
description: Send the Full scan of a speaker the app only reads, so it can learn to write it.
title: "Support for <model>"
body:
- type: markdown
attributes:
value: |
On the **Device** tab of the speaker's device panel, press **Full scan**. It
writes `scan-<model>-<firmware>-<date>-<time>.json` and `.txt` next to the executable,
without serial number, MAC address, the speaker's name or any network address.
- type: input
id: model
attributes:
label: Model
placeholder: KH 80
validations:
required: true
- type: input
id: firmware
attributes:
label: Firmware version
validations:
required: true
- type: textarea
id: scan
attributes:
label: Full scan files
description: Drag both scan files (.json and .txt) into this field.
validations:
required: true
- type: textarea
id: notes
attributes:
label: Anything else
description: Settings you would like to change, or what differs from the KH 120 II.
17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Monthly, grouped: one PR per ecosystem. CI on pull_request tests each bump.
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
groups:
actions:
patterns: ["*"]
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "monthly"
groups:
cargo:
patterns: ["*"]
41 changes: 41 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# One pipeline: CI runs the same check.ps1 as the pre-push hook.
# `branches` and `branches-ignore` must never both appear on one event.
name: ci

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
check:
runs-on: windows-latest
# A cold cache once hit 45 minutes.
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
with:
workspaces: .
# Prebuilt and checksum-verified: building cargo-audit from source took
# about 11 minutes per run and pushed cold-cache runs past the timeout.
# Only cargo-audit is unpinned: Dependabot does not update tool
# versions here, and an outdated cargo-audit can fail on a newer
# advisory database.
- uses: taiki-e/install-action@v2
with:
tool: cargo-about@0.9,cargo-audit
- run: ./check.ps1
shell: pwsh
- run: cargo build --release --locked -p neumann-control-app
- uses: actions/upload-artifact@v7
with:
name: neumann-control-exe
path: target/release/neumann-control.exe
59 changes: 59 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# A tag v<version> on main builds the release on a clean runner and attaches it to a draft
# GitHub release; publishing the draft stays a manual step.
name: release

on:
push:
tags: ['v*']

permissions:
contents: write

jobs:
release:
runs-on: windows-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
with:
# The whole history: the tag must be proven to lie on main.
fetch-depth: 0
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
with:
workspaces: .
- uses: taiki-e/install-action@v2
with:
tool: cargo-about@0.9,cargo-audit
- name: Tag, main and version agree
shell: pwsh
run: |
$tag = '${{ github.ref_name }}'
$manifest = Get-Content Cargo.toml -Raw
if ($manifest -notmatch '(?s)\[workspace\.package\][^\[]*?\nversion = "([^"]+)"') {
throw 'no [workspace.package] version in Cargo.toml'
}
$version = $Matches[1]
if ($tag -ne "v$version") { throw "tag $tag does not match version $version" }
git merge-base --is-ancestor HEAD origin/main
if ($LASTEXITCODE -ne 0) { throw "tag $tag is not on main" }
"VERSION=$version" >> $env:GITHUB_ENV
- name: Release notes from the CHANGELOG
shell: pwsh
run: ./release-notes.ps1 -Version $env:VERSION -OutFile "$env:RUNNER_TEMP/release-notes.md"
# The gate and the build, as locally; the version stays the tag's.
- name: Build the release folder
shell: pwsh
run: ./build-release.ps1 -KeepVersion
- name: Draft the GitHub release
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: |
$folder = "release/neumann-control-$env:VERSION"
Compress-Archive -Path $folder -DestinationPath "release/neumann-control-$env:VERSION.zip"
gh release create '${{ github.ref_name }}' --draft --verify-tag `
--title "Neumann Control $env:VERSION" --notes-file "$env:RUNNER_TEMP/release-notes.md" `
"release/neumann-control-$env:VERSION.zip" "$folder/SHA256SUMS"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/target
/release
/mutants.out*/
Loading