Handles version enumeration, comparison, and release-date.txt writing.
| 684 | |
| 685 | |
| 686 | class VersionWriter: |
| 687 | """Handles version enumeration, comparison, and release-date.txt writing.""" |
| 688 | |
| 689 | def __init__(self, changes_file_path: str, changelog_dir: str): |
| 690 | self.changes_file_path = changes_file_path |
| 691 | self.changelog_dir = Path(changelog_dir) |
| 692 | self.parser = ChangesParser(changes_file_path) |
| 693 | |
| 694 | # Fetch release dates from Apache projects JSON |
| 695 | version_dates_raw, _ = ReleaseDate.fetch_release_dates_and_latest() |
| 696 | |
| 697 | # Normalize version keys for consistent lookup (e.g., "3.1" -> "3.1.0") |
| 698 | self.version_dates = {} |
| 699 | for version, date in version_dates_raw.items(): |
| 700 | normalized = self._normalize_version(version) |
| 701 | # Keep the first occurrence (most canonical form) |
| 702 | if normalized not in self.version_dates: |
| 703 | self.version_dates[normalized] = date |
| 704 | |
| 705 | def run(self): |
| 706 | """Execute version comparison and release-date.txt writing.""" |
| 707 | print("Parsing CHANGES.txt for versions...") |
| 708 | self.parser.parse() |
| 709 | |
| 710 | # Extract versions from CHANGES.txt |
| 711 | changes_versions = set(vs.version for vs in self.parser.versions) |
| 712 | print(f"Found {len(changes_versions)} versions in CHANGES.txt") |
| 713 | |
| 714 | # Get existing version folders |
| 715 | existing_folders = self.get_existing_version_folders() |
| 716 | print(f"Found {len(existing_folders)} existing version folders in changelog/") |
| 717 | |
| 718 | # Get versions from solr.json (which is what ReleaseDate fetches) |
| 719 | solr_json_versions = set(self.version_dates.keys()) |
| 720 | print(f"Found {len(solr_json_versions)} versions in solr.json\n") |
| 721 | |
| 722 | # Build normalized version mappings for matching (supports semver like 3.1 == 3.1.0) |
| 723 | changes_normalized = {self._normalize_version(v): v for v in changes_versions} |
| 724 | existing_normalized = {self._normalize_version(v): v for v in existing_folders} |
| 725 | solr_normalized = {self._normalize_version(v): v for v in solr_json_versions} |
| 726 | |
| 727 | # Combine all normalized versions |
| 728 | all_normalized = sorted(set(changes_normalized.keys()) | set(solr_normalized.keys()) | set(existing_normalized.keys()), |
| 729 | key=self._version_sort_key) |
| 730 | |
| 731 | # Print comparison report |
| 732 | self._print_comparison_report(all_normalized, changes_normalized, solr_normalized, existing_normalized) |
| 733 | |
| 734 | # Write release-date.txt for existing folders |
| 735 | self._write_release_dates(existing_normalized) |
| 736 | |
| 737 | def get_existing_version_folders(self) -> set: |
| 738 | """Get all existing vX.Y.Z folders in changelog/.""" |
| 739 | if not self.changelog_dir.exists(): |
| 740 | return set() |
| 741 | |
| 742 | folders = set() |
| 743 | for item in self.changelog_dir.iterdir(): |
no outgoing calls
no test coverage detected
searching dependent graphs…