# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-FileCopyrightText: 2011-2024 Blender Authors # import pathlib import re import worker.blender class VersionInfo: def __init__(self, builder: worker.blender.CodeBuilder): # Get version information buildinfo_h = builder.build_dir / "source" / "creator" / "buildinfo.h" blender_h = ( builder.blender_dir / "source" / "blender" / "blenkernel" / "BKE_blender_version.h" ) version_number = int(self._parse_header_file(blender_h, "BLENDER_VERSION")) version_number_patch = int( self._parse_header_file(blender_h, "BLENDER_VERSION_PATCH") ) self.major, self.minor, self.patch = ( version_number // 100, version_number % 100, version_number_patch, ) if self.major >= 3: self.short_version = "%d.%d" % (self.major, self.minor) self.version = "%d.%d.%d" % (self.major, self.minor, self.patch) else: self.short_version = "%d.%02d" % (self.major, self.minor) self.version = "%d.%02d.%d" % (self.major, self.minor, self.patch) self.version_cycle = self._parse_header_file(blender_h, "BLENDER_VERSION_CYCLE") if buildinfo_h.exists(): self.hash = self._parse_header_file(buildinfo_h, "BUILD_HASH")[1:-1] else: self.hash = "" self.risk_id = self.version_cycle.replace("release", "stable").replace( "rc", "candidate" ) self.is_development_build = self.version_cycle == "alpha" def _parse_header_file(self, filename: pathlib.Path, define: str) -> str: regex = re.compile(r"^#\s*define\s+%s\s+(.*)" % define) with open(filename, "r") as file: for line in file: match = regex.match(line) if match: return match.group(1) raise BaseException(f"Failed to parse {filename.name} header for {define}")