blob: 13fe402c8e912169082cab1126cf7aa87605b9d2 [file] [log] [blame]
#!/usr/bin/env python3
import argparse
import sys
import os
# Allow importing of root-relative modules.
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.join(ROOT_DIR))
#pylint: disable=wrong-import-position
from python.tools.git_utils import (
run_git_command,
get_current_branch,
get_branch_children,
get_all_branches,
)
#pylint: enable=wrong-import-position
def main():
parser = argparse.ArgumentParser(
description='Finds and checks out a child branch of target branch.')
parser.add_argument(
'-t',
'--target',
metavar='branch_name',
default=None,
help='Target branch (default: current)')
args = parser.parse_args()
target_branch = args.target or get_current_branch()
if not target_branch:
print("Error: Cannot determine target branch.", file=sys.stderr)
sys.exit(1)
all_local_branches = get_all_branches()
children = get_branch_children(target_branch, all_local_branches)
if not children:
print(f"No child branches found for '{target_branch}'.")
sys.exit(0)
if len(children) == 1:
child = children[0]
print(f"Found one child: '{child}'. Checking out...")
run_git_command(['checkout', child])
else:
print(f"Found multiple child branches for '{target_branch}':")
for i, child in enumerate(children):
print(f" {i+1}) {child}")
while True: # Loop for interactive prompt
try:
choice = input(
f"Select child number (1-{len(children)}), or 0 to cancel: ")
choice_num = int(choice)
if choice_num == 0:
print("Cancelled.")
sys.exit(0)
elif 1 <= choice_num <= len(children):
selected_child = children[choice_num - 1]
print(f"Checking out '{selected_child}'...")
run_git_command(['checkout', selected_child])
break
else:
print(f"Invalid choice.")
except ValueError:
print("Invalid input.")
except EOFError:
print("\nCancelled.")
sys.exit(1)
if __name__ == "__main__":
main()