22Create a new Git branch.
33"""
44
5+ import traceback
6+
57from titan_cli .engine import WorkflowContext , WorkflowResult , Success , Error
6- from titan_plugin_git . exceptions import GitError
8+ from titan_cli . core . result import ClientSuccess , ClientError
79from ..operations import (
810 check_branch_exists ,
911 determine_safe_checkout_target ,
@@ -54,46 +56,63 @@ def create_branch_step(ctx: WorkflowContext) -> WorkflowResult:
5456 ctx .textual .dim_text (f"From: { start_point } " )
5557
5658 # Check if branch exists using operations
57- all_branches = ctx .git .get_branches ()
58- branch_names = [b .name for b in all_branches ]
59- branch_exists = check_branch_exists (new_branch , branch_names )
59+ branches_result = ctx .git .get_branches ()
60+
61+ match branches_result :
62+ case ClientSuccess (data = all_branches ):
63+ branch_names = [b .name for b in all_branches ]
64+ branch_exists = check_branch_exists (new_branch , branch_names )
65+ case ClientError (error_message = err ):
66+ ctx .textual .error_text (f"Failed to get branches: { err } " )
67+ ctx .textual .end_step ("error" )
68+ return Error (f"Failed to get branches: { err } " )
6069
6170 # Delete if exists and requested using operations
6271 if should_delete_before_create (branch_exists , delete_if_exists ):
6372 ctx .textual .text ("" )
6473 ctx .textual .warning_text (f"Branch { new_branch } exists, deleting..." )
6574
6675 # If we're on the branch, checkout another one first using operations
67- current_branch = ctx .git .get_current_branch ()
68- safe_target = determine_safe_checkout_target (
69- current_branch = current_branch ,
70- branch_to_delete = new_branch ,
71- main_branch = ctx .git .main_branch ,
72- all_branches = branch_names
73- )
74-
75- if safe_target :
76- try :
77- ctx .git .checkout (safe_target )
78- ctx .textual .dim_text (f"Switched to { safe_target } " )
79- except GitError as e :
80- ctx .textual .error_text (f"Failed to checkout { safe_target } : { str (e )} " )
76+ current_branch_result = ctx .git .get_current_branch ()
77+
78+ match current_branch_result :
79+ case ClientSuccess (data = current_branch ):
80+ safe_target = determine_safe_checkout_target (
81+ current_branch = current_branch ,
82+ branch_to_delete = new_branch ,
83+ main_branch = ctx .git .main_branch ,
84+ all_branches = branch_names
85+ )
86+
87+ if safe_target :
88+ checkout_result = ctx .git .checkout (safe_target )
89+ match checkout_result :
90+ case ClientSuccess ():
91+ ctx .textual .dim_text (f"Switched to { safe_target } " )
92+ case ClientError (error_message = err ):
93+ ctx .textual .error_text (f"Failed to checkout { safe_target } : { err } " )
94+ ctx .textual .end_step ("error" )
95+ return Error (f"Cannot checkout { safe_target } : { err } " )
96+ elif current_branch == new_branch :
97+ # Cannot delete current branch and no safe target available
98+ ctx .textual .error_text (f"Cannot delete current branch { new_branch } " )
99+ ctx .textual .end_step ("error" )
100+ return Error ("Cannot delete current branch" )
101+
102+ # Delete the branch
103+ delete_result = ctx .git .safe_delete_branch (new_branch , force = True )
104+ match delete_result :
105+ case ClientSuccess ():
106+ ctx .textual .success_text (f"✓ Deleted existing branch { new_branch } " )
107+ case ClientError (error_message = err ):
108+ ctx .textual .error_text (f"Failed to delete { new_branch } : { err } " )
109+ ctx .textual .end_step ("error" )
110+ return Error (f"Failed to delete branch: { err } " )
111+
112+ case ClientError (error_message = err ):
113+ ctx .textual .error_text (f"Failed to get current branch: { err } " )
81114 ctx .textual .end_step ("error" )
82- return Error (f"Cannot checkout { safe_target } : { str (e )} " )
83- elif current_branch == new_branch :
84- # Cannot delete current branch and no safe target available
85- ctx .textual .error_text (f"Cannot delete current branch { new_branch } " )
86- ctx .textual .end_step ("error" )
87- return Error ("Cannot delete current branch" )
88-
89- # Delete the branch
90- try :
91- ctx .git .safe_delete_branch (new_branch , force = True )
92- ctx .textual .success_text (f"✓ Deleted existing branch { new_branch } " )
93- except GitError as e :
94- ctx .textual .error_text (f"Failed to delete { new_branch } : { str (e )} " )
95- ctx .textual .end_step ("error" )
96- return Error (f"Failed to delete branch: { str (e )} " )
115+ return Error (f"Failed to get current branch: { err } " )
97116
98117 elif branch_exists :
99118 ctx .textual .error_text (f"Branch { new_branch } already exists" )
@@ -103,21 +122,23 @@ def create_branch_step(ctx: WorkflowContext) -> WorkflowResult:
103122
104123 # Create the branch
105124 ctx .textual .text ("" )
106- try :
107- ctx .git .create_branch (new_branch , start_point = start_point )
108- ctx .textual .success_text (f"✓ Created branch { new_branch } " )
109- except GitError as e :
110- ctx .textual .error_text (f"Failed to create { new_branch } : { str (e )} " )
111- ctx .textual .end_step ("error" )
112- return Error (f"Failed to create branch: { str (e )} " )
125+ create_result = ctx .git .create_branch (new_branch , start_point = start_point )
126+ match create_result :
127+ case ClientSuccess ():
128+ ctx .textual .success_text (f"✓ Created branch { new_branch } " )
129+ case ClientError (error_message = err ):
130+ ctx .textual .error_text (f"Failed to create { new_branch } : { err } " )
131+ ctx .textual .end_step ("error" )
132+ return Error (f"Failed to create branch: { err } " )
113133
114134 # Checkout if requested
115135 if checkout :
116- try :
117- ctx .git .checkout (new_branch )
118- ctx .textual .success_text (f"✓ Checked out { new_branch } " )
119- except GitError as e :
120- ctx .textual .warning_text (f"Branch created but failed to checkout: { str (e )} " )
136+ checkout_result = ctx .git .checkout (new_branch )
137+ match checkout_result :
138+ case ClientSuccess ():
139+ ctx .textual .success_text (f"✓ Checked out { new_branch } " )
140+ case ClientError (error_message = err ):
141+ ctx .textual .warning_text (f"Branch created but failed to checkout: { err } " )
121142
122143 ctx .textual .text ("" )
123144 ctx .textual .end_step ("success" )
@@ -131,9 +152,13 @@ def create_branch_step(ctx: WorkflowContext) -> WorkflowResult:
131152 )
132153
133154 except Exception as e :
155+ tb = traceback .format_exc ()
134156 ctx .textual .text ("" )
135157 ctx .textual .error_text (f"Failed to create branch: { str (e )} " )
136158 ctx .textual .text ("" )
159+ ctx .textual .dim_text ("Full traceback:" )
160+ for line in tb .split ('\n ' ):
161+ ctx .textual .dim_text (line )
137162 ctx .textual .end_step ("error" )
138163 return Error (f"Failed to create branch: { str (e )} " )
139164
0 commit comments