package org.tmatesoft.svn.core.wc2;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext;
import org.tmatesoft.svn.core.wc.ISVNEventHandler;
import org.tmatesoft.svn.core.wc.ISVNStatusFileProvider;
import org.tmatesoft.svn.core.wc.SVNEventAction;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.hooks.ISvnFileListHook;
import org.tmatesoft.svn.util.SVNLogType;
/**
* Represents status operation.
* {@link #run()} method returns a set of {@link SvnStatus} objects which
* describe the status of the working cope <code>target</code>, and its children (recursing
* according to <code>depth</code>)..
*
* <p/>
* If <code>reportAll</code> is set, retrieves all entries; otherwise,
* retrieves only "interesting" entries (local modifications and/or out of
* date).
*
* <p/>
* If <code>remote</code> is set, contacts the repository and augments the
* status objects with information about out-of-date items (with respect to
* <code>revision</code>).
*
* <p/>
* If {@link #reportExternals} is <true>true</span>, then recurses into externals
* definitions (if any exist and <code>depth</code> is either
* {@link SVNDepth#INFINITY} or {@link SVNDepth#UNKNOWN}) after handling the
* main <code>target</code>. This calls the client notification handler (
* {@link ISVNEventHandler}) with the {@link SVNEventAction#STATUS_EXTERNAL}
* action before handling each externals definition, and with
* {@link SVNEventAction#STATUS_COMPLETED} after each.
*
* <p/>
* <code>changeLists</code> is a collection of <code>String</code>
* changelist names, used as a restrictive filter on items whose statuses
* are reported; that is, doesn't report status about any item unless it's a
* member of one of those changelists. If <code>changeLists</code> is empty
* (or <code>null</code>), no changelist filtering
* occurs.
*
* <p/>
* if <code>remote</code> is <code>true</span>, status is calculated against
* this <code>revision</code>
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnGetStatus extends SvnReceivingOperation<SvnStatus> {
private boolean remote;
private boolean depthAsSticky;
private boolean reportIgnored;
private boolean reportAll;
private boolean reportExternals;
private ISvnFileListHook fileListHook;
private boolean collectParentExternals;
private long remoteRevision;
protected SvnGetStatus(SvnOperationFactory factory) {
super(factory);
}
/**
* Returns whether to check up the status of the item in the repository,
* that will tell if the local item is out-of-date
* (like <i>'-u'</i> option in the SVN client's <code>'svn status'</code> command)
*
* @return <code>true</code> if the status should be checked up in repository, otherwise <code>false</code>
*/
public boolean isRemote() {
return remote;
}
/**
* Returns whether depth is sticky.
* If <code>depthIsSticky</code> is set and <code>depth</code> is not
* {@link SVNDepth#UNKNOWN}, then in addition to switching <code>target</code>'s path
* , also sets its sticky ambient depth value to <code>depth</code>.
* @return <code>true</code> if the depth is sticky, otherwise <code>false</code>
*/
public boolean isDepthAsSticky() {
return depthAsSticky;
}
/**
* Returns whether to force the operation to collect information
* on items that were set to be ignored (like <i>'--no-ignore'</i>
* option in the SVN client's <code>'svn status'</code> command
* to disregard default and <i>'svn:ignore'</i> property ignores).
*
* @return <code>true</code> if default and svn:ignore property ignores should be disregarded, otherwise <code>false</code>
*/
public boolean isReportIgnored() {
return reportIgnored;
}
/**
* Returns whether to collect status information on all items
* including those ones that are in a <i>'normal'</i> state (unchanged).
*
* @return <code>true</code> if all items are reported, if <code>false</code> only items with unchanged state
*/
public boolean isReportAll() {
return reportAll;
}
/**
* Returns whether to report externals.
*
* @return <code>true</code> if externals should be reported, otherwise <code>false</code>
*/
public boolean isReportExternals() {
return reportExternals;
}
/**
* Returns client's file list hook.
* Used for 1.6 only, former {@link ISVNStatusFileProvider}.
*
* @return file list hook
*/
public ISvnFileListHook getFileListHook() {
return this.fileListHook;
}
/**
* Sets whether to check up the status of the item in the repository,
* that will tell if the local item is out-of-date
* (like <i>'-u'</i> option in the SVN client's <code>'svn status'</code> command)
*
* @param remote <code>true</code> if the status should be checked up in repository, otherwise <code>false</code>
*/
public void setRemote(boolean remote) {
this.remote = remote;
}
/**
*
* @param depthAsSticky
*/
public void setDepthAsSticky(boolean depthAsSticky) {
this.depthAsSticky = depthAsSticky;
}
/**
* Sets whether to force the operation to collect information
* on items that were set to be ignored (like <i>'--no-ignore'</i>
* option in the SVN client's <code>'svn status'</code> command
* to disregard default and <i>'svn:ignore'</i> property ignores).
*
* @param reportIgnored <code>true</code> if default and svn:ignore property ignores should be disregarded, otherwise <code>false</code>
*/
public void setReportIgnored(boolean reportIgnored) {
this.reportIgnored = reportIgnored;
}
/**
* Sets whether to collect status information on all items
* including those ones that are in a <i>'normal'</i> state (unchanged).
*
* @param reportAll <code>true</code> if all items are reported, if <code>false</code> only items with unchanged state
*/
public void setReportAll(boolean reportAll) {
this.reportAll = reportAll;
}
/**
* Sets whether to report externals.
*
* @param reportExternals <code>true</code> if externals should be reported, otherwise <code>false</code>
*/
public void setReportExternals(boolean reportExternals) {
this.reportExternals = reportExternals;
}
/**
* Sets client's file list hook.
* Used for 1.6 only, former {@link ISVNStatusFileProvider}.
*
* @param fileListHook file list hook
*/
public void setFileListHook(ISvnFileListHook fileListHook) {
this.fileListHook = fileListHook;
}
@Override
protected void ensureArgumentsAreValid() throws SVNException {
super.ensureArgumentsAreValid();
setRemoteRevision(SVNWCContext.INVALID_REVNUM);
if (hasRemoteTargets()) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ILLEGAL_TARGET, "''{0}'' is not a local path", getFirstTarget().getURL());
SVNErrorManager.error(err, SVNLogType.WC);
}
}
@Override
public void initDefaults() {
super.initDefaults();
setRevision(SVNRevision.HEAD);
setReportAll(true);
setReportIgnored(true);
setReportExternals(true);
setRemoteRevision(SVNWCContext.INVALID_REVNUM);
}
/**
* Only relevant for 1.6 working copies, obsolete (not used).
*/
public boolean isCollectParentExternals() {
return collectParentExternals;
}
/**
* Only relevant for 1.6 working copies, obsolete (not used).
*/
public void setCollectParentExternals(boolean collect) {
this.collectParentExternals = collect;
}
/**
* Sets the remove revision of the <code>target</code>.
*
* @param revision remote revision
*/
public void setRemoteRevision(long revision) {
this.remoteRevision = revision;
}
/**
* Returns the remove revision of the <code>target</code>.
* This value can be accessed after operation is executed.
*
* @return revision remote revision
*/
public long getRemoteRevision() {
return this.remoteRevision;
}
@Override
public boolean isUseParentWcFormat() {
return true;
}
/**
* Gets whether the operation changes working copy
* @return <code>true</code> if the operation changes the working copy, otherwise <code>false</code>
*/
@Override
public boolean isChangesWorkingCopy() {
return false;
}
}