Skip to content

Instantly share code, notes, and snippets.

@monitorjbl
Created April 18, 2016 00:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save monitorjbl/1e5660860c2fc9e4d1ea4393ef83756f to your computer and use it in GitHub Desktop.
Save monitorjbl/1e5660860c2fc9e4d1ea4393ef83756f to your computer and use it in GitHub Desktop.
define('scriptrunner/auto-reviewers', [
'jquery',
'underscore',
'bitbucket/util/events',
'exports'
], function ($,
_,
events,
exports) {
var mandatoryReviewersMap = {}, mandatoryReviewers = [], mandatoryReviewersIDs = [];
function mapUser(userList, isMandatory) {
return _.map(userList, function (element) {
return {
id: element.user.name,
item: element.user,
text: element.user.displayName,
locked: isMandatory
};
});
}
function addRevPRCreate(userSelect, source, dest) {
$.ajax(AJS.contextPath() + '/rest/scriptrunner-bitbucket/latest/auto-reviewers/byRef',
{
data: {
fromRepoId: source.repo,
from: source.branch,
toRepoId: dest.repo,
to: dest.branch
},
error: function (xhr, status, errorMsg) {
console.error(status + ' ' + errorMsg);
},
success: function (data) {
userSelect.data(mapUser(data.mandatory, true).concat(mapUser(data.suggested, false)));
}
}
);
}
function getPRDataFromPage() {
var dataSection = $('section#content');
var pullRequest = null;
if (dataSection.length) {
pullRequest = {
projectKey: dataSection.data('projectkey'),
repoSlug: dataSection.data('reposlug'),
pullRequestId: dataSection.data('pullrequestid'),
toBranchRef: $('input#toRef-field').val()
}
}
return pullRequest;
}
function addRevPREdit(userSelect) {
$.ajax(AJS.contextPath() + '/rest/scriptrunner-bitbucket/latest/auto-reviewers/byPullRequestId',
{
data: getPRDataFromPage(),
error: function (xhr, status, errorMsg) {
console.error(status + ' ' + errorMsg);
},
success: function (data) {
mandatoryReviewers = mapUser(data.mandatory, true);
_.each(mandatoryReviewers, function (reviewer) {
mandatoryReviewersMap[reviewer.item.id] = reviewer;
});
setUserSelect(userSelect, data.mandatory);
}
}
);
}
function setUserSelect(userSelect, mandatoryReviewers) {
var currentReviewers = userSelect.data(), userSelectIDs = getUserIDs(currentReviewers), sharedElements = _.without(mandatoryReviewersIDs, userSelectIDs);
mandatoryReviewersIDs = getUserIDs(mandatoryReviewers);
var missing = _.difference(mandatoryReviewersIDs, userSelectIDs);
if (missing) {
currentReviewers = currentReviewers.concat(_.map(missing, function (missingReviewer) {
return mandatoryReviewersMap[missingReviewer];
}));
}
_.each(currentReviewers, function (reviewer) {
if (_.contains(sharedElements, reviewer.item.id) || _.contains(_.intersection(userSelectIDs, mandatoryReviewersIDs), reviewer.item.id)) {
reviewer.locked = "true";
}
});
userSelect.data(currentReviewers);
}
function getUserIDs(reviewers) {
return _.map(reviewers, function (reviewer) {
if (reviewer.id === undefined) {
return reviewer.user.id;
} else {
return reviewer.item.id;
}
});
}
function onEvent(event, func) {
events.off(event, func);
events.on(event, func);
}
exports.init = function () {
_.defer(function () {
onEvent('bitbucket.model.page-state.changed.targetBranch', exports.addUsersToReviewers);
$('div#edit-pull-request-dialog fieldset.pull-request-details').livequery(function () {
exports.addUsersToReviewers();
onEvent('bitbucket.feature.repository.revisionReferenceSelector.revisionRefChanged', exports.addUsersToReviewers);
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
// do not send data for POST/GET/DELETE
if (originalOptions.type !== 'PUT' || options.type !== 'PUT') {
return;
}
var requestData = AJS.$.parseJSON(options.data);
var existentReviewersIDs = _.map(requestData.reviewers, function (reviewer) {
return reviewer.user.id
});
var newReviewersIDs = _.difference(mandatoryReviewersIDs, existentReviewersIDs);
if (newReviewersIDs) {
var missingReviewers = _.filter(mandatoryReviewers, function (reviewer) {
return _.contains(newReviewersIDs, reviewer.item.id);
}).map(function (user) {
return {user: user.item}
});
requestData.reviewers = requestData.reviewers.concat(missingReviewers);
options.data = JSON.stringify(requestData);
}
});
});
$('div.pull-request-create-form #s2id_reviewers:visible').livequery(function () {
exports.addUsersToReviewers();
});
});
};
exports.addUsersToReviewers = function () {
var sourceRepo = $('input[name=fromRepoId]').val();
var sourceBranch = $('input[name=fromBranch]').val();
var destRepo = $('input[name=toRepoId]').val();
var destBranch = $('input[name=toBranch]').val();
// Available in Edit Mode
var destBranchEditMode = $('input#toRef-field').val();
var userSelect = $('.field-group.pull-request-reviewers #reviewers').data('select2');
if (destBranchEditMode) {
addRevPREdit(userSelect)
} else {
if (sourceRepo && sourceBranch && destRepo && destBranch) {
addRevPRCreate(userSelect, {
repo: sourceRepo,
branch: sourceBranch
}, {
repo: destRepo,
branch: destBranch
});
}
}
}
});
AJS.$(document).ready(function () {
return function () {
require('scriptrunner/auto-reviewers').init();
};
}(AJS.$));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment