Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2003-01-08 20:29:20 +0000
committerMichael Valenta2003-01-08 20:29:20 +0000
commit160c61bd7de448dff3b08298af5c547210ce4a4a (patch)
tree830d63b4aa59acd26683ae75adc33881daf65d2b
parent9b000d59e731cfaf24f8884fbf83128cb8297596 (diff)
downloadeclipse.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
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java34
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ForceCommitSyncAction.java143
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;
}

Back to the top