diff options
author | Yigit Boyar <yboyar@google.com> | 2016-01-22 18:20:01 -0800 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2016-01-26 10:53:37 -0800 |
commit | 89e50f43810ee32d8fc8ea359cd8e0ca4e9c8de4 (patch) | |
tree | 71fbce4229e6ed13b588fd2ee88c5f5baf651cac | |
parent | 8b8eb28e6a043b6914f8561147ac1a3e7c0bc59d (diff) | |
download | data-binding-89e50f43810ee32d8fc8ea359cd8e0ca4e9c8de4.tar.gz |
Fix incremental compilation when dependency layout is removed
This CL fixes a bug where if gradle dependency of a module is removed,
we would not delete its layout files properly.
Change-Id: Ifa5529768ed959acd8b6a903ad33d8f1e42159f7
Bug: 25755539
3 files changed, 66 insertions, 13 deletions
diff --git a/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java b/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java index e008c828..08bfde50 100644 --- a/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java +++ b/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java @@ -25,10 +25,13 @@ import org.junit.rules.TestName; import android.databinding.tool.store.Location; +import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; @@ -258,8 +261,8 @@ public class BaseCompilationTest { } builder.directory(testFolder); Process process = builder.start(); - String output = IOUtils.toString(process.getInputStream()); - String error = IOUtils.toString(process.getErrorStream()); + String output = collect(process.getInputStream()); + String error = collect(process.getErrorStream()); int result = process.waitFor(); return new CompilationResult(result, output, error); } @@ -269,5 +272,16 @@ public class BaseCompilationTest { gw.setExecutable(true); } - + /** + * Use this instead of IO utils so that we can easily log the output when necessary + */ + private static String collect(InputStream stream) throws IOException { + StringBuilder sb = new StringBuilder(); + String line; + final BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + while ((line = reader.readLine()) != null) { + sb.append(line).append("\n"); + } + return sb.toString(); + } } diff --git a/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java b/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java index 84d4459f..229323ff 100644 --- a/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java +++ b/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java @@ -228,6 +228,25 @@ public class SimpleCompilationTest extends BaseCompilationTest { } @Test + public void testModuleDependencyChange() throws IOException, URISyntaxException, + InterruptedException { + prepareApp(toMap(KEY_DEPENDENCIES, "compile project(':module1')", + KEY_SETTINGS_INCLUDES, "include ':app'\ninclude ':module1'")); + prepareModule("module1", "com.example.module1", toMap( + KEY_DEPENDENCIES, "compile 'com.android.support:appcompat-v7:23.1.1'" + )); + copyResourceTo("/layout/basic_layout.xml", "/module1/src/main/res/layout/module_layout.xml"); + copyResourceTo("/layout/basic_layout.xml", "/app/src/main/res/layout/app_layout.xml"); + CompilationResult result = runGradle("assembleDebug"); + assertEquals(result.error, 0, result.resultCode); + File moduleFolder = new File(testFolder, "module1"); + copyResourceTo("/module_build.gradle", new File(moduleFolder, "build.gradle"), + toMap()); + result = runGradle("assembleDebug"); + assertEquals(result.error, 0, result.resultCode); + } + + @Test public void testTwoLevelDependency() throws IOException, URISyntaxException, InterruptedException { prepareApp(toMap(KEY_DEPENDENCIES, "compile project(':module1')", KEY_SETTINGS_INCLUDES, "include ':app'\ninclude ':module1'\n" diff --git a/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java b/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java index a03b747b..41436f00 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java +++ b/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java @@ -21,6 +21,7 @@ import org.xml.sax.SAXException; import android.databinding.BindingBuildInfo; import android.databinding.tool.store.LayoutFileParser; import android.databinding.tool.store.ResourceBundle; +import android.databinding.tool.util.L; import android.databinding.tool.util.Preconditions; import android.databinding.tool.util.SourceCodeEscapers; import android.databinding.tool.writer.JavaFileWriter; @@ -157,7 +158,7 @@ public class LayoutXmlProcessor { public void processLayoutFile(File file) throws ParserConfigurationException, SAXException, XPathExpressionException, IOException { - File output = convertToOutFile(file); + final File output = convertToOutFile(file); final ResourceBundle.LayoutFileBundle bindingLayout = layoutFileParser .parseXml(file, output, mResourceBundle.getAppPackage(), mOriginalFileLookup); if (bindingLayout != null && !bindingLayout.isEmpty()) { @@ -167,19 +168,21 @@ public class LayoutXmlProcessor { @Override public void processOtherFile(File parentFolder, File file) throws IOException { - File outParent = convertToOutFile(parentFolder); + final File outParent = convertToOutFile(parentFolder); FileUtils.copyFile(file, new File(outParent, file.getName())); } @Override public void processRemovedLayoutFile(File file) { mResourceBundle.addRemovedFile(file); + final File out = convertToOutFile(file); + FileUtils.deleteQuietly(out); } @Override public void processRemovedOtherFile(File parentFolder, File file) throws IOException { - File outParent = convertToOutFile(parentFolder); - FileUtils.forceDelete(new File(outParent, file.getName())); + final File outParent = convertToOutFile(parentFolder); + FileUtils.deleteQuietly(new File(outParent, file.getName())); } @Override @@ -196,7 +199,7 @@ public class LayoutXmlProcessor { @Override public void processOtherRootFile(File file) throws IOException { - File outFile = convertToOutFile(file); + final File outFile = convertToOutFile(file); if (file.isDirectory()) { FileUtils.copyDirectory(file, outFile); } else { @@ -207,11 +210,7 @@ public class LayoutXmlProcessor { @Override public void processRemovedOtherRootFile(File file) throws IOException { final File outFile = convertToOutFile(file); - if (file.isDirectory()) { - FileUtils.deleteDirectory(outFile); - } else { - FileUtils.deleteQuietly(outFile); - } + FileUtils.deleteQuietly(outFile); } }; if (input.isIncremental()) { @@ -392,6 +391,27 @@ public class LayoutXmlProcessor { public boolean isIncremental() { return mIncremental; } + + @Override + public String toString() { + StringBuilder out = new StringBuilder(); + out.append("ResourceInput{") + .append("mIncremental=").append(mIncremental) + .append(", mRootInputFolder=").append(mRootInputFolder) + .append(", mRootOutputFolder=").append(mRootOutputFolder); + logFiles(out, "added", mAdded); + logFiles(out, "removed", mRemoved); + logFiles(out, "changed", mChanged); + return out.toString(); + + } + + private static void logFiles(StringBuilder out, String name, List<File> files) { + out.append("\n ").append(name); + for (File file : files) { + out.append("\n - ").append(file.getAbsolutePath()); + } + } } private interface ProcessFileCallback { |