blob: 60e423cabeb2e16bcf30f1528ce209f44bb1d3c3 [file] [log] [blame]
/*******************************************************************************
* 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.subscriber;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.synchronize.SyncInfo;
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ui.IPreferenceIds;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability;
import org.eclipse.team.internal.ui.synchronize.IChangeSetProvider;
import org.eclipse.team.ui.synchronize.*;
/**
* Superclass for all CVS particpants (workspace, merge and compare)
*/
public class CVSParticipant extends SubscriberParticipant implements IChangeSetProvider {
private CVSChangeSetCapability capability;
@Override
protected void initializeConfiguration(ISynchronizePageConfiguration configuration) {
super.initializeConfiguration(configuration);
// The decorator adds itself to the configuration
ILabelDecorator labelDecorator = new CVSParticipantLabelDecorator(configuration);
configuration.addLabelDecorator(labelDecorator);
}
@Override
public void prepareCompareInput(ISynchronizeModelElement element, CompareConfiguration config, IProgressMonitor monitor) throws TeamException {
monitor.beginTask(null, 100);
deriveBaseContentsFromLocal(element, Policy.subMonitorFor(monitor, 10));
super.prepareCompareInput(element, config, Policy.subMonitorFor(monitor, 80));
updateLabelsForCVS(element, config, Policy.subMonitorFor(monitor, 10));
monitor.done();
}
/**
* Helper method for updating compare editor labels
*/
protected static void updateLabelsForCVS(ISynchronizeModelElement element, CompareConfiguration config, IProgressMonitor monitor) {
// Add the author to the remote or base
if (TeamUIPlugin.getPlugin().getPreferenceStore().getBoolean(IPreferenceIds.SHOW_AUTHOR_IN_COMPARE_EDITOR)) {
SyncInfo info = getSyncInfo(element);
if (info != null) {
final IResourceVariant remote = info.getRemote();
final IResourceVariant base = info.getBase();
String remoteAuthor = null;
if (remote != null && !remote.isContainer()) {
try {
ILogEntry entry = ((ICVSRemoteFile)remote).getLogEntry(monitor);
remoteAuthor = entry.getAuthor();
config.setRightLabel(NLS.bind(CVSUIMessages.CVSParticipant_0, new String[] { remote.getContentIdentifier(), remoteAuthor }));
} catch (TeamException e) {
CVSUIPlugin.log(e);
}
}
if (base != null && !base.isContainer()) {
try {
String baseAuthor;
if (remoteAuthor != null && remote.getContentIdentifier().equals(base.getContentIdentifier())) {
baseAuthor = remoteAuthor;
} else {
ILogEntry entry = ((ICVSRemoteFile)base).getLogEntry(monitor);
baseAuthor = entry.getAuthor();
}
config.setAncestorLabel(NLS.bind(CVSUIMessages.CVSParticipant_1, new String[] { base.getContentIdentifier(), baseAuthor }));
} catch (TeamException e) {
CVSUIPlugin.log(e);
}
}
}
}
}
protected static SyncInfo getSyncInfo(ISynchronizeModelElement element) {
if (element instanceof IAdaptable) {
return ((IAdaptable)element).getAdapter(SyncInfo.class);
}
return null;
}
/**
* If the local is not modified and the base matches the local then
* cache the local contents as the contents of the base.
* @param element
* @throws CoreException
* @throws TeamException
*/
public static void deriveBaseContentsFromLocal(ISynchronizeModelElement element, IProgressMonitor monitor) throws TeamException {
SyncInfo info = getSyncInfo(element);
if (info == null)
return;
// We need a base that is a file and a local that is a file
IResource local = info.getLocal();
IResourceVariant base = info.getBase();
if (base == null || base.isContainer() || local.getType() != IResource.FILE || !local.exists())
return;
// We can only use the local contents for incoming changes.
// Outgoing or conflicting changes imply that the local has changed
if ((info.getKind() & SyncInfo.DIRECTION_MASK) != SyncInfo.INCOMING)
return;
try {
RemoteFile remoteFile = (RemoteFile)base;
if (!remoteFile.isContentsCached())
(remoteFile).setContents((IFile)local, monitor);
} catch (CoreException e) {
if (e.getStatus().getCode() == IResourceStatus.RESOURCE_NOT_FOUND) {
// The file must have just been deleted
return;
}
throw CVSException.wrapException(e);
}
}
@Override
public PreferencePage[] getPreferencePages() {
return addCVSPreferencePages(super.getPreferencePages());
}
public static PreferencePage[] addCVSPreferencePages(PreferencePage[] inheritedPages) {
PreferencePage[] pages = new PreferencePage[inheritedPages.length + 1];
for (int i = 0; i < inheritedPages.length; i++) {
pages[i] = inheritedPages[i];
}
pages[pages.length - 1] = new ComparePreferencePage();
pages[pages.length - 1].setTitle(CVSUIMessages.CVSParticipant_2);
return pages;
}
@Override
public ChangeSetCapability getChangeSetCapability() {
if (capability == null) {
capability = createChangeSetCapability();
}
return capability;
}
/**
* Create the change set capability for this particpant.
* @return the created capability
*/
protected CVSChangeSetCapability createChangeSetCapability() {
return new CVSChangeSetCapability();
}
@Override
protected boolean isViewerContributionsSupported() {
return true;
}
}