Fix parsing version of virtualenv

salt 3001 fails on Debian unstable:

```
======================================================================
ERROR: test_thin_dir (unit.utils.test_thin.SSHThinTestCase)
[CPU:0.0%|MEM:69.8%] Test the thin dir to make sure salt-call can run
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/unit/utils/test_thin.py", line 1312, in test_thin_dir
    with VirtualEnv() as venv:
  File "/<<PKGBUILDDIR>>/tests/support/helpers.py", line 1659, in __enter__
    self._create_virtualenv()
  File "/<<PKGBUILDDIR>>/tests/support/helpers.py", line 1718, in _create_virtualenv
    sminion.functions.virtualenv.create(
  File "/<<PKGBUILDDIR>>/salt/modules/virtualenv_mod.py", line 204, in create
    virtualenv_version_info = virtualenv_ver(venv_bin, user=user, **kwargs)
  File "/<<PKGBUILDDIR>>/salt/modules/virtualenv_mod.py", line 60, in virtualenv_ver
    [int(i) for i in version.split("rc")[0].split(".")]
  File "/<<PKGBUILDDIR>>/salt/modules/virtualenv_mod.py", line 60, in <listcomp>
    [int(i) for i in version.split("rc")[0].split(".")]
ValueError: invalid literal for int() with base 10: '23+ds'

----------------------------------------------------------------------
```

The python3-virtualenv package in Debian unstable has version `20.0.23+ds-1`.

Therefore strip the trailing `+ds` from the version before splitting it into
its integer parts.

Also remove duplicate calculation of `virtualenv_version_info`.

Fixes #57734
Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>
This commit is contained in:
Benjamin Drung 2020-06-22 15:01:43 +02:00 committed by Daniel Wozniak
parent 0b3b7835dd
commit d4a391ab5d
2 changed files with 24 additions and 5 deletions

View file

@ -56,9 +56,6 @@ def virtualenv_ver(venv_bin, user=None, **kwargs):
version = getattr(virtualenv, "__version__", None)
if not version:
version = virtualenv.virtualenv_version
virtualenv_version_info = tuple(
[int(i) for i in version.split("rc")[0].split(".")]
)
except ImportError:
# Unable to import?? Let's parse the version from the console
version_cmd = [venv_bin, "--version"]
@ -71,10 +68,12 @@ def virtualenv_ver(venv_bin, user=None, **kwargs):
"Returned data: {1}".format(version_cmd, ret)
)
# 20.0.0 virtualenv changed the --version output. find version number
ver = "".join(
version = "".join(
[x for x in ret["stdout"].strip().split() if re.search(r"^\d.\d*", x)]
)
virtualenv_version_info = tuple([int(i) for i in ver.split("rc")[0].split(".")])
virtualenv_version_info = tuple(
[int(i) for i in re.sub(r"(rc|\+ds).*$", "", version).split(".")]
)
return virtualenv_version_info

View file

@ -391,3 +391,23 @@ class VirtualenvTestCase(TestCase, LoaderModuleMockMixin):
with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock_ver}):
ret = virtualenv_mod.virtualenv_ver(venv_bin="pyenv")
assert ret == expt
def test_issue_57734_debian_package(self):
virtualenv_mock = MagicMock()
virtualenv_mock.__version__ = "20.0.23+ds"
with patch.dict("sys.modules", {"virtualenv": virtualenv_mock}):
ret = virtualenv_mod.virtualenv_ver(venv_bin="pyenv")
self.assertEqual(ret, (20, 0, 23))
def test_issue_57734_debian_package_importerror(self):
with ForceImportErrorOn("virtualenv"):
mock_ver = MagicMock(
return_value={
"retcode": 0,
"stdout": "virtualenv 20.0.23+ds from "
"/usr/lib/python3/dist-packages/virtualenv/__init__.py",
}
)
with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock_ver}):
ret = virtualenv_mod.virtualenv_ver(venv_bin="pyenv")
self.assertEqual(ret, (20, 0, 23))