Instructions for mod_perl 2.0 Release Manager

1. 'make dist' - to make sure nothing is missing from the manifest,
   etc. Now test this generated package mod_perl-1.99_22.tar.gz (not
   the current build) with as many
   configurations as possible on as many platforms as possible,
   unpacking the package each time afresh.

  a) nuke any preinstalled mod_perl libs and run 'make test'

  b) test that you can 'make install' and then run 'make test' again

  c) test whether we still 100% OK on systems with no LWP:

     % APACHE_TEST_PRETEND_NO_LWP=1 make test

  d) build and test as root. double check that you have started from a
     fresh source, without having any stale dirs from the previous
     build laying around.

2. once confident that the package is good, upload a release candidate
   to perl.apache.org/~username and post 24 hour-ish candidate alert
   to the modperl/dev list (may be longer to give most people a chance
   to catch up). no need to tag this package

2a. if problems are detected during stage 2, repeat stages 1 and 2.

3. when the package has been reported to be good, prepare a new
   package to be released

  a. edit ./Changes:
     - remove '-dev' 
     - add release date

  b. check ./README and ./Makefile.PL
     - make sure supported httpd versions (dso & static) are current

  c. rerun:
     % perl Makefile.PL MP_INST_APACHE2=1
     make sure tag looks right
     % make -n tag

  d. commit Changes README Makefile.PL
     % svn ci Changes README Makefile.PL

  e. tag
     % make tag

  f. create the final package
     % make dist

  g. test the final package again at least once

4. Release the package and update links (e.g. mod_perl-1.99_22.tar.gz)

  a. upload to www.apache.org:/www/perl.apache.org/dist/

    % scp mod_perl-1.99_22.tar.gz www.apache.org:/www/perl.apache.org/dist/

  b. ssh to www.apache.org, unpack the package, update symlinks to the
     tar ball and unpacked distro:

    % ssh www.apache.org
    % cd /www/perl.apache.org/dist/
    % ln -sf mod_perl-1.99_22.tar.gz mod_perl-2.0-current.tar.gz
    % tar -xzvf mod_perl-1.99_22.tar.gz
    % rm /www/perl.apache.org/dist/mod_perl-2.0-current
    % ln -sf mod_perl-1.99_22 mod_perl-2.0-current

  c. archive older releases (keep current + one prior release)

    % mv /www/perl.apache.org/dist/mod_perl-1.99_20.tar.gz \
         /www/perl.apache.org/dist/old
    % mv /www/perl.apache.org/dist/mod_perl-1.99_20.tar.gz.asc \
         /www/perl.apache.org/dist/old
    % rm -rf /www/perl.apache.org/dist/mod_perl-1.99_20

  d. update the version and release date
     modperl-docs/src/download/index_top.html and commit. It'll be
     automatically updated within 6 hours. Alternatively you can do a
     manual update by logging into www.apache.org and running:

    % /home/perlwww/apache.org/modperl-docs/bin/site_build

5. Upload the package to CPAN

6. Tarball signing

  (depending on whether you use GPG or PGP, pick the first or the
  second set of the commands):

  a. sign your local copy of the tarball:

    % gpg --detach-sign --armor mod_perl-1.99_22.tar.gz

    % pgps -b --armor mod_perl-1.99_22.tar.gz

  b. upload the generated sig file to www.apache.org:

    % scp mod_perl-1.99_22.tar.gz.asc www.apache.org:/www/perl.apache.org/dist/
    % ssh www.apache.org
    % cd /www/perl.apache.org/dist/
    % chmod 0664 mod_perl-1.99_22.tar.gz.asc
    % ln -sf mod_perl-1.99_22.tar.gz.asc mod_perl-2.0-current.tar.gz.asc

  c. ask one of the other developers to double check the signature file
     and tarball: download both files and verify the signature:

    http://perl.apache.org/dist/mod_perl-1.99_22.tar.gz.asc
    http://perl.apache.org/dist/mod_perl-1.99_22.tar.gz

    % gpg --verify mod_perl-1.99_22.tar.gz.asc

    % pgpv mod_perl-1.99_22.tar.gz.asc

  d. make sure that the files you just created are group rw so
     all the dist admins can make changes:

    % find /www/perl.apache.org/dist/ -user $USER -type f -exec chmod 0664 {} \; 
    % find /www/perl.apache.org/dist/ -user $USER -type d -exec chmod 0775 {} \; 

7. Distribute to www.apache.org/dist/perl 
   and archive the old package under /www/archive.apache.org/dist/perl/

  a. unpack the package, update symlinks to the tarball and unpacked distro:

   % cd /www/www.apache.org/dist/perl/
   % cp /www/perl.apache.org/dist/mod_perl-1.99_22.tar.gz* .
   % tar -xzvf mod_perl-1.99_22.tar.gz
   % mv mod_perl-1.99_20.tar.gz* /www/archive.apache.org/dist/perl/
   % rm -rf mod_perl-1.99_21

  b. make sure that the files you just created are group rw so
     all the dist admins can make changes:

    % find /www/www.apache.org/dist/ -user $USER -type f -exec chmod 0664 {} \; 
    % find /www/www.apache.org/dist/ -user $USER -type d -exec chmod 0775 {} \; 

8. Announce the package

  a. post ... to the modperl, announce lists
  Subject: [ANNOUNCE] mod_perl 1.99_22 
     include 
  - link at perl.apache.org:
    http://apache.org/dist/perl/mod_perl-1.99_22.tar.gz
    http://apache.org/dist/perl/mod_perl-1.99_22.tar.gz.asc (pgp sig)
  - MD5 sig (as it comes from CPAN upload announce).
  - the latest Changes

9. Prepare for the next cycle

  a. increment version in lib/mod_perl.pm

  b. edit ./Changes:
     - start a new item with incremented version + '-dev'

  =item 1.99_23-dev

  c. add a release entry in STATUS

  d. update this file versions to make it easy to copy-n-paste things
     on the next release:

   perl -pi -e 's/_23/_24/g' RELEASE
   perl -pi -e 's/_22/_23/g' RELEASE
   perl -pi -e 's/_21/_22/g' RELEASE
   perl -pi -e 's/_20/_21/g' RELEASE

     now reload this file and bump up the last number of the first
     command.

  e. commit the changed files

     % svn ci Changes lib/mod_perl.pm STATUS RELEASE

