## 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.

## line format:
## /directory: groupId[:parent-pom artifactId] [src+bin] [index page url]
##   [*] artifactId [version restriction]
##         * = only check info in index page, but not dist nor site (for plugins provided by components, like archetype, release, ...)
## > artifactId index-path = /path/
## > artifactId site = site url
## > artifactId:version site = site url

> dist-area = http://www.apache.org/dist/maven/

## EOL
## /ant-tasks: org.apache.maven src+bin
##  maven-ant-tasks

/archetype: org.apache.maven.archetype
  maven-archetype

/binaries: content.not.checked

/doxia: org.apache.maven.doxia
  doxia
##  doxia-book-maven-plugin
##  doxia-book-renderer
  doxia-converter
  doxia-linkcheck
  doxia-sitetools

/enforcer: org.apache.maven.enforcer
  enforcer

/indexer: org.apache.maven.indexer
  maven-indexer

## EOL
## /maven-1: content.not.checked

## EOL
## /maven-2: org.apache.maven src+bin
## > apache-maven:2.0.11 site = http://maven.apache.org/ref/2.0.11/
##   apache-maven [2.0,2.1.0-alpha-1)
## > apache-maven:2.2.1 site = http://maven.apache.org/ref/2.2.1/
##   apache-maven [2.2,3.0-alpha-1)

/maven-3: org.apache.maven src+bin
  apache-maven [3.0,3.1.0-alpha-1)
  apache-maven [3.1.0,3.2.0-alpha-1)
  apache-maven

/jxr: org.apache.maven.jxr
  jxr

/plugin-testing: org.apache.maven.plugin-testing
  maven-plugin-testing

/plugin-tools: org.apache.maven.plugin-tools
  maven-plugin-tools

/plugins: org.apache.maven.plugins http://maven.apache.org/plugins/
  maven-acr-plugin
  maven-ant-plugin
  maven-antrun-plugin
  * maven-archetype-plugin
  maven-assembly-plugin
  maven-changelog-plugin
  maven-changes-plugin
  maven-checkstyle-plugin
  maven-clean-plugin
  maven-compiler-plugin
  maven-dependency-plugin
  maven-deploy-plugin
  maven-doap-plugin
  maven-docck-plugin
  maven-ear-plugin
  maven-ejb-plugin
  * maven-enforcer-plugin 
  * maven-failsafe-plugin
  maven-gpg-plugin
  maven-help-plugin
  maven-install-plugin
  maven-invoker-plugin
  maven-jar-plugin
  maven-jarsigner-plugin
  maven-javadoc-plugin
  maven-jdeps-plugin
  maven-jdeprscan-plugin
  maven-jlink-plugin
  maven-jmod-plugin
  * maven-jxr-plugin 
  maven-linkcheck-plugin
  maven-patch-plugin
  maven-pdf-plugin
  * maven-plugin-plugin
  maven-pmd-plugin
  maven-project-info-reports-plugin
  maven-rar-plugin
  * maven-release-plugin  
  maven-remote-resources-plugin
  maven-repository-plugin
  maven-resources-plugin
  * maven-scm-plugin
  maven-scm-publish-plugin
  maven-shade-plugin
  maven-site-plugin
  maven-source-plugin
  maven-stage-plugin
  * maven-surefire-plugin
  * maven-surefire-report-plugin
  maven-toolchains-plugin
  maven-verifier-plugin
  maven-war-plugin
## Retired
##  maven-eclipse-plugin
##  maven-idea-plugin
##  maven-one-plugin
##  maven-reactor-plugin

/pom: org.apache http://maven.apache.org/pom/
> apache index-path = /asf/
> apache site = http://maven.apache.org/pom/asf/
  apache

/pom: org.apache.maven http://maven.apache.org/pom/
> maven-parent index-path = /maven/
> maven-parent site = http://maven.apache.org/pom/maven/
  maven-parent

/release: org.apache.maven.release
## release version is restricted because maven-release (=parent pom) versions 3, 4 and 5
## were released in the past separately, with integer value > to actual 2.x version
  maven-release (,3) 

/reporting: org.apache.maven.reporting http://maven.apache.org/shared/
  maven-reporting-api
  maven-reporting-exec
  maven-reporting-impl

/resolver: org.apache.maven.resolver
  maven-resolver
## maven-resolver-ant-tasks
## maven-resolver-demo

/resources: org.apache.apache.resources
## apache-incubator-disclaimer-resource-bundle         
## apache-jar-resource-bundle
## apache-jar-txt-resource-bundle
## apache-license-header-resource-bundle
> apache-source-release-assembly-descriptor site = http://maven.apache.org/apache-resource-bundles/
  apache-source-release-assembly-descriptor

## old artifacts in org.apache groupId waiting for release in org.apache.apache.resources
/resources: org.apache
> apache-incubator-disclaimer-resource-bundle site = http://maven.apache.org/apache-resource-bundles/
  apache-incubator-disclaimer-resource-bundle (,1.1]
> apache-jar-resource-bundle site = http://maven.apache.org/apache-resource-bundles/
  apache-jar-resource-bundle (,1.4]
> apache-license-header-resource-bundle site = http://maven.apache.org/apache-resource-bundles/
  apache-license-header-resource-bundle (,1.1]

/scm: org.apache.maven.scm
  maven-scm 

/shared: org.apache.maven.shared http://maven.apache.org/shared/
  file-management
  maven-common-artifact-filters
  maven-dependency-analyzer
  maven-dependency-tree
  maven-filtering
  maven-invoker
  maven-jarsigner
  maven-mapping
## Retired  
##  maven-model-converter
  maven-repository-builder
  maven-runtime
  maven-script-interpreter
  maven-shared-incremental
  maven-shared-jar
  maven-shared-resources
  maven-shared-utils
  maven-shared-io
  maven-verifier

/shared: org.apache.maven http://maven.apache.org/shared/
  maven-archiver

> maven-skins index-path = /skins/
/skins: org.apache.maven.skins http://maven.apache.org/skins/
  maven-default-skin
  maven-fluido-skin
## Retired  
##  maven-application-skin
##  maven-classic-skin
##  maven-stylus-skin

/surefire: org.apache.maven.surefire
  surefire

/wagon: org.apache.maven.wagon
  wagon
