diff --git a/.github/workflows/droplet-ci.yml b/.github/workflows/droplet-ci.yml new file mode 100644 index 00000000..c125d2e7 --- /dev/null +++ b/.github/workflows/droplet-ci.yml @@ -0,0 +1,56 @@ +name: Droplet CI + +on: + push: + branches: [develop] + paths: + - "libraries/droplet/**" + - "libraries/droplet_types/**" + - "libraries/libarchive/**" + - ".github/workflows/droplet-ci.yml" + pull_request: + branches: [develop] + paths: + - "libraries/droplet/**" + - "libraries/droplet_types/**" + - "libraries/libarchive/**" + - ".github/workflows/droplet-ci.yml" + workflow_dispatch: + +env: + CARGO_TERM_COLOR: always + +jobs: + ci: + name: Build, Test, Lint + runs-on: ubuntu-latest + defaults: + run: + working-directory: libraries/droplet + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt, clippy + + - name: Rust cache + uses: swatinem/rust-cache@v2 + with: + workspaces: "./libraries/droplet -> target" + + - name: Install libarchive + run: | + sudo apt-get update + sudo apt-get install -y libarchive-dev + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run Clippy (lint) + run: cargo clippy --all-targets --all-features -- -D warnings + + - name: Run tests + run: cargo test --all-features --all --verbose diff --git a/sites/promo/.github/workflows/deploy.yml b/.github/workflows/pages.yml similarity index 52% rename from sites/promo/.github/workflows/deploy.yml rename to .github/workflows/pages.yml index e1913327..2d60988d 100644 --- a/sites/promo/.github/workflows/deploy.yml +++ b/.github/workflows/pages.yml @@ -1,10 +1,15 @@ -name: Deploy Next.js site to Pages +name: Deploy website to GitHub Pages on: - # Runs on pushes targeting the main branch + # Runs on pushes targeting the default branch push: - branches: - - main + branches: [develop] + paths: + - "sites/promo/**" + - "package.json" + - "pnpm-lock.yaml" + - "pnpm-workspace.yaml" + - ".github/workflows/pages.yml" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -15,11 +20,10 @@ permissions: pages: write id-token: write -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false +# Allow only one concurrent deployment per the "pages" group, skipping runs queued +# between the in-progress run and the latest queued one. cancel-in-progress defaults +# to false, so in-flight production deployments are allowed to complete. +concurrency: "pages" jobs: build: @@ -28,20 +32,21 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - name: Install pnpm + - name: Install pnpm + uses: pnpm/action-setup@v4 with: - version: 10 run_install: false - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 22 - cache: 'pnpm' + node-version: "22" + cache: "pnpm" + # Only install the promo site (radiant) and its dependencies so the public + # website deploy stays decoupled from the server/desktop build pipelines. - name: Install dependencies - run: pnpm install + run: pnpm install --filter radiant... - name: Setup Pages id: setup_pages @@ -51,14 +56,15 @@ jobs: uses: actions/cache@v4 with: path: | - .next/cache + sites/promo/.next/cache # Generate a new cache whenever packages or source files change. - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} + key: ${{ runner.os }}-nextjs-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('sites/promo/**.[jt]s', 'sites/promo/**.[jt]sx') }} # If source files changed but packages didn't, rebuild from a prior cache. restore-keys: | - ${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}- + ${{ runner.os }}-nextjs-${{ hashFiles('pnpm-lock.yaml') }}- - name: Build with Next.js + working-directory: sites/promo run: pnpm run build env: PAGES_BASE_PATH: ${{ steps.setup_pages.outputs.base_path }} @@ -66,7 +72,7 @@ jobs: - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: ./out + path: sites/promo/out deploy: environment: @@ -77,4 +83,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/server/.github/workflows/ci.yml b/.github/workflows/server-ci.yml similarity index 66% rename from server/.github/workflows/ci.yml rename to .github/workflows/server-ci.yml index 6b602148..99511123 100644 --- a/server/.github/workflows/ci.yml +++ b/.github/workflows/server-ci.yml @@ -1,12 +1,24 @@ -name: CI +name: Server CI on: push: - branches: - - develop + branches: [develop] + paths: + - "server/**" + - "libraries/base/**" + - "package.json" + - "pnpm-lock.yaml" + - "pnpm-workspace.yaml" + - ".github/workflows/server-ci.yml" pull_request: - branches: - - develop + branches: [develop] + paths: + - "server/**" + - "libraries/base/**" + - "package.json" + - "pnpm-lock.yaml" + - "pnpm-workspace.yaml" + - ".github/workflows/server-ci.yml" permissions: contents: read @@ -18,8 +30,6 @@ jobs: steps: - name: Check out the repo uses: actions/checkout@v4 - with: - submodules: true - name: Install pnpm uses: pnpm/action-setup@v4 @@ -34,6 +44,7 @@ jobs: run: pnpm install - name: Typecheck + working-directory: server run: pnpm run typecheck lint: @@ -42,8 +53,6 @@ jobs: steps: - name: Check out the repo uses: actions/checkout@v4 - with: - submodules: true - name: Install pnpm uses: pnpm/action-setup@v4 @@ -58,4 +67,5 @@ jobs: run: pnpm install - name: Lint + working-directory: server run: pnpm run lint diff --git a/desktop/.github/ISSUE_TEMPLATE/bug_report.md b/desktop/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 1735f730..00000000 --- a/desktop/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. Arch Linux, Windows] - - App Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/desktop/.github/ISSUE_TEMPLATE/feature_request.md b/desktop/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/desktop/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/desktop/.github/workflows/release.yml b/desktop/.github/workflows/release.yml deleted file mode 100644 index 14933985..00000000 --- a/desktop/.github/workflows/release.yml +++ /dev/null @@ -1,128 +0,0 @@ -name: "publish" - -on: - workflow_dispatch: {} - release: - types: [published] - # This can be used to automatically publish nightlies at UTC nighttime -# schedule: -# - cron: "0 2 * * *" # run at 2 AM UTC - -# This workflow will trigger on each push to the `release` branch to create or update a GitHub release, build your app, and upload the artifacts to the release. - -jobs: - publish-tauri: - permissions: - contents: write - strategy: - fail-fast: false - matrix: - include: - - platform: "macos-14" # for Arm based macs (M1 and above). - args: "--target aarch64-apple-darwin" - - platform: "macos-14" # for Intel based macs. - args: "--target x86_64-apple-darwin" - - platform: "ubuntu-22.04" # for Tauri v1 you could replace this with ubuntu-20.04. - args: "" - - platform: "ubuntu-22.04-arm" - args: "--target aarch64-unknown-linux-gnu" - - platform: "windows-latest" - args: "" - - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v4 - with: - submodules: true - token: ${{ secrets.GITHUB_TOKEN }} - - - name: setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - run_install: false - - - name: setup node - uses: actions/setup-node@v4 - with: - node-version: lts/* - cache: pnpm - - - - name: install Rust nightly - uses: dtolnay/rust-toolchain@nightly - with: - # Those targets are only used on macos runners so it's in an `if` to slightly speed up windows and linux builds. - targets: ${{ matrix.platform == 'macos-14' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }} - - - name: Rust cache - uses: swatinem/rust-cache@v2 - with: - workspaces: './src-tauri -> target' - - - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-22.04' || matrix.platform == 'ubuntu-22.04-arm' # This must match the platform value defined above. - run: | - sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf xdg-utils - # webkitgtk 4.0 is for Tauri v1 - webkitgtk 4.1 is for Tauri v2. - - - name: Import Apple Developer Certificate - if: matrix.platform == 'macos-14' - env: - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - run: | - echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12 - security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain - security default-keychain -s build.keychain - security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain - security set-keychain-settings -t 3600 -u build.keychain - - - echo "Created keychain" - - curl https://droposs.org/drop.der --output drop.der - - # swiftc libs/appletrust/add-certificate.swift - # ./add-certificate drop.der - # rm add-certificate - - # echo "Added certificate to keychain using swift util" - - ## Script is equivalent to: - sudo security authorizationdb write com.apple.trust-settings.admin allow - sudo security add-trusted-cert -d -r trustRoot -k build.keychain -p codeSign -u -1 drop.der - sudo security authorizationdb remove com.apple.trust-settings.admin - - security import certificate.p12 -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign - echo "Imported certificate" - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" build.keychain - security find-identity -v -p codesigning build.keychain - - - name: Verify Certificate - if: matrix.platform == 'macos-14' - run: | - CERT_INFO=$(security find-identity -v -p codesigning build.keychain | grep "Drop OSS") - CERT_ID=$(echo "$CERT_INFO" | awk -F'"' '{print $2}') - echo "CERT_ID=$CERT_ID" >> $GITHUB_ENV - echo "Certificate imported. Using identity: $CERT_ID" - - - name: install frontend dependencies - run: pnpm install # change this to npm, pnpm or bun depending on which one you use. - - - uses: tauri-apps/tauri-action@v0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }} - NO_STRIP: true - with: - tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version. - releaseName: "Auto-release v__VERSION__" - releaseBody: "See the assets to download this version and install. This release was created automatically." - releaseDraft: false - prerelease: true - args: ${{ matrix.args }} diff --git a/libraries/droplet/.github/workflows/test.yml b/libraries/droplet/.github/workflows/test.yml deleted file mode 100644 index 02c5c64c..00000000 --- a/libraries/droplet/.github/workflows/test.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Rust CI - -on: - push: - branches: [ main, master ] - pull_request: - branches: [ main, master ] - -env: - CARGO_TERM_COLOR: always - -jobs: - ci: - name: Build, Test, Lint - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 3 # fix for when this gets triggered by tag - fetch-tags: true - ref: ${{ github.ref }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@nightly - with: - components: rustfmt, clippy - - - name: Cache cargo registry - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install libarchive - run: | - sudo apt-get install libarchive-dev -y - - - - name: Check formatting - run: cargo fmt --all -- --check - - - name: Run Clippy (lint) - run: cargo clippy --all-targets --all-features -- -D warnings - - - name: Run tests - run: cargo test --all-features --all --verbose \ No newline at end of file diff --git a/libraries/droplet/src/lib.rs b/libraries/droplet/src/lib.rs index b13f620c..2331bbda 100644 --- a/libraries/droplet/src/lib.rs +++ b/libraries/droplet/src/lib.rs @@ -1,7 +1,5 @@ #![deny(clippy::all)] #![feature(impl_trait_in_bindings)] -#![feature(nonpoison_mutex)] -#![feature(sync_nonpoison)] pub mod file_utils; pub mod manifest; pub mod ssl; diff --git a/libraries/droplet/src/main.rs b/libraries/droplet/src/main.rs index c8fe74bf..71600081 100644 --- a/libraries/droplet/src/main.rs +++ b/libraries/droplet/src/main.rs @@ -1,6 +1,6 @@ use std::{env, path::PathBuf}; -use droplet_rs::manifest::{ManifestWriterFactory, generate_manifest_rusty}; +use droplet_rs::manifest::{generate_manifest_rusty, ManifestWriterFactory}; use tokio::runtime::Handle; struct SinkFactory {} diff --git a/libraries/droplet/src/manifest.rs b/libraries/droplet/src/manifest.rs index 145558c4..a8bd97ef 100644 --- a/libraries/droplet/src/manifest.rs +++ b/libraries/droplet/src/manifest.rs @@ -2,6 +2,7 @@ use std::{collections::HashMap, ops::Not, path::Path}; use anyhow::anyhow; use async_trait::async_trait; +pub use droplet_types::{ChunkData, FileEntry, Manifest}; use futures::StreamExt; use hex::ToHex as _; use humansize::{format_size, BINARY}; @@ -9,8 +10,6 @@ use sha2::{Digest as _, Sha256}; use tokio::io::AsyncWriteExt; use tokio::io::{AsyncReadExt as _, AsyncWrite}; use tokio::sync::Semaphore; -pub use droplet_types::{ChunkData, FileEntry, Manifest}; - pub const CHUNK_SIZE: u64 = 1024 * 1024 * 64; pub const MAX_FILE_COUNT: usize = 512; @@ -44,7 +43,7 @@ where "Could not create backend for path. Is this structure supported?" ))?()?; let mut files = backend.list_files().await?; - files.sort_by(|a, b| b.size.cmp(&a.size)); + files.sort_by_key(|b| std::cmp::Reverse(b.size)); log_sfn("organising files into chunks...".to_string()); diff --git a/libraries/droplet/src/versions/mod.rs b/libraries/droplet/src/versions/mod.rs index 6b2ba0a3..29c9d927 100644 --- a/libraries/droplet/src/versions/mod.rs +++ b/libraries/droplet/src/versions/mod.rs @@ -34,9 +34,11 @@ const SUPPORTED_FILE_EXTENSIONS: [&str; 11] = [ ]; pub mod types; -pub fn create_backend_constructor<'a, P>( - path: P, -) -> Option Result>>> + +type BackendConstructor<'a> = + Box Result>>; + +pub fn create_backend_constructor<'a, P>(path: P) -> Option> where P: AsRef, { @@ -53,7 +55,7 @@ where })); }; - let file_extension = path.extension().map(|v| v.to_str()).flatten()?; + let file_extension = path.extension().and_then(|v| v.to_str())?; if SUPPORTED_FILE_EXTENSIONS.contains(&file_extension) { let buf = path.to_path_buf(); return Some(Box::new(move || Ok(Box::new(ZipVersionBackend::new(buf)?)))); diff --git a/libraries/droplet_types/src/lib.rs b/libraries/droplet_types/src/lib.rs index b1b0ab8b..edfaa972 100644 --- a/libraries/droplet_types/src/lib.rs +++ b/libraries/droplet_types/src/lib.rs @@ -24,4 +24,3 @@ pub struct Manifest { pub size: u64, pub key: [u8; 16], } - diff --git a/server/.github/workflows/release.yml b/server/.github/workflows/release.yml deleted file mode 100644 index b9fb54ec..00000000 --- a/server/.github/workflows/release.yml +++ /dev/null @@ -1,158 +0,0 @@ -name: Release Workflow - -on: - workflow_dispatch: {} - release: - types: [published] - # This can be used to automatically publish nightlies at UTC nighttime - schedule: - - cron: "0 2 * * *" # run at 2 AM UTC - -env: - REGISTRY_IMAGE: ghcr.io/drop-oss/drop - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - runs-on: ${{ matrix.runner }} - permissions: - packages: write - contents: read - steps: - - name: Check out the repo - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 3 # fix for when this gets triggered by tag - fetch-tags: true - ref: ${{ github.ref }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY_IMAGE }} - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Determine final version - id: get_final_ver - run: | - BASE_VER=v$(jq -r '.version' package.json) - TODAY=$(date +'%Y.%m.%d') - - echo "Today will be: $TODAY" - echo "today=$TODAY" >> $GITHUB_OUTPUT - - if [[ "${{ github.event_name }}" == "release" ]]; then - FINAL_VER="$BASE_VER" - else - FINAL_VER="${BASE_VER}-nightly.$TODAY" - fi - - echo "Drop's release tag will be: $FINAL_VER" - echo "final_ver=$FINAL_VER" >> $GITHUB_OUTPUT - - - name: Build and push by digest - id: build - uses: docker/build-push-action@v6 - with: - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - tags: ${{ env.REGISTRY_IMAGE }} - outputs: type=image,push-by-digest=true,name-canonical=true,push=true - provenance: mode=max - sbom: true - build-args: | - BUILD_DROP_VERSION=${{ steps.get_final_ver.outputs.final_ver }} - BUILD_GIT_REF=${{ github.sha }} - - - name: Export digest - run: | - mkdir -p ${{ runner.temp }}/digests - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests/* - if-no-files-found: error - retention-days: 1 - - merge: - runs-on: ubuntu-latest - needs: - - build - permissions: - packages: write - contents: read - steps: - - name: Download digests - uses: actions/download-artifact@v4 - with: - path: ${{ runner.temp }}/digests - pattern: digests-* - merge-multiple: true - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/drop-OSS/drop - tags: | - type=schedule,pattern=nightly - type=schedule,pattern=nightly.${{ steps.get_final_ver.outputs.today }} - type=semver,pattern=v{{version}} - type=semver,pattern=v{{major}}.{{minor}} - type=semver,pattern=v{{major}} - type=ref,event=branch,prefix=branch- - type=ref,event=pr - type=sha - # set latest tag for stable releases - type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} - - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}