forked from google/mono_repo.dart
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate.dart
122 lines (107 loc) · 3.29 KB
/
generate.dart
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
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as p;
import '../../ci_shared.dart';
import '../../root_config.dart';
import '../../user_exception.dart';
import 'github_yaml.dart';
const dependabotFileNames = [
'.github/dependabot.yaml',
'.github/dependabot.yml',
];
void generateGitHubActions(
RootConfig rootConfig, {
bool validateOnly = false,
}) {
final githubConfig = _GeneratedGitHubConfig.generate(
rootConfig,
);
final dependabotConfig = _GeneratedDependabotConfig.generate(
rootConfig,
);
for (var entry in [
...githubConfig.workflowFiles.entries,
...dependabotConfig.workflowFiles.entries,
]) {
if (validateOnly) {
_validateFile(
rootConfig.rootDirectory,
entry.value,
entry.key,
);
} else {
writeFile(
rootConfig.rootDirectory,
entry.key,
entry.value,
isScript: false,
);
}
}
}
/// The generated configuration for dependabot.
class _GeneratedDependabotConfig {
final Map<String, String> workflowFiles;
_GeneratedDependabotConfig._(this.workflowFiles);
factory _GeneratedDependabotConfig.generate(RootConfig rootConfig) {
final result = <String, String>{};
final dependabotConfig = rootConfig.monoConfig.github.dependabot;
if (dependabotConfig != null) {
final config = {
'version': 2,
...dependabotConfig,
};
final packageUpdates = rootConfig.map(
(packageConfig) => {
'package-ecosystem': 'pub',
'directory': packageConfig.relativePath,
'schedule': {'interval': 'weekly'},
// TODO(sigurdm): package customizability?
},
);
config['updates'] = [
...config['updates'] as List? ?? <dynamic>[],
...packageUpdates
];
result['.github/dependabot.yml'] = '''
$createdWith
${const JsonEncoder.withIndent(' ').convert(config)}
''';
}
return _GeneratedDependabotConfig._(result);
}
}
/// The generated yaml and shell script content for github.
class _GeneratedGitHubConfig {
final Map<String, String> workflowFiles;
_GeneratedGitHubConfig._(this.workflowFiles);
factory _GeneratedGitHubConfig.generate(RootConfig rootConfig) {
final result = generateGitHubYml(rootConfig);
return _GeneratedGitHubConfig._(result);
}
}
/// Thrown if generated config does not match existing config when running with
/// the `--validate` option.
class GithubConfigOutOfDateException extends UserException {
GithubConfigOutOfDateException()
: super(
'Generated github config is out of date',
details: 'Rerun `mono_repo generate` to update generated config',
);
}
/// Checks [expectedPath] versus the content in [expectedContent].
///
/// Throws a [GithubConfigOutOfDateException] if they do not match.
void _validateFile(
String rootDirectory,
String expectedContent,
String expectedPath,
) {
final shFile = File(p.join(rootDirectory, expectedPath));
if (!shFile.existsSync() || shFile.readAsStringSync() != expectedContent) {
throw GithubConfigOutOfDateException();
}
}