summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/merge_request_widget.js.coffee
blob: 9afb6a0ce863f648bfa1d2ae55e0a9f93af64f6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
class @MergeRequestWidget
  # Initialize MergeRequestWidget behavior
  #
  #   check_enable           - Boolean, whether to check automerge status
  #   url_to_automerge_check - String, URL to use to check automerge status
  #   url_to_ci_check        - String, URL to use to check CI status
  #

  constructor: (@opts) ->
    @firstCICheck = true
    modal = $('#modal_merge_info').modal(show: false)
    @getCIStatus()
    notifyPermissions()
    @readyForCICheck = true
    # clear the build poller

  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.url_to_automerge_check, (data) ->
      $('.mr-state-widget').replaceWith(data)

  ciLabelForStatus: (status) ->
    if status == 'success'
      'passed'
    else
      status

  getCIStatus: ->
    urlToCICheck = @opts.url_to_ci_check
    @fetchBuildStatusInterval = setInterval ( =>
      return if not @readyForCICheck

      $.getJSON urlToCICheck, (data) =>
        @readyForCICheck = true

        if @firstCICheck
          @firstCICheck = false
          @opts.current_status = data.status

        if data.status isnt @opts.current_status
          message = @opts.ci_message.replace('{{status}}', @ciLabelForStatus(data.status))
          message = message.replace('{{sha}}', data.sha)

          notify(
            "Build #{_this.ciLabelForStatus(data.status)}",
            message,
            @opts.gitlab_icon,
            ->
              @close()
              Turbolinks.visit "#{window.location.pathname}/builds"
          )

          @opts.current_status = data.status

      @readyForCICheck = false
    ), 5000

  getCiStatus: ->
    $.get @opts.url_to_ci_check, (data) =>
      this.showCiState data.status
      if data.coverage
        this.showCiCoverage data.coverage
    , 'json'

  showCiState: (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", "pending"
          @setMergeButtonClass('btn-warning')
    else
      $('.ci_widget.ci-error').show()
      @setMergeButtonClass('btn-danger')

  showCiCoverage: (coverage) ->
    text = 'Coverage ' + coverage + '%'
    $('.ci_widget:visible .ci-coverage').text(text)

  setMergeButtonClass: (css_class) ->
    $('.accept_merge_request').removeClass("btn-create").addClass(css_class)