Thoughts on Gogs.io (and others)

Submitted by Silvershock on Sat, 04/08/2017 - 12:31

Among the various projects I give myself and don't have enough time for, I recently started helping out with development on the Convention Master system, which is used (primarily in the furry community) to look after the various management aspects of the convention - ticket sales, registration, inventory, etc.

Convention Master has been running on your traditional Subversion-over-Apache setup for quote a long time. They didn't have any particular reason to move off it, so they didn't. Fair enough, you'll rarely get "we must have the shiny thing" from me. That said, when compared to Git, Subversion is terrible at merging, and CM has increasingly large feature branches. CM has a new internal dev server, and with the opportunity to make a clean break I was tasked with finding a new repository host.

I've previously tried using GitLab for this, which is a well known and very well featured Git hosting solution, but there's one major problem with this: GitLab's setup is horrendous. This seems to be typical of apps that run on the Ruby platform, to be honest - I'm not a Ruby dev but it seems to be very poor at handling dependencies. If you use the Debian package they provide on a completely blank server, you should make out OK, but if you try installing GitLab on a server with existing services it is a total nightmare. This server was originally going to have GitLab as its new tracker, but after a week of trying to get it running I threw it out completely and installed Phabricator.

Phabricator has so far been doing OK for me. It's easy enough to install, runs quickly, has a nice clean interface and so on. The wiki in particular is very pleasant to use. It also has a sense of humour, with really strange easter eggs hidden all over the software. Here's how Phabricator once rejected a push on a branch:

Push rejected by evil dragon bureaucrats

Some people think that implementing things like this isn't a sign of being a "professional" (a word I have come to loathe). Personally, I think that if you're incapable of having a smile at work, you need to pull the stick from your ass. </rant>

However, I'm not a big fan of some of the processes that Phabricator enforces. Authentication is done against projects rather than people, so overriding things for a particular person isn't do-able. The Phabricator team freely admits that the "Harbourmaster" CI module is basically not very useful in its current state, so integrating it with CI has been a bit of a struggle. The biggest issue I've had with it so far, though, is that it doesn't support pull requests. It supports post-push code auditing, and pre-push code review (like a pull request, but before the code even hits the origin repo). The Phab guys have reasons for doing this, and they're not terrible reasons, but personally I don't like this methodology. I want the code to be safely stashed in the main repository, and for devs to be able to push as often as they like without having to wait. Basically, I don't see any problem with the standard "pull request to master" methodology that most small projects have.

Somewhere inbetween the two, we came across Gogs.io, which is a GitHub-alike (hush, it's a term now) that aims to emulate much of what GitHub does. The interface is extremely similar, and it functions in a very similar way. We decided to try it out, and so far we've been pretty happy. It's easier than Phabricator to install, and far far easier than GitLab, and for a small team provides almost everything we need. You get a wiki, an issue tracker and a repo browser. Repositories can be owned either by users or by an organisation, within which there can be various teams with differing permissions. The structure of it and the workflows it supports suit the teams I work within very well, to the point where I'm tempted to ditch my still-recent Phabricator installation and replace it with Gogs.

There are some downsides, however - while Gogs does the things it does very well, there are numerous features I was  surprised to see were missing altogether. Pull requests are well laid out, but don't have the ability to comment directly against a line of code, which is an incredibly useful feature. While Gogs can merge and delete branches, for some bizarre reason there's no option to create one from the GUI. The wiki editor is pretty basic, not featuring any obvious syntax help dialog, and the wiki engine does not support categories or attachments. Another nice-to-have would be two-factor authentication for user accounts; one thing I do love from Phabricator is its insane number of authentication options.

One project I will be keeping an eye on is Gitea, which is a fork of Gogs. Apparently some of Gogs' contributors were displeased with the length of time taken to resolve pulls, so the project was forked entirely. If the development impetus goes that way, then it's possible that the missing features will appear, and I imagine transitioning our new Gogs installation to Gitea would not be particularly difficult. For now, for a small team mostly new to Git, Gogs is proving to be a small, usable, excellently laid-out system. I like it quite a lot. It remains to be seen whether it will become my tool of choice.

As an aside, the tool I used to convert our Subversion repository to Git  was SubGit. SubGit is intended to support SVN in a Git world. It can automatically mirror a Subversion repository into a Git repository and keep the two synchronised. I didn't use this functionality myself; we did a straight one-time conversion of Subversion to Git, and for this SubGit was superb. I simply made a local copy of the repository, created an authors.txt file to translate Subversion usernames into Git authors, and ran a single command. Within ten minutes I had a fully functional Git repository, with all of our history, branches and tags completely intact. It was extremely impressive, and I can't recommend SubGit enough for this task. One tip: do the conversion locally. The standard methodology is to convert a remote repository, but don't do this unless you want the conversion to take a thousand years.

Update 2017-10-28. We recently moved from Gogs.io to Gitea. The development impetus is clearly on Gitea's side, and features I felt were desperately needed in Gogs are being added in droves in Gitea, such as commenting directly on code lines in pull requests, two-factor authentication, creating branches from the UI, and so on. While there's no direct upgrade path from one to the other, our tickets are still in Mantis, so creating a new installation and importing our repositories was very simple and required basically no intervention on the part of the devs. Very happy with the move over so far.