diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java | 142 |
1 files changed, 138 insertions, 4 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java index 67934efcf..a813b3abf 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java @@ -25,19 +25,24 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.team.core.subscribers.SyncInfoSetChangeSetCollector; +import org.eclipse.team.core.TeamException; +import org.eclipse.team.core.subscribers.ChangeSet; import org.eclipse.team.core.synchronize.SyncInfo; import org.eclipse.team.core.synchronize.SyncInfoSet; +import org.eclipse.team.core.variants.IResourceVariant; import org.eclipse.team.internal.ccvs.core.CVSCompareSubscriber; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSSyncInfo; import org.eclipse.team.internal.ccvs.core.CVSTag; import org.eclipse.team.internal.ccvs.core.ICVSFile; import org.eclipse.team.internal.ccvs.core.ICVSFolder; +import org.eclipse.team.internal.ccvs.core.ICVSRemoteFile; import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; import org.eclipse.team.internal.ccvs.core.ICVSResource; +import org.eclipse.team.internal.ccvs.core.ILogEntry; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; +import org.eclipse.team.internal.ccvs.core.resources.RemoteResource; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Util; @@ -45,9 +50,12 @@ import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.operations.RemoteLogOperation; import org.eclipse.team.internal.ccvs.ui.operations.RemoteLogOperation.LogEntryCache; +import org.eclipse.team.internal.ccvs.ui.subscriber.ChangeLogModelProvider.CVSUpdatableSyncInfo; import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.ui.synchronize.ISynchronizeManager; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; import org.eclipse.team.ui.synchronize.ISynchronizeParticipant; +import org.eclipse.team.ui.synchronize.SyncInfoSetChangeSetCollector; /** * Collector that fetches the log for incoming CVS change sets @@ -101,8 +109,8 @@ public class CVSChangeSetCollector extends SyncInfoSetChangeSetCollector { } }; - public CVSChangeSetCollector(SyncInfoSet seedSet) { - super(seedSet); + public CVSChangeSetCollector(ISynchronizePageConfiguration configuration) { + super(configuration); } /* (non-Javadoc) @@ -125,7 +133,6 @@ public class CVSChangeSetCollector extends SyncInfoSetChangeSetCollector { // Decide which nodes we have to fetch log histories SyncInfo[] infos = set.getSyncInfos(); ArrayList remoteChanges = new ArrayList(); - ArrayList localChanges = new ArrayList(); for (int i = 0; i < infos.length; i++) { SyncInfo info = infos[i]; if(isRemoteChange(info)) { @@ -364,4 +371,131 @@ public class CVSChangeSetCollector extends SyncInfoSetChangeSetCollector { } super.dispose(); } + + /* + * Add the following sync info elements to the viewer. It is assumed that these elements have associated + * log entries cached in the log operation. + */ + private void addLogEntries(SyncInfo[] commentInfos, LogEntryCache logs, IProgressMonitor monitor) { + try { + monitor.beginTask(null, commentInfos.length * 10); + if (logs != null) { + for (int i = 0; i < commentInfos.length; i++) { + addSyncInfoToCommentNode(commentInfos[i], logs); + monitor.worked(10); + } + } + } finally { + monitor.done(); + } + } + + /* + * Create a node for the given sync info object. The logs should contain the log for this info. + * + * @param info the info for which to create a node in the model + * @param log the cvs log for this node + */ + private void addSyncInfoToCommentNode(SyncInfo info, LogEntryCache logs) { + ICVSRemoteResource remoteResource = getRemoteResource((CVSSyncInfo)info); + if(isTagComparison() && remoteResource != null) { + addMultipleRevisions(info, logs, remoteResource); + } else { + addSingleRevision(info, logs, remoteResource); + } + } + + /* + * Add a single log entry to the model. + * + * @param info + * @param logs + * @param remoteResource + */ + private void addSingleRevision(SyncInfo info, LogEntryCache logs, ICVSRemoteResource remoteResource) { + ILogEntry logEntry = logs.getLogEntry(remoteResource); + // For incoming deletions grab the comment for the latest on the same branch + // which is now in the attic. + try { + String remoteRevision = ((ICVSRemoteFile) remoteResource).getRevision(); + if (isDeletedRemotely(info)) { + ILogEntry[] logEntries = logs.getLogEntries(remoteResource); + for (int i = 0; i < logEntries.length; i++) { + ILogEntry entry = logEntries[i]; + String revision = entry.getRevision(); + if (entry.isDeletion() && ResourceSyncInfo.isLaterRevision(revision, remoteRevision)) { + logEntry = entry; + } + } + } + } catch (TeamException e) { + // continue and skip deletion checks + } + addRemoteChange(info, remoteResource, logEntry); + } + + /* + * Add multiple log entries to the model. + * + * @param info + * @param logs + * @param remoteResource + */ + private void addMultipleRevisions(SyncInfo info, LogEntryCache logs, ICVSRemoteResource remoteResource) { + ILogEntry[] logEntries = logs.getLogEntries(remoteResource); + if(logEntries == null || logEntries.length == 0) { + // If for some reason we don't have a log entry, try the latest + // remote. + addRemoteChange(info, null, null); + } else { + for (int i = 0; i < logEntries.length; i++) { + ILogEntry entry = logEntries[i]; + addRemoteChange(info, remoteResource, entry); + } + } + } + + private boolean isDeletedRemotely(SyncInfo info) { + int kind = info.getKind(); + if(kind == (SyncInfo.INCOMING | SyncInfo.DELETION)) return true; + if(SyncInfo.getDirection(kind) == SyncInfo.CONFLICTING && info.getRemote() == null) return true; + return false; + } + + /* + * Add the remote change to an incoming commit set + */ + private void addRemoteChange(SyncInfo info, ICVSRemoteResource remoteResource, ILogEntry logEntry) { + if(remoteResource != null && logEntry != null && isRemoteChange(info)) { + ChangeSet set = getChangeSetFor(logEntry); + if (set == null) { + set = createChangeSetFor(logEntry); + add(set); + } + if(requiresCustomSyncInfo(info, remoteResource, logEntry)) { + info = new CVSUpdatableSyncInfo(info.getKind(), info.getLocal(), info.getBase(), (RemoteResource)logEntry.getRemoteFile(), ((CVSSyncInfo)info).getSubscriber()); + try { + info.init(); + } catch (TeamException e) { + // this shouldn't happen, we've provided our own calculate kind + } + } + set.add(info); + } else { + // The info was not retrieved for the remote change for some reason. + // Add the node to the root + ChangeSet set = getDefaultChangeSet(); + set.add(info); + } + } + + private boolean requiresCustomSyncInfo(SyncInfo info, ICVSRemoteResource remoteResource, ILogEntry logEntry) { + // Only interested in non-deletions + if (logEntry.isDeletion() || !(info instanceof CVSSyncInfo)) return false; + // Only require a custom sync info if the remote of the sync info + // differs from the remote in the log entry + IResourceVariant remote = info.getRemote(); + if (remote == null) return true; + return !remote.equals(remoteResource); + } } |