/*
* ====================================================================
* 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.svnsync;
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.SVNConsoleAuthenticationProvider;
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.wc.DefaultSVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.internal.wc.ISVNAuthStoreHandler;
import org.tmatesoft.svn.core.internal.wc.ISVNAuthenticationStorageOptions;
import org.tmatesoft.svn.core.internal.wc.ISVNGnomeKeyringPasswordProvider;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @author TMate Software Ltd.
* @version 1.3
*/
public class SVNSyncCommandEnvironment extends AbstractSVNCommandEnvironment {
private boolean myIsNonInteractive;
private boolean myIsNoAuthCache;
private String myUserName;
private String myPassword;
private String mySourceUsername;
private String mySourcePassword;
private String mySyncUsername;
private String mySyncPassword;
private String myConfigDir;
private boolean myIsVersion;
private boolean myIsQuiet;
private boolean myIsHelp;
private boolean myIsTrustServerCertificate;
public boolean isNonInteractive() {
return myIsNonInteractive;
}
public boolean isNoAuthCache() {
return myIsNoAuthCache;
}
public String getUsername() {
return myUserName;
}
public String getPassword() {
return myPassword;
}
public String getSourceUsername() {
return mySourceUsername;
}
public String getSourcePassword() {
return mySourcePassword;
}
public String getSyncUsername() {
return mySyncUsername;
}
public String getSyncPassword() {
return mySyncPassword;
}
public String getConfigDir() {
return myConfigDir;
}
public boolean isVersion() {
return myIsVersion;
}
public boolean isQuiet() {
return myIsQuiet;
}
public boolean isHelp() {
return myIsHelp;
}
public SVNSyncCommandEnvironment(String programName, PrintStream out, PrintStream err, InputStream in) {
super(programName, out, err, in);
}
protected ISVNAuthenticationManager createClientAuthenticationManager() {
File configDir = myConfigDir != null ? new File(myConfigDir) : SVNWCUtil.getDefaultConfigurationDirectory();
final DefaultSVNAuthenticationManager authManager = (DefaultSVNAuthenticationManager) SVNWCUtil.createDefaultAuthenticationManager(configDir,
myUserName, myPassword, !myIsNoAuthCache);
final ISVNAuthStoreHandler authStoreHandler;
final ISVNGnomeKeyringPasswordProvider gnomeKeyringPasswordProvider;
if (!myIsNonInteractive) {
SVNConsoleAuthenticationProvider consoleAuthProvider = new SVNConsoleAuthenticationProvider(myIsTrustServerCertificate);
authManager.setAuthenticationProvider(consoleAuthProvider);
authStoreHandler = consoleAuthProvider;
gnomeKeyringPasswordProvider = consoleAuthProvider;
} else {
authStoreHandler = null;
gnomeKeyringPasswordProvider = null;
}
ISVNAuthenticationStorageOptions authOpts = new ISVNAuthenticationStorageOptions() {
public boolean isNonInteractive() throws SVNException {
return myIsNonInteractive;
}
public ISVNAuthStoreHandler getAuthStoreHandler() throws SVNException {
return authStoreHandler;
}
public boolean isSSLPassphrasePromptSupported() {
return authManager.isSSLPassphrasePromtSupported();
}
public ISVNGnomeKeyringPasswordProvider getGnomeKeyringPasswordProvider() {
return gnomeKeyringPasswordProvider;
}
};
authManager.setAuthenticationStorageOptions(authOpts);
return authManager;
}
protected DefaultSVNOptions createClientOptions() {
return null;
}
protected void initOption(SVNOptionValue optionValue) throws SVNException {
AbstractSVNOption option = optionValue.getOption();
if (option == SVNSyncOption.NON_INTERACTIVE) {
myIsNonInteractive = true;
} else if (option == SVNSyncOption.NO_AUTH_CACHE) {
myIsNoAuthCache = true;
} else if (option == SVNSyncOption.USERNAME) {
myUserName = optionValue.getValue();
} else if (option == SVNSyncOption.PASSWORD) {
myPassword = optionValue.getValue();
} else if (option == SVNSyncOption.SOURCE_USERNAME) {
mySourceUsername = optionValue.getValue();
} else if (option == SVNSyncOption.SOURCE_PASSWORD) {
mySourcePassword = optionValue.getValue();
} else if (option == SVNSyncOption.SYNC_USERNAME) {
mySyncUsername = optionValue.getValue();
} else if (option == SVNSyncOption.SYNC_PASSWORD) {
mySyncPassword = optionValue.getValue();
} else if (option == SVNSyncOption.CONFIG_DIR) {
myConfigDir = optionValue.getValue();
} else if (option == SVNSyncOption.VERSION) {
myIsVersion = true;
} else if (option == SVNSyncOption.QUIET) {
myIsQuiet = true;
} else if (option == SVNSyncOption.TRUST_SERVER_CERT) {
myIsTrustServerCertificate = true;
} else if (option == SVNSyncOption.HELP || option == SVNSyncOption.QUESTION) {
myIsHelp = true;
}
}
protected void validateOptions(SVNCommandLine commandLine) throws SVNException {
super.validateOptions(commandLine);
if ((myUserName != null || myPassword != null) &&
(mySourceUsername != null || mySourcePassword != null) &&
(mySyncUsername != null || mySyncPassword != null)) {
SVNErrorMessage error = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR,
"Cannot use --username or --password with any of --source-username, --source-password, --sync-username, or --sync-password.");
SVNErrorManager.error(error, SVNLogType.CLIENT);
}
if (myUserName != null) {
mySourceUsername = myUserName;
mySyncUsername = myUserName;
}
if (myPassword != null) {
mySourcePassword = myPassword;
mySyncPassword = myPassword;
}
if (myIsTrustServerCertificate && !myIsNonInteractive) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_ARG_PARSING_ERROR, "--trust-server-cert requires --non-interactive");
SVNErrorManager.error(err, SVNLogType.CLIENT);
}
}
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 == SVNSyncOption.HELP || option == SVNSyncOption.QUESTION) {
myIsHelp = true;
} else if (option == SVNSyncOption.VERSION) {
myIsVersion = true;
}
}
if (myIsHelp) {
List newArguments = commandName != null ? Collections.singletonList(commandName) : Collections.EMPTY_LIST;
setArguments(newArguments);
return "help";
}
if (commandName == null) {
if (isVersion()) {
SVNSyncCommand versionCommand = new SVNSyncCommand("--version", null, 0) {
protected Collection createSupportedOptions() {
LinkedList options = new LinkedList();
options.add(SVNSyncOption.VERSION);
return options;
}
public void run() throws SVNException {
AbstractSVNCommand helpCommand = AbstractSVNCommand.getCommand("help");
helpCommand.init(SVNSyncCommandEnvironment.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 "svnsync";
}
}