Instructions for the httpd-apreq-2 Release Manager (RM)

1. Prep the package for CPAN by running:

        % make release

   This will generate a libapreq2-2.XX-dev.tar.gz candidate in the 
   current directory.   You should keep this source tree
   intact to tag the final release.

2. Test the generated file with

        % make release_test

   Make sure all perl tests pass.

3. Upload the release candidate to httpd.apache.org/~username
   and post a candidate announcement to apreq-dev@. Also, it is 
   strongly recommended that the RM crosspost the candidate 
   announcement to the modperl@ list, to solicit feedback
   from a much larger audience.

4. Give the mailing list participants 48-72 hours to comment and
   vote on the candidate.  If there is a "majority consensus" 
   (three +1 and more +1s than -1s) among the committers, the RM 
   may proceed with the release.

5. Edit STATUS, marking the release date

        /** @page STATUS

        2.XX-dev released on <today's date>.


   Also add the release date to the top @section in CHANGES:

        /** @page CHANGES

        @section v2_XX_dev Changes with libapreq2-2.XX-dev (released ...).

   Commit the changes and tag the tree (tr/0-9a-zA-Z/_/c in the 
   version number)

        % cvs commit -m "2.XX-dev released." STATUS CHANGES
        % cvs tag v2_XX_dev

6. Regenerate the release 

        % make release && make release_test

   Then test and sign it via gpg:

        % gpg --detach-sign --armor libapreq2-2.XX-dev.tar.gz

   or pgp:

        % pgp -sba libapreq2-2.XX-dev.tar.gz

   Special note for releases on CPAN: you need to have an underscore '_' 
   character in the version number to prevent the CPAN indexer from replacing 
   libapreq-1.XX's Apache::(Cookie|Request) with the new ones in this package.  
   Currently I've been adding the two-digit release candidate number (RC) to 
   the package name at this point, eg.

        mv libapreq2-2.XX-dev.tar.gz libapreq2-2.XX_RC-dev.tar.gz
        mv libapreq2-2.XX-dev.tar.gz.asc libapreq2-2.XX_RC-dev.tar.gz.asc

   It isn't pretty, but it does the job.


7. Upload (scp) the package and signature to www.apache.org
   for distribution:

        % scp libapreq2-2.XX-dev.tar.gz* \
          <username>@www.apache.org:/www/www.apache.org/dist/httpd/libapreq/

   Ask another developer to confirm the uploaded signature is ok.

        % gpg --verify libapreq2-2.XX-dev.tar.gz.asc
        % pgp libapreq2-2.XX-dev.tar.gz.asc

   Check that your public key is among those listed in the
   /www/www.apache.org/dist/httpd/KEYS file.   If not, you
   need to commit the necessary change to KEYS the httpd-dist repos.
   Then update the website's copy using "cvs co KEYS" in the 
   /www/www.apache.org/dist/httpd/ directory.

8. Upload the package to CPAN. Doublecheck that the md5 checksum
   received from PAUSE is correct.

9. Wait ~12-24 hours for the ASF mirrors to pick up the new package, then
   update the apreq homepage to list the new release in the News section
   Be sure to update the libapreq2 documentation. For instructions on updating 
   the httpd website, see build/WEBSITE.  IMPORTANT: YOU MUST UPDATE
   download.html TO POINT AT THE NEW RELEASE PACKAGE!

10. Mail the announcement from your cvs.apache.org account by piping the 
    "CPAN Upload" email acknowledgement (from PAUSE) through build/announcement.pl:

    % build/announcement.pl < CPAN_ack | ssh user@cvs.apache.org "sendmail -oi -t -odq"

