blob: 9f81b310dd95c1bf7880914eb2bb7a10ef70ab1f [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 the CVS Client Library.
* The Initial Developer of the Original Code is Robert Greig.
* Portions created by Robert Greig are Copyright (C) 2000.
* All Rights Reserved.
*
* Contributor(s): Robert Greig.
*****************************************************************************/
package org.netbeans.lib.cvsclient.command.update;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.IRequestProcessor;
import org.netbeans.lib.cvsclient.connection.AuthenticationException;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.*;
import org.netbeans.lib.cvsclient.event.DualListener;
import org.netbeans.lib.cvsclient.event.ICvsListener;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.progress.IProgressViewer;
import org.netbeans.lib.cvsclient.progress.RangeProgressViewer;
import org.netbeans.lib.cvsclient.progress.receiving.FileInfoAndDirectoryResponseProgressHandler;
import org.netbeans.lib.cvsclient.progress.sending.FileStateRequestsProgressHandler;
import org.netbeans.lib.cvsclient.progress.sending.IRequestsProgressHandler;
import org.netbeans.lib.cvsclient.request.CommandRequest;
import org.netbeans.lib.cvsclient.request.Requests;
import org.jetbrains.annotations.NonNls;
import java.io.IOException;
/**
* The Update command. Updates files that have previously been checked out
* from the repository with the checkout command. Modified files are not
* overwritten.
* @author Robert Greig
*/
public final class UpdateCommand extends AbstractCommand
implements IUpdatingCommand {
// Fields =================================================================
private boolean buildDirectories;
private boolean cleanCopy;
private boolean pruneDirectories;
private boolean resetStickyOnes;
private boolean useHeadIfNotFound;
private String updateByDate;
private String updateByRevision;
private KeywordSubstitution keywordSubst;
private String mergeRevision1;
private String mergeRevision2;
// Setup ==================================================================
public UpdateCommand() {
}
// Implemented ============================================================
/**
* Execute the command.
* @param requestProcessor the client services object that provides any necessary
* services to this command, including the ability to actually
* process all the requests
*/
public boolean execute(IRequestProcessor requestProcessor, IEventSender eventSender, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer)
throws CommandException, AuthenticationException {
final ICvsFiles cvsFiles;
try {
cvsFiles = scanFileSystem(clientEnvironment);
}
catch (IOException ex) {
throw new IOCommandException(ex);
}
final Requests requests = new Requests(CommandRequest.UPDATE, clientEnvironment);
requests.addArgumentRequest(isBuildDirectories(), "-d");
requests.addArgumentRequest(isCleanCopy(), "-C");
requests.addArgumentRequest(isResetStickyOnes(), "-A");
requests.addArgumentRequest(isUseHeadIfNotFound(), "-f");
requests.addArgumentRequest(getUpdateByDate(), "-D");
requests.addArgumentRequest(getUpdateByRevision(), "-r");
requests.addArgumentRequests(getMergeRevision1(), "-j");
requests.addArgumentRequests(getMergeRevision2(), "-j");
requests.addArgumentRequest(getKeywordSubst(), "-k");
addFileRequests(cvsFiles, requests, clientEnvironment);
requests.addLocalPathDirectoryRequest();
addArgumentRequests(requests);
DirectoryPruner directoryPruner = null;
if (isPruneDirectories()) {
directoryPruner = new DirectoryPruner(clientEnvironment);
directoryPruner.registerListeners(listenerRegistry);
}
final IRequestsProgressHandler requestsProgressHandler = new FileStateRequestsProgressHandler(new RangeProgressViewer(progressViewer, 0.0, 0.5), cvsFiles);
final ICvsListener responseProgressViewer = new FileInfoAndDirectoryResponseProgressHandler(new RangeProgressViewer(progressViewer, 0.5, 1.0), cvsFiles);
final ICvsListener updateMessageParser = new UpdateMessageParser(eventSender, clientEnvironment.getCvsFileSystem());
final ICvsListener listener = new DualListener(updateMessageParser, responseProgressViewer);
listener.registerListeners(listenerRegistry);
try {
return requestProcessor.processRequests(requests, requestsProgressHandler);
}
finally {
listener.unregisterListeners(listenerRegistry);
if (directoryPruner != null) {
directoryPruner.unregisterListeners(listenerRegistry);
try {
directoryPruner.pruneEmptyDirectories();
}
catch (IOException ex) {
throw new IOCommandException(ex);
}
}
}
}
/**
* This method returns how the command would looklike when typed on the
* command line.
* Each command is responsible for constructing this information.
*/
public String getCvsCommandLine() {
@NonNls final StringBuffer cvsCommandLine = new StringBuffer("update ");
cvsCommandLine.append(getCvsArguments());
appendFileArguments(cvsCommandLine);
return cvsCommandLine.toString();
}
/**
* Resets all switches in the command.
* After calling this method, the command should have no switches defined
* and should behave defaultly.
*/
public void resetCvsCommand() {
super.resetCvsCommand();
setRecursive(true);
setCleanCopy(false);
setBuildDirectories(false);
setPruneDirectories(false);
setResetStickyOnes(false);
setUseHeadIfNotFound(false);
setUpdateByDate(null);
setUpdateByRevisionOrTag(null);
setKeywordSubst(null);
setMergeRevision1(null);
setMergeRevision2(null);
}
protected void addModifiedRequest(FileObject fileObject, Entry entry, Requests requests, IClientEnvironment clientEnvironment) {
if (isCleanCopy()) {
if (!getGlobalOptions().isDoNoChanges()) {
final String newFileName = ".#" + fileObject.getName() + '.' + entry.getRevision();
try {
clientEnvironment.getLocalFileWriter().renameLocalFile(fileObject, clientEnvironment.getCvsFileSystem(), newFileName);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
return;
}
super.addModifiedRequest(fileObject, entry, requests, clientEnvironment);
}
// Accessing ==============================================================
public void setBuildDirectories(boolean buildDirectories) {
this.buildDirectories = buildDirectories;
}
private boolean isBuildDirectories() {
return buildDirectories;
}
public void setCleanCopy(boolean cleanCopy) {
this.cleanCopy = cleanCopy;
}
private boolean isCleanCopy() {
return cleanCopy;
}
public void setPruneDirectories(boolean pruneDirectories) {
this.pruneDirectories = pruneDirectories;
}
private boolean isPruneDirectories() {
return pruneDirectories;
}
private boolean isResetStickyOnes() {
return resetStickyOnes;
}
public void setResetStickyOnes(boolean resetStickyOnes) {
this.resetStickyOnes = resetStickyOnes;
}
private boolean isUseHeadIfNotFound() {
return useHeadIfNotFound;
}
public void setUseHeadIfNotFound(boolean useHeadIfNotFound) {
this.useHeadIfNotFound = useHeadIfNotFound;
}
private String getUpdateByDate() {
return updateByDate;
}
public void setUpdateByDate(String updateByDate) {
this.updateByDate = getTrimmedString(updateByDate);
}
public String getUpdateByRevision() {
return updateByRevision;
}
public void setUpdateByRevisionOrTag(String updateByRevision) {
this.updateByRevision = getTrimmedString(updateByRevision);
}
private KeywordSubstitution getKeywordSubst() {
return keywordSubst;
}
public void setKeywordSubst(KeywordSubstitution keywordSubst) {
this.keywordSubst = keywordSubst;
}
private String getMergeRevision1() {
return mergeRevision1;
}
public void setMergeRevision1(String mergeRevision1) {
this.mergeRevision1 = getTrimmedString(mergeRevision1);
}
private String getMergeRevision2() {
return mergeRevision2;
}
public void setMergeRevision2(String mergeRevision2) {
this.mergeRevision2 = getTrimmedString(mergeRevision2);
}
// Utils ==================================================================
/**
* Returns the arguments of the command in the command-line style.
* Similar to getCVSCommand() however without the files and command's name
*/
private String getCvsArguments() {
@NonNls final StringBuilder cvsArguments = new StringBuilder();
if (isCleanCopy()) {
cvsArguments.append("-C ");
}
if (!isRecursive()) {
cvsArguments.append("-l ");
}
if (isBuildDirectories()) {
cvsArguments.append("-d ");
}
if (isPruneDirectories()) {
cvsArguments.append("-P ");
}
if (isResetStickyOnes()) {
cvsArguments.append("-A ");
}
if (isUseHeadIfNotFound()) {
cvsArguments.append("-f ");
}
if (getKeywordSubst() != null) {
cvsArguments.append("-k");
cvsArguments.append(getKeywordSubst());
cvsArguments.append(' ');
}
if (getUpdateByRevision() != null) {
cvsArguments.append("-r ");
cvsArguments.append(getUpdateByRevision());
cvsArguments.append(' ');
}
if (getUpdateByDate() != null) {
cvsArguments.append("-D ");
cvsArguments.append(getUpdateByDate());
cvsArguments.append(' ');
}
if (getMergeRevision1() != null) {
cvsArguments.append("-j ");
cvsArguments.append(getMergeRevision1());
cvsArguments.append(' ');
if (getMergeRevision2() != null) {
cvsArguments.append("-j ");
cvsArguments.append(getMergeRevision2());
cvsArguments.append(' ');
}
}
return cvsArguments.toString();
}
public void setUpdateByRevisionOrDate(String revision, final String date) {
setUpdateByRevisionOrTag(revision);
setUpdateByDate(date);
}
}