mirror of
https://github.com/narrrl/proton-drive-linux.git
synced 2026-11-03 16:41:26 +01:00
feat(packaging): COPR repository for Fedora
The spec builds from the tag archive and a vendored crates tarball when git_dir is not defined, so COPR can build it without network access. release.yml publishes the vendor tarball and submits the build to COPR after the release is published. Refs #42
This commit is contained in:
1 parent
eb25c16fe6
commit
29b87ece72
9 files changed
+201
-27
No files matched your search
@@ -0,0 +1,43 @@
|
||||
# COPR repository
|
||||
|
||||
Fedora users install from the COPR project
|
||||
[`narrrl/proton-drive-linux`](https://copr.fedorainfracloud.org/coprs/narrrl/proton-drive-linux/),
|
||||
so `dnf upgrade` brings every release. COPR builds `packaging/proton-drive-linux.spec` from two
|
||||
release assets:
|
||||
|
||||
| Source | What it is |
|
||||
| --- | --- |
|
||||
| `Source0` | GitHub's archive of the `v<version>` tag |
|
||||
| `Source1` | `proton-drive-linux-vendor-<version>.tar.xz`: every crate from `Cargo.lock`, made by `cargo vendor` in `release.yml` |
|
||||
|
||||
With the vendored crates the build needs no network, so the COPR project keeps network access
|
||||
off.
|
||||
|
||||
## Releasing a new version
|
||||
|
||||
`.github/workflows/copr.yml` does this automatically:
|
||||
|
||||
- **On a release tag**, `release.yml` calls it after the GitHub release is published. It writes
|
||||
the version into the spec, downloads both sources with `spectool`, builds a source package
|
||||
and submits it with `copr-cli build`. The job waits for COPR, so a failed build fails the
|
||||
release workflow.
|
||||
- **By hand**, run the workflow from the Actions tab with a version. The release must already
|
||||
have its vendor tarball.
|
||||
|
||||
It needs the `COPR_CONFIG` repository secret: the whole content of `~/.config/copr` from
|
||||
<https://copr.fedorainfracloud.org/api/>. **The token expires after 180 days.** Renew it on that
|
||||
page and replace the secret, or the next release's COPR job fails.
|
||||
|
||||
To do the same by hand:
|
||||
|
||||
```bash
|
||||
spectool -g -C ~/rpmbuild/SOURCES packaging/proton-drive-linux.spec
|
||||
rpmbuild -bs packaging/proton-drive-linux.spec
|
||||
copr-cli build narrrl/proton-drive-linux ~/rpmbuild/SRPMS/proton-drive-linux-*.src.rpm
|
||||
```
|
||||
|
||||
## Project settings
|
||||
|
||||
- Chroots: `fedora-44-x86_64`, `fedora-45-x86_64` and `fedora-rawhide-x86_64`. The spec is
|
||||
`ExclusiveArch: x86_64` and needs `rust >= 1.96`.
|
||||
- Network access in builds: off.
|
||||
@@ -1,13 +1,19 @@
|
||||
# Local in-tree RPM (mirrors packaging/PKGBUILD).
|
||||
# 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).
|
||||
# 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 0.4.0}
|
||||
%{!?version: %global version 3.5.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}
|
||||
@@ -16,9 +22,13 @@ Summary: Unofficial Proton Drive client for Linux (FUSE, CLI, GTK4 app +
|
||||
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
|
||||
BuildRequires: rust >= 1.96
|
||||
BuildRequires: pkgconf-pkg-config
|
||||
BuildRequires: fuse3-devel
|
||||
BuildRequires: gtk4-devel
|
||||
@@ -57,18 +67,31 @@ 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
|
||||
# In-tree build: no Source tarball. Pass --define "git_dir /path/to/checkout".
|
||||
test -n "%{?git_dir}" || (echo 'Pass --define "git_dir $PWD" from the repo root' >&2; exit 1)
|
||||
%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 %{git_dir}
|
||||
cargo build --release --locked \
|
||||
cd %{src}
|
||||
cargo build --release %{?git_dir:--locked}%{!?git_dir:--frozen} \
|
||||
--bin pdfs \
|
||||
--bin pdfs-tray \
|
||||
--bin pdfs-app \
|
||||
@@ -76,21 +99,21 @@ cargo build --release --locked \
|
||||
%endif
|
||||
|
||||
%install
|
||||
rel=%{git_dir}/target/release
|
||||
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 %{git_dir}/packaging/io.narl.proton-drive-linux.desktop \
|
||||
install -D -m0644 %{src}/packaging/io.narl.proton-drive-linux.desktop \
|
||||
%{buildroot}%{_datadir}/applications/io.narl.proton-drive-linux.desktop
|
||||
install -D -m0644 %{git_dir}/packaging/io.narl.proton-drive-linux-tray.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 %{git_dir}/packaging/io.narl.proton-drive-linux.svg \
|
||||
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 %{git_dir}/packaging/proton-drive.service \
|
||||
install -D -m0644 %{src}/packaging/proton-drive.service \
|
||||
%{buildroot}/usr/lib/systemd/user/proton-drive.service
|
||||
%{git_dir}/po/build.sh %{buildroot}%{_datadir}/locale
|
||||
%{src}/po/build.sh %{buildroot}%{_datadir}/locale
|
||||
|
||||
# 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,
|
||||
|
||||
Reference in new issue
Block a user