From f1a4102dd9496b0a0564e6d7fe48327025ed5c67 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 15 Mar 2021 13:56:23 +0100
Subject: [PATCH] refactor: customRegistrySupport (#9142)

---
 lib/datasource/bitbucket-tags/index.ts     |  1 +
 lib/datasource/cdnjs/index.ts              |  2 +-
 lib/datasource/clojure/index.ts            |  2 +-
 lib/datasource/crate/index.ts              |  1 +
 lib/datasource/dart/index.ts               |  2 +-
 lib/datasource/docker/index.ts             |  1 +
 lib/datasource/galaxy/index.ts             |  2 +-
 lib/datasource/git-refs/index.ts           |  2 +-
 lib/datasource/git-tags/index.ts           |  2 +-
 lib/datasource/github-releases/index.ts    |  1 +
 lib/datasource/github-tags/index.ts        |  1 +
 lib/datasource/gitlab-tags/index.ts        |  1 +
 lib/datasource/go/index.ts                 |  2 +-
 lib/datasource/gradle-version/index.ts     |  1 +
 lib/datasource/helm/index.ts               |  1 +
 lib/datasource/hex/index.ts                |  2 +-
 lib/datasource/index.ts                    | 40 +++++++---------------
 lib/datasource/jenkins-plugins/index.ts    |  2 ++
 lib/datasource/maven/index.ts              |  1 +
 lib/datasource/npm/index.ts                |  2 +-
 lib/datasource/nuget/index.ts              |  1 +
 lib/datasource/orb/index.ts                |  2 +-
 lib/datasource/packagist/index.ts          |  1 +
 lib/datasource/pod/index.ts                |  1 +
 lib/datasource/pypi/index.ts               |  1 +
 lib/datasource/repology/index.ts           |  1 +
 lib/datasource/ruby-version/index.ts       |  2 +-
 lib/datasource/rubygems/index.ts           |  1 +
 lib/datasource/sbt-package/index.ts        |  1 +
 lib/datasource/sbt-plugin/index.ts         |  1 +
 lib/datasource/terraform-module/index.ts   |  1 +
 lib/datasource/terraform-provider/index.ts |  1 +
 lib/datasource/types.ts                    |  6 ++--
 33 files changed, 46 insertions(+), 43 deletions(-)

diff --git a/lib/datasource/bitbucket-tags/index.ts b/lib/datasource/bitbucket-tags/index.ts
index 523547d560..3e06f3b4f0 100644
--- a/lib/datasource/bitbucket-tags/index.ts
+++ b/lib/datasource/bitbucket-tags/index.ts
@@ -8,6 +8,7 @@ import { BitbucketCommit, BitbucketTag } from './types';
 const bitbucketHttp = new BitbucketHttp();
 
 export const id = 'bitbucket-tags';
+export const customRegistrySupport = true;
 export const registryStrategy = 'first';
 export const defaultRegistryUrls = ['https://bitbucket.org'];
 
diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts
index ffdfd34117..e678e56ecd 100644
--- a/lib/datasource/cdnjs/index.ts
+++ b/lib/datasource/cdnjs/index.ts
@@ -3,7 +3,7 @@ import { Http } from '../../util/http';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'cdnjs';
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 export const defaultRegistryUrls = ['https://api.cdnjs.com/'];
 export const caching = true;
 
diff --git a/lib/datasource/clojure/index.ts b/lib/datasource/clojure/index.ts
index 8e86fdded4..10adb16fe3 100644
--- a/lib/datasource/clojure/index.ts
+++ b/lib/datasource/clojure/index.ts
@@ -1,7 +1,7 @@
 import { MAVEN_REPO } from '../maven/common';
 
 export const id = 'clojure';
-
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://clojars.org/repo', MAVEN_REPO];
 export const registryStrategy = 'merge';
 
diff --git a/lib/datasource/crate/index.ts b/lib/datasource/crate/index.ts
index 617c326565..cce827f726 100644
--- a/lib/datasource/crate/index.ts
+++ b/lib/datasource/crate/index.ts
@@ -12,6 +12,7 @@ import * as cargoVersioning from '../../versioning/cargo';
 import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
 
 export const id = 'crate';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://crates.io'];
 export const defaultVersioning = cargoVersioning.id;
 export const registryStrategy = 'first';
diff --git a/lib/datasource/dart/index.ts b/lib/datasource/dart/index.ts
index d76f8ec015..2df5e62320 100644
--- a/lib/datasource/dart/index.ts
+++ b/lib/datasource/dart/index.ts
@@ -4,7 +4,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'dart';
 export const defaultRegistryUrls = ['https://pub.dartlang.org/'];
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 
 const http = new Http(id);
 
diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts
index ff9e4f5336..68ee2f2656 100644
--- a/lib/datasource/docker/index.ts
+++ b/lib/datasource/docker/index.ts
@@ -20,6 +20,7 @@ import { Image, ImageList, MediaType } from './types';
 // TODO: replace www-authenticate with https://www.npmjs.com/package/auth-header ?
 
 export const id = 'docker';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://index.docker.io'];
 export const defaultVersioning = dockerVersioning.id;
 export const registryStrategy = 'first';
diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts
index fdb8ef9cba..87e41b9346 100644
--- a/lib/datasource/galaxy/index.ts
+++ b/lib/datasource/galaxy/index.ts
@@ -6,7 +6,7 @@ import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
 
 export const id = 'galaxy';
 export const defaultRegistryUrls = ['https://galaxy.ansible.com/'];
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 
 const http = new Http(id);
 
diff --git a/lib/datasource/git-refs/index.ts b/lib/datasource/git-refs/index.ts
index f2b8e79bc1..1680106961 100644
--- a/lib/datasource/git-refs/index.ts
+++ b/lib/datasource/git-refs/index.ts
@@ -4,7 +4,7 @@ import * as semver from '../../versioning/semver';
 import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'git-refs';
-export const registryUrlRestriction = 'disallowed';
+export const customRegistrySupport = false;
 
 const cacheMinutes = 10;
 
diff --git a/lib/datasource/git-tags/index.ts b/lib/datasource/git-tags/index.ts
index b848900727..ce1fd14975 100644
--- a/lib/datasource/git-tags/index.ts
+++ b/lib/datasource/git-tags/index.ts
@@ -3,7 +3,7 @@ import * as gitRefs from '../git-refs';
 import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'git-tags';
-export const registryUrlRestriction = 'disallowed';
+export const customRegistrySupport = false;
 
 export async function getReleases({
   lookupName,
diff --git a/lib/datasource/github-releases/index.ts b/lib/datasource/github-releases/index.ts
index 8bd862f07e..a505dd7424 100644
--- a/lib/datasource/github-releases/index.ts
+++ b/lib/datasource/github-releases/index.ts
@@ -4,6 +4,7 @@ import { ensureTrailingSlash } from '../../util/url';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'github-releases';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://github.com'];
 export const registryStrategy = 'first';
 
diff --git a/lib/datasource/github-tags/index.ts b/lib/datasource/github-tags/index.ts
index b26efa501e..ac3b93c528 100644
--- a/lib/datasource/github-tags/index.ts
+++ b/lib/datasource/github-tags/index.ts
@@ -6,6 +6,7 @@ import * as githubReleases from '../github-releases';
 import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'github-tags';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://github.com'];
 export const registryStrategy = 'first';
 
diff --git a/lib/datasource/gitlab-tags/index.ts b/lib/datasource/gitlab-tags/index.ts
index 31292d8da4..bb9c0f3c95 100644
--- a/lib/datasource/gitlab-tags/index.ts
+++ b/lib/datasource/gitlab-tags/index.ts
@@ -6,6 +6,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 const gitlabApi = new GitlabHttp();
 
 export const id = 'gitlab-tags';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://gitlab.com'];
 export const registryStrategy = 'first';
 
diff --git a/lib/datasource/go/index.ts b/lib/datasource/go/index.ts
index 275059647d..9f2cfd6d55 100644
--- a/lib/datasource/go/index.ts
+++ b/lib/datasource/go/index.ts
@@ -11,7 +11,7 @@ import * as gitlab from '../gitlab-tags';
 import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'go';
-export const registryUrlRestriction = 'disallowed';
+export const customRegistrySupport = false;
 
 const http = new Http(id);
 const gitlabRegExp = /^(https:\/\/[^/]*gitlab.[^/]*)\/(.*)$/;
diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts
index 080c103c6d..3313fe32f0 100644
--- a/lib/datasource/gradle-version/index.ts
+++ b/lib/datasource/gradle-version/index.ts
@@ -5,6 +5,7 @@ import * as gradleVersioning from '../../versioning/gradle';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'gradle-version';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://services.gradle.org/versions/all'];
 export const defaultVersioning = gradleVersioning.id;
 export const registryStrategy = 'merge';
diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts
index c5bca39989..ea1105841a 100644
--- a/lib/datasource/helm/index.ts
+++ b/lib/datasource/helm/index.ts
@@ -12,6 +12,7 @@ export const id = 'helm';
 
 const http = new Http(id);
 
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://charts.helm.sh/stable'];
 export const registryStrategy = 'first';
 
diff --git a/lib/datasource/hex/index.ts b/lib/datasource/hex/index.ts
index 45e883c1cc..a9eaa5b084 100644
--- a/lib/datasource/hex/index.ts
+++ b/lib/datasource/hex/index.ts
@@ -6,7 +6,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'hex';
 export const defaultRegistryUrls = ['https://hex.pm/'];
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 export const defaultVersioning = hexVersioning.id;
 
 const http = new Http(id);
diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts
index 58b8efeaed..cfd2277eb5 100644
--- a/lib/datasource/index.ts
+++ b/lib/datasource/index.ts
@@ -171,17 +171,17 @@ function resolveRegistryUrls(
   datasource: DatasourceApi,
   extractedUrls: string[]
 ): string[] {
-  const { defaultRegistryUrls = [], registryUrlRestriction } = datasource;
-  const customUrls = extractedUrls?.filter(Boolean);
-  if (registryUrlRestriction) {
-    if (is.nonEmptyArray(customUrls)) {
+  const { defaultRegistryUrls = [] } = datasource;
+  if (!datasource.customRegistrySupport) {
+    if (is.nonEmptyArray(extractedUrls)) {
       logger.warn(
-        { datasource: datasource.id, customUrls },
-        'Ignoring custom registryUrls as they cannot be overridden'
+        { datasource: datasource.id, registryUrls: extractedUrls },
+        'Custom datasources are not allowed for this datasource and will be ignored'
       );
     }
     return defaultRegistryUrls;
   }
+  const customUrls = extractedUrls?.filter(Boolean);
   let registryUrls: string[];
   if (is.nonEmptyArray(customUrls)) {
     registryUrls = [...customUrls];
@@ -207,34 +207,18 @@ async function fetchReleases(
   const datasource = load(datasourceName);
   const registryUrls = resolveRegistryUrls(datasource, config.registryUrls);
   let dep: ReleaseResult = null;
+  const registryStrategy = datasource.registryStrategy || 'hunt';
   try {
-    if (
-      datasource.registryStrategy ||
-      datasource.registryUrlRestriction === 'fixed'
-    ) {
-      // istanbul ignore if
-      if (!registryUrls.length) {
-        logger.warn(
-          { datasource: datasourceName, depName: config.depName },
-          'Missing registryUrls for registryStrategy'
-        );
-        return null;
-      }
-      if (datasource.registryStrategy === 'first') {
+    if (is.nonEmptyArray(registryUrls)) {
+      if (registryStrategy === 'first') {
         dep = await firstRegistry(config, datasource, registryUrls);
-      } else if (datasource.registryStrategy === 'hunt') {
+      } else if (registryStrategy === 'hunt') {
         dep = await huntRegistries(config, datasource, registryUrls);
-      } else if (datasource.registryStrategy === 'merge') {
+      } else if (registryStrategy === 'merge') {
         dep = await mergeRegistries(config, datasource, registryUrls);
-      } else {
-        // Default to hunting default registries if no rangeStrategy provided
-        dep = await huntRegistries(config, datasource, registryUrls);
       }
     } else {
-      dep = await datasource.getReleases({
-        ...config,
-        registryUrls,
-      });
+      dep = await datasource.getReleases(config);
     }
   } catch (err) {
     if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {
diff --git a/lib/datasource/jenkins-plugins/index.ts b/lib/datasource/jenkins-plugins/index.ts
index 3fe0504600..5790e0e57c 100644
--- a/lib/datasource/jenkins-plugins/index.ts
+++ b/lib/datasource/jenkins-plugins/index.ts
@@ -1,3 +1,5 @@
 export { id } from './common';
 export { getReleases } from './get';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://updates.jenkins.io'];
+export const registryStrategy = 'hunt';
diff --git a/lib/datasource/maven/index.ts b/lib/datasource/maven/index.ts
index bf5775e0e6..5867caa41c 100644
--- a/lib/datasource/maven/index.ts
+++ b/lib/datasource/maven/index.ts
@@ -13,6 +13,7 @@ import { downloadHttpProtocol, isHttpResourceExists } from './util';
 
 export { id } from './common';
 
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [MAVEN_REPO];
 export const defaultVersioning = mavenVersioning.id;
 export const registryStrategy = 'merge';
diff --git a/lib/datasource/npm/index.ts b/lib/datasource/npm/index.ts
index 2bc09a87d6..1f3bfc82ec 100644
--- a/lib/datasource/npm/index.ts
+++ b/lib/datasource/npm/index.ts
@@ -5,4 +5,4 @@ export { getReleases } from './releases';
 export { getNpmrc, setNpmrc } from './npmrc';
 export { id } from './common';
 export const defaultVersioning = npmVersioning.id;
-export const registryUrlRestriction = 'disallowed';
+export const customRegistrySupport = false;
diff --git a/lib/datasource/nuget/index.ts b/lib/datasource/nuget/index.ts
index 0b9ebb7936..d85e3ff073 100644
--- a/lib/datasource/nuget/index.ts
+++ b/lib/datasource/nuget/index.ts
@@ -7,6 +7,7 @@ import * as v3 from './v3';
 
 export { id } from './common';
 
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [v3.getDefaultFeed()];
 export const defaultVersioning = nugetVersioning.id;
 export const registryStrategy = 'merge';
diff --git a/lib/datasource/orb/index.ts b/lib/datasource/orb/index.ts
index f33a61edbe..546167c187 100644
--- a/lib/datasource/orb/index.ts
+++ b/lib/datasource/orb/index.ts
@@ -5,7 +5,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'orb';
 export const defaultRegistryUrls = ['https://circleci.com/'];
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 
 const http = new Http(id);
 
diff --git a/lib/datasource/packagist/index.ts b/lib/datasource/packagist/index.ts
index 654854a3a7..bc8a0cf2b2 100644
--- a/lib/datasource/packagist/index.ts
+++ b/lib/datasource/packagist/index.ts
@@ -11,6 +11,7 @@ import * as composerVersioning from '../../versioning/composer';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'packagist';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://packagist.org'];
 export const defaultVersioning = composerVersioning.id;
 export const registryStrategy = 'hunt';
diff --git a/lib/datasource/pod/index.ts b/lib/datasource/pod/index.ts
index efb92c49fa..dd2d050815 100644
--- a/lib/datasource/pod/index.ts
+++ b/lib/datasource/pod/index.ts
@@ -9,6 +9,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'pod';
 
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://cdn.cocoapods.org'];
 export const registryStrategy = 'hunt';
 
diff --git a/lib/datasource/pypi/index.ts b/lib/datasource/pypi/index.ts
index e2d8864d1e..144e417ec8 100644
--- a/lib/datasource/pypi/index.ts
+++ b/lib/datasource/pypi/index.ts
@@ -8,6 +8,7 @@ import * as pep440 from '../../versioning/pep440';
 import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
 
 export const id = 'pypi';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [
   process.env.PIP_INDEX_URL || 'https://pypi.org/pypi/',
 ];
diff --git a/lib/datasource/repology/index.ts b/lib/datasource/repology/index.ts
index eb85626a44..4551ac596b 100644
--- a/lib/datasource/repology/index.ts
+++ b/lib/datasource/repology/index.ts
@@ -7,6 +7,7 @@ import { getQueryString } from '../../util/url';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'repology';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://repology.org/'];
 export const registryStrategy = 'hunt';
 
diff --git a/lib/datasource/ruby-version/index.ts b/lib/datasource/ruby-version/index.ts
index 134e33796e..f225b9fbca 100644
--- a/lib/datasource/ruby-version/index.ts
+++ b/lib/datasource/ruby-version/index.ts
@@ -7,7 +7,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'ruby-version';
 export const defaultRegistryUrls = ['https://www.ruby-lang.org/'];
-export const registryUrlRestriction = 'fixed';
+export const customRegistrySupport = false;
 export const defaultVersioning = rubyVersioningId;
 
 const http = new Http(id);
diff --git a/lib/datasource/rubygems/index.ts b/lib/datasource/rubygems/index.ts
index f0af4c8b62..83ca50a1de 100644
--- a/lib/datasource/rubygems/index.ts
+++ b/lib/datasource/rubygems/index.ts
@@ -2,6 +2,7 @@ import * as rubyVersioning from '../../versioning/ruby';
 
 export { getReleases } from './releases';
 export { id } from './common';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://rubygems.org'];
 export const defaultVersioning = rubyVersioning.id;
 export const registryStrategy = 'hunt';
diff --git a/lib/datasource/sbt-package/index.ts b/lib/datasource/sbt-package/index.ts
index 977dad5704..c1e5b154d7 100644
--- a/lib/datasource/sbt-package/index.ts
+++ b/lib/datasource/sbt-package/index.ts
@@ -8,6 +8,7 @@ import { parseIndexDir } from '../sbt-plugin/util';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'sbt-package';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [MAVEN_REPO];
 export const defaultVersioning = ivyVersioning.id;
 export const registryStrategy = 'hunt';
diff --git a/lib/datasource/sbt-plugin/index.ts b/lib/datasource/sbt-plugin/index.ts
index 23f3988b51..12d6481b17 100644
--- a/lib/datasource/sbt-plugin/index.ts
+++ b/lib/datasource/sbt-plugin/index.ts
@@ -12,6 +12,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types';
 import { SBT_PLUGINS_REPO, parseIndexDir } from './util';
 
 export const id = 'sbt-plugin';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [SBT_PLUGINS_REPO];
 export const defaultVersioning = ivyVersioning.id;
 export const registryStrategy = 'hunt';
diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts
index 0155cf9301..57fb1f4b9e 100644
--- a/lib/datasource/terraform-module/index.ts
+++ b/lib/datasource/terraform-module/index.ts
@@ -6,6 +6,7 @@ import * as hashicorpVersioning from '../../versioning/hashicorp';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'terraform-module';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = ['https://registry.terraform.io'];
 export const defaultVersioning = hashicorpVersioning.id;
 export const registryStrategy = 'first';
diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts
index f76d9b4f82..def44bfb25 100644
--- a/lib/datasource/terraform-provider/index.ts
+++ b/lib/datasource/terraform-provider/index.ts
@@ -7,6 +7,7 @@ import { getTerraformServiceDiscoveryResult } from '../terraform-module';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'terraform-provider';
+export const customRegistrySupport = true;
 export const defaultRegistryUrls = [
   'https://registry.terraform.io',
   'https://releases.hashicorp.com',
diff --git a/lib/datasource/types.ts b/lib/datasource/types.ts
index b49045cc4c..bcaf83f9c3 100644
--- a/lib/datasource/types.ts
+++ b/lib/datasource/types.ts
@@ -73,11 +73,9 @@ export interface DatasourceApi {
   registryStrategy?: 'first' | 'hunt' | 'merge';
 
   /**
-   * Whether restrictions apply on custom registryUrls. If unspecified, it means custom registryUrls are allowed (no retriction).
-   * fixed: the default registryUrl settings can't be overridden
-   * disallowed: registryUrls are not applicable to this datasource
+   * Whether custom registryUrls are allowed.
    */
-  registryUrlRestriction?: 'fixed' | 'disallowed';
+  customRegistrySupport: boolean;
 
   /**
    * Whether to perform caching in the datasource index/wrapper or not.
-- 
GitLab