Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions apps/maple-research/frontend/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
"icons/icon.ico"
],
"linux": {
"rpm": {
"depends": ["libwebkit2gtk-4.1.so.0()(64bit)"]
},
"appimage": {
"bundleMediaFramework": true,
"files": {
Expand Down
5 changes: 5 additions & 0 deletions docs/repository-workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,11 @@ macOS 13.4 and iOS 16.0.
Research Linux packaging builds AppImage and DEB with Tauri, then the RPM from
the normalized DEB payload. `scripts/ci/sccache-stats.sh` reports compiler-cache
statistics with the build's own cache configuration.
The RPM builder preserves explicit `bundle.linux.rpm.depends` from the Tauri
configuration. WebKitGTK (`webkit2gtk4.1`) is required on Fedora, including KDE;
package verification rejects RPMs missing that requirement. Install a downloaded
RPM through Discover or `sudo dnf install ./Maple-<version>-1.x86_64.rpm` so the
package manager resolves dependencies, rather than using `rpm --nodeps`.

For a side-by-side hosted Dev installation, use
`nix run --no-update-lock-file .#research-dev-desktop`, not an ordinary Research
Expand Down
12 changes: 12 additions & 0 deletions scripts/ci/_common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3828,10 +3828,22 @@ verify_linux_appimage_executable_metadata() {
return "${status}"
}

verify_linux_rpm_package_dependencies() {
local package="$1"
local requires

requires="$(rpm -qp --requires "${package}")" || return 1
if ! grep -Fxq 'libwebkit2gtk-4.1.so.0()(64bit)' <<< "${requires}"; then
echo "RPM is missing the required libwebkit2gtk-4.1.so.0()(64bit) capability: ${package}" >&2
return 1
fi
}

verify_linux_rpm_package_executable_metadata() {
local rpm="$1"
local tmp status

verify_linux_rpm_package_dependencies "${rpm}" || return 1
tmp="$(mktemp -d)"
status=0
(
Expand Down
49 changes: 49 additions & 0 deletions scripts/ci/test_linux_rpm_packaging.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,55 @@ def test_built_dev_rpm_declares_the_runtime_capability(self):
self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", requires)
self.assertNotIn("webkit2gtk4.1", requires)

def test_rpm_preserves_configured_runtime_dependencies(self):
config = json.loads((ROOT / "apps/maple-research/frontend/src-tauri/tauri.conf.json").read_text())
self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", config["bundle"]["linux"]["rpm"]["depends"])
self.assertNotIn("webkit2gtk4.1", config["bundle"]["linux"]["rpm"]["depends"])
(self.tauri / "tauri.conf.json").write_text(json.dumps(config))
self.fake_rpmbuild(0)
result = self.run_factory()
self.assertEqual(result.returncode, 0, result.stderr)
spec = (self.tauri / "maple.spec").read_text()
self.assertIn("Requires: libwebkit2gtk-4.1.so.0()(64bit)\n", spec)

def test_rpm_dependency_verification(self):
for requires, expected in (
("libwebkit2gtk-4.1.so.0()(64bit)", 0),
("rpmlib(PayloadFilesHavePrefix) <= 4.0-1", 1),
("webkit2gtk4.1", 1),
("libwebkit2gtk-4_1-0", 1),
("libwebkit2gtk-4.0.so.0()(64bit)", 1),
("libwebkit2gtk-4.1.so.0", 1),
):
with self.subTest(requires=requires):
result = self.run_shell(f'''
rpm() {{ printf '%s\\n' '{requires}'; }}
verify_linux_rpm_package_dependencies fixture.rpm
''')
self.assertEqual(result.returncode, expected, result.stderr)

@unittest.skipUnless(shutil.which("rpmbuild") and shutil.which("rpm"), "RPM tools are unavailable")
def test_built_rpm_declares_webkit_dependency(self):
config = json.loads((ROOT / "apps/maple-research/frontend/src-tauri/tauri.conf.json").read_text())
config["version"] = "1.2.3"
(self.tauri / "tauri.conf.json").write_text(json.dumps(config))
result = self.run_factory()
self.assertEqual(result.returncode, 0, result.stderr)
requires = subprocess.run(
["rpm", "-qp", "--requires", str(self.rpm)],
capture_output=True, text=True, check=True,
).stdout.splitlines()
self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", requires)
verified = self.run_shell(f'verify_linux_rpm_package_dependencies "{self.rpm}"')
self.assertEqual(verified.returncode, 0, verified.stderr)

def test_rpm_query_failure_is_rejected(self):
result = self.run_shell('''
rpm() { return 19; }
verify_linux_rpm_package_dependencies fixture.rpm
''')
self.assertNotEqual(result.returncode, 0)

def test_failed_final_move_is_not_hidden_by_cleanup(self):
self.fake_rpmbuild(0)
result = self.run_factory('mv() { return 19; }\n')
Expand Down
Loading