Accessing code repositories

Context

The Orthanc server and most of its plugins are versioned using Mercurial on a self-hosted server.

The Orthanc project started back in 2011, back in a time where Mercurial and Git were equally popular. Sébastien Jodogne, the original author of Orthanc, decided to use Mercurial given the higher simplicity of its set of commands, and given the fact it is safer to use for less experienced users.

As pointed out on Wikipedia, the “Git vs. Mercurial [debate] has become one of the holy wars of hacker culture.” We certainly don’t want to endure this debate in the context of the Orthanc ecosystem. The fact is that a distributed revision-control was needed for Orthanc, and that both Git and Mercurial have a similar set of features.

If Orthanc were started in 2020, maybe we would have used Git, or maybe not. But the Orthanc ecosystem is not at all about versioning systems. We want to be entirely dedicated to lowering barriers to entry in the field of medical imaging. As a consequence, the choice of Mercurial should be considered as a part of the history, and we simply ask people to accept it as a fact.

Regarding the reason behind self-hosting, Orthanc was hosted on Google Code between 2012 and 2015, until it was shutdown. In July 2015, Orthanc was moved to Bitbucket by Atlassian. Unfortunately, in July 2019, Bitbucket announced that Mercurial support would be dropped on June 2020, forcing us to deal with another migration.

We are of course grateful to Google and Atlassian for having hosted Orthanc during 8 years. However, we cannot afford the cost of periodically coping with hosting migrations. We prefer to have a simpler environment, yet under our full control. As a consequence, starting Q2 2020, Orthanc is hosted using the official hg serve tool.

Accessing Mercurial

Read-only access

Anybody has full read-only access to all of the Orthanc official repositories, on our self-hosted server. As the hg serve tool that is used by our Web server tends to be slow, we recommend people to locally clone our Mercurial repositories.

Locally cloning one of those Mercurial repositories (say, the main orthanc repository) is as simple as typing:

$ hg clone https://orthanc.uclouvain.be/hg/orthanc/

You can then use separate tools such as TortoiseHg to browse the code with richer features than the Web interface.

Recent versions of Mercurial

While cloning the repository, you might face an error similar to:

abort: error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)

In such a case, you must explicitly add the cryptographic fingerprint of our code server using a more recent option than the hostfingerprints option. To this end, edit the configuration file of Mercurial (by default on Microsoft Windows, %USERPROFILE%\Mercurial.ini), and add the following lines:

[hostsecurity]
orthanc.uclouvain.be:fingerprints=sha256:30:1d:d8:b6:a2:50:23:6a:a1:b7:da:66:b6:aa:2f:fa:59:f3:9d:cd:ed:f8:2c:49:14:57:25:39:84:b9:60:db

For reference, here is the command that was used to generate this SHA256 fingerprint (click here for more information):

$ openssl s_client -servername orthanc.uclouvain.be -connect orthanc.uclouvain.be:443 \
  < /dev/null 2>/dev/null | openssl x509 -fingerprint -sha256 -noout -in /dev/stdin

Important: As our certificates are changed periodically, you’ll have to regularly update your configuration file once Mercurial complains about an unexpected fingerprint.

Old versions of Mercurial

For old versions of Mercurial that do not support SHA256, add the following lines to your ~/.hgrc file:

[hostfingerprints]
orthanc.uclouvain.be = 69:C0:EF:E7:05:BB:2A:0B:88:EA:E8:00:C6:1A:95:A3:53:74:C1:D4

For reference, here is the command that was used to generate this SHA1 fingerprint (click here for more information):

$ openssl s_client -servername orthanc.uclouvain.be -connect orthanc.uclouvain.be:443 \
  < /dev/null 2>/dev/null | openssl x509 -fingerprint -sha1 -noout -in /dev/stdin

Write access

Only the core developers of Orthanc have direct write access to the Orthanc repositories (through SSH). Core developers can clone a repository with write access as follows:

$ hg clone ssh://hg@orthanc.uclouvain.be/public/orthanc/

Submitting code

We will of course be extremely grateful for receiving external code contributions to the Orthanc repositories!

However, one of the weaknesses of our self-hosted infrastructure is that is does not support automation for pull requests. This section explains the two accepted ways for communicating contributions: by submitting a patch, or by exchanging a bundle.

