public static @NotNull List<PluginNode> loadPlugins(
    @Nullable String repositoryUrl,
    @Nullable BuildNumber build,
    @Nullable ProgressIndicator indicator
  ) throws IOException {
    Path pluginListFile;
    Url url;
    if (repositoryUrl == null) {
      if (ApplicationInfoImpl.getShadowInstance().usesJetBrainsPluginRepository()) {
        LOG.error("Using deprecated API for getting plugins from Marketplace");
      }
      var base = MarketplaceCustomizationService.getInstance().getPluginsListUrl();
      url = Urls.newFromEncoded(base).addParameters(Map.of("uuid", PluginDownloader.getMarketplaceDownloadsUUID()));
      pluginListFile = Paths.get(PathManager.getPluginsPath(), PLUGIN_LIST_FILE);
    }
    else {
      url = Urls.newFromEncoded(repositoryUrl);
      pluginListFile = null;
    }

    if (!URLUtil.FILE_PROTOCOL.equals(url.getScheme())) {
      url = url.addParameters(Map.of("build", ApplicationInfoImpl.orFromPluginCompatibleBuild(build)));
    }

    if (indicator != null) {
      indicator.setText2(IdeBundle.message("progress.connecting.to.plugin.manager", url.getAuthority()));
    }

    var message = IdeBundle.message("progress.downloading.list.of.plugins", url.getAuthority());
    var descriptors = MarketplaceRequests.readOrUpdateFile(pluginListFile, url.toExternalForm(), indicator, message, MarketplaceRequests::parsePluginList);
    return process(descriptors, build != null ? build : PluginManagerCore.getBuildNumber(), repositoryUrl);
  }
public static @NotNull List<PluginNode> loadPlugins(
    @Nullable String repositoryUrl,
    @Nullable BuildNumber build,
    @Nullable ProgressIndicator indicator
  )