| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'globals.dart'; |
| |
| import 'base/file_system.dart'; |
| import 'dart/dependencies.dart'; |
| import 'dart/package_map.dart'; |
| import 'asset.dart'; |
| |
| class DependencyChecker { |
| final DartDependencySetBuilder builder; |
| final Set<String> _dependencies = new Set<String>(); |
| final AssetBundle assets; |
| DependencyChecker(this.builder, this.assets); |
| |
| /// Returns [true] if any components have been modified after [threshold] or |
| /// if it cannot be determined. |
| bool check(DateTime threshold) { |
| _dependencies.clear(); |
| PackageMap packageMap; |
| // Parse the package map. |
| try { |
| packageMap = new PackageMap(builder.packagesFilePath)..load(); |
| _dependencies.add(builder.packagesFilePath); |
| } catch (e, st) { |
| printTrace('DependencyChecker: could not parse .packages file:\n$e\n$st'); |
| return true; |
| } |
| // Build the set of Dart dependencies. |
| try { |
| Set<String> dependencies = builder.build(); |
| for (String path in dependencies) { |
| // Ensure all paths are absolute. |
| if (path.startsWith('package:')) { |
| path = packageMap.pathForPackage(Uri.parse(path)); |
| } else { |
| path = fs.path.join(builder.projectRootPath, path); |
| } |
| _dependencies.add(path); |
| } |
| } catch (e, st) { |
| printTrace('DependencyChecker: error determining .dart dependencies:\n$e\n$st'); |
| return true; |
| } |
| // TODO(johnmccutchan): Extract dependencies from the AssetBundle too. |
| |
| // Check all dependency modification times. |
| for (String path in _dependencies) { |
| File file = fs.file(path); |
| FileStat stat = file.statSync(); |
| if (stat.type == FileSystemEntityType.NOT_FOUND) { |
| printTrace('DependencyChecker: Error stating $path.'); |
| return true; |
| } |
| if (stat.modified.isAfter(threshold)) { |
| printTrace('DependencyChecker: $path is newer than $threshold'); |
| return true; |
| } |
| } |
| printTrace('DependencyChecker: nothing is modified after $threshold.'); |
| return false; |
| } |
| } |