diff --git a/common/CI/package_checks.py b/common/CI/package_checks.py index accb1ee5c64..4ee7cd0d1b2 100755 --- a/common/CI/package_checks.py +++ b/common/CI/package_checks.py @@ -8,6 +8,7 @@ import re import subprocess import sys +from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed from dataclasses import dataclass from datetime import datetime, timezone from enum import Enum @@ -440,13 +441,26 @@ class PackageBumped(PullRequestCheck): def run(self) -> List[Result]: commits = self.commits or ['HEAD'] files = set(self.files) & set(self.git.untracked_files() + self.git.modified_files()) - results = [self._check_commit(commit, file) - for commit in commits - for file in self.git.files_in_commit(commit)] - results += [self._check_commit(None, file) - for file in files] - return [result for result in results if result is not None] + results = [] + with ThreadPoolExecutor() as executor: + futures = [] + + # commit-based checks + for commit in commits: + for file in self.git.files_in_commit(commit): + futures.append(executor.submit(self._check_commit, commit, file)) + + # file-based checks + for file in files: + futures.append(executor.submit(self._check_commit, None, file)) + + for future in as_completed(futures): + result = future.result() + if result is not None: + results.append(result) + + return results def _check_commit(self, ref: Optional[str], file: str) -> Optional[Result]: match os.path.basename(file): @@ -849,8 +863,18 @@ def run(self) -> bool: if self.commits: print(f'Checking commits: {", ".join(self.commits)}') - results = [result for check in self.checks - for result in check(self.git, self.files, self.commits, self.base).run()] + with ProcessPoolExecutor() as executor: + futures = [ + executor.submit( + check(self.git, self.files, self.commits, self.base).run + ) + for check in self.checks + ] + + results = [] + for future in as_completed(futures): + results.extend(future.result()) + errors = [r for r in results if r.level == Level.ERROR] warnings = [r for r in results if r.level == Level.WARNING]