diff --git a/engine/src/flutter/tools/licenses/lib/licenses.dart b/engine/src/flutter/tools/licenses/lib/licenses.dart index 8966bd4180..3dadcb1598 100644 --- a/engine/src/flutter/tools/licenses/lib/licenses.dart +++ b/engine/src/flutter/tools/licenses/lib/licenses.dart @@ -170,8 +170,9 @@ abstract class License implements Comparable { case LicenseType.eclipse: case LicenseType.ijg: case LicenseType.apsl: - case LicenseType.openssl: return new MessageLicense._(body, type, origin: origin); + case LicenseType.openssl: + return new MultiLicense._(body, type, origin: origin); case LicenseType.libpng: return new BlankLicense._(body, type, origin: origin); } @@ -283,12 +284,14 @@ abstract class License implements Comparable { case LicenseType.eclipse: case LicenseType.ijg: case LicenseType.apsl: - case LicenseType.openssl: assert(this is MessageLicense); break; case LicenseType.libpng: assert(this is BlankLicense); break; + case LicenseType.openssl: + assert(this is MultiLicense); + break; } } on AssertionError { throw 'incorrectly created a $runtimeType for a $type'; @@ -348,7 +351,7 @@ abstract class License implements Comparable { _libraries.add(libraryName); } - Iterable expandTemplate(String copyright, { String origin }); + Iterable expandTemplate(String copyright, String licenseBody, { String origin }); @override int compareTo(License other) => toString().compareTo(other.toString()); @@ -697,8 +700,8 @@ class _LicenseMatch { final bool missingCopyrights; } -Iterable<_LicenseMatch> _expand(License template, String copyright, int start, int end, { String debug: '', String origin }) sync* { - List results = template.expandTemplate(_reformat(copyright), origin: origin).toList(); +Iterable<_LicenseMatch> _expand(License template, String copyright, String body, int start, int end, { String debug: '', String origin }) sync* { + List results = template.expandTemplate(_reformat(copyright), body, origin: origin).toList(); if (results.isEmpty) throw 'license could not be expanded'; yield new _LicenseMatch(results.first, start, end, debug: 'expanding template for $debug'); @@ -735,7 +738,8 @@ Iterable<_LicenseMatch> _tryReferenceByFilename(String body, LicenseFileReferenc if (template == null) throw 'failed to find template $filename in $parentDirectory (authors=$authors)'; assert(_reformat(copyright) != ''); - yield* _expand(template, copyright, match.start, match.end, debug: '_tryReferenceByFilename (with explicit copyright) looking for $filename', origin: origin); + String entireLicense = body.substring(match.start, match.end); + yield* _expand(template, copyright, entireLicense, match.start, match.end, debug: '_tryReferenceByFilename (with explicit copyright) looking for $filename', origin: origin); } } else { for (_PartialLicenseMatch match in _findLicenseBlocks(body, pattern.pattern, pattern.firstPrefixIndex, pattern.indentPrefixIndex, needsCopyright: pattern.needsCopyright)) { @@ -752,7 +756,7 @@ Iterable<_LicenseMatch> _tryReferenceByFilename(String body, LicenseFileReferenc if (match.getCopyrights() == '') { yield new _LicenseMatch(template, match.start, match.end, debug: '_tryReferenceByFilename (with failed copyright search) looking for $filename'); } else { - yield* _expand(template, match.getCopyrights(), match.start, match.end, debug: '_tryReferenceByFilename (with successful copyright search) looking for $filename', origin: origin); + yield* _expand(template, match.getCopyrights(), match.getEntireLicense(), match.start, match.end, debug: '_tryReferenceByFilename (with successful copyright search) looking for $filename', origin: origin); } } } @@ -769,7 +773,10 @@ Iterable<_LicenseMatch> _tryReferenceByType(String body, RegExp pattern, License assert(needsCopyright && copyrights.isNotEmpty || !needsCopyright && copyrights.isEmpty); return true; }); - yield* _expand(template, match.getCopyrights(), match.start, match.end, debug: '_tryReferenceByType', origin: origin); + if (needsCopyright) + yield* _expand(template, match.getCopyrights(), match.getEntireLicense(), match.start, match.end, debug: '_tryReferenceByType', origin: origin); + else + yield new _LicenseMatch(template, match.start, match.end, debug: '_tryReferenceByType (without copyrights) for type $type'); } } @@ -813,7 +820,7 @@ Iterable<_LicenseMatch> _tryForwardReferencePattern(String fileContents, Forward 'forward license reference to unexpected license\n' 'license:\n---\n${template.body}\n---\nexpected pattern:\n---\n${pattern.targetPattern}\n---'; } - yield* _expand(template, match.getCopyrights(), match.start, match.end, debug: '_tryForwardReferencePattern', origin: origin); + yield* _expand(template, match.getCopyrights(), match.getEntireLicense(), match.start, match.end, debug: '_tryForwardReferencePattern', origin: origin); } } @@ -907,7 +914,7 @@ License interpretAsRedirectLicense(String fileContents, LicenseSource parentDire class MessageLicense extends License { MessageLicense._(String body, LicenseType type, { String origin }) : super._(body, type, origin: origin); @override - Iterable expandTemplate(String copyright, { String origin }) sync* { + Iterable expandTemplate(String copyright, String licenseBody, { String origin }) sync* { yield this; } } @@ -921,18 +928,29 @@ class TemplateLicense extends License { String _conditions; @override - Iterable expandTemplate(String copyright, { String origin }) sync* { + Iterable expandTemplate(String copyright, String licenseBody, { String origin }) sync* { _conditions ??= _splitLicense(body).getConditions(); yield new License.fromCopyrightAndLicense(copyright, _conditions, type, origin: '$origin + ${this.origin}'); } } +// the kind of license that expands to two license blocks a main license and the referring block (e.g. OpenSSL) +class MultiLicense extends License { + MultiLicense._(String body, LicenseType type, { String origin }) : super._(body, type, origin: origin); + + @override + Iterable expandTemplate(String copyright, String licenseBody, { String origin }) sync* { + yield new License.fromBody(body, origin: '$origin + ${this.origin}'); + yield new License.fromBody(licenseBody, origin: '$origin + ${this.origin}'); + } +} + // the kind of license that should not be combined with separate copyright notices class UniqueLicense extends License { UniqueLicense._(String body, LicenseType type, { String origin, bool yesWeKnowWhatItLooksLikeButItIsNot: false }) : super._(body, type, origin: origin, yesWeKnowWhatItLooksLikeButItIsNot: yesWeKnowWhatItLooksLikeButItIsNot); @override - Iterable expandTemplate(String copyright, { String origin }) sync* { + Iterable expandTemplate(String copyright, String licenseBody, { String origin }) sync* { throw 'attempted to expand non-template license with "$copyright"\ntemplate was: $this'; } } @@ -941,7 +959,7 @@ class UniqueLicense extends License { class BlankLicense extends License { BlankLicense._(String body, LicenseType type, { String origin }) : super._(body, type, origin: origin); @override - Iterable expandTemplate(String copyright, { String origin }) sync* { + Iterable expandTemplate(String copyright, String licenseBody, { String origin }) sync* { yield this; } @override diff --git a/engine/src/flutter/tools/licenses/lib/main.dart b/engine/src/flutter/tools/licenses/lib/main.dart index 0b29e0d3c4..ef2deb4680 100644 --- a/engine/src/flutter/tools/licenses/lib/main.dart +++ b/engine/src/flutter/tools/licenses/lib/main.dart @@ -2013,7 +2013,7 @@ class RepositoryBoringSSLSourceDirectory extends RepositoryDirectory { /// part of the copyright notices and can be skipped. class RepositoryOpenSSLLicenseFile extends RepositorySingleLicenseFile { RepositoryOpenSSLLicenseFile(RepositoryDirectory parent, fs.TextFile io) - : super(parent, io, new License.message(LineSplitter.split(io.readString()).skip(23).join('\n'), LicenseType.openssl, origin: io.fullName)) { + : super(parent, io, new License.fromBodyAndType(LineSplitter.split(io.readString()).skip(23).join('\n'), LicenseType.openssl, origin: io.fullName)) { _verifyLicense(io); }