From ac59df7c7e4909f3f88b4e70a29af58428517420 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 4 Jul 2020 13:52:33 +0200
Subject: [PATCH] refactor: remove getRepoStatus from platform (#6672)

---
 lib/manager/bundler/artifacts.spec.ts         | 21 ++++++++-------
 lib/manager/bundler/artifacts.ts              |  4 +--
 lib/manager/cocoapods/artifacts.spec.ts       | 15 +++++------
 lib/manager/cocoapods/artifacts.ts            |  4 +--
 lib/manager/composer/artifacts.spec.ts        | 13 ++++-----
 lib/manager/composer/artifacts.ts             |  4 +--
 lib/manager/gomod/artifacts.spec.ts           | 15 ++++++-----
 lib/manager/gomod/artifacts.ts                |  6 ++---
 .../gradle-wrapper/artifacts-real.spec.ts     | 14 +++++-----
 lib/manager/gradle-wrapper/artifacts.spec.ts  |  9 ++++---
 lib/manager/gradle-wrapper/artifacts.ts       |  4 +--
 lib/manager/npm/post-update/index.ts          |  3 ++-
 lib/manager/pipenv/artifacts.spec.ts          |  9 ++++---
 lib/manager/pipenv/artifacts.ts               |  4 +--
 lib/platform/__snapshots__/index.spec.ts.snap |  4 ---
 lib/platform/azure/index.spec.ts              |  7 -----
 lib/platform/azure/index.ts                   |  6 -----
 lib/platform/bitbucket-server/index.ts        |  6 -----
 .../__snapshots__/index.spec.ts.snap          | 18 -------------
 lib/platform/bitbucket/index.spec.ts          |  8 ------
 lib/platform/bitbucket/index.ts               |  5 ----
 lib/platform/common.ts                        |  2 --
 lib/platform/gitea/index.spec.ts              |  9 -------
 lib/platform/gitea/index.ts                   |  5 ----
 lib/platform/github/index.ts                  |  5 ----
 .../gitlab/__snapshots__/index.spec.ts.snap   | 27 -------------------
 lib/platform/gitlab/index.spec.ts             |  8 ------
 lib/platform/gitlab/index.ts                  |  5 ----
 lib/workers/branch/index.spec.ts              |  5 ++--
 lib/workers/branch/index.ts                   |  3 ++-
 30 files changed, 71 insertions(+), 177 deletions(-)

diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 7e1260f449..e0cb5a3f1f 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import Git from 'simple-git/promise';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { fs, mocked, platform } from '../../../test/util';
+import { fs, git, mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
@@ -21,6 +21,7 @@ jest.mock('child_process');
 jest.mock('../../../lib/util/exec/env');
 jest.mock('../../../lib/datasource');
 jest.mock('../../../lib/util/fs');
+jest.mock('../../../lib/util/git');
 jest.mock('../../../lib/util/host-rules');
 jest.mock('./host-rules');
 
@@ -60,7 +61,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -79,7 +80,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     fs.readLocalFile.mockResolvedValueOnce(null);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -98,7 +99,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     fs.readLocalFile.mockResolvedValueOnce(null);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -132,7 +133,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -160,7 +161,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -193,7 +194,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -240,7 +241,7 @@ describe('bundler.updateArtifacts()', () => {
         'some-user:some-password'
       );
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -265,7 +266,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec, execError);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     expect(
@@ -285,7 +286,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
diff --git a/lib/manager/bundler/artifacts.ts b/lib/manager/bundler/artifacts.ts
index 661c7f1195..9d8389ed94 100644
--- a/lib/manager/bundler/artifacts.ts
+++ b/lib/manager/bundler/artifacts.ts
@@ -1,7 +1,6 @@
 import { quote } from 'shlex';
 import { BUNDLER_INVALID_CREDENTIALS } from '../../constants/error-messages';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { HostRule } from '../../types';
 import * as memCache from '../../util/cache/memory';
 import { ExecOptions, exec } from '../../util/exec';
@@ -11,6 +10,7 @@ import {
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { isValid } from '../../versioning/ruby';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import {
@@ -139,7 +139,7 @@ export async function updateArtifacts(
       },
     };
     await exec(cmd, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!status.modified.includes(lockFileName)) {
       return null;
     }
diff --git a/lib/manager/cocoapods/artifacts.spec.ts b/lib/manager/cocoapods/artifacts.spec.ts
index 0b47245645..d6284b75ed 100644
--- a/lib/manager/cocoapods/artifacts.spec.ts
+++ b/lib/manager/cocoapods/artifacts.spec.ts
@@ -3,9 +3,8 @@ import _fs from 'fs-extra';
 import Git from 'simple-git/promise';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
-import { platform as _platform } from '../../platform';
 import { setExecConfig } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
 import * as _env from '../../util/exec/env';
@@ -14,13 +13,13 @@ import { updateArtifacts } from '.';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../platform');
 jest.mock('../../datasource');
 
 const fs: jest.Mocked<typeof _fs> = _fs as any;
 const exec: jest.Mock<typeof _exec> = _exec as any;
 const env = mocked(_env);
-const platform = mocked(_platform);
 const datasource = mocked(_datasource);
 
 delete process.env.CP_HOME_DIR;
@@ -101,7 +100,7 @@ describe('.updateArtifacts()', () => {
   it('returns null if unchanged', async () => {
     const execSnapshots = mockExecAll(exec);
     fs.readFile.mockResolvedValueOnce('Current Podfile' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as Git.StatusResult);
     fs.readFile.mockResolvedValueOnce('Current Podfile' as any);
@@ -119,7 +118,7 @@ describe('.updateArtifacts()', () => {
     const execSnapshots = mockExecAll(exec);
     await setExecConfig({ ...config, binarySource: BinarySource.Docker });
     fs.readFile.mockResolvedValueOnce('Old Podfile' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
@@ -139,7 +138,7 @@ describe('.updateArtifacts()', () => {
     fs.readFile.mockResolvedValueOnce('Old Manifest.lock' as any);
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
     fs.readFile.mockResolvedValueOnce('Pods manifest' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       not_added: ['Pods/New'],
       modified: ['Podfile.lock', 'Pods/Manifest.lock'],
       deleted: ['Pods/Deleted'],
@@ -198,7 +197,7 @@ describe('.updateArtifacts()', () => {
 
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
 
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
 
@@ -226,7 +225,7 @@ describe('.updateArtifacts()', () => {
 
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
 
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
 
diff --git a/lib/manager/cocoapods/artifacts.ts b/lib/manager/cocoapods/artifacts.ts
index 2436c02f38..4490a2cab3 100644
--- a/lib/manager/cocoapods/artifacts.ts
+++ b/lib/manager/cocoapods/artifacts.ts
@@ -1,13 +1,13 @@
 import { quote } from 'shlex';
 import { dirname, join } from 'upath';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { getCocoaPodsHome } from './utils';
 
@@ -93,7 +93,7 @@ export async function updateArtifacts({
     ];
   }
 
-  const status = await platform.getRepoStatus();
+  const status = await getRepoStatus();
   if (!status.modified.includes(lockFileName)) {
     return null;
   }
diff --git a/lib/manager/composer/artifacts.spec.ts b/lib/manager/composer/artifacts.spec.ts
index 799fa1e994..150ac4955a 100644
--- a/lib/manager/composer/artifacts.spec.ts
+++ b/lib/manager/composer/artifacts.spec.ts
@@ -1,7 +1,7 @@
 import { exec as _exec } from 'child_process';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { fs, mocked, platform } from '../../../test/util';
+import { fs, git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -12,6 +12,7 @@ import * as composer from './artifacts';
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
 jest.mock('../../util/fs');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 
 const hostRules = require('../../util/host-rules');
@@ -49,7 +50,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('Current composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
+    git.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
     expect(
       await composer.updateArtifacts({
         packageFileName: 'composer.json',
@@ -72,7 +73,7 @@ describe('.updateArtifacts()', () => {
       username: 'some-username',
       password: 'some-password',
     });
-    platform.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
+    git.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
     expect(
       await composer.updateArtifacts({
         packageFileName: 'composer.json',
@@ -87,7 +88,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
@@ -104,7 +105,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
@@ -205,7 +206,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
diff --git a/lib/manager/composer/artifacts.ts b/lib/manager/composer/artifacts.ts
index 1b1ad2286f..e3b11930ee 100644
--- a/lib/manager/composer/artifacts.ts
+++ b/lib/manager/composer/artifacts.ts
@@ -9,7 +9,6 @@ import {
 } from '../../constants/platforms';
 import * as datasourcePackagist from '../../datasource/packagist';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import {
   deleteLocalFile,
@@ -19,6 +18,7 @@ import {
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
@@ -131,7 +131,7 @@ export async function updateArtifacts({
     }
     logger.debug({ cmd, args }, 'composer command');
     await exec(`${cmd} ${args}`, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!status.modified.includes(lockFileName)) {
       return null;
     }
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 2e28dade2e..255a15ccc8 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import _fs from 'fs-extra';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked, platform } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -14,6 +14,7 @@ import * as gomod from './artifacts';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 jest.mock('../../util/http');
 
@@ -73,7 +74,7 @@ describe('.updateArtifacts()', () => {
   it('returns null if unchanged', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as StatusResult);
     expect(
@@ -89,7 +90,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated go.sum', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -108,7 +109,7 @@ describe('.updateArtifacts()', () => {
     await setUtilConfig({ ...config, binarySource: BinarySource.Docker });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -128,7 +129,7 @@ describe('.updateArtifacts()', () => {
   it('supports global mode', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -153,7 +154,7 @@ describe('.updateArtifacts()', () => {
     });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -178,7 +179,7 @@ describe('.updateArtifacts()', () => {
     });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockResolvedValueOnce('New go.sum 1' as any);
diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 48f219aba9..899627b176 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -3,10 +3,10 @@ import { quote } from 'shlex';
 import { dirname, join } from 'upath';
 import { PLATFORM_TYPE_GITHUB } from '../../constants/platforms';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { find } from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
@@ -84,7 +84,7 @@ export async function updateArtifacts({
       await exec(`${cmd} ${args}`, execOptions);
     }
     const res = [];
-    let status = await platform.getRepoStatus();
+    let status = await getRepoStatus();
     if (!status.modified.includes(sumFileName)) {
       return null;
     }
@@ -113,7 +113,7 @@ export async function updateArtifacts({
         logger.debug({ cmd, args }, 'go mod tidy command');
         await exec(`${cmd} ${args}`, execOptions);
       }
-      status = await platform.getRepoStatus();
+      status = await getRepoStatus();
       for (const f of status.modified.concat(status.not_added)) {
         if (f.startsWith(vendorDir)) {
           res.push({
diff --git a/lib/manager/gradle-wrapper/artifacts-real.spec.ts b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
index 21791dbc8a..43924275d5 100644
--- a/lib/manager/gradle-wrapper/artifacts-real.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
@@ -2,11 +2,13 @@ import { resolve } from 'path';
 import { readFile, readFileSync } from 'fs-extra';
 import Git from 'simple-git/promise';
 import * as httpMock from '../../../test/httpMock';
-import { getName, partial, platform } from '../../../test/util';
+import { getName, git, partial } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { ifSystemSupportsGradle } from '../gradle/__testutil__/gradle';
 import * as dcUpdate from '.';
 
+jest.mock('../../util/git');
+
 const fixtures = resolve(__dirname, './__fixtures__');
 const config = {
   localDir: resolve(fixtures, './testFiles'),
@@ -43,7 +45,7 @@ describe(getName(__filename), () => {
     });
 
     it('replaces existing value', async () => {
-      platform.getRepoStatus.mockResolvedValue({
+      git.getRepoStatus.mockResolvedValue({
         modified: [
           'gradle/wrapper/gradle-wrapper.properties',
           'gradle/wrapper/gradle-wrapper.jar',
@@ -88,7 +90,7 @@ describe(getName(__filename), () => {
     });
 
     it('updates from version', async () => {
-      platform.getRepoStatus.mockResolvedValueOnce(
+      git.getRepoStatus.mockResolvedValueOnce(
         partial<Git.StatusResult>({
           modified: ['gradle/wrapper/gradle-wrapper.properties'],
         })
@@ -108,7 +110,7 @@ describe(getName(__filename), () => {
     });
 
     it('up to date', async () => {
-      platform.getRepoStatus.mockResolvedValue({
+      git.getRepoStatus.mockResolvedValue({
         modified: [],
       } as Git.StatusResult);
 
@@ -132,7 +134,7 @@ describe(getName(__filename), () => {
     });
 
     it('getRepoStatus fails', async () => {
-      platform.getRepoStatus.mockImplementation(() => {
+      git.getRepoStatus.mockImplementation(() => {
         throw new Error('failed');
       });
 
@@ -203,7 +205,7 @@ describe(getName(__filename), () => {
           '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768'
         );
 
-      platform.getRepoStatus.mockResolvedValueOnce(
+      git.getRepoStatus.mockResolvedValueOnce(
         partial<Git.StatusResult>({
           modified: ['gradle/wrapper/gradle-wrapper.properties'],
         })
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index d343734a36..ef72548d96 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -10,8 +10,8 @@ import {
   env,
   fs,
   getName,
+  git,
   partial,
-  platform,
 } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
@@ -20,6 +20,7 @@ import * as dcUpdate from '.';
 
 jest.mock('child_process');
 jest.mock('../../util/fs');
+jest.mock('../../util/git');
 jest.mock('../../util/exec/env');
 
 const exec: jest.Mock<typeof _exec> = _exec as any;
@@ -59,7 +60,7 @@ describe(getName(__filename), () => {
   });
 
   it('replaces existing value', async () => {
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: [
         'gradle/wrapper/gradle-wrapper.properties',
         'gradlew',
@@ -110,7 +111,7 @@ describe(getName(__filename), () => {
 
   it('gradlew failed', async () => {
     const execSnapshots = mockExecAll(exec, new Error('failed'));
-    platform.getRepoStatus.mockResolvedValueOnce(
+    git.getRepoStatus.mockResolvedValueOnce(
       partial<Git.StatusResult>({
         modified: [],
       })
@@ -135,7 +136,7 @@ describe(getName(__filename), () => {
         '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768'
       );
 
-    platform.getRepoStatus.mockResolvedValueOnce(
+    git.getRepoStatus.mockResolvedValueOnce(
       partial<Git.StatusResult>({
         modified: ['gradle/wrapper/gradle-wrapper.properties'],
       })
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index 3b26dc7670..6cd9bbf418 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -2,9 +2,9 @@ import { resolve } from 'path';
 import { stat } from 'fs-extra';
 import Git from 'simple-git/promise';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { Http } from '../../util/http';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { gradleWrapperFileName, prepareGradleCommand } from '../gradle/index';
@@ -94,7 +94,7 @@ export async function updateArtifacts({
         'Error executing gradle wrapper update command. It can be not a critical one though.'
       );
     }
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     const artifactFileNames = [
       'gradle/wrapper/gradle-wrapper.properties',
       'gradle/wrapper/gradle-wrapper.jar',
diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts
index a0494329ef..e045777b4f 100644
--- a/lib/manager/npm/post-update/index.ts
+++ b/lib/manager/npm/post-update/index.ts
@@ -16,6 +16,7 @@ import { platform } from '../../../platform';
 import { ExternalHostError } from '../../../types/errors/external-host-error';
 import { getChildProcessEnv } from '../../../util/exec/env';
 import { deleteLocalFile } from '../../../util/fs';
+import { getRepoStatus } from '../../../util/git';
 import * as hostRules from '../../../util/host-rules';
 import { PackageFile, PostUpdateConfig, Upgrade } from '../../common';
 import * as lerna from './lerna';
@@ -541,7 +542,7 @@ export async function getAdditionalFiles(
                 .replace(/\/?$/, '/');
               const resolvedPath = upath.join(lockFileDir, mirrorPath);
               logger.debug('Found yarn offline  mirror: ' + resolvedPath);
-              const status = await platform.getRepoStatus();
+              const status = await getRepoStatus();
               for (const f of status.modified.concat(status.not_added)) {
                 if (f.startsWith(resolvedPath)) {
                   const localModified = upath.join(config.localDir, f);
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index e806ae87ce..40dd136d33 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import _fs from 'fs-extra';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked, platform } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -13,6 +13,7 @@ import * as pipenv from './artifacts';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 jest.mock('../../util/http');
 
@@ -87,7 +88,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated Pipfile.lock', async () => {
     fs.readFile.mockResolvedValueOnce('current pipfile.lock' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New Pipfile.lock' as any);
@@ -107,7 +108,7 @@ describe('.updateArtifacts()', () => {
     pipFileLock._meta.requires.python_version = '3.7';
     fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('new lock' as any);
@@ -138,7 +139,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated Pipenv.lock when doing lockfile maintenance', async () => {
     fs.readFile.mockResolvedValueOnce('Current Pipfile.lock' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New Pipfile.lock' as any);
diff --git a/lib/manager/pipenv/artifacts.ts b/lib/manager/pipenv/artifacts.ts
index 8b77587434..89e098f0f3 100644
--- a/lib/manager/pipenv/artifacts.ts
+++ b/lib/manager/pipenv/artifacts.ts
@@ -1,9 +1,9 @@
 import { ensureDir } from 'fs-extra';
 import { join } from 'upath';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { deleteLocalFile, readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import {
   UpdateArtifact,
   UpdateArtifactsConfig,
@@ -74,7 +74,7 @@ export async function updateArtifacts({
     };
     logger.debug({ cmd }, 'pipenv lock command');
     await exec(cmd, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!(status && status.modified.includes(lockFileName))) {
       return null;
     }
diff --git a/lib/platform/__snapshots__/index.spec.ts.snap b/lib/platform/__snapshots__/index.spec.ts.snap
index 4c5460a19e..c14467a75f 100644
--- a/lib/platform/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/__snapshots__/index.spec.ts.snap
@@ -31,7 +31,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -75,7 +74,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -119,7 +117,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -163,7 +160,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
diff --git a/lib/platform/azure/index.spec.ts b/lib/platform/azure/index.spec.ts
index 8646b4be1e..5412f3585f 100644
--- a/lib/platform/azure/index.spec.ts
+++ b/lib/platform/azure/index.spec.ts
@@ -159,13 +159,6 @@ describe('platform/azure', () => {
     } as any);
   }
 
-  describe('getRepoStatus()', () => {
-    it('exists', async () => {
-      await initRepo();
-      expect(await azure.getRepoStatus()).toBeUndefined();
-    });
-  });
-
   describe('initRepo', () => {
     it(`should initialise the config for a repo`, async () => {
       const config = await initRepo({
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 855fad559d..14b50d0acd 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -374,12 +374,6 @@ export /* istanbul ignore next */ function getBranchLastCommitTime(
   return git.getBranchLastCommitTime(branchName);
 }
 
-export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  git.StatusResult
-> {
-  return git.getRepoStatus();
-}
-
 export /* istanbul ignore next */ function mergeBranch(
   branchName: string
 ): Promise<void> {
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 6b389ec284..100f159e3e 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -483,12 +483,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  git.StatusResult
-> {
-  return git.getRepoStatus();
-}
-
 async function getStatus(
   branchName: string,
   useCache = true
diff --git a/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap b/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
index 3dd3d8aed5..486fdd173b 100644
--- a/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
@@ -1253,24 +1253,6 @@ Array [
 
 exports[`platform/bitbucket getPrBody() returns diff files 1`] = `"**foo**bartext"`;
 
-exports[`platform/bitbucket getRepoStatus() sends to gitFs 1`] = `undefined`;
-
-exports[`platform/bitbucket getRepoStatus() sends to gitFs 2`] = `
-Array [
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "authorization": "Basic YWJjOjEyMw==",
-      "host": "api.bitbucket.org",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://api.bitbucket.org/2.0/repositories/some/repo",
-  },
-]
-`;
-
 exports[`platform/bitbucket getRepos() returns repos 1`] = `
 Array [
   Object {
diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts
index fc81fd4002..63059d005d 100644
--- a/lib/platform/bitbucket/index.spec.ts
+++ b/lib/platform/bitbucket/index.spec.ts
@@ -447,14 +447,6 @@ describe('platform/bitbucket', () => {
     });
   });
 
-  describe('getRepoStatus()', () => {
-    it('sends to gitFs', async () => {
-      await initRepoMock();
-      expect(await bitbucket.getRepoStatus()).toMatchSnapshot();
-      expect(httpMock.getTrace()).toMatchSnapshot();
-    });
-  });
-
   describe('deleteBranch()', () => {
     it('sends to gitFs', async () => {
       await initRepoMock();
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index fd695abe39..4e12052e5c 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -289,11 +289,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 export function mergeBranch(branchName: string): Promise<void> {
   return git.mergeBranch(branchName);
 }
diff --git a/lib/platform/common.ts b/lib/platform/common.ts
index e05e3f7f93..5c13b20183 100644
--- a/lib/platform/common.ts
+++ b/lib/platform/common.ts
@@ -1,5 +1,4 @@
 import got from 'got';
-import Git from 'simple-git/promise';
 import { RenovateConfig } from '../config/common';
 import {
   BranchStatus,
@@ -232,7 +231,6 @@ export interface Platform {
     requiredStatusChecks?: string[] | null
   ): Promise<BranchStatus>;
   getBranchPr(branchName: string): Promise<Pr | null>;
-  getRepoStatus(): Promise<Git.StatusResult>;
   getFile(lockFileName: string, branchName?: string): Promise<string | null>;
   initPlatform(config: RenovateConfig): Promise<PlatformConfig>;
 }
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index 101938707a..91768cd9ad 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -1424,15 +1424,6 @@ describe('platform/gitea', () => {
     });
   });
 
-  describe('getRepoStatus', () => {
-    it('should propagate call to storage class', async () => {
-      await initFakeRepo();
-      await gitea.getRepoStatus();
-
-      expect(gitvcs.getRepoStatus).toHaveBeenCalledTimes(1);
-    });
-  });
-
   describe('getFileList', () => {
     it('propagates call to storage class', async () => {
       await initFakeRepo();
diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts
index 6a7c9146b6..8aebee95c0 100644
--- a/lib/platform/gitea/index.ts
+++ b/lib/platform/gitea/index.ts
@@ -882,10 +882,6 @@ const platform: Platform = {
     return git.getFile(lockFileName, branchName);
   },
 
-  getRepoStatus(): Promise<git.StatusResult> {
-    return git.getRepoStatus();
-  },
-
   getFileList(): Promise<string[]> {
     return git.getFileList();
   },
@@ -931,7 +927,6 @@ export const {
   getPrList,
   getPrFiles,
   getRepoForceRebase,
-  getRepoStatus,
   getRepos,
   getVulnerabilityAlerts,
   initPlatform,
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index 04bdd79ad3..2302bf6f3d 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -540,11 +540,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 // istanbul ignore next
 export function mergeBranch(branchName: string): Promise<void> {
   if (config.pushProtection) {
diff --git a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
index cc5febdace..6fe7bf60c6 100644
--- a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
@@ -1766,33 +1766,6 @@ Array [
 ]
 `;
 
-exports[`platform/gitlab getRepoStatus() exists 1`] = `
-Array [
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "host": "gitlab.com",
-      "private-token": "abc123",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo",
-  },
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "host": "gitlab.com",
-      "private-token": "abc123",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://gitlab.com/api/v4/user",
-  },
-]
-`;
-
 exports[`platform/gitlab getRepos should return an array of repos 1`] = `
 Array [
   "a/b",
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index b109d5f895..438e1873ff 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -154,14 +154,6 @@ describe('platform/gitlab', () => {
     return scope;
   }
 
-  describe('getRepoStatus()', () => {
-    it('exists', async () => {
-      await initRepo();
-      await gitlab.getRepoStatus();
-      expect(httpMock.getTrace()).toMatchSnapshot();
-    });
-  });
-
   describe('initRepo', () => {
     it(`should throw error if disabled in renovate.json`, async () => {
       httpMock
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 93437ee303..739b43b945 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -661,11 +661,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 export async function getBranchStatusCheck(
   branchName: string,
   context: string
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index f4d16a2f4c..8dc9ba82e2 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -1,5 +1,5 @@
 import * as _fs from 'fs-extra';
-import { defaultConfig, mocked, platform } from '../../../test/util';
+import { defaultConfig, git, mocked, platform } from '../../../test/util';
 import {
   MANAGER_LOCKFILE_ERROR,
   REPOSITORY_CHANGED,
@@ -34,6 +34,7 @@ jest.mock('./automerge');
 jest.mock('./commit');
 jest.mock('../pr');
 jest.mock('../../util/exec');
+jest.mock('../../util/git');
 jest.mock('fs-extra');
 
 const getUpdated = mocked(_getUpdated);
@@ -638,7 +639,7 @@ describe('workers/branch', () => {
         body: `- [x] <!-- rebase-check -->`,
         isModified: true,
       } as never);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['modified_file'],
         not_added: [],
         deleted: ['deleted_file'],
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index ce865f3cc7..e5c0cdcf43 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -25,6 +25,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error';
 import { emojify } from '../../util/emoji';
 import { exec } from '../../util/exec';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { regEx } from '../../util/regex';
 import { BranchConfig, PrResult, ProcessBranchResult } from '../common';
 import { checkAutoMerge, ensurePr } from '../pr';
@@ -380,7 +381,7 @@ export async function processBranch(
           }
         }
 
-        const status = await platform.getRepoStatus();
+        const status = await getRepoStatus();
 
         for (const relativePath of status.modified.concat(status.not_added)) {
           for (const pattern of fileFilters) {
-- 
GitLab