From 5f78ad04215b2ce865466e8ecb9b134f1864ba17 Mon Sep 17 00:00:00 2001
From: "nweiz@google.com" <nweiz@google.com>
Date: Thu, 11 Dec 2014 00:42:45 +0000
Subject: [PATCH] Properly delete cached dependencies that should no longer be
 cached.

This fixes the "Could not find asset" issue people were seeing on "pub
upgrade".

R=rnystrom@google.com
BUG=21810

Review URL: https://codereview.chromium.org//792993004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge@42273 260f80e4-7a28-3924-810f-c04153c831b5
---
 lib/src/entrypoint.dart                       | 21 ++++++---
 .../cache_transformed_dependency_test.dart    | 45 +++++++++++++++++++
 2 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 5c2c8454..811ae0bf 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -183,6 +183,22 @@ class Entrypoint {
           changed);
     }).map((package) => package.name).toSet();
 
+    if (dirExists(depsDir)) {
+      // Delete any cached dependencies that are going to be recached.
+      for (var package in dependenciesToPrecompile) {
+        deleteEntry(path.join(depsDir, package));
+      }
+
+      // Also delete any cached dependencies that should no longer be cached.
+      for (var subdir in listDir(depsDir)) {
+        var package = graph.packages[path.basename(subdir)];
+        if (package == null || package.pubspec.transformers.isEmpty ||
+            graph.isPackageMutable(package.name)) {
+          deleteEntry(subdir);
+        }
+      }
+    }
+
     if (dependenciesToPrecompile.isEmpty) return;
 
     await log.progress("Precompiling dependencies", () async {
@@ -190,11 +206,6 @@ class Entrypoint {
           unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies))
           .map((package) => package.name).toSet();
 
-      // TODO(nweiz): Use for/in here when
-      // https://github.com/dart-lang/async_await/issues/68 is fixed.
-      dependenciesToPrecompile.forEach((package) =>
-          deleteEntry(path.join(depsDir, package)));
-
       var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG,
           packages: packagesToLoad, useDart2JS: false);
 
diff --git a/test/get/cache_transformed_dependency_test.dart b/test/get/cache_transformed_dependency_test.dart
index 613d9cbd..f1978056 100644
--- a/test/get/cache_transformed_dependency_test.dart
+++ b/test/get/cache_transformed_dependency_test.dart
@@ -376,6 +376,51 @@ main() {
         "lib/foo.dart: true, lib/does/not/exist.dart: false");
     endPubServe();
   });
+
+  // Regression test for issue 21810.
+  integration("decaches when the dependency is updated to something "
+      "untransformed", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("foo", "1.2.4",
+          deps: {'barback': 'any'},
+          contents: [
+        d.dir("lib", [
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Goodbye!';")
+      ])
+    ]).validate();
+
+    // Upgrade to the new version of foo.
+    d.appDir({"foo": "1.2.4"}).create();
+
+    pubGet(output: isNot(contains("Precompiled foo.")));
+
+    d.dir(appPath, [
+      d.nothing(".pub/deps/debug/foo")
+    ]).validate();
+  });
 }
 
 String replaceTransformer(String input, String output) {
-- 
GitLab