Rule base configuration
=======================

#### Table of Contents
* [Overview][overview]
* [Rules][rules]
* [Conditions][conditions]
* [Event Properties][event-properties]
* [Actions][actions]

[overview]: #overview
<a name="overview">Overview</a>
-------------------------------

In this part we describe how to specify which events in Gerrit (E.g.:
“Change Merged”, or “User ‘John Doe’ voted ‘+2’ for ‘Code-Review’ on a
change”) trigger which actions (e.g.: “Set issue's status to
‘Resolved’”) on the ITS.

Actions on the ITS and conditions for the action to take place are
configured through the rule bases in `etc/its/actions.config` (for global rules
to be picked up by all configured ITS plugins) and
`etc/its/actions-@PLUGIN@.config` (for rules to be picked up only by @PLUGIN@)
in the site directory. A rule base is a git config file, and may contain an
arbitrary number of rules. Each rule can have an arbitrary number of conditions
and actions. A rule fires all associated actions, once all of its conditions are
met.

A simple `etc/its/actions.config` (or
`etc/its/actions-@PLUGIN@.config`) may look like

```
[rule "rule1"]
    event-type = change-merged
    action = add-standard-comment
[rule "rule2"]
    event-type = comment-added
    approvalCodeReview = -2,-1
    action = add-comment Oh my Goodness! Someone gave a negative code review in Gerrit on an associated change.
```

This snippet defines two rules (`rule1`, and `rule2`). On merging a
change that's associated to some issues, `rule1` adds a predefined
standard comment for “Change Merged” to each such issue. If someone
adds a comment to a change that is associated to some issues and votes
“-2”, or “-1” for “Code-Review”, `rule2` adds the comment “Oh my
Goodness! Someone gave a negative code review in Gerrit on an
associated change.” to each such issue.

The order of rules in `etc/its/actions.config` need not be
respected. So in the above example, do not rely on `rule1` being
evaluated before `rule2`.

[rules]: #rules
<a name="rules">Rules</a>
-------------------------

Each rule consists of three items: A name, a set of conditions, and a
set of actions.

The rule's name (`rule1`, and `rule2` in the above example) is
currently not used and only provided for convenience.

For each rule the option `action` is interpreted as action. Any other
option of a rule is considered a condition.

Each of a rule's actions is taken for events that meet all of a
rule's conditions. If a rule contains more than one action
specifications, the order in which they are given need not be
respected.

There is no upper limit on the number of elements in a rules set of
conditions, and set of actions. Each of those sets may be empty.

[conditions]: #conditions
<a name="conditions">Conditions</a>
-----------------------------------

The conditions are lines of the form

```
  name = value1, value2, ..., valueN
```

and match (if 'value1' is not `!`), if the event comes with a property
'name' having 'value1', or 'value2', or ..., or 'valueN'. So for
example to match events that come with an `association` property
having `subject`, or `footer-Bug`, the following condition can be
used:

```
  association = subject,footer-Bug
```

If 'value1' is `!`, the conditon matches if the event does not come
with a property 'name' having 'value2', or ..., or 'valueN'. So for
example to match events that do not come with a `status` property
having `DRAFT`, the following condition can be used:

```
  status = !,DRAFT
```

[event-properties]: #event-properties
<a name="event-properties">Event Properties</a>
-----------------------------------------------

The properties exposed by events depend on the kind of event.

For all events, the event's class name is provided in the `event`
property. Most native Gerrit events provide the `event-type`
property. So `event-type` (or `event` for other events fired by
plugins) allows you to write filters that fire only for a certain type
of event.

The common properties for each event are

`event`
: The event's class name.

`issue`
: Issue to which this event is associated. Each event is associated to
  exactly one issue. If for example an event is fired for a commit
  message, that would contain more than one issue id (say issue “23”,
  and issue “47”), then the event is duplicated and sent once for each
  associated issue (i.e.: once with `issue` being `23`, and once with
  `issue` being `47`).

`association`
: How the issue of property `issue` got associated to this event.
  See [Property: `association`][property-association].

`its-name`
:   Name of this plugin (i.e.: `@PLUGIN@`). This property can be used to
    make a rule in the rulebase match only for certain ITS plugins, if more
    than one is installed.

    For example

    ```
    [rule "someRuleForBugzillaOnly"]
      its-name = its-bugzilla
      approvalCodeReview = -2
      action = add-comment Heya Bugzilla users, the change had a -2 Code-Review approval.
    [rule "someRuleForJiraOnly"]
      its-name = its-jira
      approvalCodeReview = -2
      action = add-comment Dear JIRA users, the change had a -2 Code-Review approval.
    ```

    would report the “Heya Bugzilla...” text only through its-bugzilla for
    changes that had a -2 Code-Review and have an association through
    its-bugzilla. And for changes that had a -2 Code-Review and have an
    association through its-jira, its-jira would report “Dear Jira users, ...”.

