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);
      }
    }
  }