Bump minimum version of python to 3.9 (#40711)

This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-02-18 13:33:29 +01:00
committed by GitHub
9 changed files with 19 additions and 36 deletions
+1 -1
View File
@@ -47,7 +47,7 @@ jobs:
# older glibc
- env: { COMPILER: "gcc", COMPILER_VERSION: "12", LINKER: "bfd", CUSTOM_PYTHON: "1" }
runner: [ ubuntu-22.04 ]
python-version: '3.7'
python-version: '3.9'
env: ${{ matrix.env }}
steps:
- name: Repository checkout
+1 -1
View File
@@ -247,7 +247,7 @@ REQUIREMENTS:
gperf
docbook-xsl (optional, required for documentation)
xsltproc (optional, required for documentation)
python >= 3.7 (required by meson too, >= 3.9 is required for ukify)
python >= 3.9
python-jinja2
python-pefile (optional, required for ukify)
python-lxml (optional, required to build the indices)
+1 -2
View File
@@ -17,8 +17,7 @@ def read_os_release():
line = line.rstrip()
if not line or line.startswith('#'):
continue
m = re.match(r'([A-Z][A-Z_0-9]+)=(.*)', line)
if m:
if m := re.match(r'([A-Z][A-Z_0-9]+)=(.*)', line):
name, val = m.groups()
if val and val[0] in '"\'':
val = ast.literal_eval(val)
+4 -4
View File
@@ -1695,7 +1695,9 @@ conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', want_slow_tests)
pymod = import('python')
python = pymod.find_installation('python3', required : true, modules : ['jinja2'])
python_39 = python.language_version().version_compare('>=3.9')
if not python.language_version().version_compare('>=3.9')
error('Python >= 3.9 is required')
endif
#####################################################################
@@ -1896,9 +1898,7 @@ if have and efi_arch == 'x64' and cc.links('''
efi_cpu_family_alt = 'x86'
endif
pefile = pymod.find_installation('python3', required: false, modules : ['pefile'])
want_ukify = get_option('ukify').require(python_39 and (want_tests != 'true' or pefile.found()), error_message : 'Python >= 3.9 and pefile required').allowed()
want_ukify = pymod.find_installation('python3', required: get_option('ukify'), modules : ['pefile']).found()
conf.set10('ENABLE_UKIFY', want_ukify)
#####################################################################
+1 -6
View File
@@ -1,11 +1,6 @@
target-version = "py37"
target-version = "py39"
line-length = 109
lint.select = ["E", "F", "I", "UP"]
[format]
quote-style = "single"
[per-file-target-version]
"src/ukify/*.py" = "py39"
"test/**/integration-test-wrapper.py" = "py39"
"test/test-udev.py" = "py39"
+2 -2
View File
@@ -308,7 +308,7 @@ def generate_fs_in_group():
print(' switch (fs_group) {')
for name, _, *filesystems in FILESYSTEM_SETS:
magics = sorted(set(sum((NAME_TO_MAGIC[fs] for fs in filesystems), [])))
magics = sorted(set(sum((NAME_TO_MAGIC[fs] for fs in filesystems), start=[])))
enum = 'FILESYSTEM_SET_' + name[1:].upper().replace('-', '_')
print(f' case {enum}:')
opts = '\n || '.join(f'F_TYPE_EQUAL(st->f_type, {magic})'
@@ -355,7 +355,7 @@ def magic_defines():
def check():
kernel_magics = set(magic_defines())
our_magics = set(sum(NAME_TO_MAGIC.values(), []))
our_magics = set(sum(NAME_TO_MAGIC.values(), start=[]))
extra = kernel_magics - our_magics
if extra:
sys.exit(f"kernel knows additional filesystem magics: {', '.join(sorted(extra))}")
+5 -8
View File
@@ -7,7 +7,6 @@
import re
import sys
import typing
def print_usage_and_exit() -> None:
@@ -27,7 +26,7 @@ if output not in ['code', 'doc']:
with open(header) as file:
inEnum = False
enumValues: typing.List[str] = []
enumValues: list[str] = []
enumName = ''
if output == 'doc':
@@ -68,12 +67,10 @@ with open(header) as file:
match = re.fullmatch(r'(\w+)\b,', line)
if match and len(match.groups()) > 0 and not match[1].startswith('__'):
enumValues.append(match[1])
else:
match = re.match(r'^\s*enum\s+bpf_(cmd|map_type|prog_type|attach_type)+\s*{', line)
if match:
# Start of a new enum
inEnum = True
enumName = 'bpf_delegate_' + match[1]
elif match := re.match(r'^\s*enum\s+bpf_(cmd|map_type|prog_type|attach_type)+\s*{', line):
# Start of a new enum
inEnum = True
enumName = 'bpf_delegate_' + match[1]
if output == 'doc':
print('</para>')
+1 -1
View File
@@ -17,6 +17,7 @@
# removes the device node. After creation and removal the result is checked
# against the expected value and the result is printed.
import dataclasses
import functools
import os
import pwd, grp
@@ -30,7 +31,6 @@ from pathlib import Path
from typing import Callable, Optional
try:
import dataclasses # requires Python >= 3.7
import pytest
except ImportError as e:
print(str(e), file=sys.stderr)
+3 -11
View File
@@ -19,11 +19,6 @@ try:
except ImportError as e:
shlex_join = e
try:
from shlex import quote as shlex_quote
except ImportError as e:
shlex_quote = e
class NoCommand(Exception):
pass
@@ -214,10 +209,7 @@ def subst_output(document, programlisting, stats, missing_version):
interface = programlisting.get('interface')
argv = [f'{arguments.build_dir}/{executable}', f'--bus-introspect={interface}']
if isinstance(shlex_join, Exception):
print(f'COMMAND: {" ".join(shlex_quote(arg) for arg in argv)}')
else:
print(f'COMMAND: {shlex_join(argv)}')
print(f'COMMAND: {shlex_join(argv)}')
try:
out = subprocess.check_output(argv, universal_newlines=True)
@@ -326,7 +318,7 @@ def main():
global arguments
arguments = parse_args()
for item in (etree, shlex_quote):
for item in (etree, shlex_join):
if isinstance(item, Exception):
print(item, file=sys.stderr)
sys.exit(77 if arguments.test else 1)
@@ -348,7 +340,7 @@ def main():
# Let's print all statistics at the end
mlen = max(len(page) for page in stats)
total = sum((item['stats'] for item in stats.values()), collections.Counter())
total = sum((item['stats'] for item in stats.values()), start=collections.Counter())
total = 'total', { "stats" : total, "modified" : False }
modified = []
classification = 'OUTDATED' if arguments.test else 'MODIFIED'