Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java')
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java358
1 files changed, 0 insertions, 358 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java
deleted file mode 100644
index dbafcd3a6..000000000
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.core;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.team.core.TeamException;
-import org.eclipse.team.core.subscribers.*;
-import org.eclipse.team.internal.ccvs.core.client.Update;
-import org.eclipse.team.internal.ccvs.core.resources.*;
-import org.eclipse.team.internal.ccvs.core.syncinfo.*;
-import org.eclipse.team.internal.ccvs.core.util.Assert;
-import org.eclipse.team.internal.ccvs.core.Policy;
-
-/**
- * CVSSyncInfo
- */
-public class CVSSyncInfo extends SyncInfo {
-
- /*
- * Codes that are used in returned IStatus
- */
- private static final int INVALID_RESOURCE_TYPE = 1;
- private static final int INVALID_SYNC_KIND = 2;
- private static final int PARENT_NOT_MANAGED = 3;
- private static final int REMOTE_DOES_NOT_EXIST = 4;
- private static final int SYNC_INFO_CONFLICTS = 5;
-
- public CVSSyncInfo(IResource local, ISubscriberResource base, ISubscriberResource remote, TeamSubscriber subscriber) throws TeamException {
- super(local, base, remote, subscriber);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.core.sync.SyncInfo#computeSyncKind(org.eclipse.core.runtime.IProgressMonitor)
- */
- protected int calculateKind() throws TeamException {
- // special handling for folders, the generic sync algorithm doesn't work well
- // with CVS because folders are not in namespaces (e.g. they exist in all versions
- // and branches).
- IResource local = getLocal();
- if(local.getType() != IResource.FILE) {
- int folderKind = SyncInfo.IN_SYNC;
- ICVSRemoteFolder remote = (ICVSRemoteFolder)getRemote();
- ICVSFolder cvsFolder = CVSWorkspaceRoot.getCVSFolderFor((IContainer)local);
- boolean isCVSFolder = false;
- try {
- isCVSFolder = cvsFolder.isCVSFolder();
- } catch (CVSException e) {
- // Assume the folder is not a CVS folder
- }
- if(!local.exists()) {
- if(remote != null) {
- if (isCVSFolder) {
- // TODO: This assumes all CVS folders are in-sync even if they have been pruned!
- folderKind = SyncInfo.IN_SYNC;
- } else {
- folderKind = SyncInfo.INCOMING | SyncInfo.ADDITION;
- }
- } else {
- // ignore conflicting deletion to keep phantom sync info
- }
- } else {
- if(remote == null) {
- if(isCVSFolder) {
- // TODO: This is not really an incoming deletion
- // The folder will be pruned once any children are commited
- folderKind = SyncInfo.IN_SYNC;
- //folderKind = SyncInfo.INCOMING | SyncInfo.DELETION;
- } else {
- folderKind = SyncInfo.OUTGOING | SyncInfo.ADDITION;
- }
- } else if(!isCVSFolder) {
- folderKind = SyncInfo.CONFLICTING | SyncInfo.ADDITION;
- } else {
- // folder exists both locally and remotely and are considered in sync, however
- // we aren't checking the folder mappings to ensure that they are the same.
- }
- }
- return folderKind;
- }
-
- // 1. Run the generic sync calculation algorithm, then handle CVS specific
- // sync cases.
- int kind = super.calculateKind();
-
- // 2. Set the CVS specific sync type based on the workspace sync state provided
- // by the CVS server.
- ISubscriberResource remote = getRemote();
- if(remote!=null && (kind & SyncInfo.PSEUDO_CONFLICT) == 0) {
- RemoteResource cvsRemote = (RemoteResource)remote;
- int type = cvsRemote.getWorkspaceSyncState();
- switch(type) {
- // the server compared both text files and decided that it cannot merge
- // them without line conflicts.
- case Update.STATE_CONFLICT:
- return kind | SyncInfo.MANUAL_CONFLICT;
-
- // the server compared both text files and decided that it can safely merge
- // them without line conflicts.
- case Update.STATE_MERGEABLE_CONFLICT:
- return kind | SyncInfo.AUTOMERGE_CONFLICT;
- }
- }
-
- // 3. unmanage delete/delete conflicts and return that they are in sync
- kind = handleDeletionConflicts(kind);
-
- return kind;
- }
-
- /*
- * If the resource has a delete/delete conflict then ensure that the local is unmanaged so that the
- * sync info can be properly flushed.
- */
- protected int handleDeletionConflicts(int kind) {
- if(kind == (SyncInfo.CONFLICTING | SyncInfo.DELETION | SyncInfo.PSEUDO_CONFLICT)) {
- try {
- IResource local = getLocal();
- ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(local);
- if(!cvsResource.isFolder() && cvsResource.isManaged()) {
- cvsResource.unmanage(null);
- }
- return SyncInfo.IN_SYNC;
- } catch(CVSException e) {
- CVSProviderPlugin.log(e);
- return SyncInfo.CONFLICTING | SyncInfo.DELETION;
- }
- }
- return kind;
- }
-
- /*
- * Update the sync info of the local resource in such a way that the local changes can be committed.
- * @return IStatus
- * For folders, the makeInSYnc method is called and the return codes mentioned there apply
- * for folders.
- */
- public IStatus makeOutgoing(IProgressMonitor monitor) throws TeamException {
-
- // For folders, there is no outgoing, only in-sync
- if (getLocal().getType() == IResource.FOLDER) {
- return makeInSync();
- }
- int syncKind = getKind();
- boolean incoming = (syncKind & DIRECTION_MASK) == INCOMING;
- boolean outgoing = (syncKind & DIRECTION_MASK) == OUTGOING;
-
- ICVSResource local = CVSWorkspaceRoot.getCVSResourceFor(getLocal());
- RemoteResource remote = (RemoteResource)getRemote();
- ResourceSyncInfo origInfo = local.getSyncInfo();
- MutableResourceSyncInfo info = null;
- if(origInfo!=null) {
- info = origInfo.cloneMutable();
- }
-
- if (outgoing) {
- // The sync info is alright, it's already outgoing!
- return Status.OK_STATUS;
- } else if (incoming) {
- // We have an incoming change, addition, or deletion that we want to ignore
- if (local.exists()) {
- // We could have an incoming change or deletion
- if (remote == null) {
- info.setAdded();
- } else {
- // Otherwise change the revision to the remote revision and dirty the file
- info.setRevision(remote.getSyncInfo().getRevision());
- info.setTimeStamp(null);
- }
- } else {
- // We have an incoming add, turn it around as an outgoing delete
- info = remote.getSyncInfo().cloneMutable();
- info.setDeleted(true);
- }
- } else if (local.exists()) {
- // We have a conflict and a local resource!
- if (getRemote() != null) {
- if (getBase() != null) {
- // We have a conflicting change, Update the local revision
- info.setRevision(remote.getSyncInfo().getRevision());
- } else {
- // We have conflictin additions.
- // We need to fetch the contents of the remote to get all the relevant information (timestamp, permissions)
- // The most important thing we get is the keyword substitution mode which must be right to perform the commit
- remote.getContents(Policy.monitorFor(monitor));
- info = remote.getSyncInfo().cloneMutable();
- }
- } else if (getBase() != null) {
- // We have a remote deletion. Make the local an addition
- info.setAdded();
- } else {
- // There's a local, no base and no remote. We can't possible have a conflict!
- Assert.isTrue(false);
- }
- } else {
- // We have a conflict and there is no local!
- if (getRemote() != null) {
- // We have a local deletion that conflicts with remote changes.
- info.setRevision(remote.getSyncInfo().getRevision());
- info.setDeleted(true);
- } else {
- // We have conflicting deletions. Clear the sync info
- info = null;
- return Status.OK_STATUS;
- }
- }
- if(info!=null) {
- FolderSyncInfo parentInfo = local.getParent().getFolderSyncInfo();
- if (parentInfo == null) {
- return new CVSStatus(IStatus.ERROR, PARENT_NOT_MANAGED, Policy.bind("CVSSyncInfo.9", getLocal().getFullPath().toString())); //$NON-NLS-1$
- }
- info.setTag(parentInfo.getTag());
- }
- ((ICVSFile)local).setSyncInfo(info, ICVSFile.UNKNOWN);
- return Status.OK_STATUS;
- }
-
- /*
- * Update the sync info of the local resource in such a way that the remote resource can be loaded
- * ignore any local changes.
- */
- public void makeIncoming(IProgressMonitor monitor) throws TeamException {
- // To make outgoing deletions incoming, the local will not exist but
- // it is still important to unmanage (e.g. delete all meta info) for the
- // deletion.
- CVSWorkspaceRoot.getCVSResourceFor(getLocal()).unmanage(monitor);
- }
-
- /*
- * Load the resource and folder sync info into the local from the remote
- *
- * This method can be used on incoming folder additions to set the folder sync info properly
- * without hitting the server again. It also applies to conflicts that involves unmanaged
- * local resources.
- *
- * @return an IStatus with the following severity and codes
- * <ul>
- * <li>IStatus.WARNING
- * <ul>
- * <li>INVALID_RESOURCE_TYPE - makeInSync only works on folders
- * <li>INVALID_SYNC_KIND - sync direction must be incoming or conflicting
- * </ul>
- * <li>IStatus.ERROR
- * <ul>
- * <li>PARENT_NOT_MANAGED - the local parent of the resource is not under CVS control
- * <li>SYNC_INFO_CONFLICTS - Sync info already exists locally and differs from the info
- * in the remote handle.
- * <li>REMOTE_DOES_NOT_EXIST - There is no local sync info and there is no remote handle
- * </ul>
- * </ul>
- */
- public IStatus makeInSync() throws CVSException {
-
- // Only works on folders
- if (getLocal().getType() == IResource.FILE) {
- return new CVSStatus(IStatus.WARNING, INVALID_RESOURCE_TYPE, Policy.bind("CVSSyncInfo.7", getLocal().getFullPath().toString())); //$NON-NLS-1$
- }
-
- // Only works on outgoing and conflicting changes
- boolean outgoing = (getKind() & DIRECTION_MASK) == OUTGOING;
- if (outgoing) {
- return new CVSStatus(IStatus.WARNING, INVALID_SYNC_KIND, Policy.bind("CVSSyncInfo.8", getLocal().getFullPath().toString())); //$NON-NLS-1$
- }
-
- // The parent must be managed
- ICVSFolder local = CVSWorkspaceRoot.getCVSFolderFor((IContainer)getLocal());
- if (getLocal().getType() == IResource.FOLDER && ! local.getParent().isCVSFolder())
- return new CVSStatus(IStatus.ERROR, PARENT_NOT_MANAGED, Policy.bind("CVSSyncInfo.9", getLocal().getFullPath().toString())); //$NON-NLS-1$
-
- // Ensure that the folder exists locally
- if (! local.exists()) {
- local.mkdir();
- }
-
- // If the folder already has CVS info, check that the remote and local match
- RemoteFolder remote = (RemoteFolder)getRemote();
- if((local.isManaged() || getLocal().getType() == IResource.PROJECT) && local.isCVSFolder()) {
- // If there's no remote, assume everything is OK
- if (remote == null) return Status.OK_STATUS;
- // Verify that the root and repository are the same
- FolderSyncInfo remoteInfo = remote.getFolderSyncInfo();
- FolderSyncInfo localInfo = local.getFolderSyncInfo();
- if ( ! localInfo.getRoot().equals(remoteInfo.getRoot())) {
- return new CVSStatus(IStatus.ERROR, SYNC_INFO_CONFLICTS, Policy.bind("CVSRemoteSyncElement.rootDiffers", new Object[] {local.getName(), remoteInfo.getRoot(), localInfo.getRoot()}));//$NON-NLS-1$
- } else if ( ! localInfo.getRepository().equals(remoteInfo.getRepository())) {
- return new CVSStatus(IStatus.ERROR, SYNC_INFO_CONFLICTS, Policy.bind("CVSRemoteSyncElement.repositoryDiffers", new Object[] {local.getName(), remoteInfo.getRepository(), localInfo.getRepository()}));//$NON-NLS-1$
- }
- // The folders are in sync so just return
- return Status.OK_STATUS;
- }
-
- // The remote must exist if the local is not managed
- if (remote == null) {
- return new CVSStatus(IStatus.ERROR, REMOTE_DOES_NOT_EXIST, Policy.bind("CVSSyncInfo.10", getLocal().getFullPath().toString())); //$NON-NLS-1$
- }
-
- // Since the parent is managed, this will also set the resource sync info. It is
- // impossible for an incoming folder addition to map to another location in the
- // repo, so we assume that using the parent's folder sync as a basis is safe.
- // It is also impossible for an incomming folder to be static.
- FolderSyncInfo remoteInfo = remote.getFolderSyncInfo();
- FolderSyncInfo localInfo = local.getParent().getFolderSyncInfo();
- local.setFolderSyncInfo(new FolderSyncInfo(remoteInfo.getRepository(), remoteInfo.getRoot(), localInfo.getTag(), false));
- return Status.OK_STATUS;
- }
-
- public String toString() {
- ISubscriberResource base = getBase();
- ISubscriberResource remote = getRemote();
- StringBuffer result = new StringBuffer(super.toString());
- result.append("Local: "); //$NON-NLS-1$
- result.append(getLocal().toString());
- result.append(" Base: "); //$NON-NLS-1$
- if (base == null) {
- result.append("none"); //$NON-NLS-1$
- } else {
- result.append(base.toString());
- }
- result.append(" Remote: "); //$NON-NLS-1$
- if (remote == null) {
- result.append("none"); //$NON-NLS-1$
- } else {
- result.append(remote.toString());
- }
- return result.toString();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.core.subscribers.SyncInfo#getContentIdentifier()
- */
- public String getLocalContentIdentifier() {
- try {
- IResource local = getLocal();
- if (local != null || local.getType() == IResource.FILE) {
- // it's a file, return the revision number if we can find one
- ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor((IFile) local);
- ResourceSyncInfo info = cvsFile.getSyncInfo();
- if (info != null) {
- return info.getRevision();
- }
- }
- } catch (CVSException e) {
- CVSProviderPlugin.log(e);
- return null;
- }
- return null;
- }
-}

Back to the top