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

   []
