mirror of
https://github.com/narrrl/proton-drive-linux.git
synced 2026-11-03 16:41:26 +01:00
added ci + readme
This commit is contained in:
1 parent
862740c4ee
commit
f69ddd9ee8
4 files changed
+313
-4
No files matched your search
@@ -0,0 +1,189 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-release:
|
||||||
|
name: Build and Release
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
pkg-config \
|
||||||
|
libfuse3-dev \
|
||||||
|
libgtk-4-dev \
|
||||||
|
libadwaita-1-dev \
|
||||||
|
libsecret-1-dev \
|
||||||
|
libdbus-1-dev \
|
||||||
|
desktop-file-utils
|
||||||
|
|
||||||
|
- name: Set up Rust
|
||||||
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: Cache Cargo target
|
||||||
|
uses: swatinem/rust-cache@v2
|
||||||
|
|
||||||
|
- name: Build release binaries
|
||||||
|
run: |
|
||||||
|
cargo build --release --locked
|
||||||
|
|
||||||
|
- name: Determine version
|
||||||
|
run: |
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
# Extract version from tag (e.g. v0.1.0 -> 0.1.0)
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
VERSION=${VERSION#v}
|
||||||
|
else
|
||||||
|
# Fallback for manual workflow runs: extract version from Cargo.toml
|
||||||
|
VERSION=$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2)
|
||||||
|
VERSION="${VERSION}-dev-${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
||||||
|
echo "Building version: $VERSION"
|
||||||
|
|
||||||
|
- name: Package raw binaries (.tar.gz)
|
||||||
|
run: |
|
||||||
|
mkdir -p dist/binaries
|
||||||
|
cp target/release/pdfs dist/binaries/
|
||||||
|
cp target/release/pdfs-tray dist/binaries/
|
||||||
|
cp target/release/pdfs-app dist/binaries/
|
||||||
|
|
||||||
|
# Create tarball
|
||||||
|
tar -czf proton-drive-linux-${{ env.VERSION }}-x86_64.tar.gz -C dist/binaries .
|
||||||
|
|
||||||
|
- name: Package Debian package (.deb)
|
||||||
|
run: |
|
||||||
|
mkdir -p deb/DEBIAN
|
||||||
|
mkdir -p deb/usr/bin
|
||||||
|
mkdir -p deb/usr/share/applications
|
||||||
|
mkdir -p deb/usr/share/icons/hicolor/scalable/apps
|
||||||
|
mkdir -p deb/usr/share/licenses/proton-drive-linux
|
||||||
|
|
||||||
|
# Copy binaries
|
||||||
|
cp target/release/pdfs deb/usr/bin/
|
||||||
|
cp target/release/pdfs-tray deb/usr/bin/
|
||||||
|
cp target/release/pdfs-app deb/usr/bin/
|
||||||
|
|
||||||
|
# Copy desktop integration files
|
||||||
|
cp packaging/io.narl.proton-drive-linux.desktop deb/usr/share/applications/
|
||||||
|
cp packaging/io.narl.proton-drive-linux.svg deb/usr/share/icons/hicolor/scalable/apps/
|
||||||
|
cp LICENSE deb/usr/share/licenses/proton-drive-linux/
|
||||||
|
|
||||||
|
# Calculate Installed-Size in KB for the control file
|
||||||
|
INSTALLED_SIZE=$(du -sk deb | cut -f1)
|
||||||
|
|
||||||
|
# Write DEBIAN/control file
|
||||||
|
cat <<EOF > deb/DEBIAN/control
|
||||||
|
Package: proton-drive-linux
|
||||||
|
Version: ${{ env.VERSION }}
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Architecture: amd64
|
||||||
|
Maintainer: Nils Pukropp <contact@narl.io>
|
||||||
|
Depends: fuse3, libgtk-4-1 (>= 4.12.0), libadwaita-1-0 (>= 1.5.0), libsecret-1-0
|
||||||
|
Installed-Size: ${INSTALLED_SIZE}
|
||||||
|
Description: Proton Drive client for Linux
|
||||||
|
Proton Drive client for Linux featuring:
|
||||||
|
- FUSE files-on-demand mount
|
||||||
|
- Command-line interface (CLI)
|
||||||
|
- GTK4 system tray and desktop application
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Build Debian package
|
||||||
|
dpkg-deb --build deb proton-drive-linux_${{ env.VERSION }}_amd64.deb
|
||||||
|
|
||||||
|
- name: Package AppImage (.AppImage)
|
||||||
|
run: |
|
||||||
|
# 1. Set up AppDir structure
|
||||||
|
mkdir -p AppDir/usr/bin
|
||||||
|
mkdir -p AppDir/usr/share/applications
|
||||||
|
mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
|
||||||
|
|
||||||
|
# Copy binaries
|
||||||
|
cp target/release/pdfs AppDir/usr/bin/
|
||||||
|
cp target/release/pdfs-tray AppDir/usr/bin/
|
||||||
|
cp target/release/pdfs-app AppDir/usr/bin/
|
||||||
|
|
||||||
|
# Copy desktop integration files
|
||||||
|
cp packaging/io.narl.proton-drive-linux.desktop AppDir/usr/share/applications/
|
||||||
|
cp packaging/io.narl.proton-drive-linux.svg AppDir/usr/share/icons/hicolor/scalable/apps/
|
||||||
|
|
||||||
|
# Create required AppImage root symlinks
|
||||||
|
ln -s usr/share/applications/io.narl.proton-drive-linux.desktop AppDir/
|
||||||
|
ln -s usr/share/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg AppDir/
|
||||||
|
|
||||||
|
# 2. Write custom AppRun to support multi-call execution
|
||||||
|
cat <<'EOF' > AppDir/AppRun
|
||||||
|
#!/bin/sh
|
||||||
|
HERE="$(dirname "$(readlink -f "${0}")")"
|
||||||
|
ARG0="$(basename "${0}")"
|
||||||
|
case "${ARG0}" in
|
||||||
|
pdfs)
|
||||||
|
exec "${HERE}/usr/bin/pdfs" "$@"
|
||||||
|
;;
|
||||||
|
pdfs-tray)
|
||||||
|
exec "${HERE}/usr/bin/pdfs-tray" "$@"
|
||||||
|
;;
|
||||||
|
pdfs-app)
|
||||||
|
exec "${HERE}/usr/bin/pdfs-app" "$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Support running a specific binary by passing its name as first arg
|
||||||
|
if [ "$1" = "pdfs" ] || [ "$1" = "pdfs-tray" ] || [ "$1" = "pdfs-app" ]; then
|
||||||
|
CMD="$1"
|
||||||
|
shift
|
||||||
|
exec "${HERE}/usr/bin/${CMD}" "$@"
|
||||||
|
else
|
||||||
|
# Default behavior: run GUI app
|
||||||
|
exec "${HERE}/usr/bin/pdfs-app" "$@"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
EOF
|
||||||
|
chmod +x AppDir/AppRun
|
||||||
|
|
||||||
|
# 3. Download and extract appimagetool (avoids FUSE mount failures in CI)
|
||||||
|
curl -Lo appimagetool https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage
|
||||||
|
chmod +x appimagetool
|
||||||
|
./appimagetool --appimage-extract
|
||||||
|
|
||||||
|
# 4. Generate AppImage
|
||||||
|
ARCH=x86_64 ./squashfs-root/AppRun AppDir proton-drive-linux-${{ env.VERSION }}-x86_64.AppImage
|
||||||
|
|
||||||
|
- name: Upload Workflow Artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: proton-drive-linux-builds
|
||||||
|
path: |
|
||||||
|
*.deb
|
||||||
|
*.AppImage
|
||||||
|
*.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
*.deb
|
||||||
|
*.AppImage
|
||||||
|
*.tar.gz
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
Generated
+6
-2
@@ -3031,7 +3031,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proton-drive-rs"
|
name = "proton-drive-rs"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c9380c88a032e2ff079b2d5a6221ccc40ebeee3ebbb4ea60d4d65ef770e4ca8d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64",
|
"base64",
|
||||||
@@ -3054,7 +3056,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proton-sdk"
|
name = "proton-sdk"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1da22604d2568af2d15be6a45f23f8c5b95fa775bdac1540e833c2eafb587888"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes-gcm",
|
"aes-gcm",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|||||||
+2
-2
@@ -11,8 +11,8 @@ rust-version = "1.96"
|
|||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
# Local Proton SDK crates (path deps until published; switch to versioned later).
|
# Local Proton SDK crates (path deps until published; switch to versioned later).
|
||||||
proton-sdk = { path = "../proton-sdk-rs/crates/proton-sdk" }
|
proton-sdk = "0.1"
|
||||||
proton-drive-rs = { path = "../proton-sdk-rs/crates/proton-drive-rs" }
|
proton-drive-rs = "0.1"
|
||||||
|
|
||||||
# Internal crates.
|
# Internal crates.
|
||||||
pdfs-core = { path = "crates/pdfs-core" }
|
pdfs-core = { path = "crates/pdfs-core" }
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# Proton Drive client for Linux (unofficial)
|
||||||
|
|
||||||
|
A fast, unofficial Proton Drive client for Linux. This client provides a FUSE files-on-demand virtual mount, a command-line interface (CLI), and a GTK4 desktop application with system tray integration.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Files-on-demand (FUSE)**: Mount your Proton Drive as a virtual filesystem where files are downloaded only when opened.
|
||||||
|
- **Command-Line Interface (CLI)**: Manage your drive, authenticate, and monitor sync status directly from the terminal.
|
||||||
|
- **GTK4 Desktop App**: Log in, browse files, and configure sync options through a modern, native Linux GUI.
|
||||||
|
- **System Tray Integration**: Background indicator for status monitoring, quick actions, and fast sync controls.
|
||||||
|
- **Secure Credential Storage**: Integrates with the system Secret Service (GNOME Keyring, KWallet, etc.) for safe token storage.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
To compile the application from source or run the built binaries, ensure you have the following system libraries installed on your distribution:
|
||||||
|
|
||||||
|
### Ubuntu / Debian (24.04+)
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
pkg-config \
|
||||||
|
libfuse3-dev \
|
||||||
|
libgtk-4-dev \
|
||||||
|
libadwaita-1-dev \
|
||||||
|
libsecret-1-dev \
|
||||||
|
libdbus-1-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
```bash
|
||||||
|
sudo pacman -S --needed pkgconf fuse3 gtk4 libadwaita libsecret dbus
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Building from Source
|
||||||
|
|
||||||
|
Ensure you have Rust and Cargo installed (minimum supported Rust version is 1.96).
|
||||||
|
|
||||||
|
1. Clone the repository and navigate into the project directory:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/narl/proton-drive-linux.git
|
||||||
|
cd proton-drive-linux
|
||||||
|
```
|
||||||
|
2. Build the workspace in release mode:
|
||||||
|
```bash
|
||||||
|
cargo build --release --locked
|
||||||
|
```
|
||||||
|
|
||||||
|
The compiled binaries will be available under `target/release/`:
|
||||||
|
- `pdfs`: The CLI utility.
|
||||||
|
- `pdfs-app`: The GTK4 application.
|
||||||
|
- `pdfs-tray`: The tray status notifier.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation & Packages
|
||||||
|
|
||||||
|
### 1. Debian / Ubuntu (.deb)
|
||||||
|
Install the debian package via `dpkg` or `apt`:
|
||||||
|
```bash
|
||||||
|
sudo apt install ./proton-drive-linux_*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. AppImage (.AppImage)
|
||||||
|
The AppImage is a portable build that packages all binaries. Make it executable and run it:
|
||||||
|
```bash
|
||||||
|
chmod +x proton-drive-linux-*.AppImage
|
||||||
|
./proton-drive-linux-*.AppImage
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> The AppImage is a multi-call binary. By default, running it launches the GUI. You can run the CLI or the Tray app by passing their name as the first argument, or by renaming/symlinking the AppImage file:
|
||||||
|
> ```bash
|
||||||
|
> # Run CLI
|
||||||
|
> ./proton-drive-linux-*.AppImage pdfs --help
|
||||||
|
>
|
||||||
|
> # Run Tray
|
||||||
|
> ./proton-drive-linux-*.AppImage pdfs-tray
|
||||||
|
> ```
|
||||||
|
|
||||||
|
### 3. Arch Linux
|
||||||
|
A local `PKGBUILD` is available under the `packaging/` directory. You can build and install it using:
|
||||||
|
```bash
|
||||||
|
cd packaging && makepkg -fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Automated Releases (CI/CD)
|
||||||
|
|
||||||
|
This project has a GitHub Actions CI workflow configured under `.github/workflows/release.yml`.
|
||||||
|
|
||||||
|
### How it works:
|
||||||
|
1. **Triggers**:
|
||||||
|
- Pushing a git tag matching `v*` (e.g. `git tag v0.1.0 && git push origin v0.1.0`).
|
||||||
|
- Manual runs via the **Actions** tab in GitHub (**workflow_dispatch**).
|
||||||
|
2. **Build Process**:
|
||||||
|
- Spawns an Ubuntu runner and installs GTK4, Libadwaita, FUSE3, and Secret Service packages.
|
||||||
|
- Sets up the Rust compiler and caches build targets to speed up runs.
|
||||||
|
- Compiles the workspace members in release mode.
|
||||||
|
3. **Artifact Packaging**:
|
||||||
|
- Generates a `.tar.gz` containing the raw binaries (`pdfs`, `pdfs-app`, `pdfs-tray`).
|
||||||
|
- Packs them into a Debian package (`.deb`).
|
||||||
|
- Builds a portable AppImage using `appimagetool` without requiring FUSE inside CI.
|
||||||
|
4. **Publishing**:
|
||||||
|
- Creates a GitHub Release matching the pushed tag and uploads the `.deb`, `.AppImage`, and `.tar.gz` packages as release assets.
|
||||||
|
- For manual runs, compiles and exposes the packages as workflow run artifacts for testing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the [MIT License](LICENSE).
|
||||||
Reference in new issue
Block a user