Phabricator supports multi-commit patch series, but it's not yet obvious how to do it using Mercurial. So this the "hg" equivalent of this blog post for git users.
Note that other people have written tools and plugins to do the same thing and that an official client is coming soon.
Initial setup
I'm going to assume that you've setup arcanist and gotten an account on the Mozilla Phabricator instance. If you haven't, follow this video introduction or the excellent documentation for it (Bryce also wrote additionnal instructions for Windows users).
Make a list of commits to submit
First of all, use hg histedit
to make a list of the commits that are needed:
pick ee4d9e9fcbad 477986 Bug 1461515 - Split tracking annotations from tracki...
pick 5509b5db01a4 477987 Bug 1461515 - Fix and expand tracking annotation tes...
pick e40312debf76 477988 Bug 1461515 - Make TP test fail if it uses the wrong...
Create Phabricator revisions
Now, create a Phabricator revision for each commit (in order, from earliest to latest):
~/devel/mozilla-unified (annotation-list-1461515)$ hg up ee4d9e9fcbad
5 files updated, 0 files merged, 0 files removed, 0 files unresolved
(leaving bookmark annotation-list-1461515)
~/devel/mozilla-unified (ee4d9e9)$ arc diff --no-amend
Linting...
No lint engine configured for this project.
Running unit tests...
No unit test engine is configured for this project.
SKIP STAGING Phabricator does not support staging areas for this repository.
Created a new Differential revision:
Revision URI: https://phabricator.services.mozilla.com/D2484
Included changes:
M modules/libpref/init/all.js
M netwerk/base/nsChannelClassifier.cpp
M netwerk/base/nsChannelClassifier.h
M toolkit/components/url-classifier/Classifier.cpp
M toolkit/components/url-classifier/SafeBrowsing.jsm
M toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
M toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
M toolkit/components/url-classifier/tests/mochitest/test_trackingprotection_bug1312515.html
M xpcom/base/ErrorList.py
~/devel/mozilla-unified (ee4d9e9)$ hg up 5509b5db01a4
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
~/devel/mozilla-unified (5509b5d)$ arc diff --no-amend
Linting...
No lint engine configured for this project.
Running unit tests...
No unit test engine is configured for this project.
SKIP STAGING Phabricator does not support staging areas for this repository.
Created a new Differential revision:
Revision URI: https://phabricator.services.mozilla.com/D2485
Included changes:
M toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
M toolkit/components/url-classifier/tests/mochitest/test_trackingprotection_bug1312515.html
M toolkit/components/url-classifier/tests/mochitest/trackingRequest.html
~/devel/mozilla-unified (5509b5d)$ hg up e40312debf76
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
~/devel/mozilla-unified (e40312d)$ arc diff --no-amend
Linting...
No lint engine configured for this project.
Running unit tests...
No unit test engine is configured for this project.
SKIP STAGING Phabricator does not support staging areas for this repository.
Created a new Differential revision:
Revision URI: https://phabricator.services.mozilla.com/D2486
Included changes:
M toolkit/components/url-classifier/tests/mochitest/classifiedAnnotatedPBFrame.html
M toolkit/components/url-classifier/tests/mochitest/test_privatebrowsing_trackingprotection.html
Link all revisions together
In order to ensure that these commits depend on one another, click on that
last phabricator.services.mozilla.com
link, then click "Related
Revisions" then "Edit Parent Revisions" in the right-hand side bar and then
add the previous commit
(D2485 in this example).
Then go to that parent revision and repeat the same steps to set D2484 as its parent.
Amend one of the commits
As it turns out my first patch wasn't perfect and I needed to amend the
middle commit to fix some test failures that came up after pushing to
Try.
I ended up with the following commits (as viewed in hg histedit
):
pick ee4d9e9fcbad 477986 Bug 1461515 - Split tracking annotations from tracki...
pick c24f4d9e75b9 477992 Bug 1461515 - Fix and expand tracking annotation tes...
pick 1840f68978a7 477993 Bug 1461515 - Make TP test fail if it uses the wrong...
which highlights that the last two commits changed and that I would have two revisions (D2485 and D2486) to update in Phabricator.
However, since the only reason why the third patch has a different commit hash is because its parent changed, theres's no need to upload it again to Phabricator. Lando doesn't care about the parent hash and relies instead on the parent revision ID. It essentially applies diffs one at a time.
The trick was to pass the --update DXXXX
argument to arc diff
:
~/devel/mozilla-unified (annotation-list-1461515)$ hg up c24f4d9e75b9
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
(leaving bookmark annotation-list-1461515)
~/devel/mozilla-unified (c24f4d9)$ arc diff --no-amend --update D2485
Linting...
No lint engine configured for this project.
Running unit tests...
No unit test engine is configured for this project.
SKIP STAGING Phabricator does not support staging areas for this repository.
Updated an existing Differential revision:
Revision URI: https://phabricator.services.mozilla.com/D2485
Included changes:
M browser/base/content/test/general/trackingPage.html
M netwerk/test/unit/test_trackingProtection_annotateChannels.js
M toolkit/components/antitracking/test/browser/browser_imageCache.js
M toolkit/components/antitracking/test/browser/browser_subResources.js
M toolkit/components/antitracking/test/browser/head.js
M toolkit/components/antitracking/test/browser/popup.html
M toolkit/components/antitracking/test/browser/tracker.js
M toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm
M toolkit/components/url-classifier/tests/mochitest/test_trackingprotection_bug1312515.html
M toolkit/components/url-classifier/tests/mochitest/trackingRequest.html
Note that changing the commit message will not automatically update the revision details in Phabricator. This has to be done manually in the Web UI if required.
I think you're missing one useful part to commit series updates.
It is unclear if you let it prompt you for the commit messages & data when you upload, but if you do, then you can follow this slightly easier process.
arc diff
, set the reviewer and bug number.arc diff
. Also set the reviewer and bug number, but this time add to the summary "Depends on Dnnnn" (where Dnnnn is the id of the previous patch).Then you can avoid linking the commits in the phabricator UI.
Also when you then need to update a diff, you can simply do
arc diff
to generate the new version as it already knows what it depends on.After everything is submitted, I made some changes to my commits.
When I run
arc diff
for a particular commit, the process is really confusing. For example, witharc diff --update DXXX
, I get prompted with the whole list of revisions...