 ------
 Usage
 ------
 31 July 2006
 ------

 ~~ Licensed to the Apache Software Foundation (ASF) under one
 ~~ or more contributor license agreements.  See the NOTICE file
 ~~ distributed with this work for additional information
 ~~ regarding copyright ownership.  The ASF licenses this file
 ~~ to you under the Apache License, Version 2.0 (the
 ~~ "License"); you may not use this file except in compliance
 ~~ with the License.  You may obtain a copy of the License at
 ~~
 ~~   http://www.apache.org/licenses/LICENSE-2.0
 ~~
 ~~ Unless required by applicable law or agreed to in writing,
 ~~ software distributed under the License is distributed on an
 ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 ~~ KIND, either express or implied.  See the License for the
 ~~ specific language governing permissions and limitations
 ~~ under the License.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html


Usage

 The reports may use either <<<range>>>, <<<date>>>, or <<<tag>>> as the type
 for generating the reports. Only one type can be set. The change sets can be
 configured by setting the correct parameter for the chosen type. If <<<type>>>
 "date" is chosen, then the parameter <<<dates>>> should contain the start and
 stop dates for the date range. Similar configurations should be made for the
 "range" and "tag" types.

 To generate the changelog reports, just add the following in your project's
 <<<pom.xml>>>:

+-----+
<project>
  ...
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-changelog-plugin</artifactId>
        <version>2.1</version>
      </plugin>
    </plugins>
  </reporting>
  ...
</project>
+-----+

 Aside from the required plugin configuration parameters needed to generate the
 reports, all reports will refer to the <<<scm>>> elements inside the project
 descriptor for details regarding the connection to the project's SCM.
 Here is an example of the scm element inside the <<<pom.xml>>>:

-------------------
<project>
  ...
  <scm>
    <connection>scm:svn:http://server/path/to/project/trunk</connection>
    <developerConnection>scm:svn:https://server/path/to/project/trunk</developerConnection>
    <url>scm:svn:http://server/path/to/view/trunk</url>
  </scm>
  ...
</project>
-------------------

 Please refer to the Maven project descriptor for the description of the
 <<<scm>>> elements. It can be found
 {{{http://maven.apache.org/ref/current/maven-model/maven.html#class_scm}here}}.

 When you execute <<<mvn site>>>, you will see that the <<<changelog>>>,
 <<<dev-activity>>> and <<<file-activity>>> reports are included in the
 generated site.

*Sample Changelog report

[images/sample-changelog-report.PNG] Sample Changelog Report

 For a live report {{{changelog.html}look here}}.


*Sample Developer Activity report

[images/sample-dev-activity-report.PNG] Sample Developer Activity Report

 For a live report {{{dev-activity.html}look here}}.


*Sample File Activity report

[images/sample-file-activity-report.PNG] Sample File Activity Report

 For a live report {{{file-activity.html}look here}}.
