diff options
author | Michael Valenta | 2003-01-08 20:29:20 +0000 |
---|---|---|
committer | Michael Valenta | 2003-01-08 20:29:20 +0000 |
commit | 160c61bd7de448dff3b08298af5c547210ce4a4a (patch) | |
tree | 830d63b4aa59acd26683ae75adc33881daf65d2b | |
parent | 9b000d59e731cfaf24f8884fbf83128cb8297596 (diff) | |
download | eclipse.platform.team-160c61bd7de448dff3b08298af5c547210ce4a4a.tar.gz eclipse.platform.team-160c61bd7de448dff3b08298af5c547210ce4a4a.tar.xz eclipse.platform.team-160c61bd7de448dff3b08298af5c547210ce4a4a.zip |
27981: [CVS UI] Double updating on commit of new file
2 files changed, 100 insertions, 77 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java index e53a73c38..50491fc79 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java @@ -16,6 +16,7 @@ import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; @@ -24,6 +25,7 @@ import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.ICVSResource; +import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.Policy; @@ -64,18 +66,28 @@ public class CommitAction extends WorkspaceAction { run(new WorkspaceModifyOperation() { public void execute(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - int ticks=100; - monitor.beginTask(null, ticks); try { - if (resourcesToBeAdded[0].length > 0) { - int addTicks = 20; - manager.add(resourcesToBeAdded[0], Policy.subMonitorFor(monitor, addTicks)); - ticks-=addTicks; - } - IResource[] shared = getSharedResources(resources); - if (shared.length == 0) return; - manager.commit(shared, comment[0], Policy.subMonitorFor(monitor,ticks)); - } catch (TeamException e) { + // execute the add and commit in a single CVS runnable so sync changes are batched + CVSWorkspaceRoot.getCVSFolderFor(ResourcesPlugin.getWorkspace().getRoot()).run( + new ICVSRunnable() { + public void run(IProgressMonitor monitor) throws CVSException { + try { + int ticks=100; + monitor.beginTask(null, ticks); + if (resourcesToBeAdded[0].length > 0) { + int addTicks = 20; + manager.add(resourcesToBeAdded[0], Policy.subMonitorFor(monitor, addTicks)); + ticks-=addTicks; + } + IResource[] shared = getSharedResources(resources); + if (shared.length == 0) return; + manager.commit(shared, comment[0], Policy.subMonitorFor(monitor,ticks)); + } catch (TeamException e) { + throw CVSException.wrapException(e); + } + } + }, monitor); + } catch (CVSException e) { throw new InvocationTargetException(e); } finally { monitor.done(); diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ForceCommitSyncAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ForceCommitSyncAction.java index efcb7b60b..774f88586 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ForceCommitSyncAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ForceCommitSyncAction.java @@ -21,6 +21,7 @@ import org.eclipse.compare.structuremergeviewer.Differencer; import org.eclipse.compare.structuremergeviewer.IDiffContainer; import org.eclipse.compare.structuremergeviewer.IDiffElement; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; @@ -30,6 +31,7 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.team.core.TeamException; import org.eclipse.team.core.sync.IRemoteSyncElement; import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; @@ -92,13 +94,13 @@ public class ForceCommitSyncAction extends MergeAction { } // prompt to get comment and any resources to be added to version control - RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager(); + final RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager(); ReleaseCommentDialog dialog = promptForComment(manager, unadded); if (dialog == null) { // User cancelled. return null; } - String comment = dialog.getComment(); + final String comment = dialog.getComment(); // remove unshared resources that were not selected by the user IResource[] toBeAdded = dialog.getResourcesToAdd(); @@ -125,16 +127,16 @@ public class ForceCommitSyncAction extends MergeAction { } } - List commits = new ArrayList(); - List additions = new ArrayList(); - List deletions = new ArrayList(); - List toMerge = new ArrayList(); - List incoming = new ArrayList(); + final List commits = new ArrayList(); + final List additions = new ArrayList(); + final List deletions = new ArrayList(); + final List toMerge = new ArrayList(); + final List incoming = new ArrayList(); // A list of diff elements in the sync set which are incoming folder additions - List parentCreationElements = new ArrayList(); + final List parentCreationElements = new ArrayList(); // A list of diff elements in the sync set which are folder conflicts - List parentConflictElements = new ArrayList(); + final List parentConflictElements = new ArrayList(); for (int i = 0; i < changed.length; i++) { int kind = changed[i].getKind(); @@ -180,66 +182,75 @@ public class ForceCommitSyncAction extends MergeAction { } } try { - if (parentCreationElements.size() > 0) { - // If a node has a parent that is an incoming folder creation, we have to - // create that folder locally and set its sync info before we can get the - // node itself. We must do this for all incoming folder creations (recursively) - // in the case where there are multiple levels of incoming folder creations. - Iterator it = parentCreationElements.iterator(); - while (it.hasNext()) { - makeInSync((IDiffElement)it.next()); - } - } - if (parentConflictElements.size() > 0) { - // If a node has a parent that is a folder conflict, that means that the folder - // exists locally but has no sync info. In order to get the node, we have to - // create the sync info for the folder (and any applicable parents) before we - // get the node itself. - Iterator it = parentConflictElements.iterator(); - while (it.hasNext()) { - makeInSync((IDiffElement)it.next()); - } - } + // execute the operations in a single CVS runnable so sync changes are batched + CVSWorkspaceRoot.getCVSFolderFor(ResourcesPlugin.getWorkspace().getRoot()).run( + new ICVSRunnable() { + public void run(IProgressMonitor monitor) throws CVSException { + try { + if (parentCreationElements.size() > 0) { + // If a node has a parent that is an incoming folder creation, we have to + // create that folder locally and set its sync info before we can get the + // node itself. We must do this for all incoming folder creations (recursively) + // in the case where there are multiple levels of incoming folder creations. + Iterator it = parentCreationElements.iterator(); + while (it.hasNext()) { + makeInSync((IDiffElement)it.next()); + } + } + if (parentConflictElements.size() > 0) { + // If a node has a parent that is a folder conflict, that means that the folder + // exists locally but has no sync info. In order to get the node, we have to + // create the sync info for the folder (and any applicable parents) before we + // get the node itself. + Iterator it = parentConflictElements.iterator(); + while (it.hasNext()) { + makeInSync((IDiffElement)it.next()); + } + } - // Handle any real incomming deletions by unmanaging them before adding - Iterator it = incoming.iterator(); - Set incomingDeletions = new HashSet(incoming.size()); - while (it.hasNext()) { - ITeamNode node = (ITeamNode)it.next(); - collectIncomingDeletions(node, incomingDeletions, monitor); - if ((node instanceof TeamFile) && !additions.contains(node)) { - CVSRemoteSyncElement element = (CVSRemoteSyncElement)((TeamFile)node).getMergeResource().getSyncElement(); - element.makeOutgoing(monitor); - } - } - it = incomingDeletions.iterator(); - while (it.hasNext()) { - ITeamNode node = (ITeamNode)it.next(); - CVSRemoteSyncElement syncElement; - if (node instanceof TeamFile) { - syncElement = (CVSRemoteSyncElement)((TeamFile)node).getMergeResource().getSyncElement(); - } else { - syncElement = (CVSRemoteSyncElement)((ChangedTeamContainer)node).getMergeResource().getSyncElement(); - } - additions.add(syncElement.getLocal()); - CVSWorkspaceRoot.getCVSResourceFor(syncElement.getLocal()).unmanage(null); - } + // Handle any real incomming deletions by unmanaging them before adding + Iterator it = incoming.iterator(); + Set incomingDeletions = new HashSet(incoming.size()); + while (it.hasNext()) { + ITeamNode node = (ITeamNode)it.next(); + collectIncomingDeletions(node, incomingDeletions, monitor); + if ((node instanceof TeamFile) && !additions.contains(node)) { + CVSRemoteSyncElement element = (CVSRemoteSyncElement)((TeamFile)node).getMergeResource().getSyncElement(); + element.makeOutgoing(monitor); + } + } + it = incomingDeletions.iterator(); + while (it.hasNext()) { + ITeamNode node = (ITeamNode)it.next(); + CVSRemoteSyncElement syncElement; + if (node instanceof TeamFile) { + syncElement = (CVSRemoteSyncElement)((TeamFile)node).getMergeResource().getSyncElement(); + } else { + syncElement = (CVSRemoteSyncElement)((ChangedTeamContainer)node).getMergeResource().getSyncElement(); + } + additions.add(syncElement.getLocal()); + CVSWorkspaceRoot.getCVSResourceFor(syncElement.getLocal()).unmanage(null); + } - if (additions.size() != 0) { - manager.add((IResource[])additions.toArray(new IResource[0]), monitor); - } - if (deletions.size() != 0) { - manager.delete((IResource[])deletions.toArray(new IResource[0]), monitor); - } - if (toMerge.size() != 0) { - manager.merged((IRemoteSyncElement[])toMerge.toArray(new IRemoteSyncElement[0])); + if (additions.size() != 0) { + manager.add((IResource[])additions.toArray(new IResource[0]), monitor); + } + if (deletions.size() != 0) { + manager.delete((IResource[])deletions.toArray(new IResource[0]), monitor); + } + if (toMerge.size() != 0) { + manager.merged((IRemoteSyncElement[])toMerge.toArray(new IRemoteSyncElement[0])); + } + manager.commit((IResource[])commits.toArray(new IResource[commits.size()]), comment, monitor); + } catch (TeamException e) { + throw CVSException.wrapException(e); + } + } + }, monitor); + } catch (CVSException e) { + handle(e); + return null; } - manager.commit((IResource[])commits.toArray(new IResource[commits.size()]), comment, monitor); - - } catch (final TeamException e) { - handle(e); - return null; - } return syncSet; } |