# These are the property definitions that allow the Ganymatic to run on build.eclipse.org
# as the master Ganymede build
#
# Webserver: Apache
#            serves pages from /opt/public
# Ganymatic tools: CVS exported to ~bfreeman/ganymede/
#
# Note: buckminster.home must be an absolute path
#     : due to some difference between the Sun JVM and the IBM PPC JVM
#
buckminster.home=/home/data/users/bfreeman/ganymede/buckminster
contribs.dir=../org.eclipse.ganymede.sitecontributions
site.dir=../org.eclipse.dash.siteassembler/bin/site
downloads=/home/data/users/bfreeman/downloads
ganymatic.website.dir=/opt/public/ganymede/
ganymatic.website.url=http://build.eclipse.org/ganymede
ganymatic.releng.email=bjorn.freeman-benson@eclipse.org,david_williams@us.ibm.com,cross-project-issues-dev@eclipse.org
generated.dir=${buckminster.home}/bin/generated
top.project=org.eclipse.ganymede
mirror.site.location=${buckminster.home}/bin/${top.project}.mirror
mirror.site.url=http://www.foo.fee/fum
#
# features that are enabled on the build machine but should
# should not be on developer machines: copying and emailing
#
staging.dir=/home/data/users/bfreeman/downloads/releases/ganymede/staging
ganymatic.email.from.address=bjorn.freeman-benson@eclipse.org
#
# I use a file access version of downloads to reduce network traffic,
# but I could also use the url version:
#	downloads=http://download.eclipse.org

# Nick's RSS feed code requires a version number, so I chose "3.0.0"
# on the theory that Callisto was simultaneous release 1.0, Europa 2.0, and Ganymede 3.0
project=Ganymede
branch=
version=3.0.0
buildAlias=Ganymede_M2
updateManagerURL=http://download.eclipse.org/releases/ganymede/staging/
downloadsURL=
