package org.tmatesoft.svn.core.wc2;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
/**
* Represents add operation.
* Schedules working copy <code>targets</code> for addition to the repository.
*
* <p/>
* If <code>depth</code> is {@link SVNDepth#EMPTY}, adds just
* <code>targets</code> and nothing below it. If {@link SVNDepth#FILES}, adds
* <code>targets</code> and any file children of <code>targets</code>. If
* {@link SVNDepth#IMMEDIATES}, adds <code>targets</code>, any file children,
* and any immediate subdirectories (but nothing underneath those
* subdirectories). If {@link SVNDepth#INFINITY}, adds <code>targets</code>
* and everything under it fully recursively.
*
* <p/>
* <code>targets</code>' parent must be under revision control already (unless
* <code>makeParents</code> is <code>true</code>), but
* <code>targets</code> are not.
*
* <p/>
* If <code>force</code> is set, <code>target</code> is a directory, <code>depth</code> is
* {@link SVNDepth#INFINITY}, then schedules for addition unversioned files
* and directories scattered deep within a versioned tree.
*
* <p/>
* If <code>includeIgnored</code> is <code>false</code>,
* doesn't add files or directories that match ignore patterns.
*
* <p/>
* If <code>makeParents</code> is <code>true</code>,
* recurse up path's directory and look for a versioned directory. If found,
* add all intermediate paths between it and the path.
*
* <p/>
* Important: this is a *scheduling* operation. No changes will happen to
* the repository until a commit occurs. This scheduling can be removed with
* {@link SvnRevert} operation.
*
* <p/>
* {@link #run()} method throws {@link SVNException} in the following cases:
* <ul>
* <li/>exception with {@link SVNErrorCode#ENTRY_EXISTS} error
* code - if <code>force</code> is not set and a path is already
* under version
* <li/>exception with
* {@link SVNErrorCode#CLIENT_NO_VERSIONED_PARENT} error code -
* if <code>makeParents</code> is <code>true</code> but no unversioned paths
* stepping upper from a path are found
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnScheduleForAddition extends SvnOperation<Void> {
private boolean force;
private boolean includeIgnored;
private boolean applyAutoProperties;
private boolean addParents;
private boolean mkDir;
private ISvnAddParameters addParameters;
protected SvnScheduleForAddition(SvnOperationFactory factory) {
super(factory);
}
@Override
protected void initDefaults() {
setApplyAutoProperties(true);
super.initDefaults();
}
/**
* Returns whether to throw exceptions on already-versioned items
*
* @return <code>true</code> if operation does not throw exceptions on already-versioned items,
* <code>false</code> if exception should be thrown
*/
public boolean isForce() {
return force;
}
/**
* Return whether to add files or directories that match ignore patterns.
*
* @return <code>true</code> if ignore patterns should not be applied to paths being added, otherwise <code>false</code>
*/
public boolean isIncludeIgnored() {
return includeIgnored;
}
public boolean isApplyAutoProperties() {
return applyAutoProperties;
}
/**
* Returns whether to recurse up path's directory and look for a versioned directory. If found,
* add all intermediate paths between it and the path.
*
* @return <code>true</code> if operation should climb upper and schedule also all unversioned paths in the way
*/
public boolean isAddParents() {
return addParents;
}
/**
* Sets whether to throw exceptions on already-versioned items
*
* @param force <code>true</code> if operation does not throw exceptions on already-versioned items,
* <code>false</code> if exception should be thrown
*/
public void setForce(boolean force) {
this.force = force;
}
/**
* Sets whether to add files or directories that match ignore patterns.
*
* @param includeIgnored <code>true</code> if ignore patterns should not be applied to paths being added, otherwise <code>false</code>
*/
public void setIncludeIgnored(boolean includeIgnored) {
this.includeIgnored = includeIgnored;
}
public void setApplyAutoProperties(boolean applyAutoProperties) {
this.applyAutoProperties = applyAutoProperties;
}
/**
* Sets whether to recurse up path's directory and look for a versioned directory. If found,
* add all intermediate paths between it and the path.
*
* @param addParents <code>true</code> if operation should climb upper and schedule also all unversioned paths in the way
*/
public void setAddParents(boolean addParents) {
this.addParents = addParents;
}
/**
* Returns whether a directory at <code>target</code>'s path also should be created
*
* @return <code>true</code>, if a directory at <code>target</code>'s path also should be created
*/
public boolean isMkDir() {
return mkDir;
}
/**
* Sets whether a directory at <code>target</code>'s path also should be created
*
* @param mkDir <code>true</code>, if a directory at <code>target</code>'s path also should be created
*/
public void setMkDir(boolean mkDir) {
this.mkDir = mkDir;
}
@Override
protected int getMaximumTargetsCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isUseParentWcFormat() {
return true;
}
/**
* Returns operation's add parameters, whose controls inconsistent EOL's.
*
* @return add parameters of the operation
* @see ISvnAddParameters
*/
public ISvnAddParameters getAddParameters() {
return addParameters;
}
/**
* Sets operation's add parameters, whose controls inconsistent EOL's.
*
* @param addParameters add parameters of the operation
* @see ISvnAddParameters
*/
public void setAddParameters(ISvnAddParameters addParameters) {
this.addParameters = addParameters;
}
/**
* 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 true;
}
}