mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-20 05:51:18 +02:00
dev-lang/python-oem: add support for /etc/os-release
Pulled upstream patch from http://bugs.python.org/issue17762.
This commit is contained in:
parent
5ab02e5b4c
commit
a05582634d
@ -0,0 +1,133 @@
|
|||||||
|
diff -r 12bf7fc1ba76 Lib/platform.py
|
||||||
|
--- a/Lib/platform.py Tue Oct 22 20:03:47 2013 +0100
|
||||||
|
+++ b/Lib/platform.py Sat Nov 02 22:56:46 2013 +0200
|
||||||
|
@@ -241,6 +241,8 @@
|
||||||
|
|
||||||
|
return distname,version,id
|
||||||
|
|
||||||
|
+_os_release_fields = re.compile(r'(?!#)(?P<key>.+)=(?P<quote>[\'\"]?)(?P<value>.+)(?P=quote)$')
|
||||||
|
+_os_release_unescape = re.compile(r'\\(?P<escaped>[\'\"\\])')
|
||||||
|
_release_filename = re.compile(r'(\w+)[-_](release|version)')
|
||||||
|
_lsb_release_version = re.compile(r'(.+)'
|
||||||
|
' release '
|
||||||
|
@@ -251,10 +253,13 @@
|
||||||
|
'([\d.]+)'
|
||||||
|
'[^(]*(?:\((.+)\))?')
|
||||||
|
|
||||||
|
+_UNIXCONFDIR = '/etc'
|
||||||
|
+
|
||||||
|
# See also http://www.novell.com/coolsolutions/feature/11251.html
|
||||||
|
# and http://linuxmafia.com/faq/Admin/release-files.html
|
||||||
|
# and http://data.linux-ntfs.org/rpm/whichrpm
|
||||||
|
# and http://www.die.net/doc/linux/man/man1/lsb_release.1.html
|
||||||
|
+# http://www.freedesktop.org/software/systemd/man/os-release.html
|
||||||
|
|
||||||
|
_supported_dists = (
|
||||||
|
'SuSE', 'debian', 'fedora', 'redhat', 'centos',
|
||||||
|
@@ -288,6 +293,20 @@
|
||||||
|
id = l[1]
|
||||||
|
return '', version, id
|
||||||
|
|
||||||
|
+def _parse_os_release():
|
||||||
|
+ try:
|
||||||
|
+ with open(os.path.join(_UNIXCONFDIR, 'os-release')) as f:
|
||||||
|
+ info = {}
|
||||||
|
+ for line in f:
|
||||||
|
+ m = re.match(_os_release_fields, line)
|
||||||
|
+ if m is not None:
|
||||||
|
+ key = m.group('key')
|
||||||
|
+ value = re.sub(_os_release_unescape, r'\g<escaped>', m.group('value'))
|
||||||
|
+ info[key] = value
|
||||||
|
+ return info
|
||||||
|
+ except OSError:
|
||||||
|
+ return None
|
||||||
|
+
|
||||||
|
def linux_distribution(distname='', version='', id='',
|
||||||
|
|
||||||
|
supported_dists=_supported_dists,
|
||||||
|
@@ -295,9 +314,9 @@
|
||||||
|
|
||||||
|
""" Tries to determine the name of the Linux OS distribution name.
|
||||||
|
|
||||||
|
- The function first looks for a distribution release file in
|
||||||
|
- /etc and then reverts to _dist_try_harder() in case no
|
||||||
|
- suitable files are found.
|
||||||
|
+ The function first checks for an /etc/os-release file, then
|
||||||
|
+ looks for a distribution release file in /etc and then reverts
|
||||||
|
+ to _dist_try_harder() in case no suitable files are found.
|
||||||
|
|
||||||
|
supported_dists may be given to define the set of Linux
|
||||||
|
distributions to look for. It defaults to a list of currently
|
||||||
|
@@ -316,7 +335,18 @@
|
||||||
|
etc = os.listdir('/etc')
|
||||||
|
except os.error:
|
||||||
|
# Probably not a Unix system
|
||||||
|
- return distname,version,id
|
||||||
|
+ return distname, version, id
|
||||||
|
+
|
||||||
|
+ os_release_info = _parse_os_release()
|
||||||
|
+ if os_release_info is not None:
|
||||||
|
+ if 'NAME' in os_release_info:
|
||||||
|
+ distname = os_release_info['NAME']
|
||||||
|
+ if 'VERSION_ID' in os_release_info:
|
||||||
|
+ version = os_release_info['VERSION_ID']
|
||||||
|
+ if 'ID' in os_release_info:
|
||||||
|
+ id = os_release_info['ID']
|
||||||
|
+ return distname, version, id
|
||||||
|
+
|
||||||
|
etc.sort()
|
||||||
|
for file in etc:
|
||||||
|
m = _release_filename.match(file)
|
||||||
|
diff -r 12bf7fc1ba76 Lib/test/test_platform.py
|
||||||
|
--- a/Lib/test/test_platform.py Tue Oct 22 20:03:47 2013 +0100
|
||||||
|
+++ b/Lib/test/test_platform.py Sat Nov 02 22:56:46 2013 +0200
|
||||||
|
@@ -3,8 +3,10 @@
|
||||||
|
import unittest
|
||||||
|
import platform
|
||||||
|
import subprocess
|
||||||
|
+import tempfile
|
||||||
|
|
||||||
|
from test import test_support
|
||||||
|
+from unittest.mock import patch
|
||||||
|
|
||||||
|
class PlatformTest(unittest.TestCase):
|
||||||
|
def test_architecture(self):
|
||||||
|
@@ -257,6 +259,38 @@
|
||||||
|
):
|
||||||
|
self.assertEqual(platform._parse_release_file(input), output)
|
||||||
|
|
||||||
|
+ def test_parse_os_release(self):
|
||||||
|
+ # various os-release contents and expected output
|
||||||
|
+ expected = {
|
||||||
|
+ 'NAME=Fedora\nVERSION_ID="17"\nID=fedora': {
|
||||||
|
+ 'NAME': 'Fedora',
|
||||||
|
+ 'VERSION_ID': '17',
|
||||||
|
+ 'ID': 'fedora'
|
||||||
|
+ },
|
||||||
|
+ 'NAME="Aimée\\\'s "Distro""\nID=\'aiméesdistro\'\nVERSION_ID=1\n': {
|
||||||
|
+ 'NAME': "Aimée's \"Distro\"",
|
||||||
|
+ 'VERSION_ID': '1',
|
||||||
|
+ 'ID': 'aiméesdistro'
|
||||||
|
+ },
|
||||||
|
+ 'NAME="SchrödingerLinux"\n#Some comment here:)\n'
|
||||||
|
+ 'ID=schrödingerlinux\nVERSION_ID=3.21\nPRETTY_NAME="SchrödingerOS"': {
|
||||||
|
+ 'NAME': 'SchrödingerLinux',
|
||||||
|
+ 'VERSION_ID': '3.21',
|
||||||
|
+ 'ID': 'schrödingerlinux',
|
||||||
|
+ 'PRETTY_NAME': 'SchrödingerOS'
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ with tempfile.TemporaryDirectory() as d:
|
||||||
|
+ with patch('platform._UNIXCONFDIR', d):
|
||||||
|
+ # test that return value is None if /etc/os-release doesn't exist
|
||||||
|
+ self.assertEqual(platform._parse_os_release(), None)
|
||||||
|
+
|
||||||
|
+ # test behavior for inputs above
|
||||||
|
+ for input, output in expected.items():
|
||||||
|
+ with open(os.path.join(d, 'os-release'), mode='w', encoding='utf-8') as f:
|
||||||
|
+ f.write(input)
|
||||||
|
+ self.assertEqual(platform._parse_os_release(), output)
|
||||||
|
+
|
||||||
|
|
||||||
|
def test_main():
|
||||||
|
test_support.run_unittest(
|
@ -47,6 +47,9 @@ src_prepare() {
|
|||||||
# Fix for cross-compiling.
|
# Fix for cross-compiling.
|
||||||
epatch "${FILESDIR}/python-2.7.5-nonfatal-compileall.patch"
|
epatch "${FILESDIR}/python-2.7.5-nonfatal-compileall.patch"
|
||||||
|
|
||||||
|
# Fix for linux_distribution()
|
||||||
|
epatch "${FILESDIR}/python-2.7.6-add_os_release_support.patch"
|
||||||
|
|
||||||
sed -i -e "s:@@GENTOO_LIBDIR@@:$(get_libdir):g" \
|
sed -i -e "s:@@GENTOO_LIBDIR@@:$(get_libdir):g" \
|
||||||
Lib/distutils/command/install.py \
|
Lib/distutils/command/install.py \
|
||||||
Lib/distutils/sysconfig.py \
|
Lib/distutils/sysconfig.py \
|
Loading…
x
Reference in New Issue
Block a user