mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-24 12:06:11 +10:00
Fixed potential issue with 2 ci status polling events happening Possible cause for double notifications was if the request was slow & then you changed page whilst this request was happening it would finish on another page & then launch another interval - this stops that issue. Also passed in the CI status as an option value rather than waiting for the first ajax request to finish See merge request !3869
140 lines
4.2 KiB
CoffeeScript
140 lines
4.2 KiB
CoffeeScript
class @MergeRequestWidget
|
|
# 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
|
|
#
|
|
|
|
constructor: (@opts) ->
|
|
$('#modal_merge_info').modal(show: false)
|
|
@firstCICheck = true
|
|
@readyForCICheck = false
|
|
@cancel = false
|
|
clearInterval @fetchBuildStatusInterval
|
|
|
|
@clearEventListeners()
|
|
@addEventListeners()
|
|
@getCIStatus(false)
|
|
@pollCIStatus()
|
|
notifyPermissions()
|
|
|
|
clearEventListeners: ->
|
|
$(document).off 'page:change.merge_request'
|
|
|
|
cancelPolling: ->
|
|
@cancel = true
|
|
|
|
addEventListeners: ->
|
|
allowedPages = ['show', 'commits', 'builds', 'changes']
|
|
$(document).on 'page:change.merge_request', =>
|
|
page = $('body').data('page').split(':').last()
|
|
if allowedPages.indexOf(page) < 0
|
|
clearInterval @fetchBuildStatusInterval
|
|
@cancelPolling()
|
|
@clearEventListeners()
|
|
|
|
mergeInProgress: (deleteSourceBranch = false)->
|
|
$.ajax
|
|
type: 'GET'
|
|
url: $('.merge-request').data('url')
|
|
success: (data) =>
|
|
if data.state == "merged"
|
|
urlSuffix = if deleteSourceBranch then '?delete_source=true' else ''
|
|
|
|
window.location.href = window.location.pathname + urlSuffix
|
|
else if data.merge_error
|
|
$('.mr-widget-body').html("<h4>" + data.merge_error + "</h4>")
|
|
else
|
|
callback = -> merge_request_widget.mergeInProgress(deleteSourceBranch)
|
|
setTimeout(callback, 2000)
|
|
dataType: 'json'
|
|
|
|
getMergeStatus: ->
|
|
$.get @opts.merge_check_url, (data) ->
|
|
$('.mr-state-widget').replaceWith(data)
|
|
|
|
ciLabelForStatus: (status) ->
|
|
if status is 'success'
|
|
'passed'
|
|
else
|
|
status
|
|
|
|
pollCIStatus: ->
|
|
@fetchBuildStatusInterval = setInterval ( =>
|
|
return if not @readyForCICheck
|
|
|
|
@getCIStatus(true)
|
|
|
|
@readyForCICheck = false
|
|
), 10000
|
|
|
|
getCIStatus: (showNotification) ->
|
|
_this = @
|
|
$('.ci-widget-fetching').show()
|
|
|
|
$.getJSON @opts.ci_status_url, (data) =>
|
|
return if @cancel
|
|
@readyForCICheck = true
|
|
|
|
if data.status is ''
|
|
return
|
|
|
|
if @firstCICheck || data.status isnt @opts.ci_status and data.status?
|
|
@opts.ci_status = data.status
|
|
@showCIStatus data.status
|
|
if data.coverage
|
|
@showCICoverage data.coverage
|
|
|
|
# The first check should only update the UI, a notification
|
|
# should only be displayed on status changes
|
|
if showNotification and not @firstCICheck
|
|
status = @ciLabelForStatus(data.status)
|
|
|
|
if status is "preparing"
|
|
title = @opts.ci_title.preparing
|
|
status = status.charAt(0).toUpperCase() + status.slice(1);
|
|
message = @opts.ci_message.preparing.replace('{{status}}', status)
|
|
else
|
|
title = @opts.ci_title.normal
|
|
message = @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,
|
|
@opts.gitlab_icon,
|
|
->
|
|
@close()
|
|
Turbolinks.visit _this.opts.builds_path
|
|
)
|
|
@firstCICheck = false
|
|
|
|
showCIStatus: (state) ->
|
|
$('.ci_widget').hide()
|
|
allowed_states = ["failed", "canceled", "running", "pending", "success", "skipped", "not_found"]
|
|
if state in allowed_states
|
|
$('.ci_widget.ci-' + state).show()
|
|
switch state
|
|
when "failed", "canceled", "not_found"
|
|
@setMergeButtonClass('btn-danger')
|
|
when "running"
|
|
@setMergeButtonClass('btn-warning')
|
|
when "success"
|
|
@setMergeButtonClass('btn-create')
|
|
else
|
|
$('.ci_widget.ci-error').show()
|
|
@setMergeButtonClass('btn-danger')
|
|
|
|
showCICoverage: (coverage) ->
|
|
text = 'Coverage ' + coverage + '%'
|
|
$('.ci_widget:visible .ci-coverage').text(text)
|
|
|
|
setMergeButtonClass: (css_class) ->
|
|
$('.js-merge-button')
|
|
.removeClass('btn-danger btn-warning btn-create')
|
|
.addClass(css_class)
|