## 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/

/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-integration-tools
  doxia-linkcheck
  doxia-sitetools
  doxia-tools

/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: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-eclipse-plugin
  maven-ejb-plugin
  * maven-enforcer-plugin 
  * maven-failsafe-plugin
  maven-gpg-plugin
  maven-help-plugin
## Retired  
##  maven-idea-plugin
  maven-install-plugin
  maven-invoker-plugin
  maven-jar-plugin
  maven-jarsigner-plugin
  maven-javadoc-plugin
  maven-jdeps-plugin
  * maven-jxr-plugin 
  maven-linkcheck-plugin
## Retired  
##  maven-one-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

/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

/resources: org.apache.apache.resources:apache-resource-bundles
## 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:maven-shared-components http://maven.apache.org/shared/
  file-management
  maven-artifact-resolver
  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-verifier

/shared: org.apache.maven http://maven.apache.org/shared/
  maven-archiver

> maven-skins index-path = /skins/
/skins: org.apache.maven.skins:maven-skins http://maven.apache.org/skins/
  maven-application-skin
  maven-classic-skin
  maven-default-skin
  maven-fluido-skin
  maven-stylus-skin

/surefire: org.apache.maven.surefire
  surefire

/wagon: org.apache.maven.wagon
  wagon
