private void runTestConnectionForAllProjectRoots()

in git-server-tc/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/GitDiagnosticsTab.java [247:322]


  private void runTestConnectionForAllProjectRoots(@NotNull SProject project, @NotNull List<VcsRootInstance> vcsRootInstances, @NotNull Date timestamp) {
    final String externalId = project.getExternalId();
    boolean canceled = false;
    try {
      final long start = System.currentTimeMillis();
      int processed = 0;

      final CachingNativeGitTestConnectionRunner testConnectionRunner = new CachingNativeGitTestConnectionRunner(myVcsSupport);
      for (VcsRootInstance ri : vcsRootInstances) {
        ++processed;
        if (!isGitRoot(ri) || ri.getUsages().isEmpty()) {
          continue;
        }
        final String error = testConnectionRunner.testConnection(ri);
        final Lock lock = myLocks.get(externalId);
        lock.lock();
        try {
          final VcsRootLink vcsRootLink = new VcsRootLink(ri.getParent());
          final TestConnectionTask task = myTestConnectionsInProgress.get(externalId);
          if (task == null) {
            canceled = true;
            break;
          }
          task.setRootsProcessed(processed);
          if (error == null) continue;

          final List<TestConnectionError> rootErrors = task.getRootErrors(vcsRootLink);
          rootErrors.add(new TestConnectionError(error, ri.getUsages().keySet().stream().map(bt -> new BuildTypeLink(bt)).collect(Collectors.toSet())));
        } finally {
          lock.unlock();
        }
      }

      final long duration = System.currentTimeMillis() - start;
      LOG.info("Native Git TestConnection for " + LogUtil.describe(project) + (canceled ? " was canceled," : " finished,") + " took " + TimeUnit.MILLISECONDS.toSeconds(duration) + " sec, processed " + testConnectionRunner.getProcessed() + " Git VCS root instances, cache size: " + testConnectionRunner.getCacheSize() + ", cache hits: " + testConnectionRunner.getCacheHits());
      testConnectionRunner.dispose();

      if (canceled) return;
      if (project.isRootProject()) {
        FileUtil.delete(myTestConnectionResultsFolder);

        final File storedFile = getStoredTestConnectionErrorsFile(timestamp);
        deleteFile(storedFile);
        FileUtil.createParentDirs(storedFile);

        FileWriter writer = null;
        try {
          final Map<VcsRootLink, List<TestConnectionError>> errors;
          final Lock lock = myLocks.get(externalId);
          lock.lock();
          try {
            final TestConnectionTask task = myTestConnectionsInProgress.get(externalId);
            if (task == null) return;
            errors = task.getErrors();
          } finally {
            lock.unlock();
          }
          writer = new FileWriter(storedFile);
          GSON.toJson(errors, Map.class, writer);
        } catch (Throwable e) {
          LOG.warnAndDebugDetails("Exception while saving native Git Test Connection results for " + LogUtil.describe(project) + " to " + storedFile, e);
          deleteFile(storedFile);
        } finally {
          FileUtil.close(writer);
        }
      }
    } finally {
      final Lock lock = myLocks.get(externalId);
      lock.lock();
      try {
        finishTask(externalId);
      } finally {
        lock.unlock();
      }
    }
  }