get_pkg_version: Fix py3 bytes/str errors

On Python3, this fails with a TypeError because
endswith()/startswith() is being called on bytes,
and only accepts a bytes argument.

Turning on universal_newlines mode makes
check_output return a string rather than bytes.

This is easily hit on platforms where "tox" now
runs by default under Python 3, such as Fedora 25.

Change-Id: Ie3157e847c345e9f65a0db56ead45baa97d6bc81
This commit is contained in:
Eric Harney 2016-12-14 14:14:26 -05:00
parent 62f97ca6f3
commit 37e08b1795
2 changed files with 30 additions and 14 deletions

View File

@ -232,7 +232,9 @@ class Dpkg(Platform):
try:
output = subprocess.check_output(
["dpkg-query", "-W", "-f", "${Package} ${Status} ${Version}\n",
pkg_name], stderr=subprocess.STDOUT).decode('utf-8')
pkg_name],
stderr=subprocess.STDOUT,
universal_newlines=True).decode('utf-8')
except subprocess.CalledProcessError as e:
if (e.returncode == 1 and
(e.output.startswith('dpkg-query: no packages found') or
@ -260,7 +262,9 @@ class Rpm(Platform):
output = subprocess.check_output(
["rpm", "--qf",
"%{NAME} %|EPOCH?{%{EPOCH}:}|%{VERSION}-%{RELEASE}\n", "-q",
pkg_name], stderr=subprocess.STDOUT).decode('utf-8')
pkg_name],
stderr=subprocess.STDOUT,
universal_newlines=True).decode('utf-8')
except subprocess.CalledProcessError as e:
if (e.returncode == 1 and
e.output.strip().endswith('is not installed')):
@ -285,7 +289,8 @@ class Emerge(Platform):
try:
output = subprocess.check_output(
['equery', 'l', '--format=\'$version\'', pkg_name],
stderr=subprocess.STDOUT).decode('utf-8')
stderr=subprocess.STDOUT,
universal_newlines=True).decode('utf-8')
except subprocess.CalledProcessError as e:
if e.returncode == 3:
return None
@ -307,7 +312,8 @@ class Pacman(Platform):
try:
output = subprocess.check_output(
['pacman', '-Q', pkg_name],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
except subprocess.CalledProcessError as e:
if e.returncode == 1 and e.output.endswith('was not found'):
return None

View File

@ -343,7 +343,8 @@ class TestDpkg(TestCase):
mock_checkoutput.assert_called_once_with(
["dpkg-query", "-W", "-f",
"${Package} ${Status} ${Version}\n", "foo"],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
def test_unknown_package(self):
platform = Dpkg()
@ -359,7 +360,8 @@ class TestDpkg(TestCase):
mock_checkoutput.assert_called_once_with(
["dpkg-query", "-W", "-f",
"${Package} ${Status} ${Version}\n", "foo"],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
def test_installed_version(self):
platform = Dpkg()
@ -373,7 +375,8 @@ class TestDpkg(TestCase):
mocked_checkoutput.assert_called_once_with(
["dpkg-query", "-W", "-f",
"${Package} ${Status} ${Version}\n", "foo"],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
class TestEmerge(TestCase):
@ -391,7 +394,8 @@ class TestEmerge(TestCase):
self.assertEqual(None, platform.get_pkg_version("foo"))
mocked_checkoutput.assert_called_once_with(
['equery', 'l', '--format=\'$version\'', 'foo'],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
def test_unknown_package(self):
platform = Emerge()
@ -406,7 +410,8 @@ class TestEmerge(TestCase):
self.assertEqual(None, platform.get_pkg_version("foo"))
mocked_checkoutput.assert_called_once_with(
['equery', 'l', '--format=\'$version\'', 'foo'],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
def test_installed_version(self):
platform = Emerge()
@ -416,7 +421,8 @@ class TestEmerge(TestCase):
self.assertEqual("4.0.0", platform.get_pkg_version("foo"))
mock_checkoutput.assert_called_once_with(
['equery', 'l', '--format=\'$version\'', 'foo'],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
class TestPacman(TestCase):
@ -435,7 +441,8 @@ class TestPacman(TestCase):
self.assertEqual(None, platform.get_pkg_version("foo"))
mock_checkoutput.assert_called_once_with(
['pacman', '-Q', 'foo'],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
self.assertEqual(None, platform.get_pkg_version("foo"))
def test_installed_version(self):
@ -446,7 +453,8 @@ class TestPacman(TestCase):
self.assertEqual("4.0.0-2", platform.get_pkg_version("foo"))
mock_checkoutput.assert_called_once_with(
['pacman', '-Q', 'foo'],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
class TestRpm(TestCase):
@ -469,7 +477,8 @@ class TestRpm(TestCase):
["rpm", "--qf",
"%{NAME} %|EPOCH?{%{EPOCH}:}|%{VERSION}-%{RELEASE}\n", "-q",
"foo"],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
self.assertEqual(None, platform.get_pkg_version("foo"))
def test_installed_version(self):
@ -482,7 +491,8 @@ class TestRpm(TestCase):
["rpm", "--qf",
"%{NAME} %|EPOCH?{%{EPOCH}:}|%{VERSION}-%{RELEASE}\n", "-q",
"foo"],
stderr=subprocess.STDOUT)
stderr=subprocess.STDOUT,
universal_newlines=True)
class TestEval(TestCase):