CVS Branching

From WeBWorK_wiki
Jump to navigation Jump to search
This article has been retained as a historical document. It is not up-to-date and the formatting may be lacking. Use the information herein with caution.
Outdated IMPORTANT: The content of this page is outdated. Do not rely on the information contained in this page.

We should create a release branch rel-2-2-dev before the feature freeze, and do the freeze on that branch instead of in HEAD. We can upgrade hosted.webwork and math.webwork to this branch at the same time, to get some serious testing done. If other developers happen to be working on big features at the time, they can continue to do so in HEAD.

It would look like this:

     |<-- development -->|<---------- development ------------------>
HEAD --------------------+------------------------------------------>
                         | /\    /\    /\    /\
                         | ||    ||    ||    ||  bug fixes forward-
                         | ||    ||    ||    ||  and back-ported
                         | \/    \/    \/    \/
    rel-2-2-dev (branch) *--------------+--------------+------------>
    (math.webwork and    |<-- freeze -->|<-- freeze -->|
    hosted.webwork run   |  (bugfixes)  |  (bugfixes)  |
    this branch)        /              /              /
                       /              /              /
            (not a release)      rel-2-2-0      rel-2-2-1

Here's how I initially create a new release branch:

# branch the current HEAD as rel-2-2-dev
cvs -d /webwork/cvs/system rtag -b rel-2-2-dev webwork2 pg
# tag the current rel-2-2-dev as rel-2-2-start, to mark the start of the branch
cvs -d /webwork/cvs/system rtag -r rel-2-2-dev rel-2-2-start webwork2 pg

(I'm assuming that no changes have been made to the rel-2-2-dev branch between the two commands. Maybe we could tag HEAD as rel-2-2-start and then branch from that tag instead. That way, we'd have a fixed tag to branch off of. Would that make any difference?)

Developers who wish to help prepare the release and fix bugs should check out a new working copy on the rel-2-2-dev branch. (Note the custom checkout dir names.)

cvs -d /webwork/cvs/system co -r rel-2-2-dev -d webwork2_rel-2-2-dev webwork2
cvs -d /webwork/cvs/system co -r rel-2-2-dev -d pg_rel-2-2-dev pg

As bugs are fixed in this branch, they should be forward-ported into HEAD. My theory is that it's easier to forward port bugfixes from a branch that contains only bugfixes than it is to tease bugfixes out of an unstable and rapidly-changing HEAD and backport them. However, in reality it turns out that most bugs get fixed in HEAD and then need to be backported into a release branch. I usually end up doing this by looking at the commit logs that have been emailed to me and feeding the diffs into the release branch.

Here's a recipe for committing a change to two branches easily. If your current working copy is on the rel-2-2-dev branch:

cd webwork2
<tweak file "foo">
cvs commit foo                        # check into rel-2-2-dev
<CVS says, checked in "foo" version 1.10.2.5>
cvs up -A foo                         # switch to HEAD
cvs up -j 1.10.2.4 -j 1.10.2.5 foo    # merge the change
<deal with conflicts in "foo", if any>
cvs commit foo                        # check into HEAD
cvs up -r rel-2-2-dev foo             # go back to rel-2-2-dev

This gets slightly more complex for multiple file commits, since you need a separate merge line for each file:

cd webwork2
<tweak files "foo" and "bar">
cvs commit foo bar                    # check into rel-2-2-dev
<CVS says, checked in "foo" version 1.10.2.5 and "bar" version 1.5.2.4>
cvs up -A foo bar                     # switch to HEAD
cvs up -j 1.10.2.4 -j 1.10.2.5 foo    # merge the change for "foo"
cvs up -j 1.5.2.3 -j 1.5.2.4 bar      # merge the change for "bar"
<deal with conflicts in both files, if any>
cvs commit foo bar                    # check into HEAD
cvs up -r rel-2-2-dev foo bar         # go back to rel-2-2-dev

But most bug fixes should be pretty localized, so I think it'll be manageable. If it turns out to be onerous, I can write or find a script to do it automatically.

Later on, when there are Zarro Boogs, we'll tag the current rel-2-2-dev as rel-2-2-0, make tarballs of it, and release them.