From 52fcdc4b09cb39302549598cac50311fcc67f49a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 17 Nov 2023 15:41:43 -0800 Subject: [PATCH] aider: Add Git checks before version bumping. # Aider chat conversation: USER: before changing the repo, check that we are on the main branch, check that the working dir is not dirty, fetch the latest changes from origin and confirm that the main branch is up to date (don't merge it though). if any of these fail, exit with an error. ASSISTANT: To implement these checks in the `scripts/versionbump.py` file, we will need to add the necessary Git operations before proceeding with the version bumping logic. Here are the steps we will follow: 1. Import the `sys` module to exit the script with an error if needed. 2. Add a function to check the current Git branch and ensure it is 'main'. 3. Add a function to check if the working directory is clean. 4. Add a function to fetch the latest changes from the origin and check if the 'main' branch is up to date. 5. Call these functions at the beginning of the `main()` function. Here are the *SEARCH/REPLACE* blocks for the changes: scripts/versionbump.py ```python <<<<<<< SEARCH import argparse import re import subprocess ======= import argparse import re import subprocess import sys >>>>>>> REPLACE ``` scripts/versionbump.py ```python <<<<<<< SEARCH args = parser.parse_args() dry_run = args.dry_run ======= # Function to check if we are on the main branch def check_branch(): branch = subprocess.run(["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True).stdout.strip() if branch != "main": print("Error: Not on the main branch.") sys.exit(1) # Function to check if the working directory is clean def check_working_directory_clean(): status = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True).stdout if status: print("Error: Working directory is not clean.") sys.exit(1) # Function to fetch the latest changes and check if the main branch is up to date def check_main_branch_up_to_date(): subprocess.run(["git", "fetch", "origin"], check=True) local_main = subprocess.run(["git", "rev-parse", "main"], capture_output=True, text=True).stdout.strip() origin_main = subprocess.run(["git", "rev-parse", "origin/main"], capture_output=True, text=True).stdout.strip() if local_main != origin_main: print("Error: The main branch is not up to date with origin/main.") sys.exit(1) args = parser.parse_args() dry_run = args.dry_run # Perform checks before proceeding check_branch() check_working_directory_clean() check_main_branch_up_to_date() >>>>>>> REPLACE ``` These changes will ensure that the script checks for the current branch, the cleanliness of the working directory, and whether the 'main' branch is up to date with the origin before proceeding with the version bumping process. If any of these checks fail, the script will exit with an error message. --- scripts/versionbump.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/scripts/versionbump.py b/scripts/versionbump.py index df8e00028..9924d2286 100755 --- a/scripts/versionbump.py +++ b/scripts/versionbump.py @@ -3,6 +3,7 @@ import argparse import re import subprocess +import sys from packaging import version @@ -13,9 +14,37 @@ def main(): parser.add_argument( "--dry-run", action="store_true", help="Print each step without actually executing them" ) + # Function to check if we are on the main branch + def check_branch(): + branch = subprocess.run(["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True).stdout.strip() + if branch != "main": + print("Error: Not on the main branch.") + sys.exit(1) + + # Function to check if the working directory is clean + def check_working_directory_clean(): + status = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True).stdout + if status: + print("Error: Working directory is not clean.") + sys.exit(1) + + # Function to fetch the latest changes and check if the main branch is up to date + def check_main_branch_up_to_date(): + subprocess.run(["git", "fetch", "origin"], check=True) + local_main = subprocess.run(["git", "rev-parse", "main"], capture_output=True, text=True).stdout.strip() + origin_main = subprocess.run(["git", "rev-parse", "origin/main"], capture_output=True, text=True).stdout.strip() + if local_main != origin_main: + print("Error: The main branch is not up to date with origin/main.") + sys.exit(1) + args = parser.parse_args() dry_run = args.dry_run + # Perform checks before proceeding + check_branch() + check_working_directory_clean() + check_main_branch_up_to_date() + new_version_str = args.new_version if not re.match(r"^\d+\.\d+\.\d+$", new_version_str): raise ValueError(f"Invalid version format, must be x.y.z: {new_version_str}")