monotone documentation

Top

Monotone Documentation

Monotone is a distributed version control tool. It can help automate many tedious and error-prone tasks in group software development.

Please be aware that monotone is a slightly unorthodox version control tool, and many of its concepts are slightly similar — but significantly different — from concepts with similar names in other version control tools.

Complete table of contents

Table of Contents

1 Concepts

This chapter should familiarize you with the concepts, terminology, and behavior described in the remainder of the user manual. Please take a moment to read it, as later sections will assume familiarity with these terms.

1.1 Versions of files

Suppose you wish to modify a file file.txt on your computer. You begin with one version of the file, load it into an editor, make some changes, and save the file again. Doing so produces a new version of the file. We will say that the older version of the file was a parent, and the new version is a child, and that you have performed an edit between the parent and the child. We may draw the relationship between parent and child using a graph, where the arrow in the graph indicates the direction of the edit, from parent to child.

figures/parent-child.png

We may want to identify the parent and the child precisely, for sake of reference. To do so, we will compute a cryptographic hash function, called sha1, of each version. The details of this function are beyond the scope of this document; in summary, the sha1 function takes a version of a file and produces a short string of 20 bytes, which we will use to uniquely identify the version1. Now our graph does not refer to some “abstract” parent and child, but rather to the exact edit we performed between a specific parent and a specific child.

figures/parent-child-names-hashes.png

When dealing with versions of files, we will dispense with writing out “file names”, and identify versions purely by their sha1 value, which we will also refer to as their file ID. Using IDs alone will often help us accommodate the fact that people often wish to call files by different names. So now our graph of parent and child is just a relationship between two versions, only identified by ID.

figures/parent-child-hashes.png

Version control systems, such as monotone, are principally concerned with the storage and management of multiple versions of some files. One way to store multiple versions of a file is, literally, to save a separate complete copy of the file, every time you make a change. When necessary, monotone will save complete copies of your files in their, compressed with the zlib compression format.

figures/three-versions.png

Often we find that successive versions of a file are very similar to one another, so storing multiple complete copies is a waste of space. In these cases, rather than store complete copies of each version of a file, we store a compact description of only the changes which are made between versions. Such a description of changes is called a delta.

Storing deltas between files is, practically speaking, as good as storing complete versions of files. It lets you undo changes from a new version, by applying the delta backwards, and lets your friends change their old version of the file into the new version, by applying the delta forwards. Deltas are usually smaller than full files, so when possible monotone stores deltas, using a modified xdelta format. The details of this format are beyond the scope of this document.

figures/difference-between-versions.png

1.2 Versions of trees

After you have made many different files, you may wish to capture a “snapshot” of the versions of all the files in a particular collection. Since files are typically collected into trees in a file system, we say that you want to capture a version of your tree. Doing so will permit you to undo changes to multiple files at once, or send your friend a set of changes to many files at once.

To make a snapshot of a tree, we begin by writing a special file called a manifest. In fact, monotone will write this file for us, but we could write it ourselves too. It is just a plain text file. Each line of a manifest file contains two columns. In the first column we write the ID of a file in your tree, and in the second column we write the path to the file, from the root of our tree to the filename.

figures/manifest.png

Now we note that a manifest is itself a file. Therefore a manifest can serve as input to the sha1 function, and thus every manifest has an ID of its own. By calculating the sha1 value of a manifest, we capture the state of our tree in a single manifest ID. In other words, the ID of the manifest essentially captures all the IDs and file names of every file in our tree, combined. So we may treat manifests and their IDs as snapshots of a tree of files, though lacking the actual contents of the files themselves.

figures/file-id-manifest-id.png

As with versions of files, we may decide to store manifests in their entirety, or else we may store only a compact description of changes which occur between different versions of manifests. As with files, when possible monotone stores compact descriptions of changes between manifests; when necessary it stores complete versions of manifests.

1.3 Historical records

Suppose you sit down to edit some files. Before you start working, you may record a manifest of the files, for reference sake. When you finish working, you may record another manifest. These “before and after” snapshots of the tree of files you worked on can serve as historical records of the set of changes, or changeset, that you made. In order to capture a “complete” view of history – both the changes made and the state of your file tree on either side of those changes – monotone builds a special composite file called a revision each time you make changes. Like manifests, revisions are ordinary text files which can be passed through the sha1 function and thus assigned a revision ID.

figures/revision.png

The content of a revision makes reference to file IDs, in describing a changeset, and manifest IDs, in describing tree states “before and after” the changeset. Crucially, revisions also make reference to other revision IDs. This fact – that revisions include the IDs of other revisions – causes the set of revisions to join together into a historical chain of events, somewhat like a “linked list”. Each revision in the chain has a unique ID, which includes by reference all the revisions preceeding it. Even if you undo a changeset, and return to a previously-visited manifest ID during the course of your edits, each revision will incorporate the ID of its predecessor, thus forming a new unique ID for each point in history.

figures/revision-chaining.png

1.4 Certificates

Often, you will wish to make a statement about a revision, such as stating the reason that you made some changes, or stating the time at which you made the changes, or stating that the revision passes a test suite. Statements such as these can be thought of, generally, as a bundle of information with three parts:

For example, if you want to say that a particular revision was composed on April 4, 2003, you might make a statement like this:

figures/statement.png

In an ideal world, these are all the parts of a statement we would need in order to go about our work. In the real world, however, there are sometimes malicious people who would make false or misleading statements; so we need a way to verify that a particular person made a particular statement about a revision. We therefore will add two more pieces of information to our bundle:

When these 2 items accompany a statement, we call the total bundle of 5 items a certificate, or cert. A cert makes a statement in a secure fashion. The security of the signature in a cert is derived from the rsa cryptography system, the details of which are beyond the scope of this document.

figures/cert.png

Monotone uses certs extensively. Any “extra” information which needs to be stored, transmitted or retrieved — above and beyond files, manifests, and revisions — is kept in the form of certs. This includes change logs, time and date records, branch membership, authorship, test results, and more. When monotone makes a decision about storing, transmitting, or extracting files, manifests, or revisions, the decision is often based on certs it has seen, and the trustworthiness you assign to those certs.

The rsa cryptography system — and therefore monotone itself — requires that you exchange special “public” numbers with your friends, before they will trust certificates signed by you. These numbers are called public keys. Giving someone your public key does not give them the power to impersonate you, only to verify signatures made by you. Exchanging public keys should be done over a trusted medium, in person, or via a trusted third party. Advanced secure key exchange techniques are beyond the scope of this document.

Most of monotone's certs refer to revision IDs. Some certs may refer to file IDs or manifest IDs, depending on context. This capability may also be removed in the future, at which point certs will only refer to revisions.

1.5 Storage and workflow

Monotone moves information in and out of three different types of storage:

All information passes through your local database, en route to some other destination. For example, when changes are made in a working copy, you may save those changes to your database, and later you may synchronize your database with someone else's. Monotone will not move information directly between a working copy and a remote database, or between working copies. Your local database is always the “switching point” for communication.

figures/general-workflow.png

A working copy is a tree of files in your file system, arranged according to the list of file paths and IDs in a particular manifest. A special directory called MT exists in the root of any working copy. Monotone keeps some special files in the MT directory, in order to track changes you make to your working copy.

Aside from the special MT directory, a working copy is just a normal tree of files. You can directly edit the files in a working copy using a plain text editor or other program; monotone will automatically notice when you make any changes. If you wish to add files, remove files, or move files within your working copy, you must tell monotone explicitly what you are doing, as these actions cannot be deduced.

If you do not yet have a working copy, you can check out a working copy from a database, or construct one from scratch and add it into a database. As you work, you will occasionally commit changes you have made in a working copy to a database, and update a working copy to receive changes that have arrived in a database. Committing and updating take place purely between a database and a working copy; the network is not involved.

figures/local-workflow.png

A database is a single, regular file. You can copy or back it up using standard methods. Typically you keep a database in your home directory. Databases are portable between different machine types. If a database grows too big, you may choose to remove information from it. You can have multiple databases and divide your work between them, or keep everything in a single database if you prefer. You can dump portions of your database out as text, and read them back into other databases, or send them to your friends.

A database contains many files, manifests, revisions, and certificates, some of which are not immediately of interest, some of which may be unwanted or even false. It is a collection of information received from network servers, working copies, and other databases. You can inspect and modify your databases without affecting your working copies, and vice-versa.

Monotone knows how to exchange information in your database with other remote databases, using an interactive protocol called netsync. It supports three modes of exchange: pushing, pulling, and synchronizing. A pull operation copies data from a remote database to your local database. A push operation copies data from your local database to a remote database. A sync operation copies data both directions. In each case, only the data missing from the destination is copied. The netsync protocol calculates the data to send “on the fly” by exchanging partial hash values of each database.

figures/network-workflow.png

In general, work flow with monotone involves 3 distinct stages:

The last stage of workflow is worth clarifying: monotone does not blindly apply all changes it receives from a remote database to your working copy. Doing so would be very dangerous, because remote databases are not always trustworthy systems. Rather, monotone evaluates the certificates it has received along with the changes, and decides which particular changes are safe and desirable to apply to your working copy.

You can always adjust the criteria monotone uses to judge the trustworthiness and desirability of changes in your database. But keep in mind that it always uses some criteria; receiving changes from a remote server is a different activity than applying changes to a working copy. Sometimes you may receive changes which monotone judges to be untrusted or bad; such changes may stay in your database but will not be applied to your working copy.

Remote databases, in other words, are just untrusted “buckets” of data, which you can trade with promiscuously. There is no trust implied in communication.

1.6 Forks and merges

So far we have been talking about revisions as though each logically follows exactly one revision before it, in a simple sequence of revisions.

figures/linear-history.png

This is a rosy picture, but sometimes it does not work out this way. Sometimes when you make new revisions, other people are simultaneously making new revisions as well, and their revisions might be derived from the same parent as yours, or contain different changesets. Without loss of generality, we will assume simultaneous edits only happen two-at-a-time; in fact many more edits may happen at once but our reasoning will be the same.

We call this situation of simultaneous edits a fork, and will refer to the two children of a fork as the left child and right child. In a large collection of revisions with many people editing files, especially on many different computers spread all around the world, forks are a common occurrence.

figures/fork.png

If we analyze the changes in each child revision, we will often find that the changeset between the parent and the left child are unrelated to the changeset between the parent and the right child. When this happens, we can usually merge the fork, producing a common grandchild revision which contains both changesets.

figures/merge.png

1.7 Branches

Sometimes, people intentionally produce forks which are not supposed to be merged; perhaps they have agreed to work independently for a time, or wish to change their files in ways which are not logically compatible with each other. When someone produces a fork which is supposed to last for a while (or perhaps permanently) we say that the fork has produced a new branch. Branches tell monotone which revisions you would like to merge, and which you would like to keep separate.

You can see all the available branches using monotone list branches.

