diff --git a/lib/datasource/cdnjs/__snapshots__/index.spec.ts.snap b/lib/datasource/cdnjs/__snapshots__/index.spec.ts.snap
index 6f4c23d99650b62aff8e4919eeb8ecec264db42e..9aeb0456a20721cb57dbc68a18cbdedf0024a3a8 100644
--- a/lib/datasource/cdnjs/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/cdnjs/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/cdnjs getPkgReleases filters releases by asset presence 1`] = `
+exports[`datasource/cdnjs getReleases filters releases by asset presence 1`] = `
 Object {
   "homepage": "http://bulma.io",
   "releases": Array [
@@ -12,7 +12,7 @@ Object {
 }
 `;
 
-exports[`datasource/cdnjs getPkgReleases processes real data 1`] = `
+exports[`datasource/cdnjs getReleases processes real data 1`] = `
 Object {
   "homepage": "https://d3js.org/d3-force/",
   "releases": Array [
diff --git a/lib/datasource/cdnjs/index.spec.ts b/lib/datasource/cdnjs/index.spec.ts
index 4a387baa45b3acf310573f5bd30eec8bccf1c603..e147ed0f552b907c0435186dc9c719af3dc75023 100644
--- a/lib/datasource/cdnjs/index.spec.ts
+++ b/lib/datasource/cdnjs/index.spec.ts
@@ -1,6 +1,6 @@
 import fs from 'fs';
 import _got from '../../util/got';
-import { getDigest, getPkgReleases } from '.';
+import { getDigest, getReleases } from '.';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
 
 const got: jest.Mock<any> = _got as any;
@@ -40,62 +40,62 @@ describe('datasource/cdnjs', () => {
       expect(res).toBe('sha256-F/Xda58SPdcUCr+xhSGz9MA2zQBPb0ASEYKohl8UCHc=');
     });
   });
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
       return global.renovateCache.rmAll();
     });
     it('throws for empty result', async () => {
       got.mockResolvedValueOnce(null);
-      await expect(
-        getPkgReleases({ lookupName: 'foo/bar' })
-      ).rejects.toThrowError(DATASOURCE_FAILURE);
+      await expect(getReleases({ lookupName: 'foo/bar' })).rejects.toThrowError(
+        DATASOURCE_FAILURE
+      );
     });
     it('returns null for missing fields', async () => {
       got.mockResolvedValueOnce({});
-      expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
+      expect(await getReleases({ lookupName: 'foo/bar' })).toBeNull();
     });
     it('returns null for 404', async () => {
       got.mockRejectedValueOnce({ statusCode: 404 });
-      expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
+      expect(await getReleases({ lookupName: 'foo/bar' })).toBeNull();
     });
     it('returns null for 401', async () => {
       got.mockRejectedValueOnce({ statusCode: 401 });
-      expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
+      expect(await getReleases({ lookupName: 'foo/bar' })).toBeNull();
     });
     it('throws for 429', async () => {
       got.mockRejectedValueOnce({ statusCode: 429 });
-      await expect(
-        getPkgReleases({ lookupName: 'foo/bar' })
-      ).rejects.toThrowError(DATASOURCE_FAILURE);
+      await expect(getReleases({ lookupName: 'foo/bar' })).rejects.toThrowError(
+        DATASOURCE_FAILURE
+      );
     });
     it('throws for 5xx', async () => {
       got.mockRejectedValueOnce({ statusCode: 502 });
-      await expect(
-        getPkgReleases({ lookupName: 'foo/bar' })
-      ).rejects.toThrowError(DATASOURCE_FAILURE);
+      await expect(getReleases({ lookupName: 'foo/bar' })).rejects.toThrowError(
+        DATASOURCE_FAILURE
+      );
     });
     it('returns null for unknown error', async () => {
       got.mockImplementationOnce(() => {
         throw new Error();
       });
-      await expect(
-        getPkgReleases({ lookupName: 'foo/bar' })
-      ).rejects.toThrowError(DATASOURCE_FAILURE);
+      await expect(getReleases({ lookupName: 'foo/bar' })).rejects.toThrowError(
+        DATASOURCE_FAILURE
+      );
     });
     it('returns null with wrong auth token', async () => {
       got.mockRejectedValueOnce({ statusCode: 401 });
-      const res = await getPkgReleases({ lookupName: 'foo/bar' });
+      const res = await getReleases({ lookupName: 'foo/bar' });
       expect(res).toBeNull();
     });
     it('processes real data', async () => {
       got.mockResolvedValueOnce({ body: res1 });
-      const res = await getPkgReleases({ lookupName: 'd3-force/d3-force.js' });
+      const res = await getReleases({ lookupName: 'd3-force/d3-force.js' });
       expect(res).toMatchSnapshot();
     });
     it('filters releases by asset presence', async () => {
       got.mockResolvedValueOnce({ body: res2 });
-      const res = await getPkgReleases({
+      const res = await getReleases({
         lookupName: 'bulma/only/0.7.5/style.css',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts
index eb37fc211a8ca8b7630aedc8f23633e367c2ab05..b7ef9be6c49ef1cd5f4dafd8c56536a1b5d148ca 100644
--- a/lib/datasource/cdnjs/index.ts
+++ b/lib/datasource/cdnjs/index.ts
@@ -51,9 +51,9 @@ export async function getDigest(
   return result;
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
-}: Partial<GetReleasesConfig>): Promise<ReleaseResult | null> {
+}: GetReleasesConfig): Promise<ReleaseResult | null> {
   const [library, ...assetParts] = lookupName.split('/');
   const assetName = assetParts.join('/');
 
diff --git a/lib/datasource/common.ts b/lib/datasource/common.ts
index d4c12a676fe10f592897eab75c3c0e1e6445366f..e3702ba38f29ddb51e0dbadcb662d3f87c5c947d 100644
--- a/lib/datasource/common.ts
+++ b/lib/datasource/common.ts
@@ -1,25 +1,39 @@
 import { DATASOURCE_FAILURE } from '../constants/error-messages';
 
-export interface GetReleasesConfig {
-  lookupName: string;
-  registryUrls?: string[];
-  compatibility?: Record<string, string>;
-  npmrc?: string;
-}
-
 export interface Config {
   datasource?: string;
   depName?: string;
   lookupName?: string;
   registryUrls?: string[];
 }
-export interface PkgReleaseConfig extends Config {
+
+export type DigestConfig = Config;
+
+interface ReleasesConfigBase {
   compatibility?: Record<string, string>;
   npmrc?: string;
+  registryUrls?: string[];
+}
+
+export interface GetReleasesConfig extends ReleasesConfigBase {
+  lookupName: string;
+}
+
+export interface GetPkgReleasesConfig extends ReleasesConfigBase {
+  datasource: string;
+  depName: string;
+  lookupName?: string;
   versioning?: string;
 }
 
-export type DigestConfig = Config;
+export function isGetPkgReleasesConfig(
+  input: any
+): input is GetPkgReleasesConfig {
+  return (
+    (input as GetPkgReleasesConfig).datasource !== undefined &&
+    (input as GetPkgReleasesConfig).depName !== undefined
+  );
+}
 
 export interface Release {
   changelogUrl?: string;
@@ -52,7 +66,7 @@ export interface ReleaseResult {
 export interface Datasource {
   id: string;
   getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;
-  getPkgReleases(config: PkgReleaseConfig): Promise<ReleaseResult | null>;
+  getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null>;
 }
 
 export class DatasourceError extends Error {
diff --git a/lib/datasource/crate/__snapshots__/index.spec.ts.snap b/lib/datasource/crate/__snapshots__/index.spec.ts.snap
index 5d98d165718bfbdc539424097a4c8bf1018a899b..2080dcc171aa48acbbfe241e85c4e1dfd7b97203 100644
--- a/lib/datasource/crate/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/crate/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/crate getPkgReleases processes real data 1`] = `
+exports[`datasource/crate getReleases processes real data 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -204,7 +204,7 @@ Object {
 }
 `;
 
-exports[`datasource/crate getPkgReleases processes real data 2`] = `
+exports[`datasource/crate getReleases processes real data 2`] = `
 Object {
   "releases": Array [
     Object {
@@ -269,4 +269,4 @@ Object {
 }
 `;
 
-exports[`datasource/crate getPkgReleases throws for 5xx 1`] = `[Error: registry-failure]`;
+exports[`datasource/crate getReleases throws for 5xx 1`] = `[Error: registry-failure]`;
diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts
index 9dd47f443dce31d57a265374ca781a5ea9cdf2e0..176ab304c9652aa83ebe6b9a98e7e34b72f84b23 100644
--- a/lib/datasource/crate/index.spec.ts
+++ b/lib/datasource/crate/index.spec.ts
@@ -1,7 +1,7 @@
 import fs from 'fs';
 
 import _got from '../../util/got';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 
 const got: any = _got;
 
@@ -18,14 +18,14 @@ const res3 = fs.readFileSync(
 jest.mock('../../util/got');
 
 describe('datasource/crate', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       global.repoCache = {};
     });
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce(null);
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for missing fields', async () => {
@@ -33,7 +33,7 @@ describe('datasource/crate', () => {
         body: undefined,
       });
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for empty list', async () => {
@@ -41,7 +41,7 @@ describe('datasource/crate', () => {
         body: '\n',
       });
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for 404', async () => {
@@ -50,7 +50,7 @@ describe('datasource/crate', () => {
           statusCode: 404,
         })
       );
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_crate' })).toBeNull();
     });
     it('throws for 5xx', async () => {
       got.mockImplementationOnce(() =>
@@ -60,7 +60,7 @@ describe('datasource/crate', () => {
       );
       let e;
       try {
-        await getPkgReleases({ lookupName: 'some_crate' });
+        await getReleases({ lookupName: 'some_crate' });
       } catch (err) {
         e = err;
       }
@@ -71,13 +71,13 @@ describe('datasource/crate', () => {
       got.mockImplementationOnce(() => {
         throw new Error();
       });
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_crate' })).toBeNull();
     });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      const res = await getPkgReleases({ lookupName: 'libc' });
+      const res = await getReleases({ lookupName: 'libc' });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(res).toBeDefined();
@@ -86,7 +86,7 @@ describe('datasource/crate', () => {
       got.mockReturnValueOnce({
         body: res2,
       });
-      const res = await getPkgReleases({ lookupName: 'amethyst' });
+      const res = await getReleases({ lookupName: 'amethyst' });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(res).toBeDefined();
@@ -95,14 +95,14 @@ describe('datasource/crate', () => {
       got.mockReturnValueOnce({
         body: res2,
       });
-      const res = await getPkgReleases({ lookupName: 'invalid-crate-name' });
+      const res = await getReleases({ lookupName: 'invalid-crate-name' });
       expect(res).toBeNull();
     });
     it('returns null for invalid crate data', async () => {
       got.mockReturnValueOnce({
         body: res3,
       });
-      const res = await getPkgReleases({ lookupName: 'some_crate' });
+      const res = await getReleases({ lookupName: 'some_crate' });
       expect(res).toBeNull();
     });
   });
diff --git a/lib/datasource/crate/index.ts b/lib/datasource/crate/index.ts
index 519daf8b43ed267deb1617598ea2b665eb6c4d9f..785724fdf651bab3af89e47e9fee22e67e7a9043 100644
--- a/lib/datasource/crate/index.ts
+++ b/lib/datasource/crate/index.ts
@@ -11,7 +11,7 @@ export const id = 'crate';
 
 const http = new Http(id);
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   const cacheNamespace = 'datasource-crate';
diff --git a/lib/datasource/dart/__snapshots__/index.spec.ts.snap b/lib/datasource/dart/__snapshots__/index.spec.ts.snap
index 198c90be543326bed79d1d06654df93a2af94e04..f293d01d44538373549879efa18fdf524ee39022 100644
--- a/lib/datasource/dart/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/dart/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/dart getPkgReleases processes real data 1`] = `
+exports[`datasource/dart getReleases processes real data 1`] = `
 Object {
   "homepage": "https://github.com/flutter/plugins/tree/master/packages/shared_preferences",
   "releases": Array [
@@ -60,4 +60,4 @@ Object {
 }
 `;
 
-exports[`datasource/dart getPkgReleases throws for 5xx 1`] = `[Error: registry-failure]`;
+exports[`datasource/dart getReleases throws for 5xx 1`] = `[Error: registry-failure]`;
diff --git a/lib/datasource/dart/index.spec.ts b/lib/datasource/dart/index.spec.ts
index 3e63fdb88d926df9e978e77a17d68c43fffe946e..e4a63bb018002150d005f8ff31d36e9ecc14f5bc 100644
--- a/lib/datasource/dart/index.spec.ts
+++ b/lib/datasource/dart/index.spec.ts
@@ -1,6 +1,6 @@
 import fs from 'fs';
 import _got from '../../util/got';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 
 const got: any = _got;
 
@@ -14,13 +14,13 @@ const body: any = JSON.parse(
 jest.mock('../../util/got');
 
 describe('datasource/dart', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       global.repoCache = {};
     });
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce(null);
-      expect(await getPkgReleases({ lookupName: 'non_sense' })).toBeNull();
+      expect(await getReleases({ lookupName: 'non_sense' })).toBeNull();
     });
     it('returns null for empty fields', async () => {
       const withoutVersions = {
@@ -29,7 +29,7 @@ describe('datasource/dart', () => {
       };
       got.mockReturnValueOnce({ body: withoutVersions });
       expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
+        await getReleases({ lookupName: 'shared_preferences' })
       ).toBeNull();
 
       const withoutLatest = {
@@ -38,7 +38,7 @@ describe('datasource/dart', () => {
       };
       got.mockReturnValueOnce({ body: withoutLatest });
       expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
+        await getReleases({ lookupName: 'shared_preferences' })
       ).toBeNull();
     });
     it('returns null for 404', async () => {
@@ -48,7 +48,7 @@ describe('datasource/dart', () => {
         })
       );
       expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
+        await getReleases({ lookupName: 'shared_preferences' })
       ).toBeNull();
     });
     it('throws for 5xx', async () => {
@@ -59,7 +59,7 @@ describe('datasource/dart', () => {
       );
       let e;
       try {
-        await getPkgReleases({ lookupName: 'shared_preferences' });
+        await getReleases({ lookupName: 'shared_preferences' });
       } catch (err) {
         e = err;
       }
@@ -71,12 +71,12 @@ describe('datasource/dart', () => {
         throw new Error();
       });
       expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
+        await getReleases({ lookupName: 'shared_preferences' })
       ).toBeNull();
     });
     it('processes real data', async () => {
       got.mockReturnValueOnce({ body });
-      const res = await getPkgReleases({
+      const res = await getReleases({
         lookupName: 'shared_preferences',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/dart/index.ts b/lib/datasource/dart/index.ts
index edbe714f0b7d7adac0c145014fc4f2d349294caf..7b2bdd691972dea9f9dfe042203ff6e835dc4cb7 100644
--- a/lib/datasource/dart/index.ts
+++ b/lib/datasource/dart/index.ts
@@ -6,7 +6,7 @@ export const id = 'dart';
 
 const http = new Http(id);
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   let result: ReleaseResult = null;
diff --git a/lib/datasource/docker/__snapshots__/index.spec.ts.snap b/lib/datasource/docker/__snapshots__/index.spec.ts.snap
index da12801f3fac6c7e387432bc1beb0d00a25393c8..7f13447ea0f33f2e10a55142db1f784e7ea43324 100644
--- a/lib/datasource/docker/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/docker/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`api/docker getPkgReleases adds library/ prefix for Docker Hub (explicit) 1`] = `
+exports[`api/docker getReleases adds library/ prefix for Docker Hub (explicit) 1`] = `
 [MockFunction] {
   "calls": Array [
     Array [
@@ -122,7 +122,7 @@ exports[`api/docker getPkgReleases adds library/ prefix for Docker Hub (explicit
 }
 `;
 
-exports[`api/docker getPkgReleases adds library/ prefix for Docker Hub (implicit) 1`] = `
+exports[`api/docker getReleases adds library/ prefix for Docker Hub (implicit) 1`] = `
 [MockFunction] {
   "calls": Array [
     Array [
@@ -244,7 +244,7 @@ exports[`api/docker getPkgReleases adds library/ prefix for Docker Hub (implicit
 }
 `;
 
-exports[`api/docker getPkgReleases adds no library/ prefix for other registries 1`] = `
+exports[`api/docker getReleases adds no library/ prefix for other registries 1`] = `
 [MockFunction] {
   "calls": Array [
     Array [
@@ -366,7 +366,7 @@ exports[`api/docker getPkgReleases adds no library/ prefix for other registries
 }
 `;
 
-exports[`api/docker getPkgReleases uses custom registry in depName 1`] = `
+exports[`api/docker getReleases uses custom registry in depName 1`] = `
 [MockFunction] {
   "calls": Array [
     Array [
@@ -435,7 +435,7 @@ exports[`api/docker getPkgReleases uses custom registry in depName 1`] = `
 }
 `;
 
-exports[`api/docker getPkgReleases uses custom registry with registryUrls 1`] = `
+exports[`api/docker getReleases uses custom registry with registryUrls 1`] = `
 Array [
   Array [
     "https://registry.company.com/v2/",
@@ -507,7 +507,7 @@ Array [
 ]
 `;
 
-exports[`api/docker getPkgReleases uses lower tag limit for ECR deps 1`] = `
+exports[`api/docker getReleases uses lower tag limit for ECR deps 1`] = `
 [MockFunction] {
   "calls": Array [
     Array [
diff --git a/lib/datasource/docker/index.spec.ts b/lib/datasource/docker/index.spec.ts
index 75b4ecf98acf27610de6fb2b148440348bdd2334..e6eaa4628d79ecb2c1c3d967a8cf19b7bead872a 100644
--- a/lib/datasource/docker/index.spec.ts
+++ b/lib/datasource/docker/index.spec.ts
@@ -269,7 +269,7 @@ describe('api/docker', () => {
       ).rejects.toThrow(Error(DATASOURCE_FAILURE));
     });
   });
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
       global.repoCache = {};
@@ -404,7 +404,7 @@ describe('api/docker', () => {
     });
     it('returns null on error', async () => {
       got.mockReturnValueOnce({});
-      const res = await docker.getPkgReleases({
+      const res = await docker.getReleases({
         lookupName: 'my/node',
       });
       expect(res).toBeNull();
diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts
index 05a7b84b7b1a076345c0ad58fb7cf106788bc4f1..9d12ed7da6624a7c4e4fbc1aa117611f199ac15d 100644
--- a/lib/datasource/docker/index.ts
+++ b/lib/datasource/docker/index.ts
@@ -561,7 +561,7 @@ async function getLabels(
 }
 
 /**
- * docker.getPkgReleases
+ * docker.getReleases
  *
  * A docker image usually looks something like this: somehost.io/owner/repo:8.1.0-alpine
  * In the above:
@@ -571,7 +571,7 @@ async function getLabels(
  *
  * This function will filter only tags that contain a semver version
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap b/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap
index c4afc6a3cd8360932e3b699f94edfc41ac6356d5..21b827a2d9f9b36b8e53baab55bbecf806df8bec 100644
--- a/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/galaxy getPkgReleases processes real data 1`] = `
+exports[`datasource/galaxy getReleases processes real data 1`] = `
 Object {
   "dependencyUrl": "https://galaxy.ansible.com/yatesr/timezone",
   "releases": Array [
@@ -21,4 +21,4 @@ Object {
 }
 `;
 
-exports[`datasource/galaxy getPkgReleases throws for 5xx 1`] = `[Error: registry-failure]`;
+exports[`datasource/galaxy getReleases throws for 5xx 1`] = `[Error: registry-failure]`;
diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts
index ba46fcb022db78c95f1833d51b49a50cf25146da..a902d97f704d80ac7c00bf060d43bcba139c3acc 100644
--- a/lib/datasource/galaxy/index.spec.ts
+++ b/lib/datasource/galaxy/index.spec.ts
@@ -1,7 +1,7 @@
 import fs from 'fs';
 
 import _got from '../../util/got';
-import { getPkgReleases } from './index';
+import { getReleases } from './index';
 
 const got: any = _got;
 
@@ -17,14 +17,14 @@ const empty = fs.readFileSync(
 jest.mock('../../util/got');
 
 describe('datasource/galaxy', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       global.repoCache = {};
     });
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce(null);
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for missing fields', async () => {
@@ -32,7 +32,7 @@ describe('datasource/galaxy', () => {
         body: undefined,
       });
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for empty list', async () => {
@@ -40,7 +40,7 @@ describe('datasource/galaxy', () => {
         body: '\n',
       });
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
+        await getReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
     it('returns null for 404', async () => {
@@ -49,19 +49,19 @@ describe('datasource/galaxy', () => {
           statusCode: 404,
         })
       );
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_crate' })).toBeNull();
     });
     it('returns null for unknown error', async () => {
       got.mockImplementationOnce(() => {
         throw new Error();
       });
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_crate' })).toBeNull();
     });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      const res = await getPkgReleases({ lookupName: 'yatesr.timezone' });
+      const res = await getReleases({ lookupName: 'yatesr.timezone' });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(res).toBeDefined();
@@ -70,7 +70,7 @@ describe('datasource/galaxy', () => {
       got.mockReturnValueOnce({
         body: empty,
       });
-      const res = await getPkgReleases({ lookupName: 'foo.bar' });
+      const res = await getReleases({ lookupName: 'foo.bar' });
       expect(res).toBeNull();
     });
     it('throws for 5xx', async () => {
@@ -81,7 +81,7 @@ describe('datasource/galaxy', () => {
       );
       let e;
       try {
-        await getPkgReleases({ lookupName: 'some_crate' });
+        await getReleases({ lookupName: 'some_crate' });
       } catch (err) {
         e = err;
       }
@@ -94,7 +94,7 @@ describe('datasource/galaxy', () => {
       got.mockImplementationOnce(() => {
         throw err;
       });
-      expect(await getPkgReleases({ lookupName: 'foo.bar' })).toBeNull();
+      expect(await getReleases({ lookupName: 'foo.bar' })).toBeNull();
     });
   });
 });
diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts
index f4a2d53c1a83f83845449cad1a458cea1148586d..d25c4aa61013bb09300993b0900ed03c6f4a9376 100644
--- a/lib/datasource/galaxy/index.ts
+++ b/lib/datasource/galaxy/index.ts
@@ -11,7 +11,7 @@ export const id = 'galaxy';
 
 const http = new Http(id);
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   const cacheNamespace = 'datasource-galaxy';
diff --git a/lib/datasource/git-refs/index.spec.ts b/lib/datasource/git-refs/index.spec.ts
index 1466081d0432a4374fe07e9d34e03b6399c93945..018f1c6772b17f2cb6a522dc2124e5869321d862 100644
--- a/lib/datasource/git-refs/index.spec.ts
+++ b/lib/datasource/git-refs/index.spec.ts
@@ -1,5 +1,5 @@
 import _simpleGit from 'simple-git/promise';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
@@ -8,14 +8,14 @@ const lookupName = 'https://github.com/example/example.git';
 
 describe('datasource/git-refs', () => {
   beforeEach(() => global.renovateCache.rmAll());
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     it('returns nil if response is wrong', async () => {
       simpleGit.mockReturnValue({
         listRemote() {
           return Promise.resolve(null);
         },
       });
-      const versions = await getPkgReleases({ lookupName });
+      const versions = await getReleases({ lookupName });
       expect(versions).toEqual(null);
     });
     it('returns nil if remote call throws exception', async () => {
@@ -24,7 +24,7 @@ describe('datasource/git-refs', () => {
           throw new Error();
         },
       });
-      const versions = await getPkgReleases({ lookupName });
+      const versions = await getReleases({ lookupName });
       expect(versions).toEqual(null);
     });
     it('returns versions filtered from tags', async () => {
@@ -36,7 +36,7 @@ describe('datasource/git-refs', () => {
         },
       });
 
-      const versions = await getPkgReleases({
+      const versions = await getReleases({
         lookupName,
       });
 
diff --git a/lib/datasource/git-refs/index.ts b/lib/datasource/git-refs/index.ts
index d0bc09825145671928b6f3e9489e758a0fe0713b..56277e3f7dd4455fefbe9bbed9bdb01c5ae9f73d 100644
--- a/lib/datasource/git-refs/index.ts
+++ b/lib/datasource/git-refs/index.ts
@@ -65,7 +65,7 @@ export async function getRawRefs({
   return null;
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   try {
diff --git a/lib/datasource/git-submodules/index.spec.ts b/lib/datasource/git-submodules/index.spec.ts
index 1c611332e06e43ad2675d2d94cc3490f48a04397..ddba901f603d083d90519e189e0015b45a257cb1 100644
--- a/lib/datasource/git-submodules/index.spec.ts
+++ b/lib/datasource/git-submodules/index.spec.ts
@@ -1,5 +1,5 @@
 import _simpleGit from 'simple-git/promise';
-import { getPkgReleases, getDigest } from '.';
+import { getReleases, getDigest } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
@@ -9,14 +9,14 @@ const registryUrls = [lookupName, 'master'];
 
 describe('datasource/git-submoduless', () => {
   beforeEach(() => global.renovateCache.rmAll());
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     it('returns null if response is wrong', async () => {
       simpleGit.mockReturnValue({
         listRemote() {
           return Promise.resolve(null);
         },
       });
-      const versions = await getPkgReleases({ lookupName, registryUrls });
+      const versions = await getReleases({ lookupName, registryUrls });
       expect(versions).toEqual(null);
     });
     it('returns null if remote call throws exception', async () => {
@@ -25,7 +25,7 @@ describe('datasource/git-submoduless', () => {
           throw new Error();
         },
       });
-      const versions = await getPkgReleases({ lookupName, registryUrls });
+      const versions = await getReleases({ lookupName, registryUrls });
       expect(versions).toEqual(null);
     });
     it('returns versions filtered from tags', async () => {
@@ -35,7 +35,7 @@ describe('datasource/git-submoduless', () => {
         },
       });
 
-      const versions = await getPkgReleases({
+      const versions = await getReleases({
         lookupName,
         registryUrls,
       });
diff --git a/lib/datasource/git-submodules/index.ts b/lib/datasource/git-submodules/index.ts
index 5f4a697c541e96c5a854cee93f7faffff5239a28..ddcbb50869d674431810b3c610997e492d724ee3 100644
--- a/lib/datasource/git-submodules/index.ts
+++ b/lib/datasource/git-submodules/index.ts
@@ -6,7 +6,7 @@ import { logger } from '../../logger';
 
 export const id = 'git-submodules';
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts
index 007d26c24b60d883eefc69c80d41f973a9149bb1..b40c894683479d8fbbd63cb71062d9d62e9a8a38 100644
--- a/lib/datasource/git-tags/index.spec.ts
+++ b/lib/datasource/git-tags/index.spec.ts
@@ -1,5 +1,5 @@
 import _simpleGit from 'simple-git/promise';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
@@ -8,14 +8,14 @@ const lookupName = 'https://github.com/example/example.git';
 
 describe('datasource/git-tags', () => {
   beforeEach(() => global.renovateCache.rmAll());
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     it('returns nil if response is wrong', async () => {
       simpleGit.mockReturnValue({
         listRemote() {
           return Promise.resolve(null);
         },
       });
-      const versions = await getPkgReleases({ lookupName });
+      const versions = await getReleases({ lookupName });
       expect(versions).toEqual(null);
     });
     it('returns nil if remote call throws exception', async () => {
@@ -24,7 +24,7 @@ describe('datasource/git-tags', () => {
           throw new Error();
         },
       });
-      const versions = await getPkgReleases({ lookupName });
+      const versions = await getReleases({ lookupName });
       expect(versions).toEqual(null);
     });
     it('returns versions filtered from tags', async () => {
@@ -36,7 +36,7 @@ describe('datasource/git-tags', () => {
         },
       });
 
-      const versions = await getPkgReleases({
+      const versions = await getReleases({
         lookupName,
       });
       const result = versions.releases.map(x => x.version).sort();
diff --git a/lib/datasource/git-tags/index.ts b/lib/datasource/git-tags/index.ts
index 94392a72970af1418f7b39b762cca0d61b218527..e3100080001561951595d15d1c4ba13443c89bde 100644
--- a/lib/datasource/git-tags/index.ts
+++ b/lib/datasource/git-tags/index.ts
@@ -4,7 +4,7 @@ import * as gitRefs from '../git-refs';
 
 export const id = 'git-tags';
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   const rawRefs: gitRefs.RawRefs[] = await gitRefs.getRawRefs({ lookupName });
diff --git a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
index b4544ba763a996daf23aebdcd7073233e4b03f8e..3ec77f6047f18c5e0f483cce72bb5923de279784 100644
--- a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/github-releases getPkgReleases returns releases 1`] = `
+exports[`datasource/github-releases getReleases returns releases 1`] = `
 Object {
   "releases": Array [
     Object {
diff --git a/lib/datasource/github-releases/index.spec.ts b/lib/datasource/github-releases/index.spec.ts
index 8e19d6e1c4721c0ff2eeacdcc5fe1a34decb32d9..b1272f5b915e97433250fd564ef68d3ec78d7a80 100644
--- a/lib/datasource/github-releases/index.spec.ts
+++ b/lib/datasource/github-releases/index.spec.ts
@@ -10,7 +10,7 @@ const ghGot: any = api.get;
 
 describe('datasource/github-releases', () => {
   beforeEach(() => global.renovateCache.rmAll());
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeAll(() => global.renovateCache.rmAll());
     it('returns releases', async () => {
       const body = [
@@ -20,7 +20,7 @@ describe('datasource/github-releases', () => {
         { tag_name: 'v1.1.0', published_at: '2020-03-09T10:00:00Z' },
       ];
       ghGot.mockReturnValueOnce({ headers: {}, body });
-      const res = await github.getPkgReleases({
+      const res = await github.getReleases({
         lookupName: 'some/dep',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/github-releases/index.ts b/lib/datasource/github-releases/index.ts
index 02b192b992d55e44ff23e1b30e676a939eb632b0..8dc8261265de82ccc86eb6587b50294741c717c5 100644
--- a/lib/datasource/github-releases/index.ts
+++ b/lib/datasource/github-releases/index.ts
@@ -14,7 +14,7 @@ type GithubRelease = {
 };
 
 /**
- * github.getPkgReleases
+ * github.getReleases
  *
  * This function can be used to fetch releases with a customisable versioning (e.g. semver) and with releases.
  *
@@ -23,7 +23,7 @@ type GithubRelease = {
  *  - Sanitize the versions if desired (e.g. strip out leading 'v')
  *  - Return a dependency object containing sourceUrl string and releases array
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName: repo,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   let githubReleases: GithubRelease[];
diff --git a/lib/datasource/github-tags/__snapshots__/index.spec.ts.snap b/lib/datasource/github-tags/__snapshots__/index.spec.ts.snap
index 326ad0ee45c5fb3a40cbbef20d5256e1e82e748f..527501df58e700dfd56c7c52d8aa7b4d6f890f7d 100644
--- a/lib/datasource/github-tags/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/github-tags/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/github-tags getPkgReleases returns tags 1`] = `
+exports[`datasource/github-tags getReleases returns tags 1`] = `
 Object {
   "releases": Array [
     Object {
diff --git a/lib/datasource/github-tags/index.spec.ts b/lib/datasource/github-tags/index.spec.ts
index aaad1a536a09bee8246846aa9b180a1f98774167..1655cd3bf64d69ce1dec4b524387437943f21888 100644
--- a/lib/datasource/github-tags/index.spec.ts
+++ b/lib/datasource/github-tags/index.spec.ts
@@ -59,12 +59,12 @@ describe('datasource/github-tags', () => {
       expect(res).toBeNull();
     });
   });
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeAll(() => global.renovateCache.rmAll());
     it('returns tags', async () => {
       const body = [{ name: 'v1.0.0' }, { name: 'v1.1.0' }];
       ghGot.mockReturnValueOnce({ headers: {}, body });
-      const res = await github.getPkgReleases({
+      const res = await github.getReleases({
         lookupName: 'some/dep2',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/github-tags/index.ts b/lib/datasource/github-tags/index.ts
index 9cfcf220602f0827a1f5f2fe1b29ef55e725094a..05ae4ce3eae25477bd388c8bd328a79717fb3d2a 100644
--- a/lib/datasource/github-tags/index.ts
+++ b/lib/datasource/github-tags/index.ts
@@ -99,7 +99,7 @@ export async function getDigest(
 }
 
 /**
- * github.getPkgReleases
+ * github.getReleases
  *
  * This function can be used to fetch releases with a customisable versioning (e.g. semver) and with either tags or releases.
  *
@@ -108,7 +108,7 @@ export async function getDigest(
  *  - Sanitize the versions if desired (e.g. strip out leading 'v')
  *  - Return a dependency object containing sourceUrl string and releases array
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName: repo,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   let versions: string[];
diff --git a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
index bf29c12e1019850a4673af97f650e0cb504122e7..7e30e3139bc727c515853144a0b983f624b9b854 100644
--- a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/gitlab-tags getPkgReleases returns tags 1`] = `
+exports[`datasource/gitlab-tags getReleases returns tags 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -23,7 +23,7 @@ Object {
 }
 `;
 
-exports[`datasource/gitlab-tags getPkgReleases returns tags with default registry 1`] = `
+exports[`datasource/gitlab-tags getReleases returns tags with default registry 1`] = `
 Object {
   "releases": Array [
     Object {
diff --git a/lib/datasource/gitlab-tags/index.spec.ts b/lib/datasource/gitlab-tags/index.spec.ts
index 30dfbb2b29b594d33104c9c39e184b01d44d1f35..baa74f48de909855cc7a72e957f522c9f234a56b 100644
--- a/lib/datasource/gitlab-tags/index.spec.ts
+++ b/lib/datasource/gitlab-tags/index.spec.ts
@@ -11,7 +11,7 @@ describe('datasource/gitlab-tags', () => {
     global.repoCache = {};
     return global.renovateCache.rmAll();
   });
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeAll(() => global.renovateCache.rmAll());
     it('returns tags', async () => {
       const body = [
@@ -30,7 +30,7 @@ describe('datasource/gitlab-tags', () => {
         },
       ];
       glGot.mockReturnValueOnce({ headers: {}, body });
-      const res = await gitlab.getPkgReleases({
+      const res = await gitlab.getReleases({
         registryUrls: ['https://gitlab.company.com/api/v4/'],
         lookupName: 'some/dep2',
       });
@@ -41,7 +41,7 @@ describe('datasource/gitlab-tags', () => {
     it('returns tags with default registry', async () => {
       const body = [{ name: 'v1.0.0' }, { name: 'v1.1.0' }];
       glGot.mockReturnValueOnce({ headers: {}, body });
-      const res = await gitlab.getPkgReleases({
+      const res = await gitlab.getReleases({
         lookupName: 'some/dep2',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/gitlab-tags/index.ts b/lib/datasource/gitlab-tags/index.ts
index dc086e5a74c0062bbd7ae6d329eba009ecbe822c..1087ee071f7b2aa52df0eda563d42a504c4aca7b 100644
--- a/lib/datasource/gitlab-tags/index.ts
+++ b/lib/datasource/gitlab-tags/index.ts
@@ -20,7 +20,7 @@ type GitlabTag = {
   };
 };
 
-export async function getPkgReleases({
+export async function getReleases({
   registryUrls,
   lookupName: repo,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/go/__snapshots__/index.spec.ts.snap b/lib/datasource/go/__snapshots__/index.spec.ts.snap
index f5bf3271a4a1f5472e54e6f7d967090befe2ad87..1e688a0e2ee5cb5222e839cef3d193d9d90c3855 100644
--- a/lib/datasource/go/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/go/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/go getPkgReleases processes real data 1`] = `
+exports[`datasource/go getReleases processes real data 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -13,7 +13,7 @@ Object {
 }
 `;
 
-exports[`datasource/go getPkgReleases works for known servers 1`] = `
+exports[`datasource/go getReleases works for known servers 1`] = `
 Array [
   Array [
     Object {
@@ -36,7 +36,7 @@ Array [
 ]
 `;
 
-exports[`datasource/go getPkgReleases works for nested modules on github 1`] = `
+exports[`datasource/go getReleases works for nested modules on github 1`] = `
 Array [
   Array [
     Object {
diff --git a/lib/datasource/go/index.spec.ts b/lib/datasource/go/index.spec.ts
index e6242afb3a7bfabd14d4496390ca43841f835fdf..5b3c72a5cde2f175638a7db222f1a598e856e0f4 100644
--- a/lib/datasource/go/index.spec.ts
+++ b/lib/datasource/go/index.spec.ts
@@ -45,11 +45,11 @@ describe('datasource/go', () => {
       expect(res).toBe('abcdefabcdefabcdefabcdef');
     });
   });
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce(null);
       expect(
-        await go.getPkgReleases({
+        await go.getReleases({
           lookupName: 'golang.org/foo/something',
         })
       ).toBeNull();
@@ -61,7 +61,7 @@ describe('datasource/go', () => {
         })
       );
       expect(
-        await go.getPkgReleases({
+        await go.getReleases({
           lookupName: 'golang.org/foo/something',
         })
       ).toBeNull();
@@ -71,7 +71,7 @@ describe('datasource/go', () => {
         throw new Error();
       });
       expect(
-        await go.getPkgReleases({
+        await go.getReleases({
           lookupName: 'golang.org/foo/something',
         })
       ).toBeNull();
@@ -80,10 +80,10 @@ describe('datasource/go', () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      github.getPkgReleases.mockResolvedValueOnce({
+      github.getReleases.mockResolvedValueOnce({
         releases: [{ version: 'v1.0.0' }, { version: 'v2.0.0' }],
       });
-      const res = await go.getPkgReleases({
+      const res = await go.getReleases({
         lookupName: 'golang.org/x/text',
       });
       expect(res).toMatchSnapshot();
@@ -94,7 +94,7 @@ describe('datasource/go', () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      const res = await go.getPkgReleases({
+      const res = await go.getReleases({
         lookupName: 'golang.org/x/sys',
       });
       expect(res).toBeNull();
@@ -106,14 +106,14 @@ describe('datasource/go', () => {
           'https://google.com/golang/text/'
         ),
       });
-      const res = await go.getPkgReleases({
+      const res = await go.getReleases({
         lookupName: 'golang.org/x/text',
       });
       expect(res).toBeNull();
     });
     it('works for known servers', async () => {
       got.mockClear();
-      github.getPkgReleases.mockClear();
+      github.getReleases.mockClear();
       const packages = [
         { lookupName: 'github.com/x/text' },
         { lookupName: 'gopkg.in/x/text' },
@@ -121,37 +121,37 @@ describe('datasource/go', () => {
       ];
       const githubRes = { releases: [1, 2] } as any;
       for (const pkg of packages) {
-        github.getPkgReleases.mockResolvedValueOnce(
+        github.getReleases.mockResolvedValueOnce(
           partial<ReleaseResult>(githubRes)
         );
-        expect(await go.getPkgReleases(pkg)).toEqual(githubRes);
+        expect(await go.getReleases(pkg)).toEqual(githubRes);
       }
       expect(got).toHaveBeenCalledTimes(0);
-      expect(github.getPkgReleases.mock.calls).toMatchSnapshot();
+      expect(github.getReleases.mock.calls).toMatchSnapshot();
     });
     it('works for nested modules on github', async () => {
       got.mockClear();
-      github.getPkgReleases.mockClear();
+      github.getReleases.mockClear();
       const packages = [
         { lookupName: 'github.com/x/text/a' },
         { lookupName: 'github.com/x/text/b' },
       ];
 
       for (const pkg of packages) {
-        github.getPkgReleases.mockResolvedValueOnce({
+        github.getReleases.mockResolvedValueOnce({
           releases: [{ version: 'a/v1.0.0' }, { version: 'b/v2.0.0' }],
         });
         const prefix = pkg.lookupName.split('/')[3];
-        const result = await go.getPkgReleases(pkg);
+        const result = await go.getReleases(pkg);
         expect(result.releases).toHaveLength(1);
         expect(result.releases[0].version.startsWith(prefix));
       }
       expect(got).toHaveBeenCalledTimes(0);
-      expect(github.getPkgReleases.mock.calls).toMatchSnapshot();
+      expect(github.getReleases.mock.calls).toMatchSnapshot();
     });
     it('falls back to old behaviour', async () => {
       got.mockClear();
-      github.getPkgReleases.mockClear();
+      github.getReleases.mockClear();
       const packages = [
         { lookupName: 'github.com/x/text/a' },
         { lookupName: 'github.com/x/text/b' },
@@ -161,8 +161,8 @@ describe('datasource/go', () => {
         releases: [{ version: 'v1.0.0' }, { version: 'v2.0.0' }],
       };
       for (const pkg of packages) {
-        github.getPkgReleases.mockResolvedValueOnce(releases);
-        expect(await go.getPkgReleases(pkg)).toBe(releases);
+        github.getReleases.mockResolvedValueOnce(releases);
+        expect(await go.getReleases(pkg)).toBe(releases);
       }
     });
   });
diff --git a/lib/datasource/go/index.ts b/lib/datasource/go/index.ts
index 8e31730d71d8d74e730bd41c214de694631e83ef..ad579a5007b40c2b3c53f7be9744e90b8646d5b1 100644
--- a/lib/datasource/go/index.ts
+++ b/lib/datasource/go/index.ts
@@ -70,23 +70,23 @@ async function getDatasource(goModule: string): Promise<DataSource | null> {
 }
 
 /**
- * go.getPkgReleases
+ * go.getReleases
  *
  * This datasource resolves a go module URL into its source repository
  *  and then fetch it if it is on GitHub.
  *
  * This function will:
  *  - Determine the source URL for the module
- *  - Call the respective getPkgReleases in github to retrieve the tags
+ *  - Call the respective getReleases in github to retrieve the tags
  *  - Filter module tags according to the module path
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
-}: Partial<GetReleasesConfig>): Promise<ReleaseResult | null> {
-  logger.trace(`go.getPkgReleases(${lookupName})`);
+}: GetReleasesConfig): Promise<ReleaseResult | null> {
+  logger.trace(`go.getReleases(${lookupName})`);
   const source = await getDatasource(lookupName);
   if (source && source.datasource === github.id) {
-    const res = await github.getPkgReleases(source);
+    const res = await github.getReleases(source);
     // istanbul ignore if
     if (!res) {
       return res;
@@ -97,10 +97,10 @@ export async function getPkgReleases({
      * the old behaviour stays the same.
      */
     const nameParts = lookupName.split('/');
-    logger.trace({ nameParts, releases: res.releases }, 'go.getPkgReleases');
+    logger.trace({ nameParts, releases: res.releases }, 'go.getReleases');
     if (nameParts.length > 3) {
       const prefix = nameParts.slice(3, nameParts.length).join('/');
-      logger.trace(`go.getPkgReleases.prefix:${prefix}`);
+      logger.trace(`go.getReleases.prefix:${prefix}`);
       const submodReleases = res.releases
         .filter(
           release => release.version && release.version.startsWith(prefix)
@@ -110,7 +110,7 @@ export async function getPkgReleases({
           r2.version = r2.version.replace(`${prefix}/`, '');
           return r2;
         });
-      logger.trace({ submodReleases }, 'go.getPkgReleases');
+      logger.trace({ submodReleases }, 'go.getReleases');
       if (submodReleases.length > 0) {
         res.releases = submodReleases;
         return res;
diff --git a/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap b/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
index ecd8ea975d42b9b1978c5fc35694ece49d90c0fa..aa9db33c4c50b8acb9cde7a123aa8b3cf0b29316 100644
--- a/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/gradle-version getPkgReleases calls configured registryUrls 1`] = `
+exports[`datasource/gradle-version getReleases calls configured registryUrls 1`] = `
 Object {
   "homepage": "https://gradle.org",
   "releases": Array [
@@ -801,7 +801,7 @@ Object {
 }
 `;
 
-exports[`datasource/gradle-version getPkgReleases processes real data 1`] = `
+exports[`datasource/gradle-version getReleases processes real data 1`] = `
 Object {
   "homepage": "https://gradle.org",
   "releases": Array [
diff --git a/lib/datasource/gradle-version/index.spec.ts b/lib/datasource/gradle-version/index.spec.ts
index 49fb650f701f7f0edc206a68f32e5ac7fa8f0edd..23f7351972fd642b3d1fe35fad63e2cf541a9f1b 100644
--- a/lib/datasource/gradle-version/index.spec.ts
+++ b/lib/datasource/gradle-version/index.spec.ts
@@ -13,7 +13,7 @@ const allResponse: any = fs.readFileSync(
 let config: any = {};
 
 describe('datasource/gradle-version', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       config = {
         lookupName: 'abc',
@@ -27,7 +27,7 @@ describe('datasource/gradle-version', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(allResponse),
       });
-      const res = await gradleVersion.getPkgReleases(config);
+      const res = await gradleVersion.getReleases(config);
       expect(got).toHaveBeenCalledTimes(1);
       expect(got.mock.calls[0][0]).toEqual(
         'https://services.gradle.org/versions/all'
@@ -40,7 +40,7 @@ describe('datasource/gradle-version', () => {
       got.mockReturnValue({
         body: JSON.parse(allResponse),
       });
-      const res = await gradleVersion.getPkgReleases({
+      const res = await gradleVersion.getReleases({
         ...config,
         registryUrls: ['https://foo.bar', 'http://baz.qux'],
       });
diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts
index 9e22603806c7c8e4cea5eac064c4d0d92b7b7f47..e0fa9d3a2d87b932425d930a7c58da9bfb836630 100644
--- a/lib/datasource/gradle-version/index.ts
+++ b/lib/datasource/gradle-version/index.ts
@@ -40,7 +40,7 @@ function formatBuildTime(timeStr: string): string | null {
   return null;
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult> {
   const versionsUrls = is.nonEmptyArray(registryUrls)
diff --git a/lib/datasource/helm/__snapshots__/index.spec.ts.snap b/lib/datasource/helm/__snapshots__/index.spec.ts.snap
index 580f6a186c2ef1e7082c78562b5c0b2ae1e06697..e29bfcf08e6e7ca6b8766b0d61c8460c79e99b48 100644
--- a/lib/datasource/helm/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/helm/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/helm getPkgReleases returns list of versions for normal response if index.yaml is cached 1`] = `
+exports[`datasource/helm getReleases returns list of versions for normal response if index.yaml is cached 1`] = `
 Object {
   "homepage": "https://www.getambassador.io/",
   "name": "ambassador",
@@ -118,7 +118,7 @@ Object {
 }
 `;
 
-exports[`datasource/helm getPkgReleases returns list of versions for normal response if index.yaml is not cached 1`] = `
+exports[`datasource/helm getReleases returns list of versions for normal response if index.yaml is not cached 1`] = `
 Object {
   "homepage": "https://www.getambassador.io/",
   "name": "ambassador",
@@ -236,4 +236,4 @@ Object {
 }
 `;
 
-exports[`datasource/helm getPkgReleases throws for 5xx 1`] = `[Error: registry-failure]`;
+exports[`datasource/helm getReleases throws for 5xx 1`] = `[Error: registry-failure]`;
diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts
index 3fc7b7cfe7142a03d329910ae9c93f44bb5911dd..5c7e2eeea6957b7b80636c06522b2ed52085bf97 100644
--- a/lib/datasource/helm/index.spec.ts
+++ b/lib/datasource/helm/index.spec.ts
@@ -1,6 +1,6 @@
 import fs from 'fs';
 import _got from '../../util/got';
-import { getPkgReleases, getRepositoryData } from '.';
+import { getReleases, getRepositoryData } from '.';
 
 const got: any = _got;
 
@@ -13,7 +13,7 @@ const indexYaml = fs.readFileSync(
 jest.mock('../../util/got');
 
 describe('datasource/helm', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.resetAllMocks();
       global.repoCache = {};
@@ -21,7 +21,7 @@ describe('datasource/helm', () => {
     });
     it('returns null if lookupName was not provided', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: undefined,
           registryUrls: ['example-repository.com'],
         })
@@ -29,7 +29,7 @@ describe('datasource/helm', () => {
     });
     it('returns null if repository was not provided', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'some_chart',
           registryUrls: [],
         })
@@ -38,7 +38,7 @@ describe('datasource/helm', () => {
     it('returns null for empty response', async () => {
       got.mockReturnValueOnce(null);
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'non_existent_chart',
           registryUrls: ['example-repository.com'],
         })
@@ -49,7 +49,7 @@ describe('datasource/helm', () => {
         body: undefined,
       });
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'non_existent_chart',
           registryUrls: ['example-repository.com'],
         })
@@ -62,7 +62,7 @@ describe('datasource/helm', () => {
         })
       );
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'some_chart',
           registryUrls: ['example-repository.com'],
         })
@@ -76,7 +76,7 @@ describe('datasource/helm', () => {
       );
       let e;
       try {
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'some_chart',
           registryUrls: ['example-repository.com'],
         });
@@ -91,7 +91,7 @@ describe('datasource/helm', () => {
         throw new Error();
       });
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'some_chart',
           registryUrls: ['example-repository.com'],
         })
@@ -100,7 +100,7 @@ describe('datasource/helm', () => {
     it('returns null if index.yaml in response is empty', async () => {
       const res = { body: '# A comment' };
       got.mockReturnValueOnce(res);
-      const releases = await getPkgReleases({
+      const releases = await getReleases({
         lookupName: 'non_existent_chart',
         registryUrls: ['example-repository.com'],
       });
@@ -114,7 +114,7 @@ describe('datasource/helm', () => {
                      yaml`,
       };
       got.mockReturnValueOnce(res);
-      const releases = await getPkgReleases({
+      const releases = await getReleases({
         lookupName: 'non_existent_chart',
         registryUrls: ['example-repository.com'],
       });
@@ -122,7 +122,7 @@ describe('datasource/helm', () => {
     });
     it('returns null if lookupName is not in index.yaml', async () => {
       got.mockReturnValueOnce({ body: indexYaml });
-      const releases = await getPkgReleases({
+      const releases = await getReleases({
         lookupName: 'non_existent_chart',
         registryUrls: ['example-repository.com'],
       });
@@ -130,7 +130,7 @@ describe('datasource/helm', () => {
     });
     it('returns list of versions for normal response if index.yaml is not cached', async () => {
       got.mockReturnValueOnce({ body: indexYaml });
-      const releases = await getPkgReleases({
+      const releases = await getReleases({
         lookupName: 'ambassador',
         registryUrls: ['example-repository.com'],
       });
@@ -150,7 +150,7 @@ describe('datasource/helm', () => {
         repositoryData,
         cacheMinutes
       );
-      const releases = await getPkgReleases({
+      const releases = await getReleases({
         lookupName: 'ambassador',
         registryUrls: [repository],
       });
diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts
index 2b7bbbdbc1e46a8f6618e640ca5c506951a731b7..1b15ff6f2e1c41f0b18acc85251842dfc969bd61 100644
--- a/lib/datasource/helm/index.ts
+++ b/lib/datasource/helm/index.ts
@@ -86,13 +86,13 @@ export async function getRepositoryData(
   }
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   const [helmRepository] = registryUrls;
   if (!helmRepository) {
-    logger.warn(`helmRepository was not provided to getPkgReleases`);
+    logger.warn(`helmRepository was not provided to getReleases`);
     return null;
   }
   const repositoryData = await getRepositoryData(helmRepository);
diff --git a/lib/datasource/hex/__snapshots__/index.spec.ts.snap b/lib/datasource/hex/__snapshots__/index.spec.ts.snap
index eb677ee4f3309ad58e2d6901bc95e673b1421198..668e54458d8bccb5c864d52f1d2c052d06840bb9 100644
--- a/lib/datasource/hex/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/hex/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/hex getPkgReleases process public repo without auth 1`] = `
+exports[`datasource/hex getReleases process public repo without auth 1`] = `
 Object {
   "homepage": "https://hex.pm/packages/certifi",
   "releases": Array [
@@ -88,7 +88,7 @@ Object {
 }
 `;
 
-exports[`datasource/hex getPkgReleases processes real data 1`] = `
+exports[`datasource/hex getReleases processes real data 1`] = `
 Object {
   "homepage": "https://hex.pm/packages/certifi",
   "releases": Array [
diff --git a/lib/datasource/hex/index.spec.ts b/lib/datasource/hex/index.spec.ts
index f55cd760874357523696d8ef0f6412a090313d89..0a165808e61b8b09fa47a9da840058fd4a82a1a2 100644
--- a/lib/datasource/hex/index.spec.ts
+++ b/lib/datasource/hex/index.spec.ts
@@ -1,7 +1,7 @@
 import fs from 'fs';
 import _got from '../../util/got';
 import * as _hostRules from '../../util/host-rules';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
 
 const got: any = _got;
@@ -17,25 +17,25 @@ jest.mock('../../util/got');
 jest.mock('../../util/host-rules');
 
 describe('datasource/hex', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       global.repoCache = {};
     });
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce(null);
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_package' })
+        await getReleases({ lookupName: 'non_existent_package' })
       ).toBeNull();
     });
     it('returns null for missing fields', async () => {
       got.mockReturnValueOnce({});
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_package' })
+        await getReleases({ lookupName: 'non_existent_package' })
       ).toBeNull();
 
       got.mockReturnValueOnce({ body: {} });
       expect(
-        await getPkgReleases({ lookupName: 'non_existent_package' })
+        await getReleases({ lookupName: 'non_existent_package' })
       ).toBeNull();
     });
     it('returns null for 404', async () => {
@@ -44,7 +44,7 @@ describe('datasource/hex', () => {
           statusCode: 404,
         })
       );
-      expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_package' })).toBeNull();
     });
     it('returns null for 401', async () => {
       got.mockImplementationOnce(() =>
@@ -52,7 +52,7 @@ describe('datasource/hex', () => {
           statusCode: 401,
         })
       );
-      expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_package' })).toBeNull();
     });
     it('throws for 429', async () => {
       got.mockImplementationOnce(() =>
@@ -61,7 +61,7 @@ describe('datasource/hex', () => {
         })
       );
       await expect(
-        getPkgReleases({ lookupName: 'some_crate' })
+        getReleases({ lookupName: 'some_crate' })
       ).rejects.toThrowError(DATASOURCE_FAILURE);
     });
     it('throws for 5xx', async () => {
@@ -71,14 +71,14 @@ describe('datasource/hex', () => {
         })
       );
       await expect(
-        getPkgReleases({ lookupName: 'some_crate' })
+        getReleases({ lookupName: 'some_crate' })
       ).rejects.toThrowError(DATASOURCE_FAILURE);
     });
     it('returns null for unknown error', async () => {
       got.mockImplementationOnce(() => {
         throw new Error();
       });
-      expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull();
+      expect(await getReleases({ lookupName: 'some_package' })).toBeNull();
     });
     it('returns null with wrong auth token', async () => {
       hostRules.find.mockReturnValueOnce({ token: 'this_simple_token' });
@@ -87,14 +87,14 @@ describe('datasource/hex', () => {
           statusCode: 401,
         })
       );
-      const res = await getPkgReleases({ lookupName: 'certifi' });
+      const res = await getReleases({ lookupName: 'certifi' });
       expect(res).toBeNull();
     });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      const res = await getPkgReleases({ lookupName: 'certifi' });
+      const res = await getReleases({ lookupName: 'certifi' });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(res).toBeDefined();
@@ -104,7 +104,7 @@ describe('datasource/hex', () => {
       got.mockReturnValueOnce({
         body: res1,
       });
-      const res = await getPkgReleases({ lookupName: 'certifi' });
+      const res = await getReleases({ lookupName: 'certifi' });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(res).toBeDefined();
diff --git a/lib/datasource/hex/index.ts b/lib/datasource/hex/index.ts
index 79dd1d8f946e6de99baedef7108768d48ed3b0f1..9653258d71d89c18a6fa3bc8b38a3036b92f0288 100644
--- a/lib/datasource/hex/index.ts
+++ b/lib/datasource/hex/index.ts
@@ -15,9 +15,9 @@ interface HexRelease {
   }[];
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
-}: Partial<GetReleasesConfig>): Promise<ReleaseResult | null> {
+}: GetReleasesConfig): Promise<ReleaseResult | null> {
   // Get dependency name from lookupName.
   // If the dependency is private lookupName contains organization name as following:
   // hexPackageName:organizationName
diff --git a/lib/datasource/index.spec.ts b/lib/datasource/index.spec.ts
index 717c6ad314ffc724d5ca062db0a0ff57a2880071..746f8c86d50a84c26f802704969be551d8a57e13 100644
--- a/lib/datasource/index.spec.ts
+++ b/lib/datasource/index.spec.ts
@@ -21,7 +21,7 @@ describe('datasource/index', () => {
       module: datasource.Datasource,
       name: string
     ): boolean {
-      if (!module.getPkgReleases) {
+      if (!module.getReleases) {
         return false;
       }
       if (module.id !== name) {
@@ -47,6 +47,7 @@ describe('datasource/index', () => {
   it('returns null for no datasource', async () => {
     expect(
       await datasource.getPkgReleases({
+        datasource: null,
         depName: 'some/dep',
       })
     ).toBeNull();
@@ -55,6 +56,7 @@ describe('datasource/index', () => {
     expect(
       await datasource.getPkgReleases({
         datasource: 'npm',
+        depName: null,
       })
     ).toBeNull();
   });
@@ -75,7 +77,7 @@ describe('datasource/index', () => {
     ).toBeUndefined();
   });
   it('adds changelogUrl', async () => {
-    npmDatasource.getPkgReleases.mockResolvedValue({ releases: [] });
+    npmDatasource.getReleases.mockResolvedValue({ releases: [] });
     const res = await datasource.getPkgReleases({
       datasource: datasourceNpm.id,
       depName: 'react-native',
@@ -85,7 +87,7 @@ describe('datasource/index', () => {
     expect(res.sourceUrl).toBeDefined();
   });
   it('adds sourceUrl', async () => {
-    npmDatasource.getPkgReleases.mockResolvedValue({ releases: [] });
+    npmDatasource.getReleases.mockResolvedValue({ releases: [] });
     const res = await datasource.getPkgReleases({
       datasource: datasourceNpm.id,
       depName: 'node',
@@ -94,7 +96,7 @@ describe('datasource/index', () => {
     expect(res.sourceUrl).toBeDefined();
   });
   it('trims sourceUrl', async () => {
-    npmDatasource.getPkgReleases.mockResolvedValue({
+    npmDatasource.getReleases.mockResolvedValue({
       sourceUrl: ' https://abc.com',
       releases: [],
     });
@@ -105,7 +107,7 @@ describe('datasource/index', () => {
     expect(res.sourceUrl).toEqual('https://abc.com');
   });
   it('massages sourceUrl', async () => {
-    npmDatasource.getPkgReleases.mockResolvedValue({
+    npmDatasource.getReleases.mockResolvedValue({
       sourceUrl: 'scm:git@github.com:Jasig/cas.git',
       releases: [],
     });
diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts
index 82b80a3631c0fed8b2c98bea9f396a97d00609b1..52f40e43e9ab3d44a3dcf1dbd814056e8226ad01 100644
--- a/lib/datasource/index.ts
+++ b/lib/datasource/index.ts
@@ -5,10 +5,11 @@ import * as allVersioning from '../versioning';
 import {
   Datasource,
   DatasourceError,
-  PkgReleaseConfig,
   Release,
   ReleaseResult,
   DigestConfig,
+  GetReleasesConfig,
+  GetPkgReleasesConfig,
 } from './common';
 import * as semverVersioning from '../versioning/semver';
 import datasources from './api.generated';
@@ -25,25 +26,23 @@ function load(datasource: string): Promise<Datasource> {
   return datasources.get(datasource);
 }
 
+type GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;
+
 async function fetchReleases(
-  config: PkgReleaseConfig
+  config: GetReleasesInternalConfig
 ): Promise<ReleaseResult | null> {
   const { datasource } = config;
-  if (!datasource) {
-    logger.warn('No datasource found');
-    return null;
-  }
   if (!datasources.has(datasource)) {
     logger.warn('Unknown datasource: ' + datasource);
     return null;
   }
-  const dep = await (await load(datasource)).getPkgReleases(config);
+  const dep = await (await load(datasource)).getReleases(config);
   addMetaData(dep, datasource, config.lookupName);
   return dep;
 }
 
 function getRawReleases(
-  config: PkgReleaseConfig
+  config: GetReleasesInternalConfig
 ): Promise<ReleaseResult | null> {
   const cacheKey =
     cacheNamespace +
@@ -59,12 +58,15 @@ function getRawReleases(
 }
 
 export async function getPkgReleases(
-  config: PkgReleaseConfig
+  config: GetPkgReleasesConfig
 ): Promise<ReleaseResult | null> {
-  const { datasource } = config;
+  if (!config.datasource) {
+    logger.warn('No datasource found');
+    return null;
+  }
   const lookupName = config.lookupName || config.depName;
   if (!lookupName) {
-    logger.error({ config }, 'Datasource getPkgReleases without lookupName');
+    logger.error({ config }, 'Datasource getReleases without lookupName');
     return null;
   }
   let res: ReleaseResult;
@@ -75,7 +77,7 @@ export async function getPkgReleases(
     });
   } catch (e) /* istanbul ignore next */ {
     if (e instanceof DatasourceError) {
-      e.datasource = datasource;
+      e.datasource = config.datasource;
       e.lookupName = lookupName;
     }
     throw e;
diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts
index c899da639520be7b3b81c5c8d3b4a7ca6c49e822..2a42acdd1228d0b86627293d3a8e8476ab80c369 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -96,9 +96,9 @@ describe('datasource/maven', () => {
     return versions.map(v => ({ version: v }));
   }
 
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     it('should return empty if library is not found', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'unknown:unknown',
         registryUrls: [
@@ -110,7 +110,7 @@ describe('datasource/maven', () => {
     });
 
     it('should simply return all versions of a specific library', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'org.hamcrest:hamcrest-core',
         registryUrls: [
@@ -133,7 +133,7 @@ describe('datasource/maven', () => {
     });
 
     it('should return versions in all repositories for a specific library', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: [
@@ -147,7 +147,7 @@ describe('datasource/maven', () => {
     });
 
     it('should return all versions of a specific library for http repositories', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: ['https://repo.maven.apache.org/maven2/'],
@@ -156,7 +156,7 @@ describe('datasource/maven', () => {
     });
 
     it('should return all versions of a specific library if a repository fails', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: [
@@ -178,7 +178,7 @@ describe('datasource/maven', () => {
 
       expect.assertions(1);
       await expect(
-        maven.getPkgReleases({
+        maven.getReleases({
           ...config,
           lookupName: 'org:artifact',
           registryUrls: ['http://central.maven.org/maven2/'],
@@ -193,7 +193,7 @@ describe('datasource/maven', () => {
 
       expect.assertions(1);
       await expect(
-        maven.getPkgReleases({
+        maven.getReleases({
           ...config,
           lookupName: 'org:artifact',
           registryUrls: ['https://repo.maven.apache.org/maven2/'],
@@ -202,7 +202,7 @@ describe('datasource/maven', () => {
     });
 
     it('should return all versions of a specific library if a repository fails because invalid protocol', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: [
@@ -228,7 +228,7 @@ describe('datasource/maven', () => {
       nock('http://invalid_metadata_repo')
         .get('/maven2/mysql/mysql-connector-java/maven-metadata.xml')
         .reply(200, invalidMavenMetadata);
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: [
@@ -246,7 +246,7 @@ describe('datasource/maven', () => {
       nock('http://invalid_metadata_repo')
         .get('/maven2/mysql/mysql-connector-java/maven-metadata.xml')
         .reply(200, invalidMavenMetadata);
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: [
@@ -258,7 +258,7 @@ describe('datasource/maven', () => {
     });
 
     it('should return all versions of a specific library if a repository does not end with /', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: ['https://repo.maven.apache.org/maven2'],
@@ -267,14 +267,14 @@ describe('datasource/maven', () => {
     });
 
     it('should return null if no repositories defined', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
       });
       expect(releases).not.toBeNull();
     });
     it('should return null for invalid registryUrls', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         // eslint-disable-next-line no-template-curly-in-string
@@ -283,7 +283,7 @@ describe('datasource/maven', () => {
       expect(releases).toBeNull();
     });
     it('should support scm.url values prefixed with "scm:"', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'io.realm:realm-gradle-plugin',
         registryUrls: ['file://lib/datasource/maven/__fixtures__/jcenter/'],
@@ -292,7 +292,7 @@ describe('datasource/maven', () => {
     });
 
     it('should remove authentication header when redirected with authentication in query string', async () => {
-      const releases = await maven.getPkgReleases({
+      const releases = await maven.getReleases({
         ...config,
         lookupName: 'mysql:mysql-connector-java',
         registryUrls: ['http://frontend_for_private_s3_repository/maven2'],
diff --git a/lib/datasource/maven/index.ts b/lib/datasource/maven/index.ts
index c21dd3f5035ef42bc247baa281093fd49eaf779b..9c93c8756477d536dbecb36c989430169dd3012b 100644
--- a/lib/datasource/maven/index.ts
+++ b/lib/datasource/maven/index.ts
@@ -142,7 +142,7 @@ function extractVersions(metadata: XmlDocument): string[] {
   return elements.map(el => el.val);
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/npm/index.spec.ts b/lib/datasource/npm/index.spec.ts
index 902a899ea01c8375d9030b9309ce1d960f3aa08b..66be8f70945c4dab00789afb3deef7cd05f1ad24 100644
--- a/lib/datasource/npm/index.spec.ts
+++ b/lib/datasource/npm/index.spec.ts
@@ -65,14 +65,14 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, missingVersions);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should fetch package info from npm', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(false);
@@ -99,7 +99,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, pkg);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.sourceUrl).toBeDefined();
   });
@@ -122,7 +122,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, pkg);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.sourceUrl).toBeDefined();
   });
@@ -153,7 +153,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, deprecatedPackage);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.deprecationMessage).toMatchSnapshot();
   });
@@ -161,14 +161,14 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
   });
   it('should reject name mismatch', async () => {
     nock('https://registry.npmjs.org')
       .get('/different')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'different' });
+    const res = await npm.getReleases({ lookupName: 'different' });
     expect(res).toBeNull();
   });
   it('should handle no time', async () => {
@@ -176,7 +176,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBeUndefined();
@@ -188,7 +188,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(true);
   });
@@ -196,23 +196,21 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(401);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should return null if lookup fails', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(404);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should throw error for unparseable', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, 'oops');
-    await expect(
-      npm.getPkgReleases({ lookupName: 'foobar' })
-    ).rejects.toThrow();
+    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
   });
   it('should throw error for 429', async () => {
     nock('https://registry.npmjs.org')
@@ -221,15 +219,13 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(429);
-    await expect(
-      npm.getPkgReleases({ lookupName: 'foobar' })
-    ).rejects.toThrow();
+    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
   });
   it('should throw error for 5xx', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(503);
-    await expect(npm.getPkgReleases({ lookupName: 'foobar' })).rejects.toThrow(
+    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow(
       Error(DATASOURCE_FAILURE)
     );
   });
@@ -237,7 +233,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(408);
-    await expect(npm.getPkgReleases({ lookupName: 'foobar' })).rejects.toThrow(
+    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow(
       Error(DATASOURCE_FAILURE)
     );
   });
@@ -245,9 +241,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(451);
-    await expect(
-      npm.getPkgReleases({ lookupName: 'foobar' })
-    ).rejects.toThrow();
+    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
   });
   it('should send an authorization header if provided', async () => {
     registryAuthToken.mockImplementation(() => ({
@@ -257,7 +251,7 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     expect(res).toMatchSnapshot();
   });
   it('should use NPM_TOKEN if provided', async () => {
@@ -266,7 +260,7 @@ describe(getName(__filename), () => {
       .reply(200, npmResponse);
     const oldToken = process.env.NPM_TOKEN;
     process.env.NPM_TOKEN = 'some-token';
-    const res = await npm.getPkgReleases({ lookupName: 'foobar' });
+    const res = await npm.getReleases({ lookupName: 'foobar' });
     process.env.NPM_TOKEN = oldToken;
     expect(res).toMatchSnapshot();
   });
@@ -280,7 +274,7 @@ describe(getName(__filename), () => {
       .get('/foobar')
       .reply(200, npmResponse);
     const npmrc = 'registry=https://npm.mycustomregistry.com/';
-    const res = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should use host rules by baseUrl if provided', async () => {
@@ -297,7 +291,7 @@ describe(getName(__filename), () => {
       .reply(200, npmResponse);
     const npmrc =
       'registry=https://npm.mycustomregistry.com/_packaging/mycustomregistry/npm/registry/';
-    const res = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('resets npmrc', () => {
@@ -310,7 +304,7 @@ describe(getName(__filename), () => {
       .get('/foobar')
       .reply(200, npmResponse);
     const npmrc = 'foo=bar';
-    const res = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should cache package info from npm', async () => {
@@ -318,8 +312,8 @@ describe(getName(__filename), () => {
       .get('/foobar')
       .reply(200, npmResponse);
     const npmrc = '//registry.npmjs.org/:_authToken=abcdefghijklmnopqrstuvwxyz';
-    const res1 = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
-    const res2 = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res1 = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res2 = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res1).not.toBeNull();
     expect(res1).toEqual(res2);
   });
@@ -330,7 +324,7 @@ describe(getName(__filename), () => {
     const npmrc =
       'registry=https://npm.mycustomregistry.com/\n//npm.mycustomregistry.com/:_auth = ' +
       Buffer.from('abcdef').toString('base64');
-    const res = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should replace any environment variable in npmrc', async () => {
@@ -342,7 +336,7 @@ describe(getName(__filename), () => {
     global.trustLevel = 'high';
     // eslint-disable-next-line no-template-curly-in-string
     const npmrc = 'registry=${REGISTRY}';
-    const res = await npm.getPkgReleases({ lookupName: 'foobar', npmrc });
+    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should throw error if necessary env var is not present', () => {
diff --git a/lib/datasource/npm/index.ts b/lib/datasource/npm/index.ts
index d9866922c4c2bd5241a68d513accfcd201d9ee7a..606041136da752b5d59388d771e4e9d6c4e089ee 100644
--- a/lib/datasource/npm/index.ts
+++ b/lib/datasource/npm/index.ts
@@ -1,4 +1,4 @@
 export { resetMemCache, resetCache } from './get';
-export { getPkgReleases } from './releases';
+export { getReleases } from './releases';
 export { setNpmrc } from './npmrc';
 export { id } from './common';
diff --git a/lib/datasource/npm/releases.ts b/lib/datasource/npm/releases.ts
index 3c0f080db4c45ad80e5a50a4b83fa6e1c8e4a7c4..f90e4c03be14e2c9210b33dc46f06c085b3aded3 100644
--- a/lib/datasource/npm/releases.ts
+++ b/lib/datasource/npm/releases.ts
@@ -2,7 +2,7 @@ import { getDependency } from './get';
 import { setNpmrc } from './npmrc';
 import { GetReleasesConfig, ReleaseResult } from '../common';
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   npmrc,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/nuget/__snapshots__/index.spec.ts.snap b/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
index 581567bfeb448513f247ddd09966ad6150fc2ecb..1b704b89b246ff359ea5074bf7cf72281449dc86 100644
--- a/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/nuget getPkgReleases handles paginated results (v2) 1`] = `
+exports[`datasource/nuget getReleases handles paginated results (v2) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -14,7 +14,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data (v2) 1`] = `
+exports[`datasource/nuget getReleases processes real data (v2) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -152,7 +152,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data (v3) feed is a nuget.org 1`] = `
+exports[`datasource/nuget getReleases processes real data (v3) feed is a nuget.org 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -248,7 +248,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data (v3) feed is not a nuget.org 1`] = `
+exports[`datasource/nuget getReleases processes real data (v3) feed is not a nuget.org 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -344,7 +344,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data with no github project url (v2) 1`] = `
+exports[`datasource/nuget getReleases processes real data with no github project url (v2) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -356,7 +356,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data with no github project url (v3) 1`] = `
+exports[`datasource/nuget getReleases processes real data with no github project url (v3) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -368,7 +368,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data without project url (v2) 1`] = `
+exports[`datasource/nuget getReleases processes real data without project url (v2) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
@@ -505,7 +505,7 @@ Object {
 }
 `;
 
-exports[`datasource/nuget getPkgReleases processes real data without project url (v3) 1`] = `
+exports[`datasource/nuget getReleases processes real data without project url (v3) 1`] = `
 Object {
   "pkgName": "nunit",
   "releases": Array [
diff --git a/lib/datasource/nuget/index.spec.ts b/lib/datasource/nuget/index.spec.ts
index 0c30b13a372381a965847cccc345c24295d4c827..5fa8ac0e3b2f1b91637d5c630f76bd97138109a7 100644
--- a/lib/datasource/nuget/index.spec.ts
+++ b/lib/datasource/nuget/index.spec.ts
@@ -87,7 +87,7 @@ const configV3NotNugetOrg = {
 
 describe('datasource/nuget', () => {
   beforeEach(() => global.renovateCache.rmAll());
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.resetAllMocks();
       hostRules.hosts = jest.fn(() => []);
@@ -101,7 +101,7 @@ describe('datasource/nuget', () => {
       };
 
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...config,
         })
       ).toBeNull();
@@ -112,14 +112,14 @@ describe('datasource/nuget', () => {
         lookupName: 'nunit',
         registryUrls: ['https://my-registry#protocolVersion=3'],
       };
-      await nuget.getPkgReleases({
+      await nuget.getReleases({
         ...config,
       });
       expect(got.mock.calls[0][0]).toEqual('https://my-registry/');
     });
 
     it('queries the default nuget feed if no registries are supplied', async () => {
-      await nuget.getPkgReleases({
+      await nuget.getReleases({
         ...configNoRegistryUrls,
       });
       expect(got.mock.calls[0][0]).toEqual(
@@ -135,7 +135,7 @@ describe('datasource/nuget', () => {
       got.mockReturnValueOnce({
         statusCode: 500,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3,
       });
 
@@ -150,7 +150,7 @@ describe('datasource/nuget', () => {
         body: JSON.parse('{"totalHits": 0}'),
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3,
       });
 
@@ -160,7 +160,7 @@ describe('datasource/nuget', () => {
     it('returns null for empty result (v3v2)', async () => {
       got.mockReturnValueOnce({});
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3V2,
         })
       ).toBeNull();
@@ -168,7 +168,7 @@ describe('datasource/nuget', () => {
     it('returns null for empty result (v2)', async () => {
       got.mockReturnValueOnce({});
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -176,7 +176,7 @@ describe('datasource/nuget', () => {
     it('returns null for empty result (v3)', async () => {
       got.mockReturnValueOnce({});
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -189,7 +189,7 @@ describe('datasource/nuget', () => {
         })
       );
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3V2,
         })
       ).toBeNull();
@@ -201,7 +201,7 @@ describe('datasource/nuget', () => {
         })
       );
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -213,7 +213,7 @@ describe('datasource/nuget', () => {
         })
       );
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -224,17 +224,17 @@ describe('datasource/nuget', () => {
         throw new Error();
       });
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3V2,
         })
       ).toBeNull();
     });
-    it('returns null for unknown error in getPkgReleasesFromV3Feed (v3)', async () => {
+    it('returns null for unknown error in getReleasesFromV3Feed (v3)', async () => {
       got.mockImplementationOnce(() => {
         throw new Error();
       });
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -248,7 +248,7 @@ describe('datasource/nuget', () => {
         throw new Error();
       });
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -258,7 +258,7 @@ describe('datasource/nuget', () => {
         throw new Error();
       });
       expect(
-        await nuget.getPkgReleases({
+        await nuget.getReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -276,7 +276,7 @@ describe('datasource/nuget', () => {
         body: pkgInfoV3FromNuget,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3,
       });
       expect(res).not.toBeNull();
@@ -292,7 +292,7 @@ describe('datasource/nuget', () => {
         body: JSON.parse(pkgListV3),
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -308,7 +308,7 @@ describe('datasource/nuget', () => {
         body: JSON.parse(pkgListV3),
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3NotNugetOrg,
         lookupName: 'nun',
       });
@@ -323,7 +323,7 @@ describe('datasource/nuget', () => {
         body: JSON.parse(pkgListV3WithoutProkjectUrl),
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -339,7 +339,7 @@ describe('datasource/nuget', () => {
         body: JSON.parse(pkgListV3NoGitHubProjectUrl),
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -350,7 +350,7 @@ describe('datasource/nuget', () => {
         body: pkgListV2,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -362,7 +362,7 @@ describe('datasource/nuget', () => {
         body: pkgListV2NoRelease,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV2,
       });
       expect(res).toBeNull();
@@ -372,7 +372,7 @@ describe('datasource/nuget', () => {
         body: pkgListV2WithoutProjectUrl,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -384,7 +384,7 @@ describe('datasource/nuget', () => {
         body: pkgListV2NoGitHubProjectUrl,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -399,7 +399,7 @@ describe('datasource/nuget', () => {
         body: pkgListV2Page2of2,
         statusCode: 200,
       });
-      const res = await nuget.getPkgReleases({
+      const res = await nuget.getReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
diff --git a/lib/datasource/nuget/index.ts b/lib/datasource/nuget/index.ts
index 092cac6bb6ef22265770af6d71a1efa2be336381..727148a4ccb989c9e4825843ce0596611cc39906 100644
--- a/lib/datasource/nuget/index.ts
+++ b/lib/datasource/nuget/index.ts
@@ -27,20 +27,20 @@ function parseRegistryUrl(
   }
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult> {
-  logger.trace(`nuget.getPkgReleases(${lookupName})`);
+  logger.trace(`nuget.getReleases(${lookupName})`);
   let dep: ReleaseResult = null;
   for (const feed of registryUrls || [v3.getDefaultFeed()]) {
     const { feedUrl, protocolVersion } = parseRegistryUrl(feed);
     if (protocolVersion === 2) {
-      dep = await v2.getPkgReleases(feedUrl, lookupName);
+      dep = await v2.getReleases(feedUrl, lookupName);
     } else if (protocolVersion === 3) {
       const queryUrl = await v3.getQueryUrl(feedUrl);
       if (queryUrl !== null) {
-        dep = await v3.getPkgReleases(feedUrl, queryUrl, lookupName);
+        dep = await v3.getReleases(feedUrl, queryUrl, lookupName);
       }
     }
     if (dep != null) {
diff --git a/lib/datasource/nuget/v2.ts b/lib/datasource/nuget/v2.ts
index 86b765dc93ea18a5771f1502e4d09da69a73c851..fceb7e94d38eea744b1f84d7a07f99ddeaf9cfad 100644
--- a/lib/datasource/nuget/v2.ts
+++ b/lib/datasource/nuget/v2.ts
@@ -11,7 +11,7 @@ function getPkgProp(pkgInfo: XmlElement, propName: string): string {
   return pkgInfo.childNamed('m:properties').childNamed(`d:${propName}`).val;
 }
 
-export async function getPkgReleases(
+export async function getReleases(
   feedUrl: string,
   pkgName: string
 ): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/nuget/v3.ts b/lib/datasource/nuget/v3.ts
index 75d57e170a892a1171787d5df06c9005f98e6f4d..d1fb91e5b5817de22f4b7da6277c14f76064ce08 100644
--- a/lib/datasource/nuget/v3.ts
+++ b/lib/datasource/nuget/v3.ts
@@ -56,7 +56,7 @@ export async function getQueryUrl(url: string): Promise<string | null> {
   }
 }
 
-export async function getPkgReleases(
+export async function getReleases(
   registryUrl: string,
   feedUrl: string,
   pkgName: string
diff --git a/lib/datasource/orb/__snapshots__/index.spec.ts.snap b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
index b586007736630bddfc2dcd14e9fc2064e23eb86b..7451fb7e7d0fae06dc5217c3a32243e33d6d39c4 100644
--- a/lib/datasource/orb/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/orb getPkgReleases processes homeUrl 1`] = `
+exports[`datasource/orb getReleases processes homeUrl 1`] = `
 Object {
   "homepage": "https://google.com",
   "name": "hyper-expanse/library-release-workflows",
@@ -50,7 +50,7 @@ Object {
 }
 `;
 
-exports[`datasource/orb getPkgReleases processes real data 1`] = `
+exports[`datasource/orb getReleases processes real data 1`] = `
 Object {
   "homepage": "https://circleci.com/orbs/registry/orb/hyper-expanse/library-release-workflows",
   "name": "hyper-expanse/library-release-workflows",
diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts
index b491e0793cc255e12a2e48d3759cec9ca3282f4e..ea5da05f9554b012207739c96faf41b5a402040f 100644
--- a/lib/datasource/orb/index.spec.ts
+++ b/lib/datasource/orb/index.spec.ts
@@ -27,7 +27,7 @@ const orbData = {
 };
 
 describe('datasource/orb', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
       global.repoCache = {};
@@ -36,7 +36,7 @@ describe('datasource/orb', () => {
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce({ body: {} });
       expect(
-        await datasource.getPkgReleases({
+        await datasource.getReleases({
           lookupName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
@@ -44,7 +44,7 @@ describe('datasource/orb', () => {
     it('returns null for missing orb', async () => {
       got.mockReturnValueOnce({ body: { data: {} } });
       expect(
-        await datasource.getPkgReleases({
+        await datasource.getReleases({
           lookupName: 'hyper-expanse/library-release-wonkflows',
         })
       ).toBeNull();
@@ -56,7 +56,7 @@ describe('datasource/orb', () => {
         })
       );
       expect(
-        await datasource.getPkgReleases({
+        await datasource.getReleases({
           lookupName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
@@ -66,7 +66,7 @@ describe('datasource/orb', () => {
         throw new Error();
       });
       expect(
-        await datasource.getPkgReleases({
+        await datasource.getReleases({
           lookupName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
@@ -75,7 +75,7 @@ describe('datasource/orb', () => {
       got.mockReturnValueOnce({
         body: orbData,
       });
-      const res = await datasource.getPkgReleases({
+      const res = await datasource.getReleases({
         lookupName: 'hyper-expanse/library-release-workflows',
       });
       expect(res).toMatchSnapshot();
@@ -86,7 +86,7 @@ describe('datasource/orb', () => {
       got.mockReturnValueOnce({
         body: orbData,
       });
-      const res = await datasource.getPkgReleases({
+      const res = await datasource.getReleases({
         lookupName: 'hyper-expanse/library-release-workflows',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/orb/index.ts b/lib/datasource/orb/index.ts
index 9d7388966bae10a939d9458f5a9d791176301415..22495ee099e2454806ade5e245a210aab55cfe89 100644
--- a/lib/datasource/orb/index.ts
+++ b/lib/datasource/orb/index.ts
@@ -15,14 +15,14 @@ interface OrbRelease {
 }
 
 /**
- * orb.getPkgReleases
+ * orb.getReleases
  *
  * This function will fetch an orb from CircleCI and return all semver versions.
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
-  logger.debug({ lookupName }, 'orb.getPkgReleases()');
+  logger.debug({ lookupName }, 'orb.getReleases()');
   const cacheNamespace = 'orb';
   const cacheKey = lookupName;
   const cachedResult = await renovateCache.get<ReleaseResult>(
diff --git a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
index 0f6e830772f6a06aba12e382b4f185324d019008..5cae6de70ce742ad483b2ff7a73b5e9512fb80ad 100644
--- a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/packagist getPkgReleases adds packagist source implicitly 1`] = `
+exports[`datasource/packagist getReleases adds packagist source implicitly 1`] = `
 Object {
   "homepage": "https://github.com/drewm/mailchimp-api",
   "name": "drewm/mailchimp-api",
@@ -100,7 +100,7 @@ Object {
 }
 `;
 
-exports[`datasource/packagist getPkgReleases processes real versioned data 1`] = `
+exports[`datasource/packagist getReleases processes real versioned data 1`] = `
 Object {
   "homepage": "https://github.com/drewm/mailchimp-api",
   "name": "drewm/mailchimp-api",
@@ -200,7 +200,7 @@ Object {
 }
 `;
 
-exports[`datasource/packagist getPkgReleases supports includes packages 1`] = `
+exports[`datasource/packagist getReleases supports includes packages 1`] = `
 Object {
   "homepage": "http://guzzlephp.org/",
   "name": "guzzlehttp/guzzle",
@@ -345,7 +345,7 @@ Object {
 }
 `;
 
-exports[`datasource/packagist getPkgReleases supports plain packages 1`] = `
+exports[`datasource/packagist getReleases supports plain packages 1`] = `
 Object {
   "homepage": undefined,
   "name": "vendor/package-name",
@@ -374,7 +374,7 @@ Object {
 }
 `;
 
-exports[`datasource/packagist getPkgReleases supports providers packages 1`] = `
+exports[`datasource/packagist getReleases supports providers packages 1`] = `
 Object {
   "homepage": "https://wordpress.org/plugins/1beyt/",
   "name": "wpackagist-plugin/1beyt",
diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts
index e3d8f2f2a6a099bff55b03b468f38783450eba6b..1f206ddf19a9e598f1bf22d36ad3bc03a350088b 100644
--- a/lib/datasource/packagist/index.spec.ts
+++ b/lib/datasource/packagist/index.spec.ts
@@ -21,7 +21,7 @@ const mailchimpJson: any = fs.readFileSync(
 );
 
 describe('datasource/packagist', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     let config: any;
     beforeEach(() => {
       jest.resetAllMocks();
@@ -41,7 +41,7 @@ describe('datasource/packagist', () => {
       config = {
         registryUrls: ['https://composer.renovatebot.com'],
       };
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'something/one',
       });
@@ -61,7 +61,7 @@ describe('datasource/packagist', () => {
       got.mockReturnValueOnce({
         body: packagesOnly,
       });
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'vendor/package-name',
       });
@@ -73,7 +73,7 @@ describe('datasource/packagist', () => {
           code: 'ETIMEDOUT',
         })
       );
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'vendor/package-name2',
       });
@@ -85,7 +85,7 @@ describe('datasource/packagist', () => {
           statusCode: 403,
         })
       );
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'vendor/package-name',
       });
@@ -98,7 +98,7 @@ describe('datasource/packagist', () => {
           url: 'https://some.registry/packages.json',
         })
       );
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'drewm/mailchip-api',
       });
@@ -123,7 +123,7 @@ describe('datasource/packagist', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(includesJson),
       });
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'guzzlehttp/guzzle',
       });
@@ -162,7 +162,7 @@ describe('datasource/packagist', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(beytJson),
       });
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'wpackagist-plugin/1beyt',
       });
@@ -201,7 +201,7 @@ describe('datasource/packagist', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(beytJson),
       });
-      const res = await packagist.getPkgReleases({
+      const res = await packagist.getReleases({
         ...config,
         lookupName: 'some/other',
       });
@@ -213,7 +213,7 @@ describe('datasource/packagist', () => {
       });
       config.registryUrls = ['https://packagist.org'];
       expect(
-        await packagist.getPkgReleases({
+        await packagist.getReleases({
           ...config,
           lookupName: 'drewm/mailchimp-api',
         })
@@ -225,7 +225,7 @@ describe('datasource/packagist', () => {
       });
       config.registryUrls = [];
       expect(
-        await packagist.getPkgReleases({
+        await packagist.getReleases({
           ...config,
           lookupName: 'drewm/mailchimp-api',
         })
diff --git a/lib/datasource/packagist/index.ts b/lib/datasource/packagist/index.ts
index 0755d2a4aab6e9d676f36222f2678b52beeb62a8..a4b10883ea5cec347f4a2fbf57699e67afa0d5c4 100644
--- a/lib/datasource/packagist/index.ts
+++ b/lib/datasource/packagist/index.ts
@@ -306,11 +306,11 @@ async function packageLookup(
   }
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult> {
-  logger.trace(`getPkgReleases(${lookupName})`);
+  logger.trace(`getReleases(${lookupName})`);
 
   let res: ReleaseResult;
   const registries = is.nonEmptyArray(registryUrls)
diff --git a/lib/datasource/pod/index.spec.ts b/lib/datasource/pod/index.spec.ts
index b0a3e4651e7b3106551b1e191a894782d1bebac5..1fbbb09b08f1f57823c754fe0d335d77f53cb956 100644
--- a/lib/datasource/pod/index.spec.ts
+++ b/lib/datasource/pod/index.spec.ts
@@ -1,5 +1,5 @@
 import { api as _api } from '../../platform/github/gh-got-wrapper';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 import { mocked } from '../../../test/util';
 import { GotResponse } from '../../platform';
 
@@ -13,12 +13,12 @@ const config = {
 };
 
 describe('datasource/cocoapods', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => global.renovateCache.rmAll());
     it('returns null for invalid inputs', async () => {
       api.get.mockResolvedValueOnce(null);
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'foobar',
           registryUrls: [],
         })
@@ -26,14 +26,14 @@ describe('datasource/cocoapods', () => {
     });
     it('returns null for empty result', async () => {
       api.get.mockResolvedValueOnce(null);
-      expect(await getPkgReleases(config)).toBeNull();
+      expect(await getReleases(config)).toBeNull();
     });
     it('returns null for missing fields', async () => {
       api.get.mockResolvedValueOnce({} as GotResponse);
-      expect(await getPkgReleases(config)).toBeNull();
+      expect(await getReleases(config)).toBeNull();
 
       api.get.mockResolvedValueOnce({ body: '' } as GotResponse);
-      expect(await getPkgReleases(config)).toBeNull();
+      expect(await getReleases(config)).toBeNull();
     });
     it('returns null for 404', async () => {
       api.get.mockImplementation(() =>
@@ -42,7 +42,7 @@ describe('datasource/cocoapods', () => {
         })
       );
       expect(
-        await getPkgReleases({
+        await getReleases({
           ...config,
           registryUrls: [
             ...config.registryUrls,
@@ -58,7 +58,7 @@ describe('datasource/cocoapods', () => {
           statusCode: 401,
         })
       );
-      expect(await getPkgReleases(config)).toBeNull();
+      expect(await getReleases(config)).toBeNull();
     });
     it('throws for 429', async () => {
       api.get.mockImplementationOnce(() =>
@@ -66,7 +66,7 @@ describe('datasource/cocoapods', () => {
           statusCode: 429,
         })
       );
-      await expect(getPkgReleases(config)).rejects.toThrowError(
+      await expect(getReleases(config)).rejects.toThrowError(
         'registry-failure'
       );
     });
@@ -76,7 +76,7 @@ describe('datasource/cocoapods', () => {
           statusCode: 502,
         })
       );
-      await expect(getPkgReleases(config)).rejects.toThrowError(
+      await expect(getReleases(config)).rejects.toThrowError(
         'registry-failure'
       );
     });
@@ -84,14 +84,14 @@ describe('datasource/cocoapods', () => {
       api.get.mockImplementationOnce(() => {
         throw new Error();
       });
-      expect(await getPkgReleases(config)).toBeNull();
+      expect(await getReleases(config)).toBeNull();
     });
     it('processes real data from CDN', async () => {
       api.get.mockResolvedValueOnce({
         body: 'foo/1.2.3',
       } as GotResponse);
       expect(
-        await getPkgReleases({
+        await getReleases({
           ...config,
           registryUrls: ['https://cdn.cocoapods.org'],
         })
@@ -108,7 +108,7 @@ describe('datasource/cocoapods', () => {
         body: [{ name: '1.2.3' }],
       } as GotResponse);
       expect(
-        await getPkgReleases({
+        await getReleases({
           ...config,
           registryUrls: ['https://github.com/Artsy/Specs'],
         })
diff --git a/lib/datasource/pod/index.ts b/lib/datasource/pod/index.ts
index e39c0a9e0febbbf167bf05e42a8d8579dd9d431e..e41dcbc50cce2e1863ab18baa9f51e657dd6988a 100644
--- a/lib/datasource/pod/index.ts
+++ b/lib/datasource/pod/index.ts
@@ -123,7 +123,7 @@ function isDefaultRepo(url: string): boolean {
   return false;
 }
 
-export async function getPkgReleases(
+export async function getReleases(
   config: GetReleasesConfig
 ): Promise<ReleaseResult | null> {
   const { lookupName } = config;
diff --git a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
index 7e9db5af862af329a8c41aeabadd3c1d26b92b7f..c13442397bcf94ef9b3b83da6a23cc03947d1e64 100644
--- a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/pypi getPkgReleases process data from +simple endpoint 1`] = `
+exports[`datasource/pypi getReleases process data from +simple endpoint 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -40,7 +40,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getPkgReleases process data from simple endpoint 1`] = `
+exports[`datasource/pypi getReleases process data from simple endpoint 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -80,7 +80,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getPkgReleases process data from simple endpoint with hyphens replaced with underscores 1`] = `
+exports[`datasource/pypi getReleases process data from simple endpoint with hyphens replaced with underscores 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -90,7 +90,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getPkgReleases processes real data 1`] = `
+exports[`datasource/pypi getReleases processes real data 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -186,7 +186,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getPkgReleases respects compatibility 1`] = `
+exports[`datasource/pypi getReleases respects compatibility 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -205,14 +205,14 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getPkgReleases returns non-github home_page 1`] = `
+exports[`datasource/pypi getReleases returns non-github home_page 1`] = `
 Object {
   "homepage": "https://microsoft.com",
   "releases": Array [],
 }
 `;
 
-exports[`datasource/pypi getPkgReleases supports custom datasource url 1`] = `
+exports[`datasource/pypi getReleases supports custom datasource url 1`] = `
 Array [
   Array [
     "https://custom.pypi.net/foo/azure-cli-monitor/json",
@@ -229,7 +229,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getPkgReleases supports custom datasource url from environmental variable 1`] = `
+exports[`datasource/pypi getReleases supports custom datasource url from environmental variable 1`] = `
 Array [
   Array [
     "https://my.pypi.python/pypi/azure-cli-monitor/json",
@@ -246,7 +246,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getPkgReleases supports multiple custom datasource urls 1`] = `
+exports[`datasource/pypi getReleases supports multiple custom datasource urls 1`] = `
 Array [
   Array [
     "https://custom.pypi.net/foo/azure-cli-monitor/json",
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index dbade772330baf64301eb4c77f40b57b5c7c3cf7..8b696f5f1be4a692c897d3708c9a53806a8d99c5 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -20,7 +20,7 @@ const mixedHyphensResponse = fs.readFileSync(
 );
 
 describe('datasource/pypi', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     const OLD_ENV = process.env;
 
     beforeEach(() => {
@@ -40,7 +40,7 @@ describe('datasource/pypi', () => {
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce({});
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           lookupName: 'something',
         })
       ).toBeNull();
@@ -50,7 +50,7 @@ describe('datasource/pypi', () => {
         throw new Error();
       });
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           lookupName: 'something',
         })
       ).toBeNull();
@@ -60,7 +60,7 @@ describe('datasource/pypi', () => {
         body: JSON.parse(res1),
       });
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           lookupName: 'azure-cli-monitor',
         })
       ).toMatchSnapshot();
@@ -72,7 +72,7 @@ describe('datasource/pypi', () => {
       const config = {
         registryUrls: ['https://custom.pypi.net/foo'],
       };
-      await pypi.getPkgReleases({
+      await pypi.getReleases({
         ...config,
         lookupName: 'azure-cli-monitor',
       });
@@ -84,7 +84,7 @@ describe('datasource/pypi', () => {
       });
       const pipIndexUrl = process.env.PIP_INDEX_URL;
       process.env.PIP_INDEX_URL = 'https://my.pypi.python/pypi/';
-      await pypi.getPkgReleases({
+      await pypi.getReleases({
         lookupName: 'azure-cli-monitor',
       });
       expect(got.mock.calls).toMatchSnapshot();
@@ -103,7 +103,7 @@ describe('datasource/pypi', () => {
           'https://third-index/foo',
         ],
       };
-      await pypi.getPkgReleases({
+      await pypi.getReleases({
         ...config,
         lookupName: 'azure-cli-monitor',
       });
@@ -119,7 +119,7 @@ describe('datasource/pypi', () => {
         },
       });
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           lookupName: 'something',
         })
       ).toMatchSnapshot();
@@ -134,7 +134,7 @@ describe('datasource/pypi', () => {
         },
       });
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           lookupName: 'something',
         })
       ).toBeNull();
@@ -158,7 +158,7 @@ describe('datasource/pypi', () => {
         },
       });
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           compatibility: { python: '2.7' },
           lookupName: 'doit',
         })
@@ -172,7 +172,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'dj-database-url',
@@ -187,7 +187,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://some.registry.org/+simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'dj-database-url',
@@ -202,7 +202,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'image-collector',
@@ -215,7 +215,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'dj-database-url',
@@ -230,7 +230,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'dj-database-url',
@@ -245,7 +245,7 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getPkgReleases({
+        await pypi.getReleases({
           ...config,
           compatibility: { python: '2.7' },
           lookupName: 'dj-database-url',
diff --git a/lib/datasource/pypi/index.ts b/lib/datasource/pypi/index.ts
index bbb7a308840de341d3a6e59098ad76a3bb1b8d10..78548e4c326884a697bc57960e03a2637c8c5a76 100644
--- a/lib/datasource/pypi/index.ts
+++ b/lib/datasource/pypi/index.ts
@@ -157,7 +157,7 @@ async function getSimpleDependency(
   }
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   compatibility,
   lookupName,
   registryUrls,
diff --git a/lib/datasource/readme.md b/lib/datasource/readme.md
index 9f81ffa05d73bdd94bb3cd870a4cf2535391ceaa..ad8fc50b3277cfaa67b566f0ba0c6d5b0cc7789b 100644
--- a/lib/datasource/readme.md
+++ b/lib/datasource/readme.md
@@ -2,16 +2,16 @@
 
 Datasources are used in Renovate primarily to fetch released versions of packages.
 
-### getPkgReleases
+### getReleases
 
-The minimum exported interface for a datasource is a function called `getPkgReleases` that takes a lookup config as input.
+The minimum exported interface for a datasource is a function called `getReleases` that takes a lookup config as input.
 
 The config contains:
 
 - `lookupName`: the package's full name including scope if present (e.g. `@foo/bar`)
 - `registryUrls`: an array of registry Urls to try
 
-`getPkgReleases` should return an object containing:
+`getReleases` should return an object containing:
 
 - `releases`: an array of strings of matched versions. This is the only mandatory field.
 - `deprecationMessage`: a string description of the package's deprecation notice, if applicable
@@ -26,7 +26,7 @@ Datasources that support the concept of digests (e.g. docker digests and git com
 
 The `getDigest` function has two inputs:
 
-- `config`: the Renovate config for the package being updated, contains same fields as `getPkgReleases`
+- `config`: the Renovate config for the package being updated, contains same fields as `getReleases`
 - `newValue`: the version or value to retrieve the digest for
 
 The `getDigest` function returns a string output representing the digest value. If none is found then a return value of `null` should be returned.
diff --git a/lib/datasource/ruby-version/__snapshots__/index.spec.ts.snap b/lib/datasource/ruby-version/__snapshots__/index.spec.ts.snap
index 0f9a8fc1fba5ea5a5fdd85a993f9b66ec563db88..bb2ef169b30c173d14a36524e1b5bba5fb43cbb9 100644
--- a/lib/datasource/ruby-version/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/ruby-version/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/gradle getPkgReleases parses real data 1`] = `
+exports[`datasource/gradle getReleases parses real data 1`] = `
 Object {
   "homepage": "https://www.ruby-lang.org",
   "releases": Array [
diff --git a/lib/datasource/ruby-version/index.spec.ts b/lib/datasource/ruby-version/index.spec.ts
index cfb8e1569a98fb27ca6dfb52833efce3089e97f8..2f26b3f29b0207b951d403d099b812ebf43df425 100644
--- a/lib/datasource/ruby-version/index.spec.ts
+++ b/lib/datasource/ruby-version/index.spec.ts
@@ -1,6 +1,6 @@
 import fs from 'fs';
 import _got from '../../util/got';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 
 jest.mock('../../util/got');
 
@@ -12,7 +12,7 @@ const rubyReleasesHtml = fs.readFileSync(
 );
 
 describe('datasource/gradle', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       global.repoCache = {};
       return global.renovateCache.rmAll();
@@ -21,12 +21,12 @@ describe('datasource/gradle', () => {
       got.mockReturnValueOnce({
         body: rubyReleasesHtml,
       });
-      const res = await getPkgReleases();
+      const res = await getReleases();
       expect(res).toMatchSnapshot();
     });
     it('throws for empty result', async () => {
       got.mockReturnValueOnce({ body: {} });
-      await expect(getPkgReleases()).rejects.toThrow();
+      await expect(getReleases()).rejects.toThrow();
     });
 
     it('throws for 404', async () => {
@@ -35,7 +35,7 @@ describe('datasource/gradle', () => {
           statusCode: 404,
         })
       );
-      await expect(getPkgReleases()).rejects.toThrow();
+      await expect(getReleases()).rejects.toThrow();
     });
   });
 });
diff --git a/lib/datasource/ruby-version/index.ts b/lib/datasource/ruby-version/index.ts
index d449ae2f2c9854adeb35ee5ceff377ff6810cc3c..bc45f3791b6d9bf33cfe8e85a1a0f2cf3074689f 100644
--- a/lib/datasource/ruby-version/index.ts
+++ b/lib/datasource/ruby-version/index.ts
@@ -10,7 +10,7 @@ const http = new Http(id);
 
 const rubyVersionsUrl = 'https://www.ruby-lang.org/en/downloads/releases/';
 
-export async function getPkgReleases(
+export async function getReleases(
   _config?: GetReleasesConfig
 ): Promise<ReleaseResult> {
   // First check the persistent cache
diff --git a/lib/datasource/rubygems/__snapshots__/index.spec.ts.snap b/lib/datasource/rubygems/__snapshots__/index.spec.ts.snap
index 6ea2eef890c302e3fb4d45f0ba0862785deb11e1..65aba2d23b9b186bba4a2c56e7a8bf6e43d730ed 100644
--- a/lib/datasource/rubygems/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/rubygems/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/rubygems getPkgReleases returns a dep for rubygems.org package hit 1`] = `
+exports[`datasource/rubygems getReleases returns a dep for rubygems.org package hit 1`] = `
 Object {
   "name": "1pass",
   "releases": Array [
@@ -14,7 +14,7 @@ Object {
 }
 `;
 
-exports[`datasource/rubygems getPkgReleases uses multiple source urls 1`] = `
+exports[`datasource/rubygems getReleases uses multiple source urls 1`] = `
 Object {
   "changelogUrl": null,
   "homepage": "http://rubyonrails.org",
@@ -2397,7 +2397,7 @@ Object {
 }
 `;
 
-exports[`datasource/rubygems getPkgReleases uses rubygems.org if no registry urls were provided 1`] = `
+exports[`datasource/rubygems getReleases uses rubygems.org if no registry urls were provided 1`] = `
 Object {
   "name": "1pass",
   "releases": Array [
@@ -2411,7 +2411,7 @@ Object {
 }
 `;
 
-exports[`datasource/rubygems getPkgReleases works with real data 1`] = `
+exports[`datasource/rubygems getReleases works with real data 1`] = `
 Object {
   "changelogUrl": null,
   "homepage": "http://rubyonrails.org",
diff --git a/lib/datasource/rubygems/index.spec.ts b/lib/datasource/rubygems/index.spec.ts
index d1b9f0d46596597be4f3deca19e127581e77d0b4..344fc4dde9d09566a7d737a56169e794615cdc33 100644
--- a/lib/datasource/rubygems/index.spec.ts
+++ b/lib/datasource/rubygems/index.spec.ts
@@ -27,7 +27,7 @@ const rubygemsOrgVersions = `created_at: 2017-03-27T04:38:13+00:00
 jest.mock('../../util/got');
 
 describe('datasource/rubygems', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     const SKIP_CACHE = process.env.RENOVATE_SKIP_CACHE;
 
     const params = {
@@ -42,14 +42,14 @@ describe('datasource/rubygems', () => {
 
     it('returns null for missing pkg', async () => {
       got.mockReturnValueOnce({});
-      expect(await rubygems.getPkgReleases(params)).toBeNull();
+      expect(await rubygems.getReleases(params)).toBeNull();
     });
 
     it('returns null for rubygems.org package miss', async () => {
       const newparams = { ...params };
       newparams.registryUrls = ['https://rubygems.org'];
       got.mockReturnValueOnce({ body: rubygemsOrgVersions });
-      expect(await rubygems.getPkgReleases(newparams)).toBeNull();
+      expect(await rubygems.getReleases(newparams)).toBeNull();
     });
 
     it('returns a dep for rubygems.org package hit', async () => {
@@ -58,7 +58,7 @@ describe('datasource/rubygems', () => {
         registryUrls: ['https://rubygems.org'],
       };
       got.mockReturnValueOnce({ body: rubygemsOrgVersions });
-      const res = await rubygems.getPkgReleases(newparams);
+      const res = await rubygems.getReleases(newparams);
       expect(res).not.toBeNull();
       expect(res).toMatchSnapshot();
       expect(
@@ -73,13 +73,13 @@ describe('datasource/rubygems', () => {
       got.mockReturnValue({ body: rubygemsOrgVersions });
 
       expect(
-        await rubygems.getPkgReleases({
+        await rubygems.getReleases({
           ...params,
           registryUrls: [],
         })
       ).toBeNull();
 
-      const res = await rubygems.getPkgReleases({
+      const res = await rubygems.getReleases({
         lookupName: '1pass',
         registryUrls: [],
       });
@@ -92,7 +92,7 @@ describe('datasource/rubygems', () => {
         .mockReturnValueOnce({ body: railsInfo })
         .mockReturnValueOnce({ body: railsVersions });
 
-      expect(await rubygems.getPkgReleases(params)).toMatchSnapshot();
+      expect(await rubygems.getReleases(params)).toMatchSnapshot();
     });
 
     it('uses multiple source urls', async () => {
@@ -105,12 +105,12 @@ describe('datasource/rubygems', () => {
         .mockImplementationOnce(() => ({ body: railsInfo }))
         .mockImplementationOnce(() => ({ body: railsVersions }));
 
-      expect(await rubygems.getPkgReleases(params)).toMatchSnapshot();
+      expect(await rubygems.getReleases(params)).toMatchSnapshot();
     });
 
     it('returns null if mismatched name', async () => {
       got.mockReturnValueOnce({ body: { ...railsInfo, name: 'oooops' } });
-      expect(await rubygems.getPkgReleases(params)).toBeNull();
+      expect(await rubygems.getReleases(params)).toBeNull();
     });
 
     afterEach(() => {
diff --git a/lib/datasource/rubygems/index.ts b/lib/datasource/rubygems/index.ts
index c7f56ead1810b0a51cfc0d954b0ef656e8ac3b21..d4d80f7c2f2a81b4ab1448405c325c8cb8abdd45 100644
--- a/lib/datasource/rubygems/index.ts
+++ b/lib/datasource/rubygems/index.ts
@@ -1,2 +1,2 @@
-export { getPkgReleases } from './releases';
+export { getReleases } from './releases';
 export { id } from './common';
diff --git a/lib/datasource/rubygems/releases.ts b/lib/datasource/rubygems/releases.ts
index 017ac04d47edf257c9c8a55446d8d6ecf31055ef..5f558c65a508c16b6cf517a32ad9385e3184749d 100644
--- a/lib/datasource/rubygems/releases.ts
+++ b/lib/datasource/rubygems/releases.ts
@@ -3,7 +3,7 @@ import { getDependency } from './get';
 import { getRubygemsOrgDependency } from './get-rubygems-org';
 import { GetReleasesConfig, ReleaseResult } from '../common';
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/sbt-package/index.spec.ts b/lib/datasource/sbt-package/index.spec.ts
index 85fe7bd1d281a722a95dd235d60f5ebddf398b81..308ffbaee005f039b5698826d23381238a0d6bd5 100644
--- a/lib/datasource/sbt-package/index.spec.ts
+++ b/lib/datasource/sbt-package/index.spec.ts
@@ -1,7 +1,7 @@
 import path from 'path';
 import fs from 'fs';
 import nock from 'nock';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir, SBT_PLUGINS_REPO } from '../sbt-plugin/util';
 
@@ -23,7 +23,7 @@ describe('datasource/sbt', () => {
     expect(parseIndexDir(sbtPluginIndex)).toMatchSnapshot();
   });
 
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       nock.disableNetConnect();
       nock('https://failed_repo')
@@ -98,7 +98,7 @@ describe('datasource/sbt', () => {
 
     it('returns null in case of errors', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.scalatest:scalatest',
           registryUrls: ['https://failed_repo/maven'],
         })
@@ -106,7 +106,7 @@ describe('datasource/sbt', () => {
     });
     it('fetches releases from Maven', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.scalatest:scalatest',
           registryUrls: [
             'https://failed_repo/maven',
@@ -122,7 +122,7 @@ describe('datasource/sbt', () => {
         releases: [{ version: '1.2.0' }, { version: '1.2.3' }],
       });
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.scalatest:scalatest_2.12',
           registryUrls: [MAVEN_REPO, SBT_PLUGINS_REPO],
         })
diff --git a/lib/datasource/sbt-package/index.ts b/lib/datasource/sbt-package/index.ts
index caf293892f5b348ad9a07f7be07142a6ce9ef586..4976c2ac8f957e2620adb07c942db97a444ee6d8 100644
--- a/lib/datasource/sbt-package/index.ts
+++ b/lib/datasource/sbt-package/index.ts
@@ -60,7 +60,7 @@ export async function resolvePackageReleases(
   return null;
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/sbt-plugin/index.spec.ts b/lib/datasource/sbt-plugin/index.spec.ts
index 24ea05d4beda887b4169bb9498e25faf3f912040..6af5e2064c5e8328372d2f5c7ddc0d0a5e8f752f 100644
--- a/lib/datasource/sbt-plugin/index.spec.ts
+++ b/lib/datasource/sbt-plugin/index.spec.ts
@@ -1,7 +1,7 @@
 import path from 'path';
 import fs from 'fs';
 import nock from 'nock';
-import { getPkgReleases } from '.';
+import { getReleases } from '.';
 import { MAVEN_REPO } from '../maven/common';
 import { parseIndexDir, SBT_PLUGINS_REPO } from './util';
 
@@ -23,7 +23,7 @@ describe('datasource/sbt', () => {
     expect(parseIndexDir(sbtPluginIndex)).toMatchSnapshot();
   });
 
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       nock.disableNetConnect();
       nock('https://failed_repo')
@@ -98,13 +98,13 @@ describe('datasource/sbt', () => {
 
     it('returns null in case of errors', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.scalatest:scalatest',
           registryUrls: ['https://failed_repo/maven'],
         })
       ).toEqual(null);
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.scalatest:scalaz',
           registryUrls: [SBT_PLUGINS_REPO],
         })
@@ -112,7 +112,7 @@ describe('datasource/sbt', () => {
     });
     it('fetches sbt plugins', async () => {
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.foundweekends:sbt-bintray',
           registryUrls: [MAVEN_REPO, SBT_PLUGINS_REPO],
         })
@@ -125,7 +125,7 @@ describe('datasource/sbt', () => {
         releases: [{ version: '0.5.5' }],
       });
       expect(
-        await getPkgReleases({
+        await getReleases({
           lookupName: 'org.foundweekends:sbt-bintray_2.12',
           registryUrls: [MAVEN_REPO, SBT_PLUGINS_REPO],
         })
diff --git a/lib/datasource/sbt-plugin/index.ts b/lib/datasource/sbt-plugin/index.ts
index 7835a0271b1e95c30bd80efdb98a103f320be2b9..56264295321d8f0ff6aad8dc1297c41b973d977c 100644
--- a/lib/datasource/sbt-plugin/index.ts
+++ b/lib/datasource/sbt-plugin/index.ts
@@ -56,7 +56,7 @@ async function resolvePluginReleases(
   return resolvePackageReleases(rootUrl, artifact, scalaVersion);
 }
 
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls: configRegistryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/terraform-module/__snapshots__/index.spec.ts.snap b/lib/datasource/terraform-module/__snapshots__/index.spec.ts.snap
index a4699905dda97fad8c13e834d686b0d6363d39b3..532181a5425acd2268077ac504e45972d93cbafe 100644
--- a/lib/datasource/terraform-module/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/terraform-module/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/terraform-module getPkgReleases processes real data 1`] = `
+exports[`datasource/terraform-module getReleases processes real data 1`] = `
 Object {
   "homepage": "https://registry.terraform.io/modules/hashicorp/consul/aws",
   "name": "hashicorp/consul/aws",
@@ -80,7 +80,7 @@ Object {
 }
 `;
 
-exports[`datasource/terraform-module getPkgReleases processes with registry in name 1`] = `
+exports[`datasource/terraform-module getReleases processes with registry in name 1`] = `
 Object {
   "homepage": "https://registry.terraform.io/modules/hashicorp/consul/aws",
   "name": "hashicorp/consul/aws",
diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts
index a7483e0294060d140d37ba6f63b4d027a59ea984..a5d9e06dc5bd510ea09f36774fadf2d7200c1522 100644
--- a/lib/datasource/terraform-module/index.spec.ts
+++ b/lib/datasource/terraform-module/index.spec.ts
@@ -11,7 +11,7 @@ const consulData: any = fs.readFileSync(
 );
 
 describe('datasource/terraform-module', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
       global.repoCache = {};
@@ -20,7 +20,7 @@ describe('datasource/terraform-module', () => {
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce({ body: {} });
       expect(
-        await terraform.getPkgReleases({
+        await terraform.getReleases({
           lookupName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
@@ -32,7 +32,7 @@ describe('datasource/terraform-module', () => {
         })
       );
       expect(
-        await terraform.getPkgReleases({
+        await terraform.getReleases({
           lookupName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
@@ -42,7 +42,7 @@ describe('datasource/terraform-module', () => {
         throw new Error();
       });
       expect(
-        await terraform.getPkgReleases({
+        await terraform.getReleases({
           lookupName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
@@ -51,7 +51,7 @@ describe('datasource/terraform-module', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
       });
-      const res = await terraform.getPkgReleases({
+      const res = await terraform.getReleases({
         lookupName: 'hashicorp/consul/aws',
       });
       expect(res).toMatchSnapshot();
@@ -61,7 +61,7 @@ describe('datasource/terraform-module', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
       });
-      const res = await terraform.getPkgReleases({
+      const res = await terraform.getReleases({
         lookupName: 'registry.terraform.io/hashicorp/consul/aws',
       });
       expect(res).toMatchSnapshot();
@@ -71,7 +71,7 @@ describe('datasource/terraform-module', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
       });
-      const res = await terraform.getPkgReleases({
+      const res = await terraform.getReleases({
         lookupName: 'consul/foo',
         registryUrls: ['https://terraform.company.com'],
       });
diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts
index 5e44921767307caf6001839a6adc03730b38474e..060c675748c9b994a6868bc35e6d270af98aeab2 100644
--- a/lib/datasource/terraform-module/index.ts
+++ b/lib/datasource/terraform-module/index.ts
@@ -45,13 +45,13 @@ interface TerraformRelease {
 }
 
 /**
- * terraform.getPkgReleases
+ * terraform.getReleases
  *
  * This function will fetch a package from the specified Terraform registry and return all semver versions.
  *  - `sourceUrl` is supported of "source" field is set
  *  - `homepage` is set to the Terraform registry's page if it's on the official main registry
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/datasource/terraform-provider/__snapshots__/index.spec.ts.snap b/lib/datasource/terraform-provider/__snapshots__/index.spec.ts.snap
index 30523c271b71392d141bd27a7c7521dde0fd0f66..c1eed711879019adc5963af146cd454b8755d8ec 100644
--- a/lib/datasource/terraform-provider/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/terraform-provider/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/terraform getPkgReleases processes real data 1`] = `
+exports[`datasource/terraform getReleases processes real data 1`] = `
 Object {
   "homepage": "https://registry.terraform.io/providers/hashicorp/azurerm",
   "name": "hashicorp/azurerm",
diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts
index 1b9155da27953da0418d0c09ebb192737ef970a2..7d61edbc22f52a2fa3b02e29b92c07ff8844c596 100644
--- a/lib/datasource/terraform-provider/index.spec.ts
+++ b/lib/datasource/terraform-provider/index.spec.ts
@@ -11,7 +11,7 @@ const consulData: any = fs.readFileSync(
 );
 
 describe('datasource/terraform', () => {
-  describe('getPkgReleases', () => {
+  describe('getReleases', () => {
     beforeEach(() => {
       jest.clearAllMocks();
       global.repoCache = {};
@@ -20,7 +20,7 @@ describe('datasource/terraform', () => {
     it('returns null for empty result', async () => {
       got.mockReturnValueOnce({ body: {} });
       expect(
-        await terraformProvider.getPkgReleases({
+        await terraformProvider.getReleases({
           lookupName: 'azurerm',
         })
       ).toBeNull();
@@ -32,7 +32,7 @@ describe('datasource/terraform', () => {
         })
       );
       expect(
-        await terraformProvider.getPkgReleases({
+        await terraformProvider.getReleases({
           lookupName: 'azurerm',
         })
       ).toBeNull();
@@ -42,7 +42,7 @@ describe('datasource/terraform', () => {
         throw new Error();
       });
       expect(
-        await terraformProvider.getPkgReleases({
+        await terraformProvider.getReleases({
           lookupName: 'azurerm',
         })
       ).toBeNull();
@@ -51,7 +51,7 @@ describe('datasource/terraform', () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
       });
-      const res = await terraformProvider.getPkgReleases({
+      const res = await terraformProvider.getReleases({
         lookupName: 'azurerm',
       });
       expect(res).toMatchSnapshot();
diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts
index 480e1d5769286c461dfd6a6d82bbb828f867a458..e380a1e537c4280ab6301ef807e1918946026066 100644
--- a/lib/datasource/terraform-provider/index.ts
+++ b/lib/datasource/terraform-provider/index.ts
@@ -15,11 +15,11 @@ interface TerraformProvider {
 }
 
 /**
- * terraform-provider.getPkgReleases
+ * terraform-provider.getReleases
  *
  * This function will fetch a provider from the public Terraform registry and return all semver versions.
  */
-export async function getPkgReleases({
+export async function getReleases({
   lookupName,
   registryUrls,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 22cb8445f696c09b31e56293805762d1b5850bb5..1b97d2fbf2fdaf43973ba1dd788f063b31fe3bb0 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -121,7 +121,7 @@ describe('bundler.updateArtifacts()', () => {
       platform.getFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.outputFile.mockResolvedValueOnce(null as never);
       platform.getFile.mockResolvedValueOnce('1.2.0');
-      datasource.getPkgReleases.mockResolvedValueOnce({
+      datasource.getReleases.mockResolvedValueOnce({
         releases: [
           { version: '1.0.0' },
           { version: '1.2.0' },
@@ -149,7 +149,7 @@ describe('bundler.updateArtifacts()', () => {
     it('compatibility options', async () => {
       platform.getFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.outputFile.mockResolvedValueOnce(null as never);
-      datasource.getPkgReleases.mockResolvedValueOnce({
+      datasource.getReleases.mockResolvedValueOnce({
         releases: [
           { version: '1.0.0' },
           { version: '1.2.0' },
@@ -182,7 +182,7 @@ describe('bundler.updateArtifacts()', () => {
     it('invalid compatibility options', async () => {
       platform.getFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.outputFile.mockResolvedValueOnce(null as never);
-      datasource.getPkgReleases.mockResolvedValueOnce({
+      datasource.getReleases.mockResolvedValueOnce({
         releases: [
           { version: '1.0.0' },
           { version: '1.2.0' },
@@ -217,7 +217,7 @@ describe('bundler.updateArtifacts()', () => {
       platform.getFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.outputFile.mockResolvedValueOnce(null as never);
       platform.getFile.mockResolvedValueOnce('1.2.0');
-      datasource.getPkgReleases.mockResolvedValueOnce({
+      datasource.getReleases.mockResolvedValueOnce({
         releases: [
           { version: '1.0.0' },
           { version: '1.2.0' },
diff --git a/lib/manager/cocoapods/artifacts.spec.ts b/lib/manager/cocoapods/artifacts.spec.ts
index 13726577b00cb9f0d6ed34a33c0700a0bd76b814..349d81b1758c173457f70e25aab174bf942b2491 100644
--- a/lib/manager/cocoapods/artifacts.spec.ts
+++ b/lib/manager/cocoapods/artifacts.spec.ts
@@ -33,7 +33,7 @@ describe('.updateArtifacts()', () => {
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
     setExecConfig(config);
 
-    datasource.getPkgReleases.mockResolvedValue({
+    datasource.getReleases.mockResolvedValue({
       releases: [
         { version: '1.2.0' },
         { version: '1.2.1' },
@@ -196,7 +196,7 @@ describe('.updateArtifacts()', () => {
     });
 
     platform.getFile.mockResolvedValueOnce('COCOAPODS: 1.2.4');
-    datasource.getPkgReleases.mockResolvedValueOnce({
+    datasource.getReleases.mockResolvedValueOnce({
       releases: [],
     });
 
diff --git a/lib/manager/travis/package.spec.ts b/lib/manager/travis/package.spec.ts
index 1c24e908c426fe2f5efb9fecb05db87787d566d8..59d0f90e82d816f68bb5b98162c700d68da83e7a 100644
--- a/lib/manager/travis/package.spec.ts
+++ b/lib/manager/travis/package.spec.ts
@@ -1,9 +1,9 @@
 import { getPackageUpdates } from './package';
-import { getPkgReleases as _getPkgReleases } from '../../datasource/github-tags';
+import { getReleases as _getReleases } from '../../datasource/github-tags';
 import { getConfig } from '../../config/defaults';
 
 const defaultConfig = getConfig();
-const getPkgReleases: any = _getPkgReleases;
+const getReleases: any = _getReleases;
 
 jest.mock('../../datasource/github-tags');
 
@@ -38,7 +38,7 @@ describe('lib/manager/travis/package', () => {
     it('detects pinning', async () => {
       config.currentValue = ['8.4.0', '10.0.0', '12.0.0'];
       config.supportPolicy = ['lts'];
-      getPkgReleases.mockReturnValueOnce({
+      getReleases.mockReturnValueOnce({
         releases: [
           {
             version: '4.4.4',
diff --git a/lib/util/exec/docker/index.ts b/lib/util/exec/docker/index.ts
index e3ff78f93ffe70d9aabafc49174aef52942e3393..eec51223d610c206da8f1d9e2e044fa43a971320 100644
--- a/lib/util/exec/docker/index.ts
+++ b/lib/util/exec/docker/index.ts
@@ -8,7 +8,7 @@ import {
 } from '../common';
 import { logger } from '../../../logger';
 import * as versioning from '../../../versioning';
-import { getPkgReleases } from '../../../datasource/docker';
+import { getReleases } from '../../../datasource/docker';
 
 const prefetchedImages = new Set<string>();
 
@@ -82,7 +82,7 @@ async function getDockerTag(
     { constraint },
     `Found ${scheme} version constraint - checking for a compatible ${lookupName} image to use`
   );
-  const imageReleases = await getPkgReleases({ lookupName });
+  const imageReleases = await getReleases({ lookupName });
   if (imageReleases && imageReleases.releases) {
     let versions = imageReleases.releases.map(release => release.version);
     versions = versions.filter(
diff --git a/lib/workers/common.ts b/lib/workers/common.ts
index 6bdd60731dc8c7b40f800cba59f82edc3b6bedf3..c19b82953b9807608cc8327407d8469336082c05 100644
--- a/lib/workers/common.ts
+++ b/lib/workers/common.ts
@@ -22,7 +22,6 @@ export interface BranchUpgradeConfig
   currentDigestShort?: string;
   currentValue?: string;
   currentVersion?: string;
-
   endpoint?: string;
   excludeCommitPaths?: string[];
   group?: GroupConfig;
diff --git a/lib/workers/pr/changelog/releases.spec.ts b/lib/workers/pr/changelog/releases.spec.ts
index a260d7537690f4270f34b175a28dbb80dcbef729..d5647b9c820d259baa8ecc6e24be354c79f6c275 100644
--- a/lib/workers/pr/changelog/releases.spec.ts
+++ b/lib/workers/pr/changelog/releases.spec.ts
@@ -43,6 +43,8 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain only stable', async () => {
       const config = partial<BranchUpgradeConfig>({
+        datasource: 'some-datasource',
+        depName: 'some-depname',
         versioning: npmVersioning.id,
         fromVersion: '1.0.0',
         toVersion: '1.1.0',
@@ -53,6 +55,8 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain fromVersion unstable', async () => {
       const config = partial<BranchUpgradeConfig>({
+        datasource: 'some-datasource',
+        depName: 'some-depname',
         versioning: npmVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.1.0',
@@ -63,6 +67,8 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain toVersion unstable', async () => {
       const config = partial<BranchUpgradeConfig>({
+        datasource: 'some-datasource',
+        depName: 'some-depname',
         versioning: npmVersioning.id,
         fromVersion: '1.0.1',
         toVersion: '1.2.0-rc1',
@@ -73,6 +79,8 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain both fromVersion toVersion unstable', async () => {
       const config = partial<BranchUpgradeConfig>({
+        datasource: 'some-datasource',
+        depName: 'some-depname',
         versioning: npmVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.2.0-rc1',
@@ -83,6 +91,8 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should valueToVersion', async () => {
       const config = partial<BranchUpgradeConfig>({
+        datasource: 'some-datasource',
+        depName: 'some-depname',
         versioning: dockerVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.2.0-rc0',
diff --git a/lib/workers/pr/changelog/releases.ts b/lib/workers/pr/changelog/releases.ts
index ba9bbe9edde30c9b1abdd2b2d355b6739309c4ca..e1b7bf1d1bb8bdbf41c59ec543bebab1e2d180e8 100644
--- a/lib/workers/pr/changelog/releases.ts
+++ b/lib/workers/pr/changelog/releases.ts
@@ -1,4 +1,5 @@
 import { getPkgReleases, Release } from '../../../datasource';
+import { isGetPkgReleasesConfig } from '../../../datasource/common';
 import { logger } from '../../../logger';
 import { get, VersioningApi } from '../../../versioning';
 import { BranchUpgradeConfig } from '../../common';
@@ -23,6 +24,10 @@ export async function getInRangeReleases(
   config: BranchUpgradeConfig
 ): Promise<Release[] | null> {
   const { versioning, fromVersion, toVersion, depName, datasource } = config;
+  // istanbul ignore if
+  if (!isGetPkgReleasesConfig(config)) {
+    return null;
+  }
   try {
     const pkgReleases = (await getPkgReleases(config)).releases;
     const version = get(versioning);
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 88c87c4d09b8fe47eeb800c2c8012c97c778c8d8..d20f6ebfb46a15212988b3baf1a0ef694a363399 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -1098,7 +1098,7 @@ describe('workers/repository/process/lookup', () => {
       config.depName = 'node';
       config.datasource = datasourceDocker.id;
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '8.0.0',
@@ -1119,7 +1119,7 @@ describe('workers/repository/process/lookup', () => {
         config.depName = 'node';
         config.versioning = dockerVersioning.id;
         config.datasource = datasourceDocker.id;
-        docker.getPkgReleases.mockResolvedValueOnce({
+        docker.getReleases.mockResolvedValueOnce({
           releases: [
             { version: '8.1.0' },
             { version: '8.1.5' },
@@ -1141,7 +1141,7 @@ describe('workers/repository/process/lookup', () => {
       config.depName = 'node';
       config.datasource = datasourceDocker.id;
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '8.0.0',
@@ -1160,7 +1160,7 @@ describe('workers/repository/process/lookup', () => {
       config.depName = 'node';
       config.datasource = datasourceDocker.id;
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '8.0.0',
@@ -1182,7 +1182,7 @@ describe('workers/repository/process/lookup', () => {
       config.depName = 'node';
       config.datasource = datasourceDocker.id;
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '8.0.0',
@@ -1205,7 +1205,7 @@ describe('workers/repository/process/lookup', () => {
       config.datasource = datasourceDocker.id;
       config.currentDigest = 'sha256:zzzzzzzzzzzzzzz';
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '8.0.0',
@@ -1226,7 +1226,7 @@ describe('workers/repository/process/lookup', () => {
       config.datasource = datasourceDocker.id;
       config.currentDigest = 'sha256:zzzzzzzzzzzzzzz';
       config.pinDigests = true;
-      docker.getPkgReleases.mockResolvedValueOnce({
+      docker.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: 'alpine',
@@ -1247,7 +1247,7 @@ describe('workers/repository/process/lookup', () => {
       config.depName = 'some-path';
       config.versioning = gitVersioning.id;
       config.datasource = datasourceGitSubmodules.id;
-      gitSubmodules.getPkgReleases.mockResolvedValueOnce({
+      gitSubmodules.getReleases.mockResolvedValueOnce({
         releases: [
           {
             version: '4b825dc642cb6eb9a060e54bf8d69288fbee4904',
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index dd9a154fc0966215a7cda788b1d28c7d8498f9c6..9951d2efbb7da099c9bacd3687bc157f60d494dd 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -8,6 +8,7 @@ import {
   supportsDigests,
   getDigest,
   Release,
+  isGetPkgReleasesConfig,
 } from '../../../../datasource';
 import { LookupUpdate } from './common';
 import { RangeConfig } from '../../../../manager/common';
@@ -143,6 +144,12 @@ export async function lookupUpdates(
     res.skipReason = SkipReason.InvalidValue;
   }
 
+  // istanbul ignore if
+  if (!isGetPkgReleasesConfig(config)) {
+    res.skipReason = SkipReason.Unknown;
+    return res;
+  }
+
   if (isValid) {
     const dependency = clone(await getPkgReleases(config));
     if (!dependency) {