blob: a396d154588d3d0937a21168162122d1a1508ee2 [file] [log] [blame]
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();
}
}