<!--

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.

-->

Steps to follow in preparation for a release of InstallApacheFlex

1.    Check out the code from https://git-wip-us.apache.org/repos/asf/flex-utilities.git

2.a.  If it is a major release, 
	- bump up the "release.version" property in the build.properties file 
	- reset the build.number property in the build.number file to 0

2.b.  If it is a minor release, run: ant update-version

3.  Open build.properties and update the following:
	- Modify the KEYSTORE_DIR and CERT_PASSWORD_DIR variables with the correct directory paths
	(You need to obtain the installapacheflex_self.p12 file and its password from the previous
	 release manager for InstallApacheFlex)
	
	WARNING WARNING WARNING
	Do not place the 2 certificate files anywhere in the installer directory or in a subdirectory under it.
	If you do so the certificate files will be packaged into the source release. That would be very bad.
	
4.  Run: 
	ant release

This step 
	- downloads all the necessary files, 
	- updates the version numbers in InstallApacheFlex-app.xml and sdk-installer-config-2.0.xml
	- creates the .exe or .dmg file depending on the OS you are working on
	- creates the source release files as a .zip file and a tar.gz file 
	- signs the artifacts to create corresponding .asc and .md5 files (assumes that you have a pgp
	  id and keypair set up and prompts for the passphrase)
	
5.  Upload all the files under the /release directory to the following directory before calling a VOTE.
	https://dist.apache.org/repos/dist/dev/flex/installer/{version}/{RCversion}/

6.  Check that your key is cntained in https://dist.apache.org/repos/dist/release/flex/KEYS if not add it.
