blob: 1d8691f1444c25434e6e2a241cd36453c6b080ad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.mappings;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.diff.IDiff;
import org.eclipse.team.core.diff.IThreeWayDiff;
import org.eclipse.team.core.history.IFileRevision;
import org.eclipse.team.core.mapping.ISynchronizationScopeManager;
import org.eclipse.team.core.mapping.provider.ResourceDiffTree;
import org.eclipse.team.core.subscribers.Subscriber;
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.syncinfo.*;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ui.Utils;
public class MergeSubscriberContext extends CVSSubscriberMergeContext {
public static MergeSubscriberContext createContext(ISynchronizationScopeManager manager, Subscriber subscriber) {
MergeSubscriberContext mergeContext = new MergeSubscriberContext(subscriber, manager);
mergeContext.initialize();
return mergeContext;
}
private boolean cancel = true;
public MergeSubscriberContext(Subscriber subscriber, ISynchronizationScopeManager manager) {
super(subscriber, manager);
}
/* (non-Javadoc)
* @see org.eclipse.team.core.mapping.IMergeContext#markAsMerged(org.eclipse.team.core.diff.IDiffNode, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
public void markAsMerged(final IDiff diff, boolean inSyncHint, IProgressMonitor monitor) throws CoreException {
run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
((CVSMergeSubscriber)getSubscriber()).merged(new IResource[] { getDiffTree().getResource(diff)});
}
}, getMergeRule(diff), IResource.NONE, monitor);
}
public void markAsMerged(final IDiff[] diffs, boolean inSyncHint, IProgressMonitor monitor) throws CoreException {
run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
List result = new ArrayList();
for (int i = 0; i < diffs.length; i++) {
IDiff diff = diffs[i];
result.add(getDiffTree().getResource(diff));
}
((CVSMergeSubscriber)getSubscriber()).merged((IResource[]) result.toArray(new IResource[result.size()]));
}
}, getMergeRule(diffs), IResource.NONE, monitor);
}
public void dispose() {
if (cancel)
((CVSMergeSubscriber)getSubscriber()).cancel();
super.dispose();
}
public void setCancelSubscriber(boolean b) {
cancel = b;
}
public IStatus merge(final IDiff diff, final boolean ignoreLocalChanges, IProgressMonitor monitor) throws CoreException {
final IStatus[] status = new IStatus[] { Status.OK_STATUS };
run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IThreeWayDiff currentDiff = (IThreeWayDiff)getSubscriber().getDiff(getDiffTree().getResource(diff));
if (!MergeSubscriberContext.this.equals(currentDiff, (IThreeWayDiff)diff)) {
throw new CVSException(NLS.bind(CVSUIMessages.CVSMergeContext_1, diff.getPath()));
}
status[0] = MergeSubscriberContext.super.merge(diff, ignoreLocalChanges, monitor);
if (status[0].isOK()) {
IResource resource = ResourceDiffTree.getResourceFor(diff);
if (resource.getType() == IResource.FILE && resource.exists() && diff instanceof IThreeWayDiff) {
IThreeWayDiff twd = (IThreeWayDiff) diff;
if (twd.getKind() == IDiff.ADD && twd.getDirection() == IThreeWayDiff.INCOMING) {
IFileRevision remote = Utils.getRemote(diff);
IResourceVariant variant = (IResourceVariant)Utils.getAdapter(remote, IResourceVariant.class);
byte[] syncBytes = variant.asBytes();
MutableResourceSyncInfo info = new MutableResourceSyncInfo(resource.getName(), ResourceSyncInfo.ADDED_REVISION);
info.setKeywordMode(ResourceSyncInfo.getKeywordMode(syncBytes));
info.setTag(getTag(resource.getParent()));
CVSWorkspaceRoot.getCVSFileFor((IFile)resource).setSyncInfo(info, ICVSFile.DIRTY);
}
}
}
}
}, getMergeRule(diff), IWorkspace.AVOID_UPDATE, monitor);
return status[0];
}
CVSTag getTag(IContainer parent) throws CVSException {
ICVSFolder folder = CVSWorkspaceRoot.getCVSFolderFor(parent);
FolderSyncInfo info = folder.getFolderSyncInfo();
if (info != null)
return info.getTag();
return null;
}
boolean equals(IThreeWayDiff currentDiff, IThreeWayDiff otherDiff) {
return currentDiff.getKind() == otherDiff.getKind()
&& currentDiff.getDirection() == otherDiff.getDirection();
}
}