| #!/usr/bin/env python3 | |
| import argparse | |
| import sys | |
| from typing import Dict, List, Optional, Set | |
| 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, | |
| topological_sort_branches, | |
| get_current_branch, | |
| ) | |
| #pylint: enable=wrong-import-position | |
| def main(): | |
| parser = argparse.ArgumentParser( | |
| description='Updates ALL stacked branches via merges based on parent config.' | |
| ) | |
| args = parser.parse_args() | |
| print("--- Starting update for ALL stacks ---") | |
| sorted_branches: List[str] = [] | |
| graph: Dict[str, Optional[str]] = {} | |
| try: | |
| sorted_branches, graph = topological_sort_branches() | |
| except ValueError as e: # Cycle detected | |
| print(f"Error: {e}", file=sys.stderr) | |
| print("Cannot update due to cycles.", file=sys.stderr) | |
| sys.exit(1) | |
| except Exception as e: | |
| print(f"Dependency analysis error: {e}", file=sys.stderr) | |
| sys.exit(1) | |
| if not sorted_branches: | |
| print("No branches with parent configurations found.") | |
| sys.exit(0) | |
| print(f"Branches to update (topological order): {', '.join(sorted_branches)}") | |
| original_branch_to_restore = get_current_branch() | |
| for branch in sorted_branches: | |
| parent = graph.get(branch) | |
| if parent: | |
| print(f"\nUpdating '{branch}' by merging '{parent}'...") | |
| try: | |
| run_git_command(['checkout', branch]) | |
| run_git_command(['merge', parent]) | |
| print(f"Merge successful.") | |
| except SystemExit as e: # Merge conflict | |
| print( | |
| f"MERGE FAILED: Conflicts merging '{parent}' into '{branch}'.", | |
| file=sys.stderr) | |
| print("Resolve conflicts manually and commit.", file=sys.stderr) | |
| if original_branch_to_restore and get_current_branch( | |
| ) != original_branch_to_restore: | |
| print(f"Restoring original branch '{original_branch_to_restore}'...") | |
| run_git_command(['checkout', original_branch_to_restore], check=False) | |
| sys.exit(e.code if isinstance(e.code, int) else 1) | |
| except Exception as e: | |
| print(f"\nUnexpected error updating '{branch}': {e}", file=sys.stderr) | |
| if original_branch_to_restore and get_current_branch( | |
| ) != original_branch_to_restore: | |
| run_git_command(['checkout', original_branch_to_restore], check=False) | |
| sys.exit(1) | |
| if original_branch_to_restore and get_current_branch( | |
| ) != original_branch_to_restore: | |
| print(f"\nRestoring original branch '{original_branch_to_restore}'...") | |
| run_git_command(['checkout', original_branch_to_restore], check=False) | |
| print("\n--- Update process finished for ALL stacks ---") | |
| if __name__ == "__main__": | |
| main() |