After reading my recent Please Stop Using MQ post, a number of people asked me about my development workflow. While I still owe a full answer to that question, one of the cornerstores is a unified Mercurial repository. Instead of having separate clones for mozilla-central, mozilla-inbound, aurora, beta, etc, I have a single clone with the changesets from all the repositories.
I feel having a unified repository has made me more productive. I no longer have to waste time shuffling changesets between local clones. This introduced all kinds of extra cognitive load and manual processes that slowed me down. I highly encourage others to adopt unified repositories.
Because the various Firefox repositories don't have unique branches or bookmarks tracking the various heads, aggregating multiple repositories introduces a client-side problem of identifying which head is which. If you merely do a hg pull, you'll get a bunch of anonymous heads.
To solve this problem, you'll need to employ minor client-side magic. Previously, I recommended my heavyweight mozext extension.
Today, I'm proud to announce a new, lighter extension: firefoxtree. When pulling from a known Firefox repository, this extension will add a local-only Mercurial tag for that repository. For example, when pulling mozilla-central, the central tag will be created.
Local-only tags are a Mercurial feature only available to extensions. A local-only tag is effectively an overlay of tags that don't get transferred as part of push and pull operations. They behave like normal tags: you can hg up to them and reference them elsewhere changeset identifiers are used. They are also read only: if you update to a tag and then commit, the tag will not move forward (contrast with branches or bookmarks).
Clone https://hg.mozilla.org/hgcustom/version-control-tools and add the following to your .hg/hgrc:
[extensions] firefoxtree = /path/to/version-control-tools/hgext/firefoxtree
To use, simply pull from a Firefox repo:
$ hg pull https://hg.mozilla.org/mozilla-central $ hg up central # Do your development work. # Time to land. $ hg pull https://hg.mozilla.org/integration/mozilla-inbound $ hg rebase -d inbound $ hg out -r . https://hg.mozilla.org/integration/mozilla-inbound $ hg push -r . https://hg.mozilla.org/integration/mozilla-inbound
Please note that hg push tries to push all local changes on all heads to a remote by default. When operating a unified repo, you'll need to use the -r argument to hg push and hg out to limit what changesets are considered. I most frequently use -r . to limit changes to the current checked out changeset.
Also note that this extension conflicts with my mozext extension. I hope to update mozext to make it behave in the same manner. (It was easier to write a new extension than to update mozext.)