Because plugin versions are managed by Forrest automatically it is possible 
to deploy and/or release individual plugins independantly of Forrest and 
other plugins. Before we discuss this process lets first look at the difference
between releasing a plugin and deploying a plugin.

Deploy or Release?
------------------

Plugins are automatically downloaded and installed whenever they are needed by a 
Forrest project. In order for this to happen it is necessary to deploy the
plugin to a download server. Plugins may be deployed at any time during their
development cycle, that is a developer may choose to deploy a plugin that has not
yet been fully tested. This enables the plugin to be tested "in the field", by
its users.

Since users are able to opt to use a specfic version of a plugin those working in
production environments can ensure that these interim test deployments do not 
affect their work.

Releasing a plugin is the act of deploying a fully tested plugin available for use.
This process will generally be more than just making the plugin available via a 
download site, it will usually involve making public announcements, tagging the 
source tree, incrementing version numbers and other such maintenance tasks.

Deploying a Plugin
------------------

By convention a plugin that has not been fully tested will have '-dev' appended 
to the version number in the plugins build.xml file.

To deploy on the Apache Forrest download server you will need to be a committer.
Simply change directory to the plugin home directory and deploy the plugin
by doing 'tools/ant/bin/ant deploy' [1]. The build system will take care of
everything else for you.

Deployment is carried out with the command "ant deploy". Since this does not
affect releaed versions of the plugin it can be run at any time (note some minimal 
tests are done during the deploy process). 

[1] See the note about using our own version of Ant:
http://forrest.apache.org/0.7/docs/howto/howto-buildPlugin.html#ant

Releasing a Plugin
------------------

The only difference between deploying and releasing a plugin from the point of
view of making the download available is that the plugin version number will
have the '-dev' postfix removed in build.xml before the "ant deploy" target is
run.

Once the deployment is complete the version number should be increased and the 
'-dev' postfix will be appended.

To release a plugin one should run the command "ant release", however, there is 
more to it than this.

TODO: announcement emails
TODO: tagging source tree

FAQs
====

What if a new feature breaks compatability with a released version of Forrest?
------------------------------------------------------------------------------

If you add a feature to a plugin that will break compatability with a released version of
Forrest then you should up the forrest version number in the plugins build.xml file. This
will prevent the new version of the plugin being made avialble to the older version of 
Forrest.

However, you might light to consider doing a release of the plugin before you break 
compatability. It depends on what other changes there are to the plugin before you
start your work. It is always best to raise this on the dev list.

