Table of Contents
pqm is maintained in bzr.
'official' pqm repository location
The idea is simple. You have a project with a number of developers. With a revision control system like CVS, it's obvious that the project code will be kept in a single repository, which all the developers use. You really don't have much of a choice.
But a decentralized version control system (DVCS) allows your developers to commit while disconnected (say while they are travelling with a laptop), easily create their own temporary branches without affecting the main repository, and more. To accomplish these things, each developer needs to have their own repository.
This then raises a question - where is the project? One solution is to pick a specific developer to perform the task of merging in the other developer's code. That developer's repository becomes the canonical one for the project.
However, there is a better way. The main idea of the patch queue manager is to have a special repository which is managed entirely by the patch queue software.
You create a special repository to be managed by the patch queue manager. Then, every developer branches off of it. When a developer has reached a milestone and wants to sync up the main tree with their repository, they submit a merge request.
Essentially, this just leverages merge functionality in the DVCS to perform the actual merge.
One question that arises at this point - what happens if there's a conflict? If two people submit merge requests, the second could conflict with the first. Obviously the patch queue manager is not an AI; it can't automatically resolve all conflicts. So the simple solution is to just to inform the submitter of the second patch of this fact, and reject the merge request. They can then sync up their tree with the main branch, and resubmit the merge request.
However, textual conflicts aren't the only kind of conflict; you could also have _semantic_ conflicts, where the patches don't touch the exact same portion of code, but taken together they break it. One way to help solve this problem is to run a testsuite before every commit to the main repository. In addition to any functionality built into the DVCS, the patch queue manager lets you do this with a precommit hook. You can actually do pretty much anything you want inside this hook.
You have two choices for submitting merge requests; one option is to send them via email. pqm supports GPG-signed messages for security.
If it can be arranged for developers to all have write access to the same filesystem (via NFS/SFS, over sftp, etc), then you can have them simply drop merge requests into a special queue directory.
Python 2.3 (or Python 2.2 and the python-logging module)
GNUPG (optional, but highly recommended)
Use the normal configure
,
make
, make install
commands to install the software. If you downloaded
pqm directly from the repository, you may have to
run autoreconf -i
.
Next, you need to create a ~/.pqm.conf configuration file. This lists the location of the queue, the path to the GNUPG keyring, whether or not to verify signatures, etc. In addition, the pqm.conf file also specifies which repositories are valid to merge into. This is not checked for all commands. In the future, it will also allow specifying a keyring per-repository, and some other nice things. Please see the example file as a starting point.
Set up pqm to process requests. If you are using a shared filesystem, then you can just drop requests into a the queue directory. If necessary, set up pqm to process requests through email. You will likely want to use procmail. If you have an account dedicated to processing merge requests (a good idea), you could use this sample .procmailrc entry:
:0: | pqm --read
If you don't have a dedicated account, you will have to
pick a specific Subject:
or other
header to use to differentiate merge requests from your
regular email. This will scan and verify any emails that
come in. You will need to populate the patch queue's GPG
keyring.
To actually perform these actions, you need to run
$ pqm --run
That simply iterates through the pending merge requests in order (by mtime), and processes them. One way to run it is via a cron job.
Create any precommit or postcommit hooks.
Almost everything else can be done using with pqm actions.
There are currently eight different actions that pqm can do. The first five commands
function as you would expect. Note that everything must be fully specified. The patch queue manager does not, in general, have a default repository.
For merging, use
and to create a completely new line of development
Again, the commit message will be the
Subject:
line of your merge request.
So the first command you will use is probably
make-repo
.
If you are just starting development, you will then use
create-version
. If you have already
started development, you will use
create-branch
. The developers then branch
off of the patch queue manager's branch. When the developers
are ready, they will merge back with
star-merge
. You will use
repo-cache-revision
and
repo-uncache-revision
to speed up get's
and free up space. Finally, you will use
tag
to mark a release.
The commands in this section will be easier if we record in a little file which repository is the "upstream". It is recommended you do something like this:
$ echo 'example-dev@example.com/example-project' > _arx/+upstream
If you can provide all of the developers with write access to the same filesystem, then you can simply have them place merge request files in the queue directory, using a small shell script such as this:
#!/bin/sh (echo "From: $(arx param id)"; echo "Subject: $1"; echo; echo
star-merge "$(arx tree-branch)" "$(cat _arx/+upstream)") >
/usr/src/pqm/
patch.$(date +%s)
Save that as pqm-submit-merge
. Then you
would use this script by saying:
$ pqm-submit-merge 'fix lots of bugs'
In the future, we would like to have better support integrated in the various version control systems for this kind of thing.
If your site is widely distributed, or giving shell accounts to all developers doesn't work well, you can also use GNUPG-signed email. Here's how you could modify the script above:
#!/bin/sh echo star-merge "$(arx tree-branch)" "$(cat _arx/+upstream)" | gpg --clearsign | mail -s "$1" "$2"
You might use the above script by saying:
$ pqm-submit-merge 'fix bugs' pqm@example.com