| library pub.barback.transformer_cache; |
| import 'package:path/path.dart' as p; |
| import '../io.dart'; |
| import '../log.dart' as log; |
| import '../package_graph.dart'; |
| import '../sdk.dart' as sdk; |
| import '../utils.dart'; |
| import 'transformer_id.dart'; |
| class TransformerCache { |
| final PackageGraph _graph; |
| Set<TransformerId> _oldTransformers; |
| Set<TransformerId> _newTransformers; |
| String _dir; |
| String get _manifestPath => p.join(_dir, "manifest.txt"); |
| TransformerCache.load(PackageGraph graph) |
| : _graph = graph, |
| _dir = graph.entrypoint.root.path(".pub/transformers") { |
| _oldTransformers = _parseManifest(); |
| } |
| void clearIfOutdated(Set<String> changedPackages) { |
| var snapshotDependencies = unionAll(_oldTransformers.map((id) { |
| if (!_graph.packages.containsKey(id.package)) return new Set(); |
| return _graph.transitiveDependencies( |
| id.package).map((package) => package.name).toSet(); |
| })); |
| if (!overlaps(changedPackages, snapshotDependencies)) return; |
| deleteEntry(_dir); |
| _oldTransformers = new Set(); |
| } |
| String snapshotPath(Set<TransformerId> transformers) { |
| var path = p.join(_dir, "transformers.snapshot"); |
| if (_newTransformers != null) return path; |
| if (transformers.any((id) => _graph.isPackageMutable(id.package))) { |
| log.fine("Not caching mutable transformers."); |
| deleteEntry(_dir); |
| return null; |
| } |
| if (!_oldTransformers.containsAll(transformers)) { |
| log.fine("Cached transformer snapshot is out-of-date, deleting."); |
| deleteEntry(path); |
| } else { |
| log.fine("Using cached transformer snapshot."); |
| } |
| _newTransformers = transformers; |
| return path; |
| } |
| void save() { |
| if (_newTransformers == null) { |
| if (_dir != null) deleteEntry(_dir); |
| return; |
| } |
| if (_oldTransformers.containsAll(_newTransformers)) return; |
| ensureDir(_dir); |
| writeTextFile( |
| _manifestPath, |
| "${sdk.version}\n" + |
| ordered(_newTransformers.map((id) => id.serialize())).join(",")); |
| } |
| Set<TransformerId> _parseManifest() { |
| if (!fileExists(_manifestPath)) return new Set(); |
| var manifest = readTextFile(_manifestPath).split("\n"); |
| if (manifest.removeAt(0) != sdk.version.toString()) { |
| deleteEntry(_dir); |
| return new Set(); |
| } |
| return manifest.single.split( |
| ",").map((id) => new TransformerId.parse(id, null)).toSet(); |
| } |
| } |