shipit-engine 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/magic-solid.svg +1 -0
  3. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  4. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  5. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  6. data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
  7. data/app/assets/stylesheets/shipit.scss +1 -0
  8. data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
  9. data/app/controllers/shipit/api/stacks_controller.rb +14 -1
  10. data/app/controllers/shipit/deploys_controller.rb +2 -2
  11. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  12. data/app/controllers/shipit/merge_status_controller.rb +15 -15
  13. data/app/controllers/shipit/repositories_controller.rb +74 -0
  14. data/app/controllers/shipit/tasks_controller.rb +4 -4
  15. data/app/helpers/shipit/chunks_helper.rb +2 -2
  16. data/app/helpers/shipit/github_url_helper.rb +8 -0
  17. data/app/helpers/shipit/stacks_helper.rb +4 -0
  18. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  19. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  20. data/app/jobs/shipit/destroy_stack_job.rb +2 -2
  21. data/app/jobs/shipit/perform_task_job.rb +4 -98
  22. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  23. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  24. data/app/models/shipit/anonymous_user.rb +4 -0
  25. data/app/models/shipit/check_run.rb +2 -2
  26. data/app/models/shipit/command_line_user.rb +4 -0
  27. data/app/models/shipit/commit.rb +11 -11
  28. data/app/models/shipit/commit_checks.rb +1 -0
  29. data/app/models/shipit/deploy.rb +1 -0
  30. data/app/models/shipit/deploy_spec.rb +16 -4
  31. data/app/models/shipit/deploy_spec/file_system.rb +11 -5
  32. data/app/models/shipit/hook.rb +2 -0
  33. data/app/models/shipit/merge_request.rb +302 -0
  34. data/app/models/shipit/provisioning_handler.rb +32 -0
  35. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  36. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  37. data/app/models/shipit/pull_request.rb +25 -264
  38. data/app/models/shipit/pull_request_assignment.rb +10 -0
  39. data/app/models/shipit/repository.rb +54 -0
  40. data/app/models/shipit/review_stack.rb +116 -0
  41. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  42. data/app/models/shipit/stack.rb +22 -8
  43. data/app/models/shipit/task.rb +56 -7
  44. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  45. data/app/models/shipit/task_execution_strategy/default.rb +110 -0
  46. data/app/models/shipit/user.rb +6 -1
  47. data/app/models/shipit/webhooks.rb +10 -0
  48. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  49. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  50. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  51. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  52. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  53. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  54. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  55. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  56. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  57. data/app/serializers/shipit/deploy_serializer.rb +6 -0
  58. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  59. data/app/serializers/shipit/pull_request_serializer.rb +5 -8
  60. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  61. data/app/serializers/shipit/stack_serializer.rb +7 -6
  62. data/app/serializers/shipit/tail_task_serializer.rb +10 -2
  63. data/app/serializers/shipit/task_serializer.rb +1 -1
  64. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  65. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  66. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  67. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  68. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  69. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  70. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  71. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  72. data/app/views/shipit/merge_status/success.html.erb +2 -2
  73. data/app/views/shipit/repositories/_header.html.erb +19 -0
  74. data/app/views/shipit/repositories/index.html.erb +31 -0
  75. data/app/views/shipit/repositories/new.html.erb +23 -0
  76. data/app/views/shipit/repositories/settings.html.erb +53 -0
  77. data/app/views/shipit/repositories/show.html.erb +30 -0
  78. data/app/views/shipit/stacks/_banners.html.erb +13 -0
  79. data/app/views/shipit/stacks/_header.html.erb +5 -2
  80. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  81. data/app/views/shipit/stacks/index.html.erb +2 -1
  82. data/app/views/shipit/stacks/settings.html.erb +5 -5
  83. data/app/views/shipit/stacks/show.html.erb +1 -1
  84. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  85. data/config/routes.rb +15 -5
  86. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  87. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  88. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  89. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  90. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  91. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  92. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  93. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  94. data/lib/shipit.rb +11 -1
  95. data/lib/shipit/github_app.rb +1 -1
  96. data/lib/shipit/review_stack_commands.rb +8 -0
  97. data/lib/shipit/stack_commands.rb +6 -1
  98. data/lib/shipit/task_commands.rb +1 -0
  99. data/lib/shipit/version.rb +1 -1
  100. data/lib/tasks/cron.rake +11 -2
  101. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
  102. data/test/controllers/api/outputs_controller_test.rb +1 -0
  103. data/test/controllers/api/rollback_controller_test.rb +1 -1
  104. data/test/controllers/api/stacks_controller_test.rb +21 -1
  105. data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
  106. data/test/controllers/repositories_controller_test.rb +71 -0
  107. data/test/controllers/stacks_controller_test.rb +9 -1
  108. data/test/controllers/tasks_controller_test.rb +14 -2
  109. data/test/controllers/webhooks_controller_test.rb +1 -1
  110. data/test/dummy/config/application.rb +6 -1
  111. data/test/dummy/config/environments/development.rb +0 -3
  112. data/test/dummy/config/environments/test.rb +0 -5
  113. data/test/dummy/db/schema.rb +52 -14
  114. data/test/dummy/db/seeds.rb +1 -1
  115. data/test/fixtures/payloads/check_suite_master.json +2 -2
  116. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  117. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  118. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  119. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  120. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  121. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  122. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  123. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  124. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  125. data/test/fixtures/shipit/commits.yml +15 -2
  126. data/test/fixtures/shipit/merge_requests.yml +141 -0
  127. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  128. data/test/fixtures/shipit/pull_requests.yml +10 -131
  129. data/test/fixtures/shipit/repositories.yml +1 -0
  130. data/test/fixtures/shipit/stacks.yml +145 -0
  131. data/test/fixtures/shipit/statuses.yml +9 -0
  132. data/test/fixtures/shipit/tasks.yml +3 -0
  133. data/test/fixtures/shipit/users.yml +7 -0
  134. data/test/helpers/payloads_helper.rb +4 -0
  135. data/test/jobs/chunk_rollup_job_test.rb +15 -1
  136. data/test/jobs/destroy_repository_job_test.rb +27 -0
  137. data/test/jobs/perform_task_job_test.rb +8 -8
  138. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
  139. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  140. data/test/lib/shipit/task_commands_test.rb +17 -0
  141. data/test/models/commits_test.rb +22 -13
  142. data/test/models/deploy_spec_test.rb +57 -24
  143. data/test/models/deploys_test.rb +148 -14
  144. data/test/models/{pull_request_test.rb → merge_request_test.rb} +30 -30
  145. data/test/models/pull_request_assignment_test.rb +16 -0
  146. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  147. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  148. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  149. data/test/models/shipit/pull_request_test.rb +52 -0
  150. data/test/models/shipit/repository_test.rb +5 -1
  151. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  152. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  153. data/test/models/shipit/review_stack_test.rb +59 -0
  154. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +10 -4
  155. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  156. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  157. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  158. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  159. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  160. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  161. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  162. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +83 -0
  163. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  164. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
  165. data/test/models/tasks_test.rb +44 -3
  166. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  167. data/test/unit/command_test.rb +3 -3
  168. data/test/unit/github_url_helper_test.rb +5 -0
  169. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  170. metadata +260 -154
  171. data/app/controllers/shipit/pull_requests_controller.rb +0 -31
  172. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
  173. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
  174. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  175. data/test/fixtures/shipit/output_chunks.yml +0 -47
  176. data/test/models/output_chunk_test.rb +0 -21
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipit
4
+ class ReviewStackSerializer < Shipit::StackSerializer
5
+ has_one :pull_request
6
+ end
7
+ end
@@ -4,10 +4,11 @@ module Shipit
4
4
  include ConditionalAttributes
