build: Turn version.py into idiomatic Python

While it's possible to write C code in Python, it's better to actually
write Python code in Python.

Use regular expressions, instead of counting characters, to allow a
little bit more leeway when editing the cairo-version.h header file.

Use a context manager to handle the lifetime of a file object.

Use f-strings instead of the obsolete format() method.
This commit is contained in:
Emmanuele Bassi 2023-01-30 14:31:04 +00:00
parent 365bec1f7d
commit 2be68fb4e0

View file

@ -5,27 +5,49 @@
# Extracts the version from cairo-version.h for the meson build files. # Extracts the version from cairo-version.h for the meson build files.
# #
import os import os
import re
import sys import sys
if __name__ == '__main__':
srcroot = os.path.dirname(__file__) MAJOR_RE = re.compile(
r'^\s*#\s*define\s+CAIRO_VERSION_MAJOR\s+(?P<number>[0-9]+)\s*$',
re.UNICODE)
MINOR_RE = re.compile(
r'^\s*#\s*define\s+CAIRO_VERSION_MINOR\s+(?P<number>[0-9]+)\s*$',
re.UNICODE)
MICRO_RE = re.compile(
r'^\s*#\s*define\s+CAIRO_VERSION_MICRO\s+(?P<number>[0-9]+)\s*$',
re.UNICODE)
version_major = None version_major = None
version_minor = None version_minor = None
version_micro = None version_micro = None
f = open(os.path.join(srcroot, 'src', 'cairo-version.h'), 'r', encoding='utf-8') srcroot = os.path.dirname(__file__)
version_h = os.path.join(srcroot, "src", "cairo-version.h")
with open(version_h, "r", encoding="utf-8") as f:
for line in f: for line in f:
if line.startswith('#define CAIRO_VERSION_MAJOR '): res = MAJOR_RE.match(line)
version_major = line[28:].strip() if res:
if line.startswith('#define CAIRO_VERSION_MINOR '): assert version_major is None
version_minor = line[28:].strip() version_major = res.group('number')
if line.startswith('#define CAIRO_VERSION_MICRO '): continue
version_micro = line[28:].strip() res = MINOR_RE.match(line)
f.close() if res:
assert version_minor is None
version_minor = res.group('number')
continue
res = MICRO_RE.match(line)
if res:
assert version_micro is None
version_micro = res.group('number')
continue
if not (version_major and version_minor and version_micro): if not (version_major and version_minor and version_micro):
print('ERROR: Could not extract cairo version from cairo-version.h in', srcroot, file=sys.stderr) print(f"ERROR: Could not extract version from cairo-version.h in {srcroot}", file=sys.stderr) # noqa
sys.exit(-1) sys.exit(-1)
print('{0}.{1}.{2}'.format(version_major, version_minor, version_micro)) print(f"{version_major}.{version_minor}.{version_micro}")