/
index.ts
140 lines (137 loc) · 5.03 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import fs from 'fs-extra';
import { GlobalConfig } from '../../config/global';
import { applySecretsToConfig } from '../../config/secrets';
import type { RenovateConfig } from '../../config/types';
import {
REPOSITORY_DISABLED_BY_CONFIG,
REPOSITORY_FORKED,
REPOSITORY_NO_CONFIG,
} from '../../constants/error-messages';
import { pkg } from '../../expose.cjs';
import { instrument } from '../../instrumentation';
import { logger, setMeta } from '../../logger';
import { removeDanglingContainers } from '../../util/exec/docker';
import { deleteLocalFile, privateCacheDir } from '../../util/fs';
import { isCloned } from '../../util/git';
import { detectSemanticCommits } from '../../util/git/semantic';
import { clearDnsCache, printDnsStats } from '../../util/http/dns';
import * as queue from '../../util/http/queue';
import * as throttle from '../../util/http/throttle';
import { addSplit, getSplits, splitInit } from '../../util/split';
import { setBranchCache } from './cache';
import { ensureDependencyDashboard } from './dependency-dashboard';
import handleError from './error';
import { finalizeRepo } from './finalize';
import { pruneStaleBranches } from './finalize/prune';
import { initRepo } from './init';
import { OnboardingState } from './onboarding/common';
import { ensureOnboardingPr } from './onboarding/pr';
import { extractDependencies, updateRepo } from './process';
import type { ExtractResult } from './process/extract-update';
import { ProcessResult, processResult } from './result';
import { printLookupStats, printRequestStats } from './stats';
// istanbul ignore next
export async function renovateRepository(
repoConfig: RenovateConfig,
canRetry = true
): Promise<ProcessResult | undefined> {
splitInit();
let config = GlobalConfig.set(
applySecretsToConfig(repoConfig, undefined, false)
);
await removeDanglingContainers();
setMeta({ repository: config.repository });
logger.info({ renovateVersion: pkg.version }, 'Repository started');
logger.trace({ config });
let repoResult: ProcessResult | undefined;
queue.clear();
throttle.clear();
const localDir = GlobalConfig.get('localDir')!;
try {
await fs.ensureDir(localDir);
logger.debug('Using localDir: ' + localDir);
config = await initRepo(config);
addSplit('init');
const performExtract =
config.repoIsOnboarded! ||
!OnboardingState.onboardingCacheValid ||
OnboardingState.prUpdateRequested;
const { branches, branchList, packageFiles } = performExtract
? await instrument('extract', () => extractDependencies(config))
: emptyExtract(config);
if (config.semanticCommits === 'auto') {
config.semanticCommits = await detectSemanticCommits();
}
if (
GlobalConfig.get('dryRun') !== 'lookup' &&
GlobalConfig.get('dryRun') !== 'extract'
) {
await instrument('onboarding', () =>
ensureOnboardingPr(config, packageFiles, branches)
);
addSplit('onboarding');
const res = await instrument('update', () =>
updateRepo(config, branches)
);
setMeta({ repository: config.repository });
addSplit('update');
if (performExtract) {
await setBranchCache(branches); // update branch cache if performed extraction
}
if (res === 'automerged') {
if (canRetry) {
logger.info('Renovating repository again after automerge result');
const recursiveRes = await renovateRepository(repoConfig, false);
return recursiveRes;
}
logger.debug(`Automerged but already retried once`);
} else {
await ensureDependencyDashboard(config, branches, packageFiles);
}
await finalizeRepo(config, branchList);
// TODO #7154
repoResult = processResult(config, res!);
}
} catch (err) /* istanbul ignore next */ {
setMeta({ repository: config.repository });
const errorRes = await handleError(config, err);
const pruneWhenErrors = [
REPOSITORY_DISABLED_BY_CONFIG,
REPOSITORY_FORKED,
REPOSITORY_NO_CONFIG,
];
if (pruneWhenErrors.includes(errorRes)) {
await pruneStaleBranches(config, []);
}
repoResult = processResult(config, errorRes);
}
if (localDir && !repoConfig.persistRepoData) {
try {
await deleteLocalFile('.');
} catch (err) /* istanbul ignore if */ {
logger.warn({ err }, 'localDir deletion error');
}
}
try {
await fs.remove(privateCacheDir());
} catch (err) /* istanbul ignore if */ {
logger.warn({ err }, 'privateCacheDir deletion error');
}
const splits = getSplits();
logger.debug(splits, 'Repository timing splits (milliseconds)');
printRequestStats();
printLookupStats();
printDnsStats();
clearDnsCache();
const cloned = isCloned();
logger.info({ cloned, durationMs: splits.total }, 'Repository finished');
return repoResult;
}
// istanbul ignore next: renovateRepository is ignored
function emptyExtract(config: RenovateConfig): ExtractResult {
return {
branches: [],
branchList: [config.onboardingBranch!], // to prevent auto closing
packageFiles: {},
};
}