Skip to content
This repository was archived by the owner on Aug 31, 2023. It is now read-only.

Commit c3047e3

Browse files
author
Alex Burka
committed
detect multiple JIRA ticket IDs
1 parent adeebb9 commit c3047e3

File tree

1 file changed

+45
-53
lines changed

1 file changed

+45
-53
lines changed

js/content.js

+45-53
Original file line numberDiff line numberDiff line change
@@ -332,35 +332,40 @@
332332
// -----------------------------------------------
333333
// Jira ticket link (data attributes are set in setDataAttributesToNode, above)
334334

335-
if (('jiraTicketId' in mergeRequestNode.dataset) && ('jiraTicketUrl' in mergeRequestNode.dataset)) {
336-
let jiraTicketLinkToolip = null;
337-
let jiraTicketLinkLabel = null;
338-
339-
switch (this.preferences.jira_ticket_link_label_type) {
340-
case 'ticket_id':
341-
jiraTicketLinkLabel = mergeRequestNode.dataset.jiraTicketId;
342-
343-
break;
344-
case 'icon':
345-
jiraTicketLinkLabel = this.buildSpriteIcon('issues');
346-
jiraTicketLinkToolip = 'Jira ticket ' + mergeRequestNode.dataset.jiraTicketId;
347-
348-
break;
349-
default:
350-
console.error('Invalid link label type ' + this.preferences.jira_ticket_link_label_type);
351-
}
352-
353-
if (jiraTicketLinkLabel) {
354-
let jiraTicketLink = '<a href="' + mergeRequestNode.dataset.jiraTicketUrl + '" ' +
355-
'class="issuable-milestone ' + (jiraTicketLinkToolip ? 'has-tooltip' : '') + '" ' +
356-
(jiraTicketLinkToolip ? 'title="' + jiraTicketLinkToolip + '"' : '') + '>' +
357-
jiraTicketLinkLabel +
358-
'</a> ';
359-
360-
this.parseHtmlAndInsertBefore(
361-
mergeRequestNode.querySelector('.merge-request-title-text'),
362-
jiraTicketLink
363-
);
335+
if (('jiraTicketIds' in mergeRequestNode.dataset) && ('jiraTicketUrls' in mergeRequestNode.dataset)) {
336+
let ticket_ids = mergeRequestNode.dataset.jiraTicketIds.split(',');
337+
let ticket_urls = mergeRequestNode.dataset.jiraTicketUrls.split(',');
338+
339+
for (let i = 0; i < ticket_ids.length; i++) {
340+
let jiraTicketLinkToolip = null;
341+
let jiraTicketLinkLabel = null;
342+
343+
switch (this.preferences.jira_ticket_link_label_type) {
344+
case 'ticket_id':
345+
jiraTicketLinkLabel = ticket_ids[i];
346+
347+
break;
348+
case 'icon':
349+
jiraTicketLinkLabel = this.buildSpriteIcon('issues');
350+
jiraTicketLinkToolip = 'Jira ticket ' + ticket_ids[i];
351+
352+
break;
353+
default:
354+
console.error('Invalid link label type ' + this.preferences.jira_ticket_link_label_type);
355+
}
356+
357+
if (jiraTicketLinkLabel) {
358+
let jiraTicketLink = '<a style="margin-right: 0.35em" href="' + ticket_urls[i] + '" ' +
359+
'class="issuable-milestone ' + (jiraTicketLinkToolip ? 'has-tooltip' : '') + '" ' +
360+
(jiraTicketLinkToolip ? 'title="' + jiraTicketLinkToolip + '"' : '') + '>' +
361+
jiraTicketLinkLabel +
362+
'</a>';
363+
364+
this.parseHtmlAndInsertBefore(
365+
mergeRequestNode.querySelector('.merge-request-title-text'),
366+
jiraTicketLink
367+
);
368+
}
364369
}
365370
}
366371

@@ -446,37 +451,24 @@
446451
mergeRequestNode.dataset.isWip = mergeRequest.work_in_progress;
447452

448453
if (this.preferences.enable_jira_ticket_link) {
449-
let jiraTicketId = this.findFirstJiraTicketId(mergeRequest);
450-
451-
if (jiraTicketId) {
452-
mergeRequestNode.dataset.jiraTicketId = jiraTicketId;
453-
mergeRequestNode.dataset.jiraTicketUrl = this.createJiraTicketUrl(jiraTicketId);
454-
}
454+
let jiraTicketIds = this.findJiraTicketIds(mergeRequest);
455+
mergeRequestNode.dataset.jiraTicketIds = jiraTicketIds;
456+
mergeRequestNode.dataset.jiraTicketUrls = jiraTicketIds.map(id => this.createJiraTicketUrl(id));
455457
}
456458
}
457459

458460
/**
459461
* Finds a Jira ticket ID in the given Merge Request object. It first tris in the source branch name, then
460462
* fallbacks to the Merge Request title.
461463
*/
462-
findFirstJiraTicketId(mergeRequest) {
463-
let jiraTicketIdRegex = new RegExp('[A-Z]{1,10}-\\d+');
464-
465-
// First try in the source branch name
466-
let results = jiraTicketIdRegex.exec(mergeRequest.source_branch);
464+
findJiraTicketIds(mergeRequest) {
465+
let jiraTicketIdRegex = /[A-Z]{1,10}-\d+/g;
467466

468-
if (results) {
469-
return results[0];
470-
}
471-
472-
// Fallback to the Merge Request title if none found in the source branch name
473-
results = jiraTicketIdRegex.exec(mergeRequest.title);
474-
475-
if (results) {
476-
return results[0];
477-
}
467+
// Check in the source branch name and the merge request title
468+
let results = [...mergeRequest.source_branch.matchAll(jiraTicketIdRegex)].concat([...mergeRequest.title.matchAll(jiraTicketIdRegex)]);
478469

479-
return null;
470+
// Get unique elements
471+
return results.map(v => v[0]).filter((v,i,a) => a.indexOf(v) === i);
480472
}
481473

482474
/**
@@ -595,8 +587,8 @@
595587
MR_STATUS: mergeRequestNode.dataset.status,
596588
MR_SOURCE_BRANCH_NAME: mergeRequestNode.dataset.sourceBranchName,
597589
MR_TARGET_BRANCH_NAME: mergeRequestNode.dataset.targetBranchName,
598-
MR_JIRA_TICKET_ID: ('jiraTicketId' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketId : '',
599-
MR_JIRA_TICKET_URL: ('jiraTicketUrl' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketUrl : ''
590+
MR_JIRA_TICKET_ID: ('jiraTicketIds' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketIds.replaceAll(',', ', ') : '',
591+
MR_JIRA_TICKET_URL: ('jiraTicketUrls' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketUrls.replaceAll(',', ', ') : ''
600592
};
601593

602594
let placeholdersReplaceRegex = new RegExp('{(' + Object.keys(placeholders).join('|') + ')}', 'g');

0 commit comments

Comments
 (0)