mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
98 lines
2.8 KiB
Dart
98 lines
2.8 KiB
Dart
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// @dart = 2.6
|
|
import 'dart:io' as io;
|
|
|
|
import 'package:args/command_runner.dart';
|
|
import 'package:path/path.dart' as path;
|
|
|
|
import 'environment.dart';
|
|
|
|
class LicensesCommand extends Command<bool> {
|
|
@override
|
|
final String name = 'check-licenses';
|
|
|
|
@override
|
|
final String description = 'Check license headers.';
|
|
|
|
@override
|
|
bool run() {
|
|
_checkLicenseHeaders();
|
|
return true;
|
|
}
|
|
|
|
void _checkLicenseHeaders() {
|
|
final List<io.File> allSourceFiles =
|
|
_flatListSourceFiles(environment.webUiRootDir);
|
|
_expect(allSourceFiles.isNotEmpty,
|
|
'Dart source listing of ${environment.webUiRootDir.path} must not be empty.');
|
|
|
|
final List<String> allDartPaths =
|
|
allSourceFiles.map((f) => f.path).toList();
|
|
|
|
for (String expectedDirectory in const <String>[
|
|
'lib',
|
|
'test',
|
|
'dev',
|
|
'tool'
|
|
]) {
|
|
final String expectedAbsoluteDirectory =
|
|
path.join(environment.webUiRootDir.path, expectedDirectory);
|
|
_expect(
|
|
allDartPaths
|
|
.where((p) => p.startsWith(expectedAbsoluteDirectory))
|
|
.isNotEmpty,
|
|
'Must include the $expectedDirectory/ directory',
|
|
);
|
|
}
|
|
|
|
allSourceFiles.forEach(_expectLicenseHeader);
|
|
print('License headers OK!');
|
|
}
|
|
|
|
final _copyRegex =
|
|
RegExp(r'// Copyright 2013 The Flutter Authors\. All rights reserved\.');
|
|
|
|
void _expectLicenseHeader(io.File file) {
|
|
List<String> head = file.readAsStringSync().split('\n').take(3).toList();
|
|
|
|
_expect(head.length >= 3, 'File too short: ${file.path}');
|
|
_expect(
|
|
_copyRegex.firstMatch(head[0]) != null,
|
|
'Invalid first line of license header in file ${file.path}',
|
|
);
|
|
_expect(
|
|
head[1] ==
|
|
'// Use of this source code is governed by a BSD-style license that can be',
|
|
'Invalid second line of license header in file ${file.path}',
|
|
);
|
|
_expect(
|
|
head[2] == '// found in the LICENSE file.',
|
|
'Invalid second line of license header in file ${file.path}',
|
|
);
|
|
}
|
|
|
|
void _expect(bool value, String requirement) {
|
|
if (!value) {
|
|
throw Exception('Test failed: ${requirement}');
|
|
}
|
|
}
|
|
|
|
List<io.File> _flatListSourceFiles(io.Directory directory) {
|
|
return directory.listSync(recursive: true).whereType<io.File>().where((f) {
|
|
if (!f.path.endsWith('.dart') && !f.path.endsWith('.js')) {
|
|
// Not a source file we're checking.
|
|
return false;
|
|
}
|
|
if (path.isWithin(environment.webUiBuildDir.path, f.path) ||
|
|
path.isWithin(environment.webUiDartToolDir.path, f.path)) {
|
|
// Generated files.
|
|
return false;
|
|
}
|
|
return true;
|
|
}).toList();
|
|
}
|
|
}
|