-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpackages.dart
231 lines (181 loc) · 5.66 KB
/
packages.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
import 'dart:convert';
import 'dart:io';
import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:pubspec/pubspec.dart';
import 'package:yaml_modify/yaml_modify.dart';
void main(List<String> args) {
var parser = ArgParser();
parser.addFlag("changed-only", abbr: "c", defaultsTo: false);
final runner = CommandRunner("packages", "Manage mtrust_urp packages")
..addCommand(SetDependenciesCmd())
..addCommand(UpdateUrpTypesCmd())
..addCommand(InstallCmd())
..addCommand(TestCmd())
..addCommand(AnalyzeCmd());
runner.run(args).catchError((error) {
if (error is! UsageException) throw error;
print(error);
exit(64); // Exit code 64 indicates a usage error.
});
}
List<String> changedPackagesOnly() {
final result = Process.runSync("git", "diff --name-only --cached".split(" "));
if (result.exitCode != 0) {
print("Error running git diff --name-only --cached");
exit(result.exitCode);
}
final changedPackages = <String>[];
LineSplitter.split(result.stdout as String).forEach((line) {
if (line.startsWith("mtrust_urp_")) {
changedPackages.add(line.split("/").first);
}
});
return changedPackages;
}
final subPackages = [
"mtrust_urp_ble_strategy",
"mtrust_urp_core",
"mtrust_urp_usb_strategy",
"mtrust_urp_virtual_strategy",
"mtrust_urp_wifi_strategy",
"mtrust_urp_ui"
];
void runAll(String cmd, List<String> args,
{Set<String> exclude = const {}, bool changedOnly = false}) {
final packages = changedOnly ? changedPackagesOnly() : subPackages;
for (var subPackage in packages.where((e) => !exclude.contains(e))) {
print("> Running $cmd ${args.join(" ")} in $subPackage");
final result = Process.runSync(cmd, args, workingDirectory: subPackage);
if (result.exitCode != 0) {
print("Error running $cmd ${args.join(" ")} in $subPackage");
exit(result.exitCode);
}
}
}
void install(bool changedOnly) {
runAll("flutter", ["pub", "get"], changedOnly: changedOnly);
}
void test(bool changedOnly) {
runAll("flutter", ["test"], changedOnly: changedOnly);
}
void analyze(bool changedOnly) {
runAll("flutter", ["analyze"], changedOnly: changedOnly);
}
void updateUrpTypes() {
runAll("flutter", ["pub", "upgrade", "mtrust_urp_types"],
exclude: {"mtrust_urp_ui"});
}
void setDependencies(bool local) {
if (local) {
print("Setting all packages dependencies to local");
} else {
print("Setting all packages dependencies to hosted");
}
final packageVersion =
jsonDecode(File("package.json").readAsStringSync())["version"] as String;
final version = VersionConstraint.parse("^$packageVersion");
for (var subPackage in subPackages) {
final pubSpecFile = File("$subPackage/pubspec.yaml");
var pubSpec = PubSpec.fromYamlString(pubSpecFile.readAsStringSync());
final root = subPackage.split("/").map((e) => "..").join("/");
for (final dependency in pubSpec.dependencies.entries) {
if (subPackages.contains(dependency.key)) {
if (local) {
pubSpec.dependencies[dependency.key] = PathReference(
"$root/${dependency.key}",
);
} else {
pubSpec.dependencies[dependency.key] = HostedReference(version);
}
}
}
for (final dependency in pubSpec.devDependencies.entries) {
if (subPackages.contains(dependency.key)) {
if (local) {
pubSpec.devDependencies[dependency.key] = PathReference(
"$root/${dependency.key}",
);
} else {
pubSpec.devDependencies[dependency.key] = HostedReference(version);
}
}
}
final json = pubSpec.toJson();
json["version"] = packageVersion;
if (local) {
json["publish_to"] = "none";
} else {
json.remove("publish_to");
}
pubSpecFile.writeAsStringSync(toYamlString(json));
}
}
// Command definitions
class SetDependenciesCmd extends Command {
@override
String get name => "set-deps";
@override
String get description => "Set all packages dependencies to local or hosted";
SetDependenciesCmd() {
argParser.addOption("source", abbr: "s", allowed: ["local", "hosted"]);
}
@override
Future<void> run() async {
if (argResults?.option("source") == null) {
print("Please provide a source option --source=<local|hosted>");
exit(1);
}
setDependencies(argResults?.option("source") == "local");
}
}
class UpdateUrpTypesCmd extends Command {
@override
String get name => "update-urp-types";
@override
String get description => "Update mtrust_urp_types in all packages";
@override
Future<void> run() async {
updateUrpTypes();
}
}
class InstallCmd extends Command {
@override
String get name => "install";
@override
String get description => "Run flutter pub get in all packages";
InstallCmd() {
argParser.addFlag("changed-only", abbr: "c", defaultsTo: false);
}
@override
Future<void> run() async {
install(argResults!.flag("changed-only"));
}
}
class TestCmd extends Command {
@override
String get name => "test";
@override
String get description => "Run flutter test in all packages";
TestCmd() {
argParser.addFlag("changed-only", abbr: "c", defaultsTo: false);
}
@override
Future<void> run() async {
test(argResults!.flag("changed-only"));
}
}
class AnalyzeCmd extends Command {
@override
String get name => "analyze";
@override
String get description => "Run flutter analyze in all packages";
AnalyzeCmd() {
argParser.addFlag("changed-only", abbr: "c", defaultsTo: false);
}
@override
Future<void> run() async {
analyze(argResults!.flag("changed-only"));
}
}