2016-12-13 22:01:05 -05:00
|
|
|
/* eslint-disable max-len, no-var, func-names, space-before-function-paren, vars-on-top, no-plusplus, comma-dangle, no-return-assign, consistent-return, no-param-reassign, one-var, one-var-declaration-per-line, quotes, prefer-template, no-else-return, prefer-arrow-callback, no-unused-vars, no-underscore-dangle, no-shadow, no-mixed-operators, template-curly-spacing, camelcase, default-case, wrap-iife, semi, padded-blocks */
|
|
|
|
/* global notify */
|
|
|
|
/* global notifyPermissions */
|
|
|
|
/* global merge_request_widget */
|
|
|
|
/* global Turbolinks */
|
|
|
|
|
|
|
|
((global) => {
|
2016-07-24 16:45:11 -04:00
|
|
|
var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
|
|
|
|
2016-10-04 10:03:13 -04:00
|
|
|
const DEPLOYMENT_TEMPLATE = `<div class="mr-widget-heading" id="<%- id %>">
|
|
|
|
<div class="ci_widget ci-success">
|
|
|
|
<%= ci_success_icon %>
|
|
|
|
<span>
|
|
|
|
Deployed to
|
|
|
|
<a href="<%- url %>" target="_blank" class="environment">
|
|
|
|
<%- name %>
|
|
|
|
</a>
|
|
|
|
<span class="js-environment-timeago" data-toggle="tooltip" data-placement="top" data-title="<%- deployed_at_formatted %>">
|
|
|
|
<%- deployed_at %>
|
|
|
|
</span>
|
|
|
|
<a class="js-environment-link" href="<%- external_url %>" target="_blank">
|
|
|
|
<i class="fa fa-external-link"></i>
|
|
|
|
View on <%- external_url_formatted %>
|
|
|
|
</a>
|
|
|
|
</span>
|
2016-10-17 17:10:43 -04:00
|
|
|
<span class="stop-env-container js-stop-env-link">
|
2016-10-17 10:13:19 -04:00
|
|
|
<a href="<%- stop_url %>" class="close-evn-link" data-method="post" rel="nofollow" data-confirm="Are you sure you want to stop this environment?">
|
2016-10-17 06:44:08 -04:00
|
|
|
<i class="fa fa-stop-circle-o"/>
|
|
|
|
Stop environment
|
|
|
|
</a>
|
|
|
|
</span>
|
2016-10-04 10:03:13 -04:00
|
|
|
</div>
|
|
|
|
</div>`;
|
|
|
|
|
2016-12-13 22:01:05 -05:00
|
|
|
global.MergeRequestWidget = (function() {
|
2016-07-24 16:45:11 -04:00
|
|
|
function MergeRequestWidget(opts) {
|
2016-07-26 23:32:10 -04:00
|
|
|
// Initialize MergeRequestWidget behavior
|
|
|
|
//
|
|
|
|
// check_enable - Boolean, whether to check automerge status
|
|
|
|
// merge_check_url - String, URL to use to check automerge status
|
|
|
|
// ci_status_url - String, URL to use to check CI status
|
|
|
|
//
|
2016-07-24 16:45:11 -04:00
|
|
|
this.opts = opts;
|
2016-10-04 10:03:13 -04:00
|
|
|
this.$widgetBody = $('.mr-widget-body');
|
2016-07-24 16:45:11 -04:00
|
|
|
$('#modal_merge_info').modal({
|
|
|
|
show: false
|
|
|
|
});
|
|
|
|
this.clearEventListeners();
|
|
|
|
this.addEventListeners();
|
|
|
|
this.getCIStatus(false);
|
2016-10-04 10:03:13 -04:00
|
|
|
this.retrieveSuccessIcon();
|
2016-11-25 13:42:25 -05:00
|
|
|
|
|
|
|
this.ciStatusInterval = new global.SmartInterval({
|
|
|
|
callback: this.getCIStatus.bind(this, true),
|
|
|
|
startingInterval: 10000,
|
|
|
|
maxInterval: 30000,
|
|
|
|
hiddenInterval: 120000,
|
|
|
|
incrementByFactorOf: 5000,
|
|
|
|
});
|
|
|
|
this.ciEnvironmentStatusInterval = new global.SmartInterval({
|
|
|
|
callback: this.getCIEnvironmentsStatus.bind(this),
|
|
|
|
startingInterval: 30000,
|
|
|
|
maxInterval: 120000,
|
|
|
|
hiddenInterval: 240000,
|
|
|
|
incrementByFactorOf: 15000,
|
|
|
|
immediateExecution: true,
|
|
|
|
});
|
2016-07-24 16:45:11 -04:00
|
|
|
notifyPermissions();
|
|
|
|
}
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.clearEventListeners = function() {
|
|
|
|
return $(document).off('page:change.merge_request');
|
|
|
|
};
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.addEventListeners = function() {
|
|
|
|
var allowedPages;
|
2016-11-24 10:45:34 -05:00
|
|
|
allowedPages = ['show', 'commits', 'pipelines', 'changes'];
|
2016-11-22 16:37:48 -05:00
|
|
|
$(document).on('page:change.merge_request', (function(_this) {
|
2016-07-24 16:45:11 -04:00
|
|
|
return function() {
|
|
|
|
var page;
|
|
|
|
page = $('body').data('page').split(':').last();
|
|
|
|
if (allowedPages.indexOf(page) < 0) {
|
|
|
|
return _this.clearEventListeners();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})(this));
|
|
|
|
};
|
|
|
|
|
2016-10-04 10:03:13 -04:00
|
|
|
MergeRequestWidget.prototype.retrieveSuccessIcon = function() {
|
2016-12-13 22:01:05 -05:00
|
|
|
const $ciSuccessIcon = $('.js-success-icon');
|
|
|
|
this.$ciSuccessIcon = $ciSuccessIcon.html();
|
|
|
|
$ciSuccessIcon.remove();
|
|
|
|
}
|
2016-10-04 10:03:13 -04:00
|
|
|
|
2016-07-24 16:45:11 -04:00
|
|
|
MergeRequestWidget.prototype.mergeInProgress = function(deleteSourceBranch) {
|
|
|
|
if (deleteSourceBranch == null) {
|
|
|
|
deleteSourceBranch = false;
|
|
|
|
}
|
|
|
|
return $.ajax({
|
|
|
|
type: 'GET',
|
|
|
|
url: $('.merge-request').data('url'),
|
|
|
|
success: (function(_this) {
|
|
|
|
return function(data) {
|
|
|
|
var callback, urlSuffix;
|
|
|
|
if (data.state === "merged") {
|
2016-08-10 23:41:48 -04:00
|
|
|
urlSuffix = deleteSourceBranch ? '?deleted_source_branch=true' : '';
|
2016-07-24 16:45:11 -04:00
|
|
|
return window.location.href = window.location.pathname + urlSuffix;
|
|
|
|
} else if (data.merge_error) {
|
2016-11-25 09:09:50 -05:00
|
|
|
return _this.$widgetBody.html("<h4>" + data.merge_error + "</h4>");
|
2016-07-24 16:45:11 -04:00
|
|
|
} else {
|
|
|
|
callback = function() {
|
|
|
|
return merge_request_widget.mergeInProgress(deleteSourceBranch);
|
|
|
|
};
|
|
|
|
return setTimeout(callback, 2000);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})(this),
|
|
|
|
dataType: 'json'
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2016-11-25 13:42:25 -05:00
|
|
|
MergeRequestWidget.prototype.cancelPolling = function () {
|
|
|
|
this.ciStatusInterval.cancel();
|
|
|
|
this.ciEnvironmentStatusInterval.cancel();
|
|
|
|
};
|
|
|
|
|
2016-07-24 16:45:11 -04:00
|
|
|
MergeRequestWidget.prototype.getMergeStatus = function() {
|
|
|
|
return $.get(this.opts.merge_check_url, function(data) {
|
|
|
|
return $('.mr-state-widget').replaceWith(data);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.ciLabelForStatus = function(status) {
|
|
|
|
switch (status) {
|
|
|
|
case 'success':
|
|
|
|
return 'passed';
|
|
|
|
case 'success_with_warnings':
|
|
|
|
return 'passed with warnings';
|
|
|
|
default:
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.getCIStatus = function(showNotification) {
|
|
|
|
var _this;
|
|
|
|
_this = this;
|
|
|
|
$('.ci-widget-fetching').show();
|
|
|
|
return $.getJSON(this.opts.ci_status_url, (function(_this) {
|
|
|
|
return function(data) {
|
|
|
|
var message, status, title;
|
|
|
|
if (data.status === '') {
|
|
|
|
return;
|
|
|
|
}
|
2016-10-04 10:03:13 -04:00
|
|
|
if (data.environments && data.environments.length) _this.renderEnvironments(data.environments);
|
2016-11-25 13:42:25 -05:00
|
|
|
if (data.status !== _this.opts.ci_status && (data.status != null)) {
|
2016-07-24 16:45:11 -04:00
|
|
|
_this.opts.ci_status = data.status;
|
|
|
|
_this.showCIStatus(data.status);
|
|
|
|
if (data.coverage) {
|
|
|
|
_this.showCICoverage(data.coverage);
|
|
|
|
}
|
2016-11-25 13:42:25 -05:00
|
|
|
if (showNotification) {
|
2016-07-24 16:45:11 -04:00
|
|
|
status = _this.ciLabelForStatus(data.status);
|
|
|
|
if (status === "preparing") {
|
|
|
|
title = _this.opts.ci_title.preparing;
|
|
|
|
status = status.charAt(0).toUpperCase() + status.slice(1);
|
|
|
|
message = _this.opts.ci_message.preparing.replace('{{status}}', status);
|
|
|
|
} else {
|
|
|
|
title = _this.opts.ci_title.normal;
|
|
|
|
message = _this.opts.ci_message.normal.replace('{{status}}', status);
|
|
|
|
}
|
|
|
|
title = title.replace('{{status}}', status);
|
|
|
|
message = message.replace('{{sha}}', data.sha);
|
|
|
|
message = message.replace('{{title}}', data.title);
|
|
|
|
notify(title, message, _this.opts.gitlab_icon, function() {
|
|
|
|
this.close();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})(this));
|
|
|
|
};
|
|
|
|
|
2016-10-07 18:10:06 -04:00
|
|
|
MergeRequestWidget.prototype.getCIEnvironmentsStatus = function() {
|
|
|
|
$.getJSON(this.opts.ci_environments_status_url, (environments) => {
|
|
|
|
if (environments && environments.length) this.renderEnvironments(environments);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2016-10-04 10:03:13 -04:00
|
|
|
MergeRequestWidget.prototype.renderEnvironments = function(environments) {
|
2016-10-07 18:10:06 -04:00
|
|
|
for (let i = 0; i < environments.length; i++) {
|
|
|
|
const environment = environments[i];
|
|
|
|
if ($(`.mr-state-widget #${ environment.id }`).length) return;
|
|
|
|
const $template = $(DEPLOYMENT_TEMPLATE);
|
2016-10-13 08:00:06 -04:00
|
|
|
if (!environment.external_url || !environment.external_url_formatted) $('.js-environment-link', $template).remove();
|
2016-11-25 13:42:25 -05:00
|
|
|
|
2016-10-17 06:44:08 -04:00
|
|
|
if (!environment.stop_url) {
|
2016-10-17 17:10:43 -04:00
|
|
|
$('.js-stop-env-link', $template).remove();
|
2016-10-17 06:44:08 -04:00
|
|
|
}
|
2016-11-25 13:42:25 -05:00
|
|
|
|
2016-10-13 08:00:06 -04:00
|
|
|
if (environment.deployed_at && environment.deployed_at_formatted) {
|
2016-11-17 15:41:35 -05:00
|
|
|
environment.deployed_at = gl.utils.getTimeago().format(environment.deployed_at, 'gl_en') + '.';
|
2016-10-07 18:10:06 -04:00
|
|
|
} else {
|
|
|
|
$('.js-environment-timeago', $template).remove();
|
|
|
|
environment.name += '.';
|
|
|
|
}
|
|
|
|
environment.ci_success_icon = this.$ciSuccessIcon;
|
|
|
|
const templateString = _.unescape($template[0].outerHTML);
|
|
|
|
const template = _.template(templateString)(environment)
|
|
|
|
this.$widgetBody.before(template);
|
|
|
|
}
|
2016-12-13 22:01:05 -05:00
|
|
|
};
|
2016-10-04 10:03:13 -04:00
|
|
|
|
2016-07-24 16:45:11 -04:00
|
|
|
MergeRequestWidget.prototype.showCIStatus = function(state) {
|
|
|
|
var allowed_states;
|
|
|
|
if (state == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$('.ci_widget').hide();
|
|
|
|
allowed_states = ["failed", "canceled", "running", "pending", "success", "success_with_warnings", "skipped", "not_found"];
|
|
|
|
if (indexOf.call(allowed_states, state) >= 0) {
|
|
|
|
$('.ci_widget.ci-' + state).show();
|
|
|
|
switch (state) {
|
|
|
|
case "failed":
|
|
|
|
case "canceled":
|
|
|
|
case "not_found":
|
|
|
|
return this.setMergeButtonClass('btn-danger');
|
|
|
|
case "running":
|
2016-11-22 16:37:48 -05:00
|
|
|
return this.setMergeButtonClass('btn-info');
|
2016-07-24 16:45:11 -04:00
|
|
|
case "success":
|
|
|
|
case "success_with_warnings":
|
|
|
|
return this.setMergeButtonClass('btn-create');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$('.ci_widget.ci-error').show();
|
|
|
|
return this.setMergeButtonClass('btn-danger');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.showCICoverage = function(coverage) {
|
|
|
|
var text;
|
|
|
|
text = 'Coverage ' + coverage + '%';
|
|
|
|
return $('.ci_widget:visible .ci-coverage').text(text);
|
|
|
|
};
|
|
|
|
|
|
|
|
MergeRequestWidget.prototype.setMergeButtonClass = function(css_class) {
|
2016-11-22 16:37:48 -05:00
|
|
|
return $('.js-merge-button,.accept-action .dropdown-toggle').removeClass('btn-danger btn-info btn-create').addClass(css_class);
|
2016-07-24 16:45:11 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
return MergeRequestWidget;
|
|
|
|
|
|
|
|
})();
|
|
|
|
|
2016-12-13 22:01:05 -05:00
|
|
|
})(window.gl || (window.gl = {}));
|