5
5
 
6
6
  has_one :lock_author
7
- attributes :id, :repo_owner, :repo_name, :environment, :html_url, :url, :tasks_url, :deploy_url, :pull_requests_url,
8
- :deploy_spec, :undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment, :created_at,
9
- :updated_at, :locked_since, :last_deployed_at, :branch, :merge_queue_enabled, :is_archived,
10
- :archived_since
7
+
8
+ attributes :id, :repo_owner, :repo_name, :environment, :html_url, :url, :tasks_url, :deploy_url,
9
+ :merge_requests_url, :deploy_spec, :undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment,
10
+ :created_at, :updated_at, :locked_since, :last_deployed_at, :branch, :merge_queue_enabled, :is_archived,
11
+ :archived_since
11
12
 
12
13
  def url
13
14
  api_stack_url(object)
@@ -21,8 +22,8 @@ module Shipit
21
22
  api_stack_tasks_url(object)
22
23
  end
23
24
 
24
- def pull_requests_url
25
- api_stack_pull_requests_url(object)
25
+ def merge_requests_url
26
+ api_stack_merge_requests_url(object)
26
27
  end
27
28
 
28
29
  def is_locked
@@ -8,7 +8,7 @@ module Shipit
8
8
 
9
9
  def url
10
10
  return @url if defined? @url
