Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(workers/global): check git at startup #12935

Merged
merged 9 commits into from Dec 8, 2021
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