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 *
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 }