From aac3e9e7c87b4ff32c1e081fc2a141dee78f86ba Mon Sep 17 00:00:00 2001 From: Kyle Oliver Date: Fri, 28 Nov 2025 03:28:45 -0500 Subject: [PATCH 1/3] chore: 7dad9f1bff1e967b310ac506944085bd6a370b73 -> d7b2c18b9b719c7d31c374918295947d3aaed9d8 --- .cookiecutter.json | 2 +- .cruft.json | 4 ++-- scripts/setup-release.py | 34 ++++++++++++++++++++++++++++++---- scripts/util.py | 18 ++++++++++++++++++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/.cookiecutter.json b/.cookiecutter.json index cc1e1dc..5f96f2f 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -1,5 +1,5 @@ { - "_commit": "7dad9f1bff1e967b310ac506944085bd6a370b73", + "_commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", "_max_python_version_minor_int": 14, "_min_python_version_minor_int": 10, "_template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", diff --git a/.cruft.json b/.cruft.json index 212cb81..ab17f4f 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", - "commit": "7dad9f1bff1e967b310ac506944085bd6a370b73", + "commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", "checkout": null, "context": { "cookiecutter": { @@ -20,7 +20,7 @@ "license": "MIT", "development_status": "Development Status :: 1 - Planning", "_template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", - "_commit": "7dad9f1bff1e967b310ac506944085bd6a370b73", + "_commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", "_min_python_version_minor_int": 10, "_max_python_version_minor_int": 14, "python_versions": [ diff --git a/scripts/setup-release.py b/scripts/setup-release.py index ffde242..6f99e6f 100644 --- a/scripts/setup-release.py +++ b/scripts/setup-release.py @@ -10,6 +10,7 @@ from util import create_release_branch from util import get_bumped_package_version from util import get_package_version +from util import require_clean_and_up_to_date_repo def main() -> None: @@ -20,9 +21,9 @@ def main() -> None: def get_parser() -> argparse.ArgumentParser: - """Creates the argument parser for prepare-release.""" + """Creates the argument parser for setup-release.""" parser: argparse.ArgumentParser = argparse.ArgumentParser( - prog="prepare-release", usage="python ./scripts/prepare-release.py patch" + prog="setup-release", usage="python ./scripts/setup-release.py patch" ) parser.add_argument( "increment", @@ -38,13 +39,26 @@ def get_parser() -> argparse.ArgumentParser: def setup_release(increment: Optional[str] = None) -> None: """Prepares a release of the robust-python-demo package. - Sets up a release branch from the branch develop, bumps the version, and creates a release commit. Does not tag the - release or push any changes. + Will try to create the release and push, however will return to pre-existing state on error. """ check_dependencies(path=REPO_FOLDER, dependencies=["git"]) + require_clean_and_up_to_date_repo() current_version: str = get_package_version() new_version: str = get_bumped_package_version(increment=increment) + try: + _setup_release(increment=increment, current_version=current_version, new_version=new_version) + except Exception as error: + _rollback_release(version=new_version) + raise error + + +def _setup_release(increment: str, current_version: str, new_version: str) -> None: + """Prepares a release of the robust-python-demo package. + + Sets up a release branch from the branch develop, bumps the version, and creates a release commit. Does not tag the + release or push any changes. + """ create_release_branch(new_version=new_version) bump_version(increment=increment) @@ -58,5 +72,17 @@ def setup_release(increment: Optional[str] = None) -> None: subprocess.run(command, cwd=REPO_FOLDER, capture_output=True, check=True) +def _rollback_release(version: str) -> None: + """Rolls back to the pre-existing state on error.""" + commands: list[list[str]] = [ + ["git", "checkout", "develop"], + ["git", "checkout", "."], + ["git", "branch", "-D", f"release/{version}"] + ] + + for command in commands: + subprocess.run(command, cwd=REPO_FOLDER, check=False) + + if __name__ == "__main__": main() diff --git a/scripts/util.py b/scripts/util.py index e09e873..b2b89dc 100644 --- a/scripts/util.py +++ b/scripts/util.py @@ -10,6 +10,8 @@ REPO_FOLDER: Path = Path(__file__).resolve().parent.parent +MAIN_BRANCH: str = "main" +DEVELOP_BRANCH: str = "develop" class MissingDependencyError(Exception): @@ -34,6 +36,22 @@ def check_dependencies(path: Path, dependencies: list[str]) -> None: raise MissingDependencyError(path, dependency) from e +def require_clean_and_up_to_date_repo() -> None: + """Checks if the repo is clean and up to date with any important branches.""" + commands: list[list[str]] = [ + ["git", "fetch"], + ["git", "merge-base", "--is-ancestor", MAIN_BRANCH, f"origin/{MAIN_BRANCH}"], + ["git", "merge-base", "--is-ancestor", f"origin/{MAIN_BRANCH}", MAIN_BRANCH], + ["git", "merge-base", "--is-ancestor", DEVELOP_BRANCH, f"origin/{DEVELOP_BRANCH}"], + ["git", "merge-base", "--is-ancestor", f"origin/{DEVELOP_BRANCH}", DEVELOP_BRANCH], + ["git", "merge-base", "--is-ancestor", MAIN_BRANCH, DEVELOP_BRANCH], + ["git", "status", "--porcelain"], + ] + + for command in commands: + subprocess.run(command, cwd=REPO_FOLDER, check=True) + + def existing_dir(value: str) -> Path: """Responsible for validating argparse inputs and returning them as pathlib Path's if they meet criteria.""" path = Path(value).expanduser().resolve() From 654073335d2fd7cf038a969f2edc1b57f9f40bce Mon Sep 17 00:00:00 2001 From: Kyle Oliver Date: Sun, 30 Nov 2025 02:11:09 -0500 Subject: [PATCH 2/3] chore: d7b2c18b9b719c7d31c374918295947d3aaed9d8 -> 3483e9e38f95d0437dc803cfd09db2050ab10194 --- .cookiecutter.json | 2 +- .cruft.json | 4 ++-- scripts/setup-release.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.cookiecutter.json b/.cookiecutter.json index 5f96f2f..2100bab 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -1,5 +1,5 @@ { - "_commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", + "_commit": "3483e9e38f95d0437dc803cfd09db2050ab10194", "_max_python_version_minor_int": 14, "_min_python_version_minor_int": 10, "_template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", diff --git a/.cruft.json b/.cruft.json index ab17f4f..71b9519 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", - "commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", + "commit": "3483e9e38f95d0437dc803cfd09db2050ab10194", "checkout": null, "context": { "cookiecutter": { @@ -20,7 +20,7 @@ "license": "MIT", "development_status": "Development Status :: 1 - Planning", "_template": "C:\\Users\\56kyl\\source\\repos\\cookiecutter-robust-python", - "_commit": "d7b2c18b9b719c7d31c374918295947d3aaed9d8", + "_commit": "3483e9e38f95d0437dc803cfd09db2050ab10194", "_min_python_version_minor_int": 10, "_max_python_version_minor_int": 14, "python_versions": [ diff --git a/scripts/setup-release.py b/scripts/setup-release.py index 6f99e6f..3f78510 100644 --- a/scripts/setup-release.py +++ b/scripts/setup-release.py @@ -77,7 +77,7 @@ def _rollback_release(version: str) -> None: commands: list[list[str]] = [ ["git", "checkout", "develop"], ["git", "checkout", "."], - ["git", "branch", "-D", f"release/{version}"] + ["git", "branch", "-D", f"release/{version}"], ] for command in commands: From f9bff4eab5de61000e0929f1595ee0f3000c23d9 Mon Sep 17 00:00:00 2001 From: Kyle Oliver Date: Mon, 1 Dec 2025 02:10:56 -0500 Subject: [PATCH 3/3] =?UTF-8?q?bump:=20version=200.38.0=20=E2=86=92=200.39?= =?UTF-8?q?.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3760b81..482cb85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## v0.39.0 (2025-12-01) + ## v0.38.0 (2025-11-24) ## v0.37.0 (2025-11-24) diff --git a/pyproject.toml b/pyproject.toml index a5e88e2..73e0532 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "robust-python-demo" -version = "0.38.0" +version = "0.39.0" description = "robust-python-demo" authors = [ { name = "Kyle Oliver", email = "56kyleoliver+cookiecutter-robust-python@gmail.com" }, diff --git a/uv.lock b/uv.lock index b5cd0b9..c0ae811 100644 --- a/uv.lock +++ b/uv.lock @@ -1004,7 +1004,7 @@ wheels = [ [[package]] name = "robust-python-demo" -version = "0.38.0" +version = "0.39.0" source = { editable = "." } dependencies = [ { name = "loguru" },