<!--

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.  Create local.properties and add the following:
	- Modify the RELEASE_KEYSTORE_FILE and CERT_PASSWORD_FILE variables with the correct file 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-4.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 contained in https://dist.apache.org/repos/dist/release/flex/KEYS if not add it.
