Skip to content

Commit

Permalink
feat(workers/global): check git at startup (#12935)
Browse files Browse the repository at this point in the history
  • Loading branch information
olegkrivtsov committed Dec 8, 2021
1 parent 3a5ad66 commit 3fa21fb
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
7 changes: 7 additions & 0 deletions lib/util/git/index.spec.ts
Expand Up @@ -94,6 +94,13 @@ describe('util/git/index', () => {
await base.cleanup();
});

describe('validateGitVersion()', () => {
it('has a git version greater or equal to the minimum required', async () => {
const res = await git.validateGitVersion();
expect(res).toBeTrue();
});
});

describe('checkoutBranch(branchName)', () => {
it('sets the base branch as master', async () => {
await expect(git.checkoutBranch(defaultBranch)).resolves.not.toThrow();
Expand Down
36 changes: 36 additions & 0 deletions lib/util/git/index.ts
Expand Up @@ -16,6 +16,7 @@ import {
import { logger } from '../../logger';
import { ExternalHostError } from '../../types/errors/external-host-error';
import type { GitProtocol } from '../../types/git';
import { api as semverCoerced } from '../../versioning/semver-coerced';
import { Limit, incLimitedValue } from '../../workers/global/limits';
import { regEx } from '../regex';
import { parseGitAuthor } from './author';
Expand Down Expand Up @@ -143,6 +144,41 @@ let gitInitialized: boolean;

let privateKeySet = false;

export const GIT_MINIMUM_VERSION = '2.33.0'; // git show-current

export async function validateGitVersion(): Promise<boolean> {
let version: string;
const globalGit = Git();
try {
const raw = await globalGit.raw(['--version']);
for (const section of raw.split(/\s+/)) {
if (semverCoerced.isVersion(section)) {
version = section;
break;
}
}
} catch (err) /* istanbul ignore next */ {
logger.error({ err }, 'Error fetching git version');
return false;
}
// istanbul ignore if
if (
!(
version &&
(version === GIT_MINIMUM_VERSION ||
semverCoerced.isGreaterThan(version, GIT_MINIMUM_VERSION))
)
) {
logger.error(
{ detectedVersion: version, minimumVersion: GIT_MINIMUM_VERSION },
'Git version needs upgrading'
);
return false;
}
logger.debug(`Found valid git version: ${version}`);
return true;
}

async function fetchBranchCommits(): Promise<void> {
config.branchCommits = {};
const opts = ['ls-remote', '--heads', config.url];
Expand Down
21 changes: 21 additions & 0 deletions lib/workers/global/initialize.spec.ts
@@ -0,0 +1,21 @@
import { git } from '../../../test/util';
import type { RenovateConfig } from '../../config/types';
import { globalInitialize } from './initialize';

jest.mock('../../util/git');

describe('workers/global/initialize', () => {
describe('checkVersions()', () => {
it('throws if invalid version', async () => {
const config: RenovateConfig = {};
git.validateGitVersion.mockResolvedValueOnce(false);
await expect(globalInitialize(config)).rejects.toThrow();
});

it('returns if valid git version', async () => {
const config: RenovateConfig = {};
git.validateGitVersion.mockResolvedValueOnce(true);
await expect(globalInitialize(config)).toResolve();
});
});
});
9 changes: 9 additions & 0 deletions lib/workers/global/initialize.ts
Expand Up @@ -6,6 +6,7 @@ import { logger } from '../../logger';
import { initPlatform } from '../../platform';
import * as packageCache from '../../util/cache/package';
import { setEmojiConfig } from '../../util/emoji';
import { validateGitVersion } from '../../util/git';
import { Limit, setMaxLimit } from './limits';

async function setDirectories(input: AllConfig): Promise<AllConfig> {
Expand Down Expand Up @@ -34,10 +35,18 @@ function limitCommitsPerRun(config: RenovateConfig): void {
setMaxLimit(Limit.Commits, limit);
}

async function checkVersions(): Promise<void> {
const validGitVersion = await validateGitVersion();
if (!validGitVersion) {
throw new Error('Init: git version needs upgrading');
}
}

export async function globalInitialize(
config_: RenovateConfig
): Promise<RenovateConfig> {
let config = config_;
await checkVersions();
config = await initPlatform(config);
config = await setDirectories(config);
packageCache.init(config);
Expand Down

0 comments on commit 3fa21fb

Please sign in to comment.