ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ehatc...@apache.org
Subject cvs commit: jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/sos SOSTest.java
Date Thu, 31 Jan 2002 19:47:40 GMT
ehatcher    02/01/31 11:47:40

  Modified:    src/main/org/apache/tools/ant/taskdefs defaults.properties
               docs/manual optionaltasklist.html
  Added:       src/main/org/apache/tools/ant/taskdefs/optional/sos
                        package.html SOS.java SOSCheckin.java
                        SOSCheckout.java SOSCmd.java SOSGet.java
                        SOSLabel.java
               docs/manual/OptionalTasks sos.html
               src/testcases/org/apache/tools/ant/taskdefs/optional/sos
                        SOSTest.java
  Log:
  SourceOffSite tasks submitted by Jesse Stockall <jesse@cryptocard.com>.
  
  The sos.html file is slightly out of synch with the actual attributes - but Jesse will submit updated documentation soon.
  
  Revision  Changes    Path
  1.107     +4 -0      jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
  retrieving revision 1.106
  retrieving revision 1.107
  diff -u -r1.106 -r1.107
  --- defaults.properties	14 Jan 2002 22:24:25 -0000	1.106
  +++ defaults.properties	31 Jan 2002 19:47:40 -0000	1.107
  @@ -135,6 +135,10 @@
   jspc=org.apache.tools.ant.taskdefs.optional.jsp.JspC
   replaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExp
   translate=org.apache.tools.ant.taskdefs.optional.i18n.Translate
  +sosget=org.apache.tools.ant.taskdefs.optional.sos.SOSGet
  +soscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin
  +soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout
  +soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel
   
   # deprecated ant tasks (kept for back compatibility)
   starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
  
  
  
  1.23      +1 -0      jakarta-ant/docs/manual/optionaltasklist.html
  
  Index: optionaltasklist.html
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/docs/manual/optionaltasklist.html,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- optionaltasklist.html	18 Dec 2001 22:18:17 -0000	1.22
  +++ optionaltasklist.html	31 Jan 2002 19:47:40 -0000	1.23
  @@ -43,6 +43,7 @@
   <a href="OptionalTasks/rpm.html">Rpm</a><br>
   <a href="OptionalTasks/script.html">Script</a><br>
   <a href="OptionalTasks/sound.html">Sound</a><br>
  +<a href="OptionalTasks/sos.html">SourceOffSite</a><br>
   <a href="OptionalTasks/starteam.html">Starteam Tasks</a><br>
   <a href="OptionalTasks/stylebook.html">Stylebook</a><br>
   <a href="OptionalTasks/telnet.html">Telnet</a><br>
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/package.html
  
  Index: package.html
  ===================================================================
  <html>
  <body>
    <p>
      Ant tasks for working with a SourceOffSite source control system
    </p>
    <p>
      The &lt;SOSGet&gt; Retreives file(s) from a SOS database<br>
      The &lt;SOSCheckin&gt; Commits and unlocks file(s) in a SOS database<br>
      The &lt;SOSCheckout&gt; Retreives and lock file(s) in a SOS database<br>
      The &lt;SOSLabel&gt; Label a SOS database<br>
    </p>
  </body>
  </html>
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java
  
  Index: SOS.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import java.io.File;
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.taskdefs.Execute;
  import org.apache.tools.ant.taskdefs.LogStreamHandler;
  import org.apache.tools.ant.types.Commandline;
  import org.apache.tools.ant.types.Path;
  
  /**
   * A base class for creating tasks for executing commands on SourceOffSite
   * <p>
   * The class extends the 'exec' task as it operates by executing the soscmd(.exe) program
   * supplied with SOS. By default the task expects soscmd(.exe) to be in the path,
   * you can override this be specifying the sosdir attribute.
   * </p>
   * <p>
   * This class provides set and get methods for the following attributes
   * <br> 'vssserverpath'
   * <br> 'sosserverpath'
   * <br> 'vsspath'
   * <br> 'projectpath'
   * <br> 'username'
   * <br> 'password'
   * <br> 'soscmddir'
   * <br> 'file'
   * <br> 'soshome'
   * <br> 'localpath"
   * <br> 'comment'
   * <br> 'label'
   * <br> 'version'
   * <br> 'recursive'
   * <br> 'verbose'
   * <br> 'nocache'
   * <br> 'nocompression'
   * <br>
   *  It also contains constants for the flags that can be passed to SOS.
   * <p>
   *  These tasks were inspired by the VSS tasks
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  
  public abstract class SOS extends Task {
  
      private String sosCmdDir = null;
      private String sosUsername = null;
      private String sosPassword = "";
      private String projectPath = null;
      private String vssServerPath = null;
      private String sosServerPath = null;
      private String sosHome = null;
      private String localPath = null;
      private String version = null;
      private String label = null;
      private String comment = null;
      private String filename = null;
  
      private boolean noCompress = false;
      private boolean noCache = false;
      private boolean recursive = false;
      private boolean verbose = false;
  
  
      /**
       * Disable the cache
       *
       * @param  nocache  The new noCache value
       */
      public void setNoCache(boolean nocache) {
          noCache = nocache;
      }
  
  
      /**
       * Disable compression
       *
       * @param  nocompress  The new noCompress value
       */
      public void setNoCompress(boolean nocompress) {
          noCompress = nocompress;
      }
  
  
      /**
       * Set the directory where soscmd(.exe) is located
       *
       * @param  dir  The new sosCmd value
       */
      public final void setSosCmd(String dir) {
          sosCmdDir = project.translatePath(dir);
      }
  
  
      /**
       * Set the username to use to access SOS.
       *
       * @param  username  The new username value
       */
      public final void setUsername(String username) {
          sosUsername = username;
      }
  
  
      /**
       * Set the password to use to access SOS.
       *
       * @param  password  The new password value
       */
      public final void setPassword(String password) {
          sosPassword = password;
      }
  
  
      /**
       * Set the path to the item in SOS to operate on
       * <p>
       * To avoid the "$$" in th build file we add it here
       *
       * @param  projectpath  The new projectPath value
       */
      public final void setProjectPath(String projectpath) {
          projectPath = SOSCmd.PROJECT_PREFIX + projectpath;
      }
  
  
      /**
       * Set the path to the location of the ss.ini
       *
       * @param  vssServerPath  The new vssServerPath value
       */
      public final void setVssServerPath(String vssServerPath) {
          this.vssServerPath = vssServerPath;
      }
  
  
      /**
       * Set the path of soshome
       *
       * @param  sosHome  The new sosHome value
       */
      public final void setSosHome(String sosHome) {
          this.sosHome = sosHome;
      }
  
  
      /**
       * Set the address & port of SourceOffSite Server
       *
       * @param  sosServerPath  The new sosServerPath value
       */
      public final void setSosServerPath(String sosServerPath) {
          this.sosServerPath = sosServerPath;
      }
  
  
      /**
       * Set the local path.
       *
       * @param  path  The new localPath value
       */
      public void setLocalPath(Path path) {
          localPath = path.toString();
      }
  
  
      /**
       * Set the filename to get from SOS
       *
       * @param  filename  The new file value
       */
      public final void setFile(String filename) {
          this.filename = filename;
      }
  
  
      /**
       * Set behaviour verbose or quiet
       *
       * @param  verbose  The new verbose value
       */
      public void setVerbose(boolean verbose) {
          this.verbose = verbose;
      }
  
  
      /**
       * Set behaviour recursive or non-recursive
       *
       * @param  recursive  The new recursive value
       */
      public void setRecursive(boolean recursive) {
          this.recursive = recursive;
      }
  
  
      /**
       * Set the stored version string
       *
       * @param  version  The new version value
       */
      public void setVersion(String version) {
          this.version = version;
      }
  
  
      /**
       * Set the labeled version to operate on in SourceSafe
       *
       * @param  label  The new label value
       */
      public void setLabel(String label) {
          this.label = label;
      }
  
  
      /**
       * Set the comment to get
       *
       * @param  comment  The new comment value
       */
      public void setComment(String comment) {
          this.comment = comment;
      }
  
  
      /**
       * Get the executable to run. Add the path if it was specifed in the build file
       *
       * @return    String the executable to run
       */
      public String getSosCommand() {
          if (sosCmdDir == null) {
              return SOSCmd.COMMAND_SOS_EXE;
          } else {
              return sosCmdDir + File.separator + SOSCmd.COMMAND_SOS_EXE;
          }
      }
  
      /**
       * Get the comment
       * @return String if it was set, null if not
       */
      public String getComment() {
          return comment;
      }
  
  
      /**
       * Get the version
       * @return String if it was set, null if not
       */
      public String getVersion() {
          return version;
      }
  
  
      /**
       * Get the label
       * @return String if it was set, null if not
       */
      public String getLabel() {
          return label;
      }
  
  
      /**
       * Get the username
       * @return String if it was set, null if not
       */
      public String getUsername() {
          return sosUsername;
      }
  
  
      /**
       * Get the password
       * @return String empty string if it wans't set
       */
      public String getPassword() {
          return sosPassword;
      }
  
  
      /**
       * Get the project path
       * @return String if it was set, null if not
       */
      public String getProjectPath() {
          return projectPath;
      }
  
  
      /**
       * Get the VSS server path
       * @return String if it was set, null if not
       */
      public String getVssServerPath() {
          return vssServerPath;
      }
  
  
      /**
       * Get the SOS home directory
       * @return String if it was set, null if not
       */
      public String getSosHome() {
          return sosHome;
      }
  
  
      /**
       * Get the SOS serve path
       * @return String if it was set, null if not
       */
      public String getSosServerPath() {
          return sosServerPath;
      }
  
  
      /**
       * Get the filename to be acted upon
       * @return String if it was set, null if not
       */
      public String getFilename() {
          return filename;
      }
  
  
      /**
       * Get the NoCompress flag
       *
       * @return    String the 'nocompress' Flag if the attribute was 'true', otherwise an empty string
       */
      public String getNoCompress() {
          if (!noCompress) {
              return "";
          } else {
              return SOSCmd.FLAG_NO_COMPRESSION;
          }
      }
  
  
      /**
       * Get the NoCache flag
       *
       * @return    String the 'nocache' Flag if the attribute was 'true', otherwise an empty string
       */
      public String getNoCache() {
          if (!noCache) {
              return "";
          } else {
              return SOSCmd.FLAG_NO_CACHE;
          }
      }
  
  
      /**
       * Get the 'verbose' Flag
       *
       * @return    String the 'verbose' Flag if the attribute was 'true', otherwise an empty string
       */
      public String getVerbose() {
          if (!verbose) {
              return "";
          } else {
              return SOSCmd.FLAG_VERBOSE;
          }
      }
  
  
      /**
       * Get the 'recursive' Flag
       *
       * @return    String the 'recursive' Flag if the attribute was 'true', otherwise an empty string
       */
      public String getRecursive() {
          if (!recursive) {
              return "";
          } else {
              return SOSCmd.FLAG_RECURSION;
          }
      }
  
  
      /**
       * Builds and returns the working directory
       * <p>
       * The localpath is created if it didn't exist
       *
       * @return    String the absolute path of the working directory
       */
      public String getLocalPath() {
          if (localPath == null) {
              return project.getBaseDir().getAbsolutePath();
          } else {
              // make sure localDir exists, create it if it doesn't
              File dir = project.resolveFile(localPath);
              if (!dir.exists()) {
                  boolean done = dir.mkdirs();
                  if (!done) {
                      String msg = "Directory " + localPath + " creation was not " +
                              "successful for an unknown reason";
                      throw new BuildException(msg, location);
                  }
                  project.log("Created dir: " + dir.getAbsolutePath());
              }
              return dir.getAbsolutePath();
          }
      }
  
  
      /**
       * Execute the created command line
       *
       * @param  cmd              Description of Parameter
       * @return                  int the exit code
       * @throws  BuildException
       */
      protected int run(Commandline cmd) {
          try {
              Execute exe = new Execute(new LogStreamHandler(this,
                      Project.MSG_INFO,
                      Project.MSG_WARN));
  
              exe.setAntRun(project);
              exe.setWorkingDirectory(project.getBaseDir());
              exe.setCommandline(cmd.getCommandline());
              return exe.execute();
          } catch (java.io.IOException e) {
              throw new BuildException(e, location);
          }
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCheckin.java
  
  Index: SOSCheckin.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.types.Commandline;
  import org.apache.tools.ant.types.Path;
  
  /**
   * Task to commit and unlock file(s) in Visual Source Safe via a SourceOffSite server.
   * <p>
   * The following attributes are interpretted:
   * <table border="1">
   *   <tr>
   *     <th>Attribute</th>
   *     <th>Values</th>
   *     <th>Required</th>
   *   </tr>
   *   <tr>
   *     <td>soscmddir</td>
   *     <td>Directory which contains soscmd(.exe) <br>
   *     soscmd(.exe) must be in the path if this is not specified</td>
   *     <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>vssserverpath</td>
   *      <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>sosserverpath</td>
   *      <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>projectpath</td>
   *      <td>SourceSafe project path without the "$"</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>file</td>
   *      <td>Filename to act upon<br> If no file is specified then act upon the project</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>username</td>
   *      <td>SourceSafe username</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>password</td>
   *      <td>SourceSafe password</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>localpath</td>
   *      <td>Override the working directory and get to the specified path</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>soshome</td>
   *      <td>The path to the SourceOffSite home directory</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>nocompression</td>
   *      <td>true or false - disable compression</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>recursive</td>
   *      <td>true or false - Only works with the CheckOutProject command</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>nocache</td>
   *      <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>verbose</td>
   *      <td>true or false - Status messages are displayed</td>
   *      <td>No</td>
   *   </tr>
   *   <td>comment</td>
   *      <td>A comment to be applied to all files being checked in</td>
   *      <td>No</td>
   *   </tr>
   * </table>
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  
  public class SOSCheckin extends SOS {
      Commandline commandLine;
  
  
      /**
       * Executes the task.
       * <br>
       * Builds a command line to execute soscmd and then calls Exec's run method
       * to execute the command line.
       *
       * @exception  BuildException  Description of Exception
       */
      public void execute() throws BuildException {
          int result = 0;
          buildCmdLine();
          result = run(commandLine);
          if (result == 255) {
              // This is the exit status
              String msg = "Failed executing: " + commandLine.toString();
              throw new BuildException(msg, location);
          }
      }
  
  
      /**
       * Build the command line <br>
       *
       * CheckInFile required parameters: -server -name -password -database -project -file<br>
       * CheckInFile optional parameters: -workdir -log -verbose -nocache
       *  -nocompression -soshome<br>
       *
       * CheckInProject required parameters: -server -name -password -database -project<br>
       * CheckInProject optional parameters: workdir -recursive -log -verbose -nocache
       * -nocompression -soshome<br>
       *
       * @return    Commandline the generated command to be executed
       */
      protected Commandline buildCmdLine() {
          commandLine = new Commandline();
          // Get the path to the soscmd(.exe)
          commandLine.setExecutable(getSosCommand());
          // If we find a "file" attribute then act on a file otherwise act on a project
          if (getFilename() != null) {
              // add -command CheckInFile to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_CHECKIN_FILE);
              // add -file xxxxx to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_FILE);
              commandLine.createArgument().setValue(getFilename());
          } else {
              // add -command CheckInProject to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_CHECKIN_PROJECT);
              // look for a recursive option
              commandLine.createArgument().setValue(getRecursive());
          }
          // SOS server address is required
          if (getSosServerPath() == null) {
              throw new BuildException("sosserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_SERVER);
          commandLine.createArgument().setValue(getSosServerPath());
          // Login info is required
          if (getUsername() == null) {
              throw new BuildException("username attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_USERNAME);
          commandLine.createArgument().setValue(getUsername());
          // The SOS class knows that the SOS server needs the password flag,
          // even if there is no password ,so we send a " "
          commandLine.createArgument().setValue(SOSCmd.FLAG_PASSWORD);
          commandLine.createArgument().setValue(getPassword());
          // VSS Info is required
          if (getVssServerPath() == null) {
              throw new BuildException("vssserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_VSS_SERVER);
          commandLine.createArgument().setValue(getVssServerPath());
          // VSS project is required
          if (getProjectPath() == null) {
              throw new BuildException("projectpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_PROJECT);
          commandLine.createArgument().setValue(getProjectPath());
  
          // The following options are optional.
  
          // -verbose
          commandLine.createArgument().setValue(getVerbose());
          // Disable Compression
          commandLine.createArgument().setValue(getNoCompress());
          // Path to the SourceOffSite home directory /home/user/.sos
          if (getSosHome() == null) {
              // If -soshome was not specified then we can look for nocache
              commandLine.createArgument().setValue(getNoCache());
          } else {
              commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_HOME);
              commandLine.createArgument().setValue(getSosHome());
          }
          // If a working directory was specified then add it to the command line
          if (getLocalPath() != null) {
              commandLine.createArgument().setValue(SOSCmd.FLAG_WORKING_DIR);
              commandLine.createArgument().setValue(getLocalPath());
          }
          // Look for a comment
          if (getComment() != null) {
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMENT);
              commandLine.createArgument().setValue(getComment());
          }
          return commandLine;
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCheckout.java
  
  Index: SOSCheckout.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.types.Commandline;
  import org.apache.tools.ant.types.Path;
  
  /**
   * Task to retreive and lock file(s) in Visual Source Safe via a SourceOffSite server.
   * <p>
   * The following attributes are interpretted:
   * <table border="1">
   *   <tr>
   *     <th>Attribute</th>
   *     <th>Values</th>
   *     <th>Required</th>
   *   </tr>
   *   <tr>
   *     <td>soscmddir</td>
   *     <td>Directory which contains soscmd(.exe) <br>
   *     soscmd(.exe) must be in the path if this is not specified</td>
   *     <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>vssserverpath</td>
   *      <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>sosserverpath</td>
   *      <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>projectpath</td>
   *      <td>SourceSafe project path without the "$"</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>file</td>
   *      <td>Filename to act upon<br> If no file is specified then act upon the project</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>username</td>
   *      <td>SourceSafe username</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>password</td>
   *      <td>SourceSafe password</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>localpath</td>
   *      <td>Override the working directory and get to the specified path</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>soshome</td>
   *      <td>The path to the SourceOffSite home directory</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>nocompression</td>
   *      <td>true or false - disable compression</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>recursive</td>
   *      <td>true or false - Only works with the CheckOutProject command</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>nocache</td>
   *      <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>verbose</td>
   *      <td>true or false - Status messages are displayed</td>
   *      <td>No</td>
   *   </tr>
   * </table>
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  
  public class SOSCheckout extends SOS {
      Commandline commandLine;
  
  
      /**
       * Executes the task.
       * <br>
       * Builds a command line to execute soscmd and then calls Exec's run method
       * to execute the command line.
       *
       * @exception  BuildException  Description of Exception
       */
      public void execute() throws BuildException {
          int result = 0;
          buildCmdLine();
          result = run(commandLine);
          if (result == 255) {
              // This is the exit status
              String msg = "Failed executing: " + commandLine.toString();
              throw new BuildException(msg, location);
          }
      }
  
  
      /**
       * Build the command line <br>
       *
       * CheckOutFile required parameters: -server -name -password -database -project -file<br>
       * CheckOutFile optional parameters: -workdir -verbose -nocache -nocompression -soshome<br>
       *
       * CheckOutProject required parameters: -server -name -password -database -project<br>
       * CheckOutProject optional parameters:-workdir -recursive -verbose -nocache
       * -nocompression -soshome<br>
       *
       * @return    Commandline the generated command to be executed
       */
      protected Commandline buildCmdLine() {
          commandLine = new Commandline();
          // Get the path to the soscmd(.exe)
          commandLine.setExecutable(getSosCommand());
          // If we find a "file" attribute then act on a file otherwise act on a project
          if (getFilename() != null) {
              // add -command CheckOutFile to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_CHECKOUT_FILE);
              // add -file xxxxx to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_FILE);
              commandLine.createArgument().setValue(getFilename());
          } else {
              // add -command CheckOutProject to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_CHECKOUT_PROJECT);
              // look for a recursive option
              commandLine.createArgument().setValue(getRecursive());
          }
          // SOS server address is required
          if (getSosServerPath() == null) {
              throw new BuildException("sosserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_SERVER);
          commandLine.createArgument().setValue(getSosServerPath());
          // Login info is required
          if (getUsername() == null) {
              throw new BuildException("username attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_USERNAME);
          commandLine.createArgument().setValue(getUsername());
          // The SOS class knows that the SOS server needs the password flag,
          // even if there is no password ,so we send a " "
          commandLine.createArgument().setValue(SOSCmd.FLAG_PASSWORD);
          commandLine.createArgument().setValue(getPassword());
          // VSS Info is required
          if (getVssServerPath() == null) {
              throw new BuildException("vssserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_VSS_SERVER);
          commandLine.createArgument().setValue(getVssServerPath());
          // VSS project is required
          if (getProjectPath() == null) {
              throw new BuildException("projectpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_PROJECT);
          commandLine.createArgument().setValue(getProjectPath());
  
          // The following options are optional.
  
          // -verbose
          commandLine.createArgument().setValue(getVerbose());
          // Disable Compression
          commandLine.createArgument().setValue(getNoCompress());
          // Path to the SourceOffSite home directory /home/user/.sos
          if (getSosHome() == null) {
              // If -soshome was not specified then we can look for nocache
              commandLine.createArgument().setValue(getNoCache());
          } else {
              commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_HOME);
              commandLine.createArgument().setValue(getSosHome());
          }
          // If a working directory was specified then add it to the command line
          if (getLocalPath() != null) {
              commandLine.createArgument().setValue(SOSCmd.FLAG_WORKING_DIR);
              commandLine.createArgument().setValue(getLocalPath());
          }
          return commandLine;
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCmd.java
  
  Index: SOSCmd.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   *
   */
  
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  /**
   * Interface to hold constants used by the SOS tasks
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  public interface SOSCmd {
      // soscmd Command options
      public final static String COMMAND_SOS_EXE = "soscmd";
      public final static String COMMAND_GET_FILE = "GetFile";
      public final static String COMMAND_GET_PROJECT = "GetProject";
      public final static String COMMAND_CHECKOUT_FILE = "CheckOutFile";
      public final static String COMMAND_CHECKOUT_PROJECT = "CheckOutProject";
      public final static String COMMAND_CHECKIN_FILE = "CheckInFile";
      public final static String COMMAND_CHECKIN_PROJECT = "CheckInProject";
      public final static String COMMAND_HISTORY = "GetFileHistory";
      public final static String COMMAND_LABEL = "AddLabel";
      public final static String PROJECT_PREFIX = "$";
      // soscmd Option flags
      public final static String FLAG_COMMAND = "-command";
      public final static String FLAG_VSS_SERVER = "-database";
      public final static String FLAG_USERNAME = "-name";
      public final static String FLAG_PASSWORD = "-password";
      public final static String FLAG_COMMENT = "-log";
      public final static String FLAG_WORKING_DIR = "-workdir";
      public final static String FLAG_RECURSION = "-recursive";
      public final static String FLAG_VERSION = "-revision";
      public final static String FLAG_LABEL = "-label";
      public final static String FLAG_NO_COMPRESSION = "-nocompress";
      public final static String FLAG_NO_CACHE = "-nocache";
      public final static String FLAG_SOS_SERVER = "-server";
      public final static String FLAG_SOS_HOME = "-soshome";
      public final static String FLAG_PROJECT = "-project";
      public final static String FLAG_FILE = "-file";
      public final static String FLAG_VERBOSE = "-verbose";
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSGet.java
  
  Index: SOSGet.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.types.Commandline;
  
  /**
   * Task to retreive file(s) from Visual Source Safe via a SourceOffSite server.
   * <p>
   * The following attributes are interpretted:
   * <table border="1">
   *    <tbody>
   *      <tr>
   *         <th>Attribute</th>
   *         <th>Values</th>
   *         <th>Required</th>
   *       </tr>
   *       <tr>
   *         <td>soscmddir</td>
   *         <td>Directory which contains soscmd(.exe) <br>
   *         soscmd(.exe) must be in the path if this is not specified</td>
   *         <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>vssserverpath</td>
   *          <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
   *          <td>Yes</td>
   *       </tr>
   *       <tr>
   *          <td>sosserverpath</td>
   *          <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
   *          <td>Yes</td>
   *       </tr>
   *       <tr>
   *          <td>projectpath</td>
   *          <td>SourceSafe project path without the "$"</td>
   *          <td>Yes</td>
   *       </tr>
   *       <tr>
   *          <td>file</td>
   *          <td>Filename to act upon<br>
   *              If no file is specified then act upon the project</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>username</td>
   *          <td>SourceSafe username</td>
   *          <td>Yes</td>
   *       </tr>
   *       <tr>
   *          <td>password</td>
   *          <td>SourceSafe password</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>localpath</td>
   *          <td>Override the working directory and get to the specified path</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>soshome</td>
   *          <td>The path to the SourceOffSite home directory</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>nocompression</td>
   *          <td>true or false - disable compression</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>recursive</td>
   *          <td>true or false - Only works with the GetProject command</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>version</td>
   *          <td>a version number to get - Only works with the GetFile command</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>label</td>
   *          <td>a label version to get - Only works with the GetProject command</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>nocache</td>
   *          <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
   *          <td>No</td>
   *       </tr>
   *       <tr>
   *          <td>verbose</td>
   *         <td>true or false - Status messages are displayed</td>
   *        <td>No</td>
   *      </tr>
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  
  public class SOSGet extends SOS {
      Commandline commandLine;
  
  
      /**
       * Executes the task.
       * <br>
       * Builds a command line to execute soscmd and then calls Exec's run method
       * to execute the command line.
       *
       * @exception  BuildException  Description of Exception
       */
      public void execute() throws BuildException {
          int result = 0;
          buildCmdLine();
          result = run(commandLine);
          if (result == 255) {
              // This is the exit status
              String msg = "Failed executing: " + commandLine.toString();
              throw new BuildException(msg, location);
          }
      }
  
  
      /**
       * Build the command line <br>
       *
       * GetFile required parameters: -server -name -password -database -project -file<br>
       * GetFile optional parameters: -workdir -revision -verbose -nocache -nocompression -soshome<br>
       *
       * GetProject required parameters: -server -name -password -database -project<br>
       * GetProject optional parameters: -label -workdir -recursive -verbose -nocache
       * -nocompression -soshome<br>
       *
       * @return    Commandline the generated command to be executed
       */
      protected Commandline buildCmdLine() {
          commandLine = new Commandline();
          // Get the path to the soscmd(.exe)
          commandLine.setExecutable(getSosCommand());
          // If we find a "file" attribute then act on a file otherwise act on a project
          if (getFilename() != null) {
              // add -command GetFile to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_GET_FILE);
              // add -file xxxxx to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_FILE);
              commandLine.createArgument().setValue(getFilename());
              // look for a version attribute
              if (getVersion() != null) {
                  //add -revision xxxxx to the commandline
                  commandLine.createArgument().setValue(SOSCmd.FLAG_VERSION);
                  commandLine.createArgument().setValue(getVersion());
              }
          } else {
              // add -command GetProject to the commandline
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
              commandLine.createArgument().setValue(SOSCmd.COMMAND_GET_PROJECT);
              // look for a recursive option
              commandLine.createArgument().setValue(getRecursive());
              // look for a label option
              if (getLabel() != null) {
                  commandLine.createArgument().setValue(SOSCmd.FLAG_LABEL);
                  commandLine.createArgument().setValue(getLabel());
              }
          }
          // SOS server address is required
          if (getSosServerPath() == null) {
              throw new BuildException("sosserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_SERVER);
          commandLine.createArgument().setValue(getSosServerPath());
          // Login info is required
          if (getUsername() == null) {
              throw new BuildException("username attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_USERNAME);
          commandLine.createArgument().setValue(getUsername());
          // The SOS class knows that the SOS server needs the password flag,
          // even if there is no password ,so we send a " "
          commandLine.createArgument().setValue(SOSCmd.FLAG_PASSWORD);
          commandLine.createArgument().setValue(getPassword());
          // VSS Info is required
          if (getVssServerPath() == null) {
              throw new BuildException("vssserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_VSS_SERVER);
          commandLine.createArgument().setValue(getVssServerPath());
          // SS project path is required
          if (getProjectPath() == null) {
              throw new BuildException("projectpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_PROJECT);
          commandLine.createArgument().setValue(getProjectPath());
  
          // The following options are optional.
  
          // -verbose
          commandLine.createArgument().setValue(getVerbose());
          // Disable Compression
          commandLine.createArgument().setValue(getNoCompress());
          // Path to the SourceOffSite home directory /home/user/.sos
          if (getSosHome() == null) {
              // If -soshome was not specified then we can look for nocache
              commandLine.createArgument().setValue(getNoCache());
          } else {
              commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_HOME);
              commandLine.createArgument().setValue(getSosHome());
          }
          //If a working directory was specified then add it to the command line
          if (getLocalPath() != null) {
              commandLine.createArgument().setValue(SOSCmd.FLAG_WORKING_DIR);
              commandLine.createArgument().setValue(getLocalPath());
          }
          return commandLine;
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSLabel.java
  
  Index: SOSLabel.java
  ===================================================================
  /*
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 2000 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Ant", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.types.Commandline;
  
  /**
   * Task to label a Visual Source Safe via a SourceOffSite server.
   * <p>
   * The following attributes are interpretted:
   * <table border="1">
   *   <tr>
   *     <th>Attribute</th>
   *     <th>Values</th>
   *     <th>Required</th>
   *   </tr>
   *   <tr>
   *     <td>soscmddir</td>
   *     <td>Directory which contains soscmd(.exe) <br>
   *     soscmd(.exe) must be in the path if this is not specified</td>
   *     <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>vssserverpath</td>
   *      <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>sosserverpath</td>
   *      <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>projectpath</td>
   *      <td>SourceSafe project path without the "$"</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>username</td>
   *      <td>SourceSafe username</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>password</td>
   *      <td>SourceSafe password</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>label</td>
   *      <td>The label to apply to a project</td>
   *      <td>Yes</td>
   *   </tr>
   *   <tr>
   *      <td>comment</td>
   *      <td>A comment to be applied to all files being labeled</td>
   *      <td>No</td>
   *   </tr>
   *   <tr>
   *      <td>verbose</td>
   *      <td>true or false - Status messages are displayed</td>
   *      <td>No</td>
   *   </tr>
   * </table>
   *
   * @author    <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  
  public class SOSLabel extends SOS {
      Commandline commandLine;
  
  
      /**
       *  Executes the task. <br>
       *  Builds a command line to execute soscmd and then calls Exec's run method
       *  to execute the command line.
       *
       * @exception  BuildException  Description of Exception
       */
      public void execute() throws BuildException {
          int result = 0;
          buildCmdLine();
          result = run(commandLine);
          if (result == 255) {
              // This is the exit status
              String msg = "Failed executing: " + commandLine.toString();
              throw new BuildException(msg, location);
          }
      }
  
  
      /**
       *  Build the command line <br>
       *  AddLabel required parameters: -server -name -password -database -project -label<br>
       *  AddLabel optional parameters: -verbose -comment<br>
       *
       * @return    Commandline the generated command to be executed
       */
      protected Commandline buildCmdLine() {
          commandLine = new Commandline();
          // Get the path to the soscmd(.exe)
          commandLine.setExecutable(getSosCommand());
          // add -command AddLabel to the commandline
          commandLine.createArgument().setValue(SOSCmd.FLAG_COMMAND);
          commandLine.createArgument().setValue(SOSCmd.COMMAND_LABEL);
          // SOS server address is required
          if (getSosServerPath() == null) {
              throw new BuildException("sosserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_SOS_SERVER);
          commandLine.createArgument().setValue(getSosServerPath());
          // Login info is required
          if (getUsername() == null) {
              throw new BuildException("username attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_USERNAME);
          commandLine.createArgument().setValue(getUsername());
          // The SOS class knows that the SOS server needs the password flag,
          // even if there is no password ,so we send a " "
          commandLine.createArgument().setValue(SOSCmd.FLAG_PASSWORD);
          commandLine.createArgument().setValue(getPassword());
          // VSS Info is required
          if (getVssServerPath() == null) {
              throw new BuildException("vssserverpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_VSS_SERVER);
          commandLine.createArgument().setValue(getVssServerPath());
          // SS project path is required
          if (getProjectPath() == null) {
              throw new BuildException("projectpath attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_PROJECT);
          commandLine.createArgument().setValue(getProjectPath());
          // a label is required
          if (getLabel() == null) {
              throw new BuildException("label attribute must be set!", location);
          }
          commandLine.createArgument().setValue(SOSCmd.FLAG_LABEL);
          commandLine.createArgument().setValue(getLabel());
  
          // The following options are optional.
  
          // -verbose
          commandLine.createArgument().setValue(getVerbose());
          // Look for a comment
          if (getComment() != null) {
              commandLine.createArgument().setValue(SOSCmd.FLAG_COMMENT);
              commandLine.createArgument().setValue(getComment());
          }
          return commandLine;
      }
  }
  
  
  
  
  1.1                  jakarta-ant/docs/manual/OptionalTasks/sos.html
  
  Index: sos.html
  ===================================================================
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
                                                 
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <title>Ant User Manual</title>
      
  </head>
    <body>
           
  <div align="center">     
  <h1>SourceOffSite Tasks User Manual</h1>
           
  <div align="left">by<br>
       <br>
           
  <ul>
         <li><a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>   </li>
           
  </ul>
             Version 1.1 2002/01/23<br>
       <br>
           
  <hr width="100%" size="2">     
  <h2>Contents</h2>
           
  <ul>
         <li><a href="#intro">Introduction</a>   </li>
         <li><a href="#tasks">The Tasks</a>   </li>
           
  </ul>
       <br>
           
  <h2><a name="intro">Introduction</a> </h2>
           
  <p>These tasks provide an interface to the  <a href="http://msdn.microsoft.com/ssafe/default.asp" target="_top">
              Microsoft Visual SourceSafe</a>         SCM via <a href="http://www.sourcegear.com">
      SourceGear's</a> <a href="http://sourcegear.com/sos/index.htm">SourceOffSite</a>
               product. SourceOffSite is an add-on to Microsoft's VSS, that 
  allows    remote   development teams and tele-commuters          that need 
  fast and    secure read/write  access to a centralized SourceSafe        
   database  via  any TCP/IP connection  . SOS also provides Linux &amp; Solaris 
  clients.  The  <code> org.apache.tools.ant.taskdefs.optional.sos</code>  
   package consists  of a simple framework to support SOS functionality as well
  as some Ant tasks  encapsulating frequently used SOS commands.  Although it
  is possible to use  these commands on the desktop,  they were primarily intended
  to be used by  automated build systems. These tasks have been tested with
  SourceOffSite   version 3.5.1 connecting to VisualSourceSafe 6.0. The tasks
  have been tested   with Linux, Solaris &amp; Windows2000</p>
           
  <h2><a name="tasks">The Tasks</a> </h2>
           
  <table border="0" cellspacing="0" cellpadding="3">
         <tbody>
           <tr>
             <td><a href="#SOSGet">sosget</a>       </td>
             <td>Retrieves a read-only copy of the specified project or file.</td>
           </tr>
           <tr>
             <td><a href="#SOSLabel">    soslabel</a>       </td>
             <td>Assigns a label to the specified project.</td>
           </tr>
           <tr>
             <td><a href="#SOSCheckIn">     soscheckin</a>       </td>
             <td>Updates VSS with changes made to a checked out file or project,
        and unlocks the VSS master copy.</td>
           </tr>
           <tr>
             <td><a href="#SOSCheckOut">      soscheckout</a>       </td>
             <td>Retrieves a read-write copy of&nbsp;the specified project
  or  file,     locking the&nbsp;VSS master copy</td>
           </tr>
                     
    </tbody>     
  </table>
       <br>
           
  <hr width="100%" size="2">     
  <h2>Task Descriptions</h2>
           
  <h2><a name="SOSGet"></a>        SOSGet<br>
       </h2>  
  <h3>Description</h3>
               Task to perform GET commands from Microsoft Visual SourceSafe via SOS<br>               
  <h3>Parameters</h3>
       </div>
       </div>
     
  <table border="1">
       <tbody>
         <tr>
            <th>Attribute</th>
            <th>Values</th>
            <th>Required</th>
          </tr>
          <tr>
            <td>soscmddir</td>
            <td>Directory which contains soscmd(.exe) <br>
            soscmd(.exe) must be in the path if this is not specified</td>
            <td>No</td>
          </tr>
          <tr>
             <td>vssserverpath</td>
             <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
             <td>Yes</td>
          </tr>
          <tr>
             <td>sosserverpath</td>
             <td>address &amp; port of the SOS server  - eg. 192.168.0.1:8888</td>
             <td>Yes</td>
          </tr>
          <tr>
             <td>projectpath</td>
             <td>SourceSafe project path without the "$"</td>
             <td>Yes</td>
          </tr>
          <tr>
             <td>file</td>
             <td>Filename to act upon<br>
                 If no file is specified then act upon the project</td>
             <td>No</td>
          </tr>
          <tr>
             <td>username</td>
             <td>SourceSafe username</td>
             <td>Yes</td>
          </tr>
          <tr>
             <td>password</td>
             <td>SourceSafe password</td>
             <td>No</td>
          </tr>
          <tr>
             <td>localpath</td>
             <td>Override the working directory and get to the specified path</td>
             <td>No</td>
          </tr>
          <tr>
             <td>soshome</td>
             <td>The path to the SourceOffSite home directory</td>
             <td>No</td>
          </tr>
          <tr>
             <td>nocompression</td>
             <td>true or false - disable compression</td>
             <td>No</td>
          </tr>
          <tr>
             <td>recursive</td>
             <td>true or false - Only works with the GetProject command</td>
             <td>No</td>
          </tr>
          <tr>
             <td>version</td>
             <td>a version number to get - Only works with the GetFile command</td>
             <td>No</td>
          </tr>
          <tr>
             <td>label</td>
             <td>a label version to get - Only works with the GetProject command</td>
             <td>No</td>
          </tr>
          <tr>
             <td>nocache</td>
             <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
             <td>No</td>
          </tr>
          <tr>
             <td>verbose</td>
             <td>true or false - Status messages are displayed</td>
             <td>No</td>
          </tr>       
    </tbody>   
  </table>
           
  <h3>Example</h3>
            &nbsp;&nbsp;&nbsp; <small>&lt;sosget&nbsp;&nbsp;&nbsp; </small><small>
         verbose="true"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; recursive="true"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; login="build"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; pass="build"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; localpath="tmp"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; projectpath="/SourceRoot/project1"</small><small><br>
       </small><small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<big>&nbsp; &nbsp;&nbsp;&nbsp; sosserverpath="192.168.10.6:8888"</big></small></small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
       &nbsp;&nbsp;&nbsp; vssserverpath="d:\vss\srcsafe.ini"/&gt;</small><br>
       <small>&nbsp;&nbsp; <br>
            Connects to a SourceOffsite server on </small><small>192.168.10.6:8888</small><small>
         with build,build as the username &amp; password</small><small> . The 
   SourceSafe  database resides on the same box as the SOS server  &amp; the 
   VSS database  is at "d:\vss\srcsafe.ini"</small><br>
       <small>Does a recursive GetProject on $</small><small>/SourceRoot/project1</small><small>
            , using tmp as the working directory.</small><br>
       <br>
           
  <hr width="100%" size="2">     
  <h2><a name="SOSLabel"></a>    SOSLabel</h2>
           
  <h3>Description</h3>
               Task to perform Label commands from Microsoft Visual SourceSafe via SOS<br>              
  <h3>Parameters</h3>
           
  <table border="1">
      <tr>
        <th>Attribute</th>
        <th>Values</th>
        <th>Required</th>
      </tr>
      <tr>
        <td>soscmddir</td>
        <td>Directory which contains soscmd(.exe) <br>
        soscmd(.exe) must be in the path if this is not specified</td>
        <td>No</td>
      </tr>
      <tr>
         <td>vssserverpath</td>
         <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>sosserverpath</td>
         <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>projectpath</td>
         <td>SourceSafe project path without the "$"</td>
         <td>Yes</td>
      </tr>
      <tr>   
         <td>username</td>
         <td>SourceSafe username</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>password</td>
         <td>SourceSafe password</td>
         <td>No</td>
      </tr>
      <tr>
         <td>label</td>
         <td>The label to apply to a project</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>comment</td>
         <td>A comment to be applied to all files being labeled</td>
         <td>No</td>
      </tr>
      <tr>
         <td>verbose</td>
         <td>true or false - Status messages are displayed</td>
         <td>No</td>
      </tr>    
    </tbody>     
  </table>
           
  <h3>Example</h3>
          &nbsp;<small>&nbsp;&nbsp; &lt;soslabel&nbsp;&nbsp;&nbsp; </small><small>
         &nbsp; login="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; pass="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label="test
  label"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; projectpath="</small><small>
      /SourceRoot/project1</small><small>   "</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sosserverpath="192.168.10.6:8888"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vssserverpath="d:\vss\srcsafe.ini"/&gt;</small><small><br>
       </small><br>
       <small>  Connects to a SourceOffsite server on </small><small>192.168.10.6:8888
     </small><small>with build,build as the username &amp; password</small><small>
        .  </small><small> The SourceSafe database resides on the same box
  as  the  SOS server  &amp; the VSS database is at "d:\vss\srcsafe.ini"</small><br>
       <small>Labels the $</small><small>/SourceRoot/project1 project with
  </small><small>        "test label".</small><br>
       <br>
           
  <hr width="100%" size="2"><br>
           
  <h2><a name="SOSCheckIn"></a>   SOSCheckIn</h2>
           
  <h3>Description</h3>
          Task to perform CheckIn commands from a Microsoft Visual Source Safe via SOS<br>         
  <h3>Parameters</h3>
  <table border="1">
         <tbody>
      <tr>
        <th>Attribute</th>
        <th>Values</th>
        <th>Required</th>
      </tr>
      <tr>
        <td>soscmddir</td>
        <td>Directory which contains soscmd(.exe) <br>
        soscmd(.exe) must be in the path if this is not specified</td>
        <td>No</td>
      </tr>
      <tr>
         <td>vssserverpath</td>
         <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>sosserverpath</td>
         <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>projectpath</td>
         <td>SourceSafe project path without the "$"</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>file</td>
         <td>Filename to act upon<br> If no file is specified then act upon the project</td>
         <td>No</td>
      </tr>
      <tr>
         <td>username</td>
         <td>SourceSafe username</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>password</td>
         <td>SourceSafe password</td>
         <td>No</td>
      </tr>
      <tr>
         <td>localpath</td>
         <td>Override the working directory and get to the specified path</td>
         <td>No</td>
      </tr>
      <tr>
         <td>soshome</td>
         <td>The path to the SourceOffSite home directory</td>
         <td>No</td>
      </tr>
      <tr>
         <td>nocompression</td>
         <td>true or false - disable compression</td>
         <td>No</td>
      </tr>
      <tr>
         <td>recursive</td>
         <td>true or false - Only works with the CheckOutProject command</td>
         <td>No</td>
      </tr>
      <tr>
         <td>nocache</td>
         <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
         <td>No</td>
      </tr>
      <tr>
         <td>verbose</td>
         <td>true or false - Status messages are displayed</td>
         <td>No</td>
      </tr>
      <td>comment</td>
         <td>A comment to be applied to all files being checked in</td>
         <td>No</td>
      </tr>  
   </tbody>     
  </table>
          
  <h3>Example</h3>
         &nbsp;&nbsp;&nbsp; <small>&lt;soscheckin&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
     </small><small>&nbsp;login="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  pass="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  </small><small>file="foobar.txt"<br>
         &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
     &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; verbose="true"</small><br>
       <small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
     &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
     </small><small>comment="comment abc"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  projectpath="/SourceRoot/project1"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  sosserverpath="server1:8888"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  vssserverpath="\\server2\vss\srcsafe.ini"/&gt;</small><small><br>
       </small><small><br>
         Connects to a SourceOffsite server on </small><small>server1:8888</small><small>
       with build,build as the username &amp; password</small><small>  .  </small><small>
        The SourceSafe database resides on a different box (server2)&nbsp;
    &amp;  the VSS database is on a share called "vss"</small><br>
       <small>Checks-in only the "foobar.txt" file adding a comment of "comment 
    abc"</small><small> . Extra status messages will be displayed on screen.</small><br>
       <br>
           
  <hr width="100%" size="2">     
  <h2><a name="SOSCheckOut"></a>  SOSCheckOut</h2>
           
  <h3>Description</h3>
         Task to perform CheckOut commands from a Microsoft Visual Source Safe via SOS<br>
           
  <h3>Parameters</h3>
           
  <table border="1">
         <tbody>
      <tr>
        <th>Attribute</th>
        <th>Values</th>
        <th>Required</th>
      </tr>
      <tr>
        <td>soscmddir</td>
        <td>Directory which contains soscmd(.exe) <br>
        soscmd(.exe) must be in the path if this is not specified</td>
        <td>No</td>
      </tr>
      <tr>
         <td>vssserverpath</td>
         <td>path to the srcsafe.ini  - eg. \\server\vss\srcsafe.ini</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>sosserverpath</td>
         <td>address and port of the SOS server  - eg. 192.168.0.1:8888</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>projectpath</td>
         <td>SourceSafe project path without the "$"</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>file</td>
         <td>Filename to act upon<br> If no file is specified then act upon the project</td>
         <td>No</td>
      </tr>
      <tr>
         <td>username</td>
         <td>SourceSafe username</td>
         <td>Yes</td>
      </tr>
      <tr>
         <td>password</td>
         <td>SourceSafe password</td>
         <td>No</td>
      </tr>
      <tr>
         <td>localpath</td>
         <td>Override the working directory and get to the specified path</td>
         <td>No</td>
      </tr>
      <tr>
         <td>soshome</td>
         <td>The path to the SourceOffSite home directory</td>
         <td>No</td>
      </tr>
      <tr>
         <td>nocompression</td>
         <td>true or false - disable compression</td>
         <td>No</td>
      </tr>
      <tr>
         <td>recursive</td>
         <td>true or false - Only works with the CheckOutProject command</td>
         <td>No</td>
      </tr>
      <tr>
         <td>nocache</td>
         <td>true or false - Only needed if SOSHOME is set as an enviroment variable</td>
         <td>No</td>
      </tr>
      <tr>
         <td>verbose</td>
         <td>true or false - Status messages are displayed</td>
         <td>No</td>
      </tr>            
    </tbody>     
  </table>
       <br>
           
  <h3>Example</h3>
        &nbsp;&nbsp;&nbsp; <small>&lt;soscheckout </small><small>&nbsp; soscmddir="/usr/bin"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    verbose="true"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    login="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    pass="build"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    ProjectPath="</small><small>  /SourceRoot/project1</small><small>"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    sosserverpath="192.168.10.6:8888"</small><small><br>
       </small><small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
     vssserverpath="\\server2\vss\srcsafe.ini"/&gt;<small><br>
       </small></small><br>
       <small>Connects to a SourceOffsite server on </small><small>server1:8888</small><small>
       with build,build as the username &amp; password</small><small>  .  </small><small>
        The SourceSafe database resides on a different box (server2)&nbsp;
    &amp;  the VSS database is on a share called "vss"</small><br>
       <small>Checks-out "project1" </small><small>Only the "project1" directory
     will be locked as the recursive option was not set. Extra status messages
     will be displayed on screen.</small><small> The soscmd(.exe) file to be
   used  resides in /usr/bin</small><br>
       <small><br>
       </small>     
  <hr width="100%" size="2"><small><br>
       </small><br>
       <br>
       <br>
       <br>
       <br>
           
  </body>
  </html>
  
  
  
  1.1                  jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/sos/SOSTest.java
  
  Index: SOSTest.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.tools.ant.taskdefs.optional.sos;
  
  import junit.framework.TestCase;
  import junit.framework.AssertionFailedError;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.types.Commandline;
  import org.apache.tools.ant.types.Path;
  import org.apache.tools.ant.util.FileUtils;
  import org.apache.tools.ant.taskdefs.optional.sos.*;
  
  /**
   * Basic testcase to ensure that command line generation is ok
   * @author <a href="mailto:jesse@cryptocard.com">Jesse Stockall</a>
   */
  public class SOSTest extends TestCase {
  
      private SOSGet sosGet;
      private SOSCheckin sosCheckin;
      private SOSCheckout sosCheckout;
      private SOSLabel sosLabel;
      private Project project;
      private Commandline commandline;
      private FileUtils fileUtils;
      
      private static final String VSS_SERVER_PATH = "\\\\server\\vss\\srcsafe.ini";
      private static final String VSS_PROJECT_PATH = "/SourceRoot/Project";
      private static final String SOS_SERVER_PATH = "192.168.0.1:8888";
      private static final String SOS_USERNAME = "ant";
      private static final String SOS_PASSWORD = "rocks";
      private static final String LOCAL_PATH = "/home/jesse/source/dir";
      private static final String SRC_FILE = "Class1.java";
      private static final String SRC_LABEL = "label1";
      private static final String SRC_COMMENT = "I fixed a bug";
      private static final String SOS_HOME = "/home/user/.sos";
      private static final String VERSION = "007";
  
      public SOSTest(String s) {
          super(s);
      }
  
      protected void setUp() throws Exception {
          sosGet = new SOSGet();
          sosCheckin = new SOSCheckin();
          sosCheckout = new SOSCheckout();
          sosLabel = new SOSLabel();
          project = new Project();
          project.setBasedir(".");
          fileUtils = FileUtils.newFileUtils();
      }
  
      /**
       * Test SOSGetFile flags & commandline generation
       */
      public void testGetFileFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "GetFile", "-file",
              SRC_FILE, "-revision", "007", "-server", SOS_SERVER_PATH, "-name",
              SOS_USERNAME, "-password", SOS_PASSWORD, "-database", VSS_SERVER_PATH,
              "-project", "$"+VSS_PROJECT_PATH, "-verbose", "-nocompress",
              "-nocache", "-workdir", fileUtils.normalize(LOCAL_PATH).getAbsolutePath() };
  
          Path path = new Path(project, LOCAL_PATH);
  
          // Set up a SOSGet task
          sosGet.setProject(project);
          sosGet.setVssServerPath(VSS_SERVER_PATH);
          sosGet.setSosServerPath(SOS_SERVER_PATH);
          sosGet.setProjectPath(VSS_PROJECT_PATH);
          sosGet.setFile(SRC_FILE);
          sosGet.setUsername(SOS_USERNAME);
          sosGet.setPassword(SOS_PASSWORD);
          sosGet.setVersion(VERSION);
          sosGet.setLocalPath(path);
          sosGet.setNoCache(true);
          sosGet.setNoCompress(true);
          sosGet.setVerbose(true);
          sosGet.setRecursive(true);
  
          commandline = sosGet.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("GetFile arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                 fail("GetFile missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("GetFile extra args");
          }
      }
  
      /**
       * Test SOSGetProject flags & commandline generation
       */
      public void testGetProjectFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "GetProject", "-recursive",
              "-label", SRC_LABEL, "-server", SOS_SERVER_PATH, "-name", SOS_USERNAME,
              "-password", "", "-database", VSS_SERVER_PATH , "-project",
              "$"+VSS_PROJECT_PATH, "", "", "-soshome", SOS_HOME, "-workdir",
              project.getBaseDir().getAbsolutePath() };
          // Set up a SOSGet task
          sosGet.setProject(project);
          sosGet.setVssServerPath(VSS_SERVER_PATH);
          sosGet.setSosServerPath(SOS_SERVER_PATH);
          sosGet.setProjectPath(VSS_PROJECT_PATH);
          sosGet.setLabel(SRC_LABEL);
          sosGet.setUsername(SOS_USERNAME);
          sosGet.setSosHome(SOS_HOME);
          sosGet.setNoCache(true);
          sosGet.setNoCompress(false);
          sosGet.setVerbose(false);
          sosGet.setRecursive(true);
  
          commandline = sosGet.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("GetProject arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("GetProject missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("GetProject extra args");
          }
      }
  
      /**
       * Test SOSGet required attributes 1 by 1
       */
      public void testGetExceptions() {
          boolean buildEx = false;
  
          // Set up a SOSGet task
          sosGet.setProject(project);
          // No options set - SosServerPath should fail
          try {
              commandline = sosGet.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("sosserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("GetException SosServerPath", buildEx);
          buildEx = false;
  
          // Set SosServerPath - Username should fail
          sosGet.setSosServerPath(SOS_SERVER_PATH);
          try {
              commandline = sosGet.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("username attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("GetException Username", buildEx);
          buildEx = false;
  
          // Set Username - VssServerPath should fail
          sosGet.setUsername(SOS_USERNAME);
          try {
              commandline = sosGet.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("vssserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("GetException VssServerPath", buildEx);
          buildEx = false;
  
          // Set VssServerPath - ProjectPath should fail
          sosGet.setVssServerPath(VSS_SERVER_PATH);
          try {
              commandline = sosGet.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("projectpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("GetException ProjectPath", buildEx);
  
          // Set ProjectPath - All required options set
          sosGet.setProjectPath(VSS_PROJECT_PATH);
          try {
              commandline = sosGet.buildCmdLine();
              buildEx = true;
          } catch (BuildException be) {
              buildEx = false;
          }
          assertTrue("GetException All required options set", buildEx);
      }
  
      /**
       * Test CheckInFile option flags
       */
      public void testCheckinFileFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "CheckInFile", "-file",
              SRC_FILE, "-server", SOS_SERVER_PATH, "-name", SOS_USERNAME,
              "-password", SOS_PASSWORD, "-database", VSS_SERVER_PATH, "-project",
              "$"+VSS_PROJECT_PATH, "-verbose", "-nocompress", "-nocache",
              "-workdir", fileUtils.normalize(LOCAL_PATH).getAbsolutePath(), "-log", SRC_COMMENT };
  
          Path path = new Path(project, LOCAL_PATH);
  
          // Set up a SOSCheckin task
          sosCheckin.setProject(project);
          sosCheckin.setVssServerPath(VSS_SERVER_PATH);
          sosCheckin.setSosServerPath(SOS_SERVER_PATH);
          sosCheckin.setProjectPath(VSS_PROJECT_PATH);
          sosCheckin.setFile(SRC_FILE);
          sosCheckin.setComment(SRC_COMMENT);
          sosCheckin.setUsername(SOS_USERNAME);
          sosCheckin.setPassword(SOS_PASSWORD);
          sosCheckin.setLocalPath(path);
          sosCheckin.setNoCache(true);
          sosCheckin.setNoCompress(true);
          sosCheckin.setVerbose(true);
          sosCheckin.setRecursive(true);
  
          commandline = sosCheckin.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("CheckInFile arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("CheckInFile missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("CheckInFile extra args");
          }
      }
  
      /**
       * Test CheckInProject option flags
       */
      public void testCheckinProjectFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "CheckInProject",
              "-recursive", "-server", SOS_SERVER_PATH, "-name", SOS_USERNAME,
              "-password", "", "-database", VSS_SERVER_PATH , "-project",
              "$"+VSS_PROJECT_PATH, "", "", "-soshome", SOS_HOME, "-workdir",
              project.getBaseDir().getAbsolutePath(), "-log", SRC_COMMENT,  };
  
          // Set up a SOSCheckin task
          sosCheckin.setProject(project);
          sosCheckin.setVssServerPath(VSS_SERVER_PATH);
          sosCheckin.setSosServerPath(SOS_SERVER_PATH);
          sosCheckin.setProjectPath(VSS_PROJECT_PATH);
          sosCheckin.setComment(SRC_COMMENT);
          sosCheckin.setUsername(SOS_USERNAME);
          sosCheckin.setSosHome(SOS_HOME);
          sosCheckin.setNoCache(true);
          sosCheckin.setNoCompress(false);
          sosCheckin.setVerbose(false);
          sosCheckin.setRecursive(true);
  
          commandline = sosCheckin.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("CheckInProject arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("CheckInProject missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("CheckInProject extra args");
          }
      }
  
      /**
       * Test SOSCheckIn required attributes 1 by 1
       */
      public void testCheckinExceptions() {
          boolean buildEx = false;
  
          // Set up a sosCheckin task
          sosCheckin.setProject(project);
          // No options set - SosServerPath should fail
          try {
              commandline = sosCheckin.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("sosserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckinException SosServerPath", buildEx);
          buildEx = false;
  
          // Set SosServerPath - Username should fail
          sosCheckin.setSosServerPath(SOS_SERVER_PATH);
          try {
              commandline = sosCheckin.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("username attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckinException Username", buildEx);
          buildEx = false;
  
          // Set Username - VssServerPath should fail
          sosCheckin.setUsername(SOS_USERNAME);
          try {
              commandline = sosCheckin.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("vssserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckinException VssServerPath", buildEx);
          buildEx = false;
  
          // Set VssServerPath - ProjectPath should fail
          sosCheckin.setVssServerPath(VSS_SERVER_PATH);
          try {
              commandline = sosCheckin.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("projectpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckinException ProjectPath", buildEx);
  
          // Set ProjectPath - All required options set
          sosCheckin.setProjectPath(VSS_PROJECT_PATH);
          try {
              commandline = sosCheckin.buildCmdLine();
              buildEx = true;
          } catch (BuildException be) {
              buildEx = false;
          }
          assertTrue("CheckinException All required options set", buildEx);
      }
  
      /**
       * Test CheckOutFile option flags
       */
      public void testCheckoutFileFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "CheckOutFile", "-file",
              SRC_FILE, "-server", SOS_SERVER_PATH, "-name", SOS_USERNAME,
              "-password", SOS_PASSWORD, "-database", VSS_SERVER_PATH, "-project",
              "$"+VSS_PROJECT_PATH, "-verbose", "-nocompress", "-nocache",
              "-workdir", fileUtils.normalize(LOCAL_PATH).getAbsolutePath() };
  
          Path path = new Path(project, LOCAL_PATH);
  
          // Set up a SOSCheckout task
          sosCheckout.setProject(project);
          sosCheckout.setVssServerPath(VSS_SERVER_PATH);
          sosCheckout.setSosServerPath(SOS_SERVER_PATH);
          sosCheckout.setProjectPath(VSS_PROJECT_PATH);
          sosCheckout.setFile(SRC_FILE);
          sosCheckout.setUsername(SOS_USERNAME);
          sosCheckout.setPassword(SOS_PASSWORD);
          sosCheckout.setLocalPath(path);
          sosCheckout.setNoCache(true);
          sosCheckout.setNoCompress(true);
          sosCheckout.setVerbose(true);
          sosCheckout.setRecursive(true);
  
          commandline = sosCheckout.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("CheckOutFile arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("CheckOutFile missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("CheckOutFile extra args");
          }
      }
  
      /**
       * Test CheckOutProject option flags
       */
      public void testCheckoutProjectFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "CheckOutProject",
              "-recursive", "-server", SOS_SERVER_PATH, "-name", SOS_USERNAME,
              "-password", "", "-database", VSS_SERVER_PATH , "-project",
              "$"+VSS_PROJECT_PATH, "", "", "-soshome", SOS_HOME, "-workdir",
              project.getBaseDir().getAbsolutePath() };
  
          // Set up a sosCheckout task
          sosCheckout.setProject(project);
          sosCheckout.setVssServerPath(VSS_SERVER_PATH);
          sosCheckout.setSosServerPath(SOS_SERVER_PATH);
          sosCheckout.setProjectPath(VSS_PROJECT_PATH);
          sosCheckout.setUsername(SOS_USERNAME);
          sosCheckout.setSosHome(SOS_HOME);
          sosCheckout.setNoCache(true);
          sosCheckout.setNoCompress(false);
          sosCheckout.setVerbose(false);
          sosCheckout.setRecursive(true);
  
          commandline = sosCheckout.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("CheckOutProject arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("CheckOutProject missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("CheckOutProject extra args");
          }
      }
  
      /**
       * Test SOSCheckout required attributes 1 by 1
       */
      public void testCheckoutExceptions() {
          boolean buildEx = false;
  
          // Set up a sosCheckout task
          sosCheckout.setProject(project);
          // No options set - SosServerPath should fail
          try {
              commandline = sosCheckout.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("sosserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckoutException SosServerPath", buildEx);
          buildEx = false;
  
          // Set SosServerPath - Username should fail
          sosCheckout.setSosServerPath(SOS_SERVER_PATH);
          try {
              commandline = sosCheckout.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("username attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckoutException Username", buildEx);
          buildEx = false;
  
          // Set Username - VssServerPath should fail
          sosCheckout.setUsername(SOS_USERNAME);
          try {
              commandline = sosCheckout.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("vssserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckoutException VssServerPath", buildEx);
          buildEx = false;
  
          // Set VssServerPath - ProjectPath should fail
          sosCheckout.setVssServerPath(VSS_SERVER_PATH);
          try {
              commandline = sosCheckout.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("projectpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("CheckoutException ProjectPath", buildEx);
  
          // Set ProjectPath - All required options set
          sosCheckout.setProjectPath(VSS_PROJECT_PATH);
          try {
              commandline = sosCheckout.buildCmdLine();
              buildEx = true;
          } catch (BuildException be) {
              buildEx = false;
          }
          assertTrue("CheckoutException All required options set", buildEx);
      }
  
      /**
       * Test Label option flags
       */
      public void testLabelFlags() {
          String[] sTestCmdLine = { "soscmd", "-command", "AddLabel", "-server",
              SOS_SERVER_PATH, "-name", SOS_USERNAME, "-password", "", "-database",
              VSS_SERVER_PATH , "-project", "$"+VSS_PROJECT_PATH, "-label",
              SRC_LABEL, "-verbose", "-log", SRC_COMMENT };
  
          // Set up a sosCheckout task
          sosLabel.setVssServerPath(VSS_SERVER_PATH);
          sosLabel.setSosServerPath(SOS_SERVER_PATH);
          sosLabel.setProjectPath(VSS_PROJECT_PATH);
          sosLabel.setUsername(SOS_USERNAME);
          sosLabel.setSosHome(SOS_HOME);
          sosLabel.setComment(SRC_COMMENT);
          sosLabel.setLabel(SRC_LABEL);
          sosLabel.setNoCache(true);
          sosLabel.setNoCompress(false);
          sosLabel.setVerbose(true);
  
          commandline = sosLabel.buildCmdLine();
          String[] sGeneratedCmdLine = commandline.getCommandline();
  
          int i = 0;
          while (i < sTestCmdLine.length) {
              try {
                  assertEquals("AddLabel arg # " + String.valueOf(i),
                                  sTestCmdLine[i],
                                  sGeneratedCmdLine[i]);
                  i++;
              } catch (ArrayIndexOutOfBoundsException aioob) {
                  fail("AddLabel missing arg");
              }
  
          }
          if (sGeneratedCmdLine.length > sTestCmdLine.length) {
              // We have extra elements
              fail("AddLabel extra args");
          }
      }
  
      /**
       * Test SOSLabel required attributes 1 by 1
       */
      public void testLabelExceptions() {
          boolean buildEx = false;
  
          // Set up a sosLabel task
          sosLabel.setProject(project);
          // No options set - SosServerPath should fail
          try {
              commandline = sosLabel.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("sosserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("LabelException SosServerPath", buildEx);
          buildEx = false;
  
          // Set SosServerPath - Username should fail
          sosLabel.setSosServerPath(SOS_SERVER_PATH);
          try {
              commandline = sosLabel.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("username attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("LabelException Username", buildEx);
          buildEx = false;
  
          // Set Username - VssServerPath should fail
          sosLabel.setUsername(SOS_USERNAME);
          try {
              commandline = sosLabel.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("vssserverpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("LabelException VssServerPath", buildEx);
          buildEx = false;
  
          // Set VssServerPath - ProjectPath should fail
          sosLabel.setVssServerPath(VSS_SERVER_PATH);
          try {
              commandline = sosLabel.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("projectpath attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("LabelException ProjectPath", buildEx);
  
          // Set ProjectPath - Label should fail
          sosLabel.setProjectPath(VSS_PROJECT_PATH);
          try {
              commandline = sosLabel.buildCmdLine();
          } catch (BuildException be) {
              if (be.getMessage().compareTo("label attribute must be set!") == 0) {
                  buildEx = true;
              }
          }
          assertTrue("LabelException Label", buildEx);
  
          // Set Label - All required options set
          sosLabel.setLabel(SRC_LABEL);
          try {
              commandline = sosLabel.buildCmdLine();
              buildEx = true;
          } catch (BuildException be) {
              buildEx = false;
          }
          assertTrue("LabelException All required options set", buildEx);
      }
  
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:ant-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-dev-help@jakarta.apache.org>


Mime
View raw message