# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python package
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
test:
name: test (${{ matrix.os-type }}, ${{ matrix.python-version }}${{ matrix.backend == 'gix' && ', gix' || '' }})
strategy:
matrix:
os-type: [ubuntu, macos, windows]
python-version: ["3.11", "3.12", "3.13", "3.14", "3.14t", "3.15", "3.15t"]
backend: [cli]
exclude:
- os-type: macos
python-version: "3.14t"
- os-type: macos
python-version: "3.15t"
include:
- build-docs: true # We ensure documentation builds, except on very old interpreters.
- experimental: false
- python-version: "3.15"
experimental: true
- python-version: "3.15t"
experimental: true
- os-type: ubuntu
python-version: "3.12"
backend: gix
build-docs: false
experimental: false
- os-type: macos
python-version: "3.12"
backend: gix
build-docs: false
experimental: false
- os-type: windows
python-version: "3.12"
backend: gix
build-docs: false
experimental: false
fail-fast: false
runs-on: ${{ matrix.os-type }}-latest
env:
GIT_PYTHON_BACKEND: ${{ matrix.backend }}
defaults:
run:
shell: bash --noprofile --norc -exo pipefail {0}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: ${{ matrix.experimental }}
cache: pip
cache-dependency-path: |
pyproject.toml
requirements.txt
test-requirements.txt
gix-requirements.txt
- name: Prepare Rust for GixPython source builds
id: rust
run: |
# GixPython 0.3.0 publishes macOS wheels only and needs Rust >= 1.89.
rustup toolchain install stable --profile minimal
rustup default stable
rustc --version
echo "version=$(rustc --version)" >> "$GITHUB_OUTPUT"
- name: Cache GixPython Cargo dependencies and build output
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
~/.cargo/registry
~/.cargo/git
${{ runner.temp }}/gix-target
key: gix-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ steps.rust.outputs.version }}-${{ hashFiles('gix-requirements.txt') }}
restore-keys: |
gix-${{ runner.os }}-${{ runner.arch }}-py${{ matrix.python-version }}-${{ steps.rust.outputs.version }}-
- name: Set up WSL (Windows)
if: matrix.os-type == 'windows'
uses: Vampire/setup-wsl@v7.2.0
with:
wsl-version: 1
- name: Install current Git (Linux)
if: matrix.os-type == 'ubuntu'
run: |
sudo add-apt-repository --yes ppa:git-core/ppa
sudo apt-get update
sudo apt-get install --yes git
- name: Install current Git (macOS)
if: matrix.os-type == 'macos'
run: |
brew install git
echo "$(brew --prefix git)/bin" >> "$GITHUB_PATH"
- name: Prepare this repo for tests
run: |
./init-tests-after-clone.sh
- name: Set git user identity and command aliases for the tests
run: |
git config --global user.email "travis@ci.com"
git config --global user.name "Travis Runner"
# If we rewrite the user's config by accident, we will mess it up
# and cause subsequent tests to fail
cat test/fixtures/.gitconfig >> ~/.gitconfig
- name: Update PyPA packages
run: |
python -m pip install -U pip 'setuptools; python_version