/**
  * Reads all remotes in a local repository's config and logs remote repository urls. Does this
  * only once per a NB session and repository
  *
  * @param repositoryRoot root of the local repository
  */
 @SuppressWarnings("unchecked")
 private void logRemoteRepositoryAccess(final File repositoryRoot) {
   if (loggedRepositories.add(repositoryRoot)) {
     Git.getInstance()
         .getRequestProcessor(repositoryRoot)
         .post(
             new Runnable() {
               @Override
               public void run() {
                 Set<String> urls = new HashSet<String>();
                 try {
                   GitClient client = Git.getInstance().getClient(repositoryRoot);
                   Map<String, GitRemoteConfig> cfgs =
                       client.getRemotes(GitUtils.NULL_PROGRESS_MONITOR);
                   for (Map.Entry<String, GitRemoteConfig> e : cfgs.entrySet()) {
                     GitRemoteConfig cfg = e.getValue();
                     for (List<String> uris : Arrays.asList(cfg.getUris(), cfg.getPushUris())) {
                       if (!uris.isEmpty()) {
                         urls.addAll(uris);
                       }
                     }
                   }
                 } catch (GitException ex) {
                   // not interested
                 }
                 for (String url : urls) {
                   if (!url.trim().isEmpty()) {
                     Utils.logVCSExternalRepository("GIT", url); // NOI18N
                   }
                 }
               }
             });
   }
 }
 private static void refreshFS(final Collection<File> filesToRefresh) {
   Git.getInstance()
       .getRequestProcessor()
       .post(
           new Runnable() {
             @Override
             public void run() {
               FileUtil.refreshFor(filesToRefresh.toArray(new File[filesToRefresh.size()]));
             }
           },
           100);
 }
 private boolean canCommit(File repository) {
   boolean commitPermitted = true;
   RepositoryInfo info = RepositoryInfo.getInstance(repository);
   GitRepositoryState state = info.getRepositoryState();
   if (!state.canCommit()) {
     commitPermitted = false;
     Map<File, GitStatus> conflicts = Collections.emptyMap();
     if (state.equals(GitRepositoryState.MERGING)) {
       try {
         GitClient client = Git.getInstance().getClient(repository);
         conflicts = client.getConflicts(new File[] {repository}, GitUtils.NULL_PROGRESS_MONITOR);
       } catch (GitException ex) {
         LOG.log(Level.INFO, null, ex);
       }
     }
     NotifyDescriptor nd;
     if (conflicts.isEmpty()) {
       nd =
           new NotifyDescriptor.Confirmation(
               NbBundle.getMessage(
                   CommitAction.class,
                   "LBL_CommitAction_CommitNotAllowed_State",
                   state.toString()), // NOI18N
               NbBundle.getMessage(CommitAction.class, "LBL_CommitAction_CannotCommit"),
               NotifyDescriptor.DEFAULT_OPTION,
               NotifyDescriptor.ERROR_MESSAGE); // NOI18N
     } else {
       nd =
           new NotifyDescriptor.Confirmation(
               NbBundle.getMessage(
                   CommitAction.class, "LBL_CommitAction_CommitNotAllowed_Conflicts"), // NOI18N
               NbBundle.getMessage(CommitAction.class, "LBL_CommitAction_CannotCommit"),
               NotifyDescriptor.YES_NO_OPTION,
               NotifyDescriptor.QUESTION_MESSAGE); // NOI18N
     }
     Object retval = DialogDisplayer.getDefault().notify(nd);
     if (retval == NotifyDescriptor.YES_OPTION) {
       GitUtils.openInVersioningView(
           conflicts.keySet(), repository, GitUtils.NULL_PROGRESS_MONITOR);
     }
   }
   return commitPermitted;
 }
    @Override
    public void perform() {
      try {
        List<File> addCandidates = new LinkedList<File>();
        List<File> deleteCandidates = new LinkedList<File>();
        List<File> commitCandidates = new LinkedList<File>();
        GitCommitParameters parameters = panel.getParameters();
        GitClient client = getClient();

        populateCandidates(addCandidates, deleteCandidates, commitCandidates);

        if (isCanceled()) {
          return;
        }

        String message = parameters.getCommitMessage();
        GitUser author = parameters.getAuthor();
        GitUser commiter = parameters.getCommiter();
        Collection<GitHook> hooks = panel.getHooks();
        try {

          outputInRed(NbBundle.getMessage(CommitAction.class, "MSG_COMMIT_TITLE")); // NOI18N
          outputInRed(NbBundle.getMessage(CommitAction.class, "MSG_COMMIT_TITLE_SEP")); // NOI18N

          if (addCandidates.size() > 0) {
            client.add(addCandidates.toArray(new File[addCandidates.size()]), getProgressMonitor());
          }
          if (deleteCandidates.size() > 0) {
            client.remove(
                deleteCandidates.toArray(new File[deleteCandidates.size()]),
                false,
                getProgressMonitor());
          }

          if (GitModuleConfig.getDefault().getSignOff() && commiter != null) {
            message += "\nSigned-off-by:" + GitCommitParameters.getUserString(commiter); // NOI18N
          }
          String origMessage = message;
          message = beforeCommitHook(commitCandidates, hooks, message);

          GitRevisionInfo info = commit(commitCandidates, message, author, commiter);

          GitModuleConfig.getDefault()
              .putRecentCommitAuthors(GitCommitParameters.getUserString(author));
          GitModuleConfig.getDefault()
              .putRecentCommiter(GitCommitParameters.getUserString(commiter));

          afterCommitHook(commitCandidates, hooks, info, origMessage);

        } catch (GitException ex) {
          GitClientExceptionHandler.notifyException(ex, true);
        } finally {
          refreshFS(commitCandidates);
          Git.getInstance().getFileStatusCache().refreshAllRoots(commitCandidates);
          outputInRed(NbBundle.getMessage(CommitAction.class, "MSG_COMMIT_DONE")); // NOI18N
          output(""); // NOI18N
          Git.getInstance()
              .getHistoryProvider()
              .fireHistoryChange(commitCandidates.toArray(new File[commitCandidates.size()]));
        }
      } catch (GitException ex) {
        LOG.log(Level.WARNING, null, ex);
      }
    }