Maintainer Release Instructions
*******************************

Official releases are made by creating a dist-bundle as supported by
the autotools framework. This is not a normal target for users building
the library to use, and as such it may introduce extra tool requirements.
For example, 'makeinfo' is required to generate some documentation before
a bundle can be created.


Official Releases
=================

Releases use a version tuple of pattern MAJOR.MINOR.POINT and changing
the version is accomplished by editing the corresponding values in:

    project/project.m4sugar

And all releases follow this repository URL convention:

    https://mp4v2.googlecode.com/svn/releases/MAJOR.MINOR.POINT

Thus, releases will produce dist bundles of this pattern:

    mp4v2-MAJOR.MINOR.POINT.tar.bz2

MAJOR-RELEASE. This kind of release has a major impact to the public
interface and/or other aspects of the project. You must increment
MAJOR and reset MINOR and reset POINT. Typically used when API
components are modified or removed.

MINOR-RELEASE. This kind of release has some minor but significant
changes to the public interface. You must increment MINOR and
reset POINT. Typically used when API components are added.

POINT-RELEASE. This kind of release is usually for bugfix/maintenance
purposes and does not adversely effect the public interface. You
must increment POINT.

A release is branched from either the trunk or an earlier release.
If branched from the trunk, it will naturally be the "chase-version"
which the trunk has been developing. For example, on a new project
trunk might work towards a 1.0.0 release. When that project is
deemed ready, trunk is branched to 1.0.0. Any final changes are
then applied on the new branch, while trunk continues development,
chasing it's next release, which might be 1.1.0.


WORKFLOW - MINOR-RELEASE
------------------------

    # branch release from trunk (head)
    svn cp -m "BRANCHED: RELEASE 1.0.0" \
        https://mp4v2.googlecode.com/svn/trunk \
        https://mp4v2.googlecode.com/svn/releases/1.0.0

    # cd to your favorite work area for mp4v2
    cd /work/mp4v2/
    
    # checkout release, local workdir 1.0.0 default is good
    svn co https://mp4v2.googlecode.com/svn/releases/1.0.0
    cd 1.0.0/

    # if needed, edit version, checkin, update, autoreconf.
    vi project/project.m4sugar
    svn ci
    svn update
    autoreconf -fiv

    # clean-room discipline
    #   at this point there should be no pending changes in working dir
    #   if there are, you're probably just working out kinks in the
    #   autotool system but in the final run, all files should be
    #   checked in at this point.
    #
    # make distcheck || make dist (the latter if you're in a hurry)
    rm -fr build/
    mkdir build/
    cd build/
    ../configure
    make distcheck

    # upload bundle somewhere
    mkdir -p ~/OUTGOING
    cp mp4v2-1.0.0.tar.bz2 ~/OUTGOING/.

    # FINISHED - CLOSED: https://mp4v2.googlecode.com/svn/releases/1.0.0
    # Once the bundle is published, no more changes allowed!

    # TRUNK - now go back to trunk, edit version, checkin, update, autoreconf.
    # note that we bump trunk automatically to the next anticpated
    # major-release or minor-release, as point-releases do not belong here.
    cd /work/mp4v2/
    svn co https://mp4v2.googlecode.com/svn/trunk/
    cd trunk/
    vi project/project.m4sugar # bump version to 1.1.0
    svn ci -m "BUMP: TRUNK 1.1.0"
    svn update
    autoreconf -fiv


WORKFLOW - POINT-RELEASE
------------------------

If a point release such as 1.0.1 needs to be done, then it is important
to branch from 1.0.0 (not trunk!). Here is an example 1.0.1 point-release.

    svn cp -m "BRANCHED: RELEASE 1.0.1" \
        https://mp4v2.googlecode.com/svn/releases/1.0.0 \
        https://mp4v2.googlecode.com/svn/releases/1.0.1
    svn co https://mp4v2.googlecode.com/svn/releases/1.0.1
    cd 1.0.1/
    vi project/project.m4sugar # bump version to 1.0.1
    svn ci
    svn update
    autoreconf -fiv
    .
    .
    .
    # *** APPLY CODE CHANGES ***
    # *** TEST ***
    .
    .
    .
    svn ci
    svn update
    autoreconf -fiv
    rm -fr build/
    mkdir build/
    cd build/
    ../configure
    make distcheck
    cp mp4v2-1.0.1.tar.bz2 ~/OUTGOING/.
    # FINISHED - CLOSED: https://mp4v2.googlecode.com/svn/releases/1.0.1
