diff options
author | Thomas Draebing <thomas.draebing@sap.com> | 2020-01-20 11:47:12 +0100 |
---|---|---|
committer | Thomas Dräbing <thomas.draebing@sap.com> | 2020-01-31 08:58:08 +0000 |
commit | 5f948ecf1de2195e479513db0d8a40d45f635410 (patch) | |
tree | e1d3149180a1b1874a31dec3d3d5deab78756a33 | |
parent | 720d0af16dfc334cd5d2a660a4ab2f728888c3b2 (diff) |
Fix commentlinks with same prefix in pattern and link
If using the commentlinks.%NAME%.links option and having the same prefix
in the pattern and the url, the parsing did not work properly.
For example:
[commentlink "test"]
pattern = [Hh][Tt][Tt][Pp]example
link = http://example.com
and the line in the message:
httpexample 1234
would result in:
http<a href="://example.com" ...>httpexample 1234</a>
This bug was introduced in a change implementing the possibility to
have overlapping patterns, e.g. allowing a comma-separated list of
issue ids. (commit: fb48902ef303d008c6f0dd38d654106c00313530). This
would have however anyway only worked for the `html`-variant of
comment links, which allow to directly provide html-elements as a
substitute for the text matching the pattern.
Thus, this change restricts the logic introduced in the above mentioned
commit to the html-variant.
Bug: Issue 12197
Change-Id: I9efd9308f2b40f3fec8405c93849d13d4576562a
-rw-r--r-- | polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html | 16 | ||||
-rw-r--r-- | polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js | 19 |
2 files changed, 26 insertions, 9 deletions
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html index 6d413b7fab..19839a8c57 100644 --- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html +++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html @@ -50,6 +50,10 @@ limitations under the License. match: '([Bb]ug|[Ii]ssue)\\s*#?(\\d+)', link: 'https://bugs.chromium.org/p/gerrit/issues/detail?id=$2', }, + prefixsameinlinkandpattern: { + match: '([Hh][Tt][Tt][Pp]example)\\s*#?(\\d+)', + link: 'https://bugs.chromium.org/p/gerrit/issues/detail?id=$2', + }, changeid: { match: '(I[0-9a-f]{8,40})', link: '#/q/$1', @@ -116,6 +120,18 @@ limitations under the License. assert.equal(linkEl.textContent, 'Bug 3650'); }); + test('Pattern with same prefix as link was correctly parsed', () => { + // Pattern starts with the same prefix (`http`) as the url. + element.content = 'httpexample 3650'; + + assert.equal(element.$.output.childNodes.length, 1); + const linkEl = element.$.output.childNodes[0]; + const url = 'https://bugs.chromium.org/p/gerrit/issues/detail?id=3650'; + assert.equal(linkEl.target, '_blank'); + assert.equal(linkEl.href, url); + assert.equal(linkEl.textContent, 'httpexample 3650'); + }); + test('Change-Id pattern was parsed and linked', () => { // "Change-Id:" pattern. const changeID = 'I11d6a37f5e9b5df0486f6c922d8836dfa780e03e'; diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js index 23a71f99e3..027c632e12 100644 --- a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js +++ b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js @@ -312,14 +312,15 @@ let result = match[0].replace(pattern, patterns[p].html || patterns[p].link); - let i; - // Skip portion of replacement string that is equal to original. - for (i = 0; i < result.length; i++) { - if (result[i] !== match[0][i]) { break; } - } - result = result.slice(i); - if (patterns[p].html) { + let i; + // Skip portion of replacement string that is equal to original to + // allow overlapping patterns. + for (i = 0; i < result.length; i++) { + if (result[i] !== match[0][i]) { break; } + } + result = result.slice(i); + this.addHTML( result, susbtrIndex + match.index + i, @@ -329,8 +330,8 @@ this.addLink( match[0], result, - susbtrIndex + match.index + i, - match[0].length - i, + susbtrIndex + match.index, + match[0].length, outputArray); } else { throw Error('linkconfig entry ' + p + |