/* * ==================================================================== * 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.svndumpfilter; 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 java.util.StringTokenizer; 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.util.SVNLogType; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNDumpFilterCommandEnvironment extends AbstractSVNCommandEnvironment { private boolean myIsVersion; private boolean myIsQuiet; private boolean myIsHelp; private boolean myIsDropEmptyRevisions; private boolean myIsRenumberRevisions; private boolean myIsPreserveRevisionProperties; private boolean myIsSkipMissingMergeSources; private List myPrefixes; private String myTargetsFile; public boolean isVersion() { return myIsVersion; } public boolean isQuiet() { return myIsQuiet; } public boolean isHelp() { return myIsHelp; } public boolean isDropEmptyRevisions() { return myIsDropEmptyRevisions; } public boolean isRenumberRevisions() { return myIsRenumberRevisions; } public boolean isPreserveRevisionProperties() { return myIsPreserveRevisionProperties; } public boolean isSkipMissingMergeSources() { return myIsSkipMissingMergeSources; } public List getPrefixes() { return myPrefixes; } public SVNDumpFilterCommandEnvironment(String programName, PrintStream out, PrintStream err, InputStream in) { super(programName, out, err, in); } protected ISVNAuthenticationManager createClientAuthenticationManager() { return null; } protected DefaultSVNOptions createClientOptions() throws SVNException { return null; } protected void initOptions(SVNCommandLine commandLine) throws SVNException { super.initOptions(commandLine); if (getCommand().getClass() == SVNDumpFilterHelpCommand.class) { return; } List arguments = getArguments(); myPrefixes = new LinkedList(); if (arguments != null) { for (Iterator prefixesIter = arguments.iterator(); prefixesIter.hasNext();) { String prefix = (String) prefixesIter.next(); prefix = prefix.replace(File.separatorChar, '/'); prefix = SVNPathUtil.canonicalizePath(prefix); if (!prefix.startsWith("/")) { prefix = "/" + prefix; } myPrefixes.add(prefix); } } if (myTargetsFile != null) { File targetsFile = new File(myTargetsFile); String contents = new String(readFromFile(targetsFile)); for (StringTokenizer tokens = new StringTokenizer(contents, "\n\r"); tokens.hasMoreTokens();) { String prefix = tokens.nextToken(); myPrefixes.add(prefix); } } if (myPrefixes.isEmpty()) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CL_INSUFFICIENT_ARGS, "Error: no prefixes supplied."); SVNErrorManager.error(err, SVNLogType.CLIENT); } } protected void initOption(SVNOptionValue optionValue) throws SVNException { AbstractSVNOption option = optionValue.getOption(); if (option == SVNDumpFilterOption.DROP_EMPTY_REVISIONS) { myIsDropEmptyRevisions = true; } else if (option == SVNDumpFilterOption.RENUMBER_REVISIONS) { myIsRenumberRevisions = true; } else if (option == SVNDumpFilterOption.PRESERVE_REVISION_PROPERTIES) { myIsPreserveRevisionProperties = true; } else if (option == SVNDumpFilterOption.SKIP_MISSING_MERGE_SOURCES) { myIsSkipMissingMergeSources = true; } else if (option == SVNDumpFilterOption.VERSION) { myIsVersion = true; } else if (option == SVNDumpFilterOption.QUIET) { myIsQuiet = true; } else if (option == SVNDumpFilterOption.TARGETS) { myTargetsFile = optionValue.getValue(); } else if (option == SVNDumpFilterOption.HELP || option == SVNDumpFilterOption.QUESTION) { myIsHelp = 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 == SVNDumpFilterOption.HELP || option == SVNDumpFilterOption.QUESTION) { myIsHelp = true; } else if (option == SVNDumpFilterOption.VERSION) { myIsVersion = true; } } if (myIsHelp) { List newArguments = commandName != null ? Collections.singletonList(commandName) : Collections.EMPTY_LIST; setArguments(newArguments); return "help"; } if (commandName == null) { if (isVersion()) { SVNDumpFilterCommand versionCommand = new SVNDumpFilterCommand("--version", null, 0) { protected Collection createSupportedOptions() { LinkedList options = new LinkedList(); options.add(SVNDumpFilterOption.VERSION); return options; } public void run() throws SVNException { AbstractSVNCommand helpCommand = AbstractSVNCommand.getCommand("help"); helpCommand.init(SVNDumpFilterCommandEnvironment.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 "svndumpfilter"; } }