2026-01-04 20:37:30 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
"""
|
|
|
|
|
Generiert Windows-Versionsinformationen für PyInstaller
|
|
|
|
|
|
|
|
|
|
Liest Version aus pyproject.toml und erstellt version_info.txt
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import tomllib
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_version(version_str: str) -> tuple[int, int, int, int]:
|
|
|
|
|
"""Parst Version-String (z.B. '0.1.0') zu Tuple (0, 1, 0, 0)."""
|
|
|
|
|
parts = version_str.split('.')
|
|
|
|
|
major = int(parts[0]) if len(parts) > 0 else 0
|
|
|
|
|
minor = int(parts[1]) if len(parts) > 1 else 0
|
|
|
|
|
patch = int(parts[2]) if len(parts) > 2 else 0
|
|
|
|
|
build = 0 # Könnte aus Git-Commit-Count generiert werden
|
|
|
|
|
return (major, minor, patch, build)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_version_info(project_root: Path):
|
|
|
|
|
"""Erstellt version_info.txt für PyInstaller."""
|
|
|
|
|
|
|
|
|
|
# pyproject.toml lesen
|
|
|
|
|
pyproject_path = project_root / "pyproject.toml"
|
|
|
|
|
with open(pyproject_path, 'rb') as f:
|
|
|
|
|
pyproject = tomllib.load(f)
|
|
|
|
|
|
|
|
|
|
project = pyproject['project']
|
|
|
|
|
version = project['version']
|
|
|
|
|
name = project['name']
|
|
|
|
|
description = project['description']
|
|
|
|
|
|
|
|
|
|
# Version parsen
|
|
|
|
|
file_version = parse_version(version)
|
|
|
|
|
product_version = file_version
|
|
|
|
|
|
|
|
|
|
# Jahr für Copyright
|
|
|
|
|
year = datetime.now().year
|
|
|
|
|
|
|
|
|
|
# version_info.txt Content
|
|
|
|
|
version_info_content = f"""# UTF-8
|
|
|
|
|
#
|
|
|
|
|
# Generiert automatisch von create_version_info.py
|
|
|
|
|
# NICHT manuell bearbeiten!
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
VSVersionInfo(
|
|
|
|
|
ffi=FixedFileInfo(
|
|
|
|
|
# filevers und prodvers als Tuple: (1, 0, 0, 0)
|
|
|
|
|
filevers={file_version},
|
|
|
|
|
prodvers={product_version},
|
|
|
|
|
# Maske für gültige Bits in filevers und prodvers
|
|
|
|
|
mask=0x3f,
|
|
|
|
|
# Flags - kann VS_FF_DEBUG, VS_FF_PRERELEASE, etc. enthalten
|
|
|
|
|
flags=0x0,
|
|
|
|
|
# Betriebssystem - VOS_NT_WINDOWS32
|
|
|
|
|
OS=0x40004,
|
|
|
|
|
# Dateityp - VFT_APP (Anwendung)
|
|
|
|
|
fileType=0x1,
|
|
|
|
|
# Subtyp (nicht verwendet für VFT_APP)
|
|
|
|
|
subtype=0x0,
|
|
|
|
|
# Datumsstempel
|
|
|
|
|
date=(0, 0)
|
|
|
|
|
),
|
|
|
|
|
kids=[
|
|
|
|
|
StringFileInfo(
|
|
|
|
|
[
|
|
|
|
|
StringTable(
|
|
|
|
|
'040904B0', # Deutsch (0x0409 = Englisch, 0x0407 = Deutsch), Unicode
|
2026-02-15 19:51:58 +01:00
|
|
|
[StringStruct('CompanyName', 'Vitali Graf / Software- und Datenbankentwicklung'),
|
2026-01-04 20:37:30 +01:00
|
|
|
StringStruct('FileDescription', '{description}'),
|
|
|
|
|
StringStruct('FileVersion', '{version}'),
|
|
|
|
|
StringStruct('InternalName', '{name}'),
|
2026-02-15 19:51:58 +01:00
|
|
|
StringStruct('LegalCopyright', '© {year} Vitali Graf. Alle Rechte vorbehalten.'),
|
2026-01-04 20:37:30 +01:00
|
|
|
StringStruct('OriginalFilename', '{name}.exe'),
|
|
|
|
|
StringStruct('ProductName', '{name}'),
|
|
|
|
|
StringStruct('ProductVersion', '{version}')])
|
|
|
|
|
]),
|
|
|
|
|
VarFileInfo([VarStruct('Translation', [1033, 1200])]) # Englisch, Unicode
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# version_info.txt schreiben
|
|
|
|
|
version_info_path = project_root / "version_info.txt"
|
|
|
|
|
version_info_path.write_text(version_info_content, encoding='utf-8')
|
|
|
|
|
|
2026-02-15 19:51:58 +01:00
|
|
|
print("✓ version_info.txt erstellt")
|
2026-01-04 20:37:30 +01:00
|
|
|
print(f" Version: {version}")
|
|
|
|
|
print(f" Datei: {version_info_path}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
project_root = Path(__file__).parent
|
|
|
|
|
create_version_info(project_root)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|