diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 07be345..b325189 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,13 +1,16 @@ -name: Core CI +name: Linux CI on: [push, pull_request] +# Gitea currently has Ubuntu runners only; native Windows/macOS are separate +# release gates. Cancel obsolete branch runs instead of accumulating work. +concurrency: + group: searchi-ci-${{ github.ref }} + cancel-in-progress: true env: SEARCHI_FORCE_CPU: "1" jobs: core: - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest + timeout-minutes: 20 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable @@ -17,10 +20,8 @@ jobs: - run: cargo clippy --workspace --all-targets -- -D warnings - run: cargo test --workspace --locked desktop: - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest + timeout-minutes: 25 defaults: run: working-directory: apps/desktop diff --git a/crates/searchi-core/tests/documents.rs b/crates/searchi-core/tests/documents.rs index f6a51bc..6b983a6 100644 --- a/crates/searchi-core/tests/documents.rs +++ b/crates/searchi-core/tests/documents.rs @@ -145,9 +145,21 @@ fn real_pdf_and_docx_return_matching_locations_and_persist() -> Result<()> { assert_eq!(batch.len(), 2); let remainder = index.passage_batch(batch[1].id, 256)?; assert_eq!(remainder.len(), 2); - assert!(remainder + // Directory traversal order differs by OS/filesystem. Pagination must + // preserve every passage exactly once, regardless of which file was first. + assert!(batch + .iter() + .all(|first| remainder.iter().all(|next| first.id != next.id))); + let all = batch.iter().chain(&remainder).collect::>(); + assert!(all .iter() .any(|passage| passage.source.kind == "paragraph" && passage.source.number == 3)); + assert!(all + .iter() + .any(|passage| passage.source.kind == "page" && passage.source.number == 2)); + assert!(index + .passage_batch(remainder.last().unwrap().id, 256)? + .is_empty()); assert!(index.contains_path(&result[0].path)?); assert!(!index.contains_path("unknown")?); drop(index);