OLD | NEW |
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 library pub.command.serve; | 5 library pub.command.serve; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:barback/barback.dart'; | 10 import 'package:barback/barback.dart'; |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 // Add the initial sources. | 219 // Add the initial sources. |
220 _barback.updateSources(listAssets(package)); | 220 _barback.updateSources(listAssets(package)); |
221 | 221 |
222 // Watch the visible package directories for changes. | 222 // Watch the visible package directories for changes. |
223 var packageDir = _provider.getPackageDir(package); | 223 var packageDir = _provider.getPackageDir(package); |
224 | 224 |
225 for (var name in getPublicDirectories(package)) { | 225 for (var name in getPublicDirectories(package)) { |
226 var subdirectory = path.join(packageDir, name); | 226 var subdirectory = path.join(packageDir, name); |
227 var watcher = new DirectoryWatcher(subdirectory); | 227 var watcher = new DirectoryWatcher(subdirectory); |
228 watcher.events.listen((event) { | 228 watcher.events.listen((event) { |
229 var relativePath = path.relative(event.path, from: packageDir); | 229 var id = pathToAssetId(package, packageDir, event.path); |
230 var id = new AssetId(package, relativePath); | |
231 if (event.type == ChangeType.REMOVE) { | 230 if (event.type == ChangeType.REMOVE) { |
232 _barback.removeSources([id]); | 231 _barback.removeSources([id]); |
233 } else { | 232 } else { |
234 _barback.updateSources([id]); | 233 _barback.updateSources([id]); |
235 } | 234 } |
236 }); | 235 }); |
237 } | 236 } |
238 } | 237 } |
239 } | 238 } |
240 | 239 |
241 /// Lists all of the visible files in [package]. | 240 /// Lists all of the visible files in [package]. |
242 /// | 241 /// |
243 /// This is the recursive contents of the "asset" and "lib" directories (if | 242 /// This is the recursive contents of the "asset" and "lib" directories (if |
244 /// present). If [package] is the entrypoint package, it also includes the | 243 /// present). If [package] is the entrypoint package, it also includes the |
245 /// contents of "web". | 244 /// contents of "web". |
246 List<AssetId> listAssets(String package) { | 245 List<AssetId> listAssets(String package) { |
247 var files = <AssetId>[]; | 246 var files = <AssetId>[]; |
248 | 247 |
249 for (var dirPath in getPublicDirectories(package)) { | 248 for (var dirPath in getPublicDirectories(package)) { |
250 var packageDir = _provider.getPackageDir(package); | 249 var packageDir = _provider.getPackageDir(package); |
251 var dir = path.join(packageDir, dirPath); | 250 var dir = path.join(packageDir, dirPath); |
252 if (!dirExists(dir)) continue; | 251 if (!dirExists(dir)) continue; |
253 for (var entry in listDir(dir, recursive: true)) { | 252 for (var entry in listDir(dir, recursive: true)) { |
254 // Ignore "packages" symlinks if there. | 253 // Ignore "packages" symlinks if there. |
255 if (path.split(entry).contains("packages")) continue; | 254 if (path.split(entry).contains("packages")) continue; |
256 | 255 |
257 // Skip directories. | 256 // Skip directories. |
258 if (!fileExists(entry)) continue; | 257 if (!fileExists(entry)) continue; |
259 | 258 |
260 // AssetId paths use "/" on all platforms. | 259 files.add(pathToAssetId(package, packageDir, entry)); |
261 var relative = path.relative(entry, from: packageDir); | |
262 relative = path.toUri(relative).path; | |
263 files.add(new AssetId(package, relative)); | |
264 } | 260 } |
265 } | 261 } |
266 | 262 |
267 return files; | 263 return files; |
268 } | 264 } |
269 | 265 |
270 /// Gets the names of the top-level directories in [package] whose contents | 266 /// Gets the names of the top-level directories in [package] whose contents |
271 /// should be provided as source assets. | 267 /// should be provided as source assets. |
272 Iterable<String> getPublicDirectories(String package) { | 268 Iterable<String> getPublicDirectories(String package) { |
273 var directories = ["asset", "lib"]; | 269 var directories = ["asset", "lib"]; |
274 if (package == entrypoint.root.name) directories.add("web"); | 270 if (package == entrypoint.root.name) directories.add("web"); |
275 return directories; | 271 return directories; |
276 } | 272 } |
| 273 |
| 274 /// Converts a local file path to an [AssetId]. |
| 275 AssetId pathToAssetId(String package, String packageDir, String filePath) { |
| 276 var relative = path.relative(filePath, from: packageDir); |
| 277 |
| 278 // AssetId paths use "/" on all platforms. |
| 279 relative = path.toUri(relative).path; |
| 280 |
| 281 return new AssetId(package, relative); |
| 282 } |
277 } | 283 } |
OLD | NEW |