Monotone was constructed to serve both as a version control tool and as a quality assurance tool. The quality assurance features permit users to ignore, or “filter out”, versions which do not meet their criteria for quality. This section describes the way monotone represents and reasons about quality information.
Monotone often views the collection of revisions as a directed graph,
in which revisions are the nodes and changes between revisions are the
edges. We call this the revision graph. The revision graph has a
number of important subgraphs, many of which overlap. For example,
each branch is a subgraph of the revision graph, containing only the
nodes carrying a particular
Many of monotone’s operations involve searching the revision graph for
the ancestors or descendants of a particular revision, or extracting
the “heads” of a subgraph, which is the subgraph’s set of nodes with
no descendants. For example, when you run the
monotone searches the subgraph consisting of descendants of the base
revision of the current workspace, trying to locate a unique head to
update the base revision to.
Monotone’s quality assurance mechanisms are mostly based on restricting the subgraph each command operates on. There are two methods used to restrict the subgraph:
branchcertificates, you can require that specific code reviewers have approved of each edge in the subgraph you focus on.
testresultcertificates, you can require that the endpoints of an update operation have a certificate asserting that the revision in question passed a certain test, or testsuite.
The evaluation of trust is done on a cert-by-cert basis by calling the Lua hook get_revision_cert_trust. This hook is only called when a cert has at least one good signature from a known key, and are passed all the keys which have signed the cert, as well as the cert’s ID, name and value. The hook can then evaluate the set of signers, as a group, and decide whether to grant or deny trust to the assertion made by the cert.
The evaluation of testresults is controlled by the
accept_testresult_change hook (see accept_testresult_change).
This hook is called when
selecting update candidates, and is passed a pair of tables describing
testresult certs present on the source and proposed
destination of an update. Only if the change in test results are
deemed “acceptable” does monotone actually select an update target
to merge into your workspace.