forked from renovatebot/renovate
/
extract.ts
122 lines (114 loc) · 3.48 KB
/
extract.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
import * as upath from 'upath';
import {
id as datasource,
defaultRegistryUrls,
} from '../../../datasource/maven';
import { logger } from '../../../logger';
import { readLocalFile } from '../../../util/fs';
import type {
ExtractConfig,
PackageDependency,
PackageFile,
} from '../../types';
import type { GradleManagerData } from '../types';
import { parseCatalog } from './extract/catalog';
import { parseGradle, parseProps } from './parser';
import type { PackageVariables, VariableRegistry } from './types';
import {
getVars,
isGradleFile,
isPropsFile,
isTOMLFile,
reorderFiles,
toAbsolutePath,
} from './utils';
// Enables reverse sorting in generateBranchConfig()
//
// Required for grouped dependencies to be upgraded
// correctly in single branch.
//
// https://github.com/renovatebot/renovate/issues/8224
function elevateFileReplacePositionField(
deps: PackageDependency<GradleManagerData>[]
): PackageDependency<GradleManagerData>[] {
return deps.map((dep) => ({
...dep,
fileReplacePosition: dep?.managerData?.fileReplacePosition,
}));
}
export async function extractAllPackageFiles(
config: ExtractConfig,
packageFiles: string[]
): Promise<PackageFile[] | null> {
const extractedDeps: PackageDependency<GradleManagerData>[] = [];
const registry: VariableRegistry = {};
const packageFilesByName: Record<string, PackageFile> = {};
const registryUrls = [];
for (const packageFile of reorderFiles(packageFiles)) {
packageFilesByName[packageFile] = {
packageFile,
datasource,
deps: [],
};
try {
const content = await readLocalFile(packageFile, 'utf8');
const dir = upath.dirname(toAbsolutePath(packageFile));
const updateVars = (newVars: PackageVariables): void => {
const oldVars = registry[dir] || {};
registry[dir] = { ...oldVars, ...newVars };
};
if (isPropsFile(packageFile)) {
const { vars, deps } = parseProps(content, packageFile);
updateVars(vars);
extractedDeps.push(...deps);
} else if (isTOMLFile(packageFile)) {
const updatesFromCatalog = parseCatalog(packageFile, content);
extractedDeps.push(...updatesFromCatalog);
} else if (isGradleFile(packageFile)) {
const vars = getVars(registry, dir);
const {
deps,
urls,
vars: gradleVars,
} = parseGradle(content, vars, packageFile);
urls.forEach((url) => {
if (!registryUrls.includes(url)) {
registryUrls.push(url);
}
});
registry[dir] = { ...registry[dir], ...gradleVars };
updateVars(gradleVars);
extractedDeps.push(...deps);
}
} catch (err) {
logger.warn(
{ err, config, packageFile },
`Failed to process Gradle file: ${packageFile}`
);
}
}
if (!extractedDeps.length) {
return null;
}
elevateFileReplacePositionField(extractedDeps).forEach((dep) => {
const key = dep.managerData?.packageFile;
if (key) {
const pkgFile: PackageFile = packageFilesByName[key];
const { deps } = pkgFile;
deps.push({
...dep,
registryUrls: [
...new Set([
...defaultRegistryUrls,
...(dep.registryUrls || []),
...registryUrls,
]),
],
});
packageFilesByName[key] = pkgFile;
} /* istanbul ignore next */ else {
logger.warn({ dep }, `Failed to process Gradle dependency`);
}
});
return Object.values(packageFilesByName);
}