 ------
 Introduction
 ------
 Maria Odea Ching
 ------
 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


Maven Changelog Plugin

 The Maven Changelog Plugin generates reports regarding the recent changes in your Software Configuration Management or SCM.
 These reports include the changelog report, developer activity report and the file activity report.

* Goals Overview

   The Changelog Plugin has three goals:

   * {{{changelog-mojo.html}changelog:changelog}} generates the changelog report. The changelog report shows all the SCM activities
     including the dates, files, and author of the revisions that occurred during the specified change set.

   * {{{dev-activity-mojo.html}changelog:dev-activity}} generates the developer activity report. The dev-activity report shows a
     summary of the total commits, and the number of files changed of each developer listed in the project descriptor.

   * {{{file-activity-mojo.html}changelog:file-activity}} generates the file activity report. The file-activity report lists all
     files that were revised during the specified change set.  It is arranged in a way where the file with the most number of revisions is listed first.

* Usage

  General instructions on how to use the Changelog Plugin can be found on the {{{usage.html}usage page}}. Some more
  specific use cases are described in the examples given below. Last but not least, users occasionally contribute
  additional examples, tips or errata to the
  {{{http://docs.codehaus.org/display/MAVENUSER/Changelog+Plugin}plugin's wiki page}}.

  In case you still have questions regarding the plugin's usage, please have a look at the {{{faq.html}FAQ}} and feel
  free to contact the {{{mail-lists.html}user mailing list}}. The posts to the mailing list are archived and could
  already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
  the {{{mail-lists.html}mail archive}}.

  If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our
  {{{issue-tracking.html}issue tracker}}. When creating a new issue, please provide a comprehensive description of your
  concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem. For this reason,
  entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated.
  Of course, patches are welcome, too. Contributors can check out the project from our
  {{{source-repository.html}source repository}} and will find supplementary information in the
  {{{http://maven.apache.org/guides/development/guide-helping.html}guide to helping with Maven}}.

* Examples

   The following examples show how to use the Changelog Plugin in more advanced use-cases:

   * {{{examples/selecting-reports.html}Selecting Reports}}

   * {{{examples/configuration-date-type.html}Using Date Type}}

   * {{{examples/configuration-range-type.html}Using Range Type}}

   * {{{examples/configuration-tag-type.html}Using Tag Type}}

   * {{{examples/using-perforce.html}Using Perforce}}





