It is probably time to stop using a single generic Change class and instead have specific subclasses for things like DarcsChange and !CVSChange. The logic to see whether Changes can be merged could be moved into the Change object (and out of the Source buildstep) this way. Also we could have an !IChange interface, with methods to get a short author name (for presentation on the waterfall) and a User object (for other purposes) and a list of URLs and stuff.
This would also open the way for non-VC Changes: things to indicate that an upstream library has a new release available, or that a dependent scheduler has produced a new build (in which case the new Change class would represent a new binary installer or something). Rob Helmer would like some of this to improve the Mozilla build process.
Also note: the "viewvc" project is a descendant of viewcvs/viewsvn, and we should make it easy for these Change objects to contain links to a viewvc page.