11
- @url = next_chunks_url(task)
11
+ @url = next_chunks_url(task, last_byte: next_offset)
12
12
  end
13
13
 
14
14
  def include_url?
@@ -16,7 +16,7 @@ module Shipit
16
16
  end
17
17
 
18
18
  def output
19
- task.chunks.tail(context[:last_id]).pluck(:text).join
19
+ @output ||= task.tail_output(last_byte)
20
20
  end
21
21
 
22
22
  def rollback_url
@@ -32,6 +32,14 @@ module Shipit
32
32
  alias_method :task, :object
33
33
  delegate :stack, to: :object
34
34
 
35
+ def next_offset
36
+ last_byte + output.bytesize
37
+ end
38
+
39
+ def last_byte
40
+ context[:last_byte].to_i
41
+ end
42
+
35
43
  def rollback
36
44
  return @rollback if defined? @rollback
37
45
  @rollback = stack.rollbacks.where(parent_id: task.id).last
@@ -6,7 +6,7 @@ module Shipit
6
6
  has_one :author
7
7
  has_one :revision, serializer: ShortCommitSerializer
8
8
 
9
- attributes(:id, :url, :html_url, :output_url, :type, :status, :action, :title, :description, :started_at, :ended_at, :updated_at, :created_at, :env, :ignored_safeties)
9
+ attributes(:id, :url, :html_url, :output_url, :type, :status, :action, :title, :description, :started_at, :ended_at, :updated_at, :created_at, :env, :ignored_safeties, :max_retries, :retry_attempt)
10
10
 
11
11
  def revision
12
12
  object.until_commit
@@ -0,0 +1,29 @@
1
+ <li class="pr" id="pr-<%= merge_request.id %>">
2
+ <%= render 'shipit/shared/author', author: merge_request.merge_requested_by %>
3
+ <div class="pr-details">
4
+ <span class="pr-number">
5
+ <%= pull_request_link(merge_request) %>
6
+ </span>
7
+ <span class="pr-title">
8
+ <%= render_pull_request_title_with_link merge_request %>
9
+ </span>
10
+ <p class="pr-meta">
11
+ <span class="code-additions">+<%= merge_request.additions %></span>
12
+ <span class="code-deletions">-<%= merge_request.deletions %></span>
13
+ </p>
14
+ <p class="pr-meta">
15
+ Enqueued <%= timeago_tag(merge_request.merge_requested_at, force: true) %>
16
+ <% if merge_request.revalidating? %>
17
+ <em class="warning">Need revalidation.</em>
18
+ <% end %>
19
+ </p>
20
+ </div>
21
+ <% if merge_request.revalidating? %>
22
+ <div class="commit-actions">
23
+ <%= button_to 'Confirm', stack_merge_requests_path(merge_request.stack, number_or_url: merge_request.number), class: 'btn btn--warning', method: 'post' %>
24
+ </div>
25
+ <% end %>
26
+ <div class="commit-actions">
27
+ <%= button_to 'Cancel', stack_merge_request_path(merge_request.stack, merge_request), class: 'btn btn--warning', method: 'delete' %>
28
+ </div>
29
+ </li>
@@ -5,7 +5,7 @@
5
5
  <div class="wrapper">
6
6
  <section>
7
7
  <header class="section-header">
8
- <%= form_tag stack_pull_requests_path(@stack) do %>
8
+ <%= form_tag stack_merge_requests_path(@stack) do %>
9
9
  <div class="field-wrapper inline">
10
10
  <%= text_field_tag :number_or_url, '', placeholder: 'PR number or URL' %>
11
11
  <%= submit_tag 'Request merge', class: 'btn' %>
@@ -14,7 +14,7 @@
14
14
  </header>
15
15
 
16
16
  <ul class="pr-list">
17
- <%= render @pull_requests %>
17
+ <%= render @merge_requests %>
18
18
  </ul>
19
19
  </section>
20
20
  </div>
