Skip to content

Merge pull request #1492 from pypa/dependabot/uv/pymdown-extensions-1… #2785

Merge pull request #1492 from pypa/dependabot/uv/pymdown-extensions-1…

Merge pull request #1492 from pypa/dependabot/uv/pymdown-extensions-1… #2785

Workflow file for this run

name: python tests+artifacts+release
on:
pull_request:
push:
branches:
- "*"
tags:
- "setuptools-scm-v*"
- "vcs-versioning-v*"
release:
types: [published]
# Tags created by GITHUB_TOKEN don't trigger push events for other workflows.
# create-release-tags.yml dispatches this workflow explicitly after tagging.
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions: {}
env:
FORCE_COLOR: 1
jobs:
package:
name: Build & inspect ${{ matrix.package }}
runs-on: ubuntu-latest
permissions:
contents: read
strategy:
matrix:
package:
- vcs-versioning
- setuptools-scm
env:
# Use no-local-version for package builds to ensure clean versions for PyPI uploads
SETUPTOOLS_SCM_NO_LOCAL: "1"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Set pretend versions from release PR title
if: github.event_name == 'pull_request'
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const title = context.payload.pull_request.title;
console.log(`PR title: ${title}`);
const scmMatch = title.match(/setuptools-scm v(\d+\.\d+\.\d+)/);
const vcsMatch = title.match(/vcs-versioning v(\d+\.\d+\.\d+)/);
if (!scmMatch && !vcsMatch) {
console.log('No release versions in PR title (normal for non-release PRs)');
return;
}
const fs = require('fs');
const envFile = process.env.GITHUB_ENV;
if (scmMatch) {
const ver = `${scmMatch[1]}.dev0`;
fs.appendFileSync(envFile, `SETUPTOOLS_SCM_PRETEND_VERSION_FOR_SETUPTOOLS_SCM=${ver}\n`);
console.log(`Set setuptools-scm pretend version: ${ver}`);
}
if (vcsMatch) {
const ver = `${vcsMatch[1]}.dev0`;
fs.appendFileSync(envFile, `SETUPTOOLS_SCM_PRETEND_VERSION_FOR_VCS_VERSIONING=${ver}\n`);
fs.appendFileSync(envFile, `VCS_VERSIONING_PRETEND_VERSION_FOR_VCS_VERSIONING=${ver}\n`);
console.log(`Set vcs-versioning pretend version: ${ver}`);
}
- name: Debug version inference
shell: bash
run: |
echo "=== Version Debug for ${{ matrix.package }} ==="
echo "Git describe:"
git describe --dirty --tags --long --match "${{ matrix.package }}-*" 2>&1 || echo "(no matching tags)"
echo "Relevant PRETEND env vars:"
env | grep -i PRETEND || echo "(none set)"
- name: Build ${{ matrix.package }}
uses: hynek/build-and-inspect-python-package@2abe76da66d0a6a4a227101f9348ee855797cfa5 # v3.0.1
with:
path: ${{ matrix.package }}
upload-name-suffix: -${{ matrix.package }}
test:
needs: [package]
runs-on: ${{ matrix.os }}
permissions:
contents: read
strategy:
fail-fast: false
matrix:
python_version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.11' ]
os: [windows-latest, ubuntu-latest] #, macos-latest]
include:
- os: windows-latest
python_version: 'msys2'
env:
# Enable tracemalloc to debug gc errors with popen objects (especially on Windows)
PYTHONTRACEMALLOC: "1"
name: ${{ matrix.os }} - Python ${{ matrix.python_version }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Setup python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
if: matrix.python_version != 'msys2'
with:
python-version: ${{ matrix.python_version }}
architecture: x64
- name: Install the latest version of uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- name: Setup MSYS2
uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2.32.0
if: matrix.python_version == 'msys2'
with:
msystem: MINGW64
install: git mingw-w64-x86_64-python mingw-w64-x86_64-python-setuptools
update: true
- name: Setup GnuPG and Mercurial on Windows
# At present, the Windows VMs only come with the copy of GnuPG that's bundled
# with Git for Windows. If we want to use this version _and_ be able to set
# arbitrary GnuPG home directories, then the test would need to figure out when
# to convert Windows-style paths into Unix-style paths with cygpath, which is
# unreasonable.
#
# Instead, we'll install a version of GnuPG that can handle Windows-style paths.
# However, due to <https://dev.gnupg.org/T5593>, installation fails if the PATH
# environment variable is too long. Consequently, we need to shorten PATH to
# something minimal before we can install GnuPG. For further details, see
# <https://github.com/actions/virtual-environments/issues/2876>.
#
# Additionally, we'll explicitly set `gpg.program` to ensure Git for Windows
# doesn't invoke the bundled GnuPG, otherwise we'll run into
# <https://dev.gnupg.org/T5504>. See also: <https://dev.gnupg.org/T3020>.
#
# Windows runners no longer ship with Mercurial pre-installed, so we install
# it via Chocolatey using the 'hg' package.
run: |
$env:PATH = "C:\Program Files\Git\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Chocolatey\bin"
[Environment]::SetEnvironmentVariable("Path", $env:PATH, "Machine")
choco install gnupg hg -y --no-progress
echo "C:\Program Files\gnupg\bin" >> $env:GITHUB_PATH
echo "C:\Program Files\Mercurial\" >> $env:GITHUB_PATH
git config --system gpg.program "C:\Program Files\gnupg\bin\gpg.exe"
git config --system core.longpaths true
mkdir "D:\Temp"
echo "TEMP=D:\Temp" >> $env:GITHUB_ENV
if: runner.os == 'Windows'
- run: uv sync --all-packages --all-groups
- name: Download vcs-versioning packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-vcs-versioning
path: dist
- name: Download setuptools-scm packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-setuptools-scm
path: dist
- name: Install built wheels
shell: bash
run: |
# Use --no-deps: uv sync already resolved all dependencies from workspace;
# we just replace the editable installs with the built wheels.
uv pip install --no-deps dist/vcs_versioning-*.whl
uv pip install --no-deps dist/setuptools_scm-*.whl
- run: |
$(hg debuginstall --template "{pythonexe}") -m pip install hg-git --user
if: matrix.os == 'ubuntu-latest'
# this hopefully helps with os caches, hg init sometimes gets 20s timeouts
- run: hg version
shell: bash
- name: Install Jujutsu (jj) on Linux
if: runner.os == 'Linux'
run: |
JJ_VERSION="0.42.0"
curl -fsSL "https://github.com/jj-vcs/jj/releases/download/v${JJ_VERSION}/jj-v${JJ_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
| tar xz --strip-components=0 -C /usr/local/bin ./jj
jj version
- name: Install Jujutsu (jj) on Windows
if: runner.os == 'Windows' && matrix.python_version != 'msys2'
shell: pwsh
run: |
$JJ_VERSION = "0.42.0"
Invoke-WebRequest -Uri "https://github.com/jj-vcs/jj/releases/download/v${JJ_VERSION}/jj-v${JJ_VERSION}-x86_64-pc-windows-msvc.zip" -OutFile jj.zip
Expand-Archive jj.zip -DestinationPath "$env:RUNNER_TEMP\jj"
echo "$env:RUNNER_TEMP\jj" >> $env:GITHUB_PATH
& "$env:RUNNER_TEMP\jj\jj.exe" version
- name: Run tests for both packages
run: uv run --no-sync pytest setuptools-scm/testing_scm/ vcs-versioning/testing_vcs/
timeout-minutes: 25
dist_upload_setuptools_scm:
runs-on: ubuntu-latest
if: |
github.repository == 'pypa/setuptools-scm' &&
((github.event_name == 'push' && startsWith(github.ref, 'refs/tags/setuptools-scm-v')) ||
(github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/setuptools-scm-v')) ||
(github.event_name == 'release' && github.event.action == 'published' && startsWith(github.event.release.tag_name, 'setuptools-scm-v')))
permissions:
id-token: write
needs: [test]
steps:
- name: Download setuptools-scm packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-setuptools-scm
path: dist
- name: Publish setuptools-scm to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
dist_upload_vcs_versioning:
runs-on: ubuntu-latest
if: |
github.repository == 'pypa/setuptools-scm' &&
((github.event_name == 'push' && startsWith(github.ref, 'refs/tags/vcs-versioning-v')) ||
(github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/vcs-versioning-v')) ||
(github.event_name == 'release' && github.event.action == 'published' && startsWith(github.event.release.tag_name, 'vcs-versioning-v')))
permissions:
id-token: write
needs: [test]
steps:
- name: Download vcs-versioning packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-vcs-versioning
path: dist
- name: Publish vcs-versioning to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
upload-release-assets-setuptools-scm:
runs-on: ubuntu-latest
if: |
github.repository == 'pypa/setuptools-scm' &&
((github.event_name == 'release' && github.event.action == 'published' && startsWith(github.event.release.tag_name, 'setuptools-scm-v')) ||
(github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/setuptools-scm-v')))
needs: [test]
permissions:
contents: write
steps:
- name: Download setuptools-scm packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-setuptools-scm
path: dist
- name: Upload release assets
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
files: dist/*
fail_on_unmatched_files: true
upload-release-assets-vcs-versioning:
runs-on: ubuntu-latest
if: |
github.repository == 'pypa/setuptools-scm' &&
((github.event_name == 'release' && github.event.action == 'published' && startsWith(github.event.release.tag_name, 'vcs-versioning-v')) ||
(github.event_name == 'workflow_dispatch' && startsWith(github.ref, 'refs/tags/vcs-versioning-v')))
needs: [test]
permissions:
contents: write
steps:
- name: Download vcs-versioning packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-vcs-versioning
path: dist
- name: Upload release assets
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
files: dist/*
fail_on_unmatched_files: true
test-pypi-upload:
runs-on: ubuntu-latest
if: |
github.repository == 'pypa/setuptools-scm' &&
github.event_name == 'push' &&
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop')
needs: [test]
permissions:
id-token: write
steps:
- name: Download vcs-versioning packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-vcs-versioning
path: dist
- name: Download setuptools-scm packages
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: Packages-setuptools-scm
path: dist
- name: Publish package to PyPI
continue-on-error: true
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
repository-url: https://test.pypi.org/legacy/