Skip to content

Commit 8e9a91f

Browse files
committed
Check out previous branch rather than default branch on cleanup
1 parent 6b302ad commit 8e9a91f

File tree

1 file changed

+51
-14
lines changed

1 file changed

+51
-14
lines changed

cherry_picker/cherry_picker.py

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
CHECKING_OUT_DEFAULT_BRANCH
3939
CHECKED_OUT_DEFAULT_BRANCH
4040
41+
CHECKING_OUT_PREVIOUS_BRANCH
42+
CHECKED_OUT_PREVIOUS_BRANCH
43+
4144
PUSHING_TO_REMOTE
4245
PUSHED_TO_REMOTE
4346
PUSHING_TO_REMOTE_FAILED
@@ -134,6 +137,11 @@ def set_paused_state(self):
134137
save_cfg_vals_to_git_cfg(config_path=self.chosen_config_path)
135138
set_state(WORKFLOW_STATES.BACKPORT_PAUSED)
136139

140+
def remember_previous_branch(self):
141+
"""Save the current branch into Git config to be able to get back to it later."""
142+
current_branch = get_current_branch()
143+
save_cfg_vals_to_git_cfg(previous_branch=current_branch)
144+
137145
@property
138146
def upstream(self):
139147
"""Get the remote name to use for upstream branches
@@ -180,24 +188,27 @@ def run_cmd(self, cmd):
180188
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
181189
return output.decode("utf-8")
182190

183-
def checkout_branch(self, branch_name):
191+
def checkout_branch(self, branch_name, *, create_branch=False):
184192
"""git checkout -b <branch_name>"""
185-
cmd = [
186-
"git",
187-
"checkout",
188-
"-b",
189-
self.get_cherry_pick_branch(branch_name),
190-
f"{self.upstream}/{branch_name}",
191-
]
193+
if create_branch:
194+
cmd = [
195+
"git",
196+
"checkout",
197+
"-b",
198+
branch_name,
199+
f"{self.upstream}/{branch_name}",
200+
]
201+
else:
202+
cmd = ["git", "checkout", branch_name]
192203
try:
193204
self.run_cmd(cmd)
194205
except subprocess.CalledProcessError as err:
195206
click.echo(
196-
f"Error checking out the branch {self.get_cherry_pick_branch(branch_name)}."
207+
f"Error checking out the branch {branch_name}."
197208
)
198209
click.echo(err.output)
199210
raise BranchCheckoutException(
200-
f"Error checking out the branch {self.get_cherry_pick_branch(branch_name)}."
211+
f"Error checking out the branch {branch_name}."
201212
)
202213

203214
def get_commit_message(self, commit_sha):
@@ -221,11 +232,23 @@ def checkout_default_branch(self):
221232
"""git checkout default branch"""
222233
set_state(WORKFLOW_STATES.CHECKING_OUT_DEFAULT_BRANCH)
223234

224-
cmd = "git", "checkout", self.config["default_branch"]
225-
self.run_cmd(cmd)
235+
self.checkout_branch(self.config["default_branch"])
226236

227237
set_state(WORKFLOW_STATES.CHECKED_OUT_DEFAULT_BRANCH)
228238

239+
def checkout_previous_branch(self):
240+
"""git checkout previous branch"""
241+
set_state(WORKFLOW_STATES.CHECKING_OUT_PREVIOUS_BRANCH)
242+
243+
previous_branch = load_val_from_git_cfg("previous_branch")
244+
if previous_branch is None:
245+
self.checkout_default_branch()
246+
return
247+
248+
self.checkout_branch(previous_branch)
249+
250+
set_state(WORKFLOW_STATES.CHECKED_OUT_PREVIOUS_BRANCH)
251+
229252
def status(self):
230253
"""
231254
git status
@@ -357,7 +380,12 @@ def cleanup_branch(self, branch):
357380
Switch to the default branch before that.
358381
"""
359382
set_state(WORKFLOW_STATES.REMOVING_BACKPORT_BRANCH)
360-
self.checkout_default_branch()
383+
try:
384+
self.checkout_previous_branch()
385+
except BranchCheckoutException:
386+
click.echo(f"branch {branch} NOT deleted.")
387+
set_state(WORKFLOW_STATES.REMOVING_BACKPORT_BRANCH_FAILED)
388+
return
361389
try:
362390
self.delete_branch(branch)
363391
except subprocess.CalledProcessError:
@@ -372,14 +400,15 @@ def backport(self):
372400
raise click.UsageError("At least one branch must be specified.")
373401
set_state(WORKFLOW_STATES.BACKPORT_STARTING)
374402
self.fetch_upstream()
403+
self.remember_previous_branch()
375404

376405
set_state(WORKFLOW_STATES.BACKPORT_LOOPING)
377406
for maint_branch in self.sorted_branches:
378407
set_state(WORKFLOW_STATES.BACKPORT_LOOP_START)
379408
click.echo(f"Now backporting '{self.commit_sha1}' into '{maint_branch}'")
380409

381410
cherry_pick_branch = self.get_cherry_pick_branch(maint_branch)
382-
self.checkout_branch(maint_branch)
411+
self.checkout_branch(cherry_pick_branch, create_branch=True)
383412
commit_message = ""
384413
try:
385414
self.cherry_pick()
@@ -413,6 +442,7 @@ def backport(self):
413442
self.set_paused_state()
414443
return # to preserve the correct state
415444
set_state(WORKFLOW_STATES.BACKPORT_LOOP_END)
445+
reset_stored_previous_branch()
416446
reset_state()
417447

418448
def abort_cherry_pick(self):
@@ -434,6 +464,7 @@ def abort_cherry_pick(self):
434464
if get_current_branch().startswith("backport-"):
435465
self.cleanup_branch(get_current_branch())
436466

467+
reset_stored_previous_branch()
437468
reset_stored_config_ref()
438469
reset_state()
439470

@@ -493,6 +524,7 @@ def continue_cherry_pick(self):
493524
)
494525
set_state(WORKFLOW_STATES.CONTINUATION_FAILED)
495526

527+
reset_stored_previous_branch()
496528
reset_stored_config_ref()
497529
reset_state()
498530

@@ -822,6 +854,11 @@ def reset_stored_config_ref():
822854
"""Config file pointer is not stored in Git config."""
823855

824856

857+
def reset_stored_previous_branch():
858+
"""Remove the previous branch information from Git config."""
859+
wipe_cfg_vals_from_git_cfg("previous_branch")
860+
861+
825862
def reset_state():
826863
"""Remove the progress state from Git config."""
827864
wipe_cfg_vals_from_git_cfg("state")

0 commit comments

Comments
 (0)