Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a47d9c8
feat(filesync): add native sync and virtual files
veryCrunchy Jul 31, 2026
831ef33
docs(filesync): add visual QA comparisons
veryCrunchy Jul 31, 2026
1fabd98
test(filesync): avoid secret scan false positive
veryCrunchy Jul 31, 2026
44cd314
fix(filesync): harden provider recovery and policies
veryCrunchy Aug 1, 2026
e323c05
docs(filesync): refresh synthetic captures
veryCrunchy Aug 1, 2026
438db7c
fix(filesync): address review safety gaps
veryCrunchy Aug 1, 2026
acdb3be
chore(filesync): merge latest main
veryCrunchy Aug 1, 2026
3f2c9aa
fix(filesync): harden recovery and selective sync
veryCrunchy Aug 1, 2026
06f8d1b
ci(filesync): install FUSE runtime
veryCrunchy Aug 1, 2026
799af33
ci: cache and scope build tasks
veryCrunchy Aug 1, 2026
377da87
ci: reuse scoped Gradle invocation
veryCrunchy Aug 1, 2026
e7afe4c
fix(filesync): harden virtual file recovery
veryCrunchy Aug 1, 2026
5ebf7ef
chore: merge latest main into filesync
veryCrunchy Aug 1, 2026
2b958f3
chore(visuals): refresh capture source digest
veryCrunchy Aug 1, 2026
8b016e9
fix(filesync): harden long-running recovery
veryCrunchy Aug 1, 2026
9b582d6
chore(visuals): refresh capture source digest
veryCrunchy Aug 1, 2026
c81addd
fix(filesync): harden desktop transfer durability
veryCrunchy Aug 1, 2026
3cb5c6d
fix(filesync): harden native writeback recovery
veryCrunchy Aug 1, 2026
b10608a
fix(filesync): harden recovery and direction safety
veryCrunchy Aug 1, 2026
6050b82
fix(filesync): harden callback and recovery state
veryCrunchy Aug 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 97 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,48 @@ jobs:
- name: Check out source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Set up Rust
uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable

- name: Detect app build changes
- name: Detect build scopes
id: changes
uses: dorny/paths-filter@d1c1ffe0248fe513906c8e24db8ea791d46f8590 # v3
with:
filters: |
app:
rust:
- ".github/workflows/ci.yml"
- "androidApp/**"
- "contractAcquisition/**"
- "ui/**"
- "src/**"
- "tests/**"
- "Cargo.toml"
- "Cargo.lock"
contract:
- ".github/workflows/ci.yml"
- "contractAcquisition/**"
- "build.gradle.kts"
- "settings.gradle.kts"
- "gradle.properties"
- "gradle/**"
- "gradlew"
- "gradlew.bat"
desktop:
- ".github/workflows/ci.yml"
- "contractAcquisition/**"
- "ui/build.gradle.kts"
- "ui/src/commonMain/**"
- "ui/src/commonTest/**"
- "ui/src/desktopMain/**"
- "ui/src/desktopTest/**"
- "build.gradle.kts"
- "settings.gradle.kts"
- "gradle.properties"
- "gradle/**"
- "gradlew"
- "gradlew.bat"
android:
- ".github/workflows/ci.yml"
- "androidApp/**"
- "contractAcquisition/**"
- "ui/build.gradle.kts"
- "ui/src/commonMain/**"
- "ui/src/androidMain/**"
- "ui/src/androidUnitTest/**"
- "build.gradle.kts"
- "settings.gradle.kts"
- "gradle.properties"
Expand All @@ -63,6 +88,9 @@ jobs:
- "website/scripts/marketing-captures.mjs"
- "website/scripts/verify-marketing-captures.mjs"

- name: Set up Rust
uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable

- name: Check repository hygiene
run: |
bash tools/check-repository.sh
Expand Down Expand Up @@ -118,15 +146,34 @@ jobs:
--head "${HEAD_SHA}"

