# explorerpatcher.dev test runs. Windows jobs install the official ExplorerPatcher release on a throwaway # GitHub-hosted machine and photograph/measure it (tests/run.ps1); the research job collects public data # about the upstream project (research/). Results are committed back to this branch under results/. name: ExplorerPatcher tests on: workflow_dispatch: inputs: only: description: 'Comma-separated steps after machine/download/install (styles,taskbar10,tray,start,alttab,fileexplorer,other,gui,recovery,uninstall,packages); empty = all' required: false default: '' jobs: description: 'windows, research, compare or all' required: false default: 'all' machines: description: 'Comma-separated machines to run (win11arm,win2025,win2022); empty = all' required: false default: '' light: description: 'Light run for targeted re-tests: no baseline screenshots, no footprint snapshots (1 = yes)' required: false default: '' push: paths: - 'tests/**' - 'research/*.py' - '.github/workflows/test.yml' permissions: contents: write concurrency: group: tests-${{ github.ref }}-${{ github.event.inputs.machines }}-${{ github.event.inputs.only }} cancel-in-progress: true jobs: windows: if: ${{ (github.event.inputs.jobs || 'all') != 'research' && (github.event.inputs.jobs || 'all') != 'compare' }} strategy: fail-fast: false matrix: include: - runner: windows-11-arm out: win11arm - runner: windows-2025 out: win2025 - runner: windows-2022 out: win2022 runs-on: ${{ matrix.runner }} timeout-minutes: 90 env: VERIFY_OUT: ${{ matrix.out }} ONLY: ${{ github.event.inputs.only }} LIGHT: ${{ github.event.inputs.light }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 - name: Run tests if: ${{ (github.event.inputs.machines || '') == '' || contains(github.event.inputs.machines, matrix.out) }} shell: powershell run: '& ./tests/run.ps1' - name: Commit results if: ${{ always() && ((github.event.inputs.machines || '') == '' || contains(github.event.inputs.machines, matrix.out)) }} shell: bash run: | dest="results/${{ matrix.out }}"; [ -n "${{ github.event.inputs.only }}" ] && dest="results/${{ matrix.out }}-${{ github.run_id }}" mkdir -p results && rm -rf "$dest" && cp -r "tests/${{ matrix.out }}" "$dest" git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -f "$dest" git commit -m "Test results: ${{ matrix.out }} (run ${{ github.run_id }}) [skip ci]" || exit 0 ok=0; for i in 1 2 3 4 5 6 7 8; do if git pull --rebase origin "${GITHUB_REF_NAME}" && git push origin "HEAD:${GITHUB_REF_NAME}"; then ok=1; break; fi; git rebase --abort 2>/dev/null || true; sleep $((i*5 + RANDOM % 7)); done [ "$ok" = 1 ] || { echo "::error::push failed"; exit 1; } research: if: ${{ (github.event.inputs.jobs || 'all') != 'windows' }} runs-on: ubuntu-latest timeout-minutes: 40 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 - name: Fetch upstream data run: python3 research/fetch.py - name: Google Trends continue-on-error: true run: python3 research/trends.py "explorerpatcher" "explorer patcher" "explorerpatcher|startallback|open shell|windhawk|start11" "windows 10 taskbar windows 11" "windows 11 classic start menu" - name: Commit results if: always() run: | mkdir -p results && rm -rf results/research && cp -r research/out results/research git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -f results/research git commit -m "Research data (run ${{ github.run_id }}) [skip ci]" || exit 0 ok=0; for i in 1 2 3 4 5 6 7 8; do if git pull --rebase origin "${GITHUB_REF_NAME}" && git push origin "HEAD:${GITHUB_REF_NAME}"; then ok=1; break; fi; git rebase --abort 2>/dev/null || true; sleep $((i*5 + RANDOM % 7)); done [ "$ok" = 1 ] || { echo "::error::push failed"; exit 1; } compare: if: ${{ github.event.inputs.jobs == 'compare' }} strategy: fail-fast: false matrix: tool: [openshell, windhawk, startallback, start11] runs-on: windows-2025 timeout-minutes: 25 env: TOOL: ${{ matrix.tool }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 if: ${{ !github.event.inputs.only || contains(github.event.inputs.only, matrix.tool) }} - name: Run comparison if: ${{ !github.event.inputs.only || contains(github.event.inputs.only, matrix.tool) }} shell: powershell run: '& ./tests/compare.ps1' - name: Commit results if: ${{ always() && (!github.event.inputs.only || contains(github.event.inputs.only, matrix.tool)) }} shell: bash run: | mkdir -p results && rm -rf "results/compare-${{ matrix.tool }}" && cp -r "tests/compare-${{ matrix.tool }}" "results/compare-${{ matrix.tool }}" git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -f "results/compare-${{ matrix.tool }}" git commit -m "Comparison results: ${{ matrix.tool }} (run ${{ github.run_id }}) [skip ci]" || exit 0 ok=0; for i in 1 2 3 4 5 6 7 8; do if git pull --rebase origin "${GITHUB_REF_NAME}" && git push origin "HEAD:${GITHUB_REF_NAME}"; then ok=1; break; fi; git rebase --abort 2>/dev/null || true; sleep $((i*5 + RANDOM % 7)); done [ "$ok" = 1 ] || { echo "::error::push failed"; exit 1; }