@Nullable
  private static GithubFullPath findRepositoryByUser(
      @NotNull Project project,
      @NotNull String user,
      @NotNull Set<GithubFullPath> forks,
      @NotNull GithubAuthData auth,
      @NotNull GithubRepo source) {
    for (GithubFullPath path : forks) {
      if (StringUtil.equalsIgnoreCase(user, path.getUser())) {
        return path;
      }
    }

    try {
      GithubRepoDetailed target = GithubApiUtil.getDetailedRepoInfo(auth, user, source.getName());
      if (target.getSource() != null
          && StringUtil.equals(target.getSource().getUserName(), source.getUserName())) {
        return target.getFullPath();
      }
    } catch (IOException ignore) {
      // such repo may not exist
    }

    try {
      GithubRepo fork =
          GithubApiUtil.findForkByUser(auth, source.getUserName(), source.getName(), user);
      if (fork != null) {
        return fork.getFullPath();
      }
    } catch (IOException e) {
      GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, e);
    }

    return null;
  }
  private void doLoadForksFromGithub(@NotNull ProgressIndicator indicator) throws IOException {
    GithubRepoDetailed repo =
        GithubUtil.runTask(
            myProject,
            myAuthHolder,
            indicator,
            new ThrowableConvertor<GithubConnection, GithubRepoDetailed, IOException>() {
              @NotNull
              @Override
              public GithubRepoDetailed convert(@NotNull GithubConnection connection)
                  throws IOException {
                return GithubApiUtil.getDetailedRepoInfo(
                    connection, myPath.getUser(), myPath.getRepository());
              }
            });

    doAddFork(repo, indicator);
    if (repo.getParent() != null) {
      doAddFork(repo.getParent(), indicator);
    }
    if (repo.getSource() != null) {
      doAddFork(repo.getSource(), indicator);
    }

    mySource = repo.getSource() == null ? repo.getFullPath() : repo.getSource().getFullPath();
  }