001    package org.apache.maven.scm.provider.vss.commands.changelog;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import org.apache.maven.scm.ScmBranch;
023    import org.apache.maven.scm.ScmException;
024    import org.apache.maven.scm.ScmFileSet;
025    import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
026    import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
027    import org.apache.maven.scm.command.changelog.ChangeLogSet;
028    import org.apache.maven.scm.provider.ScmProviderRepository;
029    import org.apache.maven.scm.provider.vss.commands.VssCommandLineUtils;
030    import org.apache.maven.scm.provider.vss.commands.VssConstants;
031    import org.apache.maven.scm.provider.vss.repository.VssScmProviderRepository;
032    import org.codehaus.plexus.util.cli.CommandLineUtils;
033    import org.codehaus.plexus.util.cli.Commandline;
034    
035    import java.text.SimpleDateFormat;
036    import java.util.Date;
037    import java.util.Locale;
038    
039    /**
040     * @author <a href="mailto:triek@thrx.de">Thorsten Riek</a>
041     * @author Olivier Lamy
042     * @version $Id: VssHistoryCommand.java 1054408 2011-01-02 14:05:25Z olamy $
043     */
044    public class VssHistoryCommand
045        extends AbstractChangeLogCommand
046    {
047        /** {@inheritDoc} */
048        protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository repository, ScmFileSet fileSet,
049                                                              Date startDate, Date endDate, ScmBranch branch,
050                                                              String datePattern )
051            throws ScmException
052        {
053            VssScmProviderRepository repo = (VssScmProviderRepository) repository;
054    
055            Commandline cl = buildCmdLine( repo, fileSet, startDate, endDate );
056    
057            if ( getLogger().isInfoEnabled() )
058            {
059                getLogger().info( "Executing: " + cl );
060                getLogger().info( "Working directory: " + cl.getWorkingDirectory().getAbsolutePath() );
061            }
062    
063            VssChangeLogConsumer consumer = new VssChangeLogConsumer( repo, datePattern, getLogger() );
064    
065            CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
066    
067            int exitCode = VssCommandLineUtils.executeCommandline( cl, consumer, stderr, getLogger() );
068    
069            if ( exitCode != 0 )
070            {
071                return new ChangeLogScmResult( cl.toString(), "The vss command failed.", stderr.getOutput(), false );
072            }
073    
074            return new ChangeLogScmResult( cl.toString(),
075                                           new ChangeLogSet( consumer.getModifications(), startDate, endDate ) );
076        }
077    
078        public Commandline buildCmdLine( VssScmProviderRepository repo, ScmFileSet fileSet, Date startDate, Date endDate )
079            throws ScmException
080        {
081            Commandline command = new Commandline();
082    
083            command.setWorkingDirectory( fileSet.getBasedir().getAbsolutePath() );
084    
085            try
086            {
087                command.addSystemEnvironment();
088            }
089            catch ( Exception e )
090            {
091                throw new ScmException( "Can't add system environment.", e );
092            }
093    
094            command.addEnvironment( "SSDIR", repo.getVssdir() );
095    
096            String ssDir = VssCommandLineUtils.getSsDir();
097    
098            command.setExecutable( ssDir + VssConstants.SS_EXE );
099    
100            command.createArg().setValue( VssConstants.COMMAND_HISTORY );
101    
102            command.createArg().setValue( VssConstants.PROJECT_PREFIX + repo.getProject() );
103    
104            //User identification to get access to vss repository
105            if ( repo.getUserPassword() != null )
106            {
107                command.createArg().setValue( VssConstants.FLAG_LOGIN + repo.getUserPassword() );
108            }
109    
110            //Display the history of an entire project list
111            command.createArg().setValue( VssConstants.FLAG_RECURSION );
112    
113            //Ignore: Do not ask for input under any circumstances.
114            command.createArg().setValue( VssConstants.FLAG_AUTORESPONSE_DEF );
115    
116            //Display only versions that fall within specified data range.
117            if ( startDate != null )
118            {
119                if ( endDate == null )
120                {
121                    endDate = new Date(); // = now
122                }
123    
124                SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy", Locale.ENGLISH );
125                String dateRange = sdf.format( endDate ) + "~" + sdf.format( startDate );
126                command.createArg().setValue( VssConstants.FLAG_VERSION_DATE + dateRange );
127            }
128            return command;
129        }
130    }