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