Code quality

  • Your code must follow the C++03 standard (C++11 is not accepted for maximum cross-platform compatibility on older platforms).

  • The continuous integration servers at UCLouvain check that Orthanc properly compiles on Ubuntu 16.04, on Linux Standard Base systems using the LSB SDB 5.0.0, on FreeBSD, on Microsoft Visual Studio 2008 (32 bit), on Microsoft Visual Studio 2015 (64 bit), and on Apple OS X 10.9 “Mavericks”. Submitted code might have to be adapted to compile on these platforms. Architecture-dependant code should be located in the Orthanc::Toolbox and Orthanc::SystemToolbox static classes.

  • Please stick to the coding style of Orthanc.

  • Your individual contributions should be kept as small as possible, and should be focused on one very specific issue or feature. Large architectural changes are reserved for the core development team of Orthanc, as we must follow our long-term roadmap.

  • Unit testing is mandatory. Integration tests should be submitted to the dedicated repository.

  • All the contributions will be carefully reviewed. Some contributions may be modified, yet even rejected. A rejection might for instance occur if your contribution does not match the Orthanc roadmap, does not meet our high-quality code standards, or breaks backward compatibility. Please be sure that we warmly welcome and appreciate your contributions, but be aware of the fact that we are quite strict, and that the review process might take time. This is why the recommended way of contributing to Orthanc is always by creating contributed plugins.

  • If intellectual property is of importance to you, make sure to carefully read our FAQ about the licensing of submitted code. If you are concerned about intellectual property, consider creating plugins instead of submitting code directly to the core project.

Simple patch (import/export)

If you want to propose a simple contribution, the most direct way of passing it on the Orthanc community is by creating a simple patch.

First make sure to pull the latest version of the code repository, then work on your modification in the default branch (i.e. in the mainline code):

$ hg pull
$ hg up -c default
[...make your modifications...]

Once your contribution is done, here is how to export a patch:

$ hg export -r default > /tmp/contribution.patch

Once the patch is ready, you can send the /tmp/contribution.patch file to the Orthanc community, e.g. by submitting it onto our official Orthanc Users discussion forum. The core developers would reintegrate such a patch by typing the following command on their side:

$ hg pull
$ hg up -c default
$ hg import /tmp/contribution.patch

NB: If the hg export command was run on Microsoft Windows, one might have to convert the end-of-lines from DOS (CR/LF) to UNIX (LF only) using the dos2unix command on the patch file, before running hg import. Otherwise, errors like Hunk #1 FAILED might show up.

Exchanging a bundle

If your contribution is made of several changesets (commits), you should work in a dedicated branch, then submit a Mercurial bundle for this branch.

First make sure to pull the latest version of the code repository, then create a branch, say my-user/my-fix, that derives from the default branch (which corresponds to the mainline code):

$ hg pull
$ hg up -c default
$ hg branch my-user/my-fix

WARNING: Please chose an unique, explicit name for your branch, and make sure that your username is included within for traceability! The name my-user/my-fix is only here for the purpose of the example.

You can then do all the modifications as required (including hg add, hg rm, and hg commit) in the branch my-user/my-fix. When you’re done, create a Mercurial bundle that gathers all your changes against the source repository as follows:

$ hg commit -m 'submitting my fix'
$ hg bundle /tmp/contribution.bundle https://orthanc.uclouvain.be/hg/orthanc

Obviously, make sure to replace https://orthanc.uclouvain.be/hg/orthanc by the location of the source repository.

Finally, you can submit the file /tmp/contribution.bundle to the community, just like for simple patches. Note that this procedure inherently corresponds to the manual creation of a pull request.

The core developers would reintegrate such a bundle into the mainline by typing the following commands on their side:

$ cd /tmp
$ hg clone https://orthanc.uclouvain.be/hg/orthanc/
$ cd /tmp/orthanc
$ hg unbundle /tmp/contribution.bundle
$ hg up -c default
$ hg merge my-user/my-fix

Submitting contributions

Contributed patches and bundles must be sent by e-mail, either to Sébastien Jodogne (UCLouvain) or to Alain Mazy (Orthanc Team).

Issue tracker

The official bug tracker of the Orthanc project runs thanks to Bugzilla.

We have done our best to automatically import most of the history from the old BitBucket bug tracker.

Before posting any issue, make sure to carefully, completely read the page about how to ask support. In particular, most issues should first be discussed on the dedicated Orthanc Users discussion forum before introducing a bug report.