 ------
 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>
      </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}}.
