diff --git a/AUTHORS b/AUTHORS index 0d2364083..153375dca 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ Ahn Ki-Wook Akiomi Kamakura Alan Velasco Alexander Johnson +Alexander King Alexei Kozlenok Allan Feldman Aly Sivji diff --git a/scripts/prepare-release-pr.py b/scripts/prepare-release-pr.py index 82da553cb..f16e7b962 100644 --- a/scripts/prepare-release-pr.py +++ b/scripts/prepare-release-pr.py @@ -54,8 +54,16 @@ def prepare_release_pr( check_call(["git", "checkout", f"origin/{base_branch}"]) + changelog = Path("changelog") + + features = list(changelog.glob("*.feature.rst")) + breaking = list(changelog.glob("*.breaking.rst")) + is_feature_release = bool(features or breaking) + try: - version = find_next_version(base_branch, is_major, prerelease) + version = find_next_version( + base_branch, is_major, is_feature_release, prerelease + ) except InvalidFeatureRelease as e: print(f"{Fore.RED}{e}") raise SystemExit(1) @@ -80,9 +88,24 @@ def prepare_release_pr( print(f"Branch {Fore.CYAN}{release_branch}{Fore.RESET} created.") + if prerelease: + template_name = "release.pre.rst" + elif is_feature_release: + template_name = "release.minor.rst" + else: + template_name = "release.patch.rst" + # important to use tox here because we have changed branches, so dependencies # might have changed as well - cmdline = ["tox", "-e", "release", "--", version, "--skip-check-links"] + cmdline = [ + "tox", + "-e", + "release", + "--", + version, + template_name, + "--skip-check-links", + ] print("Running", " ".join(cmdline)) run( cmdline, @@ -107,7 +130,9 @@ def prepare_release_pr( print(f"Pull request {Fore.CYAN}{pr.url}{Fore.RESET} created.") -def find_next_version(base_branch: str, is_major: bool, prerelease: str) -> str: +def find_next_version( + base_branch: str, is_major: bool, is_feature_release: bool, prerelease: str +) -> str: output = check_output(["git", "tag"], encoding="UTF-8") valid_versions = [] for v in output.splitlines(): @@ -118,12 +143,6 @@ def find_next_version(base_branch: str, is_major: bool, prerelease: str) -> str: valid_versions.sort() last_version = valid_versions[-1] - changelog = Path("changelog") - - features = list(changelog.glob("*.feature.rst")) - breaking = list(changelog.glob("*.breaking.rst")) - is_feature_release = features or breaking - if is_major: return f"{last_version[0]+1}.0.0{prerelease}" elif is_feature_release: diff --git a/scripts/release.pre.rst b/scripts/release.pre.rst new file mode 100644 index 000000000..f0b054de3 --- /dev/null +++ b/scripts/release.pre.rst @@ -0,0 +1,29 @@ +pytest-{version} +======================================= + +The pytest team is proud to announce the {version} prerelease! + +This is a prerelease, not intended for production use, but to test the upcoming features and improvements +in order to catch any major problems before the final version is released to the major public. + +We appreciate your help testing this out before the final release, making sure to report any +regressions to our issue tracker: + +https://github.com/pytest-dev/pytest/issues + +When doing so, please include the string ``[prerelease]`` in the title. + +You can upgrade from PyPI via: + + pip install pytest=={version} + +Users are encouraged to take a look at the CHANGELOG carefully: + + https://docs.pytest.org/en/stable/changelog.html + +Thanks to all the contributors to this release: + +{contributors} + +Happy testing, +The pytest Development Team diff --git a/scripts/release.py b/scripts/release.py index 090712cbd..27fc68292 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -10,7 +10,7 @@ from colorama import Fore from colorama import init -def announce(version): +def announce(version, template_name): """Generates a new release announcement entry in the docs.""" # Get our list of authors stdout = check_output(["git", "describe", "--abbrev=0", "--tags"]) @@ -22,9 +22,6 @@ def announce(version): contributors = {name for name in stdout.splitlines() if not name.endswith("[bot]")} - template_name = ( - "release.minor.rst" if version.endswith(".0") else "release.patch.rst" - ) template_text = ( Path(__file__).parent.joinpath(template_name).read_text(encoding="UTF-8") ) @@ -81,9 +78,9 @@ def check_links(): check_call(["tox", "-e", "docs-checklinks"]) -def pre_release(version, *, skip_check_links): +def pre_release(version, template_name, *, skip_check_links): """Generates new docs, release announcements and creates a local tag.""" - announce(version) + announce(version, template_name) regen(version) changelog(version, write_out=True) fix_formatting() @@ -108,9 +105,16 @@ def main(): init(autoreset=True) parser = argparse.ArgumentParser() parser.add_argument("version", help="Release version") + parser.add_argument( + "template_name", help="Name of template file to use for release announcement" + ) parser.add_argument("--skip-check-links", action="store_true", default=False) options = parser.parse_args() - pre_release(options.version, skip_check_links=options.skip_check_links) + pre_release( + options.version, + options.template_name, + skip_check_links=options.skip_check_links, + ) if __name__ == "__main__":