/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.cli.svnadmin;
import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.tmatesoft.svn.cli.AbstractSVNCommand;
import org.tmatesoft.svn.cli.AbstractSVNCommandEnvironment;
import org.tmatesoft.svn.cli.AbstractSVNOption;
import org.tmatesoft.svn.cli.SVNCommandLine;
import org.tmatesoft.svn.cli.SVNOptionValue;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class SVNAdminCommandEnvironment extends AbstractSVNCommandEnvironment {
private boolean myIsQuiet;
private boolean myIsHelp;
private boolean myIsVersion;
private String myParentDir;
private boolean myIsIncremental;
private boolean myIsDeltas;
private boolean myIsIgnoreUUID;
private boolean myIsForceUUID;
private boolean myIsPre14Compatible;
private boolean myIsPre15Compatible;
private boolean myIsPre16Compatible;
private boolean myIsPre17Compatible;
private boolean myIsWith17Compatible;
private boolean myIsUsePreCommitHook;
private boolean myIsUsePostCommitHook;
private boolean myIsUsePostRevPropChangeHook;
private boolean myIsUsePreRevPropChangeHook;
private boolean myIsBypassHooks;
private boolean myIsCleanLogs;
private String myConfigDir;
private boolean myIsWait;
private SVNRevision myStartRevision;
private SVNRevision myEndRevision;
protected SVNAdminCommandEnvironment(String programName, PrintStream out, PrintStream err, InputStream in) {
super(programName, out, err, in);
myStartRevision = SVNRevision.UNDEFINED;
myEndRevision = SVNRevision.UNDEFINED;
}
protected ISVNAuthenticationManager createClientAuthenticationManager() {
File configDir = myConfigDir != null ? new File(myConfigDir).getAbsoluteFile() : null;
return SVNWCUtil.createDefaultAuthenticationManager(configDir);
}
protected DefaultSVNOptions createClientOptions() {
File configDir = myConfigDir != null ? new File(myConfigDir).getAbsoluteFile() : null;
return SVNWCUtil.createDefaultOptions(configDir, true);
}
protected void initOption(SVNOptionValue optionValue) throws SVNException {
AbstractSVNOption option = optionValue.getOption();
if (option == SVNAdminOption.REVISION) {
if (myStartRevision != SVNRevision.UNDEFINED) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "Multiple revision argument encountered; " +
"can't specify -r and c, or try '-r N:M' instead of '-r N -r M'");
SVNErrorManager.error(err, SVNLogType.CLIENT);
}
String revStr = optionValue.getValue();
SVNRevision[] revisions = parseRevision(revStr);
if (revisions == null) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "Syntax error in revision argument ''{0}''", revStr);
SVNErrorManager.error(err, SVNLogType.CLIENT);
}
myStartRevision = revisions[0];
myEndRevision = revisions[1];
} else if (option == SVNAdminOption.QUIET) {
myIsQuiet = true;
} else if (option == SVNAdminOption.HELP || option == SVNAdminOption.QUESTION) {
myIsHelp = true;
} else if (option == SVNAdminOption.VERSION) {
myIsVersion = true;
} else if (option == SVNAdminOption.INCREMENTAL) {
myIsIncremental = true;
} else if (option == SVNAdminOption.DELTAS) {
myIsDeltas = true;
} else if (option == SVNAdminOption.IGNORE_UUID) {
myIsIgnoreUUID = true;
} else if (option == SVNAdminOption.FORCE_UUID) {
myIsForceUUID = true;
} else if (option == SVNAdminOption.PRE_14_COMPATIBLE) {
myIsPre14Compatible = true;
} else if (option == SVNAdminOption.PRE_15_COMPATIBLE) {
myIsPre15Compatible = true;
} else if (option == SVNAdminOption.PRE_16_COMPATIBLE) {
myIsPre16Compatible = true;
} else if (option == SVNAdminOption.PRE_17_COMPATIBLE) {
myIsPre17Compatible = true;
} else if (option == SVNAdminOption.WITH_17_COMPATIBLE) {
myIsWith17Compatible = true;
} else if (option == SVNAdminOption.PARENT_DIR) {
myParentDir = optionValue.getValue();
myParentDir = myParentDir.replace(File.separatorChar, '/');
myParentDir = SVNPathUtil.canonicalizePath(myParentDir);
} else if (option == SVNAdminOption.USE_PRE_COMMIT_HOOK) {
myIsUsePreCommitHook = true;
} else if (option == SVNAdminOption.USE_POST_COMMIT_HOOK) {
myIsUsePostCommitHook = true;
} else if (option == SVNAdminOption.USE_POST_REVPROP_CHANGE_HOOK) {
myIsUsePostRevPropChangeHook = true;
} else if (option == SVNAdminOption.USE_PRE_REVPROP_CHANGE_HOOK) {
myIsUsePreRevPropChangeHook = true;
} else if (option == SVNAdminOption.BYPASS_HOOKS) {
myIsBypassHooks = true;
} else if (option == SVNAdminOption.CLEAN_LOGS) {
myIsCleanLogs = true;
} else if (option == SVNAdminOption.CONFIG_DIR) {
myConfigDir = optionValue.getValue();
} else if (option == SVNAdminOption.WAIT) {
myIsWait = true;
}
}
protected String refineCommandName(String commandName, SVNCommandLine commandLine) throws SVNException {
for (Iterator options = commandLine.optionValues(); options.hasNext();) {
SVNOptionValue optionValue = (SVNOptionValue) options.next();
AbstractSVNOption option = optionValue.getOption();
if (option == SVNAdminOption.HELP || option == SVNAdminOption.QUESTION) {
myIsHelp = true;
} else if (option == SVNAdminOption.VERSION) {
myIsVersion = true;
}
}
if (myIsHelp) {
List newArguments = commandName != null ? Collections.singletonList(commandName) : Collections.EMPTY_LIST;
setArguments(newArguments);
return "help";
}
if (commandName == null) {
if (isVersion()) {
SVNAdminCommand versionCommand = new SVNAdminCommand("--version", null) {
protected Collection createSupportedOptions() {
LinkedList options = new LinkedList();
options.add(SVNAdminOption.VERSION);
options.add(SVNAdminOption.QUIET);
return options;
}
public void run() throws SVNException {
AbstractSVNCommand helpCommand = AbstractSVNCommand.getCommand("help");
helpCommand.init(SVNAdminCommandEnvironment.this);
helpCommand.run();
}
};
AbstractSVNCommand.registerCommand(versionCommand);
return "--version";
}
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_INSUFFICIENT_ARGS, "Subcommand argument required");
SVNErrorManager.error(err, SVNLogType.CLIENT);
}
return commandName;
}
protected String getCommandLineClientName() {
return "svnadmin";
}
public boolean isQuiet() {
return myIsQuiet;
}
public boolean isHelp() {
return myIsHelp;
}
public boolean isVersion() {
return myIsVersion;
}
public String getParentDir() {
return myParentDir;
}
public boolean isIncremental() {
return myIsIncremental;
}
public boolean isDeltas() {
return myIsDeltas;
}
public boolean isIgnoreUUID() {
return myIsIgnoreUUID;
}
public boolean isForceUUID() {
return myIsForceUUID;
}
public boolean isPre14Compatible() {
return myIsPre14Compatible;
}
public boolean isPre15Compatible() {
return myIsPre15Compatible;
}
public boolean isPre16Compatible() {
return myIsPre16Compatible;
}
public boolean isPre17Compatible() {
return myIsPre17Compatible;
}
public boolean isWith17Compatible() {
return myIsWith17Compatible;
}
public boolean isUsePreCommitHook() {
return myIsUsePreCommitHook;
}
public boolean isUsePostCommitHook() {
return myIsUsePostCommitHook;
}
public boolean isUsePostRevPropChangeHook() {
return myIsUsePostRevPropChangeHook;
}
public boolean isUsePreRevPropChangeHook() {
return myIsUsePreRevPropChangeHook;
}
public boolean isBypassHooks() {
return myIsBypassHooks;
}
public boolean isCleanLogs() {
return myIsCleanLogs;
}
public boolean isWait() {
return myIsWait;
}
public SVNRevision getStartRevision() {
return myStartRevision;
}
public SVNRevision getEndRevision() {
return myEndRevision;
}
}