## Introduction

The Mercurial Queues extension (`mq`) provides a mechanism for managing patches on top of a Mercurial repository and is described in detail in Chapters 12 and 13 of Mercurial: The Definitive Guide. This document explains how to use `mq` in conjunction with the `codereview` Mercurial extension described in the instructions for contributing to the Go project. It assumes you have read those instructions.

## Configuration

To enable `mq` edit either `$HOME/.hgrc` (to enable it for all of your repositories) or `$GOROOT/.hg/hgrc` (to enable it for the repository at `$GOROOT`) to add:

    [extensions]
    mq=

Since pulling, pushing, updating and committing while `mq` patches are applied can damage your repository or a remote one, add these lines to prevent that case:

    [hooks]
    # Prevent "hg pull" if MQ patches are applied.
    prechangegroup.mq-no-pull = ! hg qtop > /dev/null 2>&1
    # Prevent "hg push" if MQ patches are applied.
    preoutgoing.mq-no-push = ! hg qtop > /dev/null 2>&1
    # Prevent "hg update" if MQ patches are applied.
    preupdate.mq-no-update = ! hg qtop > /dev/null 2>&1

## Making a change

The entire checked-out tree is writable and you can use `mq`, as documented in Chapter 12 of "The Guide", to implement your change as a single patch or a series of patches.

When you are ready to send a change out for review, run

    $ hg change

from any directory in your Go repository with all of the `mq` patches relevant to your change applied and then proceed as instructed in contributing to the Go project.

The change number reported by `hg change`, preceded by a `+`, can be used as an `mq` patch guard to assist in controlling which patches are applied as described in Chapter 13 of "The Guide". For example, the command:

    for p in $(hg qapplied); do hg qguard $p +99999; done

will apply the guard `+99999` guard to all currently applied `mq` patches.

## Synchronizing your client

While you were working, others might have submitted changes to the repository and, as explained in contributing to the Go project, it is necessary to synchronize your repository using `hg sync`before sending your change list for review. Because `hg sync` runs `hg pull -u`, you should not run `hg sync` while `mq` patches are applied. Instead pop all your patches before running `hg sync` and reapply them after it has completed.

When reapplying the patches, you may need to resolve conflicts as described in contributing to the Go project.

## Mailing the change for review

You should have all of the `mq` patches relevant to your change applied when you run `hg mail`.

## Submitting the change after the review

If you are a committer, you should have all of the `mq` patches relevant to your change applied when you run `hg commit`.