#!/bin/sh
# Builds a repo with a clean main and one branch per way a PR can hide a finding from Skylos.
set -e
g() { git -c user.email=lab@example.com -c user.name=lab "$@"; }
git init -q -b main
mkdir -p src/shop tests
cat > pyproject.toml <<'EOF'
[project]
name = "shop"
version = "0.1.0"

[tool.pytest.ini_options]
pythonpath = ["src"]
EOF
: > src/shop/__init__.py
cat > src/shop/payments.py <<'EOF'
def charge_card(amount, currency="usd"):
    return {"charged": amount, "currency": currency}
EOF
cat > tests/test_payments.py <<'EOF'
from shop.payments import charge_card

def test_charge():
    assert charge_card(5)["charged"] == 5
EOF
g add -A; g commit -qm "clean main"

# The change every PR branch makes: an import of a package that does not exist on PyPI.
bad() {
cat > src/shop/refunds.py <<'EOF'
import invented_payment_sdk

def refund(amount):
    return invented_payment_sdk.refund(amount)
EOF
}

g checkout -qb pr-plain main; bad; g add -A; g commit -qm "plain"

g checkout -qb pr-inline main; bad
sed -i.bak '1s/$/  # skylos: ignore/' src/shop/refunds.py && rm src/shop/refunds.py.bak
g add -A; g commit -qm "inline waiver"

g checkout -qb pr-ignore main; bad
printf '\n[tool.skylos]\nignore = ["SKY-D222"]\n' >> pyproject.toml
g add -A; g commit -qm "project ignore"

g checkout -qb pr-exclude main; bad
printf '\n[tool.skylos]\nexclude = ["src/shop"]\n' >> pyproject.toml
g add -A; g commit -qm "exclude folder"

g checkout -qb pr-contract main; bad; mkdir -p .skylos
cat > .skylos/ai-contract.yml <<'EOF'
version: 1
ai:
  dependencies:
    reject_nonexistent_packages: false
EOF
g add -A; g commit -qm "contract turns the check off"
g checkout -qb pr-conftest main
cat > tests/conftest.py <<'EOF'
# Added by the PR. pytest imports conftest.py before collecting tests,
# so this runs whenever anything runs the test suite on this branch.
import os, pathlib
pathlib.Path("/tmp/conftest-ran").write_text(
    "ran as uid %d; env vars visible: %s\n" % (os.getuid(), sorted(k for k in os.environ if "TOKEN" in k or "KEY" in k))
)
EOF
g add -A; g commit -qm "conftest.py with a side effect"
g checkout -q main
