Repository: pypa/virtualenv

Issue:
`--setuptools` doesn't install pinned version
**Issue**

Option [`--setuptools`](https://virtualenv.pypa.io/en/latest/cli_interface.html#setuptools) doesn't seem to work.

**Environment**

Provide at least:
- OS: Ubuntu and Debian
- virtualenv/pyenv/docker different combination
- virtualenv 20.3.0

**Output of the virtual environment creation**

```console
(.venv)  tom@tom-mint  ~  virtualenv --setuptools=v57.5.0 --python=python3.8 /tmp/.venvsetuptools -vvv --with-traceback
48 setup logging to NOTSET [DEBUG report:43]
118 find interpreter for spec PythonSpec(implementation=CPython, major=3, minor=8) [INFO builtin:62]
118 proposed PythonInfo(spec=CPython3.8.0.final.0-64, exe=/home/tom/.pyenv/versions/3.8.0/bin/python3.8, platform=linux, version='3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]', encoding_fs_io=utf-8-utf-8) [INFO builtin:68]
118 accepted PythonInfo(spec=CPython3.8.0.final.0-64, exe=/home/tom/.pyenv/versions/3.8.0/bin/python3.8, platform=linux, version='3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]', encoding_fs_io=utf-8-utf-8) [DEBUG builtin:70]
119 filesystem is case-sensitive [DEBUG info:28]
141 create virtual environment via CPython3Posix(dest=/tmp/.venvsetuptools, clear=False, no_vcs_ignore=False, global=False) [INFO session:52]
141 create folder /tmp/.venvsetuptools/bin [DEBUG _sync:25]
141 create folder /tmp/.venvsetuptools/lib/python3.8/site-packages [DEBUG _sync:25]
141 write /tmp/.venvsetuptools/pyvenv.cfg [DEBUG pyenv_cfg:34]
141 	home = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
141 	implementation = CPython [DEBUG pyenv_cfg:38]
141 	version_info = 3.8.0.final.0 [DEBUG pyenv_cfg:38]
141 	virtualenv = 20.3.0 [DEBUG pyenv_cfg:38]
141 	include-system-site-packages = false [DEBUG pyenv_cfg:38]
141 	base-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
142 	base-exec-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
142 	base-executable = /home/tom/.pyenv/versions/3.8.0/bin/python3.8 [DEBUG pyenv_cfg:38]
142 symlink /home/tom/.pyenv/versions/3.8.0/bin/python3.8 to /tmp/.venvsetuptools/bin/python [DEBUG _sync:44]
142 create virtualenv import hook file /tmp/.venvsetuptools/lib/python3.8/site-packages/_virtualenv.pth [DEBUG api:95]
142 create /tmp/.venvsetuptools/lib/python3.8/site-packages/_virtualenv.py [DEBUG api:98]
142 ============================== target debug ============================== [DEBUG session:54]
142 debug via /tmp/.venvsetuptools/bin/python /home/tom/.pyenv/versions/3.8.0/lib/python3.8/site-packages/virtualenv/create/debug.py [DEBUG creator:223]
142 {
  "sys": {
    "executable": "/tmp/.venvsetuptools/bin/python",
    "_base_executable": "/tmp/.venvsetuptools/bin/python",
    "prefix": "/tmp/.venvsetuptools",
    "base_prefix": "/home/tom/.pyenv/versions/3.8.0",
    "real_prefix": null,
    "exec_prefix": "/tmp/.venvsetuptools",
    "base_exec_prefix": "/home/tom/.pyenv/versions/3.8.0",
    "path": [
      "/home/tom/.pyenv/versions/3.8.0/lib/python38.zip",
      "/home/tom/.pyenv/versions/3.8.0/lib/python3.8",
      "/home/tom/.pyenv/versions/3.8.0/lib/python3.8/lib-dynload",
      "/tmp/.venvsetuptools/lib/python3.8/site-packages"
    ],
    "meta_path": [
      "<class '_virtualenv._Finder'>",
      "<class '_frozen_importlib.BuiltinImporter'>",
      "<class '_frozen_importlib.FrozenImporter'>",
      "<class '_frozen_importlib_external.PathFinder'>"
    ],
    "fs_encoding": "utf-8",
    "io_encoding": "utf-8"
  },
  "version": "3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]",
  "makefile_filename": "/home/tom/.pyenv/versions/3.8.0/lib/python3.8/config-3.8-x86_64-linux-gnu/Makefile",
  "os": "<module 'os' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/os.py'>",
  "site": "<module 'site' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/site.py'>",
  "datetime": "<module 'datetime' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/datetime.py'>",
  "math": "<module 'math' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>",
  "json": "<module 'json' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/json/__init__.py'>"
} [DEBUG session:55]
166 add seed packages via FromAppData(download=False, pip=bundle, setuptools=v57.5.0, wheel=bundle, via=copy, app_data_dir=/home/tom/.local/share/virtualenv) [INFO session:59]
166 got embed update of distribution pip from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/pip.json [DEBUG via_disk_folder:135]
169 got embed update of distribution setuptools from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/setuptools.json [DEBUG via_disk_folder:135]
170 got embed update of distribution pip from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/pip.json [DEBUG via_disk_folder:135]
170 using periodically updated wheel /home/tom/.local/share/virtualenv/wheel/house/pip-21.2.4-py3-none-any.whl [DEBUG periodic_update:53]
171 got embed update of distribution wheel from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/wheel.json [DEBUG via_disk_folder:135]
171 got embed update of distribution setuptools from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/setuptools.json [DEBUG via_disk_folder:135]
172 using periodically updated wheel /home/tom/.local/share/virtualenv/wheel/house/setuptools-57.4.0-py3-none-any.whl [DEBUG periodic_update:53]
172 got embed update of distribution wheel from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/wheel.json [DEBUG via_disk_folder:135]
172 using periodically updated wheel /home/tom/.local/share/virtualenv/wheel/house/wheel-0.37.0-py2.py3-none-any.whl [DEBUG periodic_update:53]
172 install pip from wheel /home/tom/.local/share/virtualenv/wheel/house/pip-21.2.4-py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
172 install setuptools from wheel /home/tom/.local/share/virtualenv/wheel/house/setuptools-57.4.0-py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
173 install wheel from wheel /home/tom/.local/share/virtualenv/wheel/house/wheel-0.37.0-py2.py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
173 Attempting to acquire lock 139640323038320 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [DEBUG filelock:270]
173 Attempting to acquire lock 139640323037168 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [DEBUG filelock:270]
173 Lock 139640323038320 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [INFO filelock:274]
173 Lock 139640323037168 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [INFO filelock:274]
173 Attempting to release lock 139640323038320 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [DEBUG filelock:315]
173 Attempting to acquire lock 139640323036544 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [DEBUG filelock:270]
173 Lock 139640323038320 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [INFO filelock:318]
174 Attempting to release lock 139640323037168 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [DEBUG filelock:315]
174 Lock 139640323036544 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [INFO filelock:274]
174 Lock 139640323037168 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [INFO filelock:318]
174 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip to /tmp/.venvsetuptools/lib/python3.8/site-packages/pip [DEBUG _sync:52]
174 Attempting to release lock 139640323036544 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [DEBUG filelock:315]
174 Lock 139640323036544 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [INFO filelock:318]
174 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/pkg_resources to /tmp/.venvsetuptools/lib/python3.8/site-packages/pkg_resources [DEBUG _sync:52]
174 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel-0.37.0.dist-info to /tmp/.venvsetuptools/lib/python3.8/site-packages/wheel-0.37.0.dist-info [DEBUG _sync:52]
176 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel to /tmp/.venvsetuptools/lib/python3.8/site-packages/wheel [DEBUG _sync:52]
180 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools to /tmp/.venvsetuptools/lib/python3.8/site-packages/setuptools [DEBUG _sync:52]
182 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel-0.37.0.virtualenv to /tmp/.venvsetuptools/lib/python3.8/site-packages/wheel-0.37.0.virtualenv [DEBUG _sync:52]
184 generated console scripts wheel wheel3 wheel3.8 wheel-3.8 [DEBUG base:48]
206 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools-57.4.0.dist-info to /tmp/.venvsetuptools/lib/python3.8/site-packages/setuptools-57.4.0.dist-info [DEBUG _sync:52]
208 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools-57.4.0.virtualenv to /tmp/.venvsetuptools/lib/python3.8/site-packages/setuptools-57.4.0.virtualenv [DEBUG _sync:52]
208 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/distutils-precedence.pth to /tmp/.venvsetuptools/lib/python3.8/site-packages/distutils-precedence.pth [DEBUG _sync:52]
208 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/_distutils_hack to /tmp/.venvsetuptools/lib/python3.8/site-packages/_distutils_hack [DEBUG _sync:52]
209 generated console scripts  [DEBUG base:48]
223 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip-21.2.4.virtualenv to /tmp/.venvsetuptools/lib/python3.8/site-packages/pip-21.2.4.virtualenv [DEBUG _sync:52]
223 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip-21.2.4.dist-info to /tmp/.venvsetuptools/lib/python3.8/site-packages/pip-21.2.4.dist-info [DEBUG _sync:52]
224 generated console scripts pip-3.8 pip3.8 pip3 pip [DEBUG base:48]
224 add activators for Bash, CShell, Fish, PowerShell, Python, Xonsh [INFO session:64]
225 write /tmp/.venvsetuptools/pyvenv.cfg [DEBUG pyenv_cfg:34]
225 	home = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
225 	implementation = CPython [DEBUG pyenv_cfg:38]
225 	version_info = 3.8.0.final.0 [DEBUG pyenv_cfg:38]
225 	virtualenv = 20.3.0 [DEBUG pyenv_cfg:38]
225 	include-system-site-packages = false [DEBUG pyenv_cfg:38]
225 	base-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
225 	base-exec-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
225 	base-executable = /home/tom/.pyenv/versions/3.8.0/bin/python3.8 [DEBUG pyenv_cfg:38]
225 created virtual environment CPython3.8.0.final.0-64 in 178ms
  creator CPython3Posix(dest=/tmp/.venvsetuptools, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=v57.5.0, wheel=bundle, via=copy, app_data_dir=/home/tom/.local/share/virtualenv)
    added seed packages: pip==21.2.4, setuptools==57.4.0, wheel==0.37.0
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator [WARNING __main__:17]



tom@tom-mint  ~/PycharmProjects/virtualenv/src/virtualenv   main ±  source /tmp/.venvsetuptools/bin/activate
(.venvsetuptools)  tom@tom-mint  ~/PycharmProjects/virtualenv/src/virtualenv   main ±  pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 57.4.0
wheel      0.37.0

```



Discussion:
Can you try with 20.8.1? Anything other than latest is considered unsupported 🤷 Also setuptools doesn't have the v version prefix so that's bad CLI arg.
I tried with `v.57`, `v57` and `57`, always the same outcome.

Running 
```console
virtualenv --setuptools=57.5.0 --python=python3.8 /tmp/.venv2 -vvv --with-traceback
```
with virtualenv `20.8.1` yields exactly the same output.

```console
 tom@tom-mint  ~  virtualenv --setuptools=57.5.0 --python=python3.8 /tmp/.venv2 -vvv --with-traceback
52 setup logging to NOTSET [DEBUG report:43]
101 find interpreter for spec PythonSpec(implementation=CPython, major=3, minor=8) [INFO builtin:62]
101 proposed PythonInfo(spec=CPython3.8.0.final.0-64, exe=/home/tom/.pyenv/versions/3.8.0/bin/python, platform=linux, version='3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]', encoding_fs_io=utf-8-utf-8) [INFO builtin:69]
101 accepted PythonInfo(spec=CPython3.8.0.final.0-64, exe=/home/tom/.pyenv/versions/3.8.0/bin/python, platform=linux, version='3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]', encoding_fs_io=utf-8-utf-8) [DEBUG builtin:71]
102 filesystem is case-sensitive [DEBUG info:29]
124 create virtual environment via CPython3Posix(dest=/tmp/.venv2, clear=False, no_vcs_ignore=False, global=False) [INFO session:52]
124 create folder /tmp/.venv2/bin [DEBUG _sync:25]
124 create folder /tmp/.venv2/lib/python3.8/site-packages [DEBUG _sync:25]
124 write /tmp/.venv2/pyvenv.cfg [DEBUG pyenv_cfg:34]
124 	home = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
124 	implementation = CPython [DEBUG pyenv_cfg:38]
124 	version_info = 3.8.0.final.0 [DEBUG pyenv_cfg:38]
124 	virtualenv = 20.8.1 [DEBUG pyenv_cfg:38]
124 	include-system-site-packages = false [DEBUG pyenv_cfg:38]
124 	base-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
124 	base-exec-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
124 	base-executable = /home/tom/.pyenv/versions/3.8.0/bin/python [DEBUG pyenv_cfg:38]
124 symlink /home/tom/.pyenv/versions/3.8.0/bin/python to /tmp/.venv2/bin/python [DEBUG _sync:44]
124 create virtualenv import hook file /tmp/.venv2/lib/python3.8/site-packages/_virtualenv.pth [DEBUG api:95]
125 create /tmp/.venv2/lib/python3.8/site-packages/_virtualenv.py [DEBUG api:98]
125 ============================== target debug ============================== [DEBUG session:54]
125 debug via /tmp/.venv2/bin/python /home/tom/.pyenv/versions/3.8.0/lib/python3.8/site-packages/virtualenv/create/debug.py [DEBUG creator:224]
125 {
  "sys": {
    "executable": "/tmp/.venv2/bin/python",
    "_base_executable": "/tmp/.venv2/bin/python",
    "prefix": "/tmp/.venv2",
    "base_prefix": "/home/tom/.pyenv/versions/3.8.0",
    "real_prefix": null,
    "exec_prefix": "/tmp/.venv2",
    "base_exec_prefix": "/home/tom/.pyenv/versions/3.8.0",
    "path": [
      "/home/tom/.pyenv/versions/3.8.0/lib/python38.zip",
      "/home/tom/.pyenv/versions/3.8.0/lib/python3.8",
      "/home/tom/.pyenv/versions/3.8.0/lib/python3.8/lib-dynload",
      "/tmp/.venv2/lib/python3.8/site-packages"
    ],
    "meta_path": [
      "<class '_virtualenv._Finder'>",
      "<class '_frozen_importlib.BuiltinImporter'>",
      "<class '_frozen_importlib.FrozenImporter'>",
      "<class '_frozen_importlib_external.PathFinder'>"
    ],
    "fs_encoding": "utf-8",
    "io_encoding": "utf-8"
  },
  "version": "3.8.0 (default, Jan  2 2021, 20:27:49) \n[GCC 9.3.0]",
  "makefile_filename": "/home/tom/.pyenv/versions/3.8.0/lib/python3.8/config-3.8-x86_64-linux-gnu/Makefile",
  "os": "<module 'os' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/os.py'>",
  "site": "<module 'site' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/site.py'>",
  "datetime": "<module 'datetime' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/datetime.py'>",
  "math": "<module 'math' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>",
  "json": "<module 'json' from '/home/tom/.pyenv/versions/3.8.0/lib/python3.8/json/__init__.py'>"
} [DEBUG session:55]
147 add seed packages via FromAppData(download=False, pip=bundle, setuptools=57.5.0, wheel=bundle, via=copy, app_data_dir=/home/tom/.local/share/virtualenv) [INFO session:59]
148 got embed update of distribution setuptools from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/setuptools.json [DEBUG via_disk_folder:135]
149 got embed update of distribution wheel from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/wheel.json [DEBUG via_disk_folder:135]
151 got embed update of distribution pip from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/pip.json [DEBUG via_disk_folder:135]
152 got embed update of distribution pip from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/pip.json [DEBUG via_disk_folder:135]
152 got embed update of distribution wheel from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/wheel.json [DEBUG via_disk_folder:135]
152 got embed update of distribution setuptools from /home/tom/.local/share/virtualenv/wheel/3.8/embed/1/setuptools.json [DEBUG via_disk_folder:135]
153 using periodically updated wheel /home/tom/.local/share/virtualenv/wheel/house/setuptools-57.4.0-py3-none-any.whl [DEBUG periodic_update:53]
153 install pip from wheel /home/tom/.pyenv/versions/3.8.0/lib/python3.8/site-packages/virtualenv/seed/wheels/embed/pip-21.2.4-py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
153 install wheel from wheel /home/tom/.pyenv/versions/3.8.0/lib/python3.8/site-packages/virtualenv/seed/wheels/embed/wheel-0.37.0-py2.py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
154 Attempting to acquire lock 139625599376256 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [DEBUG filelock:270]
154 install setuptools from wheel /home/tom/.local/share/virtualenv/wheel/house/setuptools-57.4.0-py3-none-any.whl via CopyPipInstall [DEBUG via_app_data:49]
154 Attempting to acquire lock 139625599034224 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [DEBUG filelock:270]
154 Lock 139625599376256 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [INFO filelock:274]
154 Lock 139625599034224 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [INFO filelock:274]
154 Attempting to acquire lock 139625599034128 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [DEBUG filelock:270]
155 Attempting to release lock 139625599376256 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [DEBUG filelock:315]
155 Lock 139625599034128 acquired on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [INFO filelock:274]
155 Lock 139625599376256 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any.lock [INFO filelock:318]
155 Attempting to release lock 139625599034224 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [DEBUG filelock:315]
155 Attempting to release lock 139625599034128 on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [DEBUG filelock:315]
155 Lock 139625599034224 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any.lock [INFO filelock:318]
155 Lock 139625599034128 released on /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any.lock [INFO filelock:318]
155 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip to /tmp/.venv2/lib/python3.8/site-packages/pip [DEBUG _sync:52]
155 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/pkg_resources to /tmp/.venv2/lib/python3.8/site-packages/pkg_resources [DEBUG _sync:52]
156 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel-0.37.0.dist-info to /tmp/.venv2/lib/python3.8/site-packages/wheel-0.37.0.dist-info [DEBUG _sync:52]
158 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel to /tmp/.venv2/lib/python3.8/site-packages/wheel [DEBUG _sync:52]
162 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools to /tmp/.venv2/lib/python3.8/site-packages/setuptools [DEBUG _sync:52]
164 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/wheel-0.37.0-py2.py3-none-any/wheel-0.37.0.virtualenv to /tmp/.venv2/lib/python3.8/site-packages/wheel-0.37.0.virtualenv [DEBUG _sync:52]
166 generated console scripts wheel3 wheel-3.8 wheel wheel3.8 [DEBUG base:45]
183 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools-57.4.0.dist-info to /tmp/.venv2/lib/python3.8/site-packages/setuptools-57.4.0.dist-info [DEBUG _sync:52]
184 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/setuptools-57.4.0.virtualenv to /tmp/.venv2/lib/python3.8/site-packages/setuptools-57.4.0.virtualenv [DEBUG _sync:52]
184 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/distutils-precedence.pth to /tmp/.venv2/lib/python3.8/site-packages/distutils-precedence.pth [DEBUG _sync:52]
184 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/setuptools-57.4.0-py3-none-any/_distutils_hack to /tmp/.venv2/lib/python3.8/site-packages/_distutils_hack [DEBUG _sync:52]
185 generated console scripts  [DEBUG base:45]
202 copy /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip-21.2.4.virtualenv to /tmp/.venv2/lib/python3.8/site-packages/pip-21.2.4.virtualenv [DEBUG _sync:52]
202 copy directory /home/tom/.local/share/virtualenv/wheel/3.8/image/1/CopyPipInstall/pip-21.2.4-py3-none-any/pip-21.2.4.dist-info to /tmp/.venv2/lib/python3.8/site-packages/pip-21.2.4.dist-info [DEBUG _sync:52]
203 generated console scripts pip pip-3.8 pip3.8 pip3 [DEBUG base:45]
203 add activators for Bash, CShell, Fish, Nushell, PowerShell, Python [INFO session:64]
204 write /tmp/.venv2/pyvenv.cfg [DEBUG pyenv_cfg:34]
204 	home = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
204 	implementation = CPython [DEBUG pyenv_cfg:38]
204 	version_info = 3.8.0.final.0 [DEBUG pyenv_cfg:38]
204 	virtualenv = 20.8.1 [DEBUG pyenv_cfg:38]
204 	include-system-site-packages = false [DEBUG pyenv_cfg:38]
204 	base-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
204 	base-exec-prefix = /home/tom/.pyenv/versions/3.8.0 [DEBUG pyenv_cfg:38]
204 	base-executable = /home/tom/.pyenv/versions/3.8.0/bin/python [DEBUG pyenv_cfg:38]
204 created virtual environment CPython3.8.0.final.0-64 in 154ms
  creator CPython3Posix(dest=/tmp/.venv2, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=57.5.0, wheel=bundle, via=copy, app_data_dir=/home/tom/.local/share/virtualenv)
    added seed packages: pip==21.2.4, setuptools==57.4.0, wheel==0.37.0
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator [WARNING __main__:19]


 ✘ tom@tom-mint  ~  source /tmp/.venv2/bin/activate
(.venv2)  tom@tom-mint  ~  pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 57.4.0
wheel      0.37.0
```


Thanks, PR tox fix it with the test welcome.
Sure, I'll try to look into that over the weekend. You can assign me.
Sorry, I just can't find a spare time to look into that. If someone else wants to hop in - feel free to do so.
Updating the integration test with the following patch triggers the issue (with pip rather than setuptools but probably the same root cause)
```diff
--- a/tests/integration/test_run_int.py
+++ b/tests/integration/test_run_int.py
@@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals
 
 import sys
 
+import pytest
 from virtualenv import cli_run
 from virtualenv.util.six import ensure_text
 from virtualenv.util.subprocess import run_cmd
@@ -9,6 +10,8 @@ from virtualenv.util.subprocess import run_cmd
 
 def test_app_data_pinning(tmp_path):
     version = "19.1.1" if sys.version_info[0:2] == (3, 4) else "19.3.1"
+    with pytest.raises(SystemExit):
+        cli_run(["--upgrade-embed-wheels"])
     result = cli_run([ensure_text(str(tmp_path)), "--pip", version, "--activators", "", "--seeder", "app-data"])
     code, out, err = run_cmd([str(result.creator.script("pip")), "list", "--disable-pip-version-check"])
     assert not code
```

AssertionError triggered:
```
            if parts and parts[0] == "pip":
>               assert parts[1] == version
E               AssertionError: assert '21.3.1' == '19.3.1'
```
I knew this issue comes from `from_bundle` but I was having a hard time debugging it. I tested your solution, checked a few things and I confirm this is the way to fix my setuptools issue as well and IMO that's the only solution that make sense. 👍🏼 

Resolving patch:
diff --git a/src/virtualenv/seed/wheels/bundle.py b/src/virtualenv/seed/wheels/bundle.py
--- a/src/virtualenv/seed/wheels/bundle.py
+++ b/src/virtualenv/seed/wheels/bundle.py
@@ -15,7 +15,9 @@ def from_bundle(distribution, version, for_py_version, search_dirs, app_data, do
     if version != Version.embed:
         # 2. check if we have upgraded embed
         if app_data.can_update:
-            wheel = periodic_update(distribution, for_py_version, wheel, search_dirs, app_data, do_periodic_update, env)
+            wheel = periodic_update(
+                distribution, of_version, for_py_version, wheel, search_dirs, app_data, do_periodic_update, env
+            )
 
         # 3. acquire from extra search dir
         found_wheel = from_dir(distribution, of_version, for_py_version, search_dirs)
diff --git a/src/virtualenv/seed/wheels/periodic_update.py b/src/virtualenv/seed/wheels/periodic_update.py
--- a/src/virtualenv/seed/wheels/periodic_update.py
+++ b/src/virtualenv/seed/wheels/periodic_update.py
@@ -36,23 +36,32 @@
         pass  # pragma: no cov
 
 
-def periodic_update(distribution, for_py_version, wheel, search_dirs, app_data, do_periodic_update, env):
+def periodic_update(distribution, of_version, for_py_version, wheel, search_dirs, app_data, do_periodic_update, env):
     if do_periodic_update:
         handle_auto_update(distribution, for_py_version, wheel, search_dirs, app_data, env)
 
     now = datetime.now()
 
+    def _update_wheel(ver):
+        updated_wheel = Wheel(app_data.house / ver.filename)
+        logging.debug("using %supdated wheel %s", "periodically " if updated_wheel else "", updated_wheel)
+        return updated_wheel
+
     u_log = UpdateLog.from_app_data(app_data, distribution, for_py_version)
     u_log_older_than_hour = now - u_log.completed > timedelta(hours=1) if u_log.completed is not None else False
-    for _, group in groupby(u_log.versions, key=lambda v: v.wheel.version_tuple[0:2]):
-        version = next(group)  # use only latest patch version per minor, earlier assumed to be buggy
-        if wheel is not None and Path(version.filename).name == wheel.name:
-            break
-        if u_log.periodic is False or (u_log_older_than_hour and version.use(now)):
-            updated_wheel = Wheel(app_data.house / version.filename)
-            logging.debug("using %supdated wheel %s", "periodically " if updated_wheel else "", updated_wheel)
-            wheel = updated_wheel
-            break
+    if of_version is None:
+        for _, group in groupby(u_log.versions, key=lambda v: v.wheel.version_tuple[0:2]):
+            version = next(group)  # use only latest patch version per minor, earlier assumed to be buggy
+            if wheel is not None and Path(version.filename).name == wheel.name:
+                break
+            if u_log.periodic is False or (u_log_older_than_hour and version.use(now)):
+                wheel = _update_wheel(version)
+                break
+    elif u_log.periodic is False or u_log_older_than_hour:
+        for version in u_log.versions:
+            if version.wheel.version == of_version:
+                wheel = _update_wheel(version)
+                break
 
     return wheel
 


Test patch:
diff --git a/tests/unit/seed/wheels/test_bundle.py b/tests/unit/seed/wheels/test_bundle.py
new file mode 100644
--- /dev/null
+++ b/tests/unit/seed/wheels/test_bundle.py
@@ -0,0 +1,71 @@
+from __future__ import absolute_import, unicode_literals
+
+import os
+
+import pytest
+
+from virtualenv.app_data import AppDataDiskFolder
+from virtualenv.seed.wheels.bundle import from_bundle
+from virtualenv.seed.wheels.embed import get_embed_wheel
+from virtualenv.seed.wheels.util import Version, Wheel
+from virtualenv.util.path import Path
+
+
+@pytest.fixture(scope="module")
+def next_pip_wheel(for_py_version):
+    wheel = get_embed_wheel("pip", for_py_version)
+    new_version = list(wheel.version_tuple)
+    new_version[-1] += 1
+    new_name = wheel.name.replace(wheel.version, ".".join(str(i) for i in new_version))
+    return Wheel.from_path(Path(new_name))
+
+
+@pytest.fixture(scope="module")
+def app_data(tmp_path_factory, for_py_version, next_pip_wheel):
+    temp_folder = tmp_path_factory.mktemp("module-app-data")
+    app_data_ = AppDataDiskFolder(str(temp_folder))
+    app_data_.embed_update_log("pip", for_py_version).write(
+        {
+            "completed": "2000-01-01T00:00:00.000000Z",
+            "periodic": True,
+            "started": "2000-01-01T00:00:00.000000Z",
+            "versions": [
+                {
+                    "filename": next_pip_wheel.name,
+                    "found_date": "2000-01-01T00:00:00.000000Z",
+                    "release_date": "2000-01-01T00:00:00.000000Z",
+                }
+            ],
+        }
+    )
+    yield app_data_
+
+
+def test_version_embed(app_data, for_py_version):
+    wheel = from_bundle("pip", Version.embed, for_py_version, [], app_data, False, os.environ)
+    assert wheel is not None
+    assert wheel.name == get_embed_wheel("pip", for_py_version).name
+
+
+def test_version_bundle(app_data, for_py_version, next_pip_wheel):
+    wheel = from_bundle("pip", Version.bundle, for_py_version, [], app_data, False, os.environ)
+    assert wheel is not None
+    assert wheel.name == next_pip_wheel.name
+
+
+def test_version_pinned_not_found(app_data, for_py_version):
+    wheel = from_bundle("pip", "0.0.0", for_py_version, [], app_data, False, os.environ)
+    assert wheel is None
+
+
+def test_version_pinned_is_embed(app_data, for_py_version):
+    expected_wheel = get_embed_wheel("pip", for_py_version)
+    wheel = from_bundle("pip", expected_wheel.version, for_py_version, [], app_data, False, os.environ)
+    assert wheel is not None
+    assert wheel.name == expected_wheel.name
+
+
+def test_version_pinned_in_app_data(app_data, for_py_version, next_pip_wheel):
+    wheel = from_bundle("pip", next_pip_wheel.version, for_py_version, [], app_data, False, os.environ)
+    assert wheel is not None
+    assert wheel.name == next_pip_wheel.name
diff --git a/tests/unit/seed/wheels/test_periodic_update.py b/tests/unit/seed/wheels/test_periodic_update.py
--- a/tests/unit/seed/wheels/test_periodic_update.py
+++ b/tests/unit/seed/wheels/test_periodic_update.py
@@ -101,7 +101,7 @@ def test_periodic_update_stops_at_current(mocker, session_app_data, for_py_versi
     )
     mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
 
-    result = periodic_update("setuptools", for_py_version, current, [], session_app_data, False, os.environ)
+    result = periodic_update("setuptools", None, for_py_version, current, [], session_app_data, False, os.environ)
     assert result.path == current.path
 
 
@@ -120,7 +120,7 @@ def test_periodic_update_latest_per_patch(mocker, session_app_data, for_py_versi
     )
     mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
 
-    result = periodic_update("setuptools", for_py_version, current, [], session_app_data, False, os.environ)
+    result = periodic_update("setuptools", None, for_py_version, current, [], session_app_data, False, os.environ)
     assert result.path == current.path
 
 
@@ -166,7 +166,7 @@ def test_periodic_update_skip(u_log, mocker, for_py_version, session_app_data, f
     mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
     mocker.patch("virtualenv.seed.wheels.periodic_update.trigger_update", side_effect=RuntimeError)
 
-    result = periodic_update("setuptools", for_py_version, None, [], session_app_data, os.environ, True)
+    result = periodic_update("setuptools", None, for_py_version, None, [], session_app_data, os.environ, True)
     assert result is None
 
 
@@ -194,7 +194,7 @@ def test_periodic_update_trigger(u_log, mocker, for_py_version, session_app_data
     write = mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.write")
     trigger_update_ = mocker.patch("virtualenv.seed.wheels.periodic_update.trigger_update")
 
-    result = periodic_update("setuptools", for_py_version, None, [], session_app_data, os.environ, True)
+    result = periodic_update("setuptools", None, for_py_version, None, [], session_app_data, os.environ, True)
 
     assert result is None
     assert trigger_update_.call_count