Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Unified Diff: pkg/polymer/lib/src/build/common.dart

Issue 79513002: Fix resolution of packages in pub-build to allow '../../packages/foo/bar' (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/polymer/lib/src/build/common.dart
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 1bb43797b6ece80ce5b19f6acdf69193809a4209..655ccbfc9f3d26485e8e0f4f6bd9e5b9ce1c3901 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -125,32 +125,45 @@ AssetId resolve(AssetId source, String url, TransformLogger logger, Span span) {
return null;
}
- var package;
- var targetPath;
var segments = urlBuilder.split(url);
- if (segments[0] == 'packages') {
- if (segments.length < 3) {
- logger.error("incomplete packages/ path. It should have at least 3 "
- "segments packages/name/path-from-name's-lib-dir", span: span);
- return null;
- }
- package = segments[1];
- targetPath = urlBuilder.join('lib',
- urlBuilder.joinAll(segments.sublist(2)));
- } else if (segments[0] == 'assets') {
- if (segments.length < 3) {
- logger.error("incomplete assets/ path. It should have at least 3 "
- "segments assets/name/path-from-name's-asset-dir", span: span);
- }
- package = segments[1];
- targetPath = urlBuilder.join('asset',
- urlBuilder.joinAll(segments.sublist(2)));
- } else {
- package = source.package;
- targetPath = urlBuilder.normalize(
- urlBuilder.join(urlBuilder.dirname(source.path), url));
+ var prefix = segments[0];
+ var entryFolder = !source.path.startsWith('lib/') &&
+ !source.path.startsWith('asset/');
+
+ // URLs of the form "packages/foo/bar" seen under entry folders (like web/,
+ // test/, example/, etc) are resolved as an asset in another package.
+ if (entryFolder && (prefix == 'packages' || prefix == 'assets')) {
+ return _extractOtherPackageId(0, segments, logger, span);
+ }
+
+ var targetPath = urlBuilder.normalize(
+ urlBuilder.join(urlBuilder.dirname(source.path), url));
+
+ // Relative URLs of the form "../../packages/foo/bar" in an asset under lib/
+ // or asset/ are also resolved as an asset in another package.
+ segments = urlBuilder.split(targetPath);
+ if (!entryFolder && segments.length > 1 && segments[0] == '..' &&
+ (segments[1] == 'packages' || segments[1] == 'assets')) {
+ return _extractOtherPackageId(1, segments, logger, span);
+ }
+
+ // Otherwise, resolve as a path in the same package.
+ return new AssetId(source.package, targetPath);
+}
+
+AssetId _extractOtherPackageId(int index, List segments,
+ TransformLogger logger, Span span) {
+ if (index >= segments.length) return null;
+ var prefix = segments[index];
+ if (prefix != 'packages' && prefix != 'assets') return null;
+ var folder = prefix == 'packages' ? 'lib' : 'asset';
+ if (segments.length < index + 3) {
+ logger.error("incomplete $prefix/ path. It should have at least 3 "
+ "segments $prefix/name/path-from-name's-$folder-dir", span: span);
+ return null;
}
- return new AssetId(package, targetPath);
+ return new AssetId(segments[index + 1],
+ path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
}
/**
« no previous file with comments | « no previous file | pkg/polymer/lib/src/build/import_inliner.dart » ('j') | pkg/polymer/lib/src/build/import_inliner.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698