The further properties are listed in the event's
corresponding subsection below:

* [ChangeAbandonedEvent][event-properties-ChangeAbandonedEvent]
* [ChangeMergedEvent][event-properties-ChangeMergedEvent]
* [ChangeRestoredEvent][event-properties-ChangeRestoredEvent]
* [CommentAddedEvent][event-properties-CommentAddedEvent]
* [DraftPublishedEvent][event-properties-DraftPublishedEvent]
* [PatchSetCreatedEvent][event-properties-PatchSetCreatedEvent]
* [RefUpdatedEvent][event-properties-RefUpdatedEvent]
* [Common properties for events on a change][event-properties-change]
* [Common properties for events on a patch set][event-properties-patch-set]

[property-association]: #property-association
### <a name="property-association">Property: `association`</a>

The property `association` describes how the `issue` got associated to
this event.

An event typically has several `association` properties. Possible
values are:

`somewhere`
:   issue id occurs somewhere in the commit message of the change/the
    most recent patch set.

`subject`
:   issue id occurs in the first line of the commit message of the
    change/the most recent patch set.

`body`
:   issue id occurs after the subject but before the footer of the
    commit message of the change/the most recent patch set.

`footer`
:   issue id occurs in the last paragraph after the subject of the
    commit message of the change/the most recent patch set

`footer-<Key>`
:   issue id occurs in the footer of the commit message of the
    change/the most recent patch set, and is in a line with a key
    (part before the colon).

    So for example, if the footer would contain a line

    ```
Fixes-Issue: issue 4711
```

    then a property `association` with value `footer-Fixes-Issue`
    would get added to the event for issue “4711”.

`added@<Association-Value>`
:   (only for events that allow to determine the patch set number.
    So for example, this `association` property is not set for
    RevUpdatedEvents)

    issue id occurs at `<Association-Value>` in the most recent
    patch set of the change, and either the event is for patch set
    1 or the issue id does not occur at `<Association-Value>` in
    the previous patch set.

    So for example if issue “4711” occurs in the subject of patch
    set 3 (the most recent patch set) of a change, but not in
    patch set 2.  When adding a comment to this change, the event
    for issue “4711” would get a property 'association' with value
    `added@subject`.

[event-properties-ChangeAbandonedEvent]: #event-properties-ChangeAbandonedEvent
### <a name="event-properties-ChangeAbandonedEvent">ChangeAbandonedEvent</a>

`abandonerEmail`
: email address of the user abandoning the change.

`abandonerName`
: name of the user abandoning the change.

`abandonerUsername`
: username of the user abandoning the change.

`event`
: `com.google.gerrit.server.events.ChangeAbandonedEvent`

`event-type`
: `change-abandoned`

`reason`
: reason why the change has been abandoned.

In addition to the above properties, the event also provides
properties for the abandoned [Change][event-properties-change], and
its most recent [Patch Set][event-properties-patch-set].

[event-properties-ChangeMergedEvent]: #event-properties-ChangeMergedEvent
### <a name="event-properties-ChangeMergedEvent">ChangeMergedEvent</a>

`event`
: `com.google.gerrit.server.events.ChangeMergedEvent`

`event-type`
: `change-merged`

`submitterEmail`
: email address of the user causing the merge of the change.

`submitterName`
: name of the user causing the merge of the change.

`submitterUsername`
: username of the user causing the merge of the change.

In addition to the above properties, the event also provides
properties for the merged [Change][event-properties-change], and its
most recent [Patch Set][event-properties-patch-set].

[event-properties-ChangeRestoredEvent]: #event-properties-ChangeRestoredEvent
### <a name="event-properties-ChangeRestoredEvent">ChangeRestoredEvent</a>

`event`
: `com.google.gerrit.server.events.ChangeRestoredEvent`

`event-type`
: `change-restored`

`reason`
: reason why the change has been restored.

`restorerEmail`
: email address of the user restoring the change.

`restorerName`
:  name of the user restoring the change.

`restorerUsername`
: username of the user restoring the change.

In addition to the above properties, the event also provides
properties for the restored [Change][event-properties-change], and it's
most recent [Patch Set][event-properties-patch-set].

[event-properties-CommentAddedEvent]: #event-properties-CommentAddedEvent
### <a name="event-properties-CommentAddedEvent">CommentAddedEvent</a>

