Merge branch 'feat/issue-37-nix'

This commit is contained in:
nvrl committed 2026-10-11 21:48:28 +02:00
commit bb28a18f49
9 files changed
+331

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
# NixOS module: installs the package and runs the mount daemon in every
# graphical session, as the other packages' user service does.
#
# services.proton-drive-linux.enable = true;
self:
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.proton-drive-linux;
in
{
options.services.proton-drive-linux = {
enable = lib.mkEnableOption "the Proton Drive for Linux mount daemon, app and tray";
package = lib.mkOption {
type = lib.types.package;
default = self.packages.${pkgs.stdenv.hostPlatform.system}.proton-drive-linux;
defaultText = lib.literalExpression "proton-drive-linux.packages.\${system}.proton-drive-linux";
description = "The package to use.";
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ cfg.package ];
# The unit ships in the package; this links it and pulls it into the
# graphical session, which is what `systemctl --user enable` would do.
systemd.packages = [ cfg.package ];
systemd.user.services.proton-drive = {
wantedBy = [ "graphical-session.target" ];
# The mount runs fusermount3 from PATH, and it has to be the setuid
# wrapper; the PATH NixOS gives a unit does not include it.
path = [ "/run/wrappers" ];
};
programs.fuse.enable = lib.mkDefault true;
# Session tokens are kept in the Secret Service.
services.gnome.gnome-keyring.enable = lib.mkDefault true;
};
}
+127
View File
@@ -0,0 +1,127 @@
# Nix package for the workspace, built from the checkout this file lives in.
# The flake at the repository root exposes it; `nix build` builds it.
{
lib,
rustPlatform,
adwaita-icon-theme,
pkg-config,
gettext,
glib,
wrapGAppsHook4,
fuse3,
glib-networking,
gtk4,
libadwaita,
webkitgtk_6_0,
libsecret,
dbus,
exiftool,
ffmpeg-headless,
withFfmpeg ? true,
}:
let
cargoToml = lib.importTOML ../../Cargo.toml;
in
rustPlatform.buildRustPackage {
pname = "proton-drive-linux";
inherit (cargoToml.workspace.package) version;
# Only what the build reads, so editing docs or CI does not rebuild.
src = lib.fileset.toSource {
root = ../..;
fileset = lib.fileset.unions [
../../Cargo.toml
../../Cargo.lock
../../crates
../../po
../../LICENSE
../proton-drive.service
../io.narl.proton-drive-linux.desktop
../io.narl.proton-drive-linux-tray.desktop
../io.narl.proton-drive-linux.svg
];
};
cargoLock.lockFile = ../../Cargo.lock;
cargoBuildFlags = [
"--bin"
"pdfs"
"--bin"
"pdfs-tray"
"--bin"
"pdfs-app"
"--bin"
"pdfs-prompt"
];
nativeBuildInputs = [
pkg-config
gettext # msgfmt, for po/build.sh
glib # glib-compile-resources, for the GUI's build.rs
wrapGAppsHook4
];
buildInputs = [
fuse3
# TLS for WebKitGTK's GIO: without it the CAPTCHA page fails with "TLS
# support is not available". wrapGAppsHook4 adds it to GIO_EXTRA_MODULES.
glib-networking
# The stock icons the app asks for, such as the Photos and Computers
# sidebar entries. GTK ships only a few itself, and a session without
# Adwaita installed showed the rest as missing. wrapGAppsHook4 adds it to
# XDG_DATA_DIRS.
adwaita-icon-theme
gtk4
libadwaita
webkitgtk_6_0
libsecret
dbus
];
# The app looks for its catalogs here instead of /usr/share/locale.
env.PDFS_LOCALEDIR = "${placeholder "out"}/share/locale";
# The suite mounts FUSE, talks to D-Bus and the kernel keyring, and checks
# permissions a build sandbox does not have; CI runs it on every push.
doCheck = false;
postInstall = ''
install -Dm644 packaging/io.narl.proton-drive-linux.desktop \
$out/share/applications/io.narl.proton-drive-linux.desktop
install -Dm644 packaging/io.narl.proton-drive-linux-tray.desktop \
$out/etc/xdg/autostart/io.narl.proton-drive-linux-tray.desktop
install -Dm644 packaging/io.narl.proton-drive-linux.svg \
$out/share/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg
substituteInPlace $out/share/applications/io.narl.proton-drive-linux.desktop \
--replace-fail "Exec=pdfs-app" "Exec=$out/bin/pdfs-app"
substituteInPlace $out/etc/xdg/autostart/io.narl.proton-drive-linux-tray.desktop \
--replace-fail "Exec=pdfs-tray" "Exec=$out/bin/pdfs-tray"
install -Dm644 packaging/proton-drive.service \
$out/lib/systemd/user/proton-drive.service
substituteInPlace $out/lib/systemd/user/proton-drive.service \
--replace-fail "ExecStart=/usr/bin/pdfs" "ExecStart=$out/bin/pdfs"
patchShebangs po/build.sh
po/build.sh $out/share/locale
'';
# Thumbnails shell out to exiftool, and to ffmpeg for video. Suffixed, so a
# user's own builds on PATH win. fusermount3 comes from the system: on NixOS
# it is the setuid wrapper in /run/wrappers/bin.
preFixup = ''
gappsWrapperArgs+=(--suffix PATH : ${
lib.makeBinPath ([ exiftool ] ++ lib.optional withFfmpeg ffmpeg-headless)
})
'';
meta = {
description = "Unofficial Proton Drive client for Linux: files-on-demand FUSE mount, CLI, GTK4 app and tray";
homepage = "https://proton-drive.narl.io";
license = lib.licenses.mit;
platforms = lib.platforms.linux;
mainProgram = "pdfs";
};
}