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