diff --git a/lib/datasource/cdnjs/index.spec.ts b/lib/datasource/cdnjs/index.spec.ts
index 4a387baa45b3acf310573f5bd30eec8bccf1c603..db88098d92930ead2fdedb9bb80f02e26c84148d 100644
--- a/lib/datasource/cdnjs/index.spec.ts
+++ b/lib/datasource/cdnjs/index.spec.ts
@@ -45,8 +45,8 @@ describe('datasource/cdnjs', () => {
       jest.clearAllMocks();
       return global.renovateCache.rmAll();
     });
-    it('throws for empty result', async () => {
-      got.mockResolvedValueOnce(null);
+    it('throws for 429', async () => {
+      got.mockRejectedValueOnce({ statusCode: 429 });
       await expect(
         getPkgReleases({ lookupName: 'foo/bar' })
       ).rejects.toThrowError(DATASOURCE_FAILURE);
@@ -55,19 +55,13 @@ describe('datasource/cdnjs', () => {
       got.mockResolvedValueOnce({});
       expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockRejectedValueOnce({ statusCode: 404 });
-      expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
-    });
-    it('returns null for 401', async () => {
-      got.mockRejectedValueOnce({ statusCode: 401 });
-      expect(await getPkgReleases({ lookupName: 'foo/bar' })).toBeNull();
-    });
-    it('throws for 429', async () => {
-      got.mockRejectedValueOnce({ statusCode: 429 });
-      await expect(
-        getPkgReleases({ lookupName: 'foo/bar' })
-      ).rejects.toThrowError(DATASOURCE_FAILURE);
+    it('throws for 404', async () => {
+      const err = new Error();
+      err.statusCode = 404;
+      got.mockImplementationOnce(() => {
+        throw err;
+      });
+      await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow();
     });
     it('throws for 5xx', async () => {
       got.mockRejectedValueOnce({ statusCode: 502 });
@@ -75,19 +69,6 @@ describe('datasource/cdnjs', () => {
         getPkgReleases({ 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);
-    });
-    it('returns null with wrong auth token', async () => {
-      got.mockRejectedValueOnce({ statusCode: 401 });
-      const res = await getPkgReleases({ 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' });
diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts
index 68ed19489d5fa361dcc9bff69a424f5f8b008481..b39d73d299c3c08deadc91f20302cf8cac6607a2 100644
--- a/lib/datasource/cdnjs/index.ts
+++ b/lib/datasource/cdnjs/index.ts
@@ -88,23 +88,12 @@ export async function getPkgReleases({
 
     return result;
   } catch (err) {
-    const errorData = { library, err };
-
     if (
       err.statusCode === 429 ||
       (err.statusCode >= 500 && err.statusCode < 600)
     ) {
       throw new DatasourceError(err);
     }
-    if (err.statusCode === 401) {
-      logger.debug(errorData, 'Authorization error');
-    } else if (err.statusCode === 404) {
-      logger.debug(errorData, 'Package lookup error');
-    } else {
-      logger.debug(errorData, 'CDNJS lookup failure: Unknown error');
-      throw new DatasourceError(err);
-    }
+    throw err;
   }
-
-  return null;
 }
diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts
index 9dd47f443dce31d57a265374ca781a5ea9cdf2e0..83725e6e7ee7358579ac3c9e6342908590a9fddf 100644
--- a/lib/datasource/crate/index.spec.ts
+++ b/lib/datasource/crate/index.spec.ts
@@ -44,13 +44,13 @@ describe('datasource/crate', () => {
         await getPkgReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
+    it('throws for 404', async () => {
+      const err = new Error();
+      err.statusCode = 404;
+      got.mockImplementationOnce(() => {
+        throw err;
+      });
+      await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow();
     });
     it('throws for 5xx', async () => {
       got.mockImplementationOnce(() =>
@@ -67,12 +67,6 @@ describe('datasource/crate', () => {
       expect(e).toBeDefined();
       expect(e).toMatchSnapshot();
     });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
diff --git a/lib/datasource/crate/index.ts b/lib/datasource/crate/index.ts
index 0640c13f1a8d16c1f00f332a895f6e0d466c2e93..fc0caadc1a96eb73a6e436d84643bbc5ab543e72 100644
--- a/lib/datasource/crate/index.ts
+++ b/lib/datasource/crate/index.ts
@@ -95,18 +95,12 @@ export async function getPkgReleases({
     await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
     return result;
   } catch (err) {
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug({ lookupName }, `Dependency lookup failure: not found`);
-      logger.debug({ err }, 'Crate lookup error');
-      return null;
-    }
     if (
       err.statusCode === 429 ||
       (err.statusCode >= 500 && err.statusCode < 600)
     ) {
       throw new DatasourceError(err);
     }
-    logger.warn({ err, lookupName }, 'crates.io lookup failure: Unknown error');
-    return null;
+    throw err;
   }
 }
diff --git a/lib/datasource/dart/index.spec.ts b/lib/datasource/dart/index.spec.ts
index 3e63fdb88d926df9e978e77a17d68c43fffe946e..1895e46e305ca274ac23990a54ea54f9cf8c2520 100644
--- a/lib/datasource/dart/index.spec.ts
+++ b/lib/datasource/dart/index.spec.ts
@@ -41,15 +41,13 @@ describe('datasource/dart', () => {
         await getPkgReleases({ lookupName: 'shared_preferences' })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
-      ).toBeNull();
+    it('throws for 404', async () => {
+      const err = new Error();
+      err.statusCode = 404;
+      got.mockImplementationOnce(() => {
+        throw err;
+      });
+      await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow();
     });
     it('throws for 5xx', async () => {
       got.mockImplementationOnce(() =>
@@ -66,14 +64,6 @@ describe('datasource/dart', () => {
       expect(e).toBeDefined();
       expect(e).toMatchSnapshot();
     });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(
-        await getPkgReleases({ lookupName: 'shared_preferences' })
-      ).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({ body });
       const res = await getPkgReleases({
diff --git a/lib/datasource/dart/index.ts b/lib/datasource/dart/index.ts
index 7c571066ad1cf01c73d404b350e3847cdef2536c..9edbe14dfbcf8534ee7a3995a5e10a2829ea5f51 100644
--- a/lib/datasource/dart/index.ts
+++ b/lib/datasource/dart/index.ts
@@ -1,5 +1,4 @@
 import got from '../../util/got';
-import { logger } from '../../logger';
 import { DatasourceError, ReleaseResult, GetReleasesConfig } from '../common';
 
 export const id = 'dart';
@@ -27,22 +26,13 @@ export async function getPkgReleases({
       json: true,
     });
   } catch (err) {
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug({ lookupName }, `Dependency lookup failure: not found`);
-      logger.debug({ err }, 'Dart lookup error');
-      return null;
-    }
     if (
       err.statusCode === 429 ||
       (err.statusCode >= 500 && err.statusCode < 600)
     ) {
       throw new DatasourceError(err);
     }
-    logger.warn(
-      { err, lookupName },
-      'pub.dartlang.org lookup failure: Unknown error'
-    );
-    return null;
+    throw err;
   }
 
   const body = raw && raw.body;
diff --git a/lib/util/got/got.spec.ts b/lib/datasource/docker/got.spec.ts
similarity index 97%
rename from lib/util/got/got.spec.ts
rename to lib/datasource/docker/got.spec.ts
index a45da3edde641f4e9d563ff01bc15d8826779b8a..2d6180afec67138e1b2ee7b2bca582d08bf78a78 100644
--- a/lib/util/got/got.spec.ts
+++ b/lib/datasource/docker/got.spec.ts
@@ -1,5 +1,5 @@
 import nock from 'nock';
-import { getConfigResponse } from '../../datasource/docker';
+import { getConfigResponse } from '.';
 
 describe('getConfigResponse', () => {
   beforeEach(() => {
diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts
index 4586051037d15d42a8c0a8c0f9c3640ff9c475e1..35b4c0892f4c30307e58daa38e2ba3d440580e92 100644
--- a/lib/datasource/galaxy/index.spec.ts
+++ b/lib/datasource/galaxy/index.spec.ts
@@ -35,28 +35,6 @@ describe('datasource/galaxy', () => {
         await getPkgReleases({ lookupName: 'non_existent_crate' })
       ).toBeNull();
     });
-    it('returns null for empty list', async () => {
-      got.mockReturnValueOnce({
-        body: '\n',
-      });
-      expect(
-        await getPkgReleases({ lookupName: 'non_existent_crate' })
-      ).toBeNull();
-    });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
-    });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(await getPkgReleases({ lookupName: 'some_crate' })).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts
index b3a1a88d2e6fb5fa966e6a964de947a6800928fa..95961c90760f5020624263e497b2766b056aae32 100644
--- a/lib/datasource/galaxy/index.ts
+++ b/lib/datasource/galaxy/index.ts
@@ -31,73 +31,64 @@ export async function getPkgReleases({
     projectName;
   const galaxyProjectUrl = baseUrl + userName + '/' + projectName;
 
-  try {
-    let res: any = await got(galaxyAPIUrl, {
-      hostType: id,
-    });
-    if (!res || !res.body) {
-      logger.warn(
-        { dependency: lookupName },
-        `Received invalid crate data from ${galaxyAPIUrl}`
-      );
-      return null;
-    }
+  let res: any = await got(galaxyAPIUrl, {
+    hostType: id,
+  });
+  if (!res || !res.body) {
+    logger.warn(
+      { dependency: lookupName },
+      `Received invalid crate data from ${galaxyAPIUrl}`
+    );
+    return null;
+  }
 
-    res = res.body;
-    const response = JSON.parse(res);
+  res = res.body;
+  const response = JSON.parse(res);
 
-    // istanbul ignore if
-    if (response.results.length > 1) {
-      logger.warn(
-        { dependency: lookupName },
-        `Received multiple results from ${galaxyAPIUrl}`
-      );
-      return null;
-    }
-    if (response.results.length === 0) {
-      logger.warn(
-        { dependency: lookupName },
-        `Received no results from ${galaxyAPIUrl}`
-      );
-      return null;
-    }
-
-    const resultObject = response.results[0];
-    const versions = resultObject.summary_fields.versions;
+  // istanbul ignore if
+  if (response.results.length > 1) {
+    logger.warn(
+      { dependency: lookupName },
+      `Received multiple results from ${galaxyAPIUrl}`
+    );
+    return null;
+  }
+  if (response.results.length === 0) {
+    logger.warn(
+      { dependency: lookupName },
+      `Received no results from ${galaxyAPIUrl}`
+    );
+    return null;
+  }
 
-    const result: ReleaseResult = {
-      releases: [],
-    };
+  const resultObject = response.results[0];
+  const versions = resultObject.summary_fields.versions;
 
-    result.dependencyUrl = galaxyProjectUrl;
-    if (resultObject.github_user && resultObject.github_repo) {
-      result.sourceUrl =
-        'https://github.com/' +
-        resultObject.github_user +
-        '/' +
-        resultObject.github_repo;
-    }
+  const result: ReleaseResult = {
+    releases: [],
+  };
 
-    result.releases = versions.map(
-      (version: { name: string; release_date: string }) => {
-        const release: Release = {
-          version: version.name,
-          releaseTimestamp: version.release_date,
-        };
+  result.dependencyUrl = galaxyProjectUrl;
+  if (resultObject.github_user && resultObject.github_repo) {
+    result.sourceUrl =
+      'https://github.com/' +
+      resultObject.github_user +
+      '/' +
+      resultObject.github_repo;
+  }
 
-        return release;
-      }
-    );
+  result.releases = versions.map(
+    (version: { name: string; release_date: string }) => {
+      const release: Release = {
+        version: version.name,
+        releaseTimestamp: version.release_date,
+      };
 
-    const cacheMinutes = 10;
-    await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
-    return result;
-  } catch (err) {
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug({ lookupName }, `Dependency lookup failure: not found`);
-      return null;
+      return release;
     }
-    logger.warn({ err, lookupName }, 'galaxy lookup failure: Unknown error');
-    return null;
-  }
+  );
+
+  const cacheMinutes = 10;
+  await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
+  return result;
 }
diff --git a/lib/datasource/git-submodules/index.spec.ts b/lib/datasource/git-submodules/index.spec.ts
index 1c611332e06e43ad2675d2d94cc3490f48a04397..5367212669f88d5ed1fd218b1295573c944d68a6 100644
--- a/lib/datasource/git-submodules/index.spec.ts
+++ b/lib/datasource/git-submodules/index.spec.ts
@@ -10,24 +10,6 @@ const registryUrls = [lookupName, 'master'];
 describe('datasource/git-submoduless', () => {
   beforeEach(() => global.renovateCache.rmAll());
   describe('getPkgReleases', () => {
-    it('returns null if response is wrong', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          return Promise.resolve(null);
-        },
-      });
-      const versions = await getPkgReleases({ lookupName, registryUrls });
-      expect(versions).toEqual(null);
-    });
-    it('returns null if remote call throws exception', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          throw new Error();
-        },
-      });
-      const versions = await getPkgReleases({ lookupName, registryUrls });
-      expect(versions).toEqual(null);
-    });
     it('returns versions filtered from tags', async () => {
       simpleGit.mockReturnValue({
         listRemote() {
diff --git a/lib/datasource/git-submodules/index.ts b/lib/datasource/git-submodules/index.ts
index 95298dfd4920ae38bc2c53f5eb41cb2f492d8570..72ea9230897e1f712d3756f9bff2bd1c9a7a26c2 100644
--- a/lib/datasource/git-submodules/index.ts
+++ b/lib/datasource/git-submodules/index.ts
@@ -2,7 +2,6 @@ import Git from 'simple-git/promise';
 import { URL } from 'url';
 
 import { ReleaseResult, GetReleasesConfig, DigestConfig } from '../common';
-import { logger } from '../../logger';
 
 export const id = 'git-submodules';
 
@@ -22,31 +21,26 @@ export async function getPkgReleases({
   }
 
   const git = Git();
-  try {
-    const newHash = (
-      await git.listRemote(['--refs', registryUrls[0], registryUrls[1]])
-    )
-      .trim()
-      .split(/\t/)[0];
+  const newHash = (
+    await git.listRemote(['--refs', registryUrls[0], registryUrls[1]])
+  )
+    .trim()
+    .split(/\t/)[0];
 
-    const sourceUrl = new URL(registryUrls[0]);
-    sourceUrl.username = '';
+  const sourceUrl = new URL(registryUrls[0]);
+  sourceUrl.username = '';
 
-    const result = {
-      sourceUrl: sourceUrl.href,
-      releases: [
-        {
-          version: newHash,
-        },
-      ],
-    };
-    const cacheMinutes = 60;
-    await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
-    return result;
-  } catch (err) {
-    logger.debug(`Error looking up tags in ${lookupName}`);
-  }
-  return null;
+  const result = {
+    sourceUrl: sourceUrl.href,
+    releases: [
+      {
+        version: newHash,
+      },
+    ],
+  };
+  const cacheMinutes = 60;
+  await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
+  return result;
 }
 
 export const getDigest = (
diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts
index ad93a28e55e1ee4a4263e9f2e67ca3509eecafe8..9c8af8973f4b3c9a61d1cb8aed43eacc8fcdb78d 100644
--- a/lib/datasource/git-tags/index.spec.ts
+++ b/lib/datasource/git-tags/index.spec.ts
@@ -10,24 +10,6 @@ const lookupName = 'https://github.com/example/example.git';
 describe('datasource/git-tags', () => {
   beforeEach(() => global.renovateCache.rmAll());
   describe('getPkgReleases', () => {
-    it('returns nil if response is wrong', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          return Promise.resolve(null);
-        },
-      });
-      const versions = await getPkgReleases({ lookupName });
-      expect(versions).toEqual(null);
-    });
-    it('returns nil if remote call throws exception', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          throw new Error();
-        },
-      });
-      const versions = await getPkgReleases({ lookupName });
-      expect(versions).toEqual(null);
-    });
     it('returns versions filtered from tags', async () => {
       simpleGit.mockReturnValue({
         listRemote() {
diff --git a/lib/datasource/git-tags/index.ts b/lib/datasource/git-tags/index.ts
index e2ccd341208c4f9d77c0bb0bbef90699689a1aab..a27210b034a22ccce2260e7485a9886569bcad7b 100644
--- a/lib/datasource/git-tags/index.ts
+++ b/lib/datasource/git-tags/index.ts
@@ -1,6 +1,5 @@
 import simpleGit from 'simple-git/promise';
 import * as semver from '../../versioning/semver';
-import { logger } from '../../logger';
 import { ReleaseResult, GetReleasesConfig } from '../common';
 
 export const id = 'git-tags';
@@ -15,38 +14,33 @@ export async function getPkgReleases({
   lookupName,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
   const git = simpleGit();
-  try {
-    const cachedResult = await renovateCache.get<ReleaseResult>(
-      cacheNamespace,
-      lookupName
-    );
-    /* istanbul ignore next line */
-    if (cachedResult) return cachedResult;
+  const cachedResult = await renovateCache.get<ReleaseResult>(
+    cacheNamespace,
+    lookupName
+  );
+  /* istanbul ignore next line */
+  if (cachedResult) return cachedResult;
 
-    // fetch remote tags
-    const lsRemote = await git.listRemote([
-      '--sort=-v:refname',
-      '--tags',
-      lookupName,
-    ]);
-    // extract valid tags from git ls-remote which looks like 'commithash\trefs/tags/1.2.3
-    const tags = lsRemote
-      .replace(/^.+?refs\/tags\//gm, '')
-      .split('\n')
-      .filter(tag => semver.isVersion(tag));
-    const sourceUrl = lookupName.replace(/\.git$/, '').replace(/\/$/, '');
-    const result: ReleaseResult = {
-      sourceUrl,
-      releases: tags.map(tag => ({
-        version: tag,
-        gitRef: tag,
-      })),
-    };
+  // fetch remote tags
+  const lsRemote = await git.listRemote([
+    '--sort=-v:refname',
+    '--tags',
+    lookupName,
+  ]);
+  // extract valid tags from git ls-remote which looks like 'commithash\trefs/tags/1.2.3
+  const tags = lsRemote
+    .replace(/^.+?refs\/tags\//gm, '')
+    .split('\n')
+    .filter(tag => semver.isVersion(tag));
+  const sourceUrl = lookupName.replace(/\.git$/, '').replace(/\/$/, '');
+  const result: ReleaseResult = {
+    sourceUrl,
+    releases: tags.map(tag => ({
+      version: tag,
+      gitRef: tag,
+    })),
+  };
 
-    await renovateCache.set(cacheNamespace, lookupName, result, cacheMinutes);
-    return result;
-  } catch (e) {
-    logger.debug(`Error looking up tags in ${lookupName}`);
-  }
-  return null;
+  await renovateCache.set(cacheNamespace, lookupName, result, cacheMinutes);
+  return result;
 }
diff --git a/lib/datasource/github-releases/index.ts b/lib/datasource/github-releases/index.ts
index f57f0434b5c394d5f70b9c9db47bd5ce5b3de97a..7965e2a4c4246c6ea3bf527b24d61e642e045979 100644
--- a/lib/datasource/github-releases/index.ts
+++ b/lib/datasource/github-releases/index.ts
@@ -1,6 +1,5 @@
 import { api } from '../../platform/github/gh-got-wrapper';
 import { ReleaseResult, GetReleasesConfig } from '../common';
-import { logger } from '../../logger';
 
 const { get: ghGot } = api;
 
@@ -21,7 +20,6 @@ const cacheNamespace = 'datasource-github-releases';
 export async function getPkgReleases({
   lookupName: repo,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
-  let versions: string[];
   const cachedResult = await renovateCache.get<ReleaseResult>(
     cacheNamespace,
     repo
@@ -30,20 +28,16 @@ export async function getPkgReleases({
   if (cachedResult) {
     return cachedResult;
   }
-  try {
-    const url = `https://api.github.com/repos/${repo}/releases?per_page=100`;
-    type GitHubRelease = {
-      tag_name: string;
-    }[];
+  const url = `https://api.github.com/repos/${repo}/releases?per_page=100`;
+  type GitHubRelease = {
+    tag_name: string;
+  }[];
 
-    versions = (
-      await ghGot<GitHubRelease>(url, {
-        paginate: true,
-      })
-    ).body.map(o => o.tag_name);
-  } catch (err) /* istanbul ignore next */ {
-    logger.debug({ repo, err }, 'Error retrieving from github');
-  }
+  const versions = (
+    await ghGot<GitHubRelease>(url, {
+      paginate: true,
+    })
+  ).body.map(o => o.tag_name);
   // istanbul ignore if
   if (!versions) {
     return null;
diff --git a/lib/datasource/github-tags/index.ts b/lib/datasource/github-tags/index.ts
index 9cfcf220602f0827a1f5f2fe1b29ef55e725094a..f71cfb5f8b823c287df9d32469a0d0fb9123b75b 100644
--- a/lib/datasource/github-tags/index.ts
+++ b/lib/datasource/github-tags/index.ts
@@ -111,7 +111,6 @@ export async function getDigest(
 export async function getPkgReleases({
   lookupName: repo,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
-  let versions: string[];
   const cachedResult = await renovateCache.get<ReleaseResult>(
     cacheNamespace,
     getCacheKey(repo, 'tags')
@@ -120,24 +119,17 @@ export async function getPkgReleases({
   if (cachedResult) {
     return cachedResult;
   }
-  try {
-    // tag
-    const url = `https://api.github.com/repos/${repo}/tags?per_page=100`;
-    type GitHubTag = {
-      name: string;
-    }[];
+  // tag
+  const url = `https://api.github.com/repos/${repo}/tags?per_page=100`;
+  type GitHubTag = {
+    name: string;
+  }[];
 
-    versions = (
-      await ghGot<GitHubTag>(url, {
-        paginate: true,
-      })
-    ).body.map(o => o.name);
-  } catch (err) {
-    logger.debug({ repo, err }, 'Error retrieving from github');
-  }
-  if (!versions) {
-    return null;
-  }
+  const versions = (
+    await ghGot<GitHubTag>(url, {
+      paginate: true,
+    })
+  ).body.map(o => o.name);
   const dependency: ReleaseResult = {
     sourceUrl: 'https://github.com/' + repo,
     releases: null,
diff --git a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
index 73c1a863a9bf382789565979e3ac9183ac85587d..35f3f358db639cd4faf60cb6eae05ed2cdc59acb 100644
--- a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
@@ -1,5 +1,21 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`datasource/gitlab-tags getPkgReleases defaults to gitlab.com 1`] = `
+Object {
+  "releases": Array [
+    Object {
+      "gitRef": "v1.0.0",
+      "version": "v1.0.0",
+    },
+    Object {
+      "gitRef": "v1.1.0",
+      "version": "v1.1.0",
+    },
+  ],
+  "sourceUrl": "https://gitlab.com/some/dep2",
+}
+`;
+
 exports[`datasource/gitlab-tags getPkgReleases returns tags 1`] = `
 Object {
   "releases": Array [
diff --git a/lib/datasource/gitlab-tags/index.spec.ts b/lib/datasource/gitlab-tags/index.spec.ts
index d53087847a7839b48a55aa4a3fadbed35e043c4f..42e90c7b5e1e6ee7bb104a816256dc5ef8e40aad 100644
--- a/lib/datasource/gitlab-tags/index.spec.ts
+++ b/lib/datasource/gitlab-tags/index.spec.ts
@@ -23,5 +23,14 @@ describe('datasource/gitlab-tags', () => {
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(2);
     });
+    it('defaults to gitlab.com', async () => {
+      const body = [{ name: 'v1.0.0' }, { name: 'v1.1.0' }];
+      glGot.mockReturnValueOnce({ headers: {}, body });
+      const res = await gitlab.getPkgReleases({
+        lookupName: 'some/dep2',
+      });
+      expect(res).toMatchSnapshot();
+      expect(res.releases).toHaveLength(2);
+    });
   });
 });
diff --git a/lib/datasource/gitlab-tags/index.ts b/lib/datasource/gitlab-tags/index.ts
index 9a2a46f50314249be8a37d021d4ebbc86884051c..2df871690990e1487ad0d6d7863aea46a54b38f9 100644
--- a/lib/datasource/gitlab-tags/index.ts
+++ b/lib/datasource/gitlab-tags/index.ts
@@ -1,6 +1,5 @@
 import is from '@sindresorhus/is';
 import { api } from '../../platform/gitlab/gl-got-wrapper';
-import { logger } from '../../logger';
 import { GetReleasesConfig, ReleaseResult } from '../common';
 
 const { get: glGot } = api;
@@ -21,7 +20,6 @@ export async function getPkgReleases({
   const depHost = is.nonEmptyArray(registryUrls)
     ? registryUrls[0].replace(/\/$/, '')
     : 'https://gitlab.com';
-  let versions: string[];
   const cachedResult = await renovateCache.get<ReleaseResult>(
     cacheNamespace,
     getCacheKey(depHost, repo)
@@ -33,22 +31,17 @@ export async function getPkgReleases({
 
   const urlEncodedRepo = encodeURIComponent(repo);
 
-  try {
-    // tag
-    const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/repository/tags?per_page=100`;
-    type GlTag = {
-      name: string;
-    }[];
+  // tag
+  const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/repository/tags?per_page=100`;
+  type GlTag = {
+    name: string;
+  }[];
 
-    versions = (
-      await glGot<GlTag>(url, {
-        paginate: true,
-      })
-    ).body.map(o => o.name);
-  } catch (err) {
-    // istanbul ignore next
-    logger.debug({ repo, err }, 'Error retrieving from Gitlab');
-  }
+  const versions = (
+    await glGot<GlTag>(url, {
+      paginate: true,
+    })
+  ).body.map(o => o.name);
 
   // istanbul ignore if
   if (!versions) {
diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts
index b7b212158dc16f51d37cc341b8cb72f5d388d2d0..3fe6b7c39f5421c2b63f59e0a337a307febce78a 100644
--- a/lib/datasource/gradle-version/index.ts
+++ b/lib/datasource/gradle-version/index.ts
@@ -1,6 +1,5 @@
 import { coerce } from 'semver';
 import is from '@sindresorhus/is';
-import { logger } from '../../logger';
 import got from '../../util/got';
 import {
   DatasourceError,
@@ -56,8 +55,7 @@ export async function getPkgReleases({
         if (err.host === 'services.gradle.org') {
           throw new DatasourceError(err);
         }
-        logger.debug({ err }, 'gradle-version err');
-        return null;
+        throw err;
       }
     })
   );
diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts
index 3fc7b7cfe7142a03d329910ae9c93f44bb5911dd..26301d9d05816c543c8394fce83e3d59f0d37b4c 100644
--- a/lib/datasource/helm/index.spec.ts
+++ b/lib/datasource/helm/index.spec.ts
@@ -55,18 +55,18 @@ describe('datasource/helm', () => {
         })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(
-        await getPkgReleases({
-          lookupName: 'some_chart',
+    it('throws for 404', async () => {
+      const err = new Error();
+      err.statusCode = 404;
+      got.mockImplementationOnce(() => {
+        throw err;
+      });
+      await expect(
+        getPkgReleases({
+          lookupName: 'foo/bar',
           registryUrls: ['example-repository.com'],
         })
-      ).toBeNull();
+      ).rejects.toThrow();
     });
     it('throws for 5xx', async () => {
       got.mockImplementationOnce(() =>
@@ -86,17 +86,6 @@ describe('datasource/helm', () => {
       expect(e).toBeDefined();
       expect(e).toMatchSnapshot();
     });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(
-        await getPkgReleases({
-          lookupName: 'some_chart',
-          registryUrls: ['example-repository.com'],
-        })
-      ).toBeNull();
-    });
     it('returns null if index.yaml in response is empty', async () => {
       const res = { body: '# A comment' };
       got.mockReturnValueOnce(res);
diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts
index 0494a28306dc64c50ae62a91a577bcd50a5c0043..8ce40dcf62a4465073379f48ba08584173ed25cf 100644
--- a/lib/datasource/helm/index.ts
+++ b/lib/datasource/helm/index.ts
@@ -23,64 +23,37 @@ export async function getRepositoryData(
       return null;
     }
   } catch (err) {
-    // istanbul ignore if
-    if (err.code === 'ERR_INVALID_URL') {
-      logger.debug(
-        { helmRepository: repository },
-        'helm repository is not a valid URL - skipping'
-      );
-      return null;
-    }
-    // istanbul ignore if
-    if (err.code === 'ENOTFOUND' || err.code === 'EAI_AGAIN') {
-      logger.debug({ err }, 'Could not connect to helm repository');
-      return null;
-    }
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.warn({ err }, 'index.yaml lookup error');
-      return null;
-    }
     if (
       err.statusCode === 429 ||
       (err.statusCode >= 500 && err.statusCode < 600)
     ) {
       throw new DatasourceError(err);
     }
-    // istanbul ignore if
-    if (err.name === 'UnsupportedProtocolError') {
-      logger.debug({ repository }, 'Unsupported protocol');
-      return null;
-    }
-    logger.warn(
-      { err },
-      `helm datasource ${repository} lookup failure: Unknown error`
-    );
-    return null;
+    throw err;
   }
+  let doc;
   try {
-    const doc = yaml.safeLoad(res.body, { json: true });
-    if (!doc) {
-      logger.warn(`Failed to parse index.yaml from ${repository}`);
-      return null;
-    }
-    const result: ReleaseResult[] = Object.entries(doc.entries).map(
-      ([k, v]: [string, any]): ReleaseResult => ({
-        name: k,
-        homepage: v[0].home,
-        sourceUrl: v[0].sources ? v[0].sources[0] : undefined,
-        releases: v.map((x: any) => ({
-          version: x.version,
-        })),
-      })
-    );
-    const cacheMinutes = 20;
-    await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
-    return result;
+    doc = yaml.safeLoad(res.body, { json: true });
   } catch (err) {
-    logger.warn(`Failed to parse index.yaml from ${repository}`);
     logger.debug(err);
+  }
+  if (!doc) {
+    logger.warn(`Failed to parse index.yaml from ${repository}`);
     return null;
   }
+  const result: ReleaseResult[] = Object.entries(doc.entries).map(
+    ([k, v]: [string, any]): ReleaseResult => ({
+      name: k,
+      homepage: v[0].home,
+      sourceUrl: v[0].sources ? v[0].sources[0] : undefined,
+      releases: v.map((x: any) => ({
+        version: x.version,
+      })),
+    })
+  );
+  const cacheMinutes = 20;
+  await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
+  return result;
 }
 
 export async function getPkgReleases({
diff --git a/lib/datasource/hex/index.spec.ts b/lib/datasource/hex/index.spec.ts
index f55cd760874357523696d8ef0f6412a090313d89..8a262049a841d5633889cfe2b527ce348e1200ab 100644
--- a/lib/datasource/hex/index.spec.ts
+++ b/lib/datasource/hex/index.spec.ts
@@ -21,12 +21,6 @@ describe('datasource/hex', () => {
     beforeEach(() => {
       global.repoCache = {};
     });
-    it('returns null for empty result', async () => {
-      got.mockReturnValueOnce(null);
-      expect(
-        await getPkgReleases({ lookupName: 'non_existent_package' })
-      ).toBeNull();
-    });
     it('returns null for missing fields', async () => {
       got.mockReturnValueOnce({});
       expect(
@@ -38,21 +32,13 @@ describe('datasource/hex', () => {
         await getPkgReleases({ lookupName: 'non_existent_package' })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull();
-    });
-    it('returns null for 401', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 401,
-        })
-      );
-      expect(await getPkgReleases({ lookupName: 'some_package' })).toBeNull();
+    it('throws for 404', async () => {
+      const err = new Error();
+      err.statusCode = 404;
+      got.mockImplementationOnce(() => {
+        throw err;
+      });
+      await expect(getPkgReleases({ lookupName: 'foo/bar' })).rejects.toThrow();
     });
     it('throws for 429', async () => {
       got.mockImplementationOnce(() =>
@@ -74,22 +60,6 @@ describe('datasource/hex', () => {
         getPkgReleases({ 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();
-    });
-    it('returns null with wrong auth token', async () => {
-      hostRules.find.mockReturnValueOnce({ token: 'this_simple_token' });
-      got.mockReturnValueOnce(
-        Promise.reject({
-          statusCode: 401,
-        })
-      );
-      const res = await getPkgReleases({ lookupName: 'certifi' });
-      expect(res).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: res1,
diff --git a/lib/datasource/hex/index.ts b/lib/datasource/hex/index.ts
index a813bc451f258508b11dd2a6e9526af600a0361e..a001e717f0c5ed732fadd28904d56f207bbcf6c9 100644
--- a/lib/datasource/hex/index.ts
+++ b/lib/datasource/hex/index.ts
@@ -54,23 +54,12 @@ export async function getPkgReleases({
 
     return result;
   } catch (err) {
-    const errorData = { lookupName, err };
-
     if (
       err.statusCode === 429 ||
       (err.statusCode >= 500 && err.statusCode < 600)
     ) {
       throw new DatasourceError(err);
     }
-
-    if (err.statusCode === 401) {
-      logger.debug(errorData, 'Authorization error');
-    } else if (err.statusCode === 404) {
-      logger.debug(errorData, 'Package lookup error');
-    } else {
-      logger.warn(errorData, 'hex lookup failure: Unknown error');
-    }
+    throw err;
   }
-
-  return null;
 }
diff --git a/lib/datasource/index.spec.ts b/lib/datasource/index.spec.ts
index 7f0a7ea63fd54d331c55a57544c36913c6c3eb14..5d48d9ddf48dee70c5ec29953943245ea0abdd27 100644
--- a/lib/datasource/index.spec.ts
+++ b/lib/datasource/index.spec.ts
@@ -72,7 +72,7 @@ describe('datasource/index', () => {
   it('trims sourceUrl', async () => {
     npmDatasource.getPkgReleases.mockResolvedValue({
       sourceUrl: ' https://abc.com',
-      releases: [],
+      releases: [{ version: '1.0.0' }, { version: '1.1.0' }],
     });
     const res = await datasource.getPkgReleases({
       datasource: datasourceNpm.id,
diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts
index 12ad5745016493f598500d46699a33cf002fc0be..7c6c073130b5d4827a05a84c4506ffc65a394037 100644
--- a/lib/datasource/index.ts
+++ b/lib/datasource/index.ts
@@ -77,12 +77,43 @@ export async function getPkgReleases(
       ...config,
       lookupName,
     });
-  } catch (e) /* istanbul ignore next */ {
-    if (e instanceof DatasourceError) {
-      e.datasource = datasource;
-      e.lookupName = lookupName;
+  } catch (err) /* istanbul ignore next */ {
+    logger.trace({ err }, 'getPkgReleases err');
+    if (err instanceof DatasourceError) {
+      err.datasource = datasource;
+      err.lookupName = lookupName;
+      throw err;
+    }
+    const { name, url, code, statusCode, statusMessage } = err;
+    const logMeta = {
+      datasource,
+      lookupName,
+      url,
+      code,
+      statusCode,
+      statusMessage,
+    };
+    const log = (reason: string, level = 'debug'): void =>
+      logger[level]({ ...logMeta, reason }, `Datasource Error (ignored)`);
+    if (name === 'UnsupportedProtocolError') {
+      log('Unsupported Protocol');
+    } else if (name === 'SyntaxError') {
+      log('Could not parse response');
+    } else if (code === 'ERR_INVALID_URL') {
+      log('Invalid URL');
+    } else if (code === 'ENOTFOUND' || code === 'EAI_AGAIN') {
+      log('Connection Error');
+    } else if (statusCode === 401 || statusCode === 403) {
+      log('Unauthorized');
+    } else if (statusCode === 404 || code === 'ENOTFOUND') {
+      log('Not Found');
+    } else if (statusCode === 429) {
+      log('Rate Limited');
+    } else if (statusCode >= 500 && statusCode < 600) {
+      log('Server Error');
+    } else {
+      log('Unknown', 'info');
     }
-    throw e;
   }
   if (!res) {
     return res;
diff --git a/lib/datasource/metadata.spec.ts b/lib/datasource/metadata.spec.ts
index 5a70c827b26c198e985d2a750fac9c381b67d89f..a9b53068db48c06ced4a7bc67ed5d60ab28ac461 100644
--- a/lib/datasource/metadata.spec.ts
+++ b/lib/datasource/metadata.spec.ts
@@ -78,4 +78,17 @@ describe('datasource/metadata', () => {
     addMetaData(dep, datasource, lookupName);
     expect(dep.sourceUrl).toEqual('https://github.com/mockk/mockk');
   });
+  it('Should move github homepage to sourceUrl', () => {
+    const dep = {
+      homepage: 'http://www.github.com/mockk/mockk/',
+      releases: [{ version: '1.9.3' }],
+      sourceUrl: undefined,
+    };
+    const datasource = datasourceMaven.id;
+    const lookupName = 'io.mockk:mockk';
+
+    addMetaData(dep, datasource, lookupName);
+    expect(dep.sourceUrl).toEqual('https://github.com/mockk/mockk');
+    expect(dep.homepage).toBeUndefined();
+  });
 });
diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts
index 5ede9da3e9b0ca61f7998691afb139ef1a285a2a..e82e7d71d67d5068899894ccb9a7854b95e127e8 100644
--- a/lib/datasource/orb/index.spec.ts
+++ b/lib/datasource/orb/index.spec.ts
@@ -33,14 +33,6 @@ describe('datasource/orb', () => {
       global.repoCache = {};
       return global.renovateCache.rmAll();
     });
-    it('returns null for empty result', async () => {
-      got.post.mockReturnValueOnce({ body: {} });
-      expect(
-        await datasource.getPkgReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
-        })
-      ).toBeNull();
-    });
     it('returns null for missing orb', async () => {
       got.post.mockReturnValueOnce({ body: { data: {} } });
       expect(
@@ -49,28 +41,6 @@ describe('datasource/orb', () => {
         })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(
-        await datasource.getPkgReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
-        })
-      ).toBeNull();
-    });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(
-        await datasource.getPkgReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
-        })
-      ).toBeNull();
-    });
     it('processes real data', async () => {
       got.post.mockReturnValueOnce({
         body: orbData,
diff --git a/lib/datasource/orb/index.ts b/lib/datasource/orb/index.ts
index 24385098637109c5903e058cb831f42ea4f48788..a300bac9c52f7080e30d96ff07a454e45f82d946 100644
--- a/lib/datasource/orb/index.ts
+++ b/lib/datasource/orb/index.ts
@@ -35,45 +35,35 @@ export async function getPkgReleases({
     query: `{orb(name:"${lookupName}"){name, homeUrl, versions {version, createdAt}}}`,
     variables: {},
   };
-  try {
-    const res: OrbRelease = (
-      await got.post(url, {
-        body,
-        hostType: id,
-        json: true,
-        retry: 5,
-      })
-    ).body.data.orb;
-    if (!res) {
-      logger.debug({ lookupName }, 'Failed to look up orb');
-      return null;
-    }
-    // Simplify response before caching and returning
-    const dep: ReleaseResult = {
-      name: lookupName,
-      versions: {},
-      releases: null,
-    };
-    if (res.homeUrl && res.homeUrl.length) {
-      dep.homepage = res.homeUrl;
-    }
-    dep.homepage =
-      dep.homepage || `https://circleci.com/orbs/registry/orb/${lookupName}`;
-    const releases = res.versions.map(v => v.version);
-    dep.releases = releases.map(version => ({
-      version,
-    }));
-    logger.trace({ dep }, 'dep');
-    const cacheMinutes = 15;
-    await renovateCache.set(cacheNamespace, cacheKey, dep, cacheMinutes);
-    return dep;
-  } catch (err) /* istanbul ignore next */ {
-    logger.debug({ err }, 'CircleCI Orb lookup error');
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug({ lookupName }, `CircleCI Orb lookup failure: not found`);
-      return null;
-    }
-    logger.warn({ lookupName }, 'CircleCI Orb lookup failure: Unknown error');
+  const res: OrbRelease = (
+    await got.post(url, {
+      body,
+      hostType: id,
+      json: true,
+      retry: 5,
+    })
+  ).body.data.orb;
+  if (!res) {
+    logger.debug({ lookupName }, 'Failed to look up orb');
     return null;
   }
+  // Simplify response before caching and returning
+  const dep: ReleaseResult = {
+    name: lookupName,
+    versions: {},
+    releases: null,
+  };
+  if (res.homeUrl && res.homeUrl.length) {
+    dep.homepage = res.homeUrl;
+  }
+  dep.homepage =
+    dep.homepage || `https://circleci.com/orbs/registry/orb/${lookupName}`;
+  const releases = res.versions.map(v => v.version);
+  dep.releases = releases.map(version => ({
+    version,
+  }));
+  logger.trace({ dep }, 'dep');
+  const cacheMinutes = 15;
+  await renovateCache.set(cacheNamespace, cacheKey, dep, cacheMinutes);
+  return dep;
 }
diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts
index a7483e0294060d140d37ba6f63b4d027a59ea984..031c0d0da8648c370f940ee9cc3f12867a34dd78 100644
--- a/lib/datasource/terraform-module/index.spec.ts
+++ b/lib/datasource/terraform-module/index.spec.ts
@@ -25,28 +25,6 @@ describe('datasource/terraform-module', () => {
         })
       ).toBeNull();
     });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(
-        await terraform.getPkgReleases({
-          lookupName: 'hashicorp/consul/aws',
-        })
-      ).toBeNull();
-    });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(
-        await terraform.getPkgReleases({
-          lookupName: 'hashicorp/consul/aws',
-        })
-      ).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts
index a9578d7753263f760c91b6d57ff0ccdf96bd208c..4bdde279b9417b4f64ae69d5f090301457f636c8 100644
--- a/lib/datasource/terraform-module/index.ts
+++ b/lib/datasource/terraform-module/index.ts
@@ -71,52 +71,34 @@ export async function getPkgReleases({
   if (cachedResult) {
     return cachedResult;
   }
-  try {
-    const res: TerraformRelease = (
-      await got(pkgUrl, {
-        json: true,
-        hostType: id,
-      })
-    ).body;
-    const returnedName = res.namespace + '/' + res.name + '/' + res.provider;
-    if (returnedName !== repository) {
-      logger.warn({ pkgUrl }, 'Terraform registry result mismatch');
-      return null;
-    }
-    // Simplify response before caching and returning
-    const dep: ReleaseResult = {
-      name: repository,
-      versions: {},
-      releases: null,
-    };
-    if (res.source) {
-      dep.sourceUrl = res.source;
-    }
-    dep.releases = res.versions.map(version => ({
-      version,
-    }));
-    if (pkgUrl.startsWith('https://registry.terraform.io/')) {
-      dep.homepage = `https://registry.terraform.io/modules/${repository}`;
-    }
-    logger.trace({ dep }, 'dep');
-    const cacheMinutes = 30;
-    await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes);
-    return dep;
-  } catch (err) {
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug(
-        { lookupName },
-        `Terraform registry lookup failure: not found`
-      );
-      logger.debug({
-        err,
-      });
-      return null;
-    }
-    logger.warn(
-      { err, lookupName },
-      'Terraform registry failure: Unknown error'
-    );
+  const res: TerraformRelease = (
+    await got(pkgUrl, {
+      json: true,
+      hostType: id,
+    })
+  ).body;
+  const returnedName = res.namespace + '/' + res.name + '/' + res.provider;
+  if (returnedName !== repository) {
+    logger.warn({ pkgUrl }, 'Terraform registry result mismatch');
     return null;
   }
+  // Simplify response before caching and returning
+  const dep: ReleaseResult = {
+    name: repository,
+    versions: {},
+    releases: null,
+  };
+  if (res.source) {
+    dep.sourceUrl = res.source;
+  }
+  dep.releases = res.versions.map(version => ({
+    version,
+  }));
+  if (pkgUrl.startsWith('https://registry.terraform.io/')) {
+    dep.homepage = `https://registry.terraform.io/modules/${repository}`;
+  }
+  logger.trace({ dep }, 'dep');
+  const cacheMinutes = 30;
+  await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes);
+  return dep;
 }
diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts
index 1b9155da27953da0418d0c09ebb192737ef970a2..d1112a0c9470c348204fb80cb1735edb57933f48 100644
--- a/lib/datasource/terraform-provider/index.spec.ts
+++ b/lib/datasource/terraform-provider/index.spec.ts
@@ -17,36 +17,6 @@ describe('datasource/terraform', () => {
       global.repoCache = {};
       return global.renovateCache.rmAll();
     });
-    it('returns null for empty result', async () => {
-      got.mockReturnValueOnce({ body: {} });
-      expect(
-        await terraformProvider.getPkgReleases({
-          lookupName: 'azurerm',
-        })
-      ).toBeNull();
-    });
-    it('returns null for 404', async () => {
-      got.mockImplementationOnce(() =>
-        Promise.reject({
-          statusCode: 404,
-        })
-      );
-      expect(
-        await terraformProvider.getPkgReleases({
-          lookupName: 'azurerm',
-        })
-      ).toBeNull();
-    });
-    it('returns null for unknown error', async () => {
-      got.mockImplementationOnce(() => {
-        throw new Error();
-      });
-      expect(
-        await terraformProvider.getPkgReleases({
-          lookupName: 'azurerm',
-        })
-      ).toBeNull();
-    });
     it('processes real data', async () => {
       got.mockReturnValueOnce({
         body: JSON.parse(consulData),
diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts
index 0c3544d3bd65e904973e76a745a68e8c760265b1..cc1f5c557e205f03b26fab23dc0f0b9c072b214a 100644
--- a/lib/datasource/terraform-provider/index.ts
+++ b/lib/datasource/terraform-provider/index.ts
@@ -34,47 +34,29 @@ export async function getPkgReleases({
   if (cachedResult) {
     return cachedResult;
   }
-  try {
-    const res: TerraformProvider = (
-      await got(pkgUrl, {
-        json: true,
-        hostType: id,
-      })
-    ).body;
-    // Simplify response before caching and returning
-    const dep: ReleaseResult = {
-      name: repository,
-      versions: {},
-      releases: null,
-    };
-    if (res.source) {
-      dep.sourceUrl = res.source;
-    }
-    dep.releases = res.versions.map(version => ({
-      version,
-    }));
-    if (pkgUrl.startsWith('https://registry.terraform.io/')) {
-      dep.homepage = `https://registry.terraform.io/providers/${repository}`;
-    }
-    logger.trace({ dep }, 'dep');
-    const cacheMinutes = 30;
-    await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes);
-    return dep;
-  } catch (err) {
-    if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
-      logger.debug(
-        { lookupName },
-        `Terraform registry lookup failure: not found`
-      );
-      logger.debug({
-        err,
-      });
-      return null;
-    }
-    logger.warn(
-      { err, lookupName },
-      'Terraform registry failure: Unknown error'
-    );
-    return null;
+  const res: TerraformProvider = (
+    await got(pkgUrl, {
+      json: true,
+      hostType: id,
+    })
+  ).body;
+  // Simplify response before caching and returning
+  const dep: ReleaseResult = {
+    name: repository,
+    versions: {},
+    releases: null,
+  };
+  if (res.source) {
+    dep.sourceUrl = res.source;
   }
+  dep.releases = res.versions.map(version => ({
+    version,
+  }));
+  if (pkgUrl.startsWith('https://registry.terraform.io/')) {
+    dep.homepage = `https://registry.terraform.io/providers/${repository}`;
+  }
+  logger.trace({ dep }, 'dep');
+  const cacheMinutes = 30;
+  await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes);
+  return dep;
 }
diff --git a/lib/util/clone.ts b/lib/util/clone.ts
index 075e35be3a44b8c0cf2f31e0efc2e8122def72ce..ea80f56d2ef46660257e63441de4339e1f5c0dad 100644
--- a/lib/util/clone.ts
+++ b/lib/util/clone.ts
@@ -1,3 +1,3 @@
 export function clone<T>(input: T): T {
-  return JSON.parse(JSON.stringify(input));
+  return input ? JSON.parse(JSON.stringify(input)) : input;
 }
diff --git a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
index 6dfd7d548e61e85544d0372aa342695be43f19b8..4fa22f3a714076fe0f194adcc304a4326f0c2742 100644
--- a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
+++ b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
@@ -194,8 +194,6 @@ Object {
 }
 `;
 
-exports[`workers/repository/process/lookup .lookupUpdates() handles github 404 1`] = `Array []`;
-
 exports[`workers/repository/process/lookup .lookupUpdates() handles packagist 1`] = `Array []`;
 
 exports[`workers/repository/process/lookup .lookupUpdates() handles pypi 404 1`] = `Array []`;
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 88c87c4d09b8fe47eeb800c2c8012c97c778c8d8..6049a7a2c675c901c3b3560e89463768e8312fcd 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -17,7 +17,6 @@ import * as datasourceNpm from '../../../../datasource/npm';
 import * as datasourcePypi from '../../../../datasource/pypi';
 import * as datasourcePackagist from '../../../../datasource/packagist';
 import * as datasourceDocker from '../../../../datasource/docker';
-import * as datasourceGithubTags from '../../../../datasource/github-tags';
 import * as datasourceGitSubmodules from '../../../../datasource/git-submodules';
 
 jest.mock('../../../../datasource/docker');
@@ -982,23 +981,13 @@ describe('workers/repository/process/lookup', () => {
         .reply(200, qJson);
       expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot();
     });
-    it('handles github 404', async () => {
-      config.depName = 'foo';
-      config.datasource = datasourceGithubTags.id;
-      config.packageFile = 'package.json';
-      config.currentValue = '1.0.0';
-      nock('https://pypi.org')
-        .get('/pypi/foo/json')
-        .reply(404);
-      expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot();
-    });
     it('handles pypi 404', async () => {
       config.depName = 'foo';
       config.datasource = datasourcePypi.id;
       config.packageFile = 'requirements.txt';
       config.currentValue = '1.0.0';
-      nock('https://api.github.com')
-        .get('/repos/some/repo/git/refs/tags?per_page=100')
+      nock('https://pypi.org')
+        .get('/pypi/foo/json')
         .reply(404);
       expect((await lookup.lookupUpdates(config)).updates).toMatchSnapshot();
     });