Overview

Raw html substitution will no longer be an option for comment links.

The raw-html option for commentlink sections is deprecated and removed. Example:

[commentlink "issue b/"]
  match = (^|\\s)b/(\\d+)
  html = $1<a href=\"http://b/issue?id=$2&query=$2\" target=\"_blank\">b/$2</a>

Before it allowed to find and replace text matches in commit messages and comments with arbitrary html. When misconfigured this has in the past enabled injecting undesired html code and XSS attacks by writing a comment.

Even though the sanitization of the resulting html has improved. This feature is more powerful than needed. In almost all cases across host configurations html is only used to either configure text of the link, or limit the link to wrap only a portion of the matched text.

To fill the gap in functionality from deprecating the option additional optional parameters (prefix, suffix and text) have been added. They allow to generate links that look like:

  PREFIX<a href="LINK">TEXT</a>SUFFIX

With substitution being strictly plaintext and all html escaped.

The comment link section in project configs (in refs/meta/config) never supported the raw-html option and don't need to be updated.

Config migration command

CONFIG_FILE=<path to gerrit.config file>
perl -0pe 's/([ \t]*)html\s*=\s*\"(.*)<a.* href=(?:\\\"(\S+)\\\"|(\S+)(?=\s|>))(?: .*)?>(.*)<\/a>(.*)(?<!\\)\"/$1link = \"$3$4\"\n$1prefix = \"$2\"\n$1text = \"$5\"\n$1suffix = \"$6\"/g' $CONFIG_FILE |
perl -0pe 's/([ \t]*)html\s*=\s*(\S.*)?<a.* href=(?:\\\"(\S+)\\\"|(\S+)(?=\s|>))(?: .*)?>(.*)<\/a>(.*\S)?/$1link = \"$3$4\"\n$1prefix = \"$2\"\n$1text = \"$5\"\n$1suffix = \"$6\"/g' |
perl -ne 'print if !/\s*(prefix|suffix|text)\s*=\s*\"\"/'

The command does 3 simple string replace passes:

  1. Replace html=<value> with quote-escaped value.
  2. Replace html=<value> with value without quotes.
  3. Remove empty prefix, suffix, text fields.