Branches are indicated with certs. The cert name branch is reserved for use by monotone, for the purpose of identifying the revisions which are members of a branch. A branch cert has a symbolic “branch name” as its value. When we refer to “a branch”, we mean all revisions with a common branch name in their branch certs.

For example, suppose you are working on a program called “wobbler”. You might develop many revisions of wobbler and then decide to split your revisions into a “stable branch” and an “unstable branch”, to help organize your work. In this case, you might call the new branches “wobbler-stable” and “wobbler-unstable”. From then on, all revisions in the stable branch would get a cert with name branch and value wobbler-stable; all revisions in the unstable branch would get a cert with name branch and value wobbler-unstable. When a wobbler-stable revision forks, the children of the fork will be merged. When a wobbler-unstable revision forks, the children of the fork will be merged. However, the wobbler-stable and wobbler-unstable branches will not be merged together, despite having a common ancestor.

figures/two-branches.png

For each branch, the set of revisions with no children is called the heads of the branch. Monotone can automatically locate, and attempt to merge, the heads of a branch. If it fails to automatically merge the heads, it may ask you for assistance or else fail cleanly, leaving the branch alone.

For example, if a fork's left child has a child of its own (a “left grandchild”), monotone will merge the fork's right child with the left grandchild, since those revisions are the heads of the branch. It will not merge the left child with the right child, because the left child is not a member of the heads.

figures/branch-heads.png

When there is only one revision in the heads of a branch, we say that the heads are merged, or more generally that the branch is merged, since the heads is the logical set of candidates for any merging activity. If there are two or more revisions in the heads of a branch, and you ask to merge the branch, monotone will merge them two-at-a-time until there is only one.

1.7.1 Branch Names

The branch names used in the above section are fine for an example, but they would be bad to use in a real project. The reason is, monotone branch names must be globally unique, over all branches in the world. Otherwise, bad things can happen. Fortunately, we have a handy source of globally unique names — the DNS system.

When naming a branch, always prepend the reversed name of a host that you control or are otherwise authorized to use. For example, monotone development happens on the branch net.venge.monotone, because venge.net belongs to monotone's primary author. The idea is that this way, you can coordinate with other people using a host to make sure there are no conflicts — in the example, monotone's primary author can be certain that no-one else using venge.net will start up a different program named monotone. If you work for Yoyodyne, Inc. (owners of yoyodyne.com), then all your branch names should look like com.yoyodyne.something.

What the something part looks like is up to you, but usually the first part is the project name (the monotone in net.venge.monotone), and then possibly more stuff after that to describe a particular branch. For example, monotone's win32 support was initially developed on the branch net.venge.monotone.win32.

(For more information, see Naming Conventions.)

2 Tutorial

This chapter illustrates the basic uses of monotone by means of an example, fictional software project. Before we walk through the tutorial, there are two minor issues to address: standard options and revision selectors.

2.0.1 Standard Options

Before operating monotone, two important command-line options should be explained.

Monotone will cache the settings for these options in your working copy, so ordinarily once you have checked out a project, you will not need to specify them again. We will therefore only mention these arguments in the first example.

2.0.2 Revision Selectors

Many commands require you to supply 40-character sha1 values as arguments, which identify revisions. These “revision IDs” are tedious to type, so monotone permits you to supply “revision selectors” rather than complete revision IDs. Selectors are a more “human friendly” way of specifying revisions by combining certificate values into unique identifiers. This “selector” mechanism can be used anywhere a revision ID would normally be used. For details on selector syntax, see Selectors.

We are now ready to explore our fictional project.

2.1 The Fictional Project

Our fictional project involves 3 programmers cooperating to write firmware for a robot, the JuiceBot 7, which dispenses fruit juice. The programmers are named Jim, Abe and Beth.

In our example the programmers work privately on laptops, and are usually disconnected from the network. They share no storage system. Thus when each programmer enters a command, it affects only his or her own computer, unless otherwise stated.

In the following, our fictional project team will work through several version control tasks. Some tasks must be done by each member of our example team; other tasks involve only one member.

2.2 Creating a Database

The first step Jim, Abe and Beth each need to perform is to create a new database. This is done with the monotone db init command, providing a --db option to specify the location of the new database. Each programmer creates their own database, which will reside in their home directory and store all the revisions, files and manifests they work on. Monotone requires this step as an explicit command, to prevent spurious creation of databases when an invalid --db option is given.

In real life, most people prefer to keep one database for each project they work on. If we followed that convention here in the tutorial, though, then all the databases would be called juicebot.db, and that would make things more confusing to read. So instead, we'll have them each name their database after themselves.

Thus Jim issues the command:

     $ monotone db init --db=~/jim.db

Abe issues the command:

     $ monotone db init --db=~/abe.db

And Beth issues the command:

     $ monotone db init --db=~/beth.db

2.3 Generating Keys

Now Jim, Abe and Beth must each generate an rsa key pair for themselves. This step requires choosing a key identifier. Typical key identifiers are similar to email addresses, possibly modified with some prefix or suffix to distinguish multiple keys held by the same owner. Our example programmers will use their email addresses at the fictional “juicebot.co.jp” domain name. When we ask for a key to be generated, monotone will ask us for a passphrase. This phrase is used to encrypt the key when storing it on disk, as a security measure.

Jim does the following:

     $ monotone --db=~/jim.db genkey jim@juicebot.co.jp
     enter passphrase for key ID [jim@juicebot.co.jp] : <Jim enters his passphrase>
     monotone: generating key-pair 'jim@juicebot.co.jp'
     monotone: storing key-pair 'jim@juicebot.co.jp' in database

Abe does something similar:

     $ monotone --db=~/abe.db genkey abe@juicebot.co.jp
     enter passphrase for key ID [abe@juicebot.co.jp] : <Abe enters his passphrase>
     monotone: generating key-pair 'abe@juicebot.co.jp'
     monotone: storing key-pair 'abe@juicebot.co.jp' in database

as does Beth:

     $ monotone --db=~/beth.db genkey beth@juicebot.co.jp
     enter passphrase for key ID [beth@juicebot.co.jp] : <Beth enters her passphrase>
     monotone: generating key-pair 'beth@juicebot.co.jp'
     monotone: storing key-pair 'beth@juicebot.co.jp' in database

Each programmer has now generated a key pair and placed it in their local database. Each can list the keys in their database, to ensure the correct key was generated. For example, Jim might see this:

     $ monotone --db=~/jim.db list keys
     
     [public keys]
     9e9e9ef1d515ad58bfaa5cf282b4a872d8fda00c jim@juicebot.co.jp
     
     
     [private keys]
     771ace046c27770a99e5fddfa99c9247260b5401 jim@juicebot.co.jp

The hexadecimal string printed out before each key name is a fingerprint of the key, and can be used to verify that the key you have stored under a given name is the one you intended to store. Monotone will never permit one database to store two keys with the same name or the same fingerprint.

This output shows one private and one public key stored under the name jim@juicebot.co.jp, so it indicates that Jim's key-pair has been successfully generated and stored. On subsequent commands, Jim will need to re-enter our passphrase in order to perform security-sensitive tasks. To simplify matters, Jim decides to store his security passphrase in his .monotonerc file, by writing a hook function which returns the passphrase, so that he does not need to repeatedly be prompted for it:

     $ cat >>~/.monotonerc
     function get_passphrase(keypair_id)
       return "jimsekret"
     end
     ^D

Note that we are appending the new hook to the (possibly existing) file. We do this to avoid loosing other changes by mistake; therefore, be sure to check that no other get_passphrase function appears in the configuration file.

Abe and Beth do the same, with their secret passphrases.

2.4 Exchanging Keys

Jim, Abe and Beth all wish to work with one another, and trust one another. For monotone to accept this situation, the team members will need to exchange the public parts of their rsa key with each other.

First, Jim exports his public key:

     $ monotone --db=~/jim.db pubkey jim@juicebot.co.jp >~/jim.pubkey

His public key is just a plain block of ASCII text:

     $ cat ~/jim.pubkey
     [pubkey jim@juicebot.co.jp]
     MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCbaVff9SF78FiB/1nUdmjbU/TtPyQqe/fW
     CDg7hSg1yY/hWgClXE9FI0bHtjPMIx1kBOig09AkCT7tBXM9z6iGWxTBhSR7D/qsJQGPorOD
     DO7xovIHthMbZZ9FnvyB/BCyiibdWgGT0Gtq94OKdvCRNuT59e5v9L4pBkvajb+IzQIBEQ==
     [end]

Abe also exports his public key:

     $ monotone --db=~/abe.db pubkey abe@juicebot.co.jp >~/abe.pubkey

As does Beth:

     $ monotone --db=~/beth.db pubkey beth@juicebot.co.jp >~/beth.pubkey

Then all three team members exchange keys. The keys are not secret, but the team members must be relatively certain that they are communicating with the person they intend to trust, when exchanging keys, and not some malicious person pretending to be a team member. Key exchange may involve sending keys over an encrypted medium, or meeting in person to exchange physical copies, or any number of techniques. All that matters, ultimately, is for each team member to receive the keys of the others.

So eventually, after key exchange, Jim has Beth's and Abe's public key files in his home directory, along with his own. He tells monotone to read the associated key packets into his database:

     $ monotone --db=~/jim.db read <~/abe.pubkey
     monotone: read 1 packet
     $ monotone --db=~/jim.db read <~/beth.pubkey
     monotone: read 1 packet

Beth and Abe similarly tell monotone to read read the two new public keys they received into their respective databases.

2.5 Starting a New Project

Before they can begin work on the project, Jim needs to create a working copy — a directory whose contents monotone will keep track of. Often, one works on projects that someone else has started, and creates working copies with the checkout command, which you'll learn about later. Jim is starting a new project, though, so he does something a little bit different. He uses the monotone setup command to create a new working copy.

This command creates the named directory (if it doesn't already exist), and creates the MT directory within it. The MT directory is how monotone recognizes that a directory is a working copy, and monotone stores some bookkeeping files within it. For instance, command line values for the --db, --branch or --key options to the setup command will be cached in a file called MT/options, so you don't have to keep passing them to monotone all the time.

Jim creates his working copy:

     /home/jim$ monotone setup juice
     /home/jim$ cd juice
     /home/jim/juice$

Notice that Jim has changed his current directory to his newly created working copy. For the rest of this example we will assume that everyone issues all further monotone commands from their working copy directories.

2.6 Adding Files

Next Jim decides to add some files to the project. He writes up a file containing the prototypes for the JuiceBot 7:

     $ mkdir include
     $ cat >include/jb.h
     /* Standard JuiceBot hw interface */
     
     #define FLOW_JUICE 0x1
     #define POLL_JUICE 0x2
     int spoutctl(int port, int cmd, void *x);
     
     /* JuiceBot 7 API */
     
     #define APPLE_SPOUT 0x7e
     #define BANANA_SPOUT 0x7f
     void dispense_apple_juice ();
     void dispense_banana_juice ();
     ^D

Then adds a couple skeleton source files which he wants Abe and Beth to fill in:

     $ mkdir src
     $ cat >src/apple.c
     #include "jb.h"
     
     void
     dispense_apple_juice()
     {
       /* Fill this in please, Abe. */
     }
     ^D
     $ cat >src/banana.c
     #include "jb.h"
     
     void
     dispense_banana_juice()
     {
       /* Fill this in please, Beth. */
     }
     ^D

Now Jim tells monotone to add these files to its record of his working copy. He specifies one filename and one directory; monotone recursively scans the directory and adds all its files.

     $ monotone --db=~/jim.db add include/jb.h src
     monotone: adding include/jb.h to working copy add set
     monotone: adding src/apple.c to working copy add set
     monotone: adding src/banana.c to working copy add set

This command produces a record of Jim's intentions in a special file called MT/work, stored in the working copy. The file is plain text:

     $ cat MT/work
     add_file "include/jb.h"
     
     add_file "src/apple.c"
     
     add_file "src/banana.c"

Jim then gets up from his machine to get a coffee. When he returns he has forgotten what he was doing. He asks monotone:

     $ monotone --db=jim.db status
     
     new_manifest [2098eddbe833046174de28172a813150a6cbda7b]
     
     old_revision []
     old_manifest []
     
     add_file "include/jb.h"
     
     add_file "src/apple.c"
     
     add_file "src/banana.c"
     
     patch "include/jb.h"
      from []
        to [3b12b2d0b31439bd50976633db1895cff8b19da0]
     
     patch "src/apple.c"
      from []
        to [2650ffc660dd00a08b659b883b65a060cac7e560]
     
     patch "src/banana.c"
      from []
        to [e8f147e5b4d5667f3228b7bba1c5c1e639f5db9f]

The output of this command tells Jim that his edits, so far, constitute only the addition of some files. In the output we can see one pecularity of monotone's changeset format. The pecularity is that when monotone records a “new file”, it actually records two separate events: the addition of an empty file to the working copy, and a patch of that file from empty to its intended contents.

Jim wants to see the actual details of the files he added, however, so he runs a command which prints out the status and a GNU “unified diff” of the patches involved in the changeset:

     $ monotone --db=jim.db diff
     #
     # add_file "include/jb.h"
     #
     # add_file "src/apple.c"
     #
     # add_file "src/banana.c"
     #
     # patch "include/jb.h"
     #  from []
     #    to [3b12b2d0b31439bd50976633db1895cff8b19da0]
     #
     # patch "src/apple.c"
     #  from []
     #    to [2650ffc660dd00a08b659b883b65a060cac7e560]
     #
     # patch "src/banana.c"
     #  from []
     #    to [e8f147e5b4d5667f3228b7bba1c5c1e639f5db9f]
     #
     --- include/jb.h
     +++ include/jb.h
     @ -0,0 +1,13 @
     +/* Standard JuiceBot hw interface */
     +
     +#define FLOW_JUICE 0x1
     +#define POLL_JUICE 0x2
     +#define SET_INTR 0x3
     +int spoutctl(int port, int cmd, void *x);
     +
     +/* JuiceBot 7 API */
     +
     +#define APPLE_SPOUT 0x7e
     +#define BANANA_SPOUT 0x7f
     +void dispense_apple_juice ();
     +void dispense_banana_juice ();
     --- src/apple.c
     +++ src/apple.c
     @ -0,0 +1,7 @
     +#include "jb.h"
     +
     +void
     +dispense_apple_juice()
     +{
     +  /* Fill this in please, Abe. */
     +}
     --- src/banana.c
     +++ src/banana.c
     @ -0,0 +1,7 @
     +#include "jb.h"
     +
     +void
     +dispense_banana_juice()
     +{
     +  /* Fill this in please, Beth. */
     +}

2.7 Committing Work

Satisfied with the work he's done, Jim wants to save his changes. He chooses jp.co.juicebot.jb7 as a branch name. (See Naming Conventions for more information about appropriate branch names.) He then commits his working copy, which causes monotone to process the MT/work file and record the file contents, manifest, and revision into the database.

     $ monotone --db=jim.db --branch=jp.co.juicebot.jb7 commit --message='initial checkin of project'
     monotone: beginning commit
     monotone: manifest 2098eddbe833046174de28172a813150a6cbda7b
     monotone: revision 2e24d49a48adf9acf3a1b6391a080008cbef9c21
     monotone: branch jp.co.juicebot.jb7
     monotone: committed revision 2e24d49a48adf9acf3a1b6391a080008cbef9c21

Monotone did a number of things when committing the new revision. First, we can see from the output that monotone generated a manifest of the tree Jim committed. The manifest is stored inside the database, but Jim can print it out if he wants to see the exact state of all the files referenced by the revision he committed:

     $ monotone cat manifest
     3b12b2d0b31439bd50976633db1895cff8b19da0  include/jb.h
     2650ffc660dd00a08b659b883b65a060cac7e560  src/apple.c
     e8f147e5b4d5667f3228b7bba1c5c1e639f5db9f  src/banana.c

The column on the left contains cryptographic hashes of the files listed in the column on the right. Such a hash is also called the “file ID” of the file. The file ID identifies the state of each file stored in Jim's tree. The manifest is just a plain text file, identical to the output from the popular sha1sum unix command.

When monotone committed Jim's revision, it also erased the MT/work file, and wrote a new file called MT/revision, which contains the working copy's new base revision ID. Jim can use this revision ID in the future, as an argument to the checkout command, if he wishes to return to this revision:

     $ cat MT/revision
     2e24d49a48adf9acf3a1b6391a080008cbef9c21

Finally, monotone also generated a number of certificates, attached to the new revision. These certs store metadata about the commit. Jim can ask monotone for a list of certs on this revision.

     $ monotone ls certs 2e24d49a48adf9acf3a1b6391a080008cbef9c21
     -----------------------------------------------------------------
     Key   : jim@juicebot.co.jp
     Sig   : ok
     Name  : branch
     Value : jp.co.juicebot.jb7
     -----------------------------------------------------------------
     Key   : jim@juicebot.co.jp
     Sig   : ok
     Name  : date
     Value : 2004-10-26T02:53:08
     -----------------------------------------------------------------
     Key   : jim@juicebot.co.jp
     Sig   : ok
     Name  : author
     Value : jim@juicebot.co.jp
     -----------------------------------------------------------------
     Key   : jim@juicebot.co.jp
     Sig   : ok
     Name  : changelog
     Value : initial checkin of project

The output of this command has a block for each cert found. Each block has 4 significant pieces of information. The first indicates the signer of the cert, in this case jim@juicebot.co.jp. The second indicates whether this cert is “ok”, meaning whether the rsa signature provided is correct for the cert data. The third is the cert name, and the fourth is the cert value. This list shows us that monotone has confirmed that, according to jim@juicebot.co.jp, the revision 2e24d49a48adf9acf3a1b6391a080008cbef9c21 is a member of the branch jp.co.juicebot.jb7, written by jim@juicebot.co.jp, with the given date and changelog.

It is important to keep in mind that revisions are not “in” or “out” of a branch in any global sense, nor are any of these cert values true or false in any global sense. Each cert indicates that some person – in this case Jim – would like to associate a revision with some value; it is up to you to decide if you want to accept that association.

Jim can now check the status of his branch using the “heads” command, which lists all the head revisions in the branch:

     $ monotone heads
     branch 'jp.co.juicebot.jb7' is currently merged:
     2e24d49a48adf9acf3a1b6391a080008cbef9c21 jim@juicebot.co.jp 2004-10-26T02:53:08

The output of this command tells us that there is only one current “head” revision in the branch jp.co.juicebot.jb7, and it is the revision Jim just committed. A head revision is one without any descendents. Since Jim has not committed any changes to this revision yet, it has no descendents.

2.8 Network Service

Jim now decides he will make his base revision available to his employees. To do this first adds a small amount of extra information to his .monotonerc file, permitting Abe and Beth to access his database:

     $ cat >>~/.monotonerc
     function get_netsync_read_permitted (collection, identity)
       if (identity == "abe@juicebot.co.jp") then return true end
       if (identity == "beth@juicebot.co.jp") then return true end
       return false
     end
     
     function get_netsync_write_permitted (collection, identity)
       if (identity == "abe@juicebot.co.jp") then return true end
       if (identity == "beth@juicebot.co.jp") then return true end
       return false
     end
     
     function get_netsync_anonymous_read_permitted (collection)
       return false
     end
     ^D

He then makes sure that his TCP port 5253 is open to incoming connections, adjusting his firewall settings as necessary, and runs the monotone serve command:

     $ monotone --db=jim.db serve jim-laptop.juicebot.co.jp jp.co.juicebot.jb7

This command sets up a single listener loop on the host jim-laptop.juicebot.co.jp, serving the jp.co.juicebot.jb7 collection. This collection will naturally include the jp.co.juicebot.jb7 branch, and any sub-branches.

Now Abe decides he wishes to fetch Jim's code. To do this he issues the monotone sync command:

     monotone --db=abe.db sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 3200] [bytes out: 673]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

Abe now has, in his database, a copy of everything Jim put in the branch. Therefore Abe can disconnect from the expensive network connection he's on and work locally for a while. When Abe wants to send work back to Jim, or get new work Jim has added, all he needs to do is run the sync command again and work will flow both ways, bringing each party up to date with the work of the other.

At this point Jim is operating as a sort of “central server” for the company. If Jim wants to, he can leave his server running forever, or even put his server on a dedicated computer with better network connectivity. But if Jim is ever unable to play this role of “central server”, perhaps due to a network failure, either Beth or Abe can run the serve command and provide access for the other to sync with. In fact, each employee can run a server if they like, concurrently, to help minimize the risk of service disruption from hardware failures. Changes will flow between servers automatically as clients access them and trade with one another.

In practice, most people like to use at least one central server that is always running; this way, everyone always knows where to go to get the latest changes, and people can push their changes out without first calling their friends and making sure that they have their servers running. To support this style of working, monotone remembers the first server you use, and makes that the default for future operations.

2.9 Making Changes

Abe decides to do some work on his part of the code. He has a copy of Jim's database contents, but cannot edit any of that data yet. He begins his editing by checking out the head of the jp.co.juicebot.jb7 branch into a working copy, so he can edit it:

     $ monotone --db=abe.db --branch=jp.co.juicebot.jb7 checkout .

Monotone unpacks the set of files in the head revision's manifest directly into Abe's current directory. (If he had specified something other than . at the end, monotone would have created that directory and unpacked the files into it.) Abe then opens up one of the files, src/apple.c, and edits it:

     $ vi src/apple.c
     <Abe writes some apple-juice dispensing code>

The file src/apple.c has now been changed. Abe gets up to answer a phone call, and when he returns to his work he has forgotten what he changed. He can ask monotone for details:

     $ monotone diff
     #
     # patch "src/apple.c"
     #  from [2650ffc660dd00a08b659b883b65a060cac7e560]
     #    to [e2c418703c863eabe70f9bde988765406f885fd0]
     #
     --- src/apple.c
     +++ src/apple.c
     @ -1,7 +1,10 @
      #include "jb.h"
     
      void
      dispense_apple_juice()
      {
     -  /* Fill this in please, Abe. */
     +  spoutctl(APPLE_SPOUT, FLOW_JUICE, 1);
     +  while (spoutctl(APPLE_SPOUT, POLL_JUICE, 1) == 0)
     +    usleep (1000);
     +  spoutctl(APPLE_SPOUT, FLOW_JUICE, 0);
      }

Satisfied with his day's work, Abe decides to commit.

     $ monotone commit
     monotone: beginning commit
     monotone: manifest b33cb337dccf21d6673f462d677a6010b60699d1
     monotone: revision 70decb4b31a8227a629c0e364495286c5c75f979
     monotone: branch jp.co.juicebot.jb7

Abe neglected to provide a --message option specifying the change log on the command line and the file MT/log is empty because he did not document his changes there. Monotone therefore invokes an external “log message editor” — typically an editor like vi — with an explanation of the changes being committed and the opportunity to enter a log message.

     polling implementation of src/apple.c
     MT:
     MT: ----------------------------------------------------------------------
     MT: Enter Log.  Lines beginning with `MT:' are removed automatically
     MT:
     MT: new_manifest [b33cb337dccf21d6673f462d677a6010b60699d1]
     MT:
     MT: old_revision [2e24d49a48adf9acf3a1b6391a080008cbef9c21]
     MT: old_manifest [2098eddbe833046174de28172a813150a6cbda7b]
     MT:
     MT: patch "src/apple.c"
     MT: from [2650ffc660dd00a08b659b883b65a060cac7e560]
     MT:   to [e2c418703c863eabe70f9bde988765406f885fd0]
     MT:
     MT: ----------------------------------------------------------------------
     MT:

Abe enters a single line above the explanatory message, saying “polling implementation of src/apple.c”. He then saves the file and quits the editor. Monotone deletes all the lines beginning with “MT:” and leaves only Abe's short message. Returning to the shell, Abe's commit completes:

     monotone: committed revision 70decb4b31a8227a629c0e364495286c5c75f979

Abe then sends his new revision back to Jim:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: including branch jp.co.juicebot.jb7
     monotone: [keys: 2] [rcerts: 8]
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 630] [bytes out: 2844]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

Beth does a similar sequence. First she syncs her database with Jim's:

     monotone --db=beth.db sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 3200] [bytes out: 673]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

She checks out a copy of the tree from her database:

     $ monotone --db=beth.db --branch=jp.co.juicebot.jb7 checkout .

She edits the file src/banana.c:

     $ vi src/banana.c
     <Beth writes some banana-juice dispensing code>

and logs her changes in MT/log right away so she does not forget what she has done like Abe.

     $ vi MT/log
     * src/banana.c: Added polling implementation

and logs her changes in MT/log right away so she does not forget what she has done:

     $ vi MT/log
     * src/banana.c: Added polling implementation

Later, she commits her work. Monotone again invokes an external editor for her to edit her log message, but this time it fills in the messages she's written so far, and she simply checks them over one last time before finishing her commit:

     $ monotone commit
     monotone: beginning commit
     monotone: manifest eaebc3c558d9e30db6616ef543595a5a64cc6d5f
     monotone: revision 80ef9c9d251d39074d37e72abf4897e0bbae1cfb
     monotone: branch jp.co.juicebot.jb7
     monotone: committed revision 80ef9c9d251d39074d37e72abf4897e0bbae1cfb

And she syncs with Jim again:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: including branch jp.co.juicebot.jb7
     monotone: [keys: 3] [rcerts: 12]
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 630] [bytes out: 2844]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

2.10 Dealing with a Fork

Careful readers will note that, in the previous section, the JuiceBot company's work was perfectly serialized:

  1. Jim did some work
  2. Abe synced with Jim
  3. Abe did some work
  4. Abe synced with Jim
  5. Beth synced with Jim
  6. Beth did some work
  7. Beth synced with Jim

The result of this ordering is that Jim's work entirely preceeded Abe's work, which entirely preceeded Beth's work. Moreover, each worker was fully informed of the “up-stream” worker's actions, and produced purely derivative, “down-stream” work:

  1. Jim made revision 2e24d...
  2. Abe changed revision 2e24d... into revision 70dec...
  3. Beth derived revision 70dec... into revision 80ef9...

This is a simple, but sadly unrealistic, ordering of events. In real companies or work groups, people often work in parallel, diverging from commonly known revisions and merging their work together, sometime after each unit of work is complete.

Monotone supports this diverge/merge style of operation naturally; any time two revisions diverge from a common parent revision, we say that the revision graph has a fork in it. Forks can happen at any time, and require no coordination between workers. In fact any interleaving of the previous events would work equally well; with one exception: if forks were produced, someone would eventually have to run the merge command, and possibly resolve any conflicts in the fork.

To illustrate this, we return to our workers Beth and Abe. Suppose Jim sends out an email saying that the current polling juice dispensers use too much CPU time, and must be rewritten to use the JuiceBot's interrupt system. Beth wakes up first and begins working immediately, basing her work off the revision 80ef9... which is currently in her working copy:

     $ vi src/banana.c
     <Beth changes her banana-juice dispenser to use interrupts>

Beth finishes and examines her changes:

     $ monotone diff
     #
     # patch "src/banana.c"
     #  from [7381d6b3adfddaf16dc0fdb05e0f2d1873e3132a]
     #    to [5e6622cf5c8805bcbd50921ce7db86dad40f2ec6]
     #
     --- src/banana.c
     +++ src/banana.c
     @ -1,10 +1,15 @
      #include "jb.h"
     
     +static void
     +shut_off_banana()
     +{
     +  spoutctl(BANANA_SPOUT, SET_INTR, 0);
     +  spoutctl(BANANA_SPOUT, FLOW_JUICE, 0);
     +}
     +
      void
     -dispense_banana_juice()
     +dispense_banana_juice()
      {
     +  spoutctl(BANANA_SPOUT, SET_INTR, &shut_off_banana);
        spoutctl(BANANA_SPOUT, FLOW_JUICE, 1);
     -  while (spoutctl(BANANA_SPOUT, POLL_JUICE, 1) == 0)
     -    usleep (1000);
     -  spoutctl(BANANA_SPOUT, FLOW_JUICE, 0);
      }

She commits her work:

     $ monotone commit --message='interrupt implementation of src/banana.c'
     monotone: beginning commit
     monotone: manifest de81e46acb24b2950effb18572d5166f83af3881
     monotone: revision 8b41b5399a564494993063287a737d26ede3dee4
     monotone: branch jp.co.juicebot.jb7
     monotone: committed revision 8b41b5399a564494993063287a737d26ede3dee4

And she syncs with Jim:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7

Unfortunately, before Beth managed to sync with Jim, Abe had woken up and implemented a similar interrupt-based apple juice dispenser, but his working copy is 70dec..., which is still “upstream” of Beth's.

     $ vi apple.c
     <Abe changes his apple-juice dispenser to use interrupts>

Thus when Abe commits, he unknowingly creates a fork:

     $ monotone commit --message='interrupt implementation of src/apple.c'

Abe does not see the fork yet; Abe has not actually seen any of Beth's work yet, because he has not synchronized with Jim. Since he has new work to contribute, however, he now syncs:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7

Now Jim and Abe will be aware of the fork. Jim sees it when he sits down at his desk and asks monotone for the current set of heads of the branch:

     $ monotone heads
     monotone: branch 'jp.co.juicebot.jb7' is currently unmerged:
     39969614e5a14316c7ffefc588771f491c709152 abe@juicebot.co.jp 2004-10-26T02:53:16
     8b41b5399a564494993063287a737d26ede3dee4 beth@juicebot.co.jp 2004-10-26T02:53:15

Clearly there are two heads to the branch: it contains an un-merged fork. Beth will not yet know about the fork, but in this case it doesn't matter: anyone can merge the fork, and since there are no conflicts Jim does so himself:

     $ monotone merge
     monotone: merging with revision 1 / 2
     monotone: [source] 39969614e5a14316c7ffefc588771f491c709152
     monotone: [source] 8b41b5399a564494993063287a737d26ede3dee4
     monotone: common ancestor 70decb4b31a8227a629c0e364495286c5c75f979 found
     monotone: trying 3-way merge
     monotone: [merged] da499b9d9465a0e003a4c6b2909102ef98bf4e6d
     monotone: your working copies have not been updated

The output of this command shows Jim that two heads were found, combined via a 3-way merge with their ancestor, and saved to a new revision. This happened automatically, because the changes between the common ancestor and heads did not conflict. If there had been a conflict, monotone would have invoked an external merging tool to help resolve it.

After merging, the branch has a single head again, and Jim updates his working copy.

     $ monotone update
     monotone: selected update target da499b9d9465a0e003a4c6b2909102ef98bf4e6d
     monotone: updating src/apple.c to f088e24beb43ab1468d7243e36ce214a559bdc96
     monotone: updating src/banana.c to 5e6622cf5c8805bcbd50921ce7db86dad40f2ec6
     monotone: updated to base revision da499b9d9465a0e003a4c6b2909102ef98bf4e6d

The update command selected an update target — in this case the newly merged head — and performed an in-memory merge between Jim's working copy and the chosen target. The result was then written to Jim's working copy. If Jim's working copy had any uncommitted changes in it, they would have been merged with the update in exactly the same manner as the merge of multiple committed heads.

Monotone makes very little distinction between a “pre-commit” merge (an update) and a “post-commit” merge. Both sorts of merge use the exact same algorithm. The major difference concerns the recoverability of the pre-merge state: if you commit your work first, and merge after committing, the merge can fail (due to difficulty in a manual merge step) and your committed state is still safe. It is therefore recommended that you commit your work first, before merging.

3 Advanced Uses

This chapter covers slightly less common aspects of using monotone. Some users of monotone will find these helpful, though possibly not all. We assume that you have read through the taxonomy and tutorial, and possibly spent some time playing with the program to familiarize yourself with its operation.

3.1 Selectors

Revisions can be specified on the monotone command line, precisely, by entering the entire 40-character hexadecimal sha1 code. This can be cumbersome, so monotone also allows a more general syntax called “selectors” which is less precise but more “human friendly”. Any command which expects a precise revision ID can also accept a selector in its place; in fact a revision ID is just a special type of selector which is very precise.

Simple examples

Some selector examples are helpful in clarifying the idea:

a432
Revision IDs beginning with the string a432
graydon@pobox.com/2004-04
Revisions written by graydon@pobox.com in April 2004.
'jrh@example.org/2 weeks ago'
Revisions written by jrh@example.org 2 weeks ago.
graydon/net.venge.monotone.win32/yesterday
Revisions in the net.venge.monotone.win32 branch, written by graydon, yesterday.

A moment's examination reveals that these specifications are “fuzzy” and indeed may return multiple values, or may be ambiguous. When ambiguity arises, monotone will inform you that more detail is required, and list various possibilities. The precise specification of selectors follows.

Selectors in detail

A selector is a combination of a selector type, which is a single ASCII character, followed by a : character and a selector value. The value is matched against identifiers or certs, depending on its type, in an attempt to match a single revision. Selectors are matched as prefixes. The current set of selection types are:

Author selection
Uses selector type a. For example, a:graydon matches author certs where the cert value begins with graydon.
Branch selection
Uses selector type b. For example, b:net.venge matches branch certs where the cert value begins with net.venge.
Date selection
Uses selector type d. For example, d:2004-04 matches date certs where the cert value begins with 2004-04.
Identifier selection
Uses selector type i. For example, i:0f3a matches revision IDs which begin with 0f3a.
Tag selection
Uses selector type t. For example, t:monotone-0.11 matches tag certs where the cert value begins with monotone-0.11.

Further selector types may be added in the future.

Composite selectors

Selectors may be combined with the / character. The combination acts as database intersection (or logical and). For example, the selector a:graydon/d:2004-04 can be used to select a revision which has an author cert beginning with graydon as well as a date cert beginning with 2004-04.

Selector expansion

Before selectors are passed to the database, they are expanded using a lua hook: expand_selector. The default definition of this hook attempts to guess a number of common forms for selection, allowing you to omit selector types in many cases. For example, the hook guesses that the typeless selector jrh@example.org is an author selector, due to its syntactic form, so modifies it to read a:jrh@example.org. This hook will generally assign a selector type to values which “look like” partial hex strings, email addresses, branch names, or date specifications. For the complete source code of the hook, see Hook Reference.

Typeless selection

If, after expansion, a selector still has no type, it is matched as a special “unknown” selector type, which will match either a tag, an author, or a branch. This costs slightly more database access, but often permits simple selection using an author's login name and a date. For example, the selector graydon/net.venge.monotone.win32/yesterday would pass through the selector graydon as an unknown selector; so long as there are no branches or tags beginning with the string graydon this is just as effective as specifying a:graydon.

3.2 Restrictions

Several monotone commands accept optional pathname... arguments in order to establish a “restriction”. Restrictions are used to limit the files and directories these commands examine for changes when comparing the working copy to the revision it is based on. Restricting a command to a specified set of files or directories simply ignores changes to files or directories not included by the restriction.

The following commands all support restrictions using optional pathname... arguments:

Including either the old or new name of a renamed file or directory will cause both names to be included in a restriction. If in doubt, the status command can be used to “test” a set of pathnames to ensure that the expected files are included or excluded by a restriction.

One variant of the diff command takes two --revision options and does not operate on a working copy, but instead compares two arbitrary database revisions. In this form the diff command does not currently support a restriction or optional pathname... arguments. This may be changed in the future.

The update command does not allow for updates to a restricted set of files, which may be slightly different than other version control systems. Partial updates don't really make sense in monotone, as they would leave the working copy based on a revision that doesn't exist in the database, starting an entirely new line of development.

Subdirectory restrictions

The restrictions facility also allows commands to operate from within a subdirectory of the working copy. By default, the entire working copy is always examined for changes. However, specifying an explicit "." pathname to a command will restrict it to the current subdirectory. Note that this is quite different from other version control systems and may seem somewhat surprising.

The expectation is that requiring a single "." to restrict to the current subdirectory should be simple to use. While the alternative, defaulting to restricting to the current subdirectory, would require a somewhat complicated ../../.. sequence to remove the restriction and operate on the whole tree.

This default was chosen because monotone versions whole project trees and generally expects to commit all changes in the working copy as a single atomic unit. Other version control systems often version individual files or directories and may not support atomic commits at all.

When working from within a subdirectory of the working copy all paths specified to monotone commands must be relative to the current subdirectory.

Finding a working copy

Monotone only stores a single MT directory at the root of a working copy. Because of this, a search is done to find the MT directory in case a command is executed from within a subdirectory of a working copy. Before a command is executed, the search for a working copy directory is done by traversing parent directories until an MT directory is found or the filesystem root is reached. Upon finding an MT directory, the MT/options file is read for default options. The --root option may be used to stop the search early, before reaching the root of the physical filesystem.

Many monotone commands don't require a working copy and will simply proceed with no default options if no MT directory is found. However, some monotone commands do require a working copy and will fail if no MT directory can be found.

The checkout and setup commands create a new working copy and initialize a new MT/options file based on their current option settings.

3.3 Scripting

People often want to write programs that call monotone — for example, to create a graphical interface to monotone's functionality, or to automate some task. For most programs, if you want to do this sort of thing, you just call the command line interface, and do some sort of parsing of the output. Monotone's output, however, is designed for humans: it's localized, it tries to prompt the user with helpful information depending on their request, if it detects that something unusual is happening it may give different output in an attempt to make this clear to the user, and so on. As a result, it is not particularly suitable for programs to parse.

Rather than trying to design output to work for both humans and computers, and serving neither audience well, we elected to create a separate interface to make programmatically extracting information from monotone easier. The command line interface has a command automate; this command has subcommands that print various sorts of information on standard output, in simple, consistent, and easily parseable form.

For details of this interface, see Automation.

3.4 Quality Assurance

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 branch cert.

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 update command, monotone searches the subgraph consisting of descendants of the base revision of the current working copy, 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:

The evaluation of trust is done on a cert-by-cert basis by calling a set of lua hooks: get_revision_cert_trust, get_manifest_cert_trust and get_file_cert_trust. These hooks are 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. This hook is called when selecting update candidates, and is passed a pair of tables describing the 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 working copy.

For details on these hooks, see the Hook Reference.

3.5 Vars

Every monotone database has a set of vars associated with it. Vars are simple configuration variables that monotone refers to in some circumstances; they are used for configuration that monotone needs to be able to modify itself, and that should be per-database (rather than per-user or per-working copy, both of which are supported by monotonerc scripts). Vars are local to a database, and never transferred by netsync.

A var is a name = value pairing inside a domain. Domains define what the vars inside it are used for; for instance, one domain might contain database-global settings, and particular vars inside it would define things like that database's default netsync server. Another domain might contain key fingerprints for servers that monotone has interacted with in the past, to detect man-in-the-middle attacks; the vars inside this domain would map server names to their fingerprints.

You can set vars with the set command, delete them with the unset command, and see them with the ls vars command. See the documentation for these specific commands for more details.

Existing vars

There are several pre-defined domains that monotone knows about:

database
Contains database-global configuration information. Defined names are:
default-server
The default server for netsync operations to use. Automatically set by first use of netsync.
default-collection
The default collection for netsync operations to use. Automatically set by first use of netsync.

known-servers
Contains key hashes for servers that we have netsynced with in the past. Analogous to ssh's known_hosts file, this is needed to detect man-in-the-middle attacks. Automatically set the first time you netsync with any given server. If that server's key later changes, monotone will notice, and refuse to connect until you have run monotone unset known-servers server-name.

3.6 Reserved Files

A monotone working copy consists of control files and non-control files. Each type of file can be versioned or non-versioned. These classifications lead to four groups of files:

Control files contain special content formatted for use by monotone. Versioned files are recorded in a monotone database and have their state tracked as they are modified.

If a control file is versioned, it is considered part of the state of the working copy, and will be recorded as a manifest entry. If a control file is not versioned, it is used to manage the state of the working copy, but it not considered an intrinsic part of it.

Most files you manage with monotone will be versioned non-control files. For example, if you keep source code or documents in a monotone database, they are versioned non-control files. Non-versioned, non-control files in your working copy are generally temporary or junk files, such as backups made by editors or object files made by compilers. Such files are ignored by monotone.

Identifying control files

Control files are identified by their names. Non-control files can have any name except the names reserved for control files. The names of control files follow a regular pattern:

Versioned control files
Any file name beginning with .mt-
Non-versioned control files
Any file in the directory MT/

Existing control files

The following control files are currently used. More control files may be added in the future, but they will follow the patterns given above.

.mt-attrs
Contains versioned attributes of files, associated with the files' pathnames.
MT/revision
Contains the identity of the “base” revision of the working copy. Each working copy has a base revision. When the working copy is committed, the base revision is considered to be the ancestor of the committed revision.
MT/options
Contains “sticky” command-line options such as --db or --branch, such that you do not need to enter them repeatedly after checking out a particular working copy.
MT/work
Contains a list of additions, deletions, and renames which have occurred in the current working copy, relative to the base version.
MT/log
Contains log messages to append to the “changelog” cert upon commit. The user may add content to this file while they work. Upon a successful commit monotone will empty the file making it ready for the next edit/commit cycle.
MT/debug
If monotone detects a bug in itself or crashes, then before exiting it dumps a log of its recent activity to this file, to aid in debugging.

3.7 Reserved Certs

Every certificate has a name. Some names have meaning which is built in to monotone, others may be used for customization by a particular user, site, or community. If you wish to define custom certificates, you should prefix such certificate names with x-. For example, if you want to make a certificate describing the existence of security vulnerabilities in a revision, you might wish to create a certificate called x-vulnerability. Monotone reserves all names which do not begin with x- for possible internal use. If an x- certificate becomes widely used, monotone will likely adopt it as a reserved cert name and standardize its semantics.

Most reserved certificate names have no meaning yet; some do. Usually monotone is also responsible for generating these certificates, so you should generally have no cause to make them yourself. They are described here to help you understand monotone's operation.

The pre-defined, reserved certificate names are:

author
This cert's value is the name of a person who committed the revision the cert is attached to. The cert is generated when you commit a revision. It is displayed by the log command.
branch
This cert's value is the name of a branch. A branch cert associates a revision with a branch. The revision is said to be “in the branch” named by the cert. The cert is generated when you commit a revision, either directly with the commit command or indirectly with the merge or propagate commands. The branch certs are read and directly interpreted by many monotone commands, and play a fundamental role in organizing work in any monotone database.
changelog
This cert's value is the change log message you provide when you commit a revision. It is displayed by the log command.
comment
This cert's value is an additional comment, usually provided after committing, about a revision. Certs with the name comment can be applied to files as well, and will be shown by the log command.
date
This cert's value is an ISO date string indicating the time at which a revision was committed. It is displayed by the log command, and may be used as an additional heuristic or selection criterion in other commands in the future.
tag
This cert's value is a symbolic name given to a revision, which may be used in the future as a way of selecting versions for checkout.
testresult
This cert's value is interpreted as a boolean string, either 0 or 1. It is generated by the testresult command and represents the results of running a particular test on the underlying revision. Typically you will make a separate signing key for each test you intend to run on revisions. This cert influences the update algorithm.

3.8 Naming Conventions

Some names in monotone are private to your work, such as filenames. Other names are potentially visible outside your project, such as rsa key identifiers or branch names. It is possible that if you choose such names carelessly, you will choose a name which someone else in the world is using, and subsequently you may cause confusion when your work and theirs is received simultaneously by some third party.

We therefore recommend two naming conventions:

3.9 File Attributes

Monotone contains a mechanism for storing persistent file attributes. These differ from file certificates in an important way: attributes are associated with a path name in your working copy, rather than a particular version of a file. Otherwise they are similar: a file attribute associates a simple name/value pair with a file in your working copy.

The attribute mechanism is motivated by the fact that some people like to store executable programs in version control systems, and would like the programs to remain executable when they check out a working copy. For example, the configure shell script commonly shipped with many programs should be executable.

Similarly, some people would like to store devices, symbolic links, read-only files, and all manner of extra attributes of a file, not directly related to a file's data content.

Rather than try to extend the manifest file format to accommodate attributes, monotone requires that you place your attributes in a specially named file in the root of your working copy. The file is called .mt-attrs, and it has a simple stanza-based format, for example:

     file "analyze_coverage"
     execute "true"
     
     file "autogen.sh"
     execute "true"
     otherattr "bob"

Each stanze of the .mt-attrs file assigns attributes to a file in your working copy. The first line of each stanza is file followed by the quoted name of the file you want to assign attributes to. Each subsequent line is the name of an attribute, followed by a quoted value for that attribute. Stanzas are separated by blank lines.

As a convenience, you can use the monotone attr command to set and view the values of these attributes; see Working Copy.

You can tell monotone to automatically take actions based on these attributes by defining hooks; see the attr_functions entry in Hook Reference.

Every time your working copy is written to, monotone will look for the .mt-attrs file, and if it exists, run the corresponding hooks registered for each attribute found in the file. This way, you can extend the vocabulary of attributes understood by monotone simply by writing new hooks.

Aside from its special interpretation, the .mt-attrs file is a normal text file. If you want other people to see your attributes, you should add and commit the .mt-attrs file in your working copy. If you make changes to it which conflict with changes other people make, you will have to resolve those conflicts, as plain text, just as with any other text file in your working copy.

3.10 Migrating and Dumping

While the state of your database is logically captured in terms of a packet stream, it is sometimes necessary or desirable (especially while monotone is still in active development) to modify the SQL table layout or storage parameters of your version database, or to make backup copies of your database in plain text. These issues are not properly addressed by generating packet streams: instead, you must use migration or dumping commands.

The monotone db migrate command is used to alter the SQL schema of a database. The schema of a monotone database is identified by a special hash of its generating SQL, which is stored in the database's auxiliary tables. Each version of monotone knows which schema version it is able to work with, and it will refuse to operate on databases with different schemas. When you run the migrate command, monotone looks in an internal list of SQL logic which can be used to perform in-place upgrades. It applies entries from this list, in order, attempting to change the database it has into the database it wants. Each step of this migration is checked to ensure no errors occurred and the resulting schema hashes to the intended value. The migration is attempted inside a transaction, so if it fails — for example if the result of migration hashes to an unexpected value — the migration is aborted.

If more drastic changes to the underlying database are made, such as changing the page size of sqlite, or if you simply want to keep a plain text version of your database on hand, the monotone db dump command can produce a plain ASCII SQL statement which generates the state of your database. This dump can later be reloaded using the monotone db load command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

3.11 Importing from CVS

Monotone is capable of reading CVS files directly and importing them into a database. This feature is still somewhat immature, but moderately large “real world” CVS trees on the order of 1GB have successfully been imported.

Note however that the machine requirements for CVS trees of this size are not trivial: it can take several hours on a modern system to reconstruct the history of such a tree and calculate the millions of cryptographic certificates involved. We recommend experimenting with smaller trees first, to get a feel for the import process.

We will assume certain values for this example which will differ in your case:

Accounting for these differences at your site, the following is an example procedure for importing a CVS repository “from scratch”, and checking the resulting head version of the import out into a working copy:

     $ monotone --db=test.db db init
     $ monotone --db=test.db genkey import@example.net
     $ monotone --db=test.db --branch=net.example.wobbler cvs_import /usr/local/cvsroot
     $ monotone --db=test.db --branch=net.example.wobbler checkout wobber-checkout

4 CVS Phrasebook

This chapter translates common CVS commands into monotone commands. It is an easy alternative to reading through the complete command reference.

Checking Out a Tree

     $ CVSROOT=:pserver:cvs.foo.com/wobbler
     $ cvs -d $CVSROOT checkout -r 1.2

     $ monotone pull www.foo.com com.foo.wobbler
     $ monotone checkout fe37 wobbler


The CVS command contacts a network server, retrieves a revision, and stores it in your working copy. There are two cosmetic differences with the monotone command: remote databases are specified by hostnames and collections, and revisions are denoted by sha1 values (or selectors).

There is also one deep difference: pulling revisions into your database is a separate step from checking out a single revision; after you have pulled from a network server, your database will contain several revisions, possibly the entire history of a project. Checking out is a separate step, after communication, which only copies a particular revision out of your database and into a named directory.

Committing Changes

     $ cvs commit -m 'log message'

     $ monotone commit --message='log message'
     $ monotone push www.foo.com com.foo.wobbler


As with other networking commands, the communication step with monotone is explicit: committing changes only saves them to the local database. A separate command, push, sends the changes to a remote database.

Incorporating New Changes

     $ cvs update -d

     $ monotone pull www.foo.com com.foo.wobbler
     $ monotone merge
     $ monotone update


This command, like other networking commands, involves a separate communication step with monotone. The extra command, merge, ensures that the branch your are working on has a unique head. You can omit the merge step if you only want update to examine descendants of your base revision, and ignore other heads on your branch.

Moving Working Copy to Another Revision

     $ cvs update -r FOO_TAG -d

     $ monotone update 830ac1a5f033825ab364f911608ec294fe37f7bc
     $ monotone update t:FOO_TAG


With a revision parameter, the update command operates similarly in monotone and CVS. One difference is that a subsequent commit will be based off the chosen revision in monotone, while a commit in the CVS case is not possible without going back to the branch head again. This version of update can thus be very useful if, for example, you discover that the tree you are working against is somehow broken — you can update to an older non-broken version, and continue to work normally while waiting for the tree to be fixed.

Viewing Differences

     $ cvs diff

     $ monotone diff


     $ cvs diff -r 1.2 -r 1.4

     $ monotone diff 3e7db 278df


Monotone's diff command is modeled on that of CVS, so the main features are the same: diff alone prints the differences between your working copy and its base revision, whereas diff accompanied by two revision numbers prints the difference between those two revisions. The major difference between CVS and monotone here is that monotone's revision numbers are revision IDs, so the diff command prints the difference between the two entire trees.

Showing Working Copy Status

     $ cvs status

     $ monotone status


This command operates similarly in monotone and CVS. The only major difference is that monotone's status command always gives a status of the whole tree, and outputs a more compact summary than CVS.

Adding Directories and Files to Working Copy

     $ cvs add dir
     $ cvs add dir/subdir
     $ cvs add dir/subdir/file.txt

     $ monotone add dir/subdir/file.txt


Monotone does not explicitly store directories, so adding a file only involves adding the file's complete path, including any directories. Directories are created as needed, and empty directories are ignored.

Removing Directories and Files from Working Copy

     $ rm file.txt
     $ cvs remove file.txt

     $ monotone drop file.txt


Monotone does not require that you erase a file from the working copy before you drop it. Dropping a file merely removes its entry in the manifest of the current revision.

Initializing a Repository

     $ cvs init -d /path/to/repository

     $ monotone db init --db=/path/to/database.db


Monotone's “repository” is a single-file database, which is created and initialized by this command. This file is only ever used by you, and does not need to be in any special location, or readable by other users.

5 Command Reference

Monotone has a large number of commands. To help navigate through them all, commands are grouped into logical categories.

5.1 Tree

monotone cat file id
monotone cat file rid path
monotone cat manifest
monotone cat manifest id
monotone cat revision
monotone cat revision id
These commands write the contents of a specific file, manifest or revision id to standard output, or the contents of the file path as it was at revision rid. They are useful if you wish to inspect a version without checking it out into your working copy. An unspecified manifest or revision id is allowed from within a working copy and refers to the current manifest or revision.
monotone checkout id directory
monotone co id directory
monotone --branch=branchname checkout directory
monotone --branch=branchname co directory
These commands copy a revision id out of your database, writing the string id into the file directory/MT/revision. These commands then copy every file version listed in the revision's manifest to paths under directory. For example, if the revision's manifest contains these entries:
          84e2c30a2571bd627918deee1e6613d34e64a29e  Makefile
          c61af2e67eb9b81e46357bb3c409a9a53a7cdfc6  include/hello.h
          97dfc6fd4f486df95868d85b4b81197014ae2a84  src/hello.c
     

Then the following files are created:

          directory/Makefile
          directory/include/hello.h
          directory/src/hello.c
     

If you wish to checkout in the current directory, you can supply the special name . (a single period) for directory.

If no id is provided, as in the latter two commands, you must provide a branchname; monotone will attempt to infer id as the unique head of branchname if it exists.

monotone disapprove id
This command records a disapproval of the changes between id's ancestor and id. It does this by committing the inverse changes as a new revision descending from id. The new revision will show up as a new head and thus a subsequent merge will incorporate the inverse of the disapproved changes in the other head(s).

Note that this command only works if id has exactly one ancestor.

monotone heads --branch=branchname
This command lists the “heads” of branchname.

The “heads” of a branch is the set of revisions which are members of the branch, but which have no descendants. These revisions are generally the “newest” revisions committed by you or your colleagues, at least in terms of ancestry. The heads of a branch may not be the newest revisions, in terms of time, but synchronization of computer clocks is not reliable, so monotone usually ignores time.

monotone merge --branch=branchname
This command merges the “heads” of branchname, if there are multiple heads, and commits the results to the database, marking the resulting merged revision as a member of branchname. The merged revision will contain each of the head revision IDs as ancestors.

Merging is performed by repeated pairwise merges: two heads are selected, then their least common ancestor is located in the ancestry graph and these 3 revisions are provided to the built-in 3-way merge algorithm. The process then repeats for each additional head, using the result of each previous merge as an input to the next.

monotone propagate sourcebranch destbranch
This command takes a unique head from sourcebranch and merges it with a unique head of destbranch, using the least common ancestor of the two heads for a 3-way merge. The resulting revision is committed to destbranch. If either sourcebranch or destbranch has multiple heads, propagate aborts, doing nothing.

The purpose of propagate is to copy all the changes on sourcebranch, since the last propagate, to destbranch. This command supports the idea of making separate branches for medium-length development activities, such as maintenance branches for stable software releases, trivial bug fix branches, public contribution branches, or branches devoted to the development of a single module within a larger project.

monotone explicit_merge id id destbranch
monotone explicit_merge id id ancestor destbranch
This command merges exactly the two ids you give it, and places the result in branch destbranch. It is useful when you need more control over the merging process than propagate or merge give you. For instance, if you have a branch with three heads, and you only want to merge two of them, you can use this command. Or if you have a branch with two heads, and you want to propagate one of them to another branch, again, you can use this command. If the optional ancestor argument is given, the merge uses that revision as the common ancestor instead of the default ancestor.

5.2 Working Copy

monotone add pathname...
This command places “add” entries for the paths specified in pathname... in the working copy's “work list”. The work list of your working copy is located at MT/work, and is a list of explicit pathname changes you wish to commit at some future time, such as addition, removal or renaming of files.

While this command places an “add” entry on your work list, it does not immediately affect your database. When you commit your working copy, monotone will use the work list to build a new revision, which it will then commit to the database. The new revision will have any added entries inserted in its manifest.

monotone drop pathname...
This command places “drop” entries for the paths specified in pathname... in the working copy's “work list”. The work list of your working copy is located at MT/work, and is a list of explicit pathname changes you wish to commit at some future time, such as addition, removal, or renaming of files.

While this command places a “drop” entry on your work list, it does not immediately affect your database. When you commit your working copy, monotone will use the work list to build a new revision, which it will then commit to the database. The new revision will have any dropped entries removed from its manifest.

monotone rename src dst
This command places “rename” entries for the paths specified in src and dst in the working copy's “work list”. The work list of your working copy is located at MT/work, and is a list of explicit pathname changes you wish to commit at some future time, such as addition, removal, or renaming of files.

While this command places a “rename” entry on your work list, it does not immediately affect your database. When you commit your working copy, monotone will use the work list to build a new revision, which it will then commit to the database. The new revision will have any renamed entries in its manifest adjusted to their new names.

monotone commit
monotone commit --message=logmsg
monotone commit pathname...
monotone commit --message=logmsg pathname...
This command looks at your working copy, decides which files have changed, and saves the changes to your database. It does this by loading the revision named in the MT/revision file, locating the base manifest for your working copy, applying any changes described in the MT/work file, and then comparing the updated base manifest to the files it finds in your working copy, to determine which files have been edited.

For each edited file, a delta is copied into the database. Then the newly constructed manifest is recorded (as a delta) and finally the new revision. Once all these objects are recorded in you database, commit overwrites the MT/revision file with the new revision ID, and deletes the MT/work file.

Specifying pathnames to commit restricts the set of changes that are visible and results in only a partial commit of the working copy. Changes to files not included in the specified set of pathnames will be ignored and will remain in the working copy until they are included in a future commit. With a partial commit, only the relevant entries in the MT/work file will be removed and other entries will remain for future commits.

From within a subdirectory of the working copy the commit command will, by default, include all changes in the working copy. Specifying only the pathname "." will restrict commit to files changed within the current subdirectory of the working copy.

The MT/log file can be edited by the user during their daily work to record the changes made to the working copy. When running the commit command without a logmsg supplied, the contents of the MT/log file will be read and passed to the Lua hook edit_comment as a second parameter named user_log_content. If the commit is successful, the MT/log file is cleared of all content making it ready for another edit/commit cycle.

The commit command also synthesizes a number of certificates, which it attaches to the new manifest version and copies into your database:


monotone revert
monotone revert pathname...
With no files given, this command changes your working copy, so that changes you have made since the last checkout or update are discarded. It does this by changing every file listed in the working copy's base manifest to have contents equal to the sha1 value listed in the manifest, and by erasing the MT/work file.

If files or directories are given as arguments, only those files and directories are affected instead of the entirety of your working copy.

From within a subdirectory of the working copy the revert command will, by default, revert all changes in the working copy. Specifying only the pathname "." will restrict revert to files changed within the current subdirectory of the working copy. Caution should be used when reverting files to ensure that the correct set of files is reverted.

monotone update
monotone update revision
Without a revision argument, this command incorporates “recent” changes found in your database into your working copy. It does this by performing 3 separate stages. If any of these stages fails, the update aborts, doing nothing. The stages are:

With an explicit revision argument, the command uses that revision as the update target instead of finding an acceptable candidate.

The effect is always to take whatever changes you have made in the working copy, and to “transpose” them onto a new revision, using monotone's 3-way merge algorithm to achieve good results. Note that with the explicit revision argument, it is possible to update “backwards” or “sideways” in history — for example, reverting to an earlier revision, or if your branch has two heads, updating to the other. In all cases, the end result will be whatever revision you specified, with your local changes (and only your local changes) applied.

5.3 Network

monotone serve address collection
monotone pull [address [collection]]
monotone push [address [collection]]
monotone sync [address [collection]]
These commands operate the “netsync” protocol built into monotone. This is a custom protocol for rapidly synchronizing two monotone databases using a hash tree index. The protocol is “peer to peer”, but requires one peer to listen for incoming connections (the server) and the other peer (the client) to connect to the server.

The network address specified in each case should be the same: a host name to listen on, or connect to, optionally followed by a colon and a port number. The collection parameter indicates a set of branches to exchange; every branch for which collection is a prefix will be indexed and made available for synchronization.

For example, supposing Bob and Alice wish to synchronize their net.venge.monotone.win32 and net.venge.monotone.i18n branches. Supposing Alice's computer has hostname alice.someisp.com, then Alice might run:

          $ monotone serve alice.someisp.com net.venge.monotone
     

And Bob might run

          $ monotone sync alice.someisp.com net.venge.monotone
     

When the operation completes, all branches beginning with net.venge.monotone will be synchronized between Alice and Bob's databases.

The pull, push, and sync commands only require you pass address and collection the first time you use one of them; monotone will memorize this use and in the future default to the same server and collection. For instance, if Bob wants to sync with Alice again, he can simply run:

          $ monotone sync
     

Of course, he can still sync with other people and other branches by passing an address or address plus collection on the command line; this will not affect his default affinity for Alice. If you ever do want to change your defaults, use monotone unset database default-server or monotone unset database default-collection; these will clear your defaults, and cause them to be reset to the next person you netsync with.

5.4 Informative

monotone status
monotone status pathname...
This command prints a description of the “status” of your working copy. In particular, it prints:

Specifying optional pathname... arguments to the status command restricts the set of changes that are visible and results in only a partial status of the working copy. Changes to files not included in the specified set of pathnames will be ignored.

From within a subdirectory of the working copy the status command will, by default, include all changes in the working copy. Specifying only the pathname "." will restrict status to files changed within the current subdirectory of the working copy.

monotone log
monotone log --depth=n
monotone log id
monotone log --depth=n id
monotone log id file
monotone log --depth=n id file
This command prints out a log, in reverse-ancestry order, of small history summaries. Each summary contains author, date, changelog and comment information associated with a revision. If n is given, at most that many log entries will be given. If id is given, the command starts tracing back through history from the revision id, otherwise it starts from the base revision of your working copy.
monotone complete file partial-id
monotone complete manifest partial-id
monotone complete revision partial-id
These commands print out all known completions of a partial sha1 value, listing completions which are file, manifest or revision IDs depending on which variant is used. For example, suppose you enter this command and get this result:
          $ monotone complete manifest fa36
          fa36deead87811b0e15208da2853c39d2f6ebe90
          fa36b76dd0139177b28b379fe1d56b22342e5306
          fa36965ec190bee14c5afcac235f1b8e2239bb2a
     

Then monotone is telling you that there are 3 manifests it knows about, in its database, which begin with the 4 hex digits fa36. This command is intended to be used by programmable completion systems, such as those in bash and zsh.

monotone diff
monotone diff pathname...
monotone diff --revision=id
monotone diff --revision=id pathname...
monotone diff --revision=id1 --revision=id2
These commands print out GNU “unified diff format” textual difference listings between various manifest versions. With no --revision options, diff will print the differences between the base revision and the current revision in the working copy.

With one --revision option, diff will print the differences between the revision id and the current revision in the working copy. With two --revision options diff will print the differences between revisions id1 and id2, ignoring any working copy. Note that no pathname... arguments may be specified to restrict the diff output in this case. Restrictions may only be applied to the current, in-progress, working copy revision.

In all cases, monotone will print a textual summary – identical to the summary presented by monotone status – of the logical differences between revisions in lines proceeding the diff. These lines begin with a single hash mark #, and should be ignored by a program processing the diff, such as patch.

Specifying pathnames to the diff command restricts the set of changes that are visible and results in only a partial diff of the working copy. Changes to files not included in the specified set of pathnames will be ignored.

From within a subdirectory of the working copy the diff command will, by default, include all changes in the working copy. Specifying only the pathname "." will restrict diff to files changed within the current subdirectory of the working copy.

monotone list certs id
These commands will print out a list of certificates associated with a particular revision id. Each line of the print out will indicate:

For example, this command lists the certificates associated with a particular version of monotone itself, in the monotone development branch:

          $ ./monotone list certs 4a96
          monotone: expandeding partial id '4a96'
          monotone: expanded to '4a96a230293456baa9c6e7167cafb3c5b52a8e7f'
          -----------------------------------------------------------------
          Key   : graydon@pobox.com
          Sig   : ok
          Name  : author
          Value : graydon@dub.venge.net
          -----------------------------------------------------------------
          Key   : graydon@pobox.com
          Sig   : ok
          Name  : branch
          Value : monotone
          -----------------------------------------------------------------
          Key   : graydon@pobox.com
          Sig   : ok
          Name  : date
          Value : 2003-10-17T03:20:27
          -----------------------------------------------------------------
          Key   : graydon@pobox.com
          Sig   : ok
          Name  : changelog
          Value : 2003-10-16  graydon hoare  <graydon@pobox.com>
                :
                :         * sanity.hh: Add a const version of idx().
                :         * diff_patch.cc: Change to using idx() everywhere.
                :         * cert.cc (find_common_ancestor): Rewrite to recursive
                :         form, stepping over historic merges.
                :         * tests/t_cross.at: New test for merging merges.
                :         * testsuite.at: Call t_cross.at.
                :
     

monotone list keys
monotone list keys pattern
These commands list rsa keys held in your current database. They do not print out any cryptographic information; they simply list the names of public and private keys you have on hand.

If pattern is provided, it is used as a glob to limit the keys listed. Otherwise all keys in your database are listed.

monotone list branches
This command lists all known branches in your database.
monotone list tags
This command lists all known tags in your database.
monotone list vars
monotone list vars domain
This command lists all vars in your database, or all vars within a given domain. See Vars for more information.
monotone list known
monotone list known pathname...
This command lists all files which would become part of the manifest of the next revision if you comitted your working copy at this point.

Specifying pathnames to the list known command restricts the set of paths that are searched for manifest files. Files not included in the specified set of pathnames will not be listed.

From within a subdirectory of the working copy the list known command will, by default, search the entire working copy. Specifying only the pathname "." will restrict the search for unknown files to the current subdirectory of the working copy.

monotone list unknown
monotone list unknown pathname...
This command lists all files in your working copy that monotone is either ignoring or knows nothing about.

Specifying pathnames to the list unknown command restricts the set of paths that are searched for unknown files. Unknown files not included in the specified set of pathnames will not be listed.

From within a subdirectory of the working copy the list unknown command will, by default, search the entire working copy. Specifying only the pathname "." will restrict the search for unknown files to the current subdirectory of the working copy.

monotone list ignored
monotone list ignored pathname...
This command lists all files in your working copy that monotone is intentionally ignoring, due to the results of the ignore_file (filename) hook.

Specifying pathnames to the list ignored command restricts the set of paths that are searched for ignored files. Ignored files not included in the specified set of pathnames will not be listed.

From within a subdirectory of the working copy the list ignored command will, by default, search the entire working copy. Specifying only the pathname "." will restrict the search for ignored files to the current subdirectory of the working copy.

monotone list missing
monotone list missing pathname...
This command lists all files in your working copy's base manifest, which are not present in the working copy.

Specifying pathnames to the list missing command restricts the set of paths that are searched for missing files. Missing files not included in the specified set of pathnames will not be listed.

From within a subdirectory of the working copy the list missing command will, by default, search the entire working copy. Specifying only the pathname "." will restrict the search for missing files to the current subdirectory of the working copy.

5.5 Key and Cert

monotone genkey keyid
This command generates an rsa public/private key pair, using a system random number generator, and stores it in your database under the key name keyid. If the the hook non_blocking_rng_ok() returns true, the key generation will use an unlimited random number generator (such as /dev/urandom), otherwise it will use a higher quality random number generator (such as /dev/random) but might run slightly slower.

The private half of the key is stored in an encrypted form, using the symmetric cipher arc4, so that anyone accidentally reading your database cannot extract your private key and use it. You must provide a passphrase for your key when it is generated, which is used to key the arc4 cipher. In the future you will need to enter this passphrase again each time you sign a certificate, which happens every time you commit to your database. You can tell monotone to automatically use a certain passphrase for a given key using the get_passphrase(keypair_id), but this significantly increases the risk of a key compromise on your local computer. Be careful using this hook.

monotone dropkey keyid
This command drops the public and/or private key. If both exist, both are dropped, if only one exists, it is dropped. This command should be used with caution as changes are irreversible without a backup of the key(s) that were dropped.
monotone chkeypass id
This command lets you change the passphrase of the private half of the key id.
monotone cert id certname
monotone cert id certname certval
These commands create a new certificate with name certname, for a revision with version id. If certval is provided, it is the value of the certificate. Otherwise the certificate value is read from stdin.
monotone trusted id certname certval signers
This command lets you test your revision trust hook get_revision_cert_trust (see Hook Reference). You pass it a revision id, a certificate name, a certificate value, and one or more key ids, and it will tell you whether, under your current settings, Monotone would trust a cert on that revision with that value signed by those keys.

5.6 Certificate

monotone approve id
This command is a synonym for monotone cert id branch branchname where branchname is the current branch name (either deduced from the working copy or from the --branch option).
monotone comment id
monotone comment id comment
These commands are synonyms for monotone cert id comment comment. If comment is not provided, it is read from stdin.
monotone tag id tagname
This command is a synonym for monotone cert id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone allow invalid changesets to be saved in your database. This command is destructive, and you should make a backup copy of your database before running it. It will preserve the contents of each revision, but it will lose rename history. Use it carefully, and only after understanding Rebuilding ancestry. Note that it will make your history incompatible with that of anyone else working on the same project! Read Rebuilding ancestry.
monotone db info --db=dbfile
This command prints information about the monotone database dbfile, including its schema version and various table size statistics.
monotone db version --db=dbfile
This command prints out just the schema version of the monotone database dbfile.
monotone db dump --db=dbfile
This command dumps an SQL statement representing the entire state of dbfile to the standard output stream. It is a very low-level command, and produces the most “recoverable” dumps of your database possible. It is sometimes also useful when migrating databases between variants of the underlying sqlite database format.
monotone db load --db=dbfile
This command applies a raw SQL statement, read from the standard input stream, to the database dbfile. It is most useful when loading a database dumped with the dump command.

Note that when reloading a dumped database, the schema of the dumped database is included in the dump, so you should not try to init your database before a load.

monotone db migrate --db=dbfile
This command attempts to migrate the database dbfile to the newest schema known by the version of monotone you are currently running. If the migration fails, no changes should be made to the database.

If you have important information in your database, you should back up a copy of it before migrating, in case there is an untrapped error during migration.

monotone db check --db=dbfile
Monotone always works hard to verify the data it creates and accesses. For instance, if you have hard drive problems that corrupt data in monotone's database, and you attempt to retrieve this data, then monotone will notice the problem and stop, instead of silently giving you garbage data.

However, it's also nice to notice such problems early, and in rarely used parts of history, while you still have backups. That's what this command is for. It systematically checks the database dbfile to ensure that it is complete and consistent. The following problems are detected:

  • missing files that are referenced by their sha1 hash from some manifest but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding the file with the given hash, and loading it into your database with fload.
  • unreferenced files that exist in the database but are not referenced by their sha1 hash from any existing manifest. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • missing manifests that are referenced by their sha1 hash from some revision but do not exist in the database. This is a serious problem; it means that your history is not fully reconstructible. You can fix it by finding a database containing the manifest, and using mdata on that database to create a manifest data packet, which can be loaded into your database with read.
  • unreferenced manifests that exist in the database but are not referenced by their sha1 hash from any existing revision. In itself, this only indicates some wasted space, and is not a problem; it's possible it could arise under normal use (for instance, in some strange corner cases following an incomplete netsync). It could also arise, though, as a symptom of some other more serious problem.
  • incomplete manifests that exist in the database but contain references to files that do not exist in the database. For diagnosis and solution, see “missing files” above.
  • missing revisions that are referenced by their sha1 hash from some other revision or revision cert but do not exist in the database. This may be a serious problem; it may indicate that your history is not fully reconstructible (if the reference is from another revision) or that someone is creating bogus certs (if the reference is from a cert). You can fix it by finding a database containing the revision, and using rdata on that database to create a revision data packet, which can be loaded into your database with read.
  • incomplete revisions that exist in the database but contain references to missing manifests, incomplete manifests or missing revisions. This always occurs with some more detailed error; see above.
  • revisions with mismatched parents that disagree with the cached revision ancestry on their parent revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with mismatched children that disagree with the cached revision ancestry on their child revisions. This may cause problems in using the database, and suggests the presence of a bug in monotone's caching system, but does not involve data loss.
  • revisions with bad history that exist in the database but fail monotone's normal sanity checks for consistent and correct history. This is a serious problem; it indicates that your history record is somehow malformed. This should not be possible, since monotone carefully checks every revision before storing it into the database, but if it does, then please request assistance on the monotone mailing list. Fixing this generally means you may lose some history — for instance, renames may be degraded into delete/add pairs — but the actual contents of every revision will still be reproducible.
  • revisions with missing certs that exist in the database lacking at least one author, branch, changelog or date cert. All revisions are expected to have at least one of each of these certs. In itself, this is not necessarily a problem, but it is peculiar, and some operations such as netsync may behave strangely.
  • revisions with mismatched certs that exist in the database with differing numbers of author, changelog and date certs. These certs are expected to appear together, as each revision committed should have an author, changelog and date associated with it. In itself, this is not a problem, but it is peculiar. All operations should behave normally.
  • missing keys that have been used to sign certs but do not exist in the database. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.
  • certs with bad signatures that exist in the database with signatures that are invalid. In itself, this is not a problem, except that monotone will ignore any such certs. You may also wish to find out who is creating certs with bad signatures; it may indicate some kind of security attack.
  • certs with unchecked signatures that exist in the database but cannot have their signatures checked because the signing key is missing. In itself, this is not a problem, except that monotone will ignore any certs signed by the missing key. You can fix it by finding a database containing the key in question, and using pubkey on that database to create a public key packet, which can be loaded into your database with read.

This command also verifies that the sha1 of every file, manifest, and revision is correct.

monotone db execute sql-statement
This is a debugging command which executes sql-statement against your database, and prints any results of the expression in a tabular form. It can be used to investigate the state of your database, or help diagnose failures.

5.9 Automation

This section contains subcommands of the monotone automate command, used for scripting monotone. All give output on stdout; they may also give useful chatter on stderr, including warnings and error messages.

monotone automate interface_version
Arguments:
None.
Added in:
0.0
Purpose:
Prints version of the automation interface. Major number increments whenever a backwards incompatible change is made to the automate command; minor number increments whenever any change is made (but is reset when major number increments).
Sample output:
          
          1.2
     

Output format:
A decimal number, followed by “.” (full stop/period), followed by a decimal number, followed by a newline, followed by end-of-file. The first decimal number is the major version, the second is the minor version.
code>id tag tagname.
monotone testresult id 0
monotone testresult id 1
These commands are synonyms for monotone cert id testresult 0 or monotone cert id testresult 1.

5.7 Packet I/O

Monotone can produce and consume data in a convenient, portable form called packets. A packet is a sequence of ASCII text, wrapped at 70-columns and easily sent through email or other transports. If you wish to manually transmit a piece of information – for example a public key – from one monotone database to another, it is often convenient to read and write packets.

Note: earlier versions of monotone queued and replayed packet streams for their networking system. This older networking system is deprecated and will be removed in a future version, as the netsync protocol has several properties which make it advantageous as a communication system. However, the packet i/o facility will remain in monotone as a utility for moving individual data items around manually.

monotone certs id
This command prints out an rcert packet for each cert in your database associated with id. These can be used to transport certificates safely between monotone databases.
monotone fdata id
monotone mdata id
monotone rdata id
These commands print out an fdata, mdata or rdata packet for the file, manifest or revision id in your database. These can be used to transport files, manifests or revisions, in their entirety, safely between monotone databases.
monotone fdelta id1 id2
monotone mdelta id1 id2
These commands print out an fdelta or mdelta packet for the differences between file or manifest versions id1 and id2, in your database. These can be used to transport file or manifest differences safely between monotone databases.
monotone privkey keyid
monotone pubkey keyid
These commands print out an privkey or pubkey packet for the rsa key keyid. These can be used to transport public or private keys safely between monotone databases.
monotone read
This command reads packets from stdin and applies them to your database.

5.8 Database

monotone set domain name value
Associates the value value to name in domain domain. See Vars for more information.
monotone unset domain name
Deletes any value associated with name in domain. See Vars for more information.
monotone db init --db=dbfile
This command initializes a new monotone database at dbfile.
monotone db rebuild --db=dbfile
This command rebuilds the ancestry graph of the monotone database at dbfile, which may become necessary if future bugs in monotone