Files
proton-drive-linux/packaging/proton-drive-linux.spec
T
nvrl ad648ab5cc feat(cli,core): shell completions with live values from the service
`pdfs completions <shell>` prints a completion script for bash, zsh, fish,
elvish or PowerShell, built on clap_complete's dynamic engine: on Tab the
shell calls `pdfs` back, which completes commands and options and also the
values the running service knows, each with a description: paths in My
files, synced-folder and queue ids, computers, trash, albums, items shared
with me, invitations, bookmarks, conflict copies, and a file's versions or
a share's members and public link once its path is typed.

A completer that gets no answer from the service within two seconds offers
nothing rather than hanging the prompt. Listings that ask Proton are kept
for 30 s in $XDG_RUNTIME_DIR (0600), so repeated Tabs do not wait again.
Completion is triggered by PDFS_COMPLETE rather than clap's generic
COMPLETE, because the same binary runs the daemon.

Share roles are now checked by the CLI before the request. The package
recipes install the bash, zsh and fish scripts via packaging/completions.sh.
2026-11-12 11:47:29 +01:00

163 lines
6.0 KiB
RPMSpec

# Two ways to build this spec:
#
# - From a checkout (local builds and the release workflow). From the repository root:
# rpmbuild -bb packaging/proton-drive-linux.spec --define "git_dir $PWD" ...
# %build needs network so cargo can fetch crates.io (same trade-off as the Arch PKGBUILD).
# - From the release tarballs (COPR, .github/workflows/copr.yml), when git_dir is not
# defined. Source1 holds every crate, so the build runs offline.
%global debug_package %{nil}
# Match Arch PKGBUILD `!lto` — LTO has broken some GTK/Rust links in practice.
%global _lto_cflags %{nil}
%{!?version: %global version 3.8.0}
%global forge https://github.com/narrrl/proton-drive-linux
# Files come from the checkout, or from the unpacked tag archive.
%global src %{?git_dir}%{!?git_dir:.}
Name: proton-drive-linux
Version: %{version}
Release: 1%{?dist}
Summary: Unofficial Proton Drive client for Linux (FUSE, CLI, GTK4 app + tray)
License: MIT
URL: https://proton-drive.narl.io
ExclusiveArch: x86_64
%if 0%{!?git_dir:1}
Source0: %{forge}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
Source1: %{forge}/releases/download/v%{version}/%{name}-vendor-%{version}.tar.xz
%endif
BuildRequires: cargo
BuildRequires: rust >= 1.96
BuildRequires: pkgconf-pkg-config
BuildRequires: fuse3-devel
BuildRequires: gtk4-devel
BuildRequires: libadwaita-devel
BuildRequires: libsecret-devel
BuildRequires: dbus-devel
BuildRequires: glib2-devel
BuildRequires: webkitgtk6.0-devel
BuildRequires: gettext
Requires: fuse3
Requires: gtk4
Requires: libadwaita
Requires: libsecret
Requires: webkitgtk6.0
Requires: perl-Image-ExifTool
Requires: xdg-utils
# DE-specific; do not Require a single desktop environment. dnf installs weak
# dependencies by default, so each is conditional on its own desktop: a plain
# `Recommends: kwallet` pulled KDE Frameworks onto GNOME installs.
Recommends: (gnome-keyring or plasma-workspace)
Recommends: iso-codes
Recommends: (gnome-shell-extension-appindicator if gnome-shell)
Recommends: (kwallet if plasma-workspace)
# Only for `pdfs-prompt --fzf`; every other front end works without them.
Suggests: fzf
Suggests: foot
Provides: pdfs = %{version}-%{release}
%description
Files-on-demand Proton Drive for the Linux desktop: a FUSE virtual mount with
block-level caching, a scriptable CLI, and a GTK4/Libadwaita desktop app with
system tray and search launcher. Unofficial and not affiliated with Proton AG.
%prep
%if 0%{?git_dir:1}
# In-tree build: no Source tarball.
test -f %{git_dir}/Cargo.toml
cp -a %{git_dir}/LICENSE .
%else
# -a 1 unpacks the vendored crates into vendor/ inside the source tree.
%autosetup -n %{name}-%{version} -a 1
mkdir -p .cargo
cat > .cargo/config.toml <<'EOF'
[source.crates-io]
replace-with = "vendored-sources"
[source.vendored-sources]
directory = "vendor"
EOF
%endif
%build
# The release workflow has already built target/release and passes --define "prebuilt 1".
# rpmbuild exports its own compiler flags, which would make cargo rebuild everything.
%if 0%{?prebuilt}
test -x %{git_dir}/target/release/pdfs
%else
cd %{src}
cargo build --release %{?git_dir:--locked}%{!?git_dir:--frozen} \
--bin pdfs \
--bin pdfs-tray \
--bin pdfs-app \
--bin pdfs-prompt
%endif
%install
rel=%{src}/target/release
install -D -m0755 "$rel/pdfs" %{buildroot}%{_bindir}/pdfs
install -D -m0755 "$rel/pdfs-tray" %{buildroot}%{_bindir}/pdfs-tray
install -D -m0755 "$rel/pdfs-app" %{buildroot}%{_bindir}/pdfs-app
install -D -m0755 "$rel/pdfs-prompt" %{buildroot}%{_bindir}/pdfs-prompt
install -D -m0644 %{src}/packaging/io.narl.proton-drive-linux.desktop \
%{buildroot}%{_datadir}/applications/io.narl.proton-drive-linux.desktop
install -D -m0644 %{src}/packaging/io.narl.proton-drive-linux-tray.desktop \
%{buildroot}%{_sysconfdir}/xdg/autostart/io.narl.proton-drive-linux-tray.desktop
install -D -m0644 %{src}/packaging/io.narl.proton-drive-linux.svg \
%{buildroot}%{_datadir}/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg
install -D -m0644 %{src}/packaging/proton-drive.service \
%{buildroot}/usr/lib/systemd/user/proton-drive.service
%{src}/po/build.sh %{buildroot}%{_datadir}/locale
%{src}/packaging/completions.sh "$rel/pdfs" %{buildroot}%{_datadir}
%if 0%{!?git_dir:1}
# dnf brings new releases from COPR, so the app does not offer its own check.
install -D -m0644 /dev/null %{buildroot}%{_datadir}/proton-drive-linux/managed-updates
%endif
# Removing the package does not stop a running daemon: it keeps serving the
# mount from the deleted binary, so files deleted under the mount afterwards,
# `rm -rf ~/ProtonDrive` included, are still deleted on Proton Drive. Stop every
# logged-in user's service first; anything still queued stays on disk for the
# next install. $1 is 0 on an erase and 1 on an upgrade. Same loop as
# packaging/proton-drive.install.
%preun
if [ "$1" -eq 0 ]; then
for dir in /run/user/*; do
user=$(id -nu "${dir##*/}" 2>/dev/null) || continue
if runuser -u "$user" -- env XDG_RUNTIME_DIR="$dir" \
systemctl --user --quiet is-active proton-drive.service 2>/dev/null; then
echo "Stopping Proton Drive for $user, which unmounts its drive."
runuser -u "$user" -- env XDG_RUNTIME_DIR="$dir" \
systemctl --user stop proton-drive.service 2>/dev/null || :
fi
done
fi
%files
%license LICENSE
%{_bindir}/pdfs
%{_bindir}/pdfs-tray
%{_bindir}/pdfs-app
%{_bindir}/pdfs-prompt
%{_datadir}/applications/io.narl.proton-drive-linux.desktop
%{_sysconfdir}/xdg/autostart/io.narl.proton-drive-linux-tray.desktop
%{_datadir}/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg
/usr/lib/systemd/user/proton-drive.service
%{_datadir}/locale/*/LC_MESSAGES/pdfs.mo
%{_datadir}/bash-completion/completions/pdfs
%{_datadir}/zsh/site-functions/_pdfs
%{_datadir}/fish/vendor_completions.d/pdfs.fish
%if 0%{!?git_dir:1}
%{_datadir}/proton-drive-linux/managed-updates
%endif
%changelog
* Sun Jul 19 2026 Local Packager - 0.4.0-1
- Initial Fedora local package (in-tree cargo build).