Unverified Commit 4037e506 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] update asset manifest to use package_config instead of package_map (#53944)

parent 602475e5
......@@ -5,6 +5,7 @@
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart';
import 'package:yaml/yaml.dart';
import 'base/context.dart';
......@@ -147,8 +148,16 @@ class _ManifestAssetBundle implements AssetBundle {
}
final String assetBasePath = globals.fs.path.dirname(globals.fs.path.absolute(manifestPath));
final PackageMap packageMap = PackageMap(packagesPath, fileSystem: globals.fs);
final PackageConfig packageConfig = await loadPackageConfigUri(
globals.fs.file(packagesPath).absolute.uri,
loader: (Uri uri) {
final File file = globals.fs.file(uri);
if (!file.existsSync()) {
return null;
}
return file.readAsBytes();
},
);
final List<Uri> wildcardDirectories = <Uri>[];
// The _assetVariants map contains an entry for each asset listed
......@@ -156,7 +165,7 @@ class _ManifestAssetBundle implements AssetBundle {
// value of each image asset is a list of resolution-specific "variants",
// see _AssetDirectoryCache.
final Map<_Asset, List<_Asset>> assetVariants = _parseAssets(
packageMap,
packageConfig,
flutterManifest,
wildcardDirectories,
assetBasePath,
......@@ -170,14 +179,14 @@ class _ManifestAssetBundle implements AssetBundle {
final List<Map<String, dynamic>> fonts = _parseFonts(
flutterManifest,
includeDefaultFonts,
packageMap,
packageConfig,
);
// Add fonts and assets from packages.
for (final String packageName in packageMap.map.keys) {
final Uri package = packageMap.map[packageName];
if (package != null && package.scheme == 'file') {
final String packageManifestPath = globals.fs.path.fromUri(package.resolve('../pubspec.yaml'));
for (final Package package in packageConfig.packages) {
final Uri packageUri = package.packageUriRoot;
if (packageUri != null && packageUri.scheme == 'file') {
final String packageManifestPath = globals.fs.path.fromUri(packageUri.resolve('../pubspec.yaml'));
final FlutterManifest packageFlutterManifest = FlutterManifest.createFromPath(packageManifestPath);
if (packageFlutterManifest == null) {
continue;
......@@ -189,11 +198,11 @@ class _ManifestAssetBundle implements AssetBundle {
final String packageBasePath = globals.fs.path.dirname(packageManifestPath);
final Map<_Asset, List<_Asset>> packageAssets = _parseAssets(
packageMap,
packageConfig,
packageFlutterManifest,
wildcardDirectories,
packageBasePath,
packageName: packageName,
packageName: package.name,
);
if (packageAssets == null) {
......@@ -204,8 +213,8 @@ class _ManifestAssetBundle implements AssetBundle {
fonts.addAll(_parseFonts(
packageFlutterManifest,
includeDefaultFonts,
packageMap,
packageName: packageName,
packageConfig,
packageName: package.name,
));
}
}
......@@ -253,7 +262,7 @@ class _ManifestAssetBundle implements AssetBundle {
entries[kFontManifestJson] = DevFSStringContent(json.encode(fonts));
// TODO(ianh): Only do the following line if we've changed packages or if our LICENSE file changed
final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageMap);
final LicenseResult licenseResult = licenseCollector.obtainLicenses(packageConfig);
entries[_license] = DevFSStringContent(licenseResult.combinedLicenses);
additionalDependencies = licenseResult.dependencies;
......@@ -383,18 +392,18 @@ class LicenseCollector {
/// Obtain licenses from the `packageMap` into a single result.
LicenseResult obtainLicenses(
PackageMap packageMap,
PackageConfig packageConfig,
) {
final Map<String, Set<String>> packageLicenses = <String, Set<String>>{};
final Set<String> allPackages = <String>{};
final List<File> dependencies = <File>[];
for (final String packageName in packageMap.map.keys) {
final Uri package = packageMap.map[packageName];
if (package == null || package.scheme != 'file') {
for (final Package package in packageConfig.packages) {
final Uri packageUri = package.packageUriRoot;
if (packageUri == null || packageUri.scheme != 'file') {
continue;
}
final File file = _fileSystem.file(package.resolve('../LICENSE'));
final File file = _fileSystem.file(packageUri.resolve('../LICENSE'));
if (!file.existsSync()) {
continue;
}
......@@ -414,7 +423,7 @@ class LicenseCollector {
}
}
if (licenseText == null) {
packageNames = <String>[packageName];
packageNames = <String>[package.name];
licenseText = rawLicense;
}
packageLicenses.putIfAbsent(licenseText, () => <String>{})
......@@ -476,7 +485,7 @@ DevFSContent _createAssetManifest(Map<_Asset, List<_Asset>> assetVariants) {
List<Map<String, dynamic>> _parseFonts(
FlutterManifest manifest,
bool includeDefaultFonts,
PackageMap packageMap, {
PackageConfig packageConfig, {
String packageName,
}) {
return <Map<String, dynamic>>[
......@@ -488,7 +497,7 @@ List<Map<String, dynamic>> _parseFonts(
..._createFontsDescriptor(_parsePackageFonts(
manifest,
packageName,
packageMap,
packageConfig,
)),
];
}
......@@ -498,7 +507,7 @@ List<Map<String, dynamic>> _parseFonts(
List<Font> _parsePackageFonts(
FlutterManifest manifest,
String packageName,
PackageMap packageMap,
PackageConfig packageConfig,
) {
final List<Font> packageFonts = <Font>[];
for (final Font font in manifest.fonts) {
......@@ -506,7 +515,8 @@ List<Font> _parsePackageFonts(
for (final FontAsset fontAsset in font.fontAssets) {
final Uri assetUri = fontAsset.assetUri;
if (assetUri.pathSegments.first == 'packages' &&
!globals.fs.isFileSync(globals.fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
!globals.fs.isFileSync(globals.fs.path.fromUri(
packageConfig[packageName].packageUriRoot.resolve('../${assetUri.path}')))) {
packageFontAssets.add(FontAsset(
fontAsset.assetUri,
weight: fontAsset.weight,
......@@ -605,7 +615,7 @@ class _AssetDirectoryCache {
///
Map<_Asset, List<_Asset>> _parseAssets(
PackageMap packageMap,
PackageConfig packageConfig,
FlutterManifest flutterManifest,
List<Uri> wildcardDirectories,
String assetBase, {
......@@ -618,11 +628,11 @@ Map<_Asset, List<_Asset>> _parseAssets(
for (final Uri assetUri in flutterManifest.assets) {
if (assetUri.toString().endsWith('/')) {
wildcardDirectories.add(assetUri);
_parseAssetsFromFolder(packageMap, flutterManifest, assetBase,
_parseAssetsFromFolder(packageConfig, flutterManifest, assetBase,
cache, result, assetUri,
excludeDirs: excludeDirs, packageName: packageName);
} else {
_parseAssetFromFile(packageMap, flutterManifest, assetBase,
_parseAssetFromFile(packageConfig, flutterManifest, assetBase,
cache, result, assetUri,
excludeDirs: excludeDirs, packageName: packageName);
}
......@@ -632,7 +642,7 @@ Map<_Asset, List<_Asset>> _parseAssets(
for (final Font font in flutterManifest.fonts) {
for (final FontAsset fontAsset in font.fontAssets) {
final _Asset baseAsset = _resolveAsset(
packageMap,
packageConfig,
assetBase,
fontAsset.assetUri,
packageName,
......@@ -650,7 +660,7 @@ Map<_Asset, List<_Asset>> _parseAssets(
}
void _parseAssetsFromFolder(
PackageMap packageMap,
PackageConfig packageConfig,
FlutterManifest flutterManifest,
String assetBase,
_AssetDirectoryCache cache,
......@@ -675,14 +685,14 @@ void _parseAssetsFromFolder(
final Uri uri = Uri.file(relativePath, windows: globals.platform.isWindows);
_parseAssetFromFile(packageMap, flutterManifest, assetBase, cache, result,
_parseAssetFromFile(packageConfig, flutterManifest, assetBase, cache, result,
uri, packageName: packageName);
}
}
}
void _parseAssetFromFile(
PackageMap packageMap,
PackageConfig packageConfig,
FlutterManifest flutterManifest,
String assetBase,
_AssetDirectoryCache cache,
......@@ -692,7 +702,7 @@ void _parseAssetFromFile(
String packageName,
}) {
final _Asset asset = _resolveAsset(
packageMap,
packageConfig,
assetBase,
assetUri,
packageName,
......@@ -718,7 +728,7 @@ void _parseAssetFromFile(
}
_Asset _resolveAsset(
PackageMap packageMap,
PackageConfig packageConfig,
String assetsBaseDir,
Uri assetUri,
String packageName,
......@@ -727,7 +737,7 @@ _Asset _resolveAsset(
if (assetUri.pathSegments.first == 'packages' && !globals.fs.isFileSync(globals.fs.path.join(assetsBaseDir, assetPath))) {
// The asset is referenced in the pubspec.yaml as
// 'packages/PACKAGE_NAME/PATH/TO/ASSET .
final _Asset packageAsset = _resolvePackageAsset(assetUri, packageMap);
final _Asset packageAsset = _resolvePackageAsset(assetUri, packageConfig);
if (packageAsset != null) {
return packageAsset;
}
......@@ -742,11 +752,11 @@ _Asset _resolveAsset(
);
}
_Asset _resolvePackageAsset(Uri assetUri, PackageMap packageMap) {
_Asset _resolvePackageAsset(Uri assetUri, PackageConfig packageConfig) {
assert(assetUri.pathSegments.first == 'packages');
if (assetUri.pathSegments.length > 1) {
final String packageName = assetUri.pathSegments[1];
final Uri packageUri = packageMap.map[packageName];
final Uri packageUri = packageConfig[packageName]?.packageUriRoot;
if (packageUri != null && packageUri.scheme == 'file') {
return _Asset(
baseDir: globals.fs.path.fromUri(packageUri),
......
......@@ -5,7 +5,9 @@
import 'package:file/memory.dart';
import 'package:flutter_tools/src/asset.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/convert.dart';
import 'package:package_config/package_config.dart';
import 'package:package_config/package_config_types.dart';
import '../src/common.dart';
......@@ -246,7 +248,7 @@ void main() {
licenseCollector = LicenseCollector(fileSystem: fileSystem);
});
testWithoutContext('processes dependant licenses according to instructions', () {
testWithoutContext('processes dependent licenses according to instructions', () async {
fileSystem.file('foo/LICENSE')
..createSync(recursive: true)
..writeAsStringSync(_kMitLicense);
......@@ -257,13 +259,34 @@ void main() {
..createSync(recursive: true)
..writeAsStringSync(_kMitLicense); // intentionally a duplicate
final PackageMap packageMap = PackageMap.test(<String, Uri>{
'foo': Uri.parse('file:///foo/lib/'),
'bar': Uri.parse('file:///bar/lib/'),
'fizz': Uri.parse('file:///fizz/lib/'),
}, fileSystem: fileSystem);
final LicenseResult result = licenseCollector.obtainLicenses(packageMap);
final File packageConfigFile = fileSystem.file('package_config.json')
..writeAsStringSync(json.encode(
<String, Object>{
'configVersion': 2,
'packages': <Object>[
<String, Object>{
'name': 'foo',
'rootUri': 'file:///foo/',
'packageUri': 'lib/',
'languageVersion': '2.2'
},
<String, Object>{
'name': 'bar',
'rootUri': 'file:///bar/',
'packageUri': 'lib/',
'languageVersion': '2.2'
},
<String, Object>{
'name': 'fizz',
'rootUri': 'file:///fizz/',
'packageUri': 'lib/',
'languageVersion': '2.2'
},
],
}
));
final PackageConfig packageConfig = await loadPackageConfig(packageConfigFile.absolute);
final LicenseResult result = licenseCollector.obtainLicenses(packageConfig);
// All included licenses are combined in the result.
expect(result.combinedLicenses, contains(_kApacheLicense));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment