diff --git a/pugetbench/pugetbench.py b/pugetbench/pugetbench.py index 56dce4f..f649712 100644 --- a/pugetbench/pugetbench.py +++ b/pugetbench/pugetbench.py @@ -8,7 +8,7 @@ from argparse import ArgumentParser import time from subprocess import Popen, PIPE import threading -from utils import find_latest_log, find_score_in_log, get_photoshop_version, get_premierepro_version, get_lightroom_version, get_aftereffects_version, get_davinci_version, get_pugetbench_version, get_latest_benchmark_by_version +from utils import find_latest_log, trim_to_major_minor, find_score_in_log, get_photoshop_version, get_premierepro_version, get_lightroom_version, get_aftereffects_version, get_davinci_version, get_pugetbench_version, get_latest_benchmark_by_version sys.path.insert(1, os.path.join(sys.path[0], "..")) from harness_utils.process import terminate_processes @@ -33,7 +33,6 @@ logging.getLogger('').addHandler(console) EXECUTABLE_NAME = "PugetBench for Creators.exe" - def read_output(stream, log_func, error_func, error_in_output): """Read and log output in real-time from a stream (stdout or stderr).""" while True: @@ -64,6 +63,9 @@ def run_benchmark(application: str, app_version: str, benchmark_version: str): start_time = time.time() executable_path = Path( f"C:\\Program Files\\PugetBench for Creators\\{EXECUTABLE_NAME}") + if not executable_path.exists(): + logging.error(f"PugetBench executable not found at {executable_path}") + sys.exit(1) command_args = ["--run_count", "1", "--rerun_count", "1", "--benchmark_version", f"{benchmark_version}", "--preset", "Standard", "--app_version", f"{app_version}"] @@ -137,32 +139,47 @@ def main(): version = args.app_version score = 0 - full_version = None - trimmed_version = None + full_version = version + trimmed_version = trim_to_major_minor(version) test = "" if args.app == "premierepro": test = "Adobe Premiere Pro" if version is None: full_version, trimmed_version = get_premierepro_version() + if full_version is None or trimmed_version is None: + logging.error("Could not determine Premiere Pro version. Is it installed?") + sys.exit(1) elif args.app == "photoshop": test = "Adobe Photoshop" if version is None: full_version, trimmed_version = get_photoshop_version() + if full_version is None or trimmed_version is None: + logging.error("Could not determine Photoshop version. Is it installed?") + sys.exit(1) elif args.app == "aftereffects": test = "Adobe After Effects" if version is None: full_version, trimmed_version = get_aftereffects_version() + if full_version is None or trimmed_version is None: + logging.error("Could not determine After Effects version. Is it installed?") + sys.exit(1) elif args.app == "lightroom": test = "Adobe Lightroom Classic" if version is None: full_version, trimmed_version = get_lightroom_version() + if full_version is None or trimmed_version is None: + logging.error("Could not determine Lightroom version. Is it installed?") + sys.exit(1) elif args.app == "resolve": test = "Davinci Resolve Studio" if version is None: full_version, trimmed_version = get_davinci_version() - if full_version and trimmed_version: - full_version += "-studio" - trimmed_version += "-studio" + if full_version is None or trimmed_version is None: + logging.error("Could not determine Resolve Studio version. Is it installed?") + sys.exit(1) + full_version += "-studio" + trimmed_version += "-studio" + try: start_time, end_time = run_benchmark( diff --git a/pugetbench/utils.py b/pugetbench/utils.py index ffbe28b..4ef46d5 100644 --- a/pugetbench/utils.py +++ b/pugetbench/utils.py @@ -5,6 +5,21 @@ from pathlib import Path import win32api import csv +def trim_to_major_minor(version: str | None) -> str | None: + if version is None: + return None + # Match major.minor at the start + match = re.match(r"(\d+)\.(\d+)", version) + if not match: + return version # fallback if unrecognized + + major_minor = f"{match.group(1)}.{match.group(2)}" + + # Preserve -beta suffix if present + if "-beta" in version: + major_minor += "-beta" + + return major_minor def get_latest_benchmark_by_version(benchmark_name: str): """Get the latest benchmark version, prioritizing beta if it's newer.""" @@ -42,8 +57,14 @@ def get_latest_benchmark_by_version(benchmark_name: str): if not versions: raise ValueError("No valid benchmark versions found after parsing.") - # Sort versions (beta will automatically come last if sorted lexicographically) - versions.sort(reverse=True) + # Sort numerically, with releases before beta + def version_key(v: str): + main, *suffix = v.split("-") + nums = tuple(int(x) for x in main.split(".")) + beta_flag = 1 if "-beta" in v else 0 + return nums, -beta_flag # release first + + versions.sort(key=version_key, reverse=True) # Return the latest version return versions[0] @@ -56,8 +77,7 @@ def find_latest_log(): files = [os.path.join(puget_lunch_dir, file) for file in os.listdir( puget_lunch_dir) if os.path.isfile(os.path.join(puget_lunch_dir, file))] latest_file = max(files, key=os.path.getmtime) - script_dir = os.path.dirname(os.path.realpath(__file__)) - return Path(script_dir) / latest_file + return Path(latest_file) def find_score_in_log(log_path): @@ -105,7 +125,7 @@ def get_photoshop_version() -> tuple[str, str]: # Check if Adobe folder exists if not os.path.exists(base_path): print("Adobe directory not found.") - return None + return None, None # Look for Adobe Photoshop folders possible_versions = sorted( @@ -124,8 +144,7 @@ def get_photoshop_version() -> tuple[str, str]: full_version = win32api.GetFileVersionInfo(exe_path, str_info_path) # Trim to major.minor - parts = full_version.split(".") - major_minor = ".".join(parts[:2]) if len(parts) >= 2 else full_version + major_minor = trim_to_major_minor(full_version) return full_version, major_minor except Exception as e: @@ -140,7 +159,7 @@ def get_aftereffects_version() -> tuple[str, str]: # Check if Adobe folder exists if not os.path.exists(base_path): print("Adobe directory not found.") - return None + return None, None # Look for After Effects folders (including Beta) possible_versions = sorted( @@ -165,8 +184,7 @@ def get_aftereffects_version() -> tuple[str, str]: full_version = str(win32api.GetFileVersionInfo(exe_path, str_info_path)) # Trim to major.minor - parts = full_version.split(".") - major_minor = ".".join(parts[:2]) if len(parts) >= 2 else full_version + major_minor = trim_to_major_minor(full_version) return full_version, major_minor except Exception as e: @@ -182,7 +200,7 @@ def get_premierepro_version() -> tuple[str, str]: # Check if Adobe folder exists if not os.path.exists(base_path): print("Adobe directory not found.") - return None + return None, None # Look for Adobe Premiere Pro folders possible_versions = sorted( @@ -201,8 +219,7 @@ def get_premierepro_version() -> tuple[str, str]: full_version = win32api.GetFileVersionInfo(exe_path, str_info_path) # Trim to major.minor - parts = full_version.split(".") - major_minor = ".".join(parts[:2]) if len(parts) >= 2 else full_version + major_minor = trim_to_major_minor(full_version) return full_version, major_minor except Exception as e: @@ -217,7 +234,7 @@ def get_lightroom_version() -> tuple[str, str]: # Check if Adobe folder exists if not os.path.exists(base_path): print("Adobe directory not found.") - return None + return None, None # Look for Adobe Lightroom Classic folders possible_versions = sorted( @@ -236,8 +253,7 @@ def get_lightroom_version() -> tuple[str, str]: full_version = win32api.GetFileVersionInfo(exe_path, str_info_path) # Trim to major.minor - parts = full_version.split(".") - major_minor = ".".join(parts[:2]) if len(parts) >= 2 else full_version + major_minor = trim_to_major_minor(full_version) return full_version, major_minor except Exception as e: @@ -261,8 +277,7 @@ def get_davinci_version() -> tuple[str, str]: full_version = win32api.GetFileVersionInfo(path, str_info_path) # Trim to major.minor - parts = full_version.split(".") - major_minor = ".".join(parts[:2]) if len(parts) >= 2 else full_version + major_minor = trim_to_major_minor(full_version) return full_version, major_minor