Skip to content

Multi-line setup.cfg configs break command expansion  #2847

Open
@albertodonato

Description

@albertodonato

Issue

Since switching to version 4 (4.2.6 specifically) from version 3, tox is treating multi-line entries in setup.cfg differently, as they seem to be expanded over mulitple lines when the var is used in a command (see example below).

Environment

  • OS: Ubuntu 22.10 (kinetic)
  • pip list of the host Python where tox is installed:
$ pip list
Package       Version
------------- -------
cachetools    5.2.1
chardet       5.1.0
colorama      0.4.6
distlib       0.3.6
filelock      3.9.0
packaging     23.0
pip           22.3.1
platformdirs  2.6.2
pluggy        1.0.0
pyproject_api 1.4.0
setuptools    59.6.0
tomli         2.0.1
tox           4.2.6
virtualenv    20.17.1

Output of running tox

Provide the output of tox -rvv:

$ tox -rvv
sample: 90 W remove tox env folder /home/ack/Desktop/tox-test/.tox/sample [tox/tox_env/api.py:321]
sample: 104 I find interpreter for spec PythonSpec(path=/home/ack/virtualenv/tox/bin/python3) [virtualenv/discovery/builtin.py:56]
sample: 104 D discover exe for PythonInfo(spec=CPython3.10.7.final.0-64, exe=/home/ack/virtualenv/tox/bin/python3, platform=linux, version='3.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0]', encoding_fs_io=utf-8-utf-8) in /usr [virtualenv/discovery/py_info.py:437]
sample: 104 D filesystem is case-sensitive [virtualenv/info.py:24]
sample: 105 D got python info of /usr/bin/python3.10 from /home/ack/.local/share/virtualenv/py_info/1/8a94588eda9d64d9e9a351ab8144e55b1fabf5113b54e67dd26a8c27df0381b3.json [virtualenv/app_data/via_disk_folder.py:129]
sample: 105 I proposed PythonInfo(spec=CPython3.10.7.final.0-64, system=/usr/bin/python3.10, exe=/home/ack/virtualenv/tox/bin/python3, platform=linux, version='3.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:63]
sample: 105 D accepted PythonInfo(spec=CPython3.10.7.final.0-64, system=/usr/bin/python3.10, exe=/home/ack/virtualenv/tox/bin/python3, platform=linux, version='3.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:65]
sample: 118 I create virtual environment via CPython3Posix(dest=/home/ack/Desktop/tox-test/.tox/sample, clear=False, no_vcs_ignore=False, global=False) [virtualenv/run/session.py:48]
sample: 118 D create folder /home/ack/Desktop/tox-test/.tox/sample/bin [virtualenv/util/path/_sync.py:9]
sample: 118 D create folder /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages [virtualenv/util/path/_sync.py:9]
sample: 118 D write /home/ack/Desktop/tox-test/.tox/sample/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:30]
sample: 118 D   home = /usr/bin [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   implementation = CPython [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   version_info = 3.10.7.final.0 [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   virtualenv = 20.17.1 [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   base-prefix = /usr [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   base-exec-prefix = /usr [virtualenv/create/pyenv_cfg.py:34]
sample: 118 D   base-executable = /usr/bin/python3.10 [virtualenv/create/pyenv_cfg.py:34]
sample: 119 D symlink /usr/bin/python3.10 to /home/ack/Desktop/tox-test/.tox/sample/bin/python [virtualenv/util/path/_sync.py:28]
sample: 119 D create virtualenv import hook file /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/_virtualenv.pth [virtualenv/create/via_global_ref/api.py:89]
sample: 119 D create /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/_virtualenv.py [virtualenv/create/via_global_ref/api.py:92]
sample: 119 D ============================== target debug ============================== [virtualenv/run/session.py:50]
sample: 119 D debug via /home/ack/Desktop/tox-test/.tox/sample/bin/python /home/ack/virtualenv/tox/lib/python3.10/site-packages/virtualenv/create/debug.py [virtualenv/create/creator.py:197]
sample: 119 D {
  "sys": {
    "executable": "/home/ack/Desktop/tox-test/.tox/sample/bin/python",
    "_base_executable": "/home/ack/Desktop/tox-test/.tox/sample/bin/python",
    "prefix": "/home/ack/Desktop/tox-test/.tox/sample",
    "base_prefix": "/usr",
    "real_prefix": null,
    "exec_prefix": "/home/ack/Desktop/tox-test/.tox/sample",
    "base_exec_prefix": "/usr",
    "path": [
      "/usr/lib/python310.zip",
      "/usr/lib/python3.10",
      "/usr/lib/python3.10/lib-dynload",
      "/home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/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.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0]",
  "makefile_filename": "/usr/lib/python3.10/config-3.10-x86_64-linux-gnu/Makefile",
  "os": "<module 'os' from '/usr/lib/python3.10/os.py'>",
  "site": "<module 'site' from '/usr/lib/python3.10/site.py'>",
  "datetime": "<module 'datetime' from '/usr/lib/python3.10/datetime.py'>",
  "math": "<module 'math' (built-in)>",
  "json": "<module 'json' from '/usr/lib/python3.10/json/__init__.py'>"
} [virtualenv/run/session.py:51]
sample: 133 I add seed packages via FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/ack/.local/share/virtualenv) [virtualenv/run/session.py:55]
sample: 135 D install setuptools from wheel /home/ack/virtualenv/tox/lib/python3.10/site-packages/virtualenv/seed/wheels/embed/setuptools-65.6.3-py3-none-any.whl via CopyPipInstall [virtualenv/seed/embed/via_app_data/via_app_data.py:47]
sample: 135 D install wheel from wheel /home/ack/virtualenv/tox/lib/python3.10/site-packages/virtualenv/seed/wheels/embed/wheel-0.38.4-py3-none-any.whl via CopyPipInstall [virtualenv/seed/embed/via_app_data/via_app_data.py:47]
sample: 135 D install pip from wheel /home/ack/virtualenv/tox/lib/python3.10/site-packages/virtualenv/seed/wheels/embed/pip-22.3.1-py3-none-any.whl via CopyPipInstall [virtualenv/seed/embed/via_app_data/via_app_data.py:47]
sample: 136 D copy /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/distutils-precedence.pth to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/distutils-precedence.pth [virtualenv/util/path/_sync.py:36]
sample: 136 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-22.3.1-py3-none-any/pip to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/pip [virtualenv/util/path/_sync.py:36]
sample: 136 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/wheel-0.38.4-py3-none-any/wheel to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/wheel [virtualenv/util/path/_sync.py:36]
sample: 136 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/_distutils_hack to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/_distutils_hack [virtualenv/util/path/_sync.py:36]
sample: 137 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/pkg_resources to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/pkg_resources [virtualenv/util/path/_sync.py:36]
sample: 139 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/wheel-0.38.4-py3-none-any/wheel-0.38.4.dist-info to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/wheel-0.38.4.dist-info [virtualenv/util/path/_sync.py:36]
sample: 140 D copy /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/wheel-0.38.4-py3-none-any/wheel-0.38.4.virtualenv to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/wheel-0.38.4.virtualenv [virtualenv/util/path/_sync.py:36]
sample: 141 D generated console scripts wheel wheel-3.10 wheel3 wheel3.10 [virtualenv/seed/embed/via_app_data/pip_install/base.py:41]
sample: 143 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/setuptools to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/setuptools [virtualenv/util/path/_sync.py:36]
sample: 158 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/setuptools-65.6.3.dist-info to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/setuptools-65.6.3.dist-info [virtualenv/util/path/_sync.py:36]
sample: 159 D copy /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/setuptools-65.6.3-py3-none-any/setuptools-65.6.3.virtualenv to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/setuptools-65.6.3.virtualenv [virtualenv/util/path/_sync.py:36]
sample: 159 D generated console scripts  [virtualenv/seed/embed/via_app_data/pip_install/base.py:41]
sample: 169 D copy directory /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-22.3.1-py3-none-any/pip-22.3.1.dist-info to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/pip-22.3.1.dist-info [virtualenv/util/path/_sync.py:36]
sample: 169 D copy /home/ack/.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-22.3.1-py3-none-any/pip-22.3.1.virtualenv to /home/ack/Desktop/tox-test/.tox/sample/lib/python3.10/site-packages/pip-22.3.1.virtualenv [virtualenv/util/path/_sync.py:36]
sample: 170 D generated console scripts pip3 pip-3.10 pip3.10 pip [virtualenv/seed/embed/via_app_data/pip_install/base.py:41]
sample: 170 I add activators for Bash, CShell, Fish, Nushell, PowerShell, Python [virtualenv/run/session.py:61]
sample: 171 D write /home/ack/Desktop/tox-test/.tox/sample/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:30]
sample: 171 D   home = /usr/bin [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   implementation = CPython [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   version_info = 3.10.7.final.0 [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   virtualenv = 20.17.1 [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   base-prefix = /usr [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   base-exec-prefix = /usr [virtualenv/create/pyenv_cfg.py:34]
sample: 171 D   base-executable = /usr/bin/python3.10 [virtualenv/create/pyenv_cfg.py:34]
sample: 172 W commands[0]> .tox/sample/bin/python -c 'import sys; print(sys.argv[1:])' foo [tox/tox_env/api.py:427]
['foo']
sample: 182 I exit 0 (0.01 seconds) /home/ack/Desktop/tox-test> .tox/sample/bin/python -c 'import sys; print(sys.argv[1:])' foo pid=1627869 [tox/execute/api.py:275]
sample: 182 W commands[1]> bar [tox/tox_env/api.py:427]
sample: 183 C exit 2 (0.00 seconds) /home/ack/Desktop/tox-test> bar [tox/execute/api.py:275]
  sample: FAIL code 2 (0.09=setup[0.08]+cmd[0.01,0.00] seconds)
  evaluation failed :( (0.12 seconds)

For comparison, this is the output with the tox version in Ubuntu 22.10:

$ /usr/bin/tox -rvv 
using tox.ini: /home/ack/Desktop/tox-test/setup.cfg (pid 1628214)
  removing /home/ack/Desktop/tox-test/.tox/log
/usr/bin/python3 (/usr/bin/python3) is {'executable': '/usr/bin/python3', 'implementation': 'CPython', 'version_info': [3, 10, 7, 'final', 0], 'version': '3.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0]', 'is_64': True, 'sysplatform': 'linux', 'extra_version_info': None}
sample uses /usr/bin/python3
using tox-3.21.4 from /usr/lib/python3/dist-packages/tox/__init__.py (pid 1628214)
skipping sdist step
sample start: getenv /home/ack/Desktop/tox-test/.tox/sample
sample cannot reuse: -r flag
sample create: /home/ack/Desktop/tox-test/.tox/sample
  removing /home/ack/Desktop/tox-test/.tox/sample
setting PATH=/home/ack/Desktop/tox-test/.tox/sample/bin:/home/ack/virtualenv/tox/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin
[1628217] /home/ack/Desktop/tox-test/.tox$ /usr/bin/python3 -m virtualenv --no-download --python /usr/bin/python3 sample
created virtual environment CPython3.10.7.final.0-64 in 60ms
  creator CPython3Posix(dest=/home/ack/Desktop/tox-test/.tox/sample, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/ack/.local/share/virtualenv)
    added seed packages: pip==22.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
sample finish: getenv /home/ack/Desktop/tox-test/.tox/sample after 0.16 seconds
sample start: finishvenv 
write config to /home/ack/Desktop/tox-test/.tox/sample/.tox-config1 as 'bfe5f8a30217c78e9b7c190244a7e314d8147b542f592ba783da0b27f87cf7fa /usr/bin/python3\n3.21.4 0 0 0'
sample finish: finishvenv  after 0.01 seconds
sample start: envreport 
setting PATH=/home/ack/Desktop/tox-test/.tox/sample/bin:/home/ack/virtualenv/tox/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin
[1628225] /home/ack/Desktop/tox-test$ /home/ack/Desktop/tox-test/.tox/sample/bin/python -m pip freeze >.tox/sample/log/sample-0.log
sample finish: envreport  after 0.47 seconds
sample installed: 
sample start: run-test-pre 
sample run-test-pre: PYTHONHASHSEED='1951728655'
sample finish: run-test-pre  after 0.00 seconds
sample start: run-test 
sample run-test: commands[0] | /home/ack/Desktop/tox-test/.tox/sample/bin/python -c 'import sys; print(sys.argv[1:])' foo bar baz
setting PATH=/home/ack/Desktop/tox-test/.tox/sample/bin:/home/ack/virtualenv/tox/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/home/ack/bin:/home/ack/system/bin:/home/ack/system/bash.d/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin:/home/ack/.local/bin:/home/ack/.cargo/bin:/home/ack/npm/bin:/home/ack/virtualenv/__main__/bin:/home/ack/go/bin
[1628227] /home/ack/Desktop/tox-test$ /home/ack/Desktop/tox-test/.tox/sample/bin/python -c 'import sys; print(sys.argv[1:])' foo bar baz
['foo', 'bar', 'baz']
sample finish: run-test  after 0.01 seconds
sample start: run-test-post 
sample finish: run-test-post  after 0.00 seconds
________________________________________________________________________________________________________________________________________________________________________________________________________________ summary _________________________________________________________________________________________________________________________________________________________________________________________________________________
  sample: commands succeeded
  congratulations :)

Minimal example

The following setup.cfg reproduces the issue:

[globals]
files_list =
    foo
    bar
    baz

[tox:tox]
envlist =
    sample
skipsdist = True

[testenv:sample]
commands =
    {envpython} -c 'import sys; print(sys.argv[1:])' {[globals]files_list}

Changing the definition as follows works with version 4, but is not backwards compatible:

[globals]
files_list =
    foo \
    bar \
    baz

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:documentationhelp:wantedIssues that have been acknowledged, a solution determined and a PR might likely be accepted.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions