Common configuration for `its-base`-based plugins
=================================================

#### Table of Contents
* [Identifying ITS ids][identifying-its-ids]
* [Enabling ITS integration][enabling-its-integration]
* [Configuring rules of when to take which actions in the ITS][configure-rules]
* [Legacy configuration][legacy-configuration]



[identifying-its-ids]: #identifying-its-ids
<a name="identifying-its-ids">Identifying ITS ids</a>
-----------------------------------------------------

In order to extract ITS ids from commit messages, @PLUGIN@ uses
[commentlink][upstream-comment-link-doc]s of name "`@PLUGIN@`".

The first group of `commentlink.@PLUGIN@.match` is considered the
issue id.

So for example having

```
[commentLink "@PLUGIN@"]
    match = [Bb][Uu][Gg][ ]*([1-9][0-9]*)
    html = "<a href=\"http://my.issure.tracker.example.org/show_bug.cgi?id=$1\">(bug $1)</a>"
    association = SUGGESTED
```

in `etc/gerrit.config` would allow to match the issues `4711`, `167`
from a commit message like

```
Sample commit message relating to bug 4711, and bug 167.
```

By setting a `commentlink`'s `association` (see above's example), it
is possible to require commits to carry ITS references; the following
values are supported (default is `OPTIONAL`):

MANDATORY
:	 One or more issue-ids are required in the git commit message, otherwise
	 the git push will be rejected.

SUGGESTED
:	 Whenever the git commit message does not contain one or more issue-ids,
	 a warning message is displayed as a suggestion on the client.

OPTIONAL
:	 Bug-ids are liked when found in the git commit message, no warning is
	 displayed otherwise.



[enabling-its-integration]: #enabling-its-integration
<a name="enabling-its-integration">Enabling ITS integration</a>
---------------------------------------------------------------

It can be configured per project whether the issue tracker
integration is enabled or not. To enable the issue tracker integration
for a project the project must have the following entry in its
`project.config` file in the `refs/meta/config` branch:

```
  [plugin "@PLUGIN@"]
    enabled = true
```

If `plugin.@PLUGIN@.enabled` is not specified in the `project.config`
file the value is inherited from the parent project. If it is not
set on any parent project the issue integration is disabled for this
project.

By setting `plugin.@PLUGIN@.enabled` to true in the `project.config`
of the `All-Projects` project the issue tracker integration can be
enabled by default for all projects. During the initialization of the
plugin you are asked if the issue integration should be enabled by
default for all projects and if yes this setting in the
`project.config` of the `All-Projects` project is done automatically.

With this it is possible to support integration with multiple
issue tracker systems on a server. E.g. a project can choose if it
wants to enable integration with Jira or with Bugzilla.

If child projects must not be allowed to disable the issue tracker
system integration a project can enforce the issue tracker system
integration for all child projects by setting
`plugin.@PLUGIN@.enabled` to `enforced`.

The issue tracker system integration can be limited to specific
branches by setting `plugin.@PLUGIN@.branch`. The branches may be
configured using explicit branch names, ref patterns, or regular
expressions. Multiple branches may be specified.

E.g. to limit the issue tracker system integration to the `master`
branch and all stable branches the following could be configured:

```
  [plugin "@PLUGIN@"]
    enabled = true
    branch = refs/heads/master
    branch = ^refs/heads/stable-.*
```



[configure-rules]: #configure-rules
<a name="configure-rules">Configuring rules of when to take which actions in the ITS</a>
----------------------------------------------------------------------------------------

Setting up which event in Gerrit (E.g.: “Change Merged”, or “User
‘John Doe’ voted ‘+2’ for ‘Code-Review’ on a change”) should trigger
which action on the ITS (e.g.: “Set issue's status to ‘Resolved’”) is
configured through a [rule base][rule-base] in
`etc/its/actions.config`.

[rule-base]: config-rulebase-common.html



[multiple-its]: #multiple-its
<a name="mutiple-its">Multiple ITS</a>
--------------------------------------

Although not a common setup the @PLUGIN@ plugin supports connecting
Gerrit to multiple issue tracking systems.

For example users may want to reference issues from two independent
issue tracking systems (i.e. a Bugzilla and a Jira instance).  In
this configuration you can simply install both its plugins and
configure them as described.

In situations where users want to reference issues from multiple
instances of the same issue tracking system (i.e. two independent
Bugzilla instances) they can simply create two its-bugzilla plugin
files with different names (i.e. its-bugzilla-external.jar and
its-bugzilla-internal.jar).  Gerrit will give each plugin the same
name as the file name (minus the extension).  You can view the names
by going to the Gerrit UI under menu Plugins -> Installed.  Now you
just need to use the appropriate name to configure each plugin.




[legacy-configuration]: #legacy-configuration
<a name="legacy-configuration">Legacy configuration</a>
-------------------------------------------------------

In this section we present the legacy configuration that uses
`etc/gerrit.config` directly. As this legacy part will be removed at
some point, please upgrade to the rule [rule based
approach][rule-base].

The following configuration settings are available:

`@PLUGIN@.commentOnChangeAbandoned`
:	If true, abandoning a change adds an ITS comment to the change's
	associated issue.

	Default is `true`.

`@PLUGIN@.commentOnChangeCreated`
:	If true, creating a change adds an ITS comment to the change's
	associated issue.

	Default is `false`.

`@PLUGIN@.commentOnChangeMerged`
:	If true, merging a change's patch set adds an ITS comment to
	the change's associated issue.

	Default is `true`.

`@PLUGIN@.commentOnChangeRestored`
:	If true, restoring an abandoned change adds an ITS comment to
	the change's associated issue.

	Default is `true`.

`@PLUGIN@.commentOnCommentAdded`
:	If true, adding a comment and/or review to a change in Gerrit
	adds an ITS comment to the change's associated issue.

	Default is `true`.

`@PLUGIN@.commentOnFirstLinkedPatchSetCreated`
:	If true, creating a patch set for a change adds an ITS comment
	to the change's associated issue, if the issue has not been
	mentioned in previous patch sets of the same change.

	Default is `false`.

`@PLUGIN@.commentOnPatchSetCreated`
:	If true, creating a patch set for a change adds an ITS comment
	to the change's associated issue.

	Default is `true`.

`@PLUGIN@.commentOnRefUpdatedGitWeb`
:	If true, updating a ref adds a GitWeb link to the associated
	issue.

	Default is `true`.

[Back to @PLUGIN@ documentation index][index]

[index]: index.html