NOTE: For consistency with the other events, the `author-...`
properties of the CommentAddedEvent do not refer to the author of the
comment, but refer to the author of the change's latest patch set. The
author of the comment is accessible via the `commenter-...`
properties.

`commenterEmail`
: email address of the comment's author.

`commenterName`
: name of the comment's author.

`commenterUsername`
: username of the comment's author.

`comment`
: added comment itself.

`event`
: `com.google.gerrit.server.events.CommentAddedEvent+

`event-type`
: `comment-added`

For each new or changed approval that has been made for this change, a
property of key `approval<LabelName>` and the approval's value as
value is added. So for example voting “-2” for the approval
“Code-Review” would add the following property:

`approvalCodeReview`
: `-2`

In addition to the above properties, the event also provides
properties for the [Change][event-properties-change] the comment was
added for, and it's most recent [Patch Set][event-properties-patch-set].

[event-properties-DraftPublishedEvent]: #event-properties-DraftPublishedEvent
### <a name="event-properties-DraftPublishedEvent">DraftPublishedEvent</a>

`event`
: `com.google.gerrit.server.events.DraftPublishedEvent`

`event-type`
: `draft-published`

In addition to the above properties, the event also provides
properties for the uploaded [Patch Set][event-properties-patch-set],
and the [Change][event-properties-change] it belongs to.

[event-properties-PatchSetCreatedEvent]: #event-properties-PatchSetCreatedEvent
### <a name="event-properties-PatchSetCreatedEvent">PatchSetCreatedEvent</a>

`event`
: `com.google.gerrit.server.events.PatchSetCreatedEvent`

`event-type`
: `patchset-created`

In addition to the above properties, the event also provides
properties for the uploaded [Patch Set][event-properties-patch-set],
and the [Change][event-properties-change] it belongs to.

[event-properties-RefUpdatedEvent]: #event-properties-RefUpdatedEvent
### <a name="event-properties-RefUpdatedEvent">RefUpdatedEvent</a>

`event`
: `com.google.gerrit.server.events.RefUpdatedEvent`

`event-type`
: `ref-updated`

`project`
: full name of the project from which a ref was updated.

`ref`
: git ref that has been updated (Typcially the branch, as for example
  `master`).

`revision`
: git commit hash the rev is pointing to now.

`revisionOld`
: git commit hash the rev was pointing to before.

`submitterEmail`
: email address of the user that updated the ref.

`submitterName`
: name of the user that updated the ref.

`submitterUsername`
: username of the user that updated the ref.

[event-properties-change]: #event-properties-change
### <a name="event-properties-change">Common properties for events on a change</a>

`branch`
: name of the branch the change belongs to.

`changeId`
: Change-Id for the change („I-followed by 40 hex digits” string).

`changeNumber`
: number for the change (plain integer).

`changeUrl`
: url of the change.

`formatChangeUrl`
: format the url for changeUrl.

`ownerEmail`
: email address of the change's owner.

`ownerName`
: name of the change's owner.

`ownerUsername`
: username of the change's owner.

`project`
: full name of the project the change belongs to.

`subject`
: first line of the change's most recent patch set's commit message.

`commitMessage`
: full commit message of the most recent patch set

`status`
:   status of the change (`null`, `NEW`, `SUBMITTED`, `DRAFT`, `MERGED`,
    or `ABANDONED` )

`topic`
: name of the topic the change belongs to.

[event-properties-patch-set]: #event-properties-patch-set
### <a name="event-properties-patch-set">Common properties for events on a patch set</a>

`authorEmail`
: email address of this patch set's author.

`authorName`
: name of this patch set's author.

`authorUsername`
: username of this patch set's author.

`created-on`
: Timestamp of creation of the patch set (Seconds since 1st January 1970).

`deletions`
: number of lines deleted by the patch set.

`insertions`
: number of lines inserted by the patch set.

`isDraft`
: 'true', if the patch set is a draft patch set, 'false' otherwise.

`parents`
: A list of git commit hashes that are parents to the patch set.

`patchSetNumber`
: patch set's number within the change.

`ref`
: git ref for the patch set (For the 5-th patch set of change 4711, this
  will be `refs/changes/11/4711/5`).

`revision`
: git commit hash of the patch set

`uploaderEmail`
: email address of the user that uploaded this patch set.

`uploaderName`
: name of the user that uploaded this patch set.

`uploaderUsername`
: username of the user that uploaded this patch set.

[actions]: #actions
<a name="actions">Actions</a>
-----------------------------

Lines of the form

```
  action = name param1 param2 ... paramN
