Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchAllMembersOperation.java')
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchAllMembersOperation.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchAllMembersOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchAllMembersOperation.java
new file mode 100644
index 000000000..89af326cc
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchAllMembersOperation.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ccvs.ui.operations;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.internal.ccvs.core.*;
+import org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry;
+import org.eclipse.team.internal.ccvs.core.client.listeners.LogListener;
+import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
+import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree;
+import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
+import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.team.internal.ccvs.ui.model.RemoteContentProvider;
+import org.eclipse.team.internal.ccvs.ui.operations.RemoteLogOperation.LogEntryCache;
+import org.eclipse.team.internal.ccvs.ui.repo.RepositoriesView;
+import org.eclipse.team.internal.ui.Utils;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class FetchAllMembersOperation extends RemoteOperation {
+
+ class RLogTreeBuilder {
+
+ private ICVSRepositoryLocation location;
+ private RemoteFolderTree tree;
+ private CVSTag tag;
+
+ public RLogTreeBuilder(ICVSRepositoryLocation location, CVSTag tag) {
+ this.tag = tag;
+ this.location = location;
+ reset();
+ }
+
+ public RemoteFolderTree getTree() {
+ return tree;
+ }
+
+ /**
+ * Reset the builder to prepare for a new build
+ */
+ public void reset() {
+ tree = new RemoteFolderTree(null, location, ICVSRemoteFolder.REPOSITORY_ROOT_FOLDER_NAME, tag);
+ tree.setChildren(new ICVSRemoteResource[0]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.team.internal.ccvs.core.client.listeners.RDiffSummaryListener.IFileDiffListener#newFile(java.lang.String, java.lang.String)
+ */
+ public void newFile(IPath remoteFilePath, ICVSRemoteFile remoteFile) {
+ try {
+ addFile(tree,tag,remoteFile, remoteFilePath);
+ } catch (CVSException e) {
+ CVSUIPlugin.log(e);
+ }
+ }
+
+ private void addFile(RemoteFolderTree tree, CVSTag tag, ICVSRemoteFile file,IPath filePath) throws CVSException {
+ RemoteFolderTree parent = (RemoteFolderTree)getFolder(tree, tag, filePath.removeLastSegments(1), Path.EMPTY);
+ addChild(parent, file);
+ }
+
+ private void addChild(RemoteFolderTree tree, ICVSRemoteResource resource) {
+ ICVSRemoteResource[] children = tree.getChildren();
+ ICVSRemoteResource[] newChildren;
+ if (children == null) {
+ newChildren = new ICVSRemoteResource[] { resource };
+ } else {
+ newChildren = new ICVSRemoteResource[children.length + 1];
+ System.arraycopy(children, 0, newChildren, 0, children.length);
+ newChildren[children.length] = resource;
+ }
+ tree.setChildren(newChildren);
+ }
+
+ /*
+ * Get the folder at the given path in the given tree, creating any missing folders as needed.
+ */
+ private ICVSRemoteFolder getFolder(RemoteFolderTree tree, CVSTag tag, IPath remoteFolderPath, IPath parentPath) throws CVSException {
+ if (remoteFolderPath.segmentCount() == 0) return tree;
+ String name = remoteFolderPath.segment(0);
+ ICVSResource child;
+ IPath childPath = parentPath.append(name);
+ if (tree.childExists(name)) {
+ child = tree.getChild(name);
+ } else {
+ child = new RemoteFolderTree(tree, tree.getRepository(), childPath.toString(), tag);
+ ((RemoteFolderTree)child).setChildren(new ICVSRemoteResource[0]);
+ addChild(tree, (ICVSRemoteResource)child);
+ }
+ return getFolder((RemoteFolderTree)child, tag, remoteFolderPath.removeFirstSegments(1), childPath);
+ }
+ }
+
+ static final String DEAD_STATE = "dead"; //$NON-NLS-1$
+ ICVSRepositoryLocation repoLocation;
+
+ public FetchAllMembersOperation(IWorkbenchPart part, ICVSRemoteResource[] folders, ICVSRepositoryLocation repoLocation) {
+ super(part, folders);
+ this.repoLocation = repoLocation;
+ }
+
+ protected void execute(IProgressMonitor monitor) throws CVSException, InterruptedException {
+ //expand each folder selected in the tree
+ ICVSRemoteResource[] restest = getRemoteResources();
+ ICVSRemoteFolder testfolder = (ICVSRemoteFolder) restest[0];
+ CVSTag tag = testfolder.getTag();
+ if (tag == null)
+ tag = CVSTag.DEFAULT;
+ LogEntryCache cache = new LogEntryCache();
+
+ RemoteLogOperation operation = new RemoteLogOperation(getPart(), getRemoteResources(), tag, null, cache);
+ try {
+ operation.run(monitor);
+ ICVSRemoteResource[] remoteRes = getRemoteResources();
+ final ICVSRemoteFolder project = (ICVSRemoteFolder) remoteRes[0];
+ //Get the entry paths
+ String[] entry = cache.getCachedFilePaths();
+ //Strip repo + project info from entries
+ RLogTreeBuilder treeBuilder = new RLogTreeBuilder(project.getRepository(),tag);
+ for (int i = 0; i < entry.length; i++) {
+ ILogEntry[] logEntry = cache.getLogEntries(entry[i]);
+
+ //might not have state if this a branch entry
+ if (logEntry[0].getState() != null &&
+ logEntry[0].getState().equals(DEAD_STATE))
+ continue;
+
+
+ ICVSRemoteFile remoteFile = logEntry[0].getRemoteFile();
+ //if the current folder tag is a branch tag, we need to take the extra step
+ //of making sure that the file's revision number has been set appropriately
+ if (tag.getType() == CVSTag.BRANCH &&
+ remoteFile.getRevision().equals(LogListener.BRANCH_REVISION))
+ verifyRevision(tag, logEntry[0], remoteFile);
+
+ IPath logPath = new Path(null,remoteFile.getRepositoryRelativePath());
+ if (logPath.segmentCount()>0)
+ logPath = logPath.removeFirstSegments(1);
+
+ treeBuilder.newFile(logPath, remoteFile);
+ }
+
+ RemoteFolderTree remoteTree = treeBuilder.getTree();
+ IWorkbenchPart part = this.getPart();
+ if (part instanceof RepositoriesView ){
+ final RepositoriesView repView = (RepositoriesView) part;
+ RemoteContentProvider prov = repView.getContentProvider();
+ prov.addCachedTree(project, remoteTree);
+ final TreeViewer tree = repView.getViewer();
+
+ Utils.asyncExec( new Runnable() {
+ public void run() {
+ tree.expandToLevel(project, AbstractTreeViewer.ALL_LEVELS);
+ }
+ }, repView.getViewer());
+ }
+
+ } catch (InvocationTargetException e) {
+ throw CVSException.wrapException(e);
+ } catch (InterruptedException e) {
+ // Ignore;
+ } catch (TeamException e){
+ throw CVSException.wrapException(e);
+ }
+
+ }
+
+ private void verifyRevision(CVSTag tag, ILogEntry entry, ICVSRemoteFile remoteFile) throws CVSException {
+ if (entry instanceof LogEntry){
+ LogEntry logEntry = (LogEntry) entry;
+ String[] allBranchRevisions = logEntry.getBranchRevisions();
+ CVSTag[] allCVSTags = entry.getTags();
+ for (int i = 0; i < allCVSTags.length; i++) {
+ if (allCVSTags[i].equals(tag)){
+ //get the revision number stored for this tag
+ ((RemoteFile) remoteFile).setRevision(allBranchRevisions[i]);
+ break;
+ }
+ }
+ }
+ }
+
+ protected String getTaskName() {
+ return CVSUIMessages.FetchAllMembersOperation_0;
+ }
+
+
+}

Back to the top