forked from renovatebot/renovate
/
roles.ts
116 lines (110 loc) · 3.19 KB
/
roles.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
import { regEx } from '../../../util/regex';
import { GalaxyDatasource } from '../../datasource/galaxy';
import { GitTagsDatasource } from '../../datasource/git-tags';
import type { PackageDependency } from '../types';
import type { AnsibleGalaxyPackageDependency } from './types';
import {
blockLineRegEx,
galaxyDepRegex,
nameMatchRegex,
newBlockRegEx,
} from './util';
function interpretLine(
lineMatch: RegExpMatchArray,
lineNumber: number,
dependency: AnsibleGalaxyPackageDependency
): AnsibleGalaxyPackageDependency | null {
const localDependency = dependency;
const key = lineMatch[2];
const value = lineMatch[3].replace(regEx(/["']/g), '');
switch (key) {
case 'name': {
localDependency.managerData.name = value;
break;
}
case 'version': {
localDependency.managerData.version = value;
localDependency.currentValue = value;
localDependency.managerData.lineNumber = lineNumber;
break;
}
case 'scm': {
localDependency.managerData.scm = value;
break;
}
case 'src': {
localDependency.managerData.src = value;
break;
}
default: {
return null;
}
}
return localDependency;
}
function finalize(dependency: AnsibleGalaxyPackageDependency): boolean {
const dep = dependency;
if (dependency.managerData.version === null) {
dep.skipReason = 'unspecified-version';
return false;
}
const source = dep.managerData.src ?? '';
const sourceMatch = nameMatchRegex.exec(source);
if (sourceMatch?.groups) {
dep.datasource = GitTagsDatasource.id;
dep.depName = sourceMatch.groups.depName.replace(regEx(/.git$/), '');
// remove leading `git+` from URLs like `git+https://...`
dep.packageName = source.replace(regEx(/git\+/), '');
} else if (galaxyDepRegex.exec(source)) {
dep.datasource = GalaxyDatasource.id;
dep.depName = source;
dep.packageName = source;
} else if (galaxyDepRegex.exec(dep.managerData.name ?? '')) {
dep.datasource = GalaxyDatasource.id;
dep.depName = dep.managerData.name!;
dep.packageName = dep.managerData.name!;
} else {
dep.skipReason = 'no-source-match';
return false;
}
if (dep.managerData.name !== null) {
dep.depName = dep.managerData.name;
}
return true;
}
export function extractRoles(lines: string[]): PackageDependency[] {
const deps: PackageDependency[] = [];
for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
let lineMatch = newBlockRegEx.exec(lines[lineNumber]);
if (lineMatch) {
const dep: AnsibleGalaxyPackageDependency = {
depType: 'role',
managerData: {
name: null,
version: null,
scm: null,
src: null,
},
};
do {
const localdep = interpretLine(lineMatch, lineNumber, dep);
if (!localdep) {
break;
}
const line = lines[lineNumber + 1];
if (!line) {
break;
}
lineMatch = blockLineRegEx.exec(line);
if (lineMatch) {
lineNumber += 1;
}
} while (lineMatch);
if (finalize(dep)) {
delete (dep as PackageDependency).managerData;
deps.push(dep);
}
}
}
return deps;
}