@RequiresBackgroundThread
  private @NotNull String detectExecutable(@NotNull List<Detector> detectors) {
    String path = null;
    boolean fireEvent = false;
    synchronized (DETECTED_EXECUTABLE_LOCK) {
      for (Detector detector : detectors) {
        DetectedPath detectedPath = detector.getPath();
        if (detectedPath == null) {
          detector.runDetection();
          fireEvent = true;

          detectedPath = detector.getPath();
        }

        if (detectedPath != null && detectedPath.path != null) {
          path = detectedPath.path;
          break;
        }
      }
    }

    if (fireEvent) {
      ApplicationManager.getApplication().getMessageBus().syncPublisher(GitExecutableManager.TOPIC).executableChanged();
    }

    if (path != null) return path;
    return getDefaultExecutable();
  }
@RequiresBackgroundThread
  private @NotNull String detectExecutable(@NotNull List<Detector> detectors)