Mark Phippard wrote:
>> I wasn't, but i just had another very quick go and it looks like you can
>> remove the status refresh from the add command entirely.
>>     
>
> Can you commit this and the Annotate patch?
>   
I have commited the annotation patch, but i am a bit uneasy about the 
change to the add operation.  I have another patch that uses recursive 
adds where possible.  It has passed all of my testing, but i would 
prefer it if someone else had a look.  It is a very non trivial change 
and makes assumption about the resources being passed in (they do not 
overlap).  The patch is attached to this email.
Index: D:/data/eclipse/workspace/core/src/org/tigris/subversion/subclipse/core/commands/AddResourcesCommand.java
===================================================================
--- D:/data/eclipse/workspace/core/src/org/tigris/subversion/subclipse/core/commands/AddResourcesCommand.java	(revision 2099)
+++ D:/data/eclipse/workspace/core/src/org/tigris/subversion/subclipse/core/commands/AddResourcesCommand.java	(working copy)
@@ -9,14 +9,14 @@
  *******************************************************************************/
 package org.tigris.subversion.subclipse.core.commands;
 
-import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -61,14 +61,14 @@
         public void run(IProgressMonitor monitor) throws SVNException {
         monitor = Policy.monitorFor(monitor);
         
-        // Visit the children of the resources using the depth in order to
-        // determine which folders, text files and binary files need to be added
-        // A TreeSet is needed for the folders so they are in the right order (i.e. parents created before children)
-        final SortedSet folders = new TreeSet();
-        // Sets are required for the files to ensure that files will not appear twice if there parent was added as well
-        // and the depth isn't zero
-        final HashSet files = new HashSet();
         
+        // Resoruces that were selected for addition.
+        // In the case of folders, they will be recursively added if the depth is infinite
+        List addedFiles = new ArrayList();
+        List addedFolders = new ArrayList();
+        
+        final SortedSet autoAddedFolders = new TreeSet();
+        
         for (int i=0; i<resources.length; i++) {
             
             final IResource currentResource = resources[i];
@@ -78,68 +78,65 @@
                 IContainer parent = currentResource.getParent();
                 ISVNLocalResource svnParentResource = SVNWorkspaceRoot.getSVNResourceFor(parent);
                 while (parent.getType() != IResource.ROOT && parent.getType() != IResource.PROJECT && ! svnParentResource.isManaged()) {
-                    folders.add(svnParentResource);
+                	autoAddedFolders.add(svnParentResource);
                     parent = parent.getParent();
                     svnParentResource = svnParentResource.getParent();
                 }
-                    
-                // Auto-add children accordingly to depth
-                final SVNException[] exception = new SVNException[] { null };
-                currentResource.accept(new IResourceVisitor() {
-                    public boolean visit(IResource resource) {
-                        try {
-                            ISVNLocalResource mResource = SVNWorkspaceRoot.getSVNResourceFor(resource);
-                            // Add the resource is its not already managed and it was either
-                            // added explicitly (is equal currentResource) or is not ignored
-                            if ((! mResource.isManaged()) && (currentResource.equals(resource) || ! mResource.isIgnored())) {
-                                if (resource.getType() == IResource.FILE) {
-                                    files.add(mResource);
-                                } else {
-                                    folders.add(mResource);
-                                }
-                            }
-                            // Always return true and let the depth determine if children are visited
-                            return true;
-                        } catch (SVNException e) {
-                            exception[0] = e;
-                            return false;
-                        }
+
+                ISVNLocalResource mResource = SVNWorkspaceRoot.getSVNResourceFor(currentResource);
+                // Add the resource is its not already managed and it was either
+                // added explicitly (is equal currentResource) or is not ignored
+                if ((! mResource.isManaged()) || ! mResource.isIgnored()) {
+                    if (currentResource.getType() == IResource.FILE) {
+                        addedFiles.add(mResource);
+                    } else {
+                        addedFolders.add(mResource);
                     }
-                }, depth, false);
-                if (exception[0] != null) {
-                    throw exception[0];
                 }
+                
             } catch (CoreException e) {
                 throw new SVNException(new Status(IStatus.ERROR, SVNProviderPlugin.ID, TeamException.UNABLE, Policy.bind("SVNTeamProvider.visitError", new Object[] {resources[i].getFullPath()}), e)); //$NON-NLS-1$
             }
         } // for
-        // If an exception occured during the visit, throw it here
 
         // Add the folders, followed by files!
         ISVNClientAdapter svnClient = root.getRepository().getSVNClient();
-        monitor.beginTask(null, files.size() * 10 + (folders.isEmpty() ? 0 : 10));
+        monitor.beginTask(null, addedFiles.size() + autoAddedFolders.size() + (addedFolders.size() * 10));
         OperationManager.getInstance().beginOperation(svnClient);
         try {
-            for(Iterator it=folders.iterator(); it.hasNext();) {
+            for(Iterator it=autoAddedFolders.iterator(); it.hasNext();) {
                 final ISVNLocalResource localResource = (ISVNLocalResource)it.next();
   
                 try {
                     svnClient.addDirectory(localResource.getIResource().getLocation().toFile(),false);
-                    localResource.refreshStatus();
+                    monitor.worked(1);
                 } catch (SVNClientException e) {
                     throw SVNException.wrapException(e);
                 }
             }
+            
+            for(Iterator it=addedFolders.iterator(); it.hasNext();) {
+                final ISVNLocalResource localResource = (ISVNLocalResource)it.next();
+  
+                try {
+                    svnClient.addDirectory(localResource.getIResource().getLocation().toFile(), (depth == IResource.DEPTH_INFINITE));
+                    monitor.worked(10);
+                } catch (SVNClientException e) {
+                    throw SVNException.wrapException(e);
+                }
+            }
 
-            for(Iterator it=files.iterator(); it.hasNext();) {
+            for(Iterator it=addedFiles.iterator(); it.hasNext();) {
                 final ISVNLocalResource localResource = (ISVNLocalResource)it.next();
   
                 try {
                     svnClient.addFile(localResource.getIResource().getLocation().toFile());
                     // If file has read-only attribute set, remove it
-                    if (localResource.getIResource().getType() == IResource.FILE && localResource.getIResource().isReadOnly())
+                    if (localResource.getIResource().getType() == IResource.FILE && localResource.getIResource().isReadOnly()) {
                         localResource.getIResource().setReadOnly(false);
-                    localResource.refreshStatus();
+                    }
+                    
+                    monitor.worked(1);
                 } catch (SVNClientException e) {
                     throw SVNException.wrapException(e);
                 }    
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subclipse.tigris.org
For additional commands, e-mail: dev-help@subclipse.tigris.org
Received on Sun Feb 26 02:21:10 2006