Add presubmit check for package_config.json .

Change-Id: Ida784b6e73601e0309e10b2808f46e70926eabc0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/183045
Commit-Queue: Leaf Petersen <leafp@google.com>
Reviewed-by: Alexander Thomas <athom@google.com>
Reviewed-by: Bob Nystrom <rnystrom@google.com>
This commit is contained in:
Leaf Petersen 2021-02-06 01:02:38 +00:00 committed by commit-bot@chromium.org
parent 848121e6d4
commit fe3cd179cf
2 changed files with 77 additions and 2 deletions

View file

@ -213,6 +213,34 @@ def _CheckStatusFiles(input_api, output_api):
return []
def _CheckPackageConfigUpToDate(input_api, output_api):
"""Checks that .dart_tool/package_config.json is up to date."""
# Run only if DEPS file or package_config.json have been modified.
if not any(p == 'DEPS' or p == '.dart_tool/package_config.json' or
p.endswith('pubspec.yaml') for p in input_api.LocalPaths()):
return []
local_root = input_api.change.RepositoryRoot()
utils = imp.load_source('utils',
os.path.join(local_root, 'tools', 'utils.py'))
dart = utils.CheckedInSdkExecutable()
generate = os.path.join(local_root, 'tools', 'generate_package_config.dart')
cmd = [dart, generate, '--check']
pipe = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=utils.IsWindows())
output = pipe.communicate()
if pipe.returncode != 0:
return [
output_api.PresubmitError(
'File .dart_tool/package_config.json is out of date.\n'
'Fix these issues with:\n'
'%s tools/generate_package_config.dart' % (dart))
]
return []
def _CheckValidHostsInDEPS(input_api, output_api):
"""Checks that DEPS file deps are from allowed_hosts."""
# Run only if DEPS file has been modified to annoy fewer bystanders.
@ -333,6 +361,7 @@ def _CommonChecks(input_api, output_api):
results.extend(_CheckLayering(input_api, output_api))
results.extend(_CheckClangTidy(input_api, output_api))
results.extend(_CheckTestMatrixValid(input_api, output_api))
results.extend(_CheckPackageConfigUpToDate(input_api, output_api))
results.extend(
input_api.canned_checks.CheckPatchFormatted(input_api, output_api))
return results

View file

@ -7,14 +7,43 @@
import 'dart:convert';
import 'dart:io';
import 'package:args/args.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import 'package:yaml/yaml.dart';
bool _parseOptions(List<String> args) {
const usage = "Usage: dart generate_package_config.dart [flags...]";
var parser = ArgParser();
parser.addFlag("help", abbr: "h");
parser.addFlag("check",
abbr: "c",
help: "Return with a non-zero exit code if not up-to-date",
negatable: false);
var results = parser.parse(args);
if (results["help"] as bool) {
print("Regenerate the .dart_tool/package_config.json file.");
print("");
print(usage);
print("");
print(parser.usage);
exit(0);
}
return results["check"] as bool;
}
final repoRoot = p.dirname(p.dirname(p.fromUri(Platform.script)));
final configFilePath = p.join(repoRoot, '.dart_tool/package_config.json');
void main(List<String> args) {
bool checkOnly = _parseOptions(args);
var packageDirs = [
...listSubdirectories('pkg'),
...listSubdirectories('third_party/pkg'),
@ -60,6 +89,24 @@ void main(List<String> args) {
];
packages.sort((a, b) => a["name"].compareTo(b["name"]));
var configFile = File(p.join(repoRoot, '.dart_tool', 'package_config.json'));
// Validate the packages entry only, to avoid spurious failures from changes
// in the dates embedded in the other entries.
if (checkOnly) {
var json =
jsonDecode(configFile.readAsStringSync()) as Map<dynamic, dynamic>;
var oldPackages = json['packages'] as List<dynamic>;
if (jsonEncode(packages) == jsonEncode(oldPackages)) {
print("Package config up to date");
exit(0);
} else {
print("Package config out of date");
print("Run `dart tools/generate_package_config.dart` to update");
exit(1);
}
}
var year = DateTime.now().year;
var config = <String, dynamic>{
'copyright': [
@ -81,8 +128,7 @@ void main(List<String> args) {
// TODO(rnystrom): Consider using package_config_v2 to generate this instead.
var json = JsonEncoder.withIndent(' ').convert(config);
File(p.join(repoRoot, '.dart_tool', 'package_config.json'))
.writeAsStringSync(json);
configFile.writeAsStringSync(json);
print('Generated .dart_tool/package_config.dart containing '
'${packages.length} packages.');
}