I have a plan to refactor the lab exercises for EG-140 in readiness for
automated submission and marking. The first step was to put the BlueJ projects
that students upload into a new repository. However I wanted the repository to
be such that all the projects would be within the eg-140-laboratory project
but different subsets could be delivered to various audiences. For example,
students starting a week’s work should be able to get hold of just a single
project as in
cvs -d _cvs\_repository_ co naive-ticket-machine
or a whole week’s exercises as in
cvs -d _cvs\_repository_ co eg-140-week2
Here is my project structure:
eg-140-laboratory
|
+-- week2
|
+-- better-ticket-machine
|
+-- src
|
+-- test
|
+-- bluej
|
+-- files that students upload (a bluej project)
After some reading in Essential CVS and the CVS official manual I discovered how to use modules for this. Here is my module file:
Three different line formats are valid:
key -a aliases...
key [options] directory
key [options] directory files...
Where "options" are composed of:
-i progRun "prog" on "cvs commit" from top-level of module.-o progRun "prog" on "cvs checkout" of module.-e progRun "prog" on "cvs export" of module.-t progRun "prog" on "cvs rtag" of module.-u progRun "prog" on "cvs update" of module.-d dirPlace module in directory "dir" instead of module name.-lTop-level directory only -- do not recurse.
Note: If you change any of the "Run" options above, you'll have to release and
re-checkout any working directories of these modules. And "directory" is a path
to a directory relative to $CVSROOT.
The "-a" option specifies an alias. An alias is interpreted as if everything
on the right of the "-a" had been typed on the command line.
You can encode a module within a module by using the special & character to
interpose another module into the current module. This can be useful for
creating a module that consists of many directories spread out over the entire
source repository.
CVSROOT CVSROOT
The modules file itself
modules CVSROOT modules
EG-140 Laboratory: only available to staff!
eg-140-laboratory eg-140-laboratory
Student projects: incomplete projects that have to be edited. Essentially the BlueJ projects provided with Barnes and Kölling. Week 2: the individual projects
better-ticket-machine eg-140-laboratory/week2/better-ticket-machine/bluej naive-ticket-machine eg-140-laboratory/week2/naive-ticket-machine/bluej
book-exercise eg-140-laboratory/week2/book-exercise/bluej
Week 2: all together
eg-140-week2 -d week2 &naive-ticket-machine &better-ticket-machine
&book-exercise
As you can see, we set up the bluej folder in each sub-project to be a module,
named a they are in Barnes and Kölling. We then have a combined module to
bring together all the projects in a week’s labs (corresponding to a chapter in
the book) as a CVS module eg-140-week2. When we check out this project, it
creates a CVS sandbox named week2 which contains the three projects.
The next extension will be to get the staff-only version with worked solutions and JUnit tests working.
A couple of questions for later
- If we want students to check-in changes to their own repository, how can we do
it? The
CVSROOTwhere the original code comes from would be inappropriate … we effectively want each student to have his/own repository. CVS can probably do this so back to the book! - How can I get the compiled tests into the Bluej folders without breaking version dependencies? [answer might be cvs update — build all — cvs commit?]