blob: d3908b0d258927a7767b288abd8f3b4fc8e3e75b [file] [log] [blame]
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.command.update;
import org.jetbrains.annotations.NonNls;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.AbstractMessageParser;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IEntryListener;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import org.netbeans.lib.cvsclient.util.BugLog;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Thomas Singer
*/
public final class UpdateMessageParser extends AbstractMessageParser implements IEntryListener {
// Constants ==============================================================
@NonNls private static final String EXAM_DIR = "server: Updating ";
@NonNls private static final String UNKNOWN = "server: nothing known about";
@NonNls private static final String TO_ADD = "server: use `cvs add' to create an entry for";
@NonNls private static final String STATES = "UPARMC?";
@NonNls private static final String WARNING = "server: warning: ";
@NonNls private static final String PERTINENT = "is not (any longer) pertinent";
@NonNls private static final String MERGING = "Merging differences between ";
@NonNls private static final Pattern NOT_IN_REPOSITORY_PATTERN = Pattern.compile("cvs .+: (.+) is no longer in the repository");
@NonNls private static final String LOCALLY_MODIFIED_FILE_HAS_BEEN_REMOVED = "is locally modified, but has been removed in revision";
// Fields =================================================================
private final IEventSender eventManager;
private final ICvsFileSystem cvsFileSystem;
private UpdateFileInfo fileInfo;
// Setup ==================================================================
public UpdateMessageParser(IEventSender eventManager, ICvsFileSystem cvsFileSystem) {
BugLog.getInstance().assertNotNull(eventManager);
BugLog.getInstance().assertNotNull(cvsFileSystem);
this.eventManager = eventManager;
this.cvsFileSystem = cvsFileSystem;
}
// Implemented ============================================================
public void registerListeners(ICvsListenerRegistry listenerRegistry) {
super.registerListeners(listenerRegistry);
listenerRegistry.addEntryListener(this);
}
public void unregisterListeners(ICvsListenerRegistry listenerRegistry) {
listenerRegistry.removeEntryListener(this);
super.unregisterListeners(listenerRegistry);
}
protected void outputDone() {
if (fileInfo == null) {
return;
}
// There can be a null value, if only the entry changed
if (fileInfo.getType() != null) {
eventManager.notifyFileInfoListeners(fileInfo);
}
fileInfo = null;
}
@SuppressWarnings({"HardCodedStringLiteral"})
public void parseLine(String line, boolean isErrorMessage) {
if (line.startsWith("RCS file:")) {
return;
}
if (line.startsWith("retrieving revision ")) {
return;
}
if (line.indexOf(" already contains the differences between ") > 0) {
return;
}
if (line.startsWith("rcsmerge: warning: conflicts during merge")) {
return;
}
if (line.indexOf(EXAM_DIR) >= 0) {
return;
}
if (line.indexOf(": conflicts found in ") > 0) {
return;
}
int index = line.indexOf(UNKNOWN);
if (index >= 0) {
final String fileName = (line.substring(index + UNKNOWN.length())).trim();
processUnknown(fileName);
return;
}
index = line.indexOf(TO_ADD);
if (index >= 0) {
final String fileName = (line.substring(index + TO_ADD.length())).trim();
processUnknown(fileName);
return;
}
if (line.startsWith(MERGING)) {
// outputDone();
// ensureExistingFileInfoContainer();
// index = line.indexOf(UpdateCommand2.INTO, UpdateCommand2.MERGING.length() + 1);
// if (index > 0) {
// fileInfoContainer.setFile(createFile(line.substring(index + UpdateCommand2.INTO.length())));
// }
// fileInfoContainer.setType(DefaultFileInfoContainer.MERGED_FILE);
return;
}
index = line.indexOf(LOCALLY_MODIFIED_FILE_HAS_BEEN_REMOVED);
if (index >= 0) {
String warningPrefix = "cvs server: file ";
if (!line.startsWith(warningPrefix)) return;
final String fileName = line.substring(warningPrefix.length(), index).trim();
final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName);
ensureExistingFileInfoContainer(fileObject);
// HACK - will create conflict status in order to be able to have consistent info format
fileInfo.setType("C");
return;
}
index = line.indexOf(WARNING);
if (index >= 0) {
final int pertinentIndex = line.indexOf(PERTINENT);
if (pertinentIndex > 0) {
final String fileName = line.substring(index + WARNING.length(), pertinentIndex).trim();
final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName);
processNotPertinent(fileObject);
}
return;
}
Matcher m = NOT_IN_REPOSITORY_PATTERN.matcher(line);
if (m.matches()) {
final String fileName = m.group(1).trim();
final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName);
processNotPertinent(fileObject);
return;
}
// otherwise
if (line.length() > 2) {
if (line.charAt(1) == ' ') {
final String firstChar = line.substring(0, 1);
if (STATES.indexOf(firstChar) >= 0) {
processFile(line.substring(2), firstChar);
}
}
}
}
public void gotEntry(FileObject fileObject, Entry entry) {
ensureExistingFileInfoContainer(fileObject);
fileInfo.setEntry(entry);
}
// Utils ==================================================================
private void ensureExistingFileInfoContainer(FileObject fileObject) {
if (fileInfo != null) {
if (fileObject.equals(fileInfo.getFileObject())) {
return;
}
outputDone();
}
fileInfo = new UpdateFileInfo(fileObject, cvsFileSystem.getLocalFileSystem().getFile(fileObject));
}
private void processUnknown(String fileName) {
final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName);
ensureExistingFileInfoContainer(fileObject);
fileInfo.setType("?");
}
private void processFile(String fileName, String type) {
final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName);
ensureExistingFileInfoContainer(fileObject);
fileInfo.setType(type);
}
private void processNotPertinent(FileObject fileObject) {
ensureExistingFileInfoContainer(fileObject);
// HACK - will create a non-cvs status in order to be able to have consistent info format
fileInfo.setType("Y");
}
public void binaryMessageSent(final byte[] bytes) {
}
}