| /******************************************************************************* |
| * Copyright (c) 2000, 2006 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui.tags; |
| |
| import java.util.*; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.team.core.RepositoryProvider; |
| import org.eclipse.team.core.TeamException; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIMessages; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; |
| |
| /** |
| * Tag source that gets its tags from the projects exist in the workspace |
| */ |
| public class LocalProjectTagSource extends TagSource { |
| |
| public static TagSource create(IProject seedProject) { |
| try { |
| ICVSRemoteFolder seedFolder = ((ICVSRemoteFolder)CVSWorkspaceRoot.getRemoteResourceFor(seedProject)); |
| ICVSRemoteFolder[] remoteFolders = getProjectRemoteFolders(); |
| if (remoteFolders.length == 1) { |
| // There are no other projects to get tags from so return null |
| return null; |
| } |
| return new LocalProjectTagSource(seedFolder, remoteFolders); |
| } catch (CVSException e) { |
| // Log and return null |
| CVSUIPlugin.log(e); |
| return null; |
| } |
| } |
| |
| private ICVSRemoteFolder seedFolder; |
| private ICVSRemoteFolder[] remoteFolders; |
| |
| private LocalProjectTagSource(ICVSRemoteFolder seedFolder, ICVSRemoteFolder[] remoteFolders) { |
| this.seedFolder = seedFolder; |
| this.remoteFolders = remoteFolders; |
| } |
| |
| /* |
| * Return the list of remote folders for the projects in the workspace mapped to the given repository |
| */ |
| private static ICVSRemoteFolder[] getProjectRemoteFolders() { |
| IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); |
| List<ICVSRemoteFolder> result = new ArrayList<>(); |
| for (int i = 0; i < projects.length; i++) { |
| IProject project = projects[i]; |
| try { |
| if (project.isAccessible() && RepositoryProvider.isShared(project)) { |
| ICVSRemoteFolder remote = (ICVSRemoteFolder)CVSWorkspaceRoot.getRemoteResourceFor(project); |
| if (remote != null) { |
| result.add(remote); |
| } |
| } |
| } catch (CVSException e) { |
| // Log and continue |
| CVSUIPlugin.log(e); |
| } |
| } |
| return result.toArray(new ICVSRemoteFolder[result.size()]); |
| } |
| |
| @Override |
| public CVSTag[] refresh(boolean bestEffort, IProgressMonitor monitor) throws TeamException { |
| // This tag source should not be refreshed |
| return new CVSTag[0]; |
| } |
| |
| @Override |
| public ICVSRepositoryLocation getLocation() { |
| return seedFolder.getRepository(); |
| } |
| |
| @Override |
| public String getShortDescription() { |
| return NLS.bind(CVSUIMessages.LocalProjectTagSource_0, new String[] { Integer.toString(remoteFolders.length) }); |
| } |
| |
| @Override |
| public void commit(CVSTag[] tags, boolean replace, IProgressMonitor monitor) throws CVSException { |
| // Does not commit tags |
| } |
| |
| @Override |
| public ICVSResource[] getCVSResources() { |
| return remoteFolders; |
| } |
| |
| @Override |
| public CVSTag[] getTags(int type) { |
| if (type == CVSTag.HEAD || type == BASE) { |
| return super.getTags(type); |
| } |
| // Accumulate the tags for all folders |
| Set<CVSTag> allTags = new HashSet<>(); |
| for (int i = 0; i < remoteFolders.length; i++) { |
| ICVSRemoteFolder folder = remoteFolders[i]; |
| CVSTag[] tags = SingleFolderTagSource.getTags(folder, type); |
| allTags.addAll(Arrays.asList(tags)); |
| } |
| // Exclude the tags for the seedFolder |
| CVSTag[] tags = SingleFolderTagSource.getTags(seedFolder, type); |
| allTags.removeAll(Arrays.asList(tags)); |
| return allTags.toArray(new CVSTag[allTags.size()]); |
| } |
| |
| } |