From 281a594c229034d7aa358d1e85fdac40c7d4a05a Mon Sep 17 00:00:00 2001 From: Alaska Date: Mon, 21 Jul 2025 08:06:29 +0200 Subject: [PATCH] Tools: Small changes for fixes per release script This commit makes a few small changes to the bug fixes per release script: - The main loop is factored out into it's own function, making it easier for external scripts to reuse. - The cached commits file has been renamed to include the range that is cached. This allows multiple caches to be kept for situations where you're collecting a list for both the current release and main. - The Blender 5.0 example has been updated with the 4.5 backport task. Pull Request: https://projects.blender.org/blender/blender/pulls/141867 --- .../bug_fixes_per_major_release.py | 88 ++++++++++++------- 1 file changed, 55 insertions(+), 33 deletions(-) diff --git a/release/release_notes/bug_fixes_per_major_release.py b/release/release_notes/bug_fixes_per_major_release.py index c368801ac5c..4fcbf1c0ceb 100644 --- a/release/release_notes/bug_fixes_per_major_release.py +++ b/release/release_notes/bug_fixes_per_major_release.py @@ -30,7 +30,7 @@ some missing commits), but it's significantly better than nothing. - --backport-tasks (-bpt) (Optional, but recommended) - Here is an example if you wish to collect the list for Blender 5.0 during the Alpha stage of development. - - `python bug_fixes_per_major_release.py -cv 5.0 -pv 4.5 -ct main -pt blender-v4.5-release -bpt 124452 135860` + - `python bug_fixes_per_major_release.py -cv 5.0 -pv 4.5 -ct main -pt blender-v4.5-release -bpt 124452 135860 141871` - Here is an example if you wish to collect the list for Blender 4.5 during the Beta stage of development. - `python bug_fixes_per_major_release.py -cv 4.5 -pv 4.4 -ct blender-v4.5-release -pt blender-v4.4-release -bpt 109399 124452 135860` @@ -193,10 +193,6 @@ OLDER_VERION = "OLDER" NEWER_VERION = "NEWER" SAME_VERION = "SAME" -dir_of_script = Path(__file__).parent.resolve() -PATH_TO_CACHED_COMMITS = dir_of_script.joinpath('cached_commits.json') -del dir_of_script - # Add recent Blender versions to this list, including in-development versions. # This list is used to identify if a version number found in a report is a valid version number. # This is to help eliminate dates and other weird information people put @@ -746,7 +742,7 @@ def classify_commits( # --- -def prepare_for_print(list_of_commits: list[CommitInfo]) -> dict[str, dict[str, list[CommitInfo]]]: +def organize_commits(list_of_commits: list[CommitInfo]) -> dict[str, dict[str, list[CommitInfo]]]: # This function takes in a list of commits, and sorts them based on their classification and module. dict_of_sorted_commits: dict[str, dict[str, list[CommitInfo]]] = {} @@ -802,7 +798,7 @@ def print_list_of_commits(title: str, dict_of_commits: dict[str, list[CommitInfo # --- def print_release_notes(list_of_commits: list[CommitInfo]) -> None: - dict_of_sorted_commits = prepare_for_print(list_of_commits) + dict_of_sorted_commits = organize_commits(list_of_commits) print_list_of_commits("Commits that fixed old issues:", dict_of_sorted_commits[FIXED_OLD_ISSUE]) @@ -847,16 +843,16 @@ def print_release_notes(list_of_commits: list[CommitInfo]) -> None: # ----------------------------------------------------------------------------- # Caching Utilities -def cached_commits_load(list_of_commits: list[CommitInfo]) -> None: - if PATH_TO_CACHED_COMMITS.exists(): - with open(str(PATH_TO_CACHED_COMMITS), 'r', encoding='utf-8') as file: +def cached_commits_load(list_of_commits: list[CommitInfo], path_to_cached_commits: Path) -> None: + if path_to_cached_commits.exists(): + with open(str(path_to_cached_commits), 'r', encoding='utf-8') as file: cached_data = json.load(file) for commit in list_of_commits: if commit.hash in cached_data: commit.read_from_cache(cached_data[commit.hash]) -def cached_commits_store(list_of_commits: list[CommitInfo]) -> None: +def cached_commits_store(list_of_commits: list[CommitInfo], path_to_cached_commits: Path) -> None: # Cache information for commits that have been sorted. # Commits that still need sorting are not cached. # This is done so if a user is repeatably running this script so they can sort @@ -869,7 +865,7 @@ def cached_commits_store(list_of_commits: list[CommitInfo]) -> None: commit_hash, data = commit.prepare_for_cache() data_to_cache[commit_hash] = data - with open(str(PATH_TO_CACHED_COMMITS), 'w', encoding='utf-8') as file: + with open(str(path_to_cached_commits), 'w', encoding='utf-8') as file: json.dump(data_to_cache, file, indent=4) @@ -1044,6 +1040,45 @@ def validate_arguments(args: argparse.Namespace) -> bool: # ----------------------------------------------------------------------------- # Main Function +def gather_and_sort_commits(current_release_tag: str, + current_version: str, + previous_release_tag: str, + previous_version: str, + backport_tasks: list[str], + cache: bool = False, + silence: bool = False, + single_thread: bool = False) -> list[CommitInfo]: + set_crawl_delay() + + dir_of_sciprt = Path(__file__).parent.resolve() + # Replace "/" with "-" to avoid issues with directories in case someone + # uses "remote/branch" as their current or previous tag. + path_to_cached_commits = dir_of_sciprt.joinpath( + f'cached_commits_{previous_release_tag.replace("/", "-")}..{current_release_tag.replace("/", "-")}.json') + + list_of_commits = get_fix_commits( + current_release_tag=current_release_tag, + previous_release_tag=previous_release_tag, + single_thread=single_thread, + ) + + if cache: + cached_commits_load(list_of_commits, path_to_cached_commits) + + overrides_apply(list_of_commits, silence) + + classify_commits( + backport_tasks, + list_of_commits, + current_version=current_version, + previous_version=previous_version, + ) + + if cache: + cached_commits_store(list_of_commits, path_to_cached_commits) + + return list_of_commits + def main() -> int: args = argparse_create().parse_args() @@ -1051,28 +1086,15 @@ def main() -> int: if not validate_arguments(args): return 0 - set_crawl_delay() - - list_of_commits = get_fix_commits( - current_release_tag=args.current_release_tag, - previous_release_tag=args.previous_release_tag, - single_thread=args.single_thread, - ) - - if args.cache: - cached_commits_load(list_of_commits) - - overrides_apply(list_of_commits, args.silence) - - classify_commits( + list_of_commits = gather_and_sort_commits( + args.current_release_tag, + args.current_version, + args.previous_release_tag, + args.previous_version, args.backport_tasks, - list_of_commits, - current_version=args.current_version, - previous_version=args.previous_version, - ) - - if args.cache: - cached_commits_store(list_of_commits) + args.cache, + args.silence, + args.single_thread) print_release_notes(list_of_commits) return 0