@@ -0,0 +1,29 @@
1
+ <li class="pr" id="pr-<%= merge_request.id %>">
2
+ <%= render 'shipit/shared/author', author: merge_request.merge_requested_by %>
3
+ <div class="pr-details">
4
+ <span class="pr-number">
5
+ <%= pull_request_link(merge_request) %>
6
+ </span>
7
+ <span class="pr-title">
8
+ <%= render_pull_request_title_with_link merge_request %>
9
+ </span>
10
+ <p class="pr-meta">
11
+ <span class="code-additions">+<%= merge_request.additions %></span>
12
+ <span class="code-deletions">-<%= merge_request.deletions %></span>
13
+ </p>
14
+ <p class="pr-meta">
15
+ Enqueued <%= timeago_tag(merge_request.merge_requested_at, force: true) %>
16
+ <% if merge_request.revalidating? %>
17
+ <em class="warning">Need revalidation.</em>
18
+ <% end %>
19
+ </p>
20
+ </div>
21
+ <% if merge_request.revalidating? %>
22
+ <div class="commit-actions">
23
+ <%= button_to 'Confirm', stack_merge_requests_path(merge_request.stack, number_or_url: merge_request.number), class: 'btn btn--warning', method: 'post' %>
24
+ </div>
25
+ <% end %>
26
+ <div class="commit-actions">
27
+ <%= button_to 'Cancel', stack_merge_request_path(merge_request.stack, merge_request), class: 'btn btn--warning', method: 'delete' %>
28
+ </div>
29
+ </li>
@@ -0,0 +1,20 @@
1
+ <% subscribe events_path(channels: ["stack.#{@stack.id}"]), '.pr-list', '.header' %>
2
+
3
+ <%= render partial: 'shipit/stacks/header', locals: { stack: @stack } %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <header class="section-header">
8
+ <%= form_tag stack_merge_requests_path(@stack) do %>
9
+ <div class="field-wrapper inline">
10
+ <%= text_field_tag :number_or_url, '', placeholder: 'PR number or URL' %>
11
+ <%= submit_tag 'Request merge', class: 'btn' %>
12
+ </div>
13
+ <% end %>
14
+ </header>
15
+
16
+ <ul class="pr-list">
17
+ <%= render @merge_requests %>
18
+ </ul>
19
+ </section>
20
+ </div>
@@ -1,13 +1,13 @@
1
1
  <% classes = 'branch-action-btn float-right js-immediate-updates js-handle-pull-merging-errors' %>
2
- <% if pull_request.try!(&:waiting?) %>
3
- <%= form_tag dequeue_pull_request_path(stack, pull_request_number), method: 'delete', class: classes, data: {remote: true} do %>
2
+ <% if merge_request.try!(&:waiting?) %>
3
+ <%= form_tag dequeue_merge_request_path(stack, pull_request_number), method: 'delete', class: classes, data: {remote: true} do %>
4
4
  <%= hidden_field_tag 'referrer', params[:referrer] %>
5
5
  <button type="submit" data-disable-with="Removing from merge queue…" class="btn">
6
6
  Remove from merge queue
7
7
  </button>
8
8
  <% end %>
9
9
  <% else %>
10
- <%= form_tag enqueue_pull_request_path(stack, pull_request_number), method: 'put', class: classes, data: {remote: true} do %>
10
+ <%= form_tag enqueue_merge_request_path(stack, pull_request_number), method: 'put', class: classes, data: {remote: true} do %>
11
11
  <%= hidden_field_tag 'referrer', params[:referrer] %>
12
12
  <button type="submit" data-disable-with="Adding to merge queue…" class="btn btn-primary">
13
13
  Add to merge queue
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#cea61b' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-pending">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the backlog is shipped!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#d73a49' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-red">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the CI is fixed!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#bd2c00' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-red">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the lock is removed!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -5,8 +5,8 @@
5
5
  </div>
6
6
 
7
7
  <h4 class="status-heading">
8
- <% if pull_request.waiting? %>
9
- <% if pull_request.all_status_checks_passed? %>
8
+ <% if merge_request.waiting? %>
9
+ <% if merge_request.all_status_checks_passed? %>
10
10
  Will be merged shortly!
11
11
  <% else %>
12
12
  Will be merged when required checks are passing.
