Add Windows shell integration and tray mount manager #40
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| jobs: | |
| unit-tests: | |
| name: Unit Tests (Python ${{ matrix.python-version }}, ${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| python-version: ["3.11", "3.12", "3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| cache: 'pip' | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e "./amitools[vamos]" | |
| pip install "pytest>=7.0" "pytest-cov>=4.0" "pytest-timeout>=2.0" | |
| pip install -e "." --no-deps | |
| - name: Run unit tests | |
| run: pytest tests/unit/ -v --timeout=30 | |
| integration-tests: | |
| name: Integration Tests (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| needs: unit-tests | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.13 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.13" | |
| cache: 'pip' | |
| - name: Clone AmiFUSE-testing fixtures | |
| # Clones to sibling directory of workspace checkout. | |
| # Workspace is typically /home/runner/work/<repo>/<repo>. | |
| run: | | |
| git clone --depth 1 https://github.com/reinauer/AmiFUSE-testing.git ../AmiFUSE-testing | |
| continue-on-error: true | |
| - name: Install machine68k-amifuse (Windows) | |
| # Upstream machine68k lacks Windows fixes (cnvogelg/machine68k#8, | |
| # #9). The machine68k-amifuse fork includes all fixes with | |
| # pre-built Windows wheels. | |
| # Remove this step once upstream machine68k merges the fixes. | |
| if: runner.os == 'Windows' | |
| run: pip install "machine68k-amifuse>=0.4.1.post1" | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e "./amitools[vamos]" | |
| pip install "pytest>=7.0" "pytest-cov>=4.0" "pytest-timeout>=2.0" | |
| pip install -e "." --no-deps | |
| - name: Verify machine68k | |
| run: | | |
| python -c "import machine68k; print(f'machine68k {machine68k.__version__}')" | |
| python -c "import machine68k; machine68k.CPU(1); print('CPU probe OK')" | |
| continue-on-error: true | |
| - name: Run integration tests | |
| env: | |
| AMIFUSE_FIXTURE_ROOT: ${{ github.workspace }}/../AmiFUSE-testing | |
| run: pytest tests/integration/ -v --timeout=60 | |
| tools-smoke: | |
| name: Tools Smoke (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| needs: unit-tests | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.13 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.13" | |
| cache: 'pip' | |
| - name: Clone AmiFUSE-testing fixtures | |
| # Clones to sibling directory of workspace checkout. | |
| # Workspace is typically /home/runner/work/<repo>/<repo>. | |
| run: | | |
| git clone --depth 1 https://github.com/reinauer/AmiFUSE-testing.git ../AmiFUSE-testing | |
| continue-on-error: true | |
| - name: Install machine68k-amifuse (Windows) | |
| # Upstream machine68k lacks Windows fixes (cnvogelg/machine68k#8, | |
| # #9). The machine68k-amifuse fork includes all fixes with | |
| # pre-built Windows wheels. | |
| # Remove this step once upstream machine68k merges the fixes. | |
| if: runner.os == 'Windows' | |
| run: pip install "machine68k-amifuse>=0.4.1.post1" | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e "./amitools[vamos]" | |
| pip install -e "." --no-deps | |
| - name: Run amifuse_matrix smoke | |
| env: | |
| AMIFUSE_FIXTURE_ROOT: ${{ github.workspace }}/../AmiFUSE-testing | |
| run: python tools/amifuse_matrix.py --fixtures pfs3 sfs ofs --runs 1 --json | |
| - name: Run image_format_smoke | |
| env: | |
| AMIFUSE_FIXTURE_ROOT: ${{ github.workspace }}/../AmiFUSE-testing | |
| run: python tools/image_format_smoke.py --case direct-rdb-pfs3 --json | |
| mount-tests: | |
| name: Mount Tests (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| needs: unit-tests | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.13 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.13" | |
| cache: 'pip' | |
| - name: Install FUSE backend (Linux) | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y fuse3 libfuse3-dev libfuse-dev | |
| sudo modprobe fuse || true | |
| - name: Install FUSE backend (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| brew install fuse-t | |
| FUSET_LIB=$(find /opt/homebrew/lib /usr/local/lib -name 'libfuse-t*.dylib' 2>/dev/null | head -1) | |
| if [ -n "$FUSET_LIB" ]; then | |
| FUSET_DIR=$(dirname "$FUSET_LIB") | |
| sudo ln -sf "$FUSET_LIB" "$FUSET_DIR/libfuse.dylib" || true | |
| echo "DYLD_LIBRARY_PATH=$FUSET_DIR" >> "$GITHUB_ENV" | |
| fi | |
| - name: Install FUSE backend (Windows) | |
| if: runner.os == 'Windows' | |
| run: choco install winfsp -y | |
| - name: Clone AmiFUSE-testing fixtures | |
| run: | | |
| git clone --depth 1 https://github.com/reinauer/AmiFUSE-testing.git ../AmiFUSE-testing | |
| continue-on-error: true | |
| - name: Install machine68k-amifuse (Windows) | |
| if: runner.os == 'Windows' | |
| run: pip install "machine68k-amifuse>=0.4.1.post1" | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e "./amitools[vamos]" | |
| pip install "pytest>=7.0" "pytest-cov>=4.0" "pytest-timeout>=2.0" | |
| pip install -e "." --no-deps | |
| - name: Verify FUSE backend | |
| run: | | |
| python -c " | |
| try: | |
| from fuse import FUSE | |
| print('fusepy: OK (FUSE class imported)') | |
| except EnvironmentError as e: | |
| print(f'fusepy: FUSE backend not found: {e}') | |
| except ImportError: | |
| print('fusepy: not installed') | |
| " | |
| continue-on-error: true | |
| - name: Run mount tests | |
| env: | |
| AMIFUSE_FIXTURE_ROOT: ${{ github.workspace }}/../AmiFUSE-testing | |
| run: pytest tests/integration/ -m fuse -v --timeout=60 | |
| - name: Cleanup stale mounts (Linux) | |
| if: always() && runner.os == 'Linux' | |
| run: | | |
| pkill -9 -f amifuse || true | |
| find /tmp -maxdepth 3 -name 'mnt_*' -type d 2>/dev/null | while read mp; do | |
| fusermount3 -u "$mp" 2>/dev/null || fusermount -u "$mp" 2>/dev/null || true | |
| done | |
| - name: Cleanup stale mounts (macOS) | |
| if: always() && runner.os == 'macOS' | |
| run: | | |
| pkill -9 -f amifuse || true | |
| find /tmp -maxdepth 3 -name 'mnt_*' -type d 2>/dev/null | while read mp; do | |
| umount "$mp" 2>/dev/null || true | |
| done | |
| - name: Cleanup stale mounts (Windows) | |
| if: always() && runner.os == 'Windows' | |
| shell: pwsh | |
| run: | | |
| Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'amifuse' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue } |