## 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-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-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-ant-plugin
##  maven-eclipse-plugin
##  maven-idea-plugin
##  maven-one-plugin
##  maven-reactor-plugin
##  maven-repository-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
  maven-script-interpreter
  maven-shared-incremental
  maven-shared-jar
  maven-shared-resources
  maven-shared-utils
  maven-shared-io
  maven-verifier
## Retired  
##  maven-artifact-resolver
##  maven-downloader
##  maven-model-converter
##  maven-osgi
##  maven-repository-builder
##  maven-runtime

/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
