/
index.ts
118 lines (115 loc) · 4.17 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
import is from '@sindresorhus/is';
import { mergeChildConfig } from '../../../../config';
import { GlobalConfig } from '../../../../config/global';
import type { RenovateConfig } from '../../../../config/types';
import {
REPOSITORY_FORKED,
REPOSITORY_NO_PACKAGE_FILES,
} from '../../../../constants/error-messages';
import { logger } from '../../../../logger';
import { Pr, platform } from '../../../../modules/platform';
import { scm } from '../../../../modules/platform/scm';
import {
checkoutBranch,
mergeBranchWithoutPushing,
setGitAuthor,
} from '../../../../util/git';
import { extractAllDependencies } from '../../extract';
import { mergeRenovateConfig } from '../../init/merge';
import { OnboardingState } from '../common';
import { getOnboardingPr, isOnboarded } from './check';
import { getOnboardingConfig } from './config';
import { createOnboardingBranch } from './create';
import { rebaseOnboardingBranch } from './rebase';
export async function checkOnboardingBranch(
config: RenovateConfig
): Promise<RenovateConfig> {
logger.debug('checkOnboarding()');
logger.trace({ config });
let onboardingBranch = config.onboardingBranch;
const repoIsOnboarded = await isOnboarded(config);
if (repoIsOnboarded) {
logger.debug('Repo is onboarded');
return { ...config, repoIsOnboarded };
}
if (config.isFork && config.forkProcessing !== 'enabled') {
throw new Error(REPOSITORY_FORKED);
}
logger.debug('Repo is not onboarded');
// global gitAuthor will need to be used
setGitAuthor(config.gitAuthor);
const onboardingPr = await getOnboardingPr(config);
if (onboardingPr) {
if (config.onboardingRebaseCheckbox) {
handleOnboardingManualRebase(onboardingPr);
}
logger.debug('Onboarding PR already exists');
const { rawConfigHash } = onboardingPr.bodyStruct ?? {};
const commit = await rebaseOnboardingBranch(config, rawConfigHash);
if (commit) {
logger.info(
{ branch: config.onboardingBranch, commit, onboarding: true },
'Branch updated'
);
}
// istanbul ignore if
if (platform.refreshPr) {
await platform.refreshPr(onboardingPr.number);
}
} else {
logger.debug('Onboarding PR does not exist');
const onboardingConfig = await getOnboardingConfig(config);
let mergedConfig = mergeChildConfig(config, onboardingConfig);
mergedConfig = await mergeRenovateConfig(mergedConfig);
onboardingBranch = mergedConfig.onboardingBranch;
if (
Object.entries((await extractAllDependencies(mergedConfig)).packageFiles)
.length === 0
) {
if (!config?.onboardingNoDeps) {
throw new Error(REPOSITORY_NO_PACKAGE_FILES);
}
}
logger.debug('Need to create onboarding PR');
if (config.onboardingRebaseCheckbox) {
OnboardingState.prUpdateRequested = true;
}
const commit = await createOnboardingBranch(mergedConfig);
// istanbul ignore if
if (commit) {
logger.info(
{ branch: onboardingBranch, commit, onboarding: true },
'Branch created'
);
}
}
if (!GlobalConfig.get('dryRun')) {
// TODO #7154
if (
await scm.isBranchConflicted(config.baseBranch!, config.onboardingBranch!)
) {
logger.debug('Checkout onboarding branch');
await checkoutBranch(config.onboardingBranch!);
} else {
logger.debug('Merge onboarding branch in default branch');
await mergeBranchWithoutPushing(onboardingBranch!);
}
}
// TODO #7154
const branchList = [onboardingBranch!];
return { ...config, repoIsOnboarded, onboardingBranch, branchList };
}
function handleOnboardingManualRebase(onboardingPr: Pr): void {
const pl = GlobalConfig.get('platform')!;
const { rebaseRequested } = onboardingPr.bodyStruct ?? {};
if (!['github', 'gitlab', 'gitea'].includes(pl)) {
logger.trace(`Platform '${pl}' does not support extended markdown`);
OnboardingState.prUpdateRequested = true;
} else if (is.nullOrUndefined(rebaseRequested)) {
logger.debug('No rebase checkbox was found in the onboarding PR');
OnboardingState.prUpdateRequested = true;
} else if (rebaseRequested) {
logger.debug('Manual onboarding PR update requested');
OnboardingState.prUpdateRequested = true;
}
}