001package org.apache.maven.scm.provider.starteam.command.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
022import org.apache.maven.scm.ScmBranch;
023import org.apache.maven.scm.ScmException;
024import org.apache.maven.scm.ScmFileSet;
025import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
026import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
027import org.apache.maven.scm.command.changelog.ChangeLogSet;
028import org.apache.maven.scm.provider.ScmProviderRepository;
029import org.apache.maven.scm.provider.starteam.command.StarteamCommand;
030import org.apache.maven.scm.provider.starteam.command.StarteamCommandLineUtils;
031import org.apache.maven.scm.provider.starteam.repository.StarteamScmProviderRepository;
032import org.codehaus.plexus.util.StringUtils;
033import org.codehaus.plexus.util.cli.CommandLineException;
034import org.codehaus.plexus.util.cli.CommandLineUtils;
035import org.codehaus.plexus.util.cli.Commandline;
036
037import java.util.Date;
038
039/**
040 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
041 * @author Olivier Lamy
042 *
043 */
044public class StarteamChangeLogCommand
045    extends AbstractChangeLogCommand
046    implements StarteamCommand
047{
048    // ----------------------------------------------------------------------
049    // AbstractChangeLogCommand Implementation
050    // ----------------------------------------------------------------------
051
052    /** {@inheritDoc} */
053    protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository repo, ScmFileSet fileSet,
054                                                          Date startDate, Date endDate, ScmBranch branch,
055                                                          String datePattern )
056        throws ScmException
057    {
058        if ( ( branch != null || StringUtils.isNotEmpty( ( branch == null ) ? null : branch.getName() ) )
059            && ( getLogger().isWarnEnabled() ) )
060        {
061            getLogger().warn( "This provider doesn't support changelog with on a given branch." );
062        }
063
064        StarteamScmProviderRepository repository = (StarteamScmProviderRepository) repo;
065
066        // TODO: revision
067        Commandline cl = createCommandLine( repository, fileSet, startDate );
068
069        StarteamChangeLogConsumer consumer =
070            new StarteamChangeLogConsumer( fileSet.getBasedir(), getLogger(), startDate, endDate, datePattern );
071
072        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
073
074        int exitCode;
075
076        try
077        {
078            exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr );
079        }
080        catch ( CommandLineException ex )
081        {
082            throw new ScmException( "Error while executing command.", ex );
083        }
084
085        if ( exitCode != 0 )
086        {
087            return new ChangeLogScmResult( cl.toString(), "The 'stcmd' command failed.", stderr.getOutput(), false );
088        }
089
090        return new ChangeLogScmResult( cl.toString(),
091                                       new ChangeLogSet( consumer.getModifications(), startDate, endDate ) );
092    }
093
094    // ----------------------------------------------------------------------
095    //
096    // ----------------------------------------------------------------------
097
098    public static Commandline createCommandLine( StarteamScmProviderRepository repo, ScmFileSet workingDirectory,
099                                                 Date startDate )
100    {
101        //return the full history since we dont know to get hist log from
102        //  creation date to a specific date yet
103        return StarteamCommandLineUtils.createStarteamCommandLine( "hist", null, workingDirectory, repo );
104
105        /**
106         * unfortunately the below option only gives the hist from view creation date to
107         * the specified date.  What good is that?????
108         */
109
110        /*
111        if ( startDate != null )
112        {
113            SimpleDateFormat localFormat = new SimpleDateFormat();
114
115            cl.createArg().setValue( "-cfgd" );
116
117            cl.createArg().setValue( localFormat.format( startDate ).toString() );
118        }
119        */
120
121    }
122}