#   Copyright 2003-2005 The Apache Software Foundation
#
#   Licensed 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.
#
##
# Properties that override Maven build defaults
##

maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory

maven.checkstyle.properties=${basedir}/checkstyle.xml
maven.xdoc.poweredby.image=maven-feather.png

#If you wish to skip tests when doing builds, uncomment
#maven.test.skip = true
#If you want the build to succeed if tests fail, uncomment
#maven.test.failure = false

maven.junit.fork=true
#maven.linkcheck.enable=true 

maven.xdoc.jsl=../commons-build/commons-site.jsl
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html

maven.javadoc.links = http://java.sun.com/j2se/1.4.2/docs/api/,\
                      http://jakarta.apache.org/commons/collections/api/,\
                      http://jakarta.apache.org/commons/discovery/api/

maven.changes.issue.template=http://issues.apache.org/bugzilla/show_bug.cgi?id=%ISSUE%

maven.jar.override = on
maven.jar.clover = 1.3.2
maven.compile.target=1.3

maven.announcement.file=${basedir}/RELEASE-NOTES.txt
maven.announcement.stylesheet.path=${basedir}/release-notes.jsl

######################################################################
# Deployment Repository Settings
#
# 'apache.releases' is the mirrored public release repository
# 'apache.snapshots' is the internal repository for snapshots
#
# By default, deployment is to the internal apache repository.
# To deploy to the mirrored distribution repository, use
#
#   maven -Dmaven.repo.list=apache.releases jar:deploy
#
# The following properties need to be set in local build.properties:
# 
#   maven.repo.apache.releases.username - apache user name (defaults to user.name)
#   maven.repo.apache.releases.privatekey - path to local private ssh key (defaults to ${user.home}/.ssh/id_dsa)
#   maven.repo.apache.releases.passphrase - passphrase for private ssh key (defaults to empty)
#
######################################################################
# Repository to deploy to - internal apache repo
maven.repo.list=apache.snapshots

# Repository to deploy snapshots
maven.repo.apache.snapshots=scp://cvs.apache.org
maven.repo.apache.snapshots.directory=/www/cvs.apache.org/repository
maven.repo.apache.snapshots.username=${maven.repo.apache.username}
maven.repo.apache.snapshots.privatekey=${maven.repo.apache.privatekey}
maven.repo.apache.snapshots.passphrase=${maven.repo.apache.passphrase}
maven.repo.apache.snapshots.group=apcvs

# Release repository - rsynched to mirrors
maven.repo.apache.releases=scp://people.apache.org
maven.repo.apache.releases.directory=/www/www.apache.org/dist/java-repository
maven.repo.apache.releases.group=apcvs
#maven.repo.apache.releases.username=
#maven.repo.apache.releases.privatekey=
#maven.repo.apache.releases.passphrase=

###############################################################################
# properties to exclude extra images from site. Will be built in to xdoc plugin.
maven.xdoc.copy.excludes=images/file.gif,images/folder-closed.gif,images/folder-open.gif,images/icon_alert.gif,images/icon_alertsml.gif,images/icon_arrowfolder1_sml.gif,images/icon_arrowfolder2_sml.gif,images/icon_arrowmembers1_sml.gif,images/icon_arrowmembers2_sml.gif,images/icon_arrowusergroups1_sml.gif,images/icon_arrowusergroups2_sml.gif,images/icon_confirmsml.gif,images/icon_help_lrg.gif,images/icon_infosml.gif,images/icon_members_sml.gif,images/icon_sortleft.gif,images/icon_sortright.gif,images/icon_usergroups_sml.gif,images/icon_waste_lrg.gif,images/icon_waste_sml.gif,images/none.png,images/nw_maj.gif,images/nw_maj_hi.gif,images/nw_med.gif,images/nw_med_hi.gif,images/nw_med_rond.gif,images/nw_min.gif,images/nw_min_036.gif,images/nw_min_hi.gif,images/poweredby_036.gif,images/product_logo.gif,images/se_maj_rond.gif,images/sw_min.gif,images/logos/**
maven.xdoc.copy.excludes.classic=images/external-classic.png,images/help_logo.gif,images/icon_arrowfolderclosed1_sml.gif,images/icon_arrowwaste1_sml.gif,images/icon_arrowwaste2_sml.gif,images/icon_doc_lrg.gif,images/icon_doc_sml.gif,images/icon_error_lrg.gif,images/icon_folder_lrg.gif,images/icon_folder_sml.gif,images/icon_help_sml.gif,images/icon_info_lrg.gif,images/icon_members_lrg.gif,images/icon_sortdown.gif,images/icon_sortup.gif,images/icon_success_lrg.gif,images/icon_usergroups_lrg.gif,images/icon_arrowfolderopen2_sml.gif,images/icon_warning_lrg.gif,images/newwindow-classic.png,images/nw_maj_rond.gif,images/strich.gif,images/sw_maj_rond.gif,images/sw_med_rond.gif
