OSDN Git Service

Fix an issue where src files can be deleted in ADT.
authorXavier Ducrohet <xav@android.com>
Wed, 22 Sep 2010 17:23:38 +0000 (10:23 -0700)
committerXavier Ducrohet <xav@android.com>
Wed, 22 Sep 2010 18:47:24 +0000 (11:47 -0700)
Older projects generated the java class (R, aidl) into
the main src folder.

There is code in ADT to migrate them to the new model
(where generated classes go in gen/) by removing derived
resources from the source folder. This is also used
by the clean feature of the pre-compiler builder
to clean the content of gen.

To make it better, in ADT 0.9.8, we added something to
delete the folder containing the derived resources.
Except this doesn't check if the folder is not empty
after the derived resources have been deleted (or
not if it contained non-derived resources).

this means importing older projects (or possibly
team projects -- see http://b.android.com/11347)
would delete the whole content of the source folder.

This change makes sure that only folders for which
all members have been deleted are deleted.

Change-Id: I04b6d986fb3e454a259213fcda197400e9e7c974

eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java

index 4e9c7f4..b143e6b 100644 (file)
@@ -368,21 +368,34 @@ abstract class BaseBuilder extends IncrementalProjectBuilder {
         removeDerivedResources(rootResource, false, monitor);
     }
 
+    /**
+     * delete a resource and its children. returns true if the root resource was deleted. All
+     * sub-folders *will* be deleted if they were emptied (not if they started empty).
+     * @param rootResource the root resource
+     * @param deleteRoot whether to delete the root folder.
+     * @param monitor a progress monitor.
+     * @throws CoreException
+     */
     private void removeDerivedResources(IResource rootResource, boolean deleteRoot,
-            IProgressMonitor monitor)
-            throws CoreException {
+            IProgressMonitor monitor) throws CoreException {
         if (rootResource.exists()) {
+            // if it's a folder, delete derived member.
             if (rootResource.getType() == IResource.FOLDER) {
                 IFolder folder = (IFolder)rootResource;
                 IResource[] members = folder.members();
+                boolean wasNotEmpty = members.length > 0;
                 for (IResource member : members) {
                     removeDerivedResources(member, true /*deleteRoot*/, monitor);
                 }
-            } else if (rootResource.isDerived()) {
-                rootResource.getLocation().toFile().delete();
+
+                // if the folder had content that is now all removed, delete the folder.
+                if (deleteRoot && wasNotEmpty && folder.members().length == 0) {
+                    rootResource.getLocation().toFile().delete();
+                }
             }
 
-            if (deleteRoot) {
+            // if the root resource is derived, delete it.
+            if (rootResource.isDerived()) {
                 rootResource.getLocation().toFile().delete();
             }
         }