| /******************************************************************************* |
| * 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.client.listeners; |
| |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.team.internal.ccvs.core.CVSException; |
| import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; |
| import org.eclipse.team.internal.ccvs.core.CVSStatus; |
| import org.eclipse.team.internal.ccvs.core.ICVSFolder; |
| import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; |
| import org.eclipse.team.internal.ccvs.core.client.CommandOutputListener; |
| import org.eclipse.team.internal.ccvs.core.Policy; |
| |
| /** |
| * This class interprets the output of "cvs diff --brief ..." in order to get the revisions |
| * of two compared versions of a project or folder. |
| */ |
| public class CompareDiffListener extends CommandOutputListener { |
| |
| private static ServerMessageLineMatcher LOCAL_FILE_MATCHER; |
| private static ServerMessageLineMatcher REMOTE_FILE_MATCHER; |
| private static ServerMessageLineMatcher REVISION_LINE_MATCHER; |
| |
| static { |
| try { |
| LOCAL_FILE_MATCHER = new ServerMessageLineMatcher( |
| "Index: (localFile:.*:localFile)", new String[] {"localFile"}); //$NON-NLS-1$ //$NON-NLS-2$ |
| REMOTE_FILE_MATCHER = new ServerMessageLineMatcher( |
| "RCS file: (remoteFile:.*:remoteFile),v", new String[] {"remoteFile"}); //$NON-NLS-1$ //$NON-NLS-2$ |
| REVISION_LINE_MATCHER = new ServerMessageLineMatcher( |
| "diff .* -r(leftRevision:.*:leftRevision) -r(rightRevision:.*:rightRevision)", new String[] {"leftRevision", "rightRevision"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } catch (CVSException e) { |
| // This is serious as the listener will not function properly |
| CVSProviderPlugin.log(e); |
| LOCAL_FILE_MATCHER = null; |
| REMOTE_FILE_MATCHER = null; |
| REVISION_LINE_MATCHER = null; |
| } |
| } |
| |
| private String localFilePath, remoteFilePath, leftRevision, rightRevision; |
| |
| private IFileDiffListener listener; |
| |
| public interface IFileDiffListener { |
| public void fileDiff( |
| String localFilePath, |
| String remoteFilePath, |
| String leftRevision, |
| String rightRevision); |
| } |
| |
| public CompareDiffListener(IFileDiffListener listener) { |
| this.listener = listener; |
| } |
| |
| public IStatus messageLine( |
| String line, |
| ICVSRepositoryLocation location, |
| ICVSFolder commandRoot, |
| IProgressMonitor monitor) { |
| // ignore any server messages |
| if (getServerMessage(line, location) != null) { |
| return OK; |
| } |
| Map map = LOCAL_FILE_MATCHER.processServerMessage(line); |
| if (map != null) { |
| localFilePath = (String)map.get("localFile"); //$NON-NLS-1$ |
| return OK; |
| } |
| map = REMOTE_FILE_MATCHER.processServerMessage(line); |
| if (map != null) { |
| remoteFilePath = (String)map.get("remoteFile"); //$NON-NLS-1$ |
| return OK; |
| } |
| map = REVISION_LINE_MATCHER.processServerMessage(line); |
| if (map != null) { |
| leftRevision = (String)map.get("leftRevision"); //$NON-NLS-1$ |
| rightRevision = (String)map.get("rightRevision"); //$NON-NLS-1$ |
| if (localFilePath == null || remoteFilePath == null) { |
| return new CVSStatus(IStatus.ERROR, Policy.bind("CompareDiffListener.11")); //$NON-NLS-1$ |
| } |
| listener.fileDiff(localFilePath, remoteFilePath, leftRevision, rightRevision); |
| localFilePath = remoteFilePath = leftRevision = rightRevision = null; |
| return OK; |
| } |
| // Ignore all other lines |
| return OK; |
| } |
| |
| private IStatus handleUnknownDiffFormat(String line) { |
| return new CVSStatus(IStatus.ERROR, Policy.bind("CompareDiffListener.12", line)); //$NON-NLS-1$ |
| } |
| |
| public IStatus errorLine( |
| String line, |
| ICVSRepositoryLocation location, |
| ICVSFolder commandRoot, |
| IProgressMonitor monitor) { |
| // ignore server messages for now - this is used only with the diff |
| // request and the errors can be safely ignored. |
| if (getServerMessage(line, location) != null) { |
| return OK; |
| } |
| return super.errorLine(line, location, commandRoot, monitor); |
| } |
| |
| } |