Jump to content

JetBrains IDEs

From mediawiki.org

For our Open Source work, the Wikimedia Foundation (and the community) received a number of licenses for the All Products Pack of JetBrains (in doing it, we're thanking JetBrains for the support of our projects). The licenses allows an attached user to use all JetBrains desktop products, as described on the JetBrains website (Get access to all desktop products including IntelliJ IDEA Ultimate, ReSharper Ultimate and other IDEs).[1] If you use a JetBrains product (such as the IntelliJ IDEA Ultimate or PhpStorm) to contribute open source code for MediaWiki or MediaWiki extensions, please consider requesting a license key from one of the account administrators.

How do I get a license?


For staff, see https://office.wikimedia.org/wiki/JetBrains.

To request a license, simply write an e-mail or contact one of the account administrators via IRC:

  • Sam Reed (reedy in #wikimedia-dev connect, sreed [AT] wikimedia [DOT] org)
  • Florian Schmidt (FlorianSW in #wikimedia-dev connect, florian.schmidt.stargatewissen [AT] gmail [DOT] com)

You'll get an e-mail with an invitation link for one of our licenses which, when clicked, will connect a license with your JetBrains account (if you don't have one yet, you'll need to create one). Please note that we have a limited number of licenses only, and even if we're sure that you can get a license, we want to make sure that the people who actively contribute code to one of our projects can benefit from the license. This means that we'll check if you're an active contributor to one of our projects before sending you an invitation link. There are no big things you need to accomplish (such as a specific amount of changes per day or something else, that would be ridiculous, as we're thankful for anything you do for our projects!). However, if you've never contributed code to our projects or your last change was a reasonable time ago (e.g. over a year or so), we may ask you some questions (e.g. "Why do you want a license?"). But don't hesitate and simply ask us if you can get a license :)

What product should I use?


Like mentioned above, the MediaWiki open source project owns licenses for the All products pack of JetBrains, which includes all desktop products (like PhpStorm, IntelliJ IDEA Ultimate, Webstorm and so on). Some products share some functionality, so it can be difficult to choose the correct product. You probably heard from this page because someone suggested you to use PhpStorm. Even if this isn't false, and PhpStorm is a good product, we would like to encourage you to choose the IntelliJ IDEA Ultimate, which includes some more features and language support compared to PhpStorm. If you plan to contribute to projects other than the PHP-based ones in MediaWiki, it probably would be a benefit, that you already use the "non-plus-ultra" product. However, as all products are included anyway, you can choose the product you like the most, if you have one.

If you wish to test bleeding edge features, IntelliJ IDEA Ultimate and other standalone products have separate release rhythms. Installing PhpStorm or WebStorm separately has its benefits.

MediaWiki code style


MediaWiki has its own and specific code style for PHP, JavaScript, JSON and some other languages. The JetBrains products allow you to define all of your coding conventions in the project settings so that the IDE supports you as best as it can, e.g. by automatically format the code you write.

The following XML code is a snapshot of the settings of the coding convention for PHP, JSON, JavaScript and LESS. It may be incomplete and miss some other languages. So if you want to extend it, feel free to simply add the settings for the coding convention. If you want to import the settings, please copy the code and save it as a file on your computer. Then import the settings in the JetBrains IDE ("Import Scheme" from the gear icon next to Settings > Editor > Code Style > Scheme).

Expand to see XML
<code_scheme name="MediaWiki" version="173">
  <option name="LINE_SEPARATOR" value="&#10;" />
    <option name="COMMA_AFTER_LAST_ARRAY_ELEMENT" value="true" />
    <option name="BLANK_LINES_BEFORE_RETURN_STATEMENT" value="1" />
    <option name="KEEP_RPAREN_AND_LBRACE_ON_ONE_LINE" value="true" />
    <option name="SPACE_AROUND_ASSIGNMENT_IN_DECLARE" value="true" />
  <codeStyleSettings language="JSON">
      <option name="INDENT_SIZE" value="4" />
      <option name="USE_TAB_CHARACTER" value="true" />
  <codeStyleSettings language="JavaScript">
      <option name="USE_TAB_CHARACTER" value="true" />
      <option name="SMART_TABS" value="true" />
  <codeStyleSettings language="LESS">
      <option name="USE_TAB_CHARACTER" value="true" />
  <codeStyleSettings language="PHP">
    <option name="RIGHT_MARGIN" value="100" />
    <option name="KEEP_LINE_BREAKS" value="false" />
    <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
    <option name="CLASS_BRACE_STYLE" value="1" />
    <option name="METHOD_BRACE_STYLE" value="1" />
    <option name="CATCH_ON_NEW_LINE" value="true" />
    <option name="ALIGN_MULTILINE_FOR" value="false" />
    <option name="SPACE_AROUND_UNARY_OPERATOR" value="true" />
    <option name="SPACE_WITHIN_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_METHOD_CALL_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_METHOD_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_IF_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_WHILE_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_FOR_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_CATCH_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_SWITCH_PARENTHESES" value="true" />
    <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="true" />
    <option name="CALL_PARAMETERS_WRAP" value="1" />
    <option name="METHOD_PARAMETERS_WRAP" value="1" />
    <option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
    <option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
    <option name="EXTENDS_LIST_WRAP" value="1" />
    <option name="EXTENDS_KEYWORD_WRAP" value="1" />
    <option name="METHOD_CALL_CHAIN_WRAP" value="5" />
    <option name="PARENTHESES_EXPRESSION_RPAREN_WRAP" value="true" />
    <option name="BINARY_OPERATION_WRAP" value="1" />
    <option name="TERNARY_OPERATION_WRAP" value="5" />
    <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
    <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" />
    <option name="FOR_STATEMENT_WRAP" value="1" />
    <option name="FOR_STATEMENT_RPAREN_ON_NEXT_LINE" value="true" />
    <option name="ARRAY_INITIALIZER_WRAP" value="5" />
    <option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
    <option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
    <option name="ASSIGNMENT_WRAP" value="5" />
    <option name="IF_BRACE_FORCE" value="3" />
    <option name="DOWHILE_BRACE_FORCE" value="3" />
    <option name="WHILE_BRACE_FORCE" value="3" />
    <option name="FOR_BRACE_FORCE" value="3" />
    <option name="WRAP_ON_TYPING" value="1" />
      <option name="USE_TAB_CHARACTER" value="true" />

With this, you can auto-format your code to conform to the standards. To do this, select "Reformat Code" from the Code menu.

Code sniffer integration


You can also integrate PHP Codesniffer (PHPCS) into PhpStorm and similar products, so that phpcs errors will be shown in real-time. Assuming you're working within the root of the core MediaWiki project (from which you can also work on extensions):

  1. Go to Settings > PHP > Quality Tools -> Code Sniffer.
  2. Next to "Configuration" click on the "...", opening up the Code Sniffer panel.
  3. Click on "...", and browse to the vendor/bin directory and select phpcs. Click on "Validate" to ensure the binary loads properly.
  4. Go to Settings > Inspections and look for "PHP Code Sniffer validation" under PHP.
  5. Select "Custom" as the "Coding standard", then from "..." choose the ruleset.xml file that's located in vendor/mediawiki/mediawiki-codesniffer/MediaWiki.

MediaWiki-Vagrant users specific


This replaces step 3 from the section above.

  1. Create a code sniffer configuration by clicking on "+" in the Code Sniffer panel.
  2. Select the Remote PHP interpreter as setup for MediaWiki-Vagrant, check Manual:How to debug/with MediaWiki-Vagrant and PHPStorm and MediaWiki-Vagrant/Advanced usage#PhpStorm if you haven't yet.
  3. Select /vagrant/mediawiki/vendor/bin/phpcs as the PHP Code Sniffer path.

Using PHPStorm with a test server


Running unit tests

  1. Go to Settings > Languages & Frameworks > PHP > Test frameworks
  2. Set default configuration file as mediawiki/phpunit.xml (a sample phpunit.xml.dist is part of the repo — create your phpunit.xml by copying it if you haven't already).

Set up database GUI

  1. If you're using a Docker or Vagrant installation, ensure that your database has its port exposed to the host (not applicable if SQLite is used)
  2. Open the "Database" toolbar in IntelliJ.
  3. Create a project data source, by filling in the credentials (host, port, username and password) to connect to the database.

Now, you should be able to browse database contents using the GUI.

Gerrit plugin


There's a third-party plugin for downloading and reviewing Gerrit changes, https://plugins.jetbrains.com/plugin/7272-gerrit. To configure, go to Settings -> Version control -> Gerrit, and set:

  • Web-URL: https://gerrit.wikimedia.org/r/
  • Login: your Gerrit username, e.g. "awight"
  • Password: your HTTPS password for Gerrit
  • Be sure to check "List all Gerrit changes", otherwise you will encounter a 414 error when the plugin tries to download all available projects in one request.

Phab and gerrit linking


References to phab tickets and gerrit patches (in the code or in commit messages on IntelliJ's git GUI) can be made clickable:

  • Go to Preferences > Version Control > Issue Navigation
  • Add the following configurations:
    1. (T\d+)https://phabricator.wikimedia.org/$1
    2. (I[0-9a-f]{6,})https://gerrit.wikimedia.org/r/q/$1

See also