summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2013-08-01 21:12:27 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-08-01 21:12:27 +0000
commitf67950452b4c18cee6e8703c26164057c5da027a (patch)
treee251231e24ca4fbb21f60b894f5792b717f64206
parent1c01e6644dcbf7a05f780d31d9bacdbefa03ff8f (diff)
parent328d58930365eb64d2d357133efff782372f16be (diff)
downloadbase-f67950452b4c18cee6e8703c26164057c5da027a.tar.gz
Merge changes I505dede3,I3d43bc2c,Ib2634b2c into tools_r22.1tools_r22.1
* changes: Move to 22.1.3 Add support for env var in CommandLineRunner. Properly handle removed res items when writing incremental data blob.
-rw-r--r--build.gradle2
-rw-r--r--sdk-common/src/main/java/com/android/ide/common/internal/AaptRunner.java17
-rw-r--r--sdk-common/src/main/java/com/android/ide/common/internal/CommandLineRunner.java22
-rw-r--r--sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java10
-rwxr-xr-xsdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java12
-rwxr-xr-xsdk-common/src/main/java/com/android/ide/common/res2/DataSet.java8
-rwxr-xr-xsdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java64
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/merger.xml9
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png0
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png0
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png0
11 files changed, 135 insertions, 9 deletions
diff --git a/build.gradle b/build.gradle
index 3dfcce9011..5930fe8c3f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -61,7 +61,7 @@ subprojects { Project project ->
hidden "com.google.code.findbugs:findbugs:2.0.1"
}
- version = getVersion(project, '22.1.2')
+ version = getVersion(project, '22.1.3')
project.ext.sonatypeUsername = project.hasProperty('sonatypeUsername') ? sonatypeUsername : ""
project.ext.sonatypePassword = project.hasProperty('sonatypePassword') ? sonatypePassword : ""
diff --git a/sdk-common/src/main/java/com/android/ide/common/internal/AaptRunner.java b/sdk-common/src/main/java/com/android/ide/common/internal/AaptRunner.java
index 727484e501..5813bae9af 100644
--- a/sdk-common/src/main/java/com/android/ide/common/internal/AaptRunner.java
+++ b/sdk-common/src/main/java/com/android/ide/common/internal/AaptRunner.java
@@ -17,9 +17,11 @@
package com.android.ide.common.internal;
import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
import java.io.File;
import java.io.IOException;
+import java.util.Map;
/**
* Instances of this class are able to run aapt command.
@@ -43,6 +45,19 @@ public class AaptRunner {
* @throws LoggedErrorException
*/
public void crunchPng(File from, File to)
+ throws InterruptedException, LoggedErrorException, IOException {
+ crunchPng(from, to, null);
+ }
+
+ /**
+ * Runs the aapt crunch command on a single file
+ * @param from the file to crunch
+ * @param to the output file
+ * @throws IOException
+ * @throws InterruptedException
+ * @throws LoggedErrorException
+ */
+ public void crunchPng(File from, File to, @Nullable Map<String, String> envVariableMap)
throws IOException, InterruptedException, LoggedErrorException {
String[] command = new String[] {
mAaptLocation,
@@ -53,6 +68,6 @@ public class AaptRunner {
to.getAbsolutePath()
};
- mCommandLineRunner.runCmdLine(command);
+ mCommandLineRunner.runCmdLine(command, envVariableMap);
}
}
diff --git a/sdk-common/src/main/java/com/android/ide/common/internal/CommandLineRunner.java b/sdk-common/src/main/java/com/android/ide/common/internal/CommandLineRunner.java
index 902e65ffaf..95e0ae80f4 100644
--- a/sdk-common/src/main/java/com/android/ide/common/internal/CommandLineRunner.java
+++ b/sdk-common/src/main/java/com/android/ide/common/internal/CommandLineRunner.java
@@ -16,6 +16,7 @@
package com.android.ide.common.internal;
+import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.sdklib.util.GrabProcessOutput;
import com.android.utils.ILogger;
@@ -24,6 +25,7 @@ import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
public class CommandLineRunner {
@@ -59,18 +61,30 @@ public class CommandLineRunner {
mLogger = logger;
}
- public void runCmdLine(List<String> command)
+ public void runCmdLine(
+ @NonNull List<String> command,
+ @Nullable Map<String, String> envVariableMap)
throws IOException, InterruptedException, LoggedErrorException {
String[] cmdArray = command.toArray(new String[command.size()]);
- runCmdLine(cmdArray);
+ runCmdLine(cmdArray, envVariableMap);
}
- public void runCmdLine(String[] command)
+ public void runCmdLine(
+ @NonNull String[] command,
+ @Nullable Map<String, String> envVariableMap)
throws IOException, InterruptedException, LoggedErrorException {
printCommand(command);
// launch the command line process
- Process process = Runtime.getRuntime().exec(command);
+ ProcessBuilder processBuilder = new ProcessBuilder(command);
+ if (envVariableMap != null) {
+ Map<String, String> env = processBuilder.environment();
+ for (Map.Entry<String, String> entry : envVariableMap.entrySet()) {
+ env.put(entry.getKey(), entry.getValue());
+ }
+ }
+
+ Process process = processBuilder.start();
// get the output and return code from the process
OutputGrabber grabber = new OutputGrabber();
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
index 85fcac8f05..29f871574b 100644
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
@@ -91,6 +91,16 @@ public abstract class DataFile<I extends DataItem> {
return mItems.values().iterator().next();
}
+ boolean hasNotRemovedItems() {
+ for (I item : mItems.values()) {
+ if (!item.isRemoved()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
@NonNull
public Collection<I> getItems() {
return mItems.values();
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
index 9259682752..05a52fa22f 100755
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
@@ -317,9 +317,10 @@ abstract class DataMerger<I extends DataItem<F>, F extends DataFile<I>, S extend
* @return true if the blob was loaded.
* @throws IOException
*
- * @see #writeBlobTo(File)
+ * @see #writeBlobTo(File, MergeConsumer)
*/
- public boolean loadFromBlob(File blobRootFolder, boolean incrementalState) throws IOException {
+ public boolean loadFromBlob(@NonNull File blobRootFolder, boolean incrementalState)
+ throws IOException {
File file = new File(blobRootFolder, FN_MERGER_XML);
if (!file.isFile()) {
return false;
@@ -382,6 +383,13 @@ abstract class DataMerger<I extends DataItem<F>, F extends DataFile<I>, S extend
}
}
+ public void cleanBlob(@NonNull File blobRootFolder) {
+ File file = new File(blobRootFolder, FN_MERGER_XML);
+ if (file.isFile()) {
+ file.delete();
+ }
+ }
+
/**
* Sets the post blob load state to WRITTEN.
*
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
index d4b323a02d..63f704f751 100755
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
@@ -266,6 +266,10 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
Collection<F> dataFiles = mSourceFileToDataFilesMap.get(sourceFile);
for (F dataFile : dataFiles) {
+ if (!dataFile.hasNotRemovedItems()) {
+ continue;
+ }
+
// the node for the file and its path and qualifiers attribute
Node fileNode = document.createElement(NODE_FILE);
sourceNode.appendChild(fileNode);
@@ -275,7 +279,7 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
if (dataFile.getType() == DataFile.FileType.MULTI) {
for (I item : dataFile.getItems()) {
- if (consumer.ignoreItemInMerge(item)) {
+ if (item.isRemoved()|| consumer.ignoreItemInMerge(item)) {
continue;
}
Node adoptedNode = item.getAdoptedNode(document);
@@ -284,6 +288,8 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
}
}
} else {
+ // no need to check for isRemoved here since it's checked
+ // at the file level and there's only one item.
I dataItem = dataFile.getItem();
NodeUtils.addAttribute(document, fileNode, null, ATTR_NAME, dataItem.getName());
dataItem.addExtraAttributes(document, fileNode, null);
diff --git a/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java b/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
index 3a7ff38028..eaff62e36f 100755
--- a/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
+++ b/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
@@ -812,6 +812,70 @@ public class ResourceMergerTest extends BaseTestCase {
assertEquals(FileValidity.FileStatus.IGNORED_FILE, fileValidity.status);
}
+ public void testIncDataForRemovedFile() throws Exception {
+ File root = TestUtils.getCanonicalRoot("resources", "removedFile");
+ File fakeBlobRoot = getMergedBlobFolder(root);
+
+ ResourceMerger resourceMerger = new ResourceMerger();
+ resourceMerger.loadFromBlob(fakeBlobRoot, true /*incrementalState*/);
+ checkSourceFolders(resourceMerger);
+
+ List<ResourceSet> sets = resourceMerger.getDataSets();
+ assertEquals(1, sets.size());
+
+ RecordingLogger logger = new RecordingLogger();
+
+ // ----------------
+ // Load the main set
+ ResourceSet mainSet = sets.get(0);
+ File resBase = new File(root, "res");
+ File resDrawable = new File(resBase, ResourceFolderType.DRAWABLE.getName());
+
+ // removed file
+ File resIconRemoved = new File(resDrawable, "removed.png");
+ mainSet.updateWith(resBase, resIconRemoved, FileStatus.REMOVED, logger);
+ checkLogger(logger);
+
+ // validate for duplicates
+ resourceMerger.validateDataSets();
+
+ // check the content.
+ ListMultimap<String, ResourceItem> mergedMap = resourceMerger.getDataMap();
+
+ // check layout/main is unchanged
+ List<ResourceItem> removedIcon = mergedMap.get("drawable/removed");
+ assertEquals(1, removedIcon.size());
+ assertTrue(removedIcon.get(0).isRemoved());
+ assertTrue(removedIcon.get(0).isWritten());
+ assertFalse(removedIcon.get(0).isTouched());
+
+ // write and check the result of writeResourceFolder
+ // copy the current resOut which serves as pre incremental update state.
+ File outFolder = getFolderCopy(new File(root, "out"));
+
+ // write the content of the resource merger.
+ MergedResourceWriter writer = new MergedResourceWriter(outFolder, null /*aaptRunner*/);
+ resourceMerger.mergeData(writer, false /*doCleanUp*/);
+
+ File outDrawableFolder = new File(outFolder, ResourceFolderType.DRAWABLE.getName());
+
+ // check the files are correct
+ assertFalse(new File(outDrawableFolder, "removed.png").isFile());
+ assertTrue(new File(outDrawableFolder, "icon.png").isFile());
+
+ // now write the blob
+ File outBlobFolder = Files.createTempDir();
+ resourceMerger.writeBlobTo(outBlobFolder, writer);
+
+ // check the removed icon is not present.
+ ResourceMerger resourceMerger2 = new ResourceMerger();
+ resourceMerger2.loadFromBlob(outBlobFolder, true /*incrementalState*/);
+
+ mergedMap = resourceMerger2.getDataMap();
+ removedIcon = mergedMap.get("drawable/removed");
+ assertTrue(removedIcon.isEmpty());
+ }
+
/**
* Creates a fake merge with given sets.
*
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml b/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml
new file mode 100644
index 0000000000..ce93563e00
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merger xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
+ <dataSet config="main">
+ <source path="$TOP$$SEP$res">
+ <file name="icon" path="$TOP$$SEP$res$SEP$drawable$SEP$icon.png" qualifiers="" type="drawable"/>
+ <file name="removed" path="$TOP$$SEP$res$SEP$drawable$SEP$removed.png" qualifiers="" type="drawable"/>
+ </source>
+ </dataSet>
+</merger>
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png b/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png