|
name: test-cygwin |
|
|
|
on: [push, pull_request, workflow_dispatch] |
|
|
|
permissions: |
|
contents: read |
|
|
|
jobs: |
|
test: |
|
strategy: |
|
matrix: |
|
selection: [fast, perf] |
|
include: |
|
- selection: fast |
|
additional-pytest-args: --ignore=test/performance |
|
- selection: perf |
|
additional-pytest-args: test/performance |
|
|
|
fail-fast: false |
|
|
|
runs-on: windows-latest |
|
|
|
env: |
|
CHERE_INVOKING: "1" |
|
CYGWIN_NOWINPATH: "1" |
|
|
|
defaults: |
|
run: |
|
shell: C:\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr "{0}" |
|
|
|
steps: |
|
- name: Force LF line endings |
|
run: | |
|
git config --global core.autocrlf false # Affects the non-Cygwin git. |
|
shell: pwsh # Do this outside Cygwin, to affect actions/checkout. |
|
|
|
- uses: actions/checkout@v7 |
|
with: |
|
fetch-depth: 0 |
|
|
|
- name: Install Cygwin |
|
uses: cygwin/cygwin-install-action@v6 |
|
with: |
|
packages: git python39 python-pip-wheel python-setuptools-wheel python-wheel-wheel |
|
add-to-path: false # No need to change $PATH outside the Cygwin environment. |
|
|
|
- name: Arrange for verbose output |
|
run: | |
|
# Arrange for verbose output but without shell environment setup details. |
|
echo 'set -x' >~/.bash_profile |
|
|
|
- name: Special configuration for Cygwin git |
|
run: | |
|
git config --global --add safe.directory "$(pwd)" |
|
git config --global --add safe.directory "$(pwd)/.git" |
|
git config --global --add safe.directory "$(pwd)/git/ext/gitdb" |
|
git config --global --add safe.directory "$(pwd)/git/ext/gitdb/gitdb/ext/smmap" |
|
git config --global core.autocrlf false |
|
|
|
- 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: Set up virtual environment |
|
run: | |
|
python3.9 -m venv .venv |
|
echo 'BASH_ENV=.venv/bin/activate' >>"$GITHUB_ENV" |
|
|
|
- name: Update PyPA packages |
|
run: | |
|
python -m pip install -U pip 'setuptools; python_version<"3.12"' wheel |
|
|
|
- name: Install project and test dependencies |
|
run: | |
|
pip install '.[test]' |
|
|
|
- name: Show POSIX file ownership |
|
# Cygwin's `ls -ld` reports the NTFS Owner SID via Cygwin's SID-to-uid |
|
# mapping (well-known SIDs by their RID, machine-local accounts by |
|
# 0x30000+RID). That mapping is what Cygwin git's |
|
# `is_path_owned_by_current_user` reduces to, so this is the view that |
|
# determines whether `safe.directory` is consulted. |
|
run: | |
|
ls -ld -- \ |
|
"$(pwd)" \ |
|
"$(pwd)/.git" \ |
|
"$(pwd)/git/ext/gitdb" \ |
|
"$(pwd)/git/ext/gitdb/.git" \ |
|
"$(pwd)/.git/modules/gitdb" \ |
|
"$(pwd)/git/ext/gitdb/gitdb/ext/smmap" \ |
|
"$(pwd)/git/ext/gitdb/gitdb/ext/smmap/.git" \ |
|
"$(pwd)/.git/modules/gitdb/modules/smmap" \ |
|
"${HOME:?HOME is not set}/.gitconfig" \ |
|
2>&1 || true |
|
|
|
- name: Show NTFS file ownership |
|
# Authoritative NTFS Owner via Get-Acl, with no Cygwin SID-to-uid layer |
|
# in between -- useful for confirming what the Cygwin view reports as |
|
# "Administrators" is the BUILTIN\Administrators SID (S-1-5-32-544). |
|
shell: pwsh |
|
run: | |
|
$paths = @( |
|
"$pwd", |
|
"$pwd\.git", |
|
"$pwd\git\ext\gitdb", |
|
"$pwd\git\ext\gitdb\.git", |
|
"$pwd\.git\modules\gitdb", |
|
"$pwd\git\ext\gitdb\gitdb\ext\smmap", |
|
"$pwd\git\ext\gitdb\gitdb\ext\smmap\.git", |
|
"$pwd\.git\modules\gitdb\modules\smmap", |
|
"$env:USERPROFILE\.gitconfig" |
|
) |
|
foreach ($p in $paths) { |
|
if (Test-Path -LiteralPath $p) { |
|
try { |
|
$owner = (Get-Acl -LiteralPath $p).Owner |
|
} catch { |
|
$owner = "ERROR: $($_.Exception.Message)" |
|
} |
|
"{0,-44} {1}" -f $owner, $p |
|
} else { |
|
"(missing: $p)" |
|
} |
|
} |
|
|
|
- name: Show safe.directory entries |
|
run: git config --global --get-all safe.directory |
|
|
|
- name: Show version and platform information |
|
run: | |
|
uname -a |
|
command -v git python |
|
git version |
|
python --version |
|
python -c 'import os, sys; print(f"sys.platform={sys.platform!r}, os.name={os.name!r}")' |
|
|
|
- name: Test with pytest (${{ matrix.additional-pytest-args }}) |
|
run: | |
|
pytest --color=yes -p no:sugar --instafail -vv ${{ matrix.additional-pytest-args }} |