diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 22b635337..ed6a25364 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -3,9 +3,9 @@
Thank you for your interest in contributing to virtualenv! There are many ways to contribute, and we appreciate all of
them. As a reminder, all contributors are expected to follow the [PSF Code of Conduct][coc].
-[coc]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
-
## Development Documentation
Our [development documentation](https://virtualenv.pypa.io/en/latest/development.html#development) contains details on
how to get started with contributing to `virtualenv`, and details of our development processes.
+
+[coc]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yaml
new file mode 100644
index 000000000..bb5081b53
--- /dev/null
+++ b/.github/FUNDING.yaml
@@ -0,0 +1,3 @@
+github: gaborbernat
+tidelift: "pypi/virtualenv"
+thanks_dev: u/gh/gaborbernat
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 91b483e4e..000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-tidelift: "pypi/virtualenv"
diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
index 0b3a25014..1164a2383 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ b/.github/ISSUE_TEMPLATE/bug-report.md
@@ -1,3 +1,7 @@
+______________________________________________________________________
+
+## name: Bug report about: Create a report to help us improve title: "" labels: bug assignees: ""
+
**Issue**
Describe what's the expected behavior and what you're observing.
@@ -7,6 +11,11 @@ Describe what's the expected behavior and what you're observing.
Provide at least:
- OS:
+
+- Shell:
+
+- Python version and path:
+
- `pip list` of the host python where `virtualenv` is installed:
```console
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 258ad844a..000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: ""
-labels: bug
-assignees: ""
----
-
-**Issue**
-
-Describe what's the expected behavior and what you're observing.
-
-**Environment**
-
-Provide at least:
-
-- OS:
-- `pip list` of the host python where `virtualenv` is installed:
-
- ```console
-
- ```
-
-**Output of the virtual environment creation**
-
-Make sure to run the creation with `-vvv --with-traceback`:
-
-```console
-
-```
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
index 8714ceb6e..e9a6b503f 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.md
+++ b/.github/ISSUE_TEMPLATE/feature-request.md
@@ -1,10 +1,6 @@
----
-name: Feature request
-about: Suggest an enhancement for this project
-title: ""
-labels: enhancement
-assignees: ""
----
+______________________________________________________________________
+
+## name: Feature request about: Suggest an enhancement for this project title: "" labels: enhancement assignees: ""
**What's the problem this feature will solve?**
diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
new file mode 100644
index 000000000..69d0cfd20
--- /dev/null
+++ b/.github/dependabot.yaml
@@ -0,0 +1,13 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "tuesday"
+ groups:
+ github-actions:
+ patterns:
+ - "*"
+ cooldown:
+ default-days: 7
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 123014908..000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "daily"
diff --git a/.github/release.yaml b/.github/release.yaml
new file mode 100644
index 000000000..5f89818f9
--- /dev/null
+++ b/.github/release.yaml
@@ -0,0 +1,5 @@
+changelog:
+ exclude:
+ authors:
+ - dependabot[bot]
+ - pre-commit-ci[bot]
diff --git a/.github/release.yml b/.github/release.yml
deleted file mode 100644
index 9d1e0987b..000000000
--- a/.github/release.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-changelog:
- exclude:
- authors:
- - dependabot
- - pre-commit-ci
diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml
index a5b66730a..af3779f04 100644
--- a/.github/workflows/check.yaml
+++ b/.github/workflows/check.yaml
@@ -1,149 +1,218 @@
-name: check
+name: ๐งช check
on:
workflow_dispatch:
push:
branches: ["main"]
- tags-ignore: ["**"]
pull_request:
schedule:
- cron: "0 8 * * *"
-
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
-
jobs:
test:
- name: test ${{ matrix.py }} - ${{ matrix.os }}
+ name: ๐งช test ${{ matrix.py }} - ${{ matrix.os }}
if: github.event_name != 'schedule' || github.repository_owner == 'pypa'
runs-on: ${{ matrix.os }}
timeout-minutes: 40
+ permissions:
+ contents: read
+ env:
+ PIP_DISABLE_PIP_VERSION_CHECK: "1"
strategy:
fail-fast: false
matrix:
py:
+ - "3.15t"
+ - "3.15"
+ - "3.14t"
+ - "3.14"
+ - "3.13t"
- "3.13"
- "3.12"
- "3.11"
- "3.10"
- "3.9"
- - "3.8"
+ - pypy-3.11
- pypy-3.10
- pypy-3.9
- - pypy-3.8
+ - graalpy-24.1
+ - rp
os:
- - ubuntu-latest
- - macos-latest
- - windows-latest
+ - ubuntu-24.04
+ - macos-15
+ - windows-2025-vs2026
include:
- - { os: macos-latest, py: "brew@3.11" }
- - { os: macos-latest, py: "brew@3.10" }
- - { os: macos-latest, py: "brew@3.9" }
+ - {os: macos-15, py: "brew@3.14"}
+ - {os: macos-15, py: "brew@3.13"}
+ - {os: macos-15, py: "brew@3.12"}
+ - {os: macos-15, py: "brew@3.11"}
+ - {os: macos-15, py: "brew@3.10"}
exclude:
- - { os: windows-latest, py: "pypy-3.10" }
- - { os: windows-latest, py: "pypy-3.9" }
- - { os: windows-latest, py: "pypy-3.8" }
+ - {os: windows-2025-vs2026, py: "graalpy-24.1"}
+ - {os: windows-2025-vs2026, py: "pypy-3.10"}
+ - {os: windows-2025-vs2026, py: "pypy-3.9"}
steps:
- - uses: taiki-e/install-action@cargo-binstall
- - name: Install OS dependencies
- run: |
- set -x
- for i in 1 2 3; do
- echo "try $i" && \
- ${{ runner.os == 'Linux' && 'sudo apt-get update -y && sudo apt-get install snapd fish csh -y' || true }} && \
- ${{ runner.os == 'Linux' && 'cargo binstall -y nu' || true }} && \
- ${{ runner.os == 'macOS' && 'brew install fish tcsh nushell' || true }} && \
- ${{ runner.os == 'Windows' && 'choco install nushell' || true }} && \
- exit 0 || true;
- sleep 1
- done
- exit 1
- shell: bash
- - uses: actions/checkout@v4
+ - name: ๐ฅ Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- - name: Install the latest version of uv
- uses: astral-sh/setup-uv@v3
+ persist-credentials: false
+ - name: ๐ท๏ธ Fetch upstream tags for versioning
+ shell: bash
+ run: |
+ git fetch --force --tags https://github.com/pypa/virtualenv.git
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
enable-cache: true
cache-dependency-glob: "pyproject.toml"
- github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Add .local/bin to PATH Windows
- if: runner.os == 'Windows'
- shell: bash
- run: echo "$USERPROFILE/.local/bin" >> $GITHUB_PATH
- - name: Add .local/bin to PATH macos-13
- if: matrix.os == 'macos-13'
+ cache-suffix: ${{ matrix.py }}
+ - name: ๐ Setup Python for tox
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
+ with:
+ python-version: "3.14"
+ - name: ๐ฆ Install tox with this virtualenv
shell: bash
- run: echo ~/.local/bin >> $GITHUB_PATH
- - name: Install tox
- if: matrix.py == '3.13'
- run: uv tool install --python-preference only-managed --python 3.12 tox --with tox-uv
- - name: Install tox
- if: matrix.py != '3.13'
- run: uv tool install --python-preference only-managed --python 3.13 tox --with tox-uv
- - name: Setup brew python for test ${{ matrix.py }}
- if: startsWith(matrix.py,'brew@')
run: |
- set -e
- PY=$(echo '${{ matrix.py }}' | cut -c 6-)
- brew cleanup && brew upgrade python@$PY || brew install python@$PY
- echo "/usr/local/opt/python@$PY/libexec/bin" >>"${GITHUB_PATH}"
- shell: bash
- - name: Setup python for test ${{ matrix.py }}
- if: "!( startsWith(matrix.py,'brew@') || endsWith(matrix.py, '-dev') )"
- uses: actions/setup-python@v5
+ if [[ "${{ matrix.py }}" == "3.13t" || "${{ matrix.py }}" == "3.14t" || "${{ matrix.py }}" == "3.15t" || "${{ matrix.py }}" == "rp" ]]; then
+ uv tool install --no-managed-python --python 3.14 "tox>=4.45" --with .
+ else
+ uv tool install --no-managed-python --python 3.14 "tox>=4.45" --with tox-uv --with .
+ fi
+ - name: ๐ Setup Python for test ${{ matrix.py }}
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
+ if: ${{ !startsWith(matrix.py, 'brew@') && matrix.py != 'rp' }}
with:
python-version: ${{ matrix.py }}
allow-prereleases: true
- - name: Pick environment to run
- run: python tasks/pick_tox_env.py ${{ matrix.py }}
- - name: Setup test suite
- run: tox run -vv --notest --skip-missing-interpreters false
- - name: Run test suite
+ - name: ๐ฆ Setup RustPython
+ if: matrix.py == 'rp'
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ tag=$(gh release list --repo RustPython/RustPython --limit 1 --json tagName -q '.[0].tagName')
+ if [ "${{ runner.os }}" = "Linux" ]; then
+ asset="rustpython-release-Linux-x86_64-unknown-linux-gnu"
+ elif [ "${{ runner.os }}" = "macOS" ]; then
+ asset="rustpython-release-macOS-aarch64-apple-darwin"
+ elif [ "${{ runner.os }}" = "Windows" ]; then
+ asset="rustpython-release-Windows-x86_64-pc-windows-msvc.exe"
+ fi
+ gh release download "$tag" --repo RustPython/RustPython --pattern "$asset" --dir "$RUNNER_TEMP"
+ if [ "${{ runner.os }}" = "Windows" ]; then
+ cp "$RUNNER_TEMP/$asset" "/c/ProgramData/chocolatey/bin/rustpython.exe"
+ else
+ chmod +x "$RUNNER_TEMP/$asset"
+ sudo mv "$RUNNER_TEMP/$asset" /usr/local/bin/rustpython
+ fi
+ - name: ๐ ๏ธ Install OS dependencies
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ if [ "${{ runner.os }}" = "Linux" ]; then
+ retry() {
+ local n=1
+ while ! "$@"; do
+ if [ $n -ge 5 ]; then
+ echo "Command failed after $n attempts: $*" >&2
+ return 1
+ fi
+ echo "Attempt $n failed for: $*; retrying in 10s" >&2
+ n=$((n + 1))
+ sleep 10
+ done
+ }
+ retry sudo apt-get install -y software-properties-common
+ retry sudo apt-add-repository ppa:fish-shell/release-4 -y
+ curl -fsSL --retry 5 --retry-all-errors --retry-delay 10 https://apt.fury.io/nushell/gpg.key \
+ | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/fury-nushell.gpg
+ echo "deb https://apt.fury.io/nushell/ /" | sudo tee /etc/apt/sources.list.d/fury.list
+ retry sudo apt-get update -y
+ retry sudo apt-get install snapd fish csh nushell -y
+ elif [ "${{ runner.os }}" = "macOS" ]; then
+ brew update
+ if [[ "${{ matrix.py }}" == brew@* ]]; then
+ PY=$(echo '${{ matrix.py }}' | cut -c 6-)
+ brew list --versions "python@$PY" >/dev/null 2>&1 || brew install "python@$PY"
+ echo "/usr/local/opt/python@$PY/libexec/bin" >>"${GITHUB_PATH}"
+ fi
+ brew install fish tcsh nushell || brew upgrade fish tcsh nushell
+ elif [ "${{ runner.os }}" = "Windows" ]; then
+ nu_version=$(gh release view --repo nushell/nushell --json tagName -q .tagName)
+ gh release download "$nu_version" --repo nushell/nushell --pattern "*-x86_64-pc-windows-msvc.zip" --dir "$RUNNER_TEMP"
+ 7z x "$RUNNER_TEMP/nu-${nu_version#v}-x86_64-pc-windows-msvc.zip" -o"$RUNNER_TEMP/nushell" -y
+ cp "$RUNNER_TEMP/nushell/nu.exe" "/c/ProgramData/chocolatey/bin/nu.exe"
+ fi
+ - name: ๐งฌ Pick environment to run
+ shell: bash
+ run: |
+ py="${{ matrix.py }}"
+ if [[ "$py" == brew@* ]]; then
+ brew_version="${py#brew@}"
+ echo "UV_PYTHON=/opt/homebrew/bin/python${brew_version}" >> "$GITHUB_ENV"
+ py="$brew_version"
+ fi
+ [[ "$py" == graalpy-* ]] && py="graalpy"
+ echo "TOXENV=$py" >> "$GITHUB_ENV"
+ echo "Set TOXENV=$py"
+ - name: ๐๏ธ Setup test suite
+ run: tox run -vvvv --notest --skip-missing-interpreters false
+ - name: ๐ Run test suite
run: tox run --skip-pkg-install
- timeout-minutes: 20
+ timeout-minutes: 30
env:
PYTEST_ADDOPTS: "-vv --durations=20"
CI_RUN: "yes"
DIFF_AGAINST: HEAD
-
check:
- name: ${{ matrix.tox_env }} - ${{ matrix.os }}
+ name: ๐ check ${{ matrix.tox_env }} - ${{ matrix.os }}
if: github.event_name != 'schedule' || github.repository_owner == 'pypa'
runs-on: ${{ matrix.os }}
+ permissions:
+ contents: read
strategy:
fail-fast: false
matrix:
os:
- - ubuntu-latest
- - windows-latest
+ - ubuntu-24.04
+ - windows-2025-vs2026
tox_env:
- dev
- docs
- readme
+ - type
+ - type-3.9
- upgrade
- zipapp
exclude:
- - { os: windows-latest, tox_env: readme }
- - { os: windows-latest, tox_env: docs }
+ - {os: windows-2025-vs2026, tox_env: docs}
+ - {os: windows-2025-vs2026, tox_env: readme}
+ - {os: windows-2025-vs2026, tox_env: type}
+ - {os: windows-2025-vs2026, tox_env: type-3.9}
steps:
- - uses: actions/checkout@v4
+ - name: ๐ฅ Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- - name: Install the latest version of uv
- uses: astral-sh/setup-uv@v3
+ persist-credentials: false
+ - name: ๐ท๏ธ Fetch upstream tags for versioning
+ shell: bash
+ run: |
+ git fetch --force --tags https://github.com/pypa/virtualenv.git
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
enable-cache: true
cache-dependency-glob: "pyproject.toml"
- github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Add .local/bin to Windows PATH
- if: runner.os == 'Windows'
- shell: bash
- run: echo "$USERPROFILE/.local/bin" >> $GITHUB_PATH
- - name: Install tox
- run: uv tool install --python-preference only-managed --python 3.13 tox --with tox-uv
- - name: Setup check suite
- run: tox r -vv --notest --skip-missing-interpreters false -e ${{ matrix.tox_env }}
- - name: Run check for ${{ matrix.tox_env }}
- run: tox r --skip-pkg-install -e ${{ matrix.tox_env }}
+ cache-suffix: ${{ matrix.tox_env }}
+ - name: ๐ฆ Install tox
+ run: uv tool install --python-preference only-managed --python 3.14 "tox>=4.45" --with tox-uv
+ - name: ๐๏ธ Setup check suite
+ run: tox run -vv --notest --skip-missing-interpreters false -e ${{ matrix.tox_env }}
+ - name: ๐ Run check for ${{ matrix.tox_env }}
+ run: tox run --skip-pkg-install -e ${{ matrix.tox_env }}
+ env:
+ UPGRADE_ADVISORY: ${{ matrix.tox_env == 'upgrade' && '1' || '' }}
diff --git a/.github/workflows/pre-release.yaml b/.github/workflows/pre-release.yaml
new file mode 100644
index 000000000..7c977a3cb
--- /dev/null
+++ b/.github/workflows/pre-release.yaml
@@ -0,0 +1,43 @@
+name: Pre-release
+on:
+ workflow_dispatch:
+ inputs:
+ bump:
+ description: "Version bump type"
+ required: true
+ type: choice
+ options:
+ - auto
+ - major
+ - minor
+ - patch
+ default: auto
+jobs:
+ pre-release:
+ runs-on: ubuntu-24.04
+ environment: release
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 # zizmor: ignore[artipacked]
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_RELEASE_TOKEN }}
+ - name: Install the latest version of uv
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
+ with:
+ enable-cache: true
+ cache-dependency-glob: "pyproject.toml"
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ - name: Set up Python
+ run: uv python install 3.14
+ - name: Configure git identity from token owner
+ env:
+ GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
+ run: |
+ user_info=$(gh api /user)
+ git config user.name "$(echo "$user_info" | jq -r '.name // .login')"
+ git config user.email "$(echo "$user_info" | jq -r '.id')+$(echo "$user_info" | jq -r '.login')@users.noreply.github.com"
+ - name: Generate changelog, commit, tag, and push
+ run: uv tool run --with tox-uv tox r -e release -- --version "${{ inputs.bump }}"
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 0928ac66c..64f163a88 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -1,48 +1,123 @@
-name: Release to PyPI
+name: Release
on:
push:
- tags: ["*"]
-
+ tags: ["*.*.*"]
env:
dists-artifact-name: python-package-distributions
-
jobs:
build:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
+ permissions:
+ contents: read
steps:
- - uses: actions/checkout@v4
+ - name: Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
+ persist-credentials: false
- name: Install the latest version of uv
- uses: astral-sh/setup-uv@v3
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
- enable-cache: true
+ enable-cache: false
cache-dependency-glob: "pyproject.toml"
github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Build package
- run: uv build --python 3.13 --python-preference only-managed --sdist --wheel . --out-dir dist
+ - name: Set up Python
+ run: uv python install 3.14
+ - name: Build sdist and wheel
+ run: uv build --python 3.14 --python-preference only-managed --sdist --wheel . --out-dir dist
+ - name: Build zipapp
+ run: uv tool run --with tox-uv tox r -e zipapp
- name: Store the distribution packages
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: ${{ env.dists-artifact-name }}
path: dist/*
-
- release:
- needs:
- - build
- runs-on: ubuntu-latest
+ - name: Store the zipapp
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: virtualenv-zipapp
+ path: virtualenv.pyz
+ publish:
+ needs: build
+ runs-on: ubuntu-24.04
environment:
name: release
url: https://pypi.org/project/virtualenv/${{ github.ref_name }}
permissions:
+ contents: write
id-token: write
steps:
+ - name: Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ fetch-depth: 0
+ persist-credentials: false
- name: Download all the dists
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: ${{ env.dists-artifact-name }}
path: dist/
- name: Publish to PyPI
- uses: pypa/gh-action-pypi-publish@v1.12.2
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
attestations: true
+ - name: Download the zipapp
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
+ with:
+ name: virtualenv-zipapp
+ - name: Create GitHub Release
+ run: gh release create "$GITHUB_REF_NAME" virtualenv.pyz --generate-notes
+ env:
+ GH_TOKEN: ${{ github.token }}
+ - name: Update get-virtualenv
+ env:
+ GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
+ run: |
+ git clone https://x-access-token:${GH_TOKEN}@github.com/pypa/get-virtualenv.git
+ cp virtualenv.pyz get-virtualenv/public/virtualenv.pyz
+ echo -n "${GITHUB_REF_NAME}" > get-virtualenv/public/version.txt
+ cd get-virtualenv
+ user_info=$(gh api /user)
+ git config user.name "$(echo "$user_info" | jq -r '.name // .login')"
+ git config user.email "$(echo "$user_info" | jq -r '.id')+$(echo "$user_info" | jq -r '.login')@users.noreply.github.com"
+ git add public/virtualenv.pyz public/version.txt
+ git commit -m "update virtualenv to ${GITHUB_REF_NAME}"
+ git push origin main
+ rollback:
+ if: ${{ always() && needs.build.result == 'success' && needs.publish.result == 'failure' }}
+ needs:
+ - build
+ - publish
+ runs-on: ubuntu-24.04
+ environment: release
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GH_RELEASE_TOKEN }} # zizmor: ignore[artipacked]
+ - name: Delete GitHub Release if created
+ env:
+ GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
+ run: gh release delete "${GITHUB_REF_NAME}" --yes --cleanup-tag || true
+ - name: Delete remote tag
+ run: git push origin --delete "${GITHUB_REF_NAME}" || true
+ - name: Reset release commit on main
+ run: |
+ git checkout main
+ git reset --hard HEAD~1
+ git push origin main --force
+ - name: Rollback get-virtualenv if updated
+ env:
+ GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
+ run: |
+ git clone https://x-access-token:${GH_TOKEN}@github.com/pypa/get-virtualenv.git
+ cd get-virtualenv
+ current_version=$(cat public/version.txt)
+ if [ "$current_version" = "${GITHUB_REF_NAME}" ]; then
+ gh release delete "$current_version" --yes --cleanup-tag || true
+ git reset --hard HEAD~1
+ git push origin main --force
+ fi
diff --git a/.github/workflows/upgrade.yaml b/.github/workflows/upgrade.yaml
new file mode 100644
index 000000000..fb951181b
--- /dev/null
+++ b/.github/workflows/upgrade.yaml
@@ -0,0 +1,97 @@
+name: Upgrade embedded dependencies
+on:
+ schedule:
+ - cron: "0 10 * * *" # daily at 10:00 UTC
+ workflow_dispatch:
+permissions:
+ contents: read
+jobs:
+ upgrade:
+ name: Upgrade embedded pip/setuptools/wheel
+ if: github.repository_owner == 'pypa'
+ runs-on: ubuntu-24.04
+ environment: upgrade
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - name: Install uv
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
+ - name: Install tox
+ run: uv tool install --python-preference only-managed --python 3.14 "tox>=4.32" --with tox-uv
+ - name: Checkout code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ fetch-depth: 0
+ ssh-key: ${{ secrets.DEPLOY_KEY }} # zizmor: ignore[artipacked]
+ - name: Fetch upstream tags for versioning
+ run: git fetch --force --tags https://github.com/pypa/virtualenv.git
+ - name: Run upgrade
+ id: upgrade
+ env:
+ UPGRADE_ADVISORY: "1"
+ run: |
+ tox run -e upgrade
+ if [ -n "$(git diff --name-only)" ]; then
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ echo "### Embedded dependency changes" >> "$GITHUB_STEP_SUMMARY"
+ git diff --stat >> "$GITHUB_STEP_SUMMARY"
+ else
+ echo "changed=false" >> "$GITHUB_OUTPUT"
+ echo "### All embedded dependencies are up to date" >> "$GITHUB_STEP_SUMMARY"
+ fi
+ - name: Check PyPI release age
+ if: steps.upgrade.outputs.changed == 'true'
+ id: age-check
+ run: |
+ cutoff=$(( $(date +%s) - 7 * 24 * 3600 ))
+ too_new=false
+ for whl in $(git diff --name-only -- 'src/virtualenv/seed/wheels/embed/*.whl'); do
+ pkg=$(basename "$whl" | cut -d- -f1)
+ version=$(basename "$whl" | cut -d- -f2)
+ upload_time=$(curl -sf "https://pypi.org/pypi/${pkg}/${version}/json" | jq -r '.urls[0].upload_time_iso_8601 // empty')
+ if [ -z "$upload_time" ]; then
+ echo "::warning::Could not fetch release date for ${pkg}==${version}"
+ continue
+ fi
+ release_epoch=$(date -d "$upload_time" +%s)
+ if [ "$release_epoch" -gt "$cutoff" ]; then
+ echo "::notice::${pkg}==${version} released less than 7 days ago (${upload_time})"
+ too_new=true
+ fi
+ done
+ if [ "$too_new" = "true" ]; then
+ echo "skip=true" >> "$GITHUB_OUTPUT"
+ echo "### Skipped โ some packages released less than 7 days ago" >> "$GITHUB_STEP_SUMMARY"
+ else
+ echo "skip=false" >> "$GITHUB_OUTPUT"
+ fi
+ - name: Create Pull Request
+ if: steps.upgrade.outputs.changed == 'true' && steps.age-check.outputs.skip != 'true'
+ id: cpr
+ uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8
+ with:
+ commit-message: "Upgrade embedded dependencies"
+ branch: auto/upgrade-embedded-deps
+ delete-branch: true
+ title: "Upgrade embedded pip/setuptools/wheel"
+ body: |
+ Automated upgrade of embedded pip, setuptools, and wheel dependencies.
+
+ This PR was created automatically by the [upgrade workflow](https://github.com/${{ github.repository }}/actions/workflows/upgrade.yaml).
+ labels: |
+ dependencies
+ - name: Rename changelog with PR number
+ if: steps.cpr.outputs.pull-request-number
+ run: |
+ pr_number="${STEPS_CPR_OUTPUTS_PULL_REQUEST_NUMBER}"
+ git config user.name "github-actions[bot]"
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git fetch origin auto/upgrade-embedded-deps
+ git checkout -B auto/upgrade-embedded-deps FETCH_HEAD
+ mv docs/changelog/u.bugfix.rst "docs/changelog/${pr_number}.bugfix.rst"
+ git add docs/changelog/
+ git commit -m "Rename changelog to ${pr_number}.bugfix.rst"
+ git push origin HEAD:auto/upgrade-embedded-deps
+ env:
+ STEPS_CPR_OUTPUTS_PULL_REQUEST_NUMBER: ${{ steps.cpr.outputs.pull-request-number }}
diff --git a/.markdownlint.yaml b/.markdownlint.yaml
index 33a1615f7..b0571c38a 100644
--- a/.markdownlint.yaml
+++ b/.markdownlint.yaml
@@ -3,7 +3,6 @@ MD013:
headers: false
line_length: 120
tables: false
-
MD046:
style: fenced
no-emphasis-as-header: false
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a19389600..cc57e6641 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,41 +1,57 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ rev: v6.0.0
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/python-jsonschema/check-jsonschema
- rev: 0.29.4
+ rev: 0.38.0
hooks:
- id: check-github-workflows
args: ["--verbose"]
- repo: https://github.com/codespell-project/codespell
- rev: v2.3.0
+ rev: v2.4.3
hooks:
- id: codespell
args: ["--write-changes"]
- - repo: https://github.com/tox-dev/tox-ini-fmt
- rev: "1.4.1"
+ - repo: https://github.com/tox-dev/tox-toml-fmt
+ rev: "v1.10.3"
hooks:
- - id: tox-ini-fmt
- args: ["-p", "fix"]
+ - id: tox-toml-fmt
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: "v2.5.0"
+ rev: "v2.29.3"
hooks:
- id: pyproject-fmt
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: "v0.7.2"
+ rev: "v0.16.6"
hooks:
- id: ruff-format
- id: ruff
args: ["--fix", "--unsafe-fixes", "--exit-non-zero-on-fix"]
- - repo: https://github.com/rbubley/mirrors-prettier
- rev: "v3.3.3"
+ - repo: https://github.com/google/yamlfmt
+ rev: "v0.21.0"
hooks:
- - id: prettier
+ - id: yamlfmt
+ - repo: local
+ hooks:
+ - id: mdformat
+ name: mdformat
+ entry: mdformat --wrap 120
+ language: python
+ types: [markdown]
additional_dependencies:
- - prettier@3.3.3
- - "@prettier/plugin-xml@3.4.1"
+ - mdformat-gfm>=1
+ - mdformat-ruff>=0.1.3
+ - repo: https://github.com/LilSpazJoekp/docstrfmt
+ rev: v2.2.1
+ hooks:
+ - id: docstrfmt
+ args: ["-l", "120"]
+ additional_dependencies: ["sphinx>=9.1"]
+ - repo: https://github.com/zizmorcore/zizmor-pre-commit
+ rev: v1.30.0
+ hooks:
+ - id: zizmor
- repo: meta
hooks:
- id: check-hooks-apply
diff --git a/.readthedocs.yml b/.readthedocs.yml
index ab3011302..60e9a43d0 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,15 +1,8 @@
version: 2
build:
- os: ubuntu-22.04
- tools:
- python: "3"
-python:
- install:
- - method: pip
- path: .
- extra_requirements:
- - docs
-sphinx:
- builder: html
- configuration: docs/conf.py
- fail_on_warning: true
+ os: ubuntu-lts-latest
+ tools: {}
+ commands:
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
+ - ~/.local/bin/uv tool install tox --with tox-uv -p 3.14 --managed-python
+ - ~/.local/bin/tox run -e docs --
diff --git a/README.md b/README.md
index 87f45e077..f85561e69 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
A tool for creating isolated `virtual` python environments.
-- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
+- [Installation](https://virtualenv.pypa.io/en/latest/how-to/install.html)
- [Documentation](https://virtualenv.pypa.io)
- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
- [Issues](https://github.com/pypa/virtualenv/issues)
diff --git a/docs/_static/mermaid-normalize.js b/docs/_static/mermaid-normalize.js
new file mode 100644
index 000000000..0b49d1868
--- /dev/null
+++ b/docs/_static/mermaid-normalize.js
@@ -0,0 +1,29 @@
+(function () {
+ function dedent(text) {
+ const lines = text.replace(/\s+$/u, "").split("\n");
+ const indents = lines
+ .filter((line) => line.trim())
+ .map((line) => line.match(/^\s*/u)[0].length);
+
+ if (!indents.length) {
+ return text;
+ }
+
+ const indent = Math.min(...indents);
+ return lines.map((line) => line.slice(indent)).join("\n");
+ }
+
+ function normalizeMermaidBlocks() {
+ document.querySelectorAll("pre.mermaid").forEach((block) => {
+ block.textContent = dedent(block.textContent);
+ });
+ }
+
+ if (document.readyState === "loading") {
+ document.addEventListener("DOMContentLoaded", normalizeMermaidBlocks, {
+ once: true,
+ });
+ } else {
+ normalizeMermaidBlocks();
+ }
+})();
diff --git a/docs/_static/rtd-search.js b/docs/_static/rtd-search.js
new file mode 100644
index 000000000..133e1e31c
--- /dev/null
+++ b/docs/_static/rtd-search.js
@@ -0,0 +1,11 @@
+document.addEventListener("DOMContentLoaded", () => {
+ const searchInput = document.querySelector(
+ ".sidebar-search input[type='search']",
+ );
+ if (searchInput) {
+ searchInput.addEventListener("focus", () => {
+ document.dispatchEvent(new CustomEvent("readthedocs-search-show"));
+ searchInput.blur();
+ });
+ }
+});
diff --git a/docs/_static/virtualenv.png b/docs/_static/virtualenv.png
new file mode 100644
index 000000000..1f729837d
Binary files /dev/null and b/docs/_static/virtualenv.png differ
diff --git a/docs/_static/virtualenv.svg b/docs/_static/virtualenv.svg
new file mode 100644
index 000000000..090396002
--- /dev/null
+++ b/docs/_static/virtualenv.svg
@@ -0,0 +1,30 @@
+
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 7c4c43198..58e82db7d 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,834 +1,1768 @@
-Release History
-===============
+#################
+ Release History
+#################
-.. include:: _draft.rst
+.. towncrier-draft-entries:: [UNRELEASED DRAFT]
.. towncrier release notes start
-v20.27.1 (2024-10-28)
----------------------
+**********************
+ v21.7.9 (2026-09-09)
+**********************
+
+Bugfixes - 21.7.9
+=================
+
+- Replace dangling symlinks, including interpreter aliases, when recreating an environment. This prevents
+ ``FileExistsError`` with ``--symlinks`` and writes outside the environment with ``--copies`` - by :user:`darrenhuai`.
+ (:issue:`3229`)
+- Ignore malformed or unreadable ``virtualenv.ini`` files and report the error in the log and ``--help``. Accept a UTF-8
+ byte order mark, as written by PowerShell 5 and older Notepad versions - by :user:`darrenhuai`. (:issue:`3230`)
+
+**********************
+ v21.7.8 (2026-09-01)
+**********************
+
+Bugfixes - 21.7.8
+=================
+
+- A missing source needed by both install modes now disables the builtin creator through ``meta.error``. The check
+ compared ``RefWhen`` values against ``RefMust`` members, so creation went on to fail with a ``FileNotFoundError`` or a
+ dangling symlink - by :user:`darrenhuai`. (:issue:`3227`)
+
+**********************
+ v21.7.7 (2026-08-28)
+**********************
+
+Bugfixes - 21.7.7
+=================
+
+- Bump the ``python-discovery`` minimum to ``>=1.6`` for ``PythonInfo.system_exe``, which reports the system interpreter
+ without the nullable typing of ``system_executable`` - by :user:`gaborbernat`. (:issue:`3224`)
+
+Improved Documentation - 21.7.7
+===============================
+
+- Document the names the interpreter answers to inside a created environment. A new :doc:`reference/environment-layout`
+ page lists them per platform, the tutorial and the usage guide point at it, and the explanation of creators covers why
+ an environment carries several names and why Windows copies a redirector - by :user:`gaborbernat`. (:issue:`3225`)
+
+**********************
+ v21.7.6 (2026-08-28)
+**********************
+
+Bugfixes - 21.7.6
+=================
+
+- On Windows, ``virtualenv`` no longer copies the CPython 3.13+ ``venvlauncher.exe`` shim into ``Scripts`` under the
+ shim's own name, and a host such as ``python_d.exe`` gets its alias back. The alias set took its names from the shim
+ that stands in for the interpreter, so every environment gained a stray launcher copy and lost the interpreter's own
+ file name - by :user:`darrenhuai`. (:issue:`3223`)
+
+**********************
+ v21.7.5 (2026-08-25)
+**********************
+
+Bugfixes - 21.7.5
+=================
+
+- Fix the type check against ``python-discovery`` 1.5.2, whose annotations allow a ``None`` ``prefix`` and integer
+ ``sysconfig_vars`` values: config var substitution now skips a missing prefix and locating the shared libpython
+ requires string ``INSTSONAME``/``LIBDIR`` values. (:issue:`3211`)
+- ``ExePathRef.can_run`` now checks the group and other execute bits instead of only the owner one, and returns
+ ``False`` rather than ``None`` when a file carries none of the three - by :user:`darrenhuai`. (:issue:`3217`)
+- ``safe_delete`` no longer passes ``ignore_errors=True`` to ``shutil.rmtree``, which replaced its own chmod-and-retry
+ handler with a no-op and swallowed every failure. Read-only files - every file in a wheel image, which ``set_tree``
+ marks - survived, so ``--reset-app-data`` and ``--clear`` kept trees they reported deleting. The handler now retries
+ only the deletion itself, keeps the other mode bits, and raises the original error for anything it cannot clear - by
+ :user:`darrenhuai`. (:issue:`3222`)
+
+**********************
+ v21.7.4 (2026-08-10)
+**********************
+
+Bugfixes - 21.7.4
+=================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``84.0.0`` from ``83.0.0`` (:issue:`3208`)
+
+**********************
+ v21.7.3 (2026-08-08)
+**********************
+
+Bugfixes - 21.7.3
+=================
+
+- ``ListType.split_values`` now returns a ``list`` you can iterate more than once, and accepts ``bytes`` input instead
+ of raising ``TypeError`` - by :user:`darrenhuai`. (:issue:`3207`)
+
+**********************
+ v21.7.2 (2026-08-07)
+**********************
+
+Bugfixes - 21.7.2
+=================
+
+- Upgrade embedded wheels:
+
+ - pip to ``26.2.1`` from ``26.2`` (:issue:`3206`)
+
+**********************
+ v21.7.1 (2026-07-30)
+**********************
+
+Bugfixes - 21.7.1
+=================
+
+- Upgrade embedded wheels:
+
+ - pip to ``26.2`` from ``26.1.2`` (:issue:`u`)
+
+Improved Documentation - 21.7.1
+===============================
+
+- Document that ``virtualenv.png`` is the official logo and ``virtualenv.svg`` is a simplified favicon-only mark - by
+ :user:`gaborbernat`. (:issue:`3199`)
+
+**********************
+ v21.7.0 (2026-07-21)
+**********************
+
+Features - 21.7.0
+=================
+
+- Declare support for Python 3.15: CI now tests against the CPython 3.15 beta, including the free-threaded ``3.15t``
+ build, and the ``Programming Language :: Python :: 3.15`` classifier is advertised. (:issue:`3192`)
+
+**********************
+ v21.6.1 (2026-07-10)
+**********************
+
+Bugfixes - 21.6.1
+=================
+
+- Harden the fish activator prompt against user functions that shadow builtins. Routing ``functions``, ``printf``,
+ ``string``, ``echo`` and ``source``/``.`` through ``builtin`` stops a shadowing function (such as a dot-style
+ directory navigator that redefines ``.``) from hijacking the prompt and dropping the previous command's exit status,
+ matching the CPython fix in `gh-140006 `_. (:issue:`3185`)
+
+**********************
+ v21.6.0 (2026-07-06)
+**********************
+
+Features - 21.6.0
+=================
+
+- Stop installing the ``_virtualenv.{py,pth}`` distutils import hook for Python 3.10 and later, where pip, setuptools
+ and CPython already ignore the install config keys it guards against; this removes the hook's startup import cost. The
+ hook is still installed for Python 3.9 - :issue:`3181`. (:issue:`3181`)
+
+**********************
+ v21.5.2 (2026-07-06)
+**********************
+
+Bugfixes - 21.5.2
+=================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``83.0.0`` (:issue:`3180`)
+
+**********************
+ v21.5.1 (2026-06-16)
+**********************
+
+Bugfixes - 21.5.1
+=================
+
+- Refuse to create environments whose Python the bundled wheels no longer cover (currently below 3.9). virtualenv used
+ to substitute the newest bundled ``pip``, which cannot run on such a target, leaving a broken environment; seeder
+ selection now rejects it up front with a clear error. ``--no-seed`` and third-party seeders that ship compatible
+ wheels still work - by :user:`gaborbernat`. (:issue:`3171`)
+
+**********************
+ v21.5.0 (2026-06-13)
+**********************
+
+Features - 21.5.0
+=================
+
+- Drop support for Python 3.8; virtualenv now requires Python 3.9 or later to run and to create environments. Remove the
+ embedded ``wheel`` seed package, which virtualenv bundled only for Python 3.8. The ``--wheel`` and ``--no-wheel``
+ options stay as no-ops, but now warn that virtualenv will remove them in a release after 2026-12 - by
+ :user:`gaborbernat`. (:issue:`3170`)
+
+Bugfixes - 21.5.0
+=================
+
+- Upgrade embedded wheels:
+
+ Removed wheel of ``0.47.0`` (:issue:`u`)
+
+**********************
+ v21.4.3 (2026-06-11)
+**********************
+
+Bugfixes - 21.4.3
+=================
+
+- Upgrade embedded wheels:
+
+ - pip to ``26.1.2`` from ``26.1.1`` (:issue:`u`)
+
+- Resolve executable-only symlinks when recording ``home`` and ``base-executable`` in ``pyvenv.cfg``, mirroring
+ CPython's ``getpath.realpath`` (python/cpython#115237), so environments created from a symlink to the interpreter
+ binary locate the base stdlib (for example python-build-standalone); a fully symlinked interpreter tree is kept as-is
+ - by :user:`gaborbernat`. (:issue:`3157`)
+- Stop exporting ``PS1`` from the bash activator so child processes do not inherit shell prompt state. (:issue:`3158`)
+- Handle CYGWIN/MSYS/MINGW path conversions in fish activation script - by user::`LuNoX`. (:issue:`3160`)
+
+**********************
+ v21.4.2 (2026-05-31)
+**********************
+
+Bugfixes - 21.4.2
+=================
+
+- Stop ``deactivate`` in the bash/zsh activation script from aborting under ``set -e`` when ``hash -r`` fails (for
+ example with shell hashing disabled) by appending ``|| true``, matching CPython ``venv`` (gh-149701) and the existing
+ non-deactivate call - by :user:`gaborbernat`. (:issue:`3152`)
+
+**********************
+ v21.4.1 (2026-05-28)
+**********************
+
+Bugfixes - 21.4.1
+=================
+
+- Fix Windows debug build ``venvlauncher_d.exe`` substitution never triggering because ``executables()`` compared the
+ source executable name instead of the target name, and fix ``AttributeError`` on ``debug_build`` attribute for
+ interpreter info objects missing the field - by :user:`gaborbernat`. (:issue:`3151`)
+
+**********************
+ v21.4.0 (2026-05-28)
+**********************
+
+Features - 21.4.0
+=================
+
+- Remove dead code targeting Python versions below the supported target range (PyPy 3.6, deprecated importlib APIs) and
+ simplify the runtime import hook in ``_virtualenv.py`` - by :user:`gaborbernat`. (:issue:`3149`)
+- Support Windows debug builds (``python_d.exe``, ``venvlauncher_d.exe``) matching CPython venv behavior, remove dead
+ ``__SCRIPT_DIR__`` replacement and ``has_shim`` version guard, drop unreachable Python 3.7 branch from
+ ``pyvenv_launch_patch_active``, and fix wheel deprecation message to say ``>= 3.9`` - by :user:`gaborbernat`.
+ (:issue:`3150`)
+
+**********************
+ v21.3.3 (2026-05-13)
+**********************
+
+Bugfixes - 21.3.3
+=================
+
+- recognize GraalPy interpreters using the normalized ``GraalPy`` name - by :user:`timfel`. (:issue:`3144`)
+
+**********************
+ v21.3.2 (2026-05-12)
+**********************
+
+No significant changes.
+
+**********************
+ v21.3.1 (2026-05-05)
+**********************
+
+Bugfixes - 21.3.1
+=================
+
+- Upgrade embedded wheels:
+
+ - pip to ``26.1.1`` from ``26.1`` (:issue:`3138`)
+
+**********************
+ v21.3.0 (2026-04-27)
+**********************
+
+Features - 21.3.0
+=================
+
+- Re-introduce ``xonsh`` shell activator (``activate.xsh``) previously removed in 20.7.0, and make the plugin loader
+ prefer virtualenv's built-in entry points so a third-party package cannot override them by registering a duplicate
+ name. (:issue:`3003`)
+
+Bugfixes - 21.3.0
+=================
+
+- Upgrade embedded wheels:
+
+ - pip to ``26.1`` (:issue:`3132`)
+
+**********************
+ v21.2.4 (2026-04-14)
+**********************
+
+Bugfixes - 21.2.4
+=================
+
+- Security hardening: validate each entry of a seed wheel archive before extracting it so a tampered wheel cannot escape
+ the app-data image directory via an absolute path or ``..`` traversal. (:issue:`3118`)
+- Security hardening: verify the SHA-256 of every bundled seed wheel when it is loaded so a corrupted or tampered file
+ on disk fails loud instead of being handed to pip. The hash table is generated alongside ``BUNDLE_SUPPORT`` by
+ ``tasks/upgrade_wheels.py``. (:issue:`3119`)
+- Security hardening: validate the distribution name and version specifier passed to ``pip download`` when acquiring a
+ seed wheel so extras, pip flags, or shell metacharacters cannot be smuggled into the subprocess command line.
+ (:issue:`3120`)
+- Security hardening: replace the string-prefix containment check in ``virtualenv.util.zipapp`` with
+ ``Path.relative_to`` so the zipapp extraction helpers refuse any path that does not resolve under the archive root.
+ (:issue:`3121`)
+- Security hardening: do not silently fall back to an unverified HTTPS context when the periodic update request to PyPI
+ fails TLS verification. The returned metadata drives which wheel version virtualenv considers "up to date", so
+ accepting an unverified response lets a network-level attacker suppress security updates. Set
+ ``VIRTUALENV_PERIODIC_UPDATE_INSECURE=1`` to restore the previous behavior on hosts with broken trust stores.
+ (:issue:`3122`)
+
+**********************
+ v21.2.3 (2026-04-14)
+**********************
+
+No significant changes.
+
+**********************
+ v21.2.2 (2026-04-13)
+**********************
+
+Bugfixes - 21.2.2
+=================
+
+- Bump ``python-discovery`` minimum to ``>=1.2.2`` to include ``normalize_isa`` support - by :user:`rahuldevikar`.
+ (:issue:`3117`)
+
+**********************
+ v21.2.1 (2026-04-09)
+**********************
+
+Bugfixes - 21.2.1
+=================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``82.0.1`` from ``82.0.0`` (:issue:`3093`)
+
+- Use terminal width for help formatting instead of hardcoded 240. (:issue:`3110`)
+
+**********************
+ v21.2.0 (2026-03-09)
+**********************
+
+Features - 21.2.0
+=================
+
+- Update embed wheel generator (``tasks/upgrade_wheels.py``) to include type annotations in generated output - by
+ :user:`rahuldevikar`. (:issue:`3075`)
+
+Bugfixes - 21.2.0
+=================
+
+- Pass ``--without-scm-ignore-files`` to subprocess venv on Python 3.13+ so virtualenv controls ``.gitignore`` creation,
+ fixing flaky ``test_create_no_seed`` and ``--no-vcs-ignore`` being ignored in subprocess path - by
+ :user:`gaborbernat`. (:issue:`3089`)
+- Use ``BASH_SOURCE[0]`` instead of ``$0`` in the bash activate script relocation fallback, fixing incorrect ``PATH``
+ when sourcing the activate script from a different directory - by :user:`gaborbernat`. (:issue:`3090`)
+
+**********************
+ v21.1.0 (2026-02-27)
+**********************
+
+Features - 21.1.0
+=================
+
+- Add comprehensive type annotations across the entire codebase and ship a PEP 561 ``py.typed`` marker so downstream
+ consumers and type checkers recognize virtualenv as an inline-typed package - by :user:`rahuldevikar`. (:issue:`3075`)
+
+**********************
+ v21.0.0 (2026-02-25)
+**********************
+
+Deprecations and Removals - 21.0.0
+==================================
+
+- The Python discovery logic has been extracted into a standalone ``python-discovery`` package on PyPI (`documentation
+ `_) and is now consumed as a dependency. If you previously imported
+ discovery internals directly (e.g. ``from virtualenv.discovery.py_info import PythonInfo``), switch to ``from
+ python_discovery import PythonInfo``. Backward-compatibility re-export shims are provided at
+ ``virtualenv.discovery.py_info``, ``virtualenv.discovery.py_spec``, and ``virtualenv.discovery.cached_py_info``,
+ however these are considered unsupported and may be removed in a future release - by :user:`gaborbernat`.
+ (:issue:`3070`)
+
+***********************
+ v20.39.1 (2026-02-25)
+***********************
+
+Features - 20.39.1
+==================
+
+- Add support for creating virtual environments with RustPython - by :user:`elmjag`. (:issue:`3010`)
+
+***********************
+ v20.39.0 (2026-02-23)
+***********************
+
+Features - 20.39.0
+==================
+
+- Automatically resolve version manager shims (pyenv, mise, asdf) to the real Python binary during discovery, preventing
+ incorrect interpreter selection when shims are on ``PATH`` - by :user:`gaborbernat`. (:issue:`3049`)
+- Add architecture (ISA) awareness to Python discovery โ users can now specify a CPU architecture suffix in the
+ ``--python`` spec string (e.g. ``cpython3.12-64-arm64``) to distinguish between interpreters that share the same
+ version and bitness but target different architectures. Uses ``sysconfig.get_platform()`` as the data source, with
+ cross-platform normalization (``amd64`` โ ``x86_64``, ``aarch64`` โ ``arm64``). Omitting the suffix preserves existing
+ behavior - by :user:`rahuldevikar`. (:issue:`3059`)
+
+***********************
+ v20.38.0 (2026-02-19)
+***********************
+
+Features - 20.38.0
+==================
+
+- Store app data (pip/setuptools/wheel caches) under the OS cache directory (``platformdirs.user_cache_dir``) instead of
+ the data directory (``platformdirs.user_data_dir``). Existing app data at the old location is automatically migrated
+ on first use. This ensures cached files that can be redownloaded are placed in the standard cache location (e.g.
+ ``~/.cache`` on Linux, ``~/Library/Caches`` on macOS) where they are excluded from backups and can be cleaned by
+ system tools - by :user:`rahuldevikar`. (:issue:`1884`) (:issue:`1884`)
+- Add ``PKG_CONFIG_PATH`` environment variable support to all activation scripts (Bash, Batch, PowerShell, Fish, C
+ Shell, Nushell, and Python). The virtualenv's ``lib/pkgconfig`` directory is now automatically prepended to
+ ``PKG_CONFIG_PATH`` on activation and restored on deactivation, enabling packages that use ``pkg-config`` during
+ build/install to find their configuration files - by :user:`rahuldevikar`. (:issue:`2637`)
+- Upgrade embedded pip to ``26.0.1`` from ``25.3`` and setuptools to ``82.0.0``, ``75.3.4`` from ``75.3.2``, ``80.9.0``
+ - by :user:`rahuldevikar`. (:issue:`3027`)
+- Replace ``ty: ignore`` comments with proper type narrowing using assertions and explicit None checks - by
+ :user:`rahuldevikar`. (:issue:`3029`)
+
+Bugfixes - 20.38.0
+==================
+
+- Exclude pywin32 DLLs (``pywintypes*.dll``, ``pythoncom*.dll``) from being copied to the Scripts directory during
+ virtualenv creation on Windows. This fixes compatibility issues with pywin32, which expects its DLLs to be installed
+ in ``site-packages/pywin32_system32`` by its own post-install script - by :user:`rahuldevikar`. (:issue:`2662`)
+- Preserve symlinks in ``pyvenv.cfg`` paths to match ``venv`` behavior. Use ``os.path.abspath()`` instead of
+ ``os.path.realpath()`` to normalize paths without resolving symlinks, fixing issues with Python installations accessed
+ via symlinked directories (common in network-mounted filesystems) - by :user:`rahuldevikar`. Fixes :issue:`2770`.
+ (:issue:`2770`)
+- Fix Windows activation scripts to properly quote ``python.exe`` path, preventing failures when Python is installed in
+ a path with spaces (e.g., ``C:\Program Files``) and a file named ``C:\Program`` exists on the filesystem - by
+ :user:`rahuldevikar`. (:issue:`2985`)
+- Fix ``bash -u`` (``set -o nounset``) compatibility in bash activation script by using ``${PKG_CONFIG_PATH:-}`` and
+ ``${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}`` to handle unset ``PKG_CONFIG_PATH`` - by :user:`Fridayai700`.
+ (:issue:`3044`)
+- Gracefully handle corrupted on-disk cache and invalid JSON from Python interrogation subprocess instead of crashing
+ with unhandled ``JSONDecodeError`` or ``KeyError`` - by :user:`gaborbernat`. (:issue:`3054`)
+
+***********************
+ v20.36.1 (2026-01-09)
+***********************
+
+Bugfixes - 20.36.1
+==================
+
+- Fix TOCTOU vulnerabilities in app_data and lock directory creation that could be exploited via symlink attacks -
+ reported by :user:`tsigouris007`, fixed by :user:`gaborbernat`. (:issue:`3013`)
+
+***********************
+ v20.36.0 (2026-01-07)
+***********************
+
+Features - 20.36.0
+==================
+
+- Add support for PEP 440 version specifiers in the ``--python`` flag. Users can now specify Python versions using
+ operators like ``>=``, ``<=``, ``~=``, etc. For example: ``virtualenv --python=">=3.12" myenv`` `. (:issue:`2994`)
+
+***********************
+ v20.35.4 (2025-10-28)
+***********************
+
+Bugfixes - 20.35.4
+==================
+
+- Fix race condition in ``_virtualenv.py`` when file is overwritten during import, preventing ``NameError`` when
+ ``_DISTUTILS_PATCH`` is accessed - by :user:`gracetyy`. (:issue:`2969`)
+- Upgrade embedded wheels:
+
+ - pip to ``25.3`` from ``25.2`` (:issue:`2989`)
+
+***********************
+ v20.35.3 (2025-10-10)
+***********************
+
+Bugfixes - 20.35.3
+==================
+
+- Accept RuntimeError in `test_too_many_open_files`, by :user:`esafak` (:issue:`2935`)
+
+***********************
+ v20.35.2 (2025-10-10)
+***********************
+
+Bugfixes - 20.35.2
+==================
+
+- Revert out changes related to the extraction of the discovery module - by :user:`gaborbernat`. (:issue:`2978`)
+
+***********************
+ v20.35.1 (2025-10-09)
+***********************
+
+Bugfixes - 20.35.1
+==================
+
+- Patch get_interpreter to handle missing cache and app_data - by :user:`esafak` (:issue:`2972`)
+- Fix backwards incompatible changes to ``PythonInfo`` - by :user:`gaborbernat`. (:issue:`2975`)
+
+***********************
+ v20.35.0 (2025-10-08)
+***********************
+
+Features - 20.35.0
+==================
+
+- Add AppData and Cache protocols to discovery for decoupling - by :user:`esafak`. (:issue:`2074`)
+- Ensure python3.exe and python3 on Windows for Python 3 - by :user:`esafak`. (:issue:`2774`)
+
+Bugfixes - 20.35.0
+==================
+
+- Replaced direct references to tcl/tk library paths with getattr - by :user:`esafak` (:issue:`2944`)
+- Restore absolute import of fs_is_case_sensitive - by :user:`esafak`. (:issue:`2955`)
+
+***********************
+ v20.34.0 (2025-08-13)
+***********************
+
+Features - 20.34.0
+==================
+
+- Abstract out caching in discovery - by :user:`esafak`. Decouple `FileCache` from `py_info` (discovery) - by
+ :user:`esafak`. Remove references to py_info in FileCache - by :user:`esafak`. Decouple discovery from creator plugins
+ - by :user:`esafak`. Decouple discovery by duplicating info utils - by :user:`esafak`. (:issue:`2074`)
+- Add PyPy 3.11 support. Contributed by :user:`esafak`. (:issue:`2932`)
+
+Bugfixes - 20.34.0
+==================
+
+- Upgrade embedded wheel pip to ``25.2`` from ``25.1.1`` - by :user:`gaborbernat`. (:issue:`2333`)
+- Accept RuntimeError in `test_too_many_open_files`, by :user:`esafak` (:issue:`2935`)
+- Python in PATH takes precedence over uv-managed python. Contributed by :user:`edgarrmondragon`. (:issue:`2952`)
+
+***********************
+ v20.33.1 (2025-08-05)
+***********************
+
+Bugfixes - 20.33.1
+==================
+
+- Correctly unpack _get_tcl_tk_libs() response in PythonInfo. Contributed by :user:`esafak`. (:issue:`2930`)
+- Restore `py_info.py` timestamp in `test_py_info_cache_invalidation_on_py_info_change` Contributed by :user:`esafak`.
+ (:issue:`2933`)
+
+***********************
+ v20.33.0 (2025-08-03)
+***********************
+
+Features - 20.33.0
+==================
+
+- Added support for Tcl and Tkinter. You're welcome. Contributed by :user:`esafak`. (:issue:`425`)
+
+Bugfixes - 20.33.0
+==================
+
+- Prevent logging setup when --help is passed, fixing a flaky test. Contributed by :user:`esafak`. (:issue:`u`)
+- Fix cache invalidation for PythonInfo by hashing `py_info.py`. Contributed by :user:`esafak`. (:issue:`2467`)
+- When no discovery plugins are found, the application would crash with a StopIteration. This change catches the
+ StopIteration and raises a RuntimeError with a more informative message. Contributed by :user:`esafak`.
+ (:issue:`2493`)
+- Stop `--try-first-with` overriding absolute `--python` paths. Contributed by :user:`esafak`. (:issue:`2659`)
+- Force UTF-8 encoding for pip download Contributed by :user:`esafak`. (:issue:`2780`)
+- Creating a virtual environment on a filesystem without symlink-support would fail even with `--copies` Make
+ `fs_supports_symlink` perform a real symlink creation check on all platforms. Contributed by :user:`esafak`.
+ (:issue:`2786`)
+- Add a note to the user guide recommending the use of a specific Python version when creating virtual environments.
+ Contributed by :user:`esafak`. (:issue:`2808`)
+- Fix 'Too many open files' error due to a file descriptor leak in virtualenv's locking mechanism. Contributed by
+ :user:`esafak`. (:issue:`2834`)
+- Support renamed Windows venv redirector (`venvlauncher.exe` and `venvwlauncher.exe`) on Python 3.13 Contributed by
+ :user:`esafak`. (:issue:`2851`)
+- Resolve Nushell activation script deprecation warnings by dynamically selecting the ``--optional`` flag for Nushell
+ ``get`` command on version 0.106.0 and newer, while retaining the deprecated ``-i`` flag for older versions to
+ maintain compatibility. Contributed by :user:`gaborbernat`. (:issue:`2910`)
+
+***********************
+ v20.32.0 (2025-07-20)
+***********************
+
+Features - 20.32.0
+==================
+
+- Warn on incorrect invocation of Nushell activation script - by :user:`esafak`. (:issue:`nushell_activation`)
+- Discover uv-managed Python installations (:issue:`2901`)
+
+Bugfixes - 20.32.0
+==================
+
+- Ignore missing absolute paths for python discovery - by :user:`esafak` (:issue:`2870`)
+- Upgrade embedded setuptools to ``80.9.0`` from ``80.3.1`` - by :user:`gaborbernat`. (:issue:`2900`)
+
+***********************
+ v20.31.2 (2025-05-08)
+***********************
+
+No significant changes.
+
+***********************
+ v20.31.1 (2025-05-05)
+***********************
+
+Bugfixes - 20.31.1
+==================
+
+- Upgrade embedded wheels:
+
+ - pip to ``25.1.1`` from ``25.1``
+ - setuptools to ``80.3.1`` from ``78.1.0`` (:issue:`2880`)
+
+***********************
+ v20.31.0 (2025-05-05)
+***********************
+
+Features - 20.31.0
+==================
+
+- No longer bundle ``wheel`` wheels (except on Python 3.8), ``setuptools`` includes native ``bdist_wheel`` support.
+ Update ``pip`` to ``25.1``. (:issue:`2868`)
+
+Bugfixes - 20.31.0
+==================
+
+- ``get_embed_wheel()`` no longer fails with a :exc:`TypeError` when it is called with an unknown *distribution*.
+ (:issue:`2877`)
+- Fix ``HelpFormatter`` error with Python 3.14.0b1. (:issue:`2878`)
+
+***********************
+ v20.30.0 (2025-03-31)
+***********************
+
+Features - 20.30.0
+==================
+
+- Add support for `GraalPy `_. (:issue:`2832`)
+
+Bugfixes - 20.30.0
+==================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``78.1.0`` from ``75.3.2`` (:issue:`2863`)
+
+***********************
+ v20.29.3 (2025-03-06)
+***********************
+
+Bugfixes - 20.29.3
+==================
+
+- Ignore unreadable directories in ``PATH``. (:issue:`2794`)
+
+***********************
+ v20.29.2 (2025-02-10)
+***********************
+
+Bugfixes - 20.29.2
+==================
+
+- Remove old virtualenv wheel from the source distribution - by :user:`gaborbernat`. (:issue:`2841`)
+- Upgrade embedded wheel pip to ``25.0.1`` from ``24.3.1`` - by :user:`gaborbernat`. (:issue:`2843`)
+
+***********************
+ v20.29.1 (2025-01-17)
+***********************
+
+Bugfixes - 20.29.1
+==================
+
+- Fix PyInfo cache incompatibility warnings - by :user:`robsdedude`. (:issue:`2827`)
+
+***********************
+ v20.29.0 (2025-01-15)
+***********************
+
+Features - 20.29.0
+==================
+
+- Add support for selecting free-threaded Python interpreters, e.g., `python3.13t`. (:issue:`2809`)
+
+Bugfixes - 20.29.0
+==================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``75.8.0`` from ``75.6.0`` (:issue:`2823`)
+
+***********************
+ v20.28.1 (2025-01-02)
+***********************
+
+Bugfixes - 20.28.1
+==================
+
+- Skip tcsh tests on broken tcsh versions - by :user:`gaborbernat`. (:issue:`2814`)
+
+***********************
+ v20.28.0 (2024-11-25)
+***********************
+
+Features - 20.28.0
+==================
+
+- Write CACHEDIR.TAG file on creation - by "user:`neilramsay`. (:issue:`2803`)
+
+***********************
+ v20.27.2 (2024-11-25)
+***********************
+
+Bugfixes - 20.27.2
+==================
+
+- Upgrade embedded wheels:
+
+ - setuptools to ``75.3.0`` from ``75.2.0`` (:issue:`2798`)
+
+- Upgrade embedded wheels:
+
+ - wheel to ``0.45.0`` from ``0.44.0``
+ - setuptools to ``75.5.0`` (:issue:`2800`)
+
+- no longer forcibly echo off during windows batch activation (:issue:`2801`)
+- Upgrade embedded wheels:
+
+ - setuptools to ``75.6.0`` from ``75.5.0``
+ - wheel to ``0.45.1`` from ``0.45.0`` (:issue:`2804`)
+
+***********************
+ v20.27.1 (2024-10-28)
+***********************
Bugfixes - 20.27.1
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels:
- * pip to ``24.3.1`` from ``24.2`` (:issue:`2789`)
+ - pip to ``24.3.1`` from ``24.2`` (:issue:`2789`)
-v20.27.0 (2024-10-17)
----------------------
+***********************
+ v20.27.0 (2024-10-17)
+***********************
Features - 20.27.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Drop 3.7 support as the CI environments no longer allow it running - by :user:`gaborbernat`. (:issue:`2758`)
Bugfixes - 20.27.0
-~~~~~~~~~~~~~~~~~~
-- When a ``$PATH`` entry cannot be checked for existence, skip it instead of terminating - by :user:`hroncok`. (:issue:`2782`)
-- Upgrade embedded wheels:
+==================
- * setuptools to ``75.2.0`` from ``75.1.0``
- * Removed pip of ``24.0``
- * Removed setuptools of ``68.0.0``
- * Removed wheel of ``0.42.0``
+- When a ``$PATH`` entry cannot be checked for existence, skip it instead of terminating - by :user:`hroncok`.
+ (:issue:`2782`)
+- Upgrade embedded wheels:
+ - setuptools to ``75.2.0`` from ``75.1.0``
+ - Removed pip of ``24.0``
+ - Removed setuptools of ``68.0.0``
+ - Removed wheel of ``0.42.0``
- by :user:`gaborbernat`. (:issue:`2783`)
+
- Fix zipapp is broken on Windows post distlib ``0.3.9`` - by :user:`gaborbernat`. (:issue:`2784`)
-v20.26.6 (2024-09-27)
----------------------
+***********************
+ v20.26.6 (2024-09-27)
+***********************
Bugfixes - 20.26.6
-~~~~~~~~~~~~~~~~~~
-- Properly quote string placeholders in activation script templates to mitigate
- potential command injection - by :user:`y5c4l3`. (:issue:`2768`)
+==================
+
+- Properly quote string placeholders in activation script templates to mitigate potential command injection - by
+ :user:`y5c4l3`. (:issue:`2768`)
-v20.26.5 (2024-09-17)
----------------------
+***********************
+ v20.26.5 (2024-09-17)
+***********************
Bugfixes - 20.26.5
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels: setuptools to ``75.1.0`` from ``74.1.2`` - by :user:`gaborbernat`. (:issue:`2765`)
-v20.26.4 (2024-09-07)
----------------------
+***********************
+ v20.26.4 (2024-09-07)
+***********************
Bugfixes - 20.26.4
-~~~~~~~~~~~~~~~~~~
+==================
+
- no longer create `()` output in console during activation of a virtualenv by .bat file. (:issue:`2728`)
- Upgrade embedded wheels:
- * wheel to ``0.44.0`` from ``0.43.0``
- * pip to ``24.2`` from ``24.1``
- * setuptools to ``74.1.2`` from ``70.1.0`` (:issue:`2760`)
+ - wheel to ``0.44.0`` from ``0.43.0``
+ - pip to ``24.2`` from ``24.1``
+ - setuptools to ``74.1.2`` from ``70.1.0`` (:issue:`2760`)
-v20.26.3 (2024-06-21)
----------------------
+***********************
+ v20.26.3 (2024-06-21)
+***********************
Bugfixes - 20.26.3
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels:
- * setuptools to ``70.1.0`` from ``69.5.1``
- * pip to ``24.1`` from ``24.0`` (:issue:`2741`)
+ - setuptools to ``70.1.0`` from ``69.5.1``
+ - pip to ``24.1`` from ``24.0`` (:issue:`2741`)
-v20.26.2 (2024-05-13)
----------------------
+***********************
+ v20.26.2 (2024-05-13)
+***********************
Bugfixes - 20.26.2
-~~~~~~~~~~~~~~~~~~
-- ``virtualenv.pyz`` no longer fails when zipapp path contains a symlink - by :user:`HandSonic` and :user:`petamas`. (:issue:`1949`)
+==================
+
+- ``virtualenv.pyz`` no longer fails when zipapp path contains a symlink - by :user:`HandSonic` and :user:`petamas`.
+ (:issue:`1949`)
- Fix bad return code from activate.sh if hashing is disabled - by :user:'fenkes-ibm'. (:issue:`2717`)
-v20.26.1 (2024-04-29)
----------------------
+***********************
+ v20.26.1 (2024-04-29)
+***********************
Bugfixes - 20.26.1
-~~~~~~~~~~~~~~~~~~
+==================
+
- fix PATH-based Python discovery on Windows - by :user:`ofek`. (:issue:`2712`)
-v20.26.0 (2024-04-23)
----------------------
+***********************
+ v20.26.0 (2024-04-23)
+***********************
Bugfixes - 20.26.0
-~~~~~~~~~~~~~~~~~~
-- allow builtin discovery to discover specific interpreters (e.g. ``python3.12``) given an unspecific spec (e.g. ``python3``) - by :user:`flying-sheep`. (:issue:`2709`)
+==================
-v20.25.3 (2024-04-17)
----------------------
+- allow builtin discovery to discover specific interpreters (e.g. ``python3.12``) given an unspecific spec (e.g.
+ ``python3``) - by :user:`flying-sheep`. (:issue:`2709`)
+
+***********************
+ v20.25.3 (2024-04-17)
+***********************
Bugfixes - 20.25.3
-~~~~~~~~~~~~~~~~~~
+==================
+
- Python 3.13.0a6 renamed pathmod to parser. (:issue:`2702`)
-v20.25.2 (2024-04-16)
----------------------
+***********************
+ v20.25.2 (2024-04-16)
+***********************
Bugfixes - 20.25.2
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels:
- setuptools of ``69.1.0`` to ``69.5.1``
- wheel of ``0.42.0`` to ``0.43.0`` (:issue:`2699`)
-v20.25.1 (2024-02-21)
----------------------
+***********************
+ v20.25.1 (2024-02-21)
+***********************
Bugfixes - 20.25.1
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels:
- * setuptools to ``69.0.3`` from ``69.0.2``
- * pip to ``23.3.2`` from ``23.3.1`` (:issue:`2681`)
+ - setuptools to ``69.0.3`` from ``69.0.2``
+ - pip to ``23.3.2`` from ``23.3.1`` (:issue:`2681`)
+
- Upgrade embedded wheels:
- pip ``23.3.2`` to ``24.0``,
- setuptools ``69.0.3`` to ``69.1.0``. (:issue:`2691`)
Misc - 20.25.1
-~~~~~~~~~~~~~~
+==============
+
- :issue:`2688`
-v20.25.0 (2023-12-01)
----------------------
+***********************
+ v20.25.0 (2023-12-01)
+***********************
Features - 20.25.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- The tests now pass on the CI with Python 3.13.0a2 - by :user:`hroncok`. (:issue:`2673`)
Bugfixes - 20.25.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Upgrade embedded wheels:
- * wheel to ``0.41.3`` from ``0.41.2`` (:issue:`2665`)
+ - wheel to ``0.41.3`` from ``0.41.2`` (:issue:`2665`)
+
- Upgrade embedded wheels:
- * wheel to ``0.42.0`` from ``0.41.3``
- * setuptools to ``69.0.2`` from ``68.2.2`` (:issue:`2669`)
+ - wheel to ``0.42.0`` from ``0.41.3``
+ - setuptools to ``69.0.2`` from ``68.2.2`` (:issue:`2669`)
-v20.24.6 (2023-10-23)
----------------------
+***********************
+ v20.24.6 (2023-10-23)
+***********************
Bugfixes - 20.24.6
-~~~~~~~~~~~~~~~~~~
+==================
+
- Use get_hookimpls method instead of the private attribute in tests. (:issue:`2649`)
- Upgrade embedded wheels:
- * setuptools to ``68.2.2`` from ``68.2.0``
- * pip to ``23.3.1`` from ``23.2.1`` (:issue:`2656`)
-
+ - setuptools to ``68.2.2`` from ``68.2.0``
+ - pip to ``23.3.1`` from ``23.2.1`` (:issue:`2656`)
-v20.24.5 (2023-09-08)
----------------------
+***********************
+ v20.24.5 (2023-09-08)
+***********************
Bugfixes - 20.24.5
-~~~~~~~~~~~~~~~~~~
+==================
+
- Declare PyPy 3.10 support - by :user:`cclauss`. (:issue:`2638`)
- Brew on macOS no longer allows copy builds - disallow choosing this by :user:`gaborbernat`. (:issue:`2640`)
- Upgrade embedded wheels:
- * setuptools to ``68.2.0`` from ``68.1.2`` (:issue:`2642`)
-
+ - setuptools to ``68.2.0`` from ``68.1.2`` (:issue:`2642`)
-v20.24.4 (2023-08-30)
----------------------
+***********************
+ v20.24.4 (2023-08-30)
+***********************
Bugfixes - 20.24.4
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded wheels:
+==================
- * setuptools to ``68.1.2`` from ``68.1.0`` on ``3.8+``
- * wheel to ``0.41.2`` from ``0.41.1`` on ``3.7+`` (:issue:`2628`)
+- Upgrade embedded wheels:
+ - setuptools to ``68.1.2`` from ``68.1.0`` on ``3.8+``
+ - wheel to ``0.41.2`` from ``0.41.1`` on ``3.7+`` (:issue:`2628`)
-v20.24.3 (2023-08-11)
----------------------
+***********************
+ v20.24.3 (2023-08-11)
+***********************
Bugfixes - 20.24.3
-~~~~~~~~~~~~~~~~~~
+==================
+
- Fixed ResourceWarning on exit caused by periodic update subprocess (:issue:`2472`)
- Upgrade embedded wheels:
- * wheel to ``0.41.1`` from ``0.41.0`` (:issue:`2622`)
+ - wheel to ``0.41.1`` from ``0.41.0`` (:issue:`2622`)
Misc - 20.24.3
-~~~~~~~~~~~~~~
-- :issue:`2610`
+==============
+- :issue:`2610`
-v20.24.2 (2023-07-24)
----------------------
+***********************
+ v20.24.2 (2023-07-24)
+***********************
Bugfixes - 20.24.2
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded wheels:
+==================
- * pip to ``23.2.1`` from ``23.2``
- * wheel to ``0.41.0`` from ``0.40.0`` (:issue:`2614`)
+- Upgrade embedded wheels:
+ - pip to ``23.2.1`` from ``23.2``
+ - wheel to ``0.41.0`` from ``0.40.0`` (:issue:`2614`)
-v20.24.1 (2023-07-19)
----------------------
+***********************
+ v20.24.1 (2023-07-19)
+***********************
Bugfixes - 20.24.1
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded wheels:
+==================
- * pip to ``23.2`` from ``23.1.2`` - by :user:`arielkirkwood` (:issue:`2611`)
+- Upgrade embedded wheels:
+ - pip to ``23.2`` from ``23.1.2`` - by :user:`arielkirkwood` (:issue:`2611`)
-v20.24.0 (2023-07-14)
----------------------
+***********************
+ v20.24.0 (2023-07-14)
+***********************
Features - 20.24.0
-~~~~~~~~~~~~~~~~~~
-- Export the prompt prefix as ``VIRTUAL_ENV_PROMPT`` when activating a virtual
- environment - by :user:`jimporter`. (:issue:`2194`)
+==================
+
+- Export the prompt prefix as ``VIRTUAL_ENV_PROMPT`` when activating a virtual environment - by :user:`jimporter`.
+ (:issue:`2194`)
Bugfixes - 20.24.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Fix test suite - by :user:`gaborbernat`. (:issue:`2592`)
- Upgrade embedded wheels:
- * setuptools to ``68.0.0`` from ``67.8.0`` (:issue:`2607`)
+ - setuptools to ``68.0.0`` from ``67.8.0`` (:issue:`2607`)
-
-v20.23.1 (2023-06-16)
----------------------
+***********************
+ v20.23.1 (2023-06-16)
+***********************
Bugfixes - 20.23.1
-~~~~~~~~~~~~~~~~~~
-- update and simplify nushell activation script, fixes an issue on Windows resulting in consecutive command not found - by :user:`melMass`. (:issue:`2572`)
-- Upgrade embedded wheels:
+==================
- * setuptools to ``67.8.0`` from ``67.7.2`` (:issue:`2588`)
+- update and simplify nushell activation script, fixes an issue on Windows resulting in consecutive command not found -
+ by :user:`melMass`. (:issue:`2572`)
+- Upgrade embedded wheels:
+ - setuptools to ``67.8.0`` from ``67.7.2`` (:issue:`2588`)
-v20.23.0 (2023-04-27)
----------------------
+***********************
+ v20.23.0 (2023-04-27)
+***********************
Features - 20.23.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Do not install ``wheel`` and ``setuptools`` seed packages for Python 3.12+. To restore the old behavior use:
- for ``wheel`` use ``VIRTUALENV_WHEEL=bundle`` environment variable or ``--wheel=bundle`` CLI flag,
- for ``setuptools`` use ``VIRTUALENV_SETUPTOOLS=bundle`` environment variable or ``--setuptools=bundle`` CLI flag.
By :user:`chrysle`. (:issue:`2487`)
+
- 3.12 support - by :user:`gaborbernat`. (:issue:`2558`)
Bugfixes - 20.23.0
-~~~~~~~~~~~~~~~~~~
-- Prevent ``PermissionError`` when using venv creator on systems that deliver files without user write
- permission - by :user:`kulikjak`. (:issue:`2543`)
-- Upgrade setuptools to ``67.7.2`` from ``67.6.1`` and pip to ``23.1.2`` from ``23.1`` - by :user:`szleb`. (:issue:`2560`)
+==================
+- Prevent ``PermissionError`` when using venv creator on systems that deliver files without user write permission - by
+ :user:`kulikjak`. (:issue:`2543`)
+- Upgrade setuptools to ``67.7.2`` from ``67.6.1`` and pip to ``23.1.2`` from ``23.1`` - by :user:`szleb`.
+ (:issue:`2560`)
-v20.22.0 (2023-04-19)
----------------------
+***********************
+ v20.22.0 (2023-04-19)
+***********************
Features - 20.22.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Drop support for creating Python <=3.6 (including 2) interpreters. Removed pip of ``20.3.4``, ``21.3.1``; wheel of
``0.37.1``; setuptools of ``59.6.0``, ``44.1.1``, ``50.3.2``- by :user:`gaborbernat`. (:issue:`2548`)
-
-v20.21.1 (2023-04-19)
----------------------
+***********************
+ v20.21.1 (2023-04-19)
+***********************
Bugfixes - 20.21.1
-~~~~~~~~~~~~~~~~~~
+==================
+
- Add ``tox.ini`` to sdist - by :user:`mtelka`. (:issue:`2511`)
- Move the use of 'let' in nushell to ensure compatibility with future releases of nushell, where 'let' no longer
assumes that its initializer is a full expressions. (:issue:`2527`)
-- The nushell command 'str collect' has been superseded by the 'str join' command. The activate.nu script has
- been updated to reflect this change. (:issue:`2532`)
+- The nushell command 'str collect' has been superseded by the 'str join' command. The activate.nu script has been
+ updated to reflect this change. (:issue:`2532`)
- Upgrade embedded wheels:
- * wheel to ``0.40.0`` from ``0.38.4``
- * setuptools to ``67.6.1`` from ``67.4.0``
- * pip to ``23.1`` from ``23.0.1`` (:issue:`2546`)
-
+ - wheel to ``0.40.0`` from ``0.38.4``
+ - setuptools to ``67.6.1`` from ``67.4.0``
+ - pip to ``23.1`` from ``23.0.1`` (:issue:`2546`)
-v20.21.0 (2023-03-12)
----------------------
+***********************
+ v20.21.0 (2023-03-12)
+***********************
Features - 20.21.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Make closure syntax explicitly starts with {||. (:issue:`2512`)
Bugfixes - 20.21.0
-~~~~~~~~~~~~~~~~~~
-- Add ``print`` command to nushell print_prompt to ensure compatibility with future release of nushell,
- where intermediate commands no longer print their result to stdout. (:issue:`2514`)
-- Do not assume the default encoding. (:issue:`2515`)
-- Make ``ReentrantFileLock`` thread-safe and,
- thereby, fix race condition in ``virtualenv.cli_run`` - by :user:`radoering`. (:issue:`2516`)
+==================
+- Add ``print`` command to nushell print_prompt to ensure compatibility with future release of nushell, where
+ intermediate commands no longer print their result to stdout. (:issue:`2514`)
+- Do not assume the default encoding. (:issue:`2515`)
+- Make ``ReentrantFileLock`` thread-safe and, thereby, fix race condition in ``virtualenv.cli_run`` - by
+ :user:`radoering`. (:issue:`2516`)
-v20.20.0 (2023-02-28)
----------------------
+***********************
+ v20.20.0 (2023-02-28)
+***********************
Features - 20.20.0
-~~~~~~~~~~~~~~~~~~
-- Change environment variable existence check in Nushell activation script to not use deprecated command. (:issue:`2506`)
+==================
+
+- Change environment variable existence check in Nushell activation script to not use deprecated command.
+ (:issue:`2506`)
Bugfixes - 20.20.0
-~~~~~~~~~~~~~~~~~~
-- Discover CPython implementations distributed on Windows by any organization - by :user:`faph`. (:issue:`2504`)
-- Upgrade embedded setuptools to ``67.4.0`` from ``67.1.0`` and pip to ``23.0.1`` from ``23.0`` - by :user:`gaborbernat`. (:issue:`2510`)
+==================
+- Discover CPython implementations distributed on Windows by any organization - by :user:`faph`. (:issue:`2504`)
+- Upgrade embedded setuptools to ``67.4.0`` from ``67.1.0`` and pip to ``23.0.1`` from ``23.0`` - by
+ :user:`gaborbernat`. (:issue:`2510`)
-v20.19.0 (2023-02-07)
----------------------
+***********************
+ v20.19.0 (2023-02-07)
+***********************
Features - 20.19.0
-~~~~~~~~~~~~~~~~~~
-- Allow platformdirs version ``3`` - by :user:`cdce8p`. (:issue:`2499`)
+==================
+- Allow platformdirs version ``3`` - by :user:`cdce8p`. (:issue:`2499`)
-v20.18.0 (2023-02-06)
----------------------
+***********************
+ v20.18.0 (2023-02-06)
+***********************
Features - 20.18.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Drop ``3.6`` runtime support (can still create ``2.7+``) - by :user:`gaborbernat`. (:issue:`2489`)
Bugfixes - 20.18.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- Fix broken prompt in Nushell when activating virtual environment - by :user:`kubouc`. (:issue:`2481`)
- Bump embedded pip to ``23.0`` and setuptools to ``67.1`` - by :user:`gaborbernat`. (:issue:`2489`)
-
-v20.17.1 (2022-12-05)
----------------------
+***********************
+ v20.17.1 (2022-12-05)
+***********************
Bugfixes - 20.17.1
-~~~~~~~~~~~~~~~~~~
-- A ``py`` or ``python`` spec means any Python rather than ``CPython`` - by :user:`gaborbernat`. (`#2460 `_)
-- Make ``activate.nu`` respect ``VIRTUAL_ENV_DISABLE_PROMPT`` and not set the prompt if requested - by :user:`m-lima`. (`#2461 `_)
+==================
+- A ``py`` or ``python`` spec means any Python rather than ``CPython`` - by :user:`gaborbernat`. (`#2460
+ `_)
+- Make ``activate.nu`` respect ``VIRTUAL_ENV_DISABLE_PROMPT`` and not set the prompt if requested - by :user:`m-lima`.
+ (`#2461 `_)
-v20.17.0 (2022-11-27)
----------------------
+***********************
+ v20.17.0 (2022-11-27)
+***********************
Features - 20.17.0
-~~~~~~~~~~~~~~~~~~
-- Change Nushell activation script to be a module meant to be activated as an overlay. (`#2422 `_)
-- Update operator used in Nushell activation script to be compatible with future versions. (`#2450 `_)
+==================
+
+- Change Nushell activation script to be a module meant to be activated as an overlay. (`#2422
+ `_)
+- Update operator used in Nushell activation script to be compatible with future versions. (`#2450
+ `_)
Bugfixes - 20.17.0
-~~~~~~~~~~~~~~~~~~
-- Do not use deprecated API from ``importlib.resources`` on Python 3.10 or later - by :user:`gaborbernat`. (`#2448 `_)
-- Upgrade embedded setuptools to ``65.6.3`` from ``65.5.1`` - by :user:`gaborbernat`. (`#2451 `_)
+==================
+- Do not use deprecated API from ``importlib.resources`` on Python 3.10 or later - by :user:`gaborbernat`. (`#2448
+ `_)
+- Upgrade embedded setuptools to ``65.6.3`` from ``65.5.1`` - by :user:`gaborbernat`. (`#2451
+ `_)
-v20.16.7 (2022-11-12)
----------------------
+***********************
+ v20.16.7 (2022-11-12)
+***********************
Bugfixes - 20.16.7
-~~~~~~~~~~~~~~~~~~
-- Use parent directory of python executable for pyvenv.cfg "home" value per PEP 405 - by :user:`vfazio`. (`#2440 `_)
-- In POSIX virtual environments, try alternate binary names if ``sys._base_executable`` does not exist - by :user:`vfazio`. (`#2442 `_)
-- Upgrade embedded wheel to ``0.38.4`` and pip to ``22.3.1`` from ``22.3`` and setuptools to ``65.5.1`` from
- ``65.5.0`` - by :user:`gaborbernat`. (`#2443 `_)
+==================
+- Use parent directory of python executable for pyvenv.cfg "home" value per PEP 405 - by :user:`vfazio`. (`#2440
+ `_)
+- In POSIX virtual environments, try alternate binary names if ``sys._base_executable`` does not exist - by
+ :user:`vfazio`. (`#2442 `_)
+- Upgrade embedded wheel to ``0.38.4`` and pip to ``22.3.1`` from ``22.3`` and setuptools to ``65.5.1`` from ``65.5.0``
+ - by :user:`gaborbernat`. (`#2443 `_)
-v20.16.6 (2022-10-25)
----------------------
+***********************
+ v20.16.6 (2022-10-25)
+***********************
Features - 20.16.6
-~~~~~~~~~~~~~~~~~~
+==================
+
- Drop unneeded shims for PyPy3 directory structure (`#2426 `_)
Bugfixes - 20.16.6
-~~~~~~~~~~~~~~~~~~
-- Fix selected scheme on debian derivatives for python 3.10 when ``python3-distutils`` is not installed or the ``venv`` scheme is not available - by :user:`asottile`. (`#2350 `_)
-- Allow the test suite to pass even with the original C shell (rather than ``tcsh``) - by :user:`kulikjak`. (`#2418 `_)
-- Fix fallback handling of downloading wheels for bundled packages - by :user:`schaap`. (`#2429 `_)
-- Upgrade embedded setuptools to ``65.5.0`` from ``65.3.0`` and pip to ``22.3`` from ``22.2.2`` - by :user:`gaborbernat`. (`#2434 `_)
+==================
+- Fix selected scheme on debian derivatives for python 3.10 when ``python3-distutils`` is not installed or the ``venv``
+ scheme is not available - by :user:`asottile`. (`#2350 `_)
+- Allow the test suite to pass even with the original C shell (rather than ``tcsh``) - by :user:`kulikjak`. (`#2418
+ `_)
+- Fix fallback handling of downloading wheels for bundled packages - by :user:`schaap`. (`#2429
+ `_)
+- Upgrade embedded setuptools to ``65.5.0`` from ``65.3.0`` and pip to ``22.3`` from ``22.2.2`` - by
+ :user:`gaborbernat`. (`#2434 `_)
-v20.16.5 (2022-09-07)
----------------------
+***********************
+ v20.16.5 (2022-09-07)
+***********************
Bugfixes - 20.16.5
-~~~~~~~~~~~~~~~~~~
-- Do not turn echo off for subsequent commands in batch activators
- (``activate.bat`` and ``deactivate.bat``) - by :user:`pawelszramowski`. (`#2411 `_)
+==================
+- Do not turn echo off for subsequent commands in batch activators (``activate.bat`` and ``deactivate.bat``) - by
+ :user:`pawelszramowski`. (`#2411 `_)
-v20.16.4 (2022-08-29)
----------------------
+***********************
+ v20.16.4 (2022-08-29)
+***********************
Bugfixes - 20.16.4
-~~~~~~~~~~~~~~~~~~
-- Bump embed setuptools to ``65.3`` - by :user:`gaborbernat`. (`#2405 `_)
+==================
+- Bump embed setuptools to ``65.3`` - by :user:`gaborbernat`. (`#2405
+ `_)
-v20.16.3 (2022-08-04)
----------------------
+***********************
+ v20.16.3 (2022-08-04)
+***********************
Bugfixes - 20.16.3
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded pip to ``22.2.2`` from ``22.2.1`` and setuptools to ``63.4.1`` from ``63.2.0`` - by :user:`gaborbernat`. (`#2395 `_)
+==================
+- Upgrade embedded pip to ``22.2.2`` from ``22.2.1`` and setuptools to ``63.4.1`` from ``63.2.0`` - by
+ :user:`gaborbernat`. (`#2395 `_)
-v20.16.2 (2022-07-27)
----------------------
+***********************
+ v20.16.2 (2022-07-27)
+***********************
Bugfixes - 20.16.2
-~~~~~~~~~~~~~~~~~~
-- Bump embedded pip from ``22.2`` to ``22.2.1`` - by :user:`gaborbernat`. (`#2391 `_)
+==================
+- Bump embedded pip from ``22.2`` to ``22.2.1`` - by :user:`gaborbernat`. (`#2391
+ `_)
-v20.16.1 (2022-07-26)
----------------------
+***********************
+ v20.16.1 (2022-07-26)
+***********************
Features - 20.16.1
-~~~~~~~~~~~~~~~~~~
-- Update Nushell activation scripts to version 0.67 - by :user:`kubouch`. (`#2386 `_)
+==================
+- Update Nushell activation scripts to version 0.67 - by :user:`kubouch`. (`#2386
+ `_)
-v20.16.0 (2022-07-25)
----------------------
+***********************
+ v20.16.0 (2022-07-25)
+***********************
Features - 20.16.0
-~~~~~~~~~~~~~~~~~~
-- Drop support for running under Python 2 (still can generate Python 2 environments) - by :user:`gaborbernat`. (`#2382 `_)
-- Upgrade embedded pip to ``22.2`` from ``22.1.2`` and setuptools to ``63.2.0`` from ``62.6.0`` -
- by :user:`gaborbernat`. (`#2383 `_)
+==================
+- Drop support for running under Python 2 (still can generate Python 2 environments) - by :user:`gaborbernat`. (`#2382
+ `_)
+- Upgrade embedded pip to ``22.2`` from ``22.1.2`` and setuptools to ``63.2.0`` from ``62.6.0`` - by
+ :user:`gaborbernat`. (`#2383 `_)
-v20.15.1 (2022-06-28)
----------------------
+***********************
+ v20.15.1 (2022-06-28)
+***********************
Bugfixes - 20.15.1
-~~~~~~~~~~~~~~~~~~
-- Fix the incorrect operation when ``setuptools`` plugins output something into ``stdout``. (`#2335 `_)
-- CPython3Windows creator ignores missing ``DLLs`` dir. (`#2368 `_)
+==================
+- Fix the incorrect operation when ``setuptools`` plugins output something into ``stdout``. (`#2335
+ `_)
+- CPython3Windows creator ignores missing ``DLLs`` dir. (`#2368 `_)
-v20.15.0 (2022-06-25)
----------------------
+***********************
+ v20.15.0 (2022-06-25)
+***********************
Features - 20.15.0
-~~~~~~~~~~~~~~~~~~
-- Support for Windows embeddable Python package: includes ``python.zip`` in the creator sources
- - by :user:`reksarka`. (`#1774 `_)
+==================
+
+- Support for Windows embeddable Python package: includes ``python.zip`` in the creator sources - by
+ :user:`reksarka`. (`#1774 `_)
Bugfixes - 20.15.0
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded setuptools to ``62.3.3`` from ``62.6.0`` and pip to ``22.1.2`` from ``22.0.4``
- - by :user:`gaborbernat`. (`#2348 `_)
-- Use ``shlex.quote`` instead of deprecated ``pipes.quote`` in Python 3 - by :user:`frenzymadness`. (`#2351 `_)
-- Fix Windows PyPy 3.6 - by :user:`reksarka`. (`#2363 `_)
+==================
+- Upgrade embedded setuptools to ``62.3.3`` from ``62.6.0`` and pip to ``22.1.2`` from ``22.0.4`` - by
+ :user:`gaborbernat`. (`#2348 `_)
+- Use ``shlex.quote`` instead of deprecated ``pipes.quote`` in Python 3 - by :user:`frenzymadness`. (`#2351
+ `_)
+- Fix Windows PyPy 3.6 - by :user:`reksarka`. (`#2363 `_)
-v20.14.1 (2022-04-11)
----------------------
+***********************
+ v20.14.1 (2022-04-11)
+***********************
Features - 20.14.1
-~~~~~~~~~~~~~~~~~~
-- Support for creating a virtual environment from a Python 2.7 framework on macOS 12 - by :user:`nickhutchinson`. (`#2284 `_)
+==================
+
+- Support for creating a virtual environment from a Python 2.7 framework on macOS 12 - by :user:`nickhutchinson`.
+ (`#2284 `_)
Bugfixes - 20.14.1
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded setuptools to ``62.1.0`` from ``61.0.0`` - by :user:`gaborbernat`. (`#2327 `_)
+==================
+- Upgrade embedded setuptools to ``62.1.0`` from ``61.0.0`` - by :user:`gaborbernat`. (`#2327
+ `_)
-v20.14.0 (2022-03-25)
----------------------
+***********************
+ v20.14.0 (2022-03-25)
+***********************
Features - 20.14.0
-~~~~~~~~~~~~~~~~~~
-- Support Nushell activation scripts with nu version ``0.60`` - by :user:`kubouch`. (`#2321 `_)
+==================
+
+- Support Nushell activation scripts with nu version ``0.60`` - by :user:`kubouch`. (`#2321
+ `_)
Bugfixes - 20.14.0
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded setuptools to ``61.0.0`` from ``60.10.0`` - by :user:`gaborbernat`. (`#2322 `_)
+==================
+
+- Upgrade embedded setuptools to ``61.0.0`` from ``60.10.0`` - by :user:`gaborbernat`. (`#2322
+ `_)
-v20.13.4 (2022-03-18)
----------------------
+***********************
+ v20.13.4 (2022-03-18)
+***********************
Bugfixes - 20.13.4
-~~~~~~~~~~~~~~~~~~
-- Improve performance of python startup inside created virtualenvs - by :user:`asottile`. (`#2317 `_)
-- Upgrade embedded setuptools to ``60.10.0`` from ``60.9.3`` - by :user:`gaborbernat`. (`#2320 `_)
+==================
+
+- Improve performance of python startup inside created virtualenvs - by :user:`asottile`. (`#2317
+ `_)
+- Upgrade embedded setuptools to ``60.10.0`` from ``60.9.3`` - by :user:`gaborbernat`. (`#2320
+ `_)
-v20.13.3 (2022-03-07)
----------------------
+***********************
+ v20.13.3 (2022-03-07)
+***********************
Bugfixes - 20.13.3
-~~~~~~~~~~~~~~~~~~
-- Avoid symlinking the contents of ``/usr`` into PyPy3.8+ virtualenvs - by :user:`stefanor`. (`#2310 `_)
-- Bump embed pip from ``22.0.3`` to ``22.0.4`` - by :user:`gaborbernat`. (`#2311 `_)
+==================
+- Avoid symlinking the contents of ``/usr`` into PyPy3.8+ virtualenvs - by :user:`stefanor`. (`#2310
+ `_)
+- Bump embed pip from ``22.0.3`` to ``22.0.4`` - by :user:`gaborbernat`. (`#2311
+ `_)
-v20.13.2 (2022-02-24)
----------------------
+***********************
+ v20.13.2 (2022-02-24)
+***********************
Bugfixes - 20.13.2
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded setuptools to ``60.9.3`` from ``60.6.0`` - by :user:`gaborbernat`. (`#2306 `_)
+==================
+- Upgrade embedded setuptools to ``60.9.3`` from ``60.6.0`` - by :user:`gaborbernat`. (`#2306
+ `_)
-v20.13.1 (2022-02-05)
----------------------
+***********************
+ v20.13.1 (2022-02-05)
+***********************
Bugfixes - 20.13.1
-~~~~~~~~~~~~~~~~~~
-- fix "execv() arg 2 must contain only strings" error on M1 MacOS (`#2282 `_)
-- Upgrade embedded setuptools to ``60.5.0`` from ``60.2.0`` - by :user:`asottile`. (`#2289 `_)
-- Upgrade embedded pip to ``22.0.3`` and setuptools to ``60.6.0`` - by :user:`gaborbernat` and :user:`asottile`. (`#2294 `_)
+==================
+- fix "execv() arg 2 must contain only strings" error on M1 MacOS (`#2282
+ `_)
+- Upgrade embedded setuptools to ``60.5.0`` from ``60.2.0`` - by :user:`asottile`. (`#2289
+ `_)
+- Upgrade embedded pip to ``22.0.3`` and setuptools to ``60.6.0`` - by :user:`gaborbernat` and :user:`asottile`. (`#2294
+ `_)
-v20.13.0 (2022-01-02)
----------------------
+***********************
+ v20.13.0 (2022-01-02)
+***********************
Features - 20.13.0
-~~~~~~~~~~~~~~~~~~
-- Add downloaded wheel information in the relevant JSON embed file to
- prevent additional downloads of the same wheel. - by :user:`mayeut`. (`#2268 `_)
+==================
+
+- Add downloaded wheel information in the relevant JSON embed file to prevent additional downloads of the same wheel. -
+ by :user:`mayeut`. (`#2268 `_)
Bugfixes - 20.13.0
-~~~~~~~~~~~~~~~~~~
-- Fix ``AttributeError: 'bool' object has no attribute 'error'`` when creating a
- Python 2.x virtualenv on macOS - by ``moreati``. (`#2269 `_)
-- Fix ``PermissionError: [Errno 1] Operation not permitted`` when creating a
- Python 2.x virtualenv on macOS/arm64 - by ``moreati``. (`#2271 `_)
+==================
+- Fix ``AttributeError: 'bool' object has no attribute 'error'`` when creating a Python 2.x virtualenv on macOS - by
+ ``moreati``. (`#2269 `_)
+- Fix ``PermissionError: [Errno 1] Operation not permitted`` when creating a Python 2.x virtualenv on macOS/arm64 - by
+ ``moreati``. (`#2271 `_)
-v20.12.1 (2022-01-01)
----------------------
+***********************
+ v20.12.1 (2022-01-01)
+***********************
Bugfixes - 20.12.1
-~~~~~~~~~~~~~~~~~~
-- Try using previous updates of ``pip``, ``setuptools`` & ``wheel``
- when inside an update grace period rather than always falling back
- to embedded wheels - by :user:`mayeut`. (`#2265 `_)
-- New patch versions of ``pip``, ``setuptools`` & ``wheel`` are now
- returned in the expected timeframe. - by :user:`mayeut`. (`#2266 `_)
-- Manual upgrades of ``pip``, ``setuptools`` & ``wheel`` are
- not discarded by a periodic update - by :user:`mayeut`. (`#2267 `_)
+==================
+- Try using previous updates of ``pip``, ``setuptools`` & ``wheel`` when inside an update grace period rather than
+ always falling back to embedded wheels - by :user:`mayeut`. (`#2265
+ `_)
+- New patch versions of ``pip``, ``setuptools`` & ``wheel`` are now returned in the expected timeframe. - by
+ :user:`mayeut`. (`#2266 `_)
+- Manual upgrades of ``pip``, ``setuptools`` & ``wheel`` are not discarded by a periodic update - by :user:`mayeut`.
+ (`#2267 `_)
-v20.12.0 (2021-12-31)
----------------------
+***********************
+ v20.12.0 (2021-12-31)
+***********************
Features - 20.12.0
-~~~~~~~~~~~~~~~~~~
-- Sign the python2 exe on Darwin arm64 - by :user:`tmspicer`. (`#2233 `_)
+==================
+
+- Sign the python2 exe on Darwin arm64 - by :user:`tmspicer`. (`#2233
+ `_)
Bugfixes - 20.12.0
-~~~~~~~~~~~~~~~~~~
-- Fix ``--download`` option - by :user:`mayeut`. (`#2120 `_)
-- Upgrade embedded setuptools to ``60.2.0`` from ``60.1.1`` - by :user:`gaborbernat`. (`#2263 `_)
+==================
+- Fix ``--download`` option - by :user:`mayeut`. (`#2120 `_)
+- Upgrade embedded setuptools to ``60.2.0`` from ``60.1.1`` - by :user:`gaborbernat`. (`#2263
+ `_)
-v20.11.2 (2021-12-29)
----------------------
+***********************
+ v20.11.2 (2021-12-29)
+***********************
Bugfixes - 20.11.2
-~~~~~~~~~~~~~~~~~~
-- Fix installation of pinned versions of ``pip``, ``setuptools`` & ``wheel`` - by :user:`mayeut`. (`#2203 `_)
+==================
+- Fix installation of pinned versions of ``pip``, ``setuptools`` & ``wheel`` - by :user:`mayeut`. (`#2203
+ `_)
-v20.11.1 (2021-12-29)
----------------------
+***********************
+ v20.11.1 (2021-12-29)
+***********************
Bugfixes - 20.11.1
-~~~~~~~~~~~~~~~~~~
-- Bump embed setuptools to ``60.1.1`` from ``60.1.0`` - by :user:`gaborbernat`. (`#2258 `_)
+==================
+- Bump embed setuptools to ``60.1.1`` from ``60.1.0`` - by :user:`gaborbernat`. (`#2258
+ `_)
-v20.11.0 (2021-12-28)
----------------------
+***********************
+ v20.11.0 (2021-12-28)
+***********************
Features - 20.11.0
-~~~~~~~~~~~~~~~~~~
-- Avoid deprecation warning from py-filelock argument - by :user:`ofek`. (`#2237 `_)
-- Upgrade embedded setuptools to ``61.1.0`` from ``58.3.0`` - by :user:`gaborbernat`. (`#2240 `_)
-- Drop the runtime dependency of ``backports.entry-points-selectable`` - by :user:`hroncok`. (`#2246 `_)
-- Fish: PATH variables should not be quoted when being set - by :user:`d3dave`. (`#2248 `_)
+==================
+- Avoid deprecation warning from py-filelock argument - by :user:`ofek`. (`#2237
+ `_)
+- Upgrade embedded setuptools to ``61.1.0`` from ``58.3.0`` - by :user:`gaborbernat`. (`#2240
+ `_)
+- Drop the runtime dependency of ``backports.entry-points-selectable`` - by :user:`hroncok`. (`#2246
+ `_)
+- Fish: PATH variables should not be quoted when being set - by :user:`d3dave`. (`#2248
+ `_)
-v20.10.0 (2021-11-01)
----------------------
+***********************
+ v20.10.0 (2021-11-01)
+***********************
Features - 20.10.0
-~~~~~~~~~~~~~~~~~~
+==================
+
- If a ``"venv"`` install scheme exists in ``sysconfig``, virtualenv now uses it to create new virtual environments.
- This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting
- the paths in new virtual environments.
- A similar technique `was proposed to Python, for the venv module `_ - by ``hroncok`` (`#2208 `_)
-- The activated virtualenv prompt is now always wrapped in parentheses. This
- affects venvs created with the ``--prompt`` attribute, and matches virtualenv's
- behavior on par with venv. (`#2224 `_)
+ This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting the
+ paths in new virtual environments. A similar technique `was proposed to Python, for the venv module
+ `_ - by ``hroncok`` (`#2208 `_)
+- The activated virtualenv prompt is now always wrapped in parentheses. This affects venvs created with the ``--prompt``
+ attribute, and matches virtualenv's behavior on par with venv. (`#2224
+ `_)
Bugfixes - 20.10.0
-~~~~~~~~~~~~~~~~~~
-- Fix broken prompt set up by activate.bat - by :user:`SiggyBar`. (`#2225 `_)
+==================
+- Fix broken prompt set up by activate.bat - by :user:`SiggyBar`. (`#2225
+ `_)
-v20.9.0 (2021-10-23)
---------------------
+**********************
+ v20.9.0 (2021-10-23)
+**********************
Features - 20.9.0
-~~~~~~~~~~~~~~~~~
-- Special-case ``--prompt .`` to the name of the current directory - by :user:`rkm`. (`#2220 `_)
+=================
+
+- Special-case ``--prompt .`` to the name of the current directory - by :user:`rkm`. (`#2220
+ `_)
- Add libffi-8.dll to pypy windows `#2218 `_ - by :user:`mattip`
Bugfixes - 20.9.0
-~~~~~~~~~~~~~~~~~
-- Fixed path collision that could lead to a PermissionError or writing to system
- directories when using PyPy3.8 - by :user:`mgorny`. (`#2182 `_)
+=================
+
+- Fixed path collision that could lead to a PermissionError or writing to system directories when using PyPy3.8 - by
+ :user:`mgorny`. (`#2182 `_)
- Upgrade embedded setuptools to ``58.3.0`` from ``58.1.0`` and pip to ``21.3.1`` from ``21.2.4`` - by
:user:`gaborbernat`. (`#2205 `_)
-- Remove stray closing parenthesis in activate.bat - by :user:`SiggyBar`. (`#2221 `_)
+- Remove stray closing parenthesis in activate.bat - by :user:`SiggyBar`. (`#2221
+ `_)
-
-v20.8.1 (2021-09-24)
---------------------
+**********************
+ v20.8.1 (2021-09-24)
+**********************
Bugfixes - 20.8.1
-~~~~~~~~~~~~~~~~~
-- Fixed a bug where while creating a venv on top of an existing one, without cleaning, when seeded
- wheel version mismatch occurred, multiple ``.dist-info`` directories may be present, confounding entrypoint
- discovery - by :user:`arcivanov` (`#2185 `_)
-- Bump embed setuptools from ``58.0.4`` to ``58.1.0`` - by :user:`gaborbernat`. (`#2195 `_)
+=================
+
+- Fixed a bug where while creating a venv on top of an existing one, without cleaning, when seeded wheel version
+ mismatch occurred, multiple ``.dist-info`` directories may be present, confounding entrypoint discovery - by
+ :user:`arcivanov` (`#2185 `_)
+- Bump embed setuptools from ``58.0.4`` to ``58.1.0`` - by :user:`gaborbernat`. (`#2195
+ `_)
Misc - 20.8.1
-~~~~~~~~~~~~~
-- `#2189 `_
+=============
+- `#2189 `_
-v20.8.0 (2021-09-16)
---------------------
+**********************
+ v20.8.0 (2021-09-16)
+**********************
-* upgrade embedded setuptools to ``58.0.4`` from ``57.4.0`` and pip to ``21.2.4`` from ``21.2.3``
-* Add nushell activation script
+- upgrade embedded setuptools to ``58.0.4`` from ``57.4.0`` and pip to ``21.2.4`` from ``21.2.3``
+- Add nushell activation script
-v20.7.2 (2021-08-10)
---------------------
+**********************
+ v20.7.2 (2021-08-10)
+**********************
Bugfixes - 20.7.2
-~~~~~~~~~~~~~~~~~
-- Upgrade embedded pip to ``21.2.3`` from ``21.2.2`` and wheel to ``0.37.0`` from ``0.36.2`` - by :user:`gaborbernat`. (`#2168 `_)
+=================
+- Upgrade embedded pip to ``21.2.3`` from ``21.2.2`` and wheel to ``0.37.0`` from ``0.36.2`` - by :user:`gaborbernat`.
+ (`#2168 `_)
-v20.7.1 (2021-08-09)
---------------------
+**********************
+ v20.7.1 (2021-08-09)
+**********************
Bugfixes - 20.7.1
-~~~~~~~~~~~~~~~~~
-- Fix unpacking dictionary items in PythonInfo.install_path (`#2165 `_)
+=================
+- Fix unpacking dictionary items in PythonInfo.install_path (`#2165 `_)
-v20.7.0 (2021-07-31)
---------------------
+**********************
+ v20.7.0 (2021-07-31)
+**********************
Bugfixes - 20.7.0
-~~~~~~~~~~~~~~~~~
-- upgrade embedded pip to ``21.2.2`` from ``21.1.3`` and setuptools to ``57.4.0`` from ``57.1.0`` - by :user:`gaborbernat` (`#2159 `_)
+=================
+
+- upgrade embedded pip to ``21.2.2`` from ``21.1.3`` and setuptools to ``57.4.0`` from ``57.1.0`` - by
+ :user:`gaborbernat` (`#2159 `_)
Deprecations and Removals - 20.7.0
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Removed ``xonsh`` activator due to this breaking fairly often the CI and lack of support from those packages
- maintainers, upstream is encouraged to continue supporting the project as a
- `plugin `_ - by :user:`gaborbernat`. (`#2160 `_)
+==================================
+- Removed ``xonsh`` activator due to this breaking fairly often the CI and lack of support from those packages
+ maintainers, upstream is encouraged to continue supporting the project as a `plugin
+ `_ - by :user:`gaborbernat`. (`#2160
+ `_)
-v20.6.0 (2021-07-14)
---------------------
+**********************
+ v20.6.0 (2021-07-14)
+**********************
Features - 20.6.0
-~~~~~~~~~~~~~~~~~
-- Support Python interpreters without ``distutils`` (fallback to ``syconfig`` in these cases) - by :user:`gaborbernat`. (`#1910 `_)
+=================
+- Support Python interpreters without ``distutils`` (fallback to ``syconfig`` in these cases) - by :user:`gaborbernat`.
+ (`#1910 `_)
-v20.5.0 (2021-07-13)
---------------------
+**********************
+ v20.5.0 (2021-07-13)
+**********************
Features - 20.5.0
-~~~~~~~~~~~~~~~~~
-- Plugins now use 'selectable' entry points - by :user:`jaraco`. (`#2093 `_)
+=================
+
+- Plugins now use 'selectable' entry points - by :user:`jaraco`. (`#2093
+ `_)
- add libffi-7.dll to the hard-coded list of dlls for PyPy (`#2141 `_)
-- Use the better maintained ``platformdirs`` instead of ``appdirs`` - by :user:`gaborbernat`. (`#2142 `_)
+- Use the better maintained ``platformdirs`` instead of ``appdirs`` - by :user:`gaborbernat`. (`#2142
+ `_)
Bugfixes - 20.5.0
-~~~~~~~~~~~~~~~~~
-- Bump pip the embedded pip ``21.1.3`` and setuptools to ``57.1.0`` - by :user:`gaborbernat`. (`#2135 `_)
+=================
+
+- Bump pip the embedded pip ``21.1.3`` and setuptools to ``57.1.0`` - by :user:`gaborbernat`. (`#2135
+ `_)
Deprecations and Removals - 20.5.0
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Drop python ``3.4`` support as it has been over 2 years since EOL - by :user:`gaborbernat`. (`#2141 `_)
+==================================
+- Drop python ``3.4`` support as it has been over 2 years since EOL - by :user:`gaborbernat`. (`#2141
+ `_)
-v20.4.7 (2021-05-24)
---------------------
+**********************
+ v20.4.7 (2021-05-24)
+**********************
Bugfixes - 20.4.7
-~~~~~~~~~~~~~~~~~
-- Upgrade embedded pip to ``21.1.2`` and setuptools to ``57.0.0`` - by :user:`gaborbernat`. (`#2123 `_)
+=================
+- Upgrade embedded pip to ``21.1.2`` and setuptools to ``57.0.0`` - by :user:`gaborbernat`. (`#2123
+ `_)
-v20.4.6 (2021-05-05)
---------------------
+**********************
+ v20.4.6 (2021-05-05)
+**********************
Bugfixes - 20.4.6
-~~~~~~~~~~~~~~~~~
-- Fix ``site.getsitepackages()`` broken on python2 on debian - by :user:`freundTech`. (`#2105 `_)
+=================
+- Fix ``site.getsitepackages()`` broken on python2 on debian - by :user:`freundTech`. (`#2105
+ `_)
-v20.4.5 (2021-05-05)
---------------------
+**********************
+ v20.4.5 (2021-05-05)
+**********************
Bugfixes - 20.4.5
-~~~~~~~~~~~~~~~~~
-- Bump pip to ``21.1.1`` from ``21.0.1`` - by :user:`gaborbernat`. (`#2104 `_)
-- Fix ``site.getsitepackages()`` ignoring ``--system-site-packages`` on python2 - by :user:`freundTech`. (`#2106 `_)
+=================
+- Bump pip to ``21.1.1`` from ``21.0.1`` - by :user:`gaborbernat`. (`#2104
+ `_)
+- Fix ``site.getsitepackages()`` ignoring ``--system-site-packages`` on python2 - by :user:`freundTech`. (`#2106
+ `_)
-v20.4.4 (2021-04-20)
---------------------
+**********************
+ v20.4.4 (2021-04-20)
+**********************
Bugfixes - 20.4.4
-~~~~~~~~~~~~~~~~~
-- Built in discovery class is always preferred over plugin supplied classes. (`#2087 `_)
-- Upgrade embedded setuptools to ``56.0.0`` by :user:`gaborbernat`. (`#2094 `_)
+=================
+- Built in discovery class is always preferred over plugin supplied classes. (`#2087
+ `_)
+- Upgrade embedded setuptools to ``56.0.0`` by :user:`gaborbernat`. (`#2094
+ `_)
-v20.4.3 (2021-03-16)
---------------------
+**********************
+ v20.4.3 (2021-03-16)
+**********************
Bugfixes - 20.4.3
-~~~~~~~~~~~~~~~~~
-- Bump embedded setuptools from ``52.0.0`` to ``54.1.2`` - by :user:`gaborbernat` (`#2069 `_)
-- Fix PyPy3 stdlib on Windows is incorrect - by :user:`gaborbernat`. (`#2071 `_)
+=================
+- Bump embedded setuptools from ``52.0.0`` to ``54.1.2`` - by :user:`gaborbernat` (`#2069
+ `_)
+- Fix PyPy3 stdlib on Windows is incorrect - by :user:`gaborbernat`. (`#2071
+ `_)
-v20.4.2 (2021-02-01)
---------------------
+**********************
+ v20.4.2 (2021-02-01)
+**********************
Bugfixes - 20.4.2
-~~~~~~~~~~~~~~~~~
-- Running virtualenv ``--upgrade-embed-wheels`` crashes - by :user:`gaborbernat`. (`#2058 `_)
+=================
+- Running virtualenv ``--upgrade-embed-wheels`` crashes - by :user:`gaborbernat`. (`#2058
+ `_)
-v20.4.1 (2021-01-31)
---------------------
+**********************
+ v20.4.1 (2021-01-31)
+**********************
Bugfixes - 20.4.1
-~~~~~~~~~~~~~~~~~
-- Bump embedded pip and setuptools packages to latest upstream supported (``21.0.1`` and ``52.0.0``) - by :user:`gaborbernat`. (`#2060 `_)
+=================
+- Bump embedded pip and setuptools packages to latest upstream supported (``21.0.1`` and ``52.0.0``) - by
+ :user:`gaborbernat`. (`#2060 `_)
-v20.4.0 (2021-01-19)
---------------------
+**********************
+ v20.4.0 (2021-01-19)
+**********************
Features - 20.4.0
-~~~~~~~~~~~~~~~~~
+=================
+
- On the programmatic API allow passing in the environment variable dictionary to use, defaults to ``os.environ`` if not
specified - by :user:`gaborbernat`. (`#2054 `_)
Bugfixes - 20.4.0
-~~~~~~~~~~~~~~~~~
-- Upgrade embedded setuptools to ``51.3.3`` from ``51.1.2`` - by :user:`gaborbernat`. (`#2055 `_)
+=================
+- Upgrade embedded setuptools to ``51.3.3`` from ``51.1.2`` - by :user:`gaborbernat`. (`#2055
+ `_)
-v20.3.1 (2021-01-13)
---------------------
+**********************
+ v20.3.1 (2021-01-13)
+**********************
Bugfixes - 20.3.1
-~~~~~~~~~~~~~~~~~
-- Bump embed pip to ``20.3.3``, setuptools to ``51.1.1`` and wheel to ``0.36.2`` - by :user:`gaborbernat`. (`#2036 `_)
-- Allow unfunctioning of pydoc to fail freely so that virtualenvs can be
- activated under Zsh with set -e (since otherwise ``unset -f`` and
- ``unfunction`` exit with 1 if the function does not exist in Zsh) - by
- :user:`d125q`. (`#2049 `_)
-- Drop cached python information if the system executable is no longer present (for example when the executable is a
- shim and the mapped executable is replaced - such is the case with pyenv) - by :user:`gaborbernat`. (`#2050 `_)
+=================
+- Bump embed pip to ``20.3.3``, setuptools to ``51.1.1`` and wheel to ``0.36.2`` - by :user:`gaborbernat`. (`#2036
+ `_)
+- Allow unfunctioning of pydoc to fail freely so that virtualenvs can be activated under Zsh with set -e (since
+ otherwise ``unset -f`` and ``unfunction`` exit with 1 if the function does not exist in Zsh) - by :user:`d125q`.
+ (`#2049 `_)
+- Drop cached python information if the system executable is no longer present (for example when the executable is a
+ shim and the mapped executable is replaced - such is the case with pyenv) - by :user:`gaborbernat`. (`#2050
+ `_)
-v20.3.0 (2021-01-10)
---------------------
+**********************
+ v20.3.0 (2021-01-10)
+**********************
Features - 20.3.0
-~~~~~~~~~~~~~~~~~
+=================
+
- The builtin discovery takes now a ``--try-first-with`` argument and is first attempted as valid interpreters. One can
- use this to force discovery of a given python executable when the discovery order/mechanism raises errors -
- by :user:`gaborbernat`. (`#2046 `_)
+ use this to force discovery of a given python executable when the discovery order/mechanism raises errors - by
+ :user:`gaborbernat`. (`#2046 `_)
Bugfixes - 20.3.0
-~~~~~~~~~~~~~~~~~
-- On Windows python ``3.7+`` distributions where the exe shim is missing fallback to the old ways - by :user:`gaborbernat`. (`#1986 `_)
-- When discovering interpreters on Windows, via the PEP-514, prefer ``PythonCore`` releases over other ones. virtualenv
- is used via pip mostly by this distribution, so prefer it over other such as conda - by :user:`gaborbernat`. (`#2046 `_)
+=================
+- On Windows python ``3.7+`` distributions where the exe shim is missing fallback to the old ways - by
+ :user:`gaborbernat`. (`#1986 `_)
+- When discovering interpreters on Windows, via the PEP-514, prefer ``PythonCore`` releases over other ones. virtualenv
+ is used via pip mostly by this distribution, so prefer it over other such as conda - by :user:`gaborbernat`. (`#2046
+ `_)
-v20.2.2 (2020-12-07)
---------------------
+**********************
+ v20.2.2 (2020-12-07)
+**********************
Bugfixes - 20.2.2
-~~~~~~~~~~~~~~~~~
-- Bump pip to ``20.3.1``, setuptools to ``51.0.0`` and wheel to ``0.36.1`` - by :user:`gaborbernat`. (`#2029 `_)
+=================
+- Bump pip to ``20.3.1``, setuptools to ``51.0.0`` and wheel to ``0.36.1`` - by :user:`gaborbernat`. (`#2029
+ `_)
-v20.2.1 (2020-11-23)
---------------------
+**********************
+ v20.2.1 (2020-11-23)
+**********************
No significant changes.
-
-v20.2.0 (2020-11-21)
---------------------
+**********************
+ v20.2.0 (2020-11-21)
+**********************
Features - 20.2.0
-~~~~~~~~~~~~~~~~~
-- Optionally skip VCS ignore directive for entire virtualenv directory, using option :option:`no-vcs-ignore`, by default ``False``. (`#2003 `_)
-- Add ``--read-only-app-data`` option to allow for creation based on an existing
- app data cache which is non-writable. This may be useful (for example) to
- produce a docker image where the app-data is pre-populated.
+=================
+
+- Optionally skip VCS ignore directive for entire virtualenv directory, using option :option:`no-vcs-ignore`, by default
+ ``False``. (`#2003 `_)
+- Add ``--read-only-app-data`` option to allow for creation based on an existing app data cache which is non-writable.
+ This may be useful (for example) to produce a docker image where the app-data is pre-populated.
.. code-block:: dockerfile
@@ -844,114 +1778,147 @@ Features - 20.2.0
Patch by :user:`asottile`. (`#2009 `_)
Bugfixes - 20.2.0
-~~~~~~~~~~~~~~~~~
-- Fix processing of the ``VIRTUALENV_PYTHON`` environment variable and make it
- multi-value as well (separated by comma) - by :user:`pneff`. (`#1998 `_)
+=================
+- Fix processing of the ``VIRTUALENV_PYTHON`` environment variable and make it multi-value as well (separated by comma)
+ - by :user:`pneff`. (`#1998 `_)
-v20.1.0 (2020-10-25)
---------------------
+**********************
+ v20.1.0 (2020-10-25)
+**********************
Features - 20.1.0
-~~~~~~~~~~~~~~~~~
+=================
+
- The python specification can now take one or more values, first found is used to create the virtual environment - by
:user:`gaborbernat`. (`#1995 `_)
-
-v20.0.35 (2020-10-15)
----------------------
+***********************
+ v20.0.35 (2020-10-15)
+***********************
Bugfixes - 20.0.35
-~~~~~~~~~~~~~~~~~~
-- Bump embedded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. (`#1982 `_)
-- After importing virtualenv passing cwd to a subprocess calls breaks with ``invalid directory`` - by :user:`gaborbernat`. (`#1983 `_)
+==================
+- Bump embedded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. (`#1982
+ `_)
+- After importing virtualenv passing cwd to a subprocess calls breaks with ``invalid directory`` - by
+ :user:`gaborbernat`. (`#1983 `_)
-v20.0.34 (2020-10-12)
----------------------
+***********************
+ v20.0.34 (2020-10-12)
+***********************
Bugfixes - 20.0.34
-~~~~~~~~~~~~~~~~~~
-- Align with venv module when creating virtual environments with builtin creator on Windows 3.7 and later
- - by :user:`gaborbernat`. (`#1782 `_)
-- Handle Cygwin path conversion in the activation script - by :user:`davidcoghlan`. (`#1969 `_)
+==================
+- Align with venv module when creating virtual environments with builtin creator on Windows 3.7 and later - by
+ :user:`gaborbernat`. (`#1782 `_)
+- Handle Cygwin path conversion in the activation script - by :user:`davidcoghlan`. (`#1969
+ `_)
-v20.0.33 (2020-10-04)
----------------------
+***********************
+ v20.0.33 (2020-10-04)
+***********************
Bugfixes - 20.0.33
-~~~~~~~~~~~~~~~~~~
-- Fix ``None`` type error in cygwin if POSIX path in dest - by :user:`danyeaw`. (`#1962 `_)
-- Fix Python 3.4 incompatibilities (added back to the CI) - by :user:`gaborbernat`. (`#1963 `_)
+==================
+- Fix ``None`` type error in cygwin if POSIX path in dest - by :user:`danyeaw`. (`#1962
+ `_)
+- Fix Python 3.4 incompatibilities (added back to the CI) - by :user:`gaborbernat`. (`#1963
+ `_)
-v20.0.32 (2020-10-01)
----------------------
+***********************
+ v20.0.32 (2020-10-01)
+***********************
Bugfixes - 20.0.32
-~~~~~~~~~~~~~~~~~~
-- For activation scripts always use UNIX line endings (unless it's BATCH shell related) - by :user:`saytosid`. (`#1818 `_)
-- Upgrade embedded pip to ``20.2.1`` and setuptools to ``49.4.0`` - by :user:`gaborbernat`. (`#1918 `_)
-- Avoid spawning new windows when doing seed package upgrades in the background on Windows - by :user:`gaborbernat`. (`#1928 `_)
-- Fix a bug that reading and writing on the same file may cause race on multiple processes. (`#1938 `_)
-- Upgrade embedded setuptools to ``50.2.0`` and pip to ``20.2.3`` - by :user:`gaborbernat`. (`#1939 `_)
-- Provide correct path for bash activator in cygwin or msys2 - by :user:`danyeaw`. (`#1940 `_)
-- Relax importlib requirement to allow version<3 - by :user:`usamasadiq` (`#1953 `_)
-- pth files were not processed on CPython2 if $PYTHONPATH was pointing to site-packages/ - by :user:`navytux`. (`#1959 `_) (`#1960 `_)
-
-
-v20.0.31 (2020-08-17)
----------------------
+==================
+
+- For activation scripts always use UNIX line endings (unless it's BATCH shell related) - by :user:`saytosid`. (`#1818
+ `_)
+- Upgrade embedded pip to ``20.2.1`` and setuptools to ``49.4.0`` - by :user:`gaborbernat`. (`#1918
+ `_)
+- Avoid spawning new windows when doing seed package upgrades in the background on Windows - by :user:`gaborbernat`.
+ (`#1928 `_)
+- Fix a bug that reading and writing on the same file may cause race on multiple processes. (`#1938
+ `_)
+- Upgrade embedded setuptools to ``50.2.0`` and pip to ``20.2.3`` - by :user:`gaborbernat`. (`#1939
+ `_)
+- Provide correct path for bash activator in cygwin or msys2 - by :user:`danyeaw`. (`#1940
+ `_)
+- Relax importlib requirement to allow version<3 - by :user:`usamasadiq` (`#1953
+ `_)
+- pth files were not processed on CPython2 if $PYTHONPATH was pointing to site-packages/ - by :user:`navytux`. (`#1959
+ `_) (`#1960 `_)
+
+***********************
+ v20.0.31 (2020-08-17)
+***********************
Bugfixes - 20.0.31
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded pip to ``20.2.1``, setuptools to ``49.6.0`` and wheel to ``0.35.1`` - by :user:`gaborbernat`. (`#1918 `_)
+==================
+- Upgrade embedded pip to ``20.2.1``, setuptools to ``49.6.0`` and wheel to ``0.35.1`` - by :user:`gaborbernat`. (`#1918
+ `_)
-v20.0.30 (2020-08-04)
----------------------
+***********************
+ v20.0.30 (2020-08-04)
+***********************
Bugfixes - 20.0.30
-~~~~~~~~~~~~~~~~~~
-- Upgrade pip to ``20.2.1`` and setuptools to ``49.2.1`` - by :user:`gaborbernat`. (`#1915 `_)
+==================
+- Upgrade pip to ``20.2.1`` and setuptools to ``49.2.1`` - by :user:`gaborbernat`. (`#1915
+ `_)
-v20.0.29 (2020-07-31)
----------------------
+***********************
+ v20.0.29 (2020-07-31)
+***********************
Bugfixes - 20.0.29
-~~~~~~~~~~~~~~~~~~
-- Upgrade embedded pip from version ``20.1.2`` to ``20.2`` - by :user:`gaborbernat`. (`#1909 `_)
+==================
+- Upgrade embedded pip from version ``20.1.2`` to ``20.2`` - by :user:`gaborbernat`. (`#1909
+ `_)
-v20.0.28 (2020-07-24)
----------------------
+***********************
+ v20.0.28 (2020-07-24)
+***********************
Bugfixes - 20.0.28
-~~~~~~~~~~~~~~~~~~
-- Fix test suite failing if run from system Python - by :user:`gaborbernat`. (`#1882 `_)
+==================
+
+- Fix test suite failing if run from system Python - by :user:`gaborbernat`. (`#1882
+ `_)
- Provide ``setup_logging`` flag to python API so that users can bypass logging handling if their application already
performs this - by :user:`gaborbernat`. (`#1896 `_)
- Use ``\n`` instead if ``\r\n`` as line separator for report (because Python already performs this transformation
- automatically upon write to the logging pipe) - by :user:`gaborbernat`. (`#1905 `_)
-
+ automatically upon write to the logging pipe) - by :user:`gaborbernat`. (`#1905
+ `_)
-v20.0.27 (2020-07-15)
----------------------
+***********************
+ v20.0.27 (2020-07-15)
+***********************
Bugfixes - 20.0.27
-~~~~~~~~~~~~~~~~~~
-- No longer preimport threading to fix support for `gpython `_ and `gevent `_ - by :user:`navytux`. (`#1897 `_)
-- Upgrade setuptools from ``49.2.0`` on ``Python 3.5+`` - by :user:`gaborbernat`. (`#1898 `_)
+==================
+- No longer preimport threading to fix support for `gpython `_ and `gevent
+ `_ - by :user:`navytux`. (`#1897 `_)
+- Upgrade setuptools from ``49.2.0`` on ``Python 3.5+`` - by :user:`gaborbernat`. (`#1898
+ `_)
-v20.0.26 (2020-07-07)
----------------------
+***********************
+ v20.0.26 (2020-07-07)
+***********************
Bugfixes - 20.0.26
-~~~~~~~~~~~~~~~~~~
-- Bump dependency ``distutils >= 0.3.1`` - by :user:`gaborbernat`. (`#1880 `_)
+==================
+
+- Bump dependency ``distutils >= 0.3.1`` - by :user:`gaborbernat`. (`#1880
+ `_)
- Improve periodic update handling:
- better logging output while running and enable logging on background process call (
@@ -960,36 +1927,45 @@ Bugfixes - 20.0.26
- stop downloading wheels once we reach the embedded version,
by :user:`gaborbernat`. (`#1883 `_)
-- Do not print error message if the application exists with ``SystemExit(0)`` - by :user:`gaborbernat`. (`#1885 `_)
-- Upgrade embedded setuptools from ``47.3.1`` to ``49.1.0`` for Python ``3.5+`` - by :user:`gaborbernat`. (`#1887 `_)
+- Do not print error message if the application exists with ``SystemExit(0)`` - by :user:`gaborbernat`. (`#1885
+ `_)
+- Upgrade embedded setuptools from ``47.3.1`` to ``49.1.0`` for Python ``3.5+`` - by :user:`gaborbernat`. (`#1887
+ `_)
-v20.0.25 (2020-06-23)
----------------------
+***********************
+ v20.0.25 (2020-06-23)
+***********************
Bugfixes - 20.0.25
-~~~~~~~~~~~~~~~~~~
-- Fix that when the ``app-data`` seeders image creation fails the exception is silently ignored. Avoid two virtual environment creations to step on each others toes by using a lock while creating the base images. By :user:`gaborbernat`. (`#1869 `_)
+==================
+- Fix that when the ``app-data`` seeders image creation fails the exception is silently ignored. Avoid two virtual
+ environment creations to step on each others toes by using a lock while creating the base images. By
+ :user:`gaborbernat`. (`#1869 `_)
-v20.0.24 (2020-06-22)
----------------------
+***********************
+ v20.0.24 (2020-06-22)
+***********************
Features - 20.0.24
-~~~~~~~~~~~~~~~~~~
+==================
+
- Ensure that the seeded packages do not get too much out of date:
- add a CLI flag that triggers upgrade of embedded wheels under :option:`upgrade-embed-wheels`
- - periodically (once every 14 days) upgrade the embedded wheels in a background process, and use them if they have been
- released for more than 28 days (can be disabled via :option:`no-periodic-update`)
+ - periodically (once every 14 days) upgrade the embedded wheels in a background process, and use them if they have
+ been released for more than 28 days (can be disabled via :option:`no-periodic-update`)
More details under :ref:`wheels` - by :user:`gaborbernat`. (`#1821 `_)
+
- Upgrade embed wheel content:
- ship wheels for Python ``3.9`` and ``3.10``
- upgrade setuptools for Python ``3.5+`` from ``47.1.1`` to ``47.3.1``
by :user:`gaborbernat`. (`#1841