```

represent the action `name` being called with parameters `param1`,
`param2`, ... `paramN`.

The following actions are available:

[`add-comment`][action-add-comment]
: adds the parameters as issue comment

[`add-standard-comment`][action-add-standard-comment]
: adds a predefined standard comment for certain events

[`add-velocity-comment`][action-add-velocity-comment]
: adds a rendered Velocity template as issue comment

[`add-soy-comment`][action-add-velocity-comment]
: adds a rendered Closure Template (soy) template as issue comment

[`log-event`][action-log-event]
: appends the event's properties to Gerrit's log

[Further actions][further-actions] may be provided by @PLUGIN@.

[further-actions]: config-rulebase-plugin-actions.md

[action-add-comment]: #action-add-comment
### <a name="action-add-comment">Action: add-comment</a>

The `add-comment` action adds the given parameters as comment to any
associated rule.

So for example

```
  action = add-comment This is a sample command
```

would add a comment “This is a sample command” to associated issues.

If no parameters are given, no comment gets added.

[action-add-standard-comment]: #action-add-standard-comment
### <a name="action-add-standard-comment">Action: add-standard-comment</a>

The `add-standard-comment` action adds predefined comments to
associated issues for change abandoned, merged, restored, and patch
set created events. For other events, no comment is added to the
associated issues.

The added comments contain the person responsible for the event
(abandoner, merger, ...), the change's subject, a reason (if one has
been given), and a link to the change.

[action-add-velocity-comment]: #action-add-velocity-comment
### <a name="action-add-velocity-comment">Action: add-velocity-comment</a>

The `add-velocity-comment` action renders a Velocity template for the
event and adds the output as comment to any associated issue.

So for example

```
  action = add-velocity-comment TemplateName
```

would render the template `etc/its/templates/TemplateName.vm` add the
output as comment to associated issues.

If 'TemplateName' is `inline`, the Velocity template to render is not
loaded from a file, but the template is built by joining the remaining
parameters. So for example

```
  action = add-velocity-comment inline Sample template using $subject property.
```

would render “Sample template using $subject property.” as Velocity
template.

If 'TemplateName' is not `inline`, further parameters get ignored.

Any [property][event-properties] of the event may be used from
templates. So for example `$subject` in the above example refers to
the event's subject property, and `$changeNumber` would refer to the
change's number.

Additionally, the context's `its` property provides an object that
allows to format links using the its' syntax:

`formatLink( url )`
:   Formats a link to a url.

    So for example upon adding a comment to a change, the
    following rule formats a link to the change:

    ```
[rule "formatLinkSampleRule"]
  event-type = comment-added
  action = add-velocity-comment inline Comment for change $change-number added. See ${its.formatLink($changeUrl)}
```

`formatLink( url, caption )`
:   Formats a link to a url using 'caption' to represent the url.

    So for example upon adding a comment to a change, the following rule
    formats a link to the change using the change number as link
    capition:

    ```
[rule "formatLinkSampleRule"]
  event-type = comment-added
  action = add-velocity-comment inline Comment for change ${its.formatLink($changeUrl, $changeNumber)} added.
```

[action-add-soy-comment]: #action-add-soy-comment
### <a name="action-add-soy-comment">Action: add-soy-comment</a>

The `add-soy-comment` action renders a Closure template (soy) for the
event and adds the output as comment to any associated issue.

So for example

```
  action = add-soy-comment TemplateName
```

would render the template `etc/its/templates/TemplateName.soy` add the
output as comment to associated issues.

example for what the soy template will look like (note @param is required with correct variables.)


```
{namespace etc.its.templates}

/**
 * @param changeNumber
 * @param formatChangeUrl
 */
{template .TemplateName autoescape="strict" kind="text"}
  inline Comment for change {$changeNumber} added. See {$formatChangeUrl}
{/template}
```

Any [property][event-properties] of the event may be used from
templates. So for example `$subject` in the above example refers to
the event's subject property, and `$changeNumber` would refer to the
change's number.

[action-log-event]: #action-log-event
### <a name="action-log-event">Action: log-event</a>

The `log-event` action appends the event's properties to Gerrit's log.

Logging happens at the info level per default, but can be overriden by
adding the desired log level as parameter. Supported values are
`error`, `warn`, `info`, and `debug`). So for example

```
  action = log-event error
```

appends the event's properties to Gerrit's log at error level. All
other parameters are ignored.

This action is useful, when testing rules or trying to refine
conditions on rules, as it make the available properties visible.

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

[index]: index.html
