Skip to content

Commit 1b2765d

Browse files
committed
Release 1.7.0
0 parents  commit 1b2765d

239 files changed

Lines changed: 69558 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cargo/config.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Build acceleration: sccache compiler cache + mold linker.
2+
# Requires `mold` and `sccache` on PATH (e.g. `pacman -S mold sccache`).
3+
# Bypass per-build with `CARGO_BUILD_RUSTC_WRAPPER= cargo …` (skip sccache)
4+
# or `RUSTFLAGS= cargo …` (skip mold); see AGENTS.md "Build acceleration".
5+
[build]
6+
rustc-wrapper = "sccache"
7+
8+
[target.x86_64-unknown-linux-gnu]
9+
rustflags = ["-C", "link-arg=-fuse-ld=mold"]

.github/workflows/ci.yml

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
# SPDX-FileCopyrightText: 2026 VisorCraft LLC
2+
# SPDX-License-Identifier: GPL-3.0-only
3+
#
4+
# Per-job CI matching the Grexa layout. Each gate runs in its own runner
5+
# so failures pinpoint quickly and the build job (which needs Arch's
6+
# fresher Kirigami) doesn't block the faster checks. Mirror of
7+
# grexa/ci.yml adapted for LinSync. No `${{ github.event.* }}`
8+
# interpolations are used: this workflow is safe against workflow
9+
# injection from PR titles, branch names, or commit messages.
10+
11+
name: ci
12+
13+
on:
14+
push:
15+
branches: [master]
16+
pull_request:
17+
branches: [master]
18+
19+
env:
20+
CARGO_TERM_COLOR: always
21+
RUST_BACKTRACE: 1
22+
# cxx-qt's build script picks Qt up via qmake6 on $PATH.
23+
QMAKE: /usr/bin/qmake6
24+
25+
jobs:
26+
fmt:
27+
name: rustfmt
28+
runs-on: ubuntu-latest
29+
steps:
30+
- uses: actions/checkout@v4
31+
- uses: dtolnay/rust-toolchain@stable
32+
with:
33+
components: rustfmt
34+
- run: cargo fmt --all -- --check
35+
36+
lint:
37+
name: clippy
38+
runs-on: ubuntu-latest
39+
steps:
40+
- uses: actions/checkout@v4
41+
- name: Install Qt 6 + C++ toolchain + mold/sccache
42+
run: |
43+
sudo apt-get update
44+
sudo apt-get install -y --no-install-recommends \
45+
qt6-base-dev \
46+
qt6-declarative-dev \
47+
qt6-tools-dev \
48+
libgl1-mesa-dev \
49+
clang \
50+
mold \
51+
sccache \
52+
ninja-build
53+
- uses: dtolnay/rust-toolchain@stable
54+
with:
55+
components: clippy
56+
- uses: Swatinem/rust-cache@v2
57+
- run: cargo clippy --workspace --all-targets -- -D warnings
58+
59+
test:
60+
name: test (stable)
61+
runs-on: ubuntu-latest
62+
steps:
63+
- uses: actions/checkout@v4
64+
- name: Install Qt 6 + runtime + C++ toolchain + mold/sccache
65+
run: |
66+
sudo apt-get update
67+
sudo apt-get install -y --no-install-recommends \
68+
qt6-base-dev \
69+
qt6-declarative-dev \
70+
qt6-tools-dev \
71+
libgl1-mesa-dev \
72+
clang \
73+
mold \
74+
sccache \
75+
ninja-build
76+
- uses: dtolnay/rust-toolchain@stable
77+
- uses: Swatinem/rust-cache@v2
78+
- run: cargo test --workspace
79+
80+
build:
81+
name: build + smoke GUI (Arch)
82+
runs-on: ubuntu-latest
83+
container:
84+
image: archlinux:base-devel
85+
steps:
86+
- name: Install Arch Qt 6 + Kirigami dependencies
87+
run: |
88+
pacman -Sy --noconfirm --needed archlinux-keyring
89+
pacman -Syu --noconfirm --needed \
90+
git \
91+
curl \
92+
ca-certificates \
93+
pkgconf \
94+
qt6-base \
95+
qt6-declarative \
96+
qt6-tools \
97+
kirigami \
98+
clang \
99+
mold \
100+
sccache \
101+
ninja \
102+
mesa
103+
- uses: actions/checkout@v4
104+
- uses: dtolnay/rust-toolchain@stable
105+
- uses: Swatinem/rust-cache@v2
106+
- name: Build GUI binary (cxx-qt in-process host)
107+
env:
108+
QT_VERSION_MAJOR: "6"
109+
run: |
110+
cargo build -p linsync --release \
111+
--features 'linsync/cxxqt linsync/cxxqt-app'
112+
- name: GUI smoke (external QML host)
113+
env:
114+
QT_QPA_PLATFORM: offscreen
115+
run: bash scripts/gui-smoke.sh
116+
- name: GUI smoke (in-process cxx-qt host)
117+
env:
118+
QT_QPA_PLATFORM: offscreen
119+
run: LINSYNC_GUI_SMOKE_CXXQT=1 bash scripts/gui-smoke.sh
120+
121+
screenshots:
122+
name: GUI screenshots
123+
runs-on: ubuntu-latest
124+
container:
125+
image: archlinux:base-devel
126+
needs: build
127+
env:
128+
QT_QPA_PLATFORM: offscreen
129+
steps:
130+
- name: Install Arch Qt 6 + Kirigami + screenshot dependencies
131+
run: |
132+
pacman -Sy --noconfirm --needed archlinux-keyring
133+
pacman -Syu --noconfirm --needed \
134+
git \
135+
curl \
136+
ca-certificates \
137+
pkgconf \
138+
qt6-base \
139+
qt6-declarative \
140+
qt6-tools \
141+
kirigami \
142+
clang \
143+
mold \
144+
sccache \
145+
ninja \
146+
mesa \
147+
xorg-server-xvfb \
148+
imagemagick
149+
- uses: actions/checkout@v4
150+
- uses: dtolnay/rust-toolchain@stable
151+
- uses: Swatinem/rust-cache@v2
152+
- name: Build GUI binary
153+
env:
154+
QT_VERSION_MAJOR: "6"
155+
run: |
156+
cargo build -p linsync --release \
157+
--features 'linsync/cxxqt linsync/cxxqt-app'
158+
- name: Capture screenshots
159+
env:
160+
LINSYNC_BIN: target/release/linsync
161+
STARTUP_SLEEP: "6"
162+
run: bash scripts/gui-screenshot.sh
163+
- name: Upload screenshots
164+
if: always()
165+
uses: actions/upload-artifact@v4
166+
with:
167+
name: linsync-screenshots-${{ github.sha }}
168+
path: target/screenshots/*.png
169+
170+
a11y-check:
171+
name: accessibility label grep
172+
runs-on: ubuntu-latest
173+
steps:
174+
- uses: actions/checkout@v4
175+
- name: Check every Button/Switch/SpinBox/ComboBox/TextField has a label
176+
run: bash scripts/gui-smoke.sh --check-a11y
177+
178+
deny:
179+
name: cargo-deny
180+
runs-on: ubuntu-latest
181+
# cargo-deny-action installs its own musl toolchain. Disable the
182+
# workspace's sccache wrapping (force = true in .cargo/config.toml)
183+
# for this job — the wrapper isn't available on the action's
184+
# toolchain path. RUSTFLAGS is similarly cleared so mold isn't a
185+
# hard requirement.
186+
env:
187+
CARGO_BUILD_RUSTC_WRAPPER: ""
188+
RUSTFLAGS: ""
189+
CC: cc
190+
CXX: c++
191+
steps:
192+
- uses: actions/checkout@v4
193+
- uses: dtolnay/rust-toolchain@stable
194+
- uses: EmbarkStudios/cargo-deny-action@v2
195+
196+
audit:
197+
name: cargo-audit
198+
runs-on: ubuntu-latest
199+
steps:
200+
- uses: actions/checkout@v4
201+
- uses: dtolnay/rust-toolchain@stable
202+
- name: Install cargo-audit
203+
run: cargo install cargo-audit --locked
204+
- run: cargo audit
205+
206+
appstream-validate:
207+
name: appstream metadata
208+
runs-on: ubuntu-latest
209+
steps:
210+
- uses: actions/checkout@v4
211+
- run: sudo apt-get update && sudo apt-get install -y appstream
212+
- run: appstreamcli validate --no-net packaging/io.visorcraft.LinSync.metainfo.xml
213+
214+
desktop-validate:
215+
name: desktop file
216+
runs-on: ubuntu-latest
217+
steps:
218+
- uses: actions/checkout@v4
219+
- run: sudo apt-get update && sudo apt-get install -y desktop-file-utils
220+
- run: desktop-file-validate packaging/io.visorcraft.LinSync.desktop
221+
222+
# NOTE: Flatpak CI is currently disabled.
223+
# bilelmoussaoui/flatpak-github-actions only publishes kde-5.15 tags
224+
# (verified 2026-05-26); there's no KDE 6 base image. The Flatpak
225+
# manifest pins org.kde.Platform//6.10 at *runtime* but the CI host
226+
# needs a matching base. To re-enable, either:
227+
# 1. Set up flatpak-builder on a stock ubuntu-latest runner with
228+
# apt-get install flatpak flatpak-builder and `flatpak install`
229+
# org.kde.Platform//6.10 from flathub, OR
230+
# 2. Use a published flatpak-builder image that has KDE 6 SDK.
231+
# Local builds via `just flatpak-bundle` continue to work for now.

0 commit comments

Comments
 (0)