package org.tmatesoft.svn.core.wc2; import java.io.File; 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.wc.SVNRevision; import org.tmatesoft.svn.util.SVNLogType; /** * Represents export operation. * Exports the contents of either a subversion repository or a subversion * working copy (<code>source</code>) into a <code>target</code> - 'clean' directory (meaning a directory with no * administrative directories). * * <p/> * <code>source</code>'s <code>pegRevision</code> is the revision where the path is first looked * up when exporting from a repository. If <code>source</code>'s <code>pegRevision</code> is * {@link SVNRevision#UNDEFINED}, then it defaults to * {@link SVNRevision#WORKING}. * * <p/> * If <code>revision</code> is one of: * <ul> * <li/>{@link SVNRevision#BASE} * <li/>{@link SVNRevision#WORKING} * <li/>{@link SVNRevision#COMMITTED} * </ul> * then local export is performed. Otherwise exporting from the repository. * If <code>revision</code> is {@link SVNRevision#UNDEFINED} it defaults to {@link SVNRevision#WORKING}. * * <p/> * If externals are ignored (<code>ignoreExternals</code> is <code>true</code>), doesn't process * externals definitions as part of this operation. * * <p/> * <code>eolStyle</code> allows you to override the standard eol marker on * the platform you are running on. Can be either "LF", "CR" or "CRLF" or * <code>null</code>. If <code>null</code> will use the standard eol marker. Any * other value will cause an exception with the error code * {@link SVNErrorCode#IO_UNKNOWN_EOL} error to be returned. * * <p> * If <code>depth</code> is {@link SVNDepth#INFINITY}, exports fully * recursively. Else if it is {@link SVNDepth#IMMEDIATES}, exports * <code>source</code> and its immediate children (if any), but with * subdirectories empty and at{@link SVNDepth#EMPTY}. Else if * {@link SVNDepth#FILES}, exports <code>source</code> and its immediate * file children (if any) only. If <code>depth</code> is * {@link SVNDepth#EMPTY}, then exports exactly <code>source</code> and * none of its children. * * <p/> * {@link #run()} method returns value of the revision actually exported. * * <p/> * {@link #run()} throws {@link org.tmatesoft.svn.core.SVNException} in the following cases: * <ul> * <li/>exception with {@link SVNErrorCode#IO_ERROR} error code * - if <code>target</code>'s directory already exists and <code>force</code> is <code>false</code> * <li/>exception with {@link SVNErrorCode#ILLEGAL_TARGET} error code * - if destination file already exists and <code>force</code> is <code>false</code>, * or if destination directory exists and should be overridden by source file * </ul> * * @author TMate Software Ltd. * @version 1.7 */ public class SvnExport extends AbstractSvnUpdate<Long> { private boolean force; private boolean expandKeywords; private String eolStyle; private SvnTarget source; protected SvnExport(SvnOperationFactory factory) { super(factory); } /** * Gets whether to overwrite files or directories. * * @return <code>true</code> if export should overwrite files or directories, otherwise <code>false</code> */ public boolean isForce() { return force; } /** * Gets whether or not all keywords presenting in the file and listed in the file's * {@link org.tmatesoft.svn.core.SVNProperty#KEYWORDS}property (if set) should be substituted. * * @return <code>true</code> if keywords should expanded, otherwise <code>false</code> * @since 1.7, SVN 1.7 */ public boolean isExpandKeywords() { return expandKeywords; } /** * Returns the string that denotes a specific End-Of-Line character. * * @return specific End-Of-Line character of the operation * @see #setEolStyle(String) */ public String getEolStyle() { return eolStyle; } /** * Sets whether to overwrite files or directories. * * @param force <code>true</code> if export should overwrite files or directories, otherwise <code>false</code> */ public void setForce(boolean force) { this.force = force; } /** * Sets whether or not all keywords presenting in the file and listed in the file's * {@link org.tmatesoft.svn.core.SVNProperty#KEYWORDS}property (if set) should be substituted. * * @param expandKeywords <code>true</code> if keywords should expanded, otherwise <code>false</code> * @since 1.7, SVN 1.7 */ public void setExpandKeywords(boolean expandKeywords) { this.expandKeywords = expandKeywords; } /** * Sets the string that denotes a specific End-Of-Line character. * * <code>eolStyle</code> allows you to override the standard eol marker on * the platform you are running on. Can be either "LF", "CR" or "CRLF" or * <code>null</code>. If <code>null</code> will use the standard eol marker. Any * other value will cause an exception with the error code * {@link SVNErrorCode#IO_UNKNOWN_EOL} error to be returned. * * @param eolStyle specific End-Of-Line character of the operation */ public void setEolStyle(String eolStyle) { this.eolStyle = eolStyle; } /** * Returns export's source - working copy path or repository URL. * * @return source of the export */ public SvnTarget getSource() { return source; } /** * Sets export's source - working copy path or repository URL. * * @param source source of the export */ public void setSource(SvnTarget source) { this.source = source; } @Override protected void ensureArgumentsAreValid() throws SVNException { if (getFirstTarget() == null || !getFirstTarget().isLocal()) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ILLEGAL_TARGET, "Destination path is required for export."); SVNErrorManager.error(err, SVNLogType.WC); } if (getSource() == null) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.ILLEGAL_TARGET, "Source is required for export."); SVNErrorManager.error(err, SVNLogType.WC); } if (getDepth() == null || getDepth() == SVNDepth.UNKNOWN) { setDepth(SVNDepth.INFINITY); } if (getRevision() == SVNRevision.UNDEFINED) { setRevision(getSource().getResolvedPegRevision()); } super.ensureArgumentsAreValid(); } @Override protected void initDefaults() { super.initDefaults(); setExpandKeywords(true); setDepth(SVNDepth.INFINITY); } @Override protected File getOperationalWorkingCopy() { if (getSource().isLocal()) { return getSource().getFile(); } return null; } /** * 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; } }