Monticello breaks Smalltalk systems down into their fundamental units, which are called elements. There elements which represent the following:
For more detail, see Elements.
A variant captures the state of a particular element. For a method, this would include its source code. For a class element, a variant would include the name of its superclass. Each type of element will have a different set of properties that can be recorded to create a variant of that element.
A version of an element associates a variant of a particular element with the ancestry of that element. The ancestry is a simple Set of versions which have been superceded by this version.
A hashstamp is a unique identifier given to each version. It is created by taking a SHA1 hash of the content of the version - its element, variant and ancestry, and pairing it with a timestamp telling when the version was created. Versions can be referred to by their hashstamps.
Although Monticello keeps the version history of each element of a program separate, it's awkward to deal with elements individually. Slices provide a way to group elements together. The job of a slice is to divide elements into two groups - those that are part of the slice, and those that are not. Slices are independent of one another and can overlap; a given element may be in any number of slices or no slice at all.
Different types of slices can be defined for different purposes:
Other types of slices can be defined as needed.
Just as variants capture the state of an element, snapshots capture the state of a slice. For each element in a slice, the snapshot records the version of the element that was present in the image when the snapshot was taken. Snapshots do not include the versions themselves, but refer to them by hashstamp.
When you take a snapshot of a slice, the snapshot and all the versions it includes are stored in a repository. There are several different types of repositories:
Any significant programming project will likely involve many slices and several repositories. Monticello groups all these things together into projects. A project can include any number of slices and repositories, and encapsulates the book-keeping needed to keep track of them all. The Monticello user interface is organized around projects, and all versioning tasks are done in the context of a particular project.