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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** Common methods used by transfomers. */ 5 /** Common methods used by transfomers. */
6 library polymer.src.build.common; 6 library polymer.src.build.common;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 9
10 import 'package:barback/barback.dart'; 10 import 'package:barback/barback.dart';
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610) 118 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
119 AssetId resolve(AssetId source, String url, TransformLogger logger, Span span) { 119 AssetId resolve(AssetId source, String url, TransformLogger logger, Span span) {
120 if (url == null || url == '') return null; 120 if (url == null || url == '') return null;
121 var uri = Uri.parse(url); 121 var uri = Uri.parse(url);
122 var urlBuilder = path.url; 122 var urlBuilder = path.url;
123 if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) { 123 if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
124 logger.error('absolute paths not allowed: "$url"', span: span); 124 logger.error('absolute paths not allowed: "$url"', span: span);
125 return null; 125 return null;
126 } 126 }
127 127
128 var package;
129 var targetPath;
130 var segments = urlBuilder.split(url); 128 var segments = urlBuilder.split(url);
131 if (segments[0] == 'packages') { 129 var prefix = segments[0];
132 if (segments.length < 3) { 130 var entryFolder = !source.path.startsWith('lib/') &&
133 logger.error("incomplete packages/ path. It should have at least 3 " 131 !source.path.startsWith('asset/');
134 "segments packages/name/path-from-name's-lib-dir", span: span); 132
135 return null; 133 // URLs of the form "packages/foo/bar" seen under entry folders (like web/,
136 } 134 // test/, example/, etc) are resolved as an asset in another package.
137 package = segments[1]; 135 if (entryFolder && (prefix == 'packages' || prefix == 'assets')) {
138 targetPath = urlBuilder.join('lib', 136 return _extractOtherPackageId(0, segments, logger, span);
139 urlBuilder.joinAll(segments.sublist(2)));
140 } else if (segments[0] == 'assets') {
141 if (segments.length < 3) {
142 logger.error("incomplete assets/ path. It should have at least 3 "
143 "segments assets/name/path-from-name's-asset-dir", span: span);
144 }
145 package = segments[1];
146 targetPath = urlBuilder.join('asset',
147 urlBuilder.joinAll(segments.sublist(2)));
148 } else {
149 package = source.package;
150 targetPath = urlBuilder.normalize(
151 urlBuilder.join(urlBuilder.dirname(source.path), url));
152 } 137 }
153 return new AssetId(package, targetPath); 138
139 var targetPath = urlBuilder.normalize(
140 urlBuilder.join(urlBuilder.dirname(source.path), url));
141
142 // Relative URLs of the form "../../packages/foo/bar" in an asset under lib/
143 // or asset/ are also resolved as an asset in another package.
144 segments = urlBuilder.split(targetPath);
145 if (!entryFolder && segments.length > 1 && segments[0] == '..' &&
146 (segments[1] == 'packages' || segments[1] == 'assets')) {
147 return _extractOtherPackageId(1, segments, logger, span);
148 }
149
150 // Otherwise, resolve as a path in the same package.
151 return new AssetId(source.package, targetPath);
152 }
153
154 AssetId _extractOtherPackageId(int index, List segments,
155 TransformLogger logger, Span span) {
156 if (index >= segments.length) return null;
157 var prefix = segments[index];
158 if (prefix != 'packages' && prefix != 'assets') return null;
159 var folder = prefix == 'packages' ? 'lib' : 'asset';
160 if (segments.length < index + 3) {
161 logger.error("incomplete $prefix/ path. It should have at least 3 "
162 "segments $prefix/name/path-from-name's-$folder-dir", span: span);
163 return null;
164 }
165 return new AssetId(segments[index + 1],
166 path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
154 } 167 }
155 168
156 /** 169 /**
157 * Generate the import url for a file described by [id], referenced by a file 170 * Generate the import url for a file described by [id], referenced by a file
158 * with [sourceId]. 171 * with [sourceId].
159 */ 172 */
160 // TODO(sigmund): this should also be in barback (dartbug.com/12610) 173 // TODO(sigmund): this should also be in barback (dartbug.com/12610)
161 String assetUrlFor(AssetId id, AssetId sourceId, TransformLogger logger, 174 String assetUrlFor(AssetId id, AssetId sourceId, TransformLogger logger,
162 {bool allowAssetUrl: false}) { 175 {bool allowAssetUrl: false}) {
163 // use package: and asset: urls if possible 176 // use package: and asset: urls if possible
(...skipping 20 matching lines...) Expand all
184 return builder.relative(builder.join('/', id.path), 197 return builder.relative(builder.join('/', id.path),
185 from: builder.join('/', builder.dirname(sourceId.path))); 198 from: builder.join('/', builder.dirname(sourceId.path)));
186 } 199 }
187 200
188 201
189 /** Convert system paths to asset paths (asset paths are posix style). */ 202 /** Convert system paths to asset paths (asset paths are posix style). */
190 String _systemToAssetPath(String assetPath) { 203 String _systemToAssetPath(String assetPath) {
191 if (path.Style.platform != path.Style.windows) return assetPath; 204 if (path.Style.platform != path.Style.windows) return assetPath;
192 return path.posix.joinAll(path.split(assetPath)); 205 return path.posix.joinAll(path.split(assetPath));
193 } 206 }
OLDNEW
« 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