blob: 2eadd334b617d185f767b705e4cfbecbaa52802a [file] [log] [blame]
// Copyright (c) 2023, 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:io' show File, exit, stderr;
import 'bin/generate_tables.dart' show generateTables, tableFile;
import 'bin/generate_tests.dart' show generateTests, testFile;
import 'src/args.dart';
import 'src/data_files.dart';
import 'src/grapheme_category_loader.dart';
import 'src/shared.dart';
/// Generates both tests and tables.
///
/// Use this tool for updates, and only access `bin/generate_tables.dart` and
/// `bin/generate_tests.dart` directly during development of those files.
void main(List<String> args) async {
var flags =
parseArgs(args, 'generate', allowOptimize: true, allowFile: false);
if (flags.update && !await checkLicense(flags.acceptLicenseChange)) {
stderr.writeln('EXITING');
exit(1);
}
var (categories, graphemeTests, emojiTests) = await (
loadCategories(update: flags.update, verbose: flags.verbose),
graphemeTestData.load(checkForUpdate: flags.update),
emojiData.load(checkForUpdate: flags.update),
).wait;
generateTables(File(path(packageRoot, tableFile)), categories,
optimize: flags.optimize, dryrun: flags.dryrun, verbose: flags.verbose);
generateTests(File(path(packageRoot, testFile)), [graphemeTests, emojiTests],
categories,
dryrun: flags.dryrun, verbose: flags.verbose);
if (flags.update && !flags.dryrun) {
var version = guessVersion(await graphemeBreakPropertyData.contents);
updateReadmeVersion(version);
}
}
// -----------------------------------------------------------------------------
// Unicode version number.
String? guessVersion(String dataFile) {
// If first line has format:
//
// # GraphemeBreakProperty-16.0.0.txt
//
// Then use 16.0.0 as version number.
var match = RegExp(r'# \w+-(\d+\.\d+\.\d+)\.txt').matchAsPrefix(dataFile);
return match?[1];
}
void updateReadmeVersion(String? version) {
var readmeFile = File(packagePath('README.md'));
var contents = readmeFile.readAsStringSync();
String replacementText;
if (version != null) {
replacementText = 'version $version';
} else {
var now = DateTime.timestamp();
replacementText = 'of ${now.year}-${lz(now.month)}-${lz(now.day)}';
}
const startTag = '<!-- unicode-version -->';
const endTag = '<!-- /unicode-version -->';
var versionRE = RegExp('(?<=$startTag).*?(?=$endTag)');
var newContents = contents.replaceFirst(versionRE, replacementText);
if (contents != newContents) {
readmeFile.writeAsStringSync(newContents);
} else if (versionRE.firstMatch(contents) == null) {
stderr.writeln('MISSING VERSION TAGS IN README.md');
}
}