From dc5cd8ddf716fd3de480b9d2d2290d1f8a15ebf1 Mon Sep 17 00:00:00 2001 From: Ben Bachem <10088265+bezbac@users.noreply.github.com> Date: Wed, 27 Mar 2024 23:20:55 +0100 Subject: [PATCH] improve `magit-branch-spinoff` implementation --- src/commands/branchingCommands.ts | 46 +++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/src/commands/branchingCommands.ts b/src/commands/branchingCommands.ts index 0d05dda..772818c 100644 --- a/src/commands/branchingCommands.ts +++ b/src/commands/branchingCommands.ts @@ -207,13 +207,49 @@ async function createNewSpinoff({ repository }: MenuState) { prompt: 'Name for new branch', }); - if (newBranchName && newBranchName.length > 0) { - const args = ['checkout', '-B', newBranchName]; - return gitRun(repository.gitRepository, args); - } else { - window.setStatusBarMessage( + if (!newBranchName || newBranchName.length < 1) { + return window.setStatusBarMessage( 'No name given for new branch', Constants.StatusMessageDisplayTimeout ); } + + if (repository.branches.find(b => b.name === newBranchName)) { + return window.setStatusBarMessage( + `Cannot spin off ${newBranchName}. It already exists`, + Constants.StatusMessageDisplayTimeout + ); + } + + const base = repository.HEAD?.name; + + if (!base) { + return window.setStatusBarMessage( + 'No branch checked out', + Constants.StatusMessageDisplayTimeout + ); + } + + // Save current commit hash of base branch for later reference + const baseCommit = repository.HEAD?.commit; + + // Get upsteam branch commit hash of base branch + const upstreamBranchCommit = repository.HEAD.upstreamRemote?.commit?.hash; + + // Checkout new branch + await gitRun(repository.gitRepository, ['checkout', '-b', newBranchName]); + + if (upstreamBranchCommit && baseCommit !== upstreamBranchCommit) { + await gitRun(repository.gitRepository, ['branch', '-f', base, upstreamBranchCommit]); + + window.setStatusBarMessage( + `Branch ${base} was reset to upstream`, + Constants.StatusMessageDisplayTimeout + ); + } else { + window.setStatusBarMessage( + `Branch ${base} not changed`, + Constants.StatusMessageDisplayTimeout + ); + } }