summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2016-01-22 18:20:01 -0800
committerYigit Boyar <yboyar@google.com>2016-01-26 10:53:37 -0800
commit89e50f43810ee32d8fc8ea359cd8e0ca4e9c8de4 (patch)
tree71fbce4229e6ed13b588fd2ee88c5f5baf651cac
parent8b8eb28e6a043b6914f8561147ac1a3e7c0bc59d (diff)
downloaddata-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
-rw-r--r--compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java20
-rw-r--r--compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java19
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java40
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 {