- name: Set up JDK 21
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: >-
github.event_name == 'workflow_dispatch' ||
steps.changes.outputs.contract == 'true' ||
steps.changes.outputs.desktop == 'true' ||
steps.changes.outputs.android == 'true'
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5
with:
distribution: temurin
java-version: "21"
cache: gradle

- name: Set up Gradle build cache
if: >-
github.event_name == 'workflow_dispatch' ||
steps.changes.outputs.contract == 'true' ||
steps.changes.outputs.desktop == 'true' ||
steps.changes.outputs.android == 'true'
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0
with:
cache-read-only: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }}

- name: Install Linux virtual filesystem runtime
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.desktop == 'true'
run: |
sudo apt-get update
sudo apt-get install --yes libfuse2t64

- name: Cache Cargo dependencies and build output
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.rust == 'true'
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: |
Expand All @@ -138,30 +185,48 @@ jobs:
${{ runner.os }}-cargo-v1-

- name: Set up Android SDK
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.android == 'true'
uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4

- name: Install Android platform
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.android == 'true'
run: sdkmanager "platforms;android-36" "build-tools;35.0.0"

- name: Test semantic compiler
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.rust == 'true'
run: cargo test --locked

- name: Test shared UI and build desktop plus Android
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
- name: Test and build selected Gradle scopes
if: >-
github.event_name == 'workflow_dispatch' ||
steps.changes.outputs.contract == 'true' ||
steps.changes.outputs.desktop == 'true' ||
steps.changes.outputs.android == 'true'
env:
RUN_CONTRACT: ${{ github.event_name == 'workflow_dispatch' || steps.changes.outputs.contract == 'true' }}
RUN_DESKTOP: ${{ github.event_name == 'workflow_dispatch' || steps.changes.outputs.desktop == 'true' }}
RUN_ANDROID: ${{ github.event_name == 'workflow_dispatch' || steps.changes.outputs.android == 'true' }}
run: |
./gradlew --no-daemon \
:contractAcquisition:test \
:ui:desktopTest \
:androidApp:testDebugUnitTest \
:androidApp:verifyReleaseLintGate \
:ui:createDistributable \
:androidApp:assembleDebug
set -euo pipefail
gradle_tasks=()
if [[ "${RUN_CONTRACT}" == "true" ]]; then
gradle_tasks+=(":contractAcquisition:test")
fi
if [[ "${RUN_DESKTOP}" == "true" ]]; then
gradle_tasks+=(":ui:desktopTest" ":ui:createDistributable")
fi
if [[ "${RUN_ANDROID}" == "true" ]]; then
gradle_tasks+=(
":androidApp:testDebugUnitTest"
":androidApp:verifyReleaseLintGate"
":androidApp:assembleDebug"
)
fi
printf 'Selected Gradle tasks: %s\n' "${gradle_tasks[*]}"
./gradlew --no-daemon "${gradle_tasks[@]}"

- name: Upload Linux desktop app
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.desktop == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: nextcloud-native-linux
Expand All @@ -170,7 +235,7 @@ jobs:
retention-days: 7

- name: Upload Android debug APK
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.app == 'true'
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.android == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: nextcloud-native-android-debug
Expand All @@ -179,5 +244,10 @@ jobs:
retention-days: 7

- name: Report skipped app build
if: github.event_name != 'workflow_dispatch' && steps.changes.outputs.app != 'true'
run: echo "No app source or build-system changes; compilation was skipped." >>"${GITHUB_STEP_SUMMARY}"
if: >-
github.event_name != 'workflow_dispatch' &&
steps.changes.outputs.rust != 'true' &&
steps.changes.outputs.contract != 'true' &&
steps.changes.outputs.desktop != 'true' &&
steps.changes.outputs.android != 'true'
run: echo "No compiler, contract, desktop, Android, or build-system changes; compilation was skipped." >>"${GITHUB_STEP_SUMMARY}"
5 changes: 5 additions & 0 deletions .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ jobs:
java-version: "21"
cache: gradle

- name: Install Linux virtual filesystem runtime
run: |
sudo apt-get update
sudo apt-get install --yes libfuse2t64

- name: Set up Rust
uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable

Expand Down
Loading
Loading