private DeleteRemoteBranchDecision confirmBranchDeletion( @NotNull String branchName, @NotNull Collection<String> trackingBranches, boolean currentBranchTracksBranchToDelete, @NotNull Collection<GitRepository> repositories) { String title = "Delete Remote Branch"; String message = "Delete remote branch " + branchName; boolean delete; final boolean deleteTracking; if (trackingBranches.isEmpty()) { delete = Messages.showYesNoDialog( myProject, message, title, "Delete", "Cancel", Messages.getQuestionIcon()) == Messages.YES; deleteTracking = false; } else { if (currentBranchTracksBranchToDelete) { message += "\n\nCurrent branch " + GitBranchUtil.getCurrentBranchOrRev(repositories) + " tracks " + branchName + " but won't be deleted."; } final String checkboxMessage; if (trackingBranches.size() == 1) { checkboxMessage = "Delete tracking local branch " + trackingBranches.iterator().next() + " as well"; } else { checkboxMessage = "Delete tracking local branches " + StringUtil.join(trackingBranches, ", "); } final AtomicBoolean deleteChoice = new AtomicBoolean(); delete = MessageDialogBuilder.yesNo(title, message) .project(myProject) .yesText("Delete") .noText("Cancel") .doNotAsk( new DialogWrapper.DoNotAskOption.Adapter() { @Override public void rememberChoice(boolean isSelected, int exitCode) { deleteChoice.set(isSelected); } @NotNull @Override public String getDoNotShowMessage() { return checkboxMessage; } }) .show() == Messages.YES; deleteTracking = deleteChoice.get(); } return new DeleteRemoteBranchDecision(delete, deleteTracking); }
protected GitBranchOperation( @NotNull Project project, @NotNull GitPlatformFacade facade, @NotNull Git git, @NotNull GitBranchUiHandler uiHandler, @NotNull Collection<GitRepository> repositories) { myProject = project; myFacade = facade; myGit = git; myUiHandler = uiHandler; myRepositories = repositories; myCurrentBranchOrRev = GitBranchUtil.getCurrentBranchOrRev(repositories); mySuccessfulRepositories = new ArrayList<GitRepository>(); myRemainingRepositories = new ArrayList<GitRepository>(myRepositories); mySettings = myFacade.getSettings(myProject); }
@Override protected void execute() { final Collection<GitRepository> repositories = getRepositories(); final Collection<String> trackingBranches = findTrackingBranches(myBranchName, repositories); String currentBranch = GitBranchUtil.getCurrentBranchOrRev(repositories); boolean currentBranchTracksBranchToDelete = false; if (trackingBranches.contains(currentBranch)) { currentBranchTracksBranchToDelete = true; trackingBranches.remove(currentBranch); } final AtomicReference<DeleteRemoteBranchDecision> decision = new AtomicReference<DeleteRemoteBranchDecision>(); final boolean finalCurrentBranchTracksBranchToDelete = currentBranchTracksBranchToDelete; UIUtil.invokeAndWaitIfNeeded( new Runnable() { @Override public void run() { decision.set( confirmBranchDeletion( myBranchName, trackingBranches, finalCurrentBranchTracksBranchToDelete, repositories)); } }); if (decision.get().delete()) { boolean deletedSuccessfully = doDeleteRemote(myBranchName, repositories); if (deletedSuccessfully) { final Collection<String> successfullyDeletedLocalBranches = new ArrayList<String>(1); if (decision.get().deleteTracking()) { for (final String branch : trackingBranches) { getIndicator().setText("Deleting " + branch); new GitDeleteBranchOperation(myProject, myGit, myUiHandler, repositories, branch) { @Override protected void notifySuccess(@NotNull String message) { // do nothing - will display a combo notification for all deleted branches below successfullyDeletedLocalBranches.add(branch); } }.execute(); } } notifySuccessfulDeletion(myBranchName, successfullyDeletedLocalBranches); } } }