After waving a fond farewell to Fossil I give a hearty hello to Phabricator!
The Good
Phabricator is written in PHP which means I don’t have to install Yet Another Framework. I use quite a few things that depend on PHP on this site already, such as Grav and RoundCube. So of course, it allows me to self host. Or you can rent a Phabricator VPS @ Phacility.
The sign up process (to my Phabricator instance, not somewhere else) is very straight-forward, allowing email/password with ReCaptha or use a OAuth2 provider such as Google. So this is very socially acceptable and should be secure from spambots.
The core work is based around the ease of code auditing and review of patches. There is even a pastebin so users can upload config files and logs for analysis. Doing all this in a mailing list over the years results in things being here, there and everywhere … and then expiring. Having it all centralised means nothing is lost. But more importantly, it’s much easier to look at and work with, so this is a massive quality of life improvement.
Tickets (or tasks in Phabricator) very user friendly, showing a collapsable history with full links to related objects such as commits, reviews, logs, etc. Infact the linking is extremely easy, one can reference some more of the popular objects by using a single letter follows by the id. Such as T1
. Tickets can be related to one or more Projects and in turn Projects can display Tasks on a KanBan Board.
Phabricator can host your code in your SCM of choice for you and defaults to not allowing destructive changesets by default which saves me from messing around with custom hooks. This allows the same feature as Fossil’s immutable history on the server- you can do what you like to your own clone still.
It’s fast! No, it’s not as fast as Fossil, but it’s still more than fast enough especially when you consider the extra toys you get- syntax highlighting, desktop notifications (on supported browsers, which is most recent ones), user icons, in-depth tooltips. It’s certainly faster than other solutions I’ve looked at recently and bar Fossil, probably the fastest.
You get a chat room (does require a NodeJS server on the host for automatic updates though it seems) and a wiki. I still use IRC on FreeNode, but the advantage here is that this is web based and persistent so you don’t loose anything if you get disconnected. Still, unsure how useful either be as I don’t recall users editing any publically editable wiki pages I’ve had over the years- are my man pages really that good? Heh.
The Bad
Phabricator is written in PHP. Now I did say that was a good thing earlier, but it’s a double edged sword. PHP does have a bad reputation for both security and language structure. I would argue that this is no different from how C is today. This is also bad, because my site ran on PHP-7.0 and that was soooo much faster than earlier versions it was silly. But Phabricator didn’t support PHP-7 until PHP-7.1 in early Feb this year. Something to think about for long term support, but this equally applies to other languages, especially the Python-2 vs Python-3 issue as my box has two Python versions due mainly to certbot needing Python-2.7
Phabricator requires MySQL (I installed MariaDB, the fork from MySql). I was very happy with PostgreSQL but my box does not have the resources to run both. Pretty much all other software I use allows the choice of DB, so this actually took me by surprise. And just like the PHP reaction others have, I was concerned by using MySQL, but as I’m not really into being a DBA I’m quite happy with MySQL so far.
The linking is really bad for DHCP, because we always talk about T1
and T2
as timers. This is important, because my main product is of course dhcpcd.
In Phabricator T1
and T2
are shorthand to link to Task 1 and Task 2.
You can fix this by stopping Phabricator from linking via a matchig regex, but I quite like the ease of use and solved the problem via changing the AUTO_INCREMENT
value in some tables from 1 to 101. This reduces the potential collision with other things, such as Z1
and allows the same workflow. Upstream rejected my change and even went as far as to remove me posting my fix if anyone else has the same issue claiming this would make support hard. As it turns out, something with my change isn’t quite right- either Phabricator or MySQL resets the AUTO_INCREMENT
value. I don’t know which one, or what action I did or if it’s a general Garbage Collection going on. This could be why they didn’t like the change, but heh ho most of the important tables now have values in at 101 and higher so it shouldn’t be a problem anymore.
The Continuous Integration support is limiting, but it is there. Apparently you can at least call out to Jenkins or BuildBot.
Because Phabricator is based on and developed in a DevOps fashion, there is practically no support for managed releases or milestones. This isn’t a problem for me as such, but I would like a feature to track important things that went into a release better.
The Ugly
Phabricator is NOT ugly. It’s quite visually appealing. However, it is quite possibly the most complex installation I’ve ever done as it uses many databases and as many configuration options as sysctl on a good BSD. This wasn’t helped by running on NetBSD-current and a gcc built PHP with Phabricator just didn’t work and I spent a long time working out why. My fix was to build everthing with clang which required a lot of personal effort from me at the time due to the recent UEFI booting support breaking the build and a the new clang-4 compiler not working with the NetBSD build knobs I was using. On the plus side, the Phabricator docmentation is good and about 95% of the issues I had were easily searchable on StackOverflow or the (mostly) friendly Phabricator community helped me out in their chat channel- which oddly enough is also a Phabricator application.
Phabricator workflow with more than one dev, or the best way of submitting patches, is to use the Arcanist tool. They admit it’s not great and things should be manageable directly through the SCM. We’ll see how that progresses. In the meantime, posting patches to the Differential application is quite easy and allows easy patch review.
I had to stop using Fossil because Fossil is more than just a SCM, it strives to be a complete one stop solution. Obviously that won’t work for the desire to use Phabricator for all the good reasons, so I needed to pick a SCM to use. Luckily Phabricator quite a few- GIT, Mercurial and SVN.
But what about the source code control?
It’s importance cannot be understated- the code is everything, the history of the code is everything. This has been known since the dawn of time. At this point though, the SCM just becomes a tool in the box, just like sed.
Eh what?
Every SCM solution out there has pretty much the same set of basic features you need- atomic checkins (ok, CVS lacks this), changesets, branching, tagging. That’s all you pretty much need at a basic level- the rest of the features are predominently driven by workflow.
Tools exist to export data from one to the other, and tools are being created to allow a more transparent bridge again making the choice of SCM even less important than it was before. The only real issue is the importance of meta data that has no place-holder in the other SCM you want to use. A good example of this would git the Author vs Commiter git attribute on the commit.
Then, you need to understand that the SCM is only for developers. End users don’t care a hoot about it. What they do care about is an easy to use system which handles the lifetime of their issue where dicussion, patches, logs, reviews and audits can happen. Hopefully they can even get a fixed build at the end. This is basically part of Application Lifecycle Management.