@@ -0,0 +1,19 @@
1
+ <% content_for :page_title do %>
2
+ <span><%= repository.owner %></span>
3
+ <h1><%= repository.name %></h1>
4
+ <% end %>
5
+
6
+ <% content_for :primary_navigation do %>
7
+ <%= link_to 'Add a stack', repository_stacks_new_path(repository), class: 'btn secondary' %>
8
+ <% end %>
9
+
10
+ <% content_for :secondary_navigation do %>
11
+ <ul class="nav__list nav__list--primary">
12
+ <li class="nav__list__item">
13
+ <%= link_to 'Stacks', repository_path(repository) %>
14
+ </li>
15
+ <li class="nav__list__item">
16
+ <%= link_to 'Settings', repository_settings_path(repository) %>
17
+ </li>
18
+ </ul>
19
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <% content_for :page_title do %>
2
+ <h1>Repositories</h1>
3
+ <% end %>
4
+ <% content_for :primary_navigation do %>
5
+ <%= link_to 'Add a repository', new_repository_path, class: 'btn secondary' %>
6
+ <% end %>
7
+
8
+ <div class="wrapper <%= 'filtering-enabled' if @repositories.size > 10 %>">
9
+ <section>
10
+ <header class="section-header repository-search-header">
11
+ <input class="repository-search" placeholder="Search <%= @repositories.size %> repositories" />
12
+ </header>
13
+ <ul class="repository-table-header">
14
+ <li class="col">Owner<li>
15
+ <li class="col">Name</li>
16
+ </ul>
17
+ <ul class="repository-lst">
18
+ <% @repositories.each do |repository| %>
19
+ <li class="search-item <%= contributor_class(current_user.repositories_contributed_to, repository.id) %>" data-search="<%= repository.github_repo_name %>" data-repository-id="<%= repository.id %>">
20
+ <%= link_to repository_path(repository), class: 'commits-path' do %>
21
+ <span class="col"><%= repository.owner %></span>
22
+ <span class="col"><%= repository.name %></span>
23
+ <% end %>
24
+ </li>
25
+ <% end %>
26
+ </ul>
27
+
28
+ <%= link_to 'show all repositories', '#', class: 'btn secondary show-all-repositories' %></p>
29
+ </section>
30
+
31
+ </div>
@@ -0,0 +1,23 @@
1
+ <% content_for :page_title do %>
2
+ <h1>Create a repository</h1>
3
+ <% end %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <div class="setting-section">
8
+ <%= form_for @repository do |f| %>
9
+ <div class="field-wrapper">
10
+ <%= label_tag "Repo" %>
11
+ <br>
12
+ <%= Shipit.github.url %>
13
+ /
14
+ <%= f.text_field :owner, placeholder: 'e.g. Shopify', required: true, class: "repo" %>
15
+ /
16
+ <%= f.text_field :name, required: true, pattern: "^[a-zA-Z0-9\-_\.]+$", class: "repo" %>
17
+ </div>
18
+
19
+ <div class="field-wrapper"><%= f.submit class: 'btn' %></div>
20
+ <% end %>
21
+ </div>
22
+ </section>
23
+ </div>
@@ -0,0 +1,53 @@
1
+ <%= render partial: 'shipit/repositories/header', locals: { repository: @repository } %>
2
+
3
+ <div class="wrapper">
4
+ <section>
5
+ <header class="section-header">
6
+ <h2>Settings (Repository <%= @repository.github_repo_name %>)</h2>
7
+ </header>
8
+
9
+ <div class="setting-section">
10
+ <%= form_for @repository do |f| %>
11
+ <div class="field-wrapper">
12
+ <%= f.check_box :review_stacks_enabled %>
13
+ <%= f.label :review_stacks_enabled, "Dynamically provision stacks for Pull Requests?" %>
14
+ </div>
15
+
16
+ <div class="field-wrapper">
17
+ <p>
18
+ <%= f.label :provisioning_behavior, "Provisioning behavior", aria: { describedby: 'provisioningBehaviorHelp' } %>
19
+ <%= f.select :provisioning_behavior, Shipit::Repository.provisioning_behaviors.map { |key, value| [ key.titleize, key] } %>
20
+ </p>
21
+ <p>
22
+ <small class="form-text text-muted" id="provisioningBehaviorHelp">
23
+ When "Allow All", the provisioning label has no effect on dynamic stack provisioning - ALL Pull Requests dynamically provision stacks.
24
+ </small>
25
+ </p>
26
+ <p>
27
+ <small class="form-text text-muted">
28
+ When "Allow With Label", dynamic provisioning occurs ONLY for Pull Requests whose labels include the 'Provisioning Label'.
29
+ </small>
30
+ </p>
31
+ <p>
32
+ <small class="form-text text-muted">
33
+ When "Prevent With Label", dynamic provisioning will occur for every Pull Request EXCEPT those whose labels include the 'Provisioning Label'.
34
+ </small>
35
+ </p>
36
+ </div>
37
+
38
+ <div class="field-wrapper">
39
+ <%= f.label :provisioning_label_name, "Provisioning label" %>
40
+ <%= f.text_field :provisioning_label_name %>
41
+ </div>
42
+
43
+ <%= f.submit class: "btn", value: "Save" %>
44
+ <% end %>
45
+ </div>
46
+
47
+ <div class="setting-section">
48
+ <h5>Delete this repository</h5>
49
+ <p>This action will delete the repository and its stacks from Ship it permanently. Be careful.</p>
50
+ <%= button_to "Delete…", repository_path(@repository), class: 'btn btn--delete', data: {confirm: 'Are you sure?'}, method: :delete %>
51
+ </div>
52
+ </section>
53
+ </div>
@@ -0,0 +1,30 @@
1
+ <% subscribe events_path(channels: ["repository.#{@repository.id}"]), '#layout-content' %>
2
+
3
+ <%= render partial: 'shipit/repositories/header', locals: {repository: @repository} %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <% cache [@repository, params[:show_archived]] do %>
8
+ <section>
9
+ <header class="section-header">
10
+ <h2>Stacks</h2>
11
+ </header>
12
+ <ul class="repository-table-header">
13
+ <li class="col">Name</li>
14
+ <li class="col">Environment</li>
15
+ <li class="col">Branch</li>
16
+ <li class="col">Deploy URL</li>
17
+ </ul>
18
+ <ul class="repository-lst">
19
+ <%= render @stacks %>
20
+ </ul>
21
+
22
+ <%= link_to 'show all stacks', '#', class: 'btn secondary show-all-stacks' %></p>
23
+ <% if @show_archived %>
24
+ <%= link_to 'hide archived stacks', '?', class: 'btn secondary' %></p>
25
+ <% else %>
26
+ <%= link_to 'show archived stacks', '?show_archived=1', class: 'btn secondary' %></p>
27
+ <% end %>
28
+ </section>
29
+ <% end %>
30
+ </div>
@@ -49,6 +49,19 @@
49
49
  </div>
