Diviner Phabricator User Docs Arcanist User Guide: Configuring a New Project

Arcanist User Guide: Configuring a New Project
Phabricator User Documentation (Application User Guides)

Explains how to configure Arcanist projects with .arcconfig files.

Overview

In most cases, you should be able to use arc without specifically configuring your project for it. If you want to adjust arc behaviors, you can create a .arcconfig file in your project to provide project-specific settings.

.arcconfig Basics

An .arcconfig file is a JSON file which you check into your project's root.

Arcanist uses .arcconfig files to customize a number of things about its behavior. The first thing you're likely to want to configure is the URI for your Phabricator install. A simple, valid file looks something like this:

.arcconfig
{
  "phabricator.uri" : "https://phabricator.example.com/"
}

For details on available options, see below.

NOTE: You should commit your .arcconfig file! It contains project configuration, not user configuration.

Advanced .arcconfig

Common options are:

  • phabricator.uri: the URI for the Phabricator install that arc should connect to when run in this project. This option was previously called conduit_uri.
  • repository.callsign: The callsign of this repository in Diffusion. Normally, arc can detect this automatically, but if it can't figure it out you can specify it explicitly. Use arc which to understand the detection process.
  • history.immutable: Configures arc to use workflows which never rewrite history in the working copy. By default, arc will perform some rewriting of unpublished history (amending commit messages, squash merging) on some workflows in Git. The distinctions are covered in detail below.

Other options include:

These options are supported, but their use is discouraged:

  • http.basicauth.user: specify an HTTP basic auth username for use when connecting to Phabricator.
  • http.basicauth.pass: specify an HTTP basic auth password for use when connecting to Phabricator.
  • https.blindly-trust-domains: a list of domains to trust blindly over HTTPS, even if their certificates are invalid. This is a brute force solution to certificate validity problems, and is discouraged. Instead, use valid certificates.

For a complete list of options, run arc get-config. Although all options can be set in .arcconfig, some options (like editor) usually do not make sense to set here because they're likely to vary from user to user.

History Mutability

Arcanist workflows run in two broad modes: either history is mutable or immutable. Under a mutable history, arc commands may rewrite the working copy history; under an immutable history, they may not.

You control history mutability by setting history.immutable to true or false in your configuration. By default, it is false in Git (i.e., mutable) and true in Mercurial (i.e., immutable). The sections below explain how these settings affect workflows.

History Mutability: Git

In a workflow with mutable history, you rewrite local history. You develop in feature branches, but squash or amend before pushing by using `git commit --amend`, git rebase -i, or git merge --squash. Generally, one idea in the remote is represented by one commit.

In a workflow with immutable history, you do not rewrite local history. You develop in feature branches and push them without squashing commits. You do not use git commit --amend or git rebase -i. Generally, one idea in the remote is represented by many commits.

Practically, these are the differences you'll see based on your setting:

  • Mutable
    • arc diff will prompt you to amend lint changes into HEAD.
    • arc diff will amend the commit message in HEAD after creating a revision.
    • arc land will default to the --squash strategy.
    • arc amend will amend the commit message in HEAD with information from the corresponding or specified Differential revision.
  • Immutable
    • arc diff will abort if it makes lint changes.
    • arc diff will not amend the commit message in HEAD after creating a revision.
    • arc land will default to the --merge strategy.
    • arc amend will exit with an error message.

History Mutability: Mercurial

Before version 2.2, stock Mercurial has no history mutation commands, so this setting has no effect. With Mercurial 2.2. or newer, making history mutable means:

  • Mutable (versions 2.2 and newer)
    • arc diff will amend the commit message in . after creating a revision.
    • arc amend will amend the commit message in . with information from the corresponding or specified Differential revision.
  • Immutable (or versions prior to 2.2)
    • arc diff will not amend the commit message in . after creating a revision.
    • arc amend will exit with an error message.

How Libraries Are Located

If you specify an external library to load, like 'examplelib', and use a relative path like this:

{
  ...
  "load": [
    "examplelib/src"
  ],
  ...
}

...arc looks for it by trying these paths:

  • path/to/root/examplelib/src/ First, arc looks in the project's root directory (where the .arcconfig lives) to see if the library is part of the project. This makes it easy to just put project-specific code in a project.
  • path/to/root/../examplelib/src/ Next, arc looks next to the project's root directory to see if the library is in a sibling directory. If you work with several repositories, this makes it easy to put all the arc code in one repository and just check it out in the same directory as everything else.
  • php/include/path/examplelib/src Finally, arc falls back to PHP, which will look in paths described in the include_path php.ini setting. This allows you to install libraries in some global location if you prefer.

You can alternately supply an absolute path, like /var/arc/examplelib/src, but then everyone will need to install the library at that exact location.

NOTE: Specify the path to the directory which includes __phutil_library_init__.php. For example, if your init file is in examplelib/src/__phutil_library_init__.php, specify examplelib/src, not just examplelib/.

The general intent here is:

  • Put project-specific code in some directory in the project, like support/arc/src/.
  • Put shared code (e.g., which enforces general coding standards or hooks up to unit tests or whatever) in a separate repository and check it out next to other repositories.
  • Or put everything in some standard location and add it to include_path.

Running Without .arcconfig

Although you don't need to set up .arcconfig, and you can run arc command that require a working copy in any Git, Subversion or Mercurial working copy, some features won't work unless you set up an .arcconfig file.

Without .arcconfig:

  • You will need to set a default Phabricator URI with arc set-config default <uri>, or specify an explicit URI with --conduit-uri each time you run a command.
  • You will not be able to run linters through arc unless you pass --engine explicitly.
  • You will not be able to customize certain linter parameters even with --engine.
  • You will not be able to run unit tests through arc unless you pass --engine explicitly.
  • You will not be able to trigger lint and unit integration through arc diff.
  • You will not be able to put Git working copies into immutable history mode (see below).
  • You will not be able to specify a repository encoding. UTF-8 will be assumed if you do not pass --encoding.
  • You will not be able to add plugins to arc to modify existing workflows or add new ones.
  • You will not be able to load additional libraries unless you specify them explicitly with --load-phutil-library.
  • Symbol index integration, which allows users to click function or class names in Differential and jump to their definitions, will not work.
  • arc patch will be unable to detect that you are applying changes to the wrong project.
  • In Subversion, arc will be unable to determine the canonical root of a project, and will assume it is the working directory (in Subversion prior to 1.7) or the root of the checkout (in Subversion after 1.7). This means the paths of files in diffs won't be anchored to the same place, and will have different amounts of path context, which may be confusing for reviewers and will sometimes prevent patches from applying properly if they are applied against a different directory than they were generated from.
  • In Subversion, arc will be unable to guess that you intend to update an existing revision; you must use --update explicitly or --preview and attach diffs via the web interface.

Next Steps

Continue by: