001    package org.apache.maven.scm.provider.hg.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    
022    import org.apache.maven.scm.ChangeSet;
023    import org.apache.maven.scm.ScmBranch;
024    import org.apache.maven.scm.ScmException;
025    import org.apache.maven.scm.ScmFileSet;
026    import org.apache.maven.scm.ScmResult;
027    import org.apache.maven.scm.ScmVersion;
028    import org.apache.maven.scm.command.Command;
029    import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
030    import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
031    import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
032    import org.apache.maven.scm.command.changelog.ChangeLogSet;
033    import org.apache.maven.scm.provider.ScmProviderRepository;
034    import org.apache.maven.scm.provider.hg.HgUtils;
035    import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
036    
037    import java.text.SimpleDateFormat;
038    import java.util.ArrayList;
039    import java.util.Arrays;
040    import java.util.Date;
041    import java.util.List;
042    
043    /**
044     * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
045     * @author Olivier Lamy
046     * @version $Id: HgChangeLogCommand.java 1353204 2012-06-23 21:45:17Z hboutemy $
047     */
048    public class HgChangeLogCommand
049        extends AbstractChangeLogCommand
050        implements Command
051    {
052        /**
053         * {@inheritDoc}
054         */
055        @Override
056        protected ChangeLogScmResult executeChangeLogCommand( ChangeLogScmRequest request )
057                throws ScmException
058        {
059            final ScmVersion startVersion = request.getStartRevision();
060            final ScmVersion endVersion = request.getEndRevision();
061            final ScmFileSet fileSet = request.getScmFileSet();
062            final String datePattern = request.getDatePattern();
063            if ( startVersion != null || endVersion != null )
064            {
065                final ScmProviderRepository scmProviderRepository = request.getScmRepository().getProviderRepository();
066                return executeChangeLogCommand( scmProviderRepository, fileSet, startVersion, endVersion, datePattern );
067            }
068            return executeChangeLogCommand( fileSet, request.getStartDate(), request.getEndDate(),
069                datePattern, request.getLimit() );
070        }
071    
072        /**
073         * {@inheritDoc}
074         */
075        protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository scmProviderRepository,
076                                                              ScmFileSet fileSet, Date startDate, Date endDate,
077                                                              ScmBranch branch, String datePattern )
078            throws ScmException
079        {
080            return executeChangeLogCommand( fileSet, startDate, endDate, datePattern, null );
081        }
082    
083        private ChangeLogScmResult executeChangeLogCommand( ScmFileSet fileSet, Date startDate, Date endDate,
084                                                              String datePattern, Integer limit )
085            throws ScmException
086        {
087            SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
088            StringBuilder dateInterval = new StringBuilder();
089            // TRICK: Mercurial 1.9.3 don't accept 1970-01-01
090            dateInterval.append(
091                dateFormat.format( startDate == null ? new Date( 1000L * 60 * 60 * 24 ) : startDate ) ); // From 2. Jan 1970
092            dateInterval.append( " to " );
093            dateInterval.append( dateFormat.format( endDate == null ? new Date() : endDate ) ); // Upto now
094    
095            List<String> cmd = new ArrayList<String>();
096            cmd.addAll( Arrays.asList( HgCommandConstants.LOG_CMD, HgCommandConstants.VERBOSE_OPTION,
097                                       HgCommandConstants.NO_MERGES_OPTION, HgCommandConstants.DATE_OPTION,
098                                       dateInterval.toString() ) );
099    
100            if ( limit != null && limit > 0 )
101            {
102                cmd.add( HgCommandConstants.LIMIT_OPTION );
103                cmd.add( Integer.toString( limit ) );
104            }
105    
106            HgChangeLogConsumer consumer = new HgChangeLogConsumer( getLogger(), datePattern );
107            ScmResult result = HgUtils.execute( consumer, getLogger(), fileSet.getBasedir(), cmd.toArray( new String[ cmd.size() ] ) );
108    
109            List<ChangeSet> logEntries = consumer.getModifications();
110            ChangeLogSet changeLogSet = new ChangeLogSet( logEntries, startDate, endDate );
111            return new ChangeLogScmResult( changeLogSet, result );
112        }
113    
114        @Override
115        protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository repository, ScmFileSet fileSet,
116                                                              ScmVersion startVersion, ScmVersion endVersion,
117                                                              String datePattern )
118            throws ScmException
119        {
120            StringBuilder revisionInterval = new StringBuilder();
121            if ( startVersion != null )
122            {
123                revisionInterval.append( startVersion.getName() );
124            }
125            revisionInterval.append( ":" );
126            if ( endVersion != null )
127            {
128                revisionInterval.append( endVersion.getName() );
129            }
130    
131            String[] cmd = new String[]{ HgCommandConstants.LOG_CMD, HgCommandConstants.TEMPLATE_OPTION,
132                HgCommandConstants.NO_MERGES_OPTION, HgCommandConstants.REVISION_OPTION, revisionInterval.toString() };
133            HgChangeLogConsumer consumer = new HgChangeLogConsumer( getLogger(), datePattern );
134            ScmResult result = HgUtils.execute( consumer, getLogger(), fileSet.getBasedir(), cmd );
135    
136            List<ChangeSet> logEntries = consumer.getModifications();
137            Date startDate = null;
138            Date endDate = null;
139            if ( !logEntries.isEmpty() )
140            {
141                startDate = logEntries.get( 0 ).getDate();
142                endDate = logEntries.get( logEntries.size() - 1 ).getDate();
143            }
144            ChangeLogSet changeLogSet = new ChangeLogSet( logEntries, startDate, endDate );
145            changeLogSet.setStartVersion( startVersion );
146            changeLogSet.setEndVersion( endVersion );
147            return new ChangeLogScmResult( changeLogSet, result );
148        }
149    }