50
50
  <% end %>
51
51
 
52
+ <% if stack.awaiting_provision? %>
53
+ <div class="banner banner--orange">
54
+ <div class="banner__inner wrapper">
55
+ <div class="banner__content">
56
+ <h2 class="banner__title">
57
+ <i class="icon icon--list"></i>
58
+ This stack is in a queue waiting on provisioning. This may be because too many review stacks exist for this repository.
59
+ </h2>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <% end %>
64
+
52
65
  <% if stack.continuous_delivery_delayed? %>
53
66
  <div class="banner">
54
67
  <div class="banner__inner wrapper">
@@ -22,9 +22,12 @@
22
22
  <li class="nav__list__item">
23
23
  <%= link_to t('stack.nav.statistics'), stack_statistics_path(stack) %>
24
24
  </li>
25
+ <li class="nav__list__item">
26
+ <%= link_to 'Repository', repository_path(stack.repository) %>
27
+ </li>
25
28
  <% if stack.merge_queue_enabled? %>
26
29
  <li class="nav__list__item">
27
- <%= link_to t('stack.nav.merge_queue', count: stack.pull_requests.queued.count), stack_pull_requests_path(stack) %>
30
+ <%= link_to t('stack.nav.merge_queue', count: stack.merge_requests.queued.count), stack_merge_requests_path(stack) %>
28
31
  </li>
29
32
  <% end %>
30
33
 
@@ -64,7 +67,7 @@
64
67
  </li>
65
68
  <% end %>
66
69
  <li class="nav__list__item">
67
- <%= link_to t('stack.nav.view_on_github'), github_repo_url(stack.repo_owner, stack.repo_name) %>
70
+ <%= link_to t('stack.nav.view_on_github'), stack_github_url(stack) %>
68
71
  </li>
69
72
  <% if stack.deploy_url.present? %>
70
73
  <li class="nav__list__item">