View Javadoc

1   package org.apache.maven.scm.provider.hg.command.changelog;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.scm.ChangeSet;
23  import org.apache.maven.scm.ScmBranch;
24  import org.apache.maven.scm.ScmException;
25  import org.apache.maven.scm.ScmFileSet;
26  import org.apache.maven.scm.ScmResult;
27  import org.apache.maven.scm.ScmVersion;
28  import org.apache.maven.scm.command.Command;
29  import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
30  import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
31  import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
32  import org.apache.maven.scm.command.changelog.ChangeLogSet;
33  import org.apache.maven.scm.provider.ScmProviderRepository;
34  import org.apache.maven.scm.provider.hg.HgUtils;
35  import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
36  
37  import java.text.SimpleDateFormat;
38  import java.util.ArrayList;
39  import java.util.Arrays;
40  import java.util.Date;
41  import java.util.List;
42  
43  /**
44   * @author <a href="mailto:thurner.rupert@ymono.net">thurner rupert</a>
45   * @author Olivier Lamy
46   *
47   */
48  public class HgChangeLogCommand
49      extends AbstractChangeLogCommand
50      implements Command
51  {
52      /**
53       * {@inheritDoc}
54       */
55      @Override
56      protected ChangeLogScmResult executeChangeLogCommand( ChangeLogScmRequest request )
57              throws ScmException
58      {
59          final ScmVersion startVersion = request.getStartRevision();
60          final ScmVersion endVersion = request.getEndRevision();
61          final ScmFileSet fileSet = request.getScmFileSet();
62          final String datePattern = request.getDatePattern();
63          if ( startVersion != null || endVersion != null )
64          {
65              final ScmProviderRepository scmProviderRepository = request.getScmRepository().getProviderRepository();
66              return executeChangeLogCommand( scmProviderRepository, fileSet, startVersion, endVersion, datePattern );
67          }
68          return executeChangeLogCommand( fileSet, request.getStartDate(), request.getEndDate(),
69              datePattern, request.getLimit() );
70      }
71  
72      /**
73       * {@inheritDoc}
74       */
75      protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository scmProviderRepository,
76                                                            ScmFileSet fileSet, Date startDate, Date endDate,
77                                                            ScmBranch branch, String datePattern )
78          throws ScmException
79      {
80          return executeChangeLogCommand( fileSet, startDate, endDate, datePattern, null );
81      }
82  
83      private ChangeLogScmResult executeChangeLogCommand( ScmFileSet fileSet, Date startDate, Date endDate,
84                                                            String datePattern, Integer limit )
85          throws ScmException
86      {
87          SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
88          StringBuilder dateInterval = new StringBuilder();
89          // TRICK: Mercurial 1.9.3 don't accept 1970-01-01
90          dateInterval.append(
91              dateFormat.format( startDate == null ? new Date( 1000L * 60 * 60 * 24 ) : startDate ) ); // From 2. Jan 1970
92          dateInterval.append( " to " );
93          dateInterval.append( dateFormat.format( endDate == null ? new Date() : endDate ) ); // Upto now
94  
95          List<String> cmd = new ArrayList<String>();
96          cmd.addAll( Arrays.asList( HgCommandConstants.LOG_CMD, HgCommandConstants.VERBOSE_OPTION,
97                                     HgCommandConstants.NO_MERGES_OPTION, HgCommandConstants.DATE_OPTION,
98                                     dateInterval.toString() ) );
99  
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 }