Mozilla: Using a git clone of gecko‐dev to push to mercurial

Mike Hommey edited this page Dec 2, 2016 · 6 revisions

The following setups require version 0.3.0 or higher of git-cinnabar.

There are two ways you can work with gecko-dev and git-cinnabar.

But first...

A head start

Assuming you already have a gecko-dev clone, and git-cinnabar 0.4.0rc or higher installed, you can get a head start on both setups described below by running the following command from that gecko-dev clone:

$ curl -sL https://gist.github.com/glandium/56a61454b2c3a1ad2cc269cc91292a56/raw/bfb66d417cd1ab07d96ebe64cdb83a4217703db9/import.py | git cinnabar python

Switching to git-cinnabar

This is the recommended setup.

There are several reasons one would want to start from gecko-dev instead of a fresh clone of mozilla-central. One is to get the full history from before Mozilla switched to Mercurial, which gecko-dev contains. Another is if you already have a gecko-dev clone with local branches, where rebasing against a fresh clone would not be very convenient (but not impossible).

The idea here is to use gecko-dev as a start point, and from there on, use cinnabar to pull and push from/to Mercurial. The main caveat is that new commits pulled from Mercurial after this will not have the same SHA-1s as those on gecko-dev. Only the commits until the switch will. This also means different people grafting gecko-dev at different moments will have different SHA-1s for new commits. Eventually, I hope we can switch gecko-dev itself to use git-cinnabar instead of hg-git, which would solve this issue.

Assuming you already have a gecko-dev clone, and git-cinnabar 0.3.0 or higher installed:

  • Change the remote URL:
$ git remote set-url origin hg::https://hg.mozilla.org/mozilla-central

(replace origin with the remote name for gecko-dev if it's not origin)

  • Add other mercurial repositories you want to track as well:
$ git remote add inbound hg::https://hg.mozilla.org/integration/mozilla-inbound
$ git remote add aurora hg::https://hg.mozilla.org/releases/mozilla-aurora
(...)
  • Pull with grafting enabled:
$ git -c cinnabar.graft=true remote update
  • Finish the setup by setting push urls for all those remotes:
$ git remote set-url --push origin hg::ssh://hg.mozilla.org/mozilla-central
$ git remote set-url --push inbound hg::ssh://hg.mozilla.org/integration/mozilla-inbound
$ git remote set-url --push aurora hg::ssh://hg.mozilla.org/releases/mozilla-aurora
(...)

Now, you're mostly done setting things up. Check out the git workflow for Gecko development for how to work from there.

Following gecko-dev

This setup allows to keep pulling from gecko-dev and thus keep the same SHA-1s. It relies on everything pulled from Mercurial existing in gecko-dev, which makes it cumbersome in some ways, which is why I don't recommend using it. For instance, you may end up pulling from Mercurial before the server-side mirroring made things available in gecko-dev, and that will fail. Some commands such as git pull --rebase will require you to ensure gecko-dev is up-to-date first (that makes winning push races essentially impossible). And more importantly, in some cases, what you push to Mercurial won't have the same commit SHA-1 in gecko-dev, so you'll have to manually deal with that (fortunately, it most cases, this shouldn't happen).

Assuming you already have a gecko-dev clone, and git-cinnabar 0.3.0 or higher installed:

  • Add a remote for all mercurial repositories you want to track:
$ git remote add central hg::https://hg.mozilla.org/mozilla-central
$ git remote add inbound hg::https://hg.mozilla.org/integration/mozilla-inbound
$ git remote add aurora hg::https://hg.mozilla.org/releases/mozilla-aurora
(...)
  • For each of those remotes, set a push url:
$ git remote set-url --push origin hg::ssh://hg.mozilla.org/mozilla-central
$ git remote set-url --push inbound hg::ssh://hg.mozilla.org/integration/mozilla-inbound
$ git remote set-url --push aurora hg::ssh://hg.mozilla.org/releases/mozilla-aurora
(...)

Other branches can be added, but that must be done with care, because not all branches are exposed on gecko-dev.

  • Set git-cinnabar grafting mode permanently:
$ git config cinnabar.graft true
  • Then pull from all remotes:
$ git remote update

With this setup, you can now happily push to Mercurial and see your commits appear in gecko-dev after a while. As long as you don't copy or move files, their SHA-1 should be the same as what you pushed.