diff --git a/dev-tools/scripts/smokeTestRelease.py b/dev-tools/scripts/smokeTestRelease.py index 7fbf3c3e47b..ee23c1171aa 100755 --- a/dev-tools/scripts/smokeTestRelease.py +++ b/dev-tools/scripts/smokeTestRelease.py @@ -388,6 +388,60 @@ def testChangelogMd(dir, version): if 'v%s' % version not in content and version not in content: raise RuntimeError('Version %s not found in CHANGELOG.md' % version) + +def testChangelogFolder(dir, version): + "Checks changelog folder structure." + changelog_folder = os.path.join(dir, 'changelog') + + if not os.path.exists(changelog_folder): + raise RuntimeError('changelog folder not found at %s' % changelog_folder) + + print(' check changelog folder structure...') + + # Check that 'unreleased' folder exists and is empty + unreleased_folder = os.path.join(changelog_folder, 'unreleased') + if not os.path.exists(unreleased_folder): + raise RuntimeError('changelog/unreleased folder not found') + + unreleased_contents = os.listdir(unreleased_folder) + # Filter out hidden files like .gitkeep + unreleased_contents = [f for f in unreleased_contents if not f.startswith('.')] + if len(unreleased_contents) > 0: + raise RuntimeError('changelog/unreleased folder is not empty, contains: %s' % unreleased_contents) + + # Pattern to match version folders (e.g., v9.5.0, v10.0.0) + version_pattern = re.compile(r'^v\d+\.\d+\.\d+$') + + # Check all subdirectories in changelog + for entry in os.listdir(changelog_folder): + entry_path = os.path.join(changelog_folder, entry) + + # Skip if not a directory + if not os.path.isdir(entry_path): + continue + + # Skip the unreleased folder (already checked) + if entry == 'unreleased': + continue + + release_date_file = os.path.join(entry_path, 'release-date.txt') + + # Check if this is a version folder (vX.Y.Z format) + if version_pattern.match(entry): + # Version folders for the current release should NOT have release-date.txt + # Only check if this is the version being released + if entry == 'v%s' % version: + if os.path.exists(release_date_file): + raise RuntimeError('changelog/%s folder should not contain release-date.txt (version not yet released)' % entry) + else: + # Other version folders (past releases) should have release-date.txt + if not os.path.exists(release_date_file): + raise RuntimeError('changelog/%s folder is missing release-date.txt' % entry) + else: + # Non-version folders (if any) should also have release-date.txt + if not os.path.exists(release_date_file): + raise RuntimeError('changelog/%s folder is missing release-date.txt' % entry) + reChangesSectionHREF = re.compile('(.*?)', re.IGNORECASE) reUnderbarNotDashHTML = re.compile(r'