From 0e06cfc059af0b70b366ab1eaf75f7601fdcb5e1 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 28 Feb 2017 04:17:21 +0900
Subject: [PATCH 01/28] Add api points for ci cd status. Add favicon.

---
 app/controllers/projects/builds_controller.rb         | 6 ++++++
 app/controllers/projects/merge_requests_controller.rb | 8 +++++++-
 app/controllers/projects/pipelines_controller.rb      | 6 ++++++
 app/serializers/build_entity.rb                       | 6 ++++++
 app/serializers/build_serializer.rb                   | 3 +++
 app/serializers/status_entity.rb                      | 2 +-
 config/routes/project.rb                              | 3 +++
 lib/gitlab/ci/status/build/failed_allowed.rb          | 4 ++++
 lib/gitlab/ci/status/canceled.rb                      | 4 ++++
 lib/gitlab/ci/status/created.rb                       | 4 ++++
 lib/gitlab/ci/status/failed.rb                        | 4 ++++
 lib/gitlab/ci/status/pending.rb                       | 4 ++++
 lib/gitlab/ci/status/running.rb                       | 4 ++++
 lib/gitlab/ci/status/skipped.rb                       | 4 ++++
 lib/gitlab/ci/status/success.rb                       | 4 ++++
 lib/gitlab/ci/status/success_warning.rb               | 4 ++++
 16 files changed, 68 insertions(+), 2 deletions(-)
 create mode 100644 app/serializers/build_serializer.rb

diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index 886934a3f67..54650bc37a2 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -91,6 +91,12 @@ class Projects::BuildsController < Projects::ApplicationController
     end
   end
 
+  def ci_cd_status
+    render json: BuildSerializer
+      .new(project: @project, user: @current_user)
+      .represent(@build)
+  end
+
   private
 
   def build
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 677a8a1a73a..18b1a5cb395 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -10,7 +10,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   before_action :module_enabled
   before_action :merge_request, only: [
     :edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :pipelines, :merge, :merge_check,
-    :ci_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
+    :ci_status, :ci_cd_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
   ]
   before_action :validates_merge_request, only: [:show, :diffs, :commits, :pipelines]
   before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines]
@@ -473,6 +473,12 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     render json: response
   end
 
+  def ci_cd_status
+    render json: PipelineSerializer
+      .new(project: @project, user: @current_user)
+      .represent(@merge_request.head_pipeline)
+  end
+
   def ci_environments_status
     environments =
       begin
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 718d9e86bea..508d627889c 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -72,6 +72,12 @@ class Projects::PipelinesController < Projects::ApplicationController
     end
   end
 
+  def ci_cd_status
+    render json: PipelineSerializer
+      .new(project: @project, user: @current_user)
+      .represent(@pipeline)
+  end
+
   def stage
     @stage = pipeline.stage(params[:stage])
     return not_found unless @stage
diff --git a/app/serializers/build_entity.rb b/app/serializers/build_entity.rb
index 5bcbe285052..531b3768da3 100644
--- a/app/serializers/build_entity.rb
+++ b/app/serializers/build_entity.rb
@@ -19,6 +19,12 @@ class BuildEntity < Grape::Entity
   expose :created_at
   expose :updated_at
 
+  expose :status do |build, options|
+    StatusEntity.represent(
+      build.detailed_status(request.user),
+      options)
+  end
+
   private
 
   def path_to(route, build)
diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
new file mode 100644
index 00000000000..637aacc7be5
--- /dev/null
+++ b/app/serializers/build_serializer.rb
@@ -0,0 +1,3 @@
+class BuildSerializer < BaseSerializer
+  entity BuildEntity
+end
diff --git a/app/serializers/status_entity.rb b/app/serializers/status_entity.rb
index 47066bebfb1..dfd9d1584a1 100644
--- a/app/serializers/status_entity.rb
+++ b/app/serializers/status_entity.rb
@@ -1,7 +1,7 @@
 class StatusEntity < Grape::Entity
   include RequestAwareEntity
 
-  expose :icon, :text, :label, :group
+  expose :icon, :favicon, :text, :label, :group
 
   expose :has_details?, as: :has_details
   expose :details_path
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 44b8ae7aedd..2c6d4518772 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -102,6 +102,7 @@ constraints(ProjectUrlConstrainer.new) do
           get :merge_widget_refresh
           post :cancel_merge_when_pipeline_succeeds
           get :ci_status
+          get :ci_cd_status
           get :ci_environments_status
           post :toggle_subscription
           post :remove_wip
@@ -152,6 +153,7 @@ constraints(ProjectUrlConstrainer.new) do
           post :cancel
           post :retry
           get :builds
+          get :ci_cd_status
         end
       end
 
@@ -203,6 +205,7 @@ constraints(ProjectUrlConstrainer.new) do
           post :erase
           get :trace
           get :raw
+          get :ci_cd_status
         end
 
         resource :artifacts, only: [] do
diff --git a/lib/gitlab/ci/status/build/failed_allowed.rb b/lib/gitlab/ci/status/build/failed_allowed.rb
index 807afe24bd5..93c7475f47d 100644
--- a/lib/gitlab/ci/status/build/failed_allowed.rb
+++ b/lib/gitlab/ci/status/build/failed_allowed.rb
@@ -13,6 +13,10 @@ module Gitlab
             'icon_status_warning'
           end
 
+          def favicon
+            'build_status_warning'
+          end
+
           def group
             'failed_with_warnings'
           end
diff --git a/lib/gitlab/ci/status/canceled.rb b/lib/gitlab/ci/status/canceled.rb
index dd6d99e9075..e8558164602 100644
--- a/lib/gitlab/ci/status/canceled.rb
+++ b/lib/gitlab/ci/status/canceled.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_canceled'
         end
+
+        def favicon
+          'build_status_canceled'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/created.rb b/lib/gitlab/ci/status/created.rb
index 6596d7e01ca..1b01210077a 100644
--- a/lib/gitlab/ci/status/created.rb
+++ b/lib/gitlab/ci/status/created.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_created'
         end
+
+        def favicon
+          'build_status_created'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/failed.rb b/lib/gitlab/ci/status/failed.rb
index c5b5e3203ad..5b180ba45fb 100644
--- a/lib/gitlab/ci/status/failed.rb
+++ b/lib/gitlab/ci/status/failed.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_failed'
         end
+
+        def favicon
+          'build_status_failed'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/pending.rb b/lib/gitlab/ci/status/pending.rb
index d30f35a59a2..25ce6f4449e 100644
--- a/lib/gitlab/ci/status/pending.rb
+++ b/lib/gitlab/ci/status/pending.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_pending'
         end
+
+        def favicon
+          'build_status_pending'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/running.rb b/lib/gitlab/ci/status/running.rb
index 2aba3c373c7..59e6bf3812d 100644
--- a/lib/gitlab/ci/status/running.rb
+++ b/lib/gitlab/ci/status/running.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_running'
         end
+
+        def favicon
+          'build_status_running'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/skipped.rb b/lib/gitlab/ci/status/skipped.rb
index 16282aefd03..49ddeda5057 100644
--- a/lib/gitlab/ci/status/skipped.rb
+++ b/lib/gitlab/ci/status/skipped.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_skipped'
         end
+
+        def favicon
+          'build_status_skipped'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/success.rb b/lib/gitlab/ci/status/success.rb
index c09c5f006e3..428598d0e24 100644
--- a/lib/gitlab/ci/status/success.rb
+++ b/lib/gitlab/ci/status/success.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_success'
         end
+
+        def favicon
+          'build_status_success'
+        end
       end
     end
   end
diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index d4cdab6957a..8bb2a2e5e4e 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -20,6 +20,10 @@ module Gitlab
           'icon_status_warning'
         end
 
+        def favicon
+          'build_status_warning'
+        end
+        
         def group
           'success_with_warnings'
         end
-- 
GitLab


From ba27f1b954e79713ec1905b46ee5ba1b940418f0 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 3 Mar 2017 15:59:25 +0900
Subject: [PATCH 02/28] Expose only status. ci_cd_status to status. Support
 abstract class.

---
 app/controllers/projects/builds_controller.rb |  14 +-
 .../projects/merge_requests_controller.rb     |   5 +-
 .../projects/pipelines_controller.rb          |   3 +-
 app/serializers/build_entity.rb               |  14 +-
 app/serializers/build_serializer.rb           |  12 +
 app/serializers/pipeline_entity.rb            |  12 +-
 app/serializers/pipeline_serializer.rb        |   8 +
 config/routes/project.rb                      |   5 +-
 lib/gitlab/ci/status/core.rb                  |   4 +
 routes.txt                                    | 974 ++++++++++++++++++
 10 files changed, 1029 insertions(+), 22 deletions(-)
 create mode 100644 routes.txt

diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index 54650bc37a2..8d00f2bf1b2 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -73,8 +73,14 @@ class Projects::BuildsController < Projects::ApplicationController
     redirect_to build_path(@build)
   end
 
+  # def status
+  #   render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha)
+  # end
   def status
-    render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha)
+    render json: BuildSerializer
+      .new(project: @project, user: @current_user)
+      .with_status
+      .represent(@build)
   end
 
   def erase
@@ -91,12 +97,6 @@ class Projects::BuildsController < Projects::ApplicationController
     end
   end
 
-  def ci_cd_status
-    render json: BuildSerializer
-      .new(project: @project, user: @current_user)
-      .represent(@build)
-  end
-
   private
 
   def build
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 18b1a5cb395..5087abedf40 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -10,7 +10,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   before_action :module_enabled
   before_action :merge_request, only: [
     :edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :pipelines, :merge, :merge_check,
-    :ci_status, :ci_cd_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
+    :ci_status, :status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
   ]
   before_action :validates_merge_request, only: [:show, :diffs, :commits, :pipelines]
   before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines]
@@ -473,9 +473,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     render json: response
   end
 
-  def ci_cd_status
+  def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
+      .with_status
       .represent(@merge_request.head_pipeline)
   end
 
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 508d627889c..976827040ac 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -72,9 +72,10 @@ class Projects::PipelinesController < Projects::ApplicationController
     end
   end
 
-  def ci_cd_status
+  def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
+      .with_status
       .represent(@pipeline)
   end
 
diff --git a/app/serializers/build_entity.rb b/app/serializers/build_entity.rb
index 531b3768da3..10151d94e68 100644
--- a/app/serializers/build_entity.rb
+++ b/app/serializers/build_entity.rb
@@ -19,15 +19,21 @@ class BuildEntity < Grape::Entity
   expose :created_at
   expose :updated_at
 
-  expose :status do |build, options|
-    StatusEntity.represent(
-      build.detailed_status(request.user),
-      options)
+  expose :details do
+    expose :detailed_status,
+        as: :status,
+        with: StatusEntity
   end
 
   private
 
+  alias_method :build, :object
+
   def path_to(route, build)
     send("#{route}_path", build.project.namespace, build.project, build)
   end
+
+  def detailed_status
+    build.detailed_status(request.user)
+  end
 end
diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index 637aacc7be5..39460bbd092 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -1,3 +1,15 @@
 class BuildSerializer < BaseSerializer
   entity BuildEntity
+
+  def with_status
+    tap { @status_only = {only: [{details: [:status]}]} }
+  end
+
+  def represent(resource, opts = {})
+    if @status_only.present?
+      opts.merge!(@status_only)
+    end
+
+    super(resource, opts)
+  end
 end
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index 61f0f11d7d2..1c1fa9e3dee 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -12,11 +12,9 @@ class PipelineEntity < Grape::Entity
   end
 
   expose :details do
-    expose :status do |pipeline, options|
-      StatusEntity.represent(
-        pipeline.detailed_status(request.user),
-        options)
-    end
+    expose :detailed_status,
+      as: :status,
+      with: StatusEntity
 
     expose :duration
     expose :finished_at
@@ -82,4 +80,8 @@ class PipelineEntity < Grape::Entity
     pipeline.cancelable? &&
       can?(request.user, :update_pipeline, pipeline)
   end
+
+  def detailed_status
+    pipeline.detailed_status(request.user)
+  end
 end
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index ab2d3d5a3ec..4de9e620f64 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -11,11 +11,19 @@ class PipelineSerializer < BaseSerializer
     @paginator.present?
   end
 
+  def with_status
+    tap { @status_only = {only: [{details: [:status]}]} }
+  end
+
   def represent(resource, opts = {})
     if resource.is_a?(ActiveRecord::Relation)
       resource = resource.includes(project: :namespace)
     end
 
+    if @status_only.present?
+      opts.merge!(@status_only)
+    end
+
     if paginated?
       super(@paginator.paginate(resource), opts)
     else
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 2c6d4518772..1df066ff55d 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -102,7 +102,7 @@ constraints(ProjectUrlConstrainer.new) do
           get :merge_widget_refresh
           post :cancel_merge_when_pipeline_succeeds
           get :ci_status
-          get :ci_cd_status
+          get :status
           get :ci_environments_status
           post :toggle_subscription
           post :remove_wip
@@ -153,7 +153,7 @@ constraints(ProjectUrlConstrainer.new) do
           post :cancel
           post :retry
           get :builds
-          get :ci_cd_status
+          get :status
         end
       end
 
@@ -205,7 +205,6 @@ constraints(ProjectUrlConstrainer.new) do
           post :erase
           get :trace
           get :raw
-          get :ci_cd_status
         end
 
         resource :artifacts, only: [] do
diff --git a/lib/gitlab/ci/status/core.rb b/lib/gitlab/ci/status/core.rb
index 3dd2b9e01f6..d4fd83b93f8 100644
--- a/lib/gitlab/ci/status/core.rb
+++ b/lib/gitlab/ci/status/core.rb
@@ -18,6 +18,10 @@ module Gitlab
           raise NotImplementedError
         end
 
+        def favicon
+          raise NotImplementedError
+        end
+
         def label
           raise NotImplementedError
         end
diff --git a/routes.txt b/routes.txt
new file mode 100644
index 00000000000..f136b8d8eb7
--- /dev/null
+++ b/routes.txt
@@ -0,0 +1,974 @@
+                                                             Prefix Verb     URI Pattern                                                                                   Controller#Action
+                                                  letter_opener_web          /rails/letter_opener                                                                          LetterOpenerWeb::Engine
+                                                      ci_ci_api_api          /ci/api                                                                                       Ci::API::API
+                                                            ci_lint POST     /ci/lint(.:format)                                                                            ci/lints#create
+                                                                    GET      /ci/lint(.:format)                                                                            ci/lints#show
+                                                  status_ci_project GET      /ci/projects/:id/status(.:format)                                                             ci/projects#badge
+                                                        ci_projects GET      /ci/projects(.:format)                                                                        ci/projects#index
+                                                         ci_project GET      /ci/projects/:id(.:format)                                                                    ci/projects#show
+                                                            ci_root GET      /ci(.:format)                                                                                 ci/projects#index
+                                                                    GET      /oauth/authorize/:code(.:format)                                                              oauth/authorizations#show
+                                                oauth_authorization GET      /oauth/authorize(.:format)                                                                    oauth/authorizations#new
+                                                                    POST     /oauth/authorize(.:format)                                                                    oauth/authorizations#create
+                                                                    DELETE   /oauth/authorize(.:format)                                                                    oauth/authorizations#destroy
+                                                        oauth_token POST     /oauth/token(.:format)                                                                        doorkeeper/tokens#create
+                                                       oauth_revoke POST     /oauth/revoke(.:format)                                                                       doorkeeper/tokens#revoke
+                                                 oauth_applications GET      /oauth/applications(.:format)                                                                 oauth/applications#index
+                                                                    POST     /oauth/applications(.:format)                                                                 oauth/applications#create
+                                              new_oauth_application GET      /oauth/applications/new(.:format)                                                             oauth/applications#new
+                                             edit_oauth_application GET      /oauth/applications/:id/edit(.:format)                                                        oauth/applications#edit
+                                                  oauth_application GET      /oauth/applications/:id(.:format)                                                             oauth/applications#show
+                                                                    PATCH    /oauth/applications/:id(.:format)                                                             oauth/applications#update
+                                                                    PUT      /oauth/applications/:id(.:format)                                                             oauth/applications#update
+                                                                    DELETE   /oauth/applications/:id(.:format)                                                             oauth/applications#destroy
+                                      oauth_authorized_applications GET      /oauth/authorized_applications(.:format)                                                      oauth/authorized_applications#index
+                                       oauth_authorized_application DELETE   /oauth/authorized_applications/:id(.:format)                                                  oauth/authorized_applications#destroy
+                                                   oauth_token_info GET      /oauth/token/info(.:format)                                                                   doorkeeper/token_info#show
+                                                 autocomplete_users GET      /autocomplete/users(.:format)                                                                 autocomplete#users
+                                                                    GET      /autocomplete/users/:id(.:format)                                                             autocomplete#user
+                                              autocomplete_projects GET      /autocomplete/projects(.:format)                                                              autocomplete#projects
+                                                             emojis GET      /emojis(.:format)                                                                             emojis#index
+                                                             search GET      /search(.:format)                                                                             search#show
+                                                search_autocomplete GET      /search/autocomplete(.:format)                                                                search#autocomplete
+                                                           jwt_auth GET      /jwt/auth(.:format)                                                                           jwt#auth
+                                                       health_check GET      /health_check(/:checks)(.:format)                                                             health_check#index
+                                                             koding GET      /koding(.:format)                                                                             koding#index
+                                                            api_api          /api                                                                                          API::API
+                                                            sidekiq          /admin/sidekiq                                                                                Sidekiq::Web
+                                                               help GET      /help(.:format)                                                                               help#index
+                                                     help_shortcuts GET      /help/shortcuts(.:format)                                                                     help#shortcuts
+                                                            help_ui GET      /help/ui(.:format)                                                                            help#ui
+                                                          help_page GET      /help/*path(.:format)                                                                         help#show
+                                                        raw_snippet GET      /snippets/:id/raw(.:format)                                                                   snippets#raw
+                                                   download_snippet GET      /snippets/:id/download(.:format)                                                              snippets#download
+                                               mark_as_spam_snippet POST     /snippets/:id/mark_as_spam(.:format)                                                          snippets#mark_as_spam
+                                         toggle_award_emoji_snippet POST     /snippets/:id/toggle_award_emoji(.:format)                                                    snippets#toggle_award_emoji
+                                                           snippets GET      /snippets(.:format)                                                                           snippets#index
+                                                                    POST     /snippets(.:format)                                                                           snippets#create
+                                                        new_snippet GET      /snippets/new(.:format)                                                                       snippets#new
+                                                       edit_snippet GET      /snippets/:id/edit(.:format)                                                                  snippets#edit
+                                                            snippet GET      /snippets/:id(.:format)                                                                       snippets#show
+                                                                    PATCH    /snippets/:id(.:format)                                                                       snippets#update
+                                                                    PUT      /snippets/:id(.:format)                                                                       snippets#update
+                                                                    DELETE   /snippets/:id(.:format)                                                                       snippets#destroy
+                                                                    GET      /s/:username(.:format)                                                                        redirect(301, /u/%{username}/snippets) {:username=>/[a-zA-Z.0-9_\-]+(?<!\.atom)/}
+                                                      accept_invite POST     /invites/:id/accept(.:format)                                                                 invites#accept {:id=>/[A-Za-z0-9_-]+/}
+                                                     decline_invite GET|POST /invites/:id/decline(.:format)                                                                invites#decline {:id=>/[A-Za-z0-9_-]+/}
+                                                             invite GET      /invites/:id(.:format)                                                                        invites#show {:id=>/[A-Za-z0-9_-]+/}
+                                      unsubscribe_sent_notification GET      /sent_notifications/:id/unsubscribe(.:format)                                                 sent_notifications#unsubscribe {:id=>/\h{32}/}
+                                                      abuse_reports POST     /abuse_reports(.:format)                                                                      abuse_reports#create
+                                                   new_abuse_report GET      /abuse_reports/new(.:format)                                                                  abuse_reports#new
+                                              notification_settings POST     /notification_settings(.:format)                                                              notification_settings#create
+                                               notification_setting PATCH    /notification_settings/:id(.:format)                                                          notification_settings#update
+                                                                    PUT      /notification_settings/:id(.:format)                                                          notification_settings#update
+                                personal_access_token_import_github POST     /import/github/personal_access_token(.:format)                                                import/github#personal_access_token
+                                               status_import_github GET      /import/github/status(.:format)                                                               import/github#status
+                                             callback_import_github GET      /import/github/callback(.:format)                                                             import/github#callback
+                                                 jobs_import_github GET      /import/github/jobs(.:format)                                                                 import/github#jobs
+                                                      import_github POST     /import/github(.:format)                                                                      import/github#create
+                                                  new_import_github GET      /import/github/new(.:format)                                                                  import/github#new
+                                 personal_access_token_import_gitea POST     /import/gitea/personal_access_token(.:format)                                                 import/gitea#personal_access_token
+                                                status_import_gitea GET      /import/gitea/status(.:format)                                                                import/gitea#status
+                                                  jobs_import_gitea GET      /import/gitea/jobs(.:format)                                                                  import/gitea#jobs
+                                                       import_gitea POST     /import/gitea(.:format)                                                                       import/gitea#create
+                                                   new_import_gitea GET      /import/gitea/new(.:format)                                                                   import/gitea#new
+                                               status_import_gitlab GET      /import/gitlab/status(.:format)                                                               import/gitlab#status
+                                             callback_import_gitlab GET      /import/gitlab/callback(.:format)                                                             import/gitlab#callback
+                                                 jobs_import_gitlab GET      /import/gitlab/jobs(.:format)                                                                 import/gitlab#jobs
+                                                      import_gitlab POST     /import/gitlab(.:format)                                                                      import/gitlab#create
+                                            status_import_bitbucket GET      /import/bitbucket/status(.:format)                                                            import/bitbucket#status
+                                          callback_import_bitbucket GET      /import/bitbucket/callback(.:format)                                                          import/bitbucket#callback
+                                              jobs_import_bitbucket GET      /import/bitbucket/jobs(.:format)                                                              import/bitbucket#jobs
+                                                   import_bitbucket POST     /import/bitbucket(.:format)                                                                   import/bitbucket#create
+                                          status_import_google_code GET      /import/google_code/status(.:format)                                                          import/google_code#status
+                                        callback_import_google_code POST     /import/google_code/callback(.:format)                                                        import/google_code#callback
+                                            jobs_import_google_code GET      /import/google_code/jobs(.:format)                                                            import/google_code#jobs
+                                    new_user_map_import_google_code GET      /import/google_code/user_map(.:format)                                                        import/google_code#new_user_map
+                                 create_user_map_import_google_code POST     /import/google_code/user_map(.:format)                                                        import/google_code#create_user_map
+                                                 import_google_code POST     /import/google_code(.:format)                                                                 import/google_code#create
+                                             new_import_google_code GET      /import/google_code/new(.:format)                                                             import/google_code#new
+                                              status_import_fogbugz GET      /import/fogbugz/status(.:format)                                                              import/fogbugz#status
+                                            callback_import_fogbugz POST     /import/fogbugz/callback(.:format)                                                            import/fogbugz#callback
+                                                jobs_import_fogbugz GET      /import/fogbugz/jobs(.:format)                                                                import/fogbugz#jobs
+                                        new_user_map_import_fogbugz GET      /import/fogbugz/user_map(.:format)                                                            import/fogbugz#new_user_map
+                                     create_user_map_import_fogbugz POST     /import/fogbugz/user_map(.:format)                                                            import/fogbugz#create_user_map
+                                                     import_fogbugz POST     /import/fogbugz(.:format)                                                                     import/fogbugz#create
+                                                 new_import_fogbugz GET      /import/fogbugz/new(.:format)                                                                 import/fogbugz#new
+                                              import_gitlab_project POST     /import/gitlab_project(.:format)                                                              import/gitlab_projects#create
+                                                                    POST     /import/gitlab_project(.:format)                                                              import/gitlab_projects#create
+                                          new_import_gitlab_project GET      /import/gitlab_project/new(.:format)                                                          import/gitlab_projects#new
+                                                                    GET      /uploads/:model/:mounted_as/:id/:filename(.:format)                                           uploads#show {:model=>/note|user|group|project/, :mounted_as=>/avatar|attachment/, :filename=>/[^\/]+/}
+                                                                    GET      /uploads/:model/:mounted_as/:id/:filename(.:format)                                           uploads#show {:model=>/appearance/, :mounted_as=>/logo|header_logo/, :filename=>/.+/}
+                                                                    GET      /uploads/:namespace_id/:project_id/:secret/:filename(.:format)                                projects/uploads#show {:namespace_id=>/[a-zA-Z.0-9_\-]+/, :project_id=>/[a-zA-Z.0-9_\-]+/, :filename=>/[^\/]+/}
+                                                                    GET      /files/note/:id/:filename(.:format)                                                           redirect(301, uploads/note/attachment/%{id}/%{filename}) {:filename=>/[^\/]+/}
+                                          trending_explore_projects GET      /explore/projects/trending(.:format)                                                          explore/projects#trending
+                                           starred_explore_projects GET      /explore/projects/starred(.:format)                                                           explore/projects#starred
+                                                   explore_projects GET      /explore/projects(.:format)                                                                   explore/projects#index
+                                                     explore_groups GET      /explore/groups(.:format)                                                                     explore/groups#index
+                                                   explore_snippets GET      /explore/snippets(.:format)                                                                   explore/snippets#index
+                                                       explore_root GET      /explore(.:format)                                                                            explore/projects#trending
+                                                             public GET      /public(.:format)                                                                             explore/projects#index
+                                                    public_projects GET      /public/projects(.:format)                                                                    explore/projects#index
+                                                     admin_user_key GET      /admin/users/:user_id/keys/:id(.:format)                                                      admin/keys#show {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    DELETE   /admin/users/:user_id/keys/:id(.:format)                                                      admin/keys#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                              admin_user_identities GET      /admin/users/:user_id/identities(.:format)                                                    admin/identities#index {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    POST     /admin/users/:user_id/identities(.:format)                                                    admin/identities#create {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                            new_admin_user_identity GET      /admin/users/:user_id/identities/new(.:format)                                                admin/identities#new {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                           edit_admin_user_identity GET      /admin/users/:user_id/identities/:id/edit(.:format)                                           admin/identities#edit {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                admin_user_identity PATCH    /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    PUT      /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    DELETE   /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                projects_admin_user GET      /admin/users/:id/projects(.:format)                                                           admin/users#projects {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                    keys_admin_user GET      /admin/users/:id/keys(.:format)                                                               admin/users#keys {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                   block_admin_user PUT      /admin/users/:id/block(.:format)                                                              admin/users#block {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                 unblock_admin_user PUT      /admin/users/:id/unblock(.:format)                                                            admin/users#unblock {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                  unlock_admin_user PUT      /admin/users/:id/unlock(.:format)                                                             admin/users#unlock {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                 confirm_admin_user PUT      /admin/users/:id/confirm(.:format)                                                            admin/users#confirm {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                             impersonate_admin_user POST     /admin/users/:id/impersonate(.:format)                                                        admin/users#impersonate {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                      disable_two_factor_admin_user PATCH    /admin/users/:id/disable_two_factor(.:format)                                                 admin/users#disable_two_factor {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                            remove_email_admin_user DELETE   /admin/users/:id/remove/:email_id(.:format)                                                   admin/users#remove_email {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                        admin_users GET      /admin/users(.:format)                                                                        admin/users#index
+                                                                    POST     /admin/users(.:format)                                                                        admin/users#create
+                                                     new_admin_user GET      /admin/users/new(.:format)                                                                    admin/users#new
+                                                    edit_admin_user GET      /admin/users/:id/edit(.:format)                                                               admin/users#edit {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                         admin_user GET      /admin/users/:id(.:format)                                                                    admin/users#show {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    PATCH    /admin/users/:id(.:format)                                                                    admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    PUT      /admin/users/:id(.:format)                                                                    admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                                    DELETE   /admin/users/:id(.:format)                                                                    admin/users#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/}
+                                                admin_impersonation DELETE   /admin/impersonation(.:format)                                                                admin/impersonations#destroy
+                                                admin_abuse_reports GET      /admin/abuse_reports(.:format)                                                                admin/abuse_reports#index
+                                                 admin_abuse_report DELETE   /admin/abuse_reports/:id(.:format)                                                            admin/abuse_reports#destroy
+                                         mark_as_ham_admin_spam_log POST     /admin/spam_logs/:id/mark_as_ham(.:format)                                                    admin/spam_logs#mark_as_ham
+                                                    admin_spam_logs GET      /admin/spam_logs(.:format)                                                                    admin/spam_logs#index
+                                                     admin_spam_log DELETE   /admin/spam_logs/:id(.:format)                                                                admin/spam_logs#destroy
+                                                 admin_applications GET      /admin/applications(.:format)                                                                 admin/applications#index
+                                                                    POST     /admin/applications(.:format)                                                                 admin/applications#create
+                                              new_admin_application GET      /admin/applications/new(.:format)                                                             admin/applications#new
+                                             edit_admin_application GET      /admin/applications/:id/edit(.:format)                                                        admin/applications#edit
+                                                  admin_application GET      /admin/applications/:id(.:format)                                                             admin/applications#show
+                                                                    PATCH    /admin/applications/:id(.:format)                                                             admin/applications#update
+                                                                    PUT      /admin/applications/:id(.:format)                                                             admin/applications#update
+                                                                    DELETE   /admin/applications/:id(.:format)                                                             admin/applications#destroy
+                                                       admin_groups GET      /admin/groups(.:format)                                                                       admin/groups#index
+                                                                    POST     /admin/groups(.:format)                                                                       admin/groups#create
+                                                    new_admin_group GET      /admin/groups/new(.:format)                                                                   admin/groups#new
+                                         admin_group_members_update PUT      /admin/groups/*id/members_update(.:format)                                                    admin/groups#members_update {:format=>/(html|json|atom)/}
+                                                   admin_group_edit GET      /admin/groups/*id/edit(.:format)                                                              admin/groups#edit {:format=>/(html|json|atom)/}
+                                                        admin_group GET      /admin/groups/*id(.:format)                                                                   admin/groups#show {:format=>/(html|json|atom)/}
+                                                                    PATCH    /admin/groups/*id(.:format)                                                                   admin/groups#update {:format=>/(html|json|atom)/}
+                                                                    PUT      /admin/groups/*id(.:format)                                                                   admin/groups#update {:format=>/(html|json|atom)/}
+                                                                    DELETE   /admin/groups/*id(.:format)                                                                   admin/groups#destroy {:format=>/(html|json|atom)/}
+                                                  admin_deploy_keys GET      /admin/deploy_keys(.:format)                                                                  admin/deploy_keys#index
+                                                                    POST     /admin/deploy_keys(.:format)                                                                  admin/deploy_keys#create
+                                               new_admin_deploy_key GET      /admin/deploy_keys/new(.:format)                                                              admin/deploy_keys#new
+                                                   admin_deploy_key DELETE   /admin/deploy_keys/:id(.:format)                                                              admin/deploy_keys#destroy
+                                                    admin_hook_test GET      /admin/hooks/:hook_id/test(.:format)                                                          admin/hooks#test
+                                                        admin_hooks GET      /admin/hooks(.:format)                                                                        admin/hooks#index
+                                                                    POST     /admin/hooks(.:format)                                                                        admin/hooks#create
+                                                         admin_hook DELETE   /admin/hooks/:id(.:format)                                                                    admin/hooks#destroy
+                                   preview_admin_broadcast_messages POST     /admin/broadcast_messages/preview(.:format)                                                   admin/broadcast_messages#preview
+                                           admin_broadcast_messages GET      /admin/broadcast_messages(.:format)                                                           admin/broadcast_messages#index
+                                                                    POST     /admin/broadcast_messages(.:format)                                                           admin/broadcast_messages#create
+                                       edit_admin_broadcast_message GET      /admin/broadcast_messages/:id/edit(.:format)                                                  admin/broadcast_messages#edit
+                                            admin_broadcast_message PATCH    /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#update
+                                                                    PUT      /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#update
+                                                                    DELETE   /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#destroy
+                                                         admin_logs GET      /admin/logs(.:format)                                                                         admin/logs#show
+                                                 admin_health_check GET      /admin/health_check(.:format)                                                                 admin/health_check#show
+                                              admin_background_jobs GET      /admin/background_jobs(.:format)                                                              admin/background_jobs#show
+                                                  admin_system_info GET      /admin/system_info(.:format)                                                                  admin/system_info#show
+                                            admin_requests_profiles GET      /admin/requests_profiles(.:format)                                                            admin/requests_profiles#index
+                                             admin_requests_profile GET      /admin/requests_profiles/:name(.:format)                                                      admin/requests_profiles#show {:name=>/.+\.html/}
+                                                     admin_projects GET      /admin/projects(.:format)                                                                     admin/projects#index
+                                   transfer_admin_namespace_project PUT      /admin/projects/*namespace_id/:id/transfer(.:format)                                          admin/projects#transfer {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                           repository_check_admin_namespace_project POST     /admin/projects/*namespace_id/:id/repository_check(.:format)                                  admin/projects#repository_check {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                            admin_namespace_project_runner_projects POST     /admin/projects/*namespace_id/:project_id/runner_projects(.:format)                           admin/runner_projects#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             admin_namespace_project_runner_project DELETE   /admin/projects/*namespace_id/:project_id/runner_projects/:id(.:format)                       admin/runner_projects#destroy {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            admin_namespace_project GET      /admin/projects/*namespace_id/:id(.:format)                                                   admin/projects#show {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          preview_admin_appearances GET      /admin/appearance/preview(.:format)                                                           admin/appearances#preview
+                                             logo_admin_appearances DELETE   /admin/appearance/logo(.:format)                                                              admin/appearances#logo
+                                     header_logos_admin_appearances DELETE   /admin/appearance/header_logos(.:format)                                                      admin/appearances#header_logos
+                                                  admin_appearances POST     /admin/appearance(.:format)                                                                   admin/appearances#create
+                                                                    GET      /admin/appearance(.:format)                                                                   admin/appearances#show
+                                                                    PATCH    /admin/appearance(.:format)                                                                   admin/appearances#update
+                                                                    PUT      /admin/appearance(.:format)                                                                   admin/appearances#update
+                                admin_application_settings_services GET      /admin/application_settings/services(.:format)                                                admin/services#index
+                            edit_admin_application_settings_service GET      /admin/application_settings/services/:id/edit(.:format)                                       admin/services#edit
+                                 admin_application_settings_service PATCH    /admin/application_settings/services/:id(.:format)                                            admin/services#update
+                                                                    PUT      /admin/application_settings/services/:id(.:format)                                            admin/services#update
+                     reset_runners_token_admin_application_settings PUT      /admin/application_settings/reset_runners_token(.:format)                                     admin/application_settings#reset_runners_token
+                reset_health_check_token_admin_application_settings PUT      /admin/application_settings/reset_health_check_token(.:format)                                admin/application_settings#reset_health_check_token
+           clear_repository_check_states_admin_application_settings PUT      /admin/application_settings/clear_repository_check_states(.:format)                           admin/application_settings#clear_repository_check_states
+                                         admin_application_settings GET      /admin/application_settings(.:format)                                                         admin/application_settings#show
+                                                                    PATCH    /admin/application_settings(.:format)                                                         admin/application_settings#update
+                                                                    PUT      /admin/application_settings(.:format)                                                         admin/application_settings#update
+                                                       admin_labels GET      /admin/labels(.:format)                                                                       admin/labels#index
+                                                                    POST     /admin/labels(.:format)                                                                       admin/labels#create
+                                                    new_admin_label GET      /admin/labels/new(.:format)                                                                   admin/labels#new
+                                                   edit_admin_label GET      /admin/labels/:id/edit(.:format)                                                              admin/labels#edit
+                                                        admin_label GET      /admin/labels/:id(.:format)                                                                   admin/labels#show
+                                                                    PATCH    /admin/labels/:id(.:format)                                                                   admin/labels#update
+                                                                    PUT      /admin/labels/:id(.:format)                                                                   admin/labels#update
+                                                                    DELETE   /admin/labels/:id(.:format)                                                                   admin/labels#destroy
+                                                resume_admin_runner GET      /admin/runners/:id/resume(.:format)                                                           admin/runners#resume
+                                                 pause_admin_runner GET      /admin/runners/:id/pause(.:format)                                                            admin/runners#pause
+                                                      admin_runners GET      /admin/runners(.:format)                                                                      admin/runners#index
+                                                       admin_runner GET      /admin/runners/:id(.:format)                                                                  admin/runners#show
+                                                                    PATCH    /admin/runners/:id(.:format)                                                                  admin/runners#update
+                                                                    PUT      /admin/runners/:id(.:format)                                                                  admin/runners#update
+                                                                    DELETE   /admin/runners/:id(.:format)                                                                  admin/runners#destroy
+                                            cancel_all_admin_builds POST     /admin/builds/cancel_all(.:format)                                                            admin/builds#cancel_all
+                                                       admin_builds GET      /admin/builds(.:format)                                                                       admin/builds#index
+                                                         admin_root GET      /admin(.:format)                                                                              admin/dashboard#index
+                                                  audit_log_profile GET      /profile/audit_log(.:format)                                                                  profiles#audit_log
+                                               applications_profile GET      /profile/applications(.:format)                                                               oauth/applications#index
+                                        reset_private_token_profile PUT      /profile/reset_private_token(.:format)                                                        profiles#reset_private_token
+                                 reset_incoming_email_token_profile PUT      /profile/reset_incoming_email_token(.:format)                                                 profiles#reset_incoming_email_token
+                                            update_username_profile PUT      /profile/update_username(.:format)                                                            profiles#update_username
+                                             unlink_profile_account DELETE   /profile/account/unlink(.:format)                                                             profiles/accounts#unlink
+                                                    profile_account GET      /profile/account(.:format)                                                                    profiles/accounts#show
+                                              profile_notifications GET      /profile/notifications(.:format)                                                              profiles/notifications#show
+                                                                    PATCH    /profile/notifications(.:format)                                                              profiles/notifications#update
+                                                                    PUT      /profile/notifications(.:format)                                                              profiles/notifications#update
+                                             reset_profile_password PUT      /profile/password/reset(.:format)                                                             profiles/passwords#reset
+                                                   profile_password POST     /profile/password(.:format)                                                                   profiles/passwords#create
+                                               new_profile_password GET      /profile/password/new(.:format)                                                               profiles/passwords#new
+                                              edit_profile_password GET      /profile/password/edit(.:format)                                                              profiles/passwords#edit
+                                                                    PATCH    /profile/password(.:format)                                                                   profiles/passwords#update
+                                                                    PUT      /profile/password(.:format)                                                                   profiles/passwords#update
+                                                profile_preferences GET      /profile/preferences(.:format)                                                                profiles/preferences#show
+                                                                    PATCH    /profile/preferences(.:format)                                                                profiles/preferences#update
+                                                                    PUT      /profile/preferences(.:format)                                                                profiles/preferences#update
+                                                       profile_keys GET      /profile/keys(.:format)                                                                       profiles/keys#index
+                                                                    POST     /profile/keys(.:format)                                                                       profiles/keys#create
+                                                    new_profile_key GET      /profile/keys/new(.:format)                                                                   profiles/keys#new
+                                                        profile_key GET      /profile/keys/:id(.:format)                                                                   profiles/keys#show
+                                                                    DELETE   /profile/keys/:id(.:format)                                                                   profiles/keys#destroy
+                                                     profile_emails GET      /profile/emails(.:format)                                                                     profiles/emails#index
+                                                                    POST     /profile/emails(.:format)                                                                     profiles/emails#create
+                                                      profile_email DELETE   /profile/emails/:id(.:format)                                                                 profiles/emails#destroy
+                                            deny_profile_chat_names DELETE   /profile/chat_names/deny(.:format)                                                            profiles/chat_names#deny
+                                                 profile_chat_names GET      /profile/chat_names(.:format)                                                                 profiles/chat_names#index
+                                                                    POST     /profile/chat_names(.:format)                                                                 profiles/chat_names#create
+                                              new_profile_chat_name GET      /profile/chat_names/new(.:format)                                                             profiles/chat_names#new
+                                                  profile_chat_name DELETE   /profile/chat_names/:id(.:format)                                                             profiles/chat_names#destroy
+                                                     profile_avatar DELETE   /profile/avatar(.:format)                                                                     profiles/avatars#destroy
+                               revoke_profile_personal_access_token PUT      /profile/personal_access_tokens/:id/revoke(.:format)                                          profiles/personal_access_tokens#revoke
+                                     profile_personal_access_tokens GET      /profile/personal_access_tokens(.:format)                                                     profiles/personal_access_tokens#index
+                                                                    POST     /profile/personal_access_tokens(.:format)                                                     profiles/personal_access_tokens#create
+                                 create_u2f_profile_two_factor_auth POST     /profile/two_factor_auth/create_u2f(.:format)                                                 profiles/two_factor_auths#create_u2f
+                                      codes_profile_two_factor_auth POST     /profile/two_factor_auth/codes(.:format)                                                      profiles/two_factor_auths#codes
+                                       skip_profile_two_factor_auth PATCH    /profile/two_factor_auth/skip(.:format)                                                       profiles/two_factor_auths#skip
+                                            profile_two_factor_auth POST     /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#create
+                                                                    GET      /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#show
+                                                                    DELETE   /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#destroy
+                                           profile_u2f_registration DELETE   /profile/u2f_registrations/:id(.:format)                                                      profiles/u2f_registrations#destroy
+                                                            profile GET      /profile(.:format)                                                                            profiles#show
+                                                                    PATCH    /profile(.:format)                                                                            profiles#update
+                                                                    PUT      /profile(.:format)                                                                            profiles#update
+                                                   issues_dashboard GET      /dashboard/issues(.:format)                                                                   dashboard#issues
+                                           merge_requests_dashboard GET      /dashboard/merge_requests(.:format)                                                           dashboard#merge_requests
+                                                 activity_dashboard GET      /dashboard/activity(.:format)                                                                 dashboard#activity
+                                               dashboard_milestones GET      /dashboard/milestones(.:format)                                                               dashboard/milestones#index
+                                                dashboard_milestone GET      /dashboard/milestones/:id(.:format)                                                           dashboard/milestones#show
+                                                   dashboard_labels GET      /dashboard/labels(.:format)                                                                   dashboard/labels#index
+                                                   dashboard_groups GET      /dashboard/groups(.:format)                                                                   dashboard/groups#index
+                                                 dashboard_snippets GET      /dashboard/snippets(.:format)                                                                 dashboard/snippets#index
+                                        destroy_all_dashboard_todos DELETE   /dashboard/todos/destroy_all(.:format)                                                        dashboard/todos#destroy_all
+                                             restore_dashboard_todo PATCH    /dashboard/todos/:id/restore(.:format)                                                        dashboard/todos#restore
+                                                    dashboard_todos GET      /dashboard/todos(.:format)                                                                    dashboard/todos#index
+                                                     dashboard_todo DELETE   /dashboard/todos/:id(.:format)                                                                dashboard/todos#destroy
+                                         starred_dashboard_projects GET      /dashboard/projects/starred(.:format)                                                         dashboard/projects#starred
+                                                 dashboard_projects GET      /dashboard/projects(.:format)                                                                 dashboard/projects#index
+                                                     root_dashboard GET      /dashboard(.:format)                                                                          dashboard/projects#index
+                                                             groups GET      /groups(.:format)                                                                             groups#index
+                                                                    POST     /groups(.:format)                                                                             groups#create
+                                                          new_group GET      /groups/new(.:format)                                                                         groups#new
+                                   resend_invite_group_group_member POST     /groups/*group_id/group_members/:id/resend_invite(.:format)                                   groups/group_members#resend_invite
+                                          leave_group_group_members DELETE   /groups/*group_id/group_members/leave(.:format)                                               groups/group_members#leave
+                                 request_access_group_group_members POST     /groups/*group_id/group_members/request_access(.:format)                                      groups/group_members#request_access
+                          approve_access_request_group_group_member POST     /groups/*group_id/group_members/:id/approve_access_request(.:format)                          groups/group_members#approve_access_request
+                                                group_group_members GET      /groups/*group_id/group_members(.:format)                                                     groups/group_members#index
+                                                                    POST     /groups/*group_id/group_members(.:format)                                                     groups/group_members#create
+                                                 group_group_member PATCH    /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#update
+                                                                    PUT      /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#update
+                                                                    DELETE   /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#destroy
+                                                       group_avatar DELETE   /groups/*group_id/avatar(.:format)                                                            groups/avatars#destroy
+                                                   group_milestones GET      /groups/*group_id/milestones(.:format)                                                        groups/milestones#index
+                                                                    POST     /groups/*group_id/milestones(.:format)                                                        groups/milestones#create
+                                                new_group_milestone GET      /groups/*group_id/milestones/new(.:format)                                                    groups/milestones#new
+                                                    group_milestone GET      /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#show {:id=>/[^\/]+/}
+                                                                    PATCH    /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#update {:id=>/[^\/]+/}
+                                                                    PUT      /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#update {:id=>/[^\/]+/}
+                                    toggle_subscription_group_label POST     /groups/*group_id/labels/:id/toggle_subscription(.:format)                                    groups/labels#toggle_subscription
+                                                       group_labels GET      /groups/*group_id/labels(.:format)                                                            groups/labels#index
+                                                                    POST     /groups/*group_id/labels(.:format)                                                            groups/labels#create
+                                                    new_group_label GET      /groups/*group_id/labels/new(.:format)                                                        groups/labels#new
+                                                   edit_group_label GET      /groups/*group_id/labels/:id/edit(.:format)                                                   groups/labels#edit
+                                                        group_label PATCH    /groups/*group_id/labels/:id(.:format)                                                        groups/labels#update
+                                                                    PUT      /groups/*group_id/labels/:id(.:format)                                                        groups/labels#update
+                                                                    DELETE   /groups/*group_id/labels/:id(.:format)                                                        groups/labels#destroy
+                                                         edit_group GET      /groups/*id/edit(.:format)                                                                    groups#edit {:format=>/(html|json|atom)/}
+                                                       issues_group GET      /groups/*id/issues(.:format)                                                                  groups#issues {:format=>/(html|json|atom)/}
+                                               merge_requests_group GET      /groups/*id/merge_requests(.:format)                                                          groups#merge_requests {:format=>/(html|json|atom)/}
+                                                     projects_group GET      /groups/*id/projects(.:format)                                                                groups#projects {:format=>/(html|json|atom)/}
+                                                     activity_group GET      /groups/*id/activity(.:format)                                                                groups#activity {:format=>/(html|json|atom)/}
+                                                    subgroups_group GET      /groups/*id/subgroups(.:format)                                                               groups#subgroups {:format=>/(html|json|atom)/}
+                                                    group_canonical GET      /groups/*id(.:format)                                                                         groups#show {:format=>/(html|json|atom)/}
+                                                   new_user_session GET      /users/sign_in(.:format)                                                                      sessions#new
+                                                       user_session POST     /users/sign_in(.:format)                                                                      sessions#create
+                                               destroy_user_session DELETE   /users/sign_out(.:format)                                                                     sessions#destroy
+                                                      user_password POST     /users/password(.:format)                                                                     passwords#create
+                                                  new_user_password GET      /users/password/new(.:format)                                                                 passwords#new
+                                                 edit_user_password GET      /users/password/edit(.:format)                                                                passwords#edit
+                                                                    PATCH    /users/password(.:format)                                                                     passwords#update
+                                                                    PUT      /users/password(.:format)                                                                     passwords#update
+                                           cancel_user_registration GET      /users/cancel(.:format)                                                                       registrations#cancel
+                                                  user_registration POST     /users(.:format)                                                                              registrations#create
+                                              new_user_registration GET      /users/sign_up(.:format)                                                                      registrations#new
+                                             edit_user_registration GET      /users/edit(.:format)                                                                         registrations#edit
+                                                                    PATCH    /users(.:format)                                                                              registrations#update
+                                                                    PUT      /users(.:format)                                                                              registrations#update
+                                                                    DELETE   /users(.:format)                                                                              registrations#destroy
+                                                  user_confirmation POST     /users/confirmation(.:format)                                                                 confirmations#create
+                                              new_user_confirmation GET      /users/confirmation/new(.:format)                                                             confirmations#new
+                                                                    GET      /users/confirmation(.:format)                                                                 confirmations#show
+                                                        user_unlock POST     /users/unlock(.:format)                                                                       devise/unlocks#create
+                                                    new_user_unlock GET      /users/unlock/new(.:format)                                                                   devise/unlocks#new
+                                                                    GET      /users/unlock(.:format)                                                                       devise/unlocks#show
+                                                     omniauth_error GET      /users/auth/:provider/omniauth_error(.:format)                                                omniauth_callbacks#omniauth_error
+                                                 users_almost_there GET      /users/almost_there(.:format)                                                                 confirmations#almost_there
+                                                                    GET      /:username.keys(.:format)                                                                     profiles/keys#get_keys {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                               user GET      /:username(.:format)                                                                          users#show {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                      user_calendar GET      /users/:username/calendar(.:format)                                                           users#calendar {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                           user_calendar_activities GET      /users/:username/calendar_activities(.:format)                                                users#calendar_activities {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                        user_groups GET      /users/:username/groups(.:format)                                                             users#groups {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                      user_projects GET      /users/:username/projects(.:format)                                                           users#projects {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                          user_contributed_projects GET      /users/:username/contributed(.:format)                                                        users#contributed {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                      user_snippets GET      /users/:username/snippets(.:format)                                                           users#snippets {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                        user_exists GET      /users/:username/exists(.:format)                                                             users#exists {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /users/:username(.:format)                                                                    redirect(301, /%{username}) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /u/:username(.:format)                                                                        redirect(301, /%{username}) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /u/:username/groups(.:format)                                                                 redirect(301, /users/%{username}/groups) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /u/:username/projects(.:format)                                                               redirect(301, /users/%{username}/projects) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /u/:username/snippets(.:format)                                                               redirect(301, /users/%{username}/snippets) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                                    GET      /u/:username/contributed(.:format)                                                            redirect(301, /users/%{username}/contributed) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
+                                                           projects GET      /projects(.:format)                                                                           projects#index
+                                                                    POST     /projects(.:format)                                                                           projects#create
+                                                        new_project GET      /projects/new(.:format)                                                                       projects#new
+                                                          info_refs GET      /*namespace_id/:project_id/info/refs(.:format)                                                projects/git_http#info_refs {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                    git_upload_pack POST     /*namespace_id/:project_id/git-upload-pack(.:format)                                          projects/git_http#git_upload_pack {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                   git_receive_pack POST     /*namespace_id/:project_id/git-receive-pack(.:format)                                         projects/git_http#git_receive_pack {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                              batch POST     /*namespace_id/:project_id/info/lfs/objects/batch(.:format)                                   projects/lfs_api#batch {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    POST     /*namespace_id/:project_id/info/lfs/objects(.:format)                                         projects/lfs_api#deprecated {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    GET      /*namespace_id/:project_id/info/lfs/objects/*oid(.:format)                                    projects/lfs_api#deprecated {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    GET      /*namespace_id/:project_id/gitlab-lfs/objects/*oid(.:format)                                  projects/lfs_storage#download {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    PUT      /*namespace_id/:project_id/gitlab-lfs/objects/*oid/*size/authorize(.:format)                  projects/lfs_storage#upload_authorize {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    PUT      /*namespace_id/:project_id/gitlab-lfs/objects/*oid/*size(.:format)                            projects/lfs_storage#upload_finalize {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
+                                                                    GET      /*namespace_id/:project_id/info/refs(.:format)                                                redirect(301) {:format=>nil, :project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                      emojis_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/emojis(.:format)                              projects/autocomplete_sources#emojis {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                     members_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/members(.:format)                             projects/autocomplete_sources#members {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                      issues_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/issues(.:format)                              projects/autocomplete_sources#issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+              merge_requests_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/merge_requests(.:format)                      projects/autocomplete_sources#merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                      labels_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/labels(.:format)                              projects/autocomplete_sources#labels {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                  milestones_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/milestones(.:format)                          projects/autocomplete_sources#milestones {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                    commands_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/commands(.:format)                            projects/autocomplete_sources#commands {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         namespace_project_template GET      /*namespace_id/:project_id/templates/:template_type/:key(.:format)                            projects/templates#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           namespace_project_avatar GET      /*namespace_id/:project_id/avatar(.:format)                                                   projects/avatars#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:project_id/avatar(.:format)                                                   projects/avatars#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  branches_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/branches(.:format)                                      projects/commit#branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                                 pipelines_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/pipelines(.:format)                                     projects/commit#pipelines {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                                    revert_namespace_project_commit POST     /*namespace_id/:project_id/commit/:id/revert(.:format)                                        projects/commit#revert {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                               cherry_pick_namespace_project_commit POST     /*namespace_id/:project_id/commit/:id/cherry_pick(.:format)                                   projects/commit#cherry_pick {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                             diff_for_path_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/diff_for_path(.:format)                                 projects/commit#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                                           namespace_project_commit GET      /*namespace_id/:project_id/commit/:id(.:format)                                               projects/commit#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
+                                    namespace_project_pages_domains POST     /*namespace_id/:project_id/pages/domains(.:format)                                            projects/pages_domains#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 new_namespace_project_pages_domain GET      /*namespace_id/:project_id/pages/domains/new(.:format)                                        projects/pages_domains#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     namespace_project_pages_domain GET      /*namespace_id/:project_id/pages/domains/:id(.:format)                                        projects/pages_domains#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                                                    DELETE   /*namespace_id/:project_id/pages/domains/:id(.:format)                                        projects/pages_domains#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                            namespace_project_pages GET      /*namespace_id/:project_id/pages(.:format)                                                    projects/pages#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:project_id/pages(.:format)                                                    projects/pages#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                      diff_for_path_namespace_project_compare_index GET      /*namespace_id/:project_id/compare/diff_for_path(.:format)                                    projects/compare#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    namespace_project_compare_index GET      /*namespace_id/:project_id/compare(.:format)                                                  projects/compare#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/compare(.:format)                                                  projects/compare#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          namespace_project_compare GET      /*namespace_id/:project_id/compare/:from...:to(.:format)                                      projects/compare#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :from=>/.+/, :to=>/.+/}
+                                          namespace_project_network GET      /*namespace_id/:project_id/network/:id                                                        projects/network#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                    commits_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/commits                                                 projects/graphs#commits {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                         ci_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/ci                                                      projects/graphs#ci {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                  languages_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/languages                                               projects/graphs#languages {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                            namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id                                                         projects/graphs#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                      raw_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id/raw(.:format)                                         projects/snippets#raw {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                             mark_as_spam_namespace_project_snippet POST     /*namespace_id/:project_id/snippets/:id/mark_as_spam(.:format)                                projects/snippets#mark_as_spam {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                       toggle_award_emoji_namespace_project_snippet POST     /*namespace_id/:project_id/snippets/:id/toggle_award_emoji(.:format)                          projects/snippets#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                         namespace_project_snippets GET      /*namespace_id/:project_id/snippets(.:format)                                                 projects/snippets#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/snippets(.:format)                                                 projects/snippets#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      new_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/new(.:format)                                             projects/snippets#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     edit_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id/edit(.:format)                                        projects/snippets#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                          namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PATCH    /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                     test_namespace_project_service GET      /*namespace_id/:project_id/services/:id/test(.:format)                                        projects/services#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                         namespace_project_services GET      /*namespace_id/:project_id/services(.:format)                                                 projects/services#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     edit_namespace_project_service GET      /*namespace_id/:project_id/services/:id/edit(.:format)                                        projects/services#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                          namespace_project_service PATCH    /*namespace_id/:project_id/services/:id(.:format)                                             projects/services#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                                                    PUT      /*namespace_id/:project_id/services/:id(.:format)                                             projects/services#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
+                                       namespace_project_mattermost POST     /*namespace_id/:project_id/mattermost(.:format)                                               projects/mattermosts#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   new_namespace_project_mattermost GET      /*namespace_id/:project_id/mattermost/new(.:format)                                           projects/mattermosts#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                enable_namespace_project_deploy_key PUT      /*namespace_id/:project_id/deploy_keys/:id/enable(.:format)                                   projects/deploy_keys#enable {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                               disable_namespace_project_deploy_key PUT      /*namespace_id/:project_id/deploy_keys/:id/disable(.:format)                                  projects/deploy_keys#disable {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                      namespace_project_deploy_keys GET      /*namespace_id/:project_id/deploy_keys(.:format)                                              projects/deploy_keys#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/deploy_keys(.:format)                                              projects/deploy_keys#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   new_namespace_project_deploy_key GET      /*namespace_id/:project_id/deploy_keys/new(.:format)                                          projects/deploy_keys#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            namespace_project_forks GET      /*namespace_id/:project_id/forks(.:format)                                                    projects/forks#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/forks(.:format)                                                    projects/forks#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         new_namespace_project_fork GET      /*namespace_id/:project_id/forks/new(.:format)                                                projects/forks#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           namespace_project_import POST     /*namespace_id/:project_id/import(.:format)                                                   projects/imports#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       new_namespace_project_import GET      /*namespace_id/:project_id/import/new(.:format)                                               projects/imports#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    GET      /*namespace_id/:project_id/import(.:format)                                                   projects/imports#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                            commits_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/commits(.:format)                               projects/merge_requests#commits {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                              diffs_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/diffs(.:format)                                 projects/merge_requests#diffs {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                          conflicts_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/conflicts(.:format)                             projects/merge_requests#conflicts {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                  conflict_for_path_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/conflict_for_path(.:format)                     projects/merge_requests#conflict_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                          pipelines_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/pipelines(.:format)                             projects/merge_requests#pipelines {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                        merge_check_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/merge_check(.:format)                           projects/merge_requests#merge_check {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                              merge_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/merge(.:format)                                 projects/merge_requests#merge {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+               merge_widget_refresh_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/merge_widget_refresh(.:format)                  projects/merge_requests#merge_widget_refresh {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+cancel_merge_when_pipeline_succeeds_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/cancel_merge_when_pipeline_succeeds(.:format)   projects/merge_requests#cancel_merge_when_pipeline_succeeds {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                          ci_status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/ci_status(.:format)                             projects/merge_requests#ci_status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                             status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/status(.:format)                                projects/merge_requests#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+             ci_environments_status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/ci_environments_status(.:format)                projects/merge_requests#ci_environments_status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                toggle_subscription_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/toggle_subscription(.:format)                   projects/merge_requests#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                         remove_wip_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/remove_wip(.:format)                            projects/merge_requests#remove_wip {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                      diff_for_path_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/diff_for_path(.:format)                         projects/merge_requests#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                  resolve_conflicts_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/resolve_conflicts(.:format)                     projects/merge_requests#resolve_conflicts {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+              assign_related_issues_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/assign_related_issues(.:format)                 projects/merge_requests#assign_related_issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                       branch_from_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/branch_from(.:format)                               projects/merge_requests#branch_from {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                         branch_to_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/branch_to(.:format)                                 projects/merge_requests#branch_to {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                   update_branches_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/update_branches(.:format)                           projects/merge_requests#update_branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                     diff_for_path_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/diff_for_path(.:format)                             projects/merge_requests#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                       bulk_update_namespace_project_merge_requests POST     /*namespace_id/:project_id/merge_requests/bulk_update(.:format)                               projects/merge_requests#bulk_update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                         new_diffs_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/new/diffs(.:format)                                 projects/merge_requests#new_diffs {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                 resolve_namespace_project_merge_request_discussion POST     /*namespace_id/:project_id/merge_requests/:merge_request_id/discussions/:id/resolve(.:format) projects/discussions#resolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{40}/, :merge_request_id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/merge_requests/:merge_request_id/discussions/:id/resolve(.:format) projects/discussions#unresolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{40}/, :merge_request_id=>/\d+/}
+                 toggle_award_emoji_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/toggle_award_emoji(.:format)                    projects/merge_requests#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                   namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests(.:format)                                           projects/merge_requests#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/merge_requests(.:format)                                           projects/merge_requests#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                new_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/new(.:format)                                       projects/merge_requests#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                               edit_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/edit(.:format)                                  projects/merge_requests#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                    namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PATCH    /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                         namespace_project_branches GET      /*namespace_id/:project_id/branches(.:format)                                                 projects/branches#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/branches(.:format)                                                 projects/branches#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       new_namespace_project_branch GET      /*namespace_id/:project_id/branches/new(.:format)                                             projects/branches#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           namespace_project_branch DELETE   /*namespace_id/:project_id/branches/:id(.:format)                                             projects/branches#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                  namespace_project_merged_branches DELETE   /*namespace_id/:project_id/merged_branches(.:format)                                          projects/branches#destroy_all_merged {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 edit_namespace_project_tag_release GET      /*namespace_id/:project_id/tags/:tag_id/release/edit(.:format)                                projects/releases#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                      namespace_project_tag_release PATCH    /*namespace_id/:project_id/tags/:tag_id/release(.:format)                                     projects/releases#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                                                    PUT      /*namespace_id/:project_id/tags/:tag_id/release(.:format)                                     projects/releases#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                             namespace_project_tags GET      /*namespace_id/:project_id/tags(.:format)                                                     projects/tags#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/tags(.:format)                                                     projects/tags#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          new_namespace_project_tag GET      /*namespace_id/:project_id/tags/new(.:format)                                                 projects/tags#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                              namespace_project_tag GET      /*namespace_id/:project_id/tags/:id(.:format)                                                 projects/tags#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                                                    DELETE   /*namespace_id/:project_id/tags/:id(.:format)                                                 projects/tags#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                               namespace_project_protected_branches GET      /*namespace_id/:project_id/protected_branches(.:format)                                       projects/protected_branches#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/protected_branches(.:format)                                       projects/protected_branches#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 namespace_project_protected_branch GET      /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                                                    PATCH    /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                                                    PUT      /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                                                    DELETE   /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                        namespace_project_variables GET      /*namespace_id/:project_id/variables(.:format)                                                projects/variables#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/variables(.:format)                                                projects/variables#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         namespace_project_variable GET      /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PATCH    /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         namespace_project_triggers GET      /*namespace_id/:project_id/triggers(.:format)                                                 projects/triggers#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/triggers(.:format)                                                 projects/triggers#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          namespace_project_trigger DELETE   /*namespace_id/:project_id/triggers/:id(.:format)                                             projects/triggers#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                               namespace_project_pipelines_settings GET      /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PATCH    /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   stage_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/stage(.:format)                                      projects/pipelines#stage {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  cancel_namespace_project_pipeline POST     /*namespace_id/:project_id/pipelines/:id/cancel(.:format)                                     projects/pipelines#cancel {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   retry_namespace_project_pipeline POST     /*namespace_id/:project_id/pipelines/:id/retry(.:format)                                      projects/pipelines#retry {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  builds_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/builds(.:format)                                     projects/pipelines#builds {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  status_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/status(.:format)                                     projects/pipelines#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                        namespace_project_pipelines GET      /*namespace_id/:project_id/pipelines(.:format)                                                projects/pipelines#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/pipelines(.:format)                                                projects/pipelines#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     new_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/new(.:format)                                            projects/pipelines#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id(.:format)                                            projects/pipelines#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 stop_namespace_project_environment POST     /*namespace_id/:project_id/environments/:id/stop(.:format)                                    projects/environments#stop {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             terminal_namespace_project_environment GET      /*namespace_id/:project_id/environments/:id/terminal(.:format)                                projects/environments#terminal {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    GET      /*namespace_id/:project_id/environments/:id/terminal.ws/authorize(.:format)                   projects/environments#terminal_websocket_authorize {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>nil}
+                              folder_namespace_project_environments GET      /*namespace_id/:project_id/environments/folders/:id(.:format)                                 projects/environments#folder {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     namespace_project_environments GET      /*namespace_id/:project_id/environments(.:format)                                             projects/environments#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/environments(.:format)                                             projects/environments#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  new_namespace_project_environment GET      /*namespace_id/:project_id/environments/new(.:format)                                         projects/environments#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 edit_namespace_project_environment GET      /*namespace_id/:project_id/environments/:id/edit(.:format)                                    projects/environments#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      namespace_project_environment GET      /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PATCH    /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  namespace_project_cycle_analytics GET      /*namespace_id/:project_id/cycle_analytics(.:format)                                          projects/cycle_analytics#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                            namespace_project_cycle_analytics_issue GET      /*namespace_id/:project_id/cycle_analytics/events/issue(.:format)                             projects/cycle_analytics/events#issue {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             namespace_project_cycle_analytics_plan GET      /*namespace_id/:project_id/cycle_analytics/events/plan(.:format)                              projects/cycle_analytics/events#plan {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             namespace_project_cycle_analytics_code GET      /*namespace_id/:project_id/cycle_analytics/events/code(.:format)                              projects/cycle_analytics/events#code {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             namespace_project_cycle_analytics_test GET      /*namespace_id/:project_id/cycle_analytics/events/test(.:format)                              projects/cycle_analytics/events#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                           namespace_project_cycle_analytics_review GET      /*namespace_id/:project_id/cycle_analytics/events/review(.:format)                            projects/cycle_analytics/events#review {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                          namespace_project_cycle_analytics_staging GET      /*namespace_id/:project_id/cycle_analytics/events/staging(.:format)                           projects/cycle_analytics/events#staging {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                       namespace_project_cycle_analytics_production GET      /*namespace_id/:project_id/cycle_analytics/events/production(.:format)                        projects/cycle_analytics/events#production {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                cancel_all_namespace_project_builds POST     /*namespace_id/:project_id/builds/cancel_all(.:format)                                        projects/builds#cancel_all {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                       latest_succeeded_namespace_project_artifacts GET      /*namespace_id/:project_id/builds/artifacts/*ref_name_and_path                                projects/artifacts#latest_succeeded {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     status_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/status(.:format)                                        projects/builds#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                     cancel_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/cancel(.:format)                                        projects/builds#cancel {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                      retry_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/retry(.:format)                                         projects/builds#retry {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                       play_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/play(.:format)                                          projects/builds#play {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                      erase_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/erase(.:format)                                         projects/builds#erase {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                      trace_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/trace(.:format)                                         projects/builds#trace {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                        raw_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/raw(.:format)                                           projects/builds#raw {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                         download_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/download(.:format)                      projects/artifacts#download {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
+                           browse_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/browse(/*path)                          projects/artifacts#browse {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
+                             file_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/file/*path                              projects/artifacts#file {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
+                             keep_namespace_project_build_artifacts POST     /*namespace_id/:project_id/builds/:build_id/artifacts/keep(.:format)                          projects/artifacts#keep {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
+                                           namespace_project_builds GET      /*namespace_id/:project_id/builds(.:format)                                                   projects/builds#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            namespace_project_build GET      /*namespace_id/:project_id/builds/:id(.:format)                                               projects/builds#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                        test_namespace_project_hook GET      /*namespace_id/:project_id/hooks/:id/test(.:format)                                           projects/hooks#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                            namespace_project_hooks GET      /*namespace_id/:project_id/hooks(.:format)                                                    projects/hooks#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/hooks(.:format)                                                    projects/hooks#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                             namespace_project_hook DELETE   /*namespace_id/:project_id/hooks/:id(.:format)                                                projects/hooks#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                         namespace_project_container_registry_index GET      /*namespace_id/:project_id/container_registry(.:format)                                       projects/container_registry#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                               namespace_project_container_registry DELETE   /*namespace_id/:project_id/container_registry/:id(.:format)                                   projects/container_registry#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                            sort_issues_namespace_project_milestone PUT      /*namespace_id/:project_id/milestones/:id/sort_issues(.:format)                               projects/milestones#sort_issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                    sort_merge_requests_namespace_project_milestone PUT      /*namespace_id/:project_id/milestones/:id/sort_merge_requests(.:format)                       projects/milestones#sort_merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                       namespace_project_milestones GET      /*namespace_id/:project_id/milestones(.:format)                                               projects/milestones#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/milestones(.:format)                                               projects/milestones#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    new_namespace_project_milestone GET      /*namespace_id/:project_id/milestones/new(.:format)                                           projects/milestones#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   edit_namespace_project_milestone GET      /*namespace_id/:project_id/milestones/:id/edit(.:format)                                      projects/milestones#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                        namespace_project_milestone GET      /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PATCH    /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                  generate_namespace_project_labels POST     /*namespace_id/:project_id/labels/generate(.:format)                                          projects/labels#generate {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                            set_priorities_namespace_project_labels POST     /*namespace_id/:project_id/labels/set_priorities(.:format)                                    projects/labels#set_priorities {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    promote_namespace_project_label POST     /*namespace_id/:project_id/labels/:id/promote(.:format)                                       projects/labels#promote {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                        toggle_subscription_namespace_project_label POST     /*namespace_id/:project_id/labels/:id/toggle_subscription(.:format)                           projects/labels#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                            remove_priority_namespace_project_label DELETE   /*namespace_id/:project_id/labels/:id/remove_priority(.:format)                               projects/labels#remove_priority {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                           namespace_project_labels GET      /*namespace_id/:project_id/labels(.:format)                                                   projects/labels#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/labels(.:format)                                                   projects/labels#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                        new_namespace_project_label GET      /*namespace_id/:project_id/labels/new(.:format)                                               projects/labels#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       edit_namespace_project_label GET      /*namespace_id/:project_id/labels/:id/edit(.:format)                                          projects/labels#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                            namespace_project_label PATCH    /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                        toggle_subscription_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/toggle_subscription(.:format)                           projects/issues#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                               mark_as_spam_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/mark_as_spam(.:format)                                  projects/issues#mark_as_spam {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                  referenced_merge_requests_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/referenced_merge_requests(.:format)                     projects/issues#referenced_merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                           related_branches_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/related_branches(.:format)                              projects/issues#related_branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                          can_create_branch_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/can_create_branch(.:format)                             projects/issues#can_create_branch {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                               bulk_update_namespace_project_issues POST     /*namespace_id/:project_id/issues/bulk_update(.:format)                                       projects/issues#bulk_update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                         toggle_award_emoji_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/toggle_award_emoji(.:format)                            projects/issues#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                           namespace_project_issues GET      /*namespace_id/:project_id/issues(.:format)                                                   projects/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/issues(.:format)                                                   projects/issues#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                        new_namespace_project_issue GET      /*namespace_id/:project_id/issues/new(.:format)                                               projects/issues#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       edit_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/edit(.:format)                                          projects/issues#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                            namespace_project_issue GET      /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PATCH    /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                            leave_namespace_project_project_members DELETE   /*namespace_id/:project_id/project_members/leave(.:format)                                    projects/project_members#leave {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                           import_namespace_project_project_members GET      /*namespace_id/:project_id/project_members/import(.:format)                                   projects/project_members#import {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                     apply_import_namespace_project_project_members POST     /*namespace_id/:project_id/project_members/apply_import(.:format)                             projects/project_members#apply_import {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                     resend_invite_namespace_project_project_member POST     /*namespace_id/:project_id/project_members/:id/resend_invite(.:format)                        projects/project_members#resend_invite {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
+                   request_access_namespace_project_project_members POST     /*namespace_id/:project_id/project_members/request_access(.:format)                           projects/project_members#request_access {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+            approve_access_request_namespace_project_project_member POST     /*namespace_id/:project_id/project_members/:id/approve_access_request(.:format)               projects/project_members#approve_access_request {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
+                                  namespace_project_project_members GET      /*namespace_id/:project_id/project_members(.:format)                                          projects/project_members#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/project_members(.:format)                                          projects/project_members#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   namespace_project_project_member PATCH    /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
+                                                                    PUT      /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
+                                                                    DELETE   /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
+                                      namespace_project_group_links GET      /*namespace_id/:project_id/group_links(.:format)                                              projects/group_links#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/group_links(.:format)                                              projects/group_links#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       namespace_project_group_link PATCH    /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                           delete_attachment_namespace_project_note DELETE   /*namespace_id/:project_id/notes/:id/delete_attachment(.:format)                              projects/notes#delete_attachment {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                     resolve_namespace_project_note POST     /*namespace_id/:project_id/notes/:id/resolve(.:format)                                        projects/notes#resolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/notes/:id/resolve(.:format)                                        projects/notes#unresolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                          toggle_award_emoji_namespace_project_note POST     /*namespace_id/:project_id/notes/:id/toggle_award_emoji(.:format)                             projects/notes#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                            namespace_project_notes GET      /*namespace_id/:project_id/notes(.:format)                                                    projects/notes#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/notes(.:format)                                                    projects/notes#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                             namespace_project_note PATCH    /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    PUT      /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                                                    DELETE   /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
+                                     namespace_project_board_issues GET      /*namespace_id/:project_id/boards/:board_id/issues(.:format)                                  projects/boards/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      namespace_project_board_issue PATCH    /*namespace_id/:project_id/boards/:board_id/issues/:id(.:format)                              projects/boards/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/boards/:board_id/issues/:id(.:format)                              projects/boards/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                             generate_namespace_project_board_lists POST     /*namespace_id/:project_id/boards/:board_id/lists/generate(.:format)                          projects/boards/lists#generate {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                namespace_project_board_list_issues GET      /*namespace_id/:project_id/boards/:board_id/lists/:list_id/issues(.:format)                   projects/boards/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/boards/:board_id/lists/:list_id/issues(.:format)                   projects/boards/issues#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      namespace_project_board_lists GET      /*namespace_id/:project_id/boards/:board_id/lists(.:format)                                   projects/boards/lists#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/boards/:board_id/lists(.:format)                                   projects/boards/lists#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                       namespace_project_board_list PATCH    /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           namespace_project_boards GET      /*namespace_id/:project_id/boards(.:format)                                                   projects/boards#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            namespace_project_board GET      /*namespace_id/:project_id/boards/:id(.:format)                                               projects/boards#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            namespace_project_todos POST     /*namespace_id/:project_id/todos(.:format)                                                    projects/todos#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     show_namespace_project_uploads GET      /*namespace_id/:project_id/uploads/:secret/:filename(.:format)                                projects/uploads#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :filename=>/[^\/]+/}
+                                          namespace_project_uploads POST     /*namespace_id/:project_id/uploads(.:format)                                                  projects/uploads#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    resume_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/resume(.:format)                                       projects/runners#resume {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     pause_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/pause(.:format)                                        projects/runners#pause {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                    toggle_shared_runners_namespace_project_runners POST     /*namespace_id/:project_id/runners/toggle_shared_runners(.:format)                            projects/runners#toggle_shared_runners {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          namespace_project_runners GET      /*namespace_id/:project_id/runners(.:format)                                                  projects/runners#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      edit_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/edit(.:format)                                         projects/runners#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           namespace_project_runner GET      /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PATCH    /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  namespace_project_runner_projects POST     /*namespace_id/:project_id/runner_projects(.:format)                                          projects/runner_projects#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   namespace_project_runner_project DELETE   /*namespace_id/:project_id/runner_projects/:id(.:format)                                      projects/runner_projects#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     build_namespace_project_badges GET      /*namespace_id/:project_id/badges/*ref/build(.:format)                                        projects/badges#build {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/svg/}
+                                  coverage_namespace_project_badges GET      /*namespace_id/:project_id/badges/*ref/coverage(.:format)                                     projects/badges#coverage {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/svg/}
+                                           namespace_project_badges GET      /*namespace_id/:project_id/badges(.:format)                                                   projects/badges#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 namespace_project_settings_members GET      /*namespace_id/:project_id/settings/members(.:format)                                         projects/settings/members#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                   namespace_project_settings_ci_cd GET      /*namespace_id/:project_id/settings/ci_cd(.:format)                                           projects/settings/ci_cd#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                            namespace_project_settings_integrations GET      /*namespace_id/:project_id/settings/integrations(.:format)                                    projects/settings/integrations#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 namespace_project_wikis_git_access GET      /*namespace_id/:project_id/wikis/git_access(.:format)                                         projects/wikis#git_access {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      namespace_project_wikis_pages GET      /*namespace_id/:project_id/wikis/pages(.:format)                                              projects/wikis#pages {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                            namespace_project_wikis GET      /*namespace_id/:project_id/wikis(.:format)                                                    redirect(301, /%{namespace_id}/%{project_id}/wikis/home) {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    POST     /*namespace_id/:project_id/wikis(.:format)                                                    projects/wikis#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                        namespace_project_wiki_edit GET      /*namespace_id/:project_id/wikis/*id/edit                                                     projects/wikis#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                                     namespace_project_wiki_history GET      /*namespace_id/:project_id/wikis/*id/history                                                  projects/wikis#history {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                            namespace_project_wiki_preview_markdown POST     /*namespace_id/:project_id/wikis/*id/preview_markdown                                         projects/wikis#preview_markdown {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                                             namespace_project_wiki GET      /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                                                                    PUT      /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                                                                    DELETE   /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
+                               archive_namespace_project_repository GET      /*namespace_id/:project_id/repository/archive(.:format)                                       projects/repositories#archive {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/(zip|tar|tar\.gz|tgz|gz|tar\.bz2|tbz|tbz2|tb2|bz2)/}
+                                       namespace_project_repository POST     /*namespace_id/:project_id/repository(.:format)                                               projects/repositories#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      switch_namespace_project_refs GET      /*namespace_id/:project_id/refs/switch(.:format)                                              projects/refs#switch {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    logs_tree_namespace_project_ref GET      /*namespace_id/:project_id/refs/:id/logs_tree(.:format)                                       projects/refs#logs_tree {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
+        (?!
+           (?# doesn't begins with)
+           \/|                    (?# rule #6)
+           (?# doesn't contain)
+           .*(?:
+              [\/.]\.|            (?# rule #1,3)
+              \/\/|               (?# rule #6)
+              @\{|                (?# rule #8)
+              \\                  (?# rule #9)
+           )
+        )
+        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
+        (?# doesn't end with)
+        (?<!\.lock)               (?# rule #1)
+        (?<![\/.])                (?# rule #6-7)
+      /x}
+                                    logs_file_namespace_project_ref GET      /*namespace_id/:project_id/refs/:id/logs_tree/*path(.:format)                                 projects/refs#logs_tree {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :path=>/.*/, :id=>/.*/}
+                                         namespace_project_new_blob GET      /*namespace_id/:project_id/new/*id(.:format)                                                  projects/blob#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                      namespace_project_create_blob POST     /*namespace_id/:project_id/create/*id(.:format)                                               projects/blob#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                        namespace_project_edit_blob GET      /*namespace_id/:project_id/edit/*id(.:format)                                                 projects/blob#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                      namespace_project_update_blob PUT      /*namespace_id/:project_id/update/*id(.:format)                                               projects/blob#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                     namespace_project_preview_blob POST     /*namespace_id/:project_id/preview/*id(.:format)                                              projects/blob#preview {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                        namespace_project_blob_diff GET      /*namespace_id/:project_id/blob/*id/diff(.:format)                                            projects/blob#diff {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
+                                             namespace_project_blob GET      /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
+                                                                    DELETE   /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
+                                                                    POST     /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
+                                                                    PUT      /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
+                                              namespace_project_raw GET      /*namespace_id/:project_id/raw/*id(.:format)                                                  projects/raw#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
+                                             namespace_project_tree GET      /*namespace_id/:project_id/tree/*id(.:format)                                                 projects/tree#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
+                                        namespace_project_find_file GET      /*namespace_id/:project_id/find_file/*id(.:format)                                            projects/find_file#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/html/}
+                                            namespace_project_files GET      /*namespace_id/:project_id/files/*id(.:format)                                                projects/find_file#list {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/(?:[^.]|\.(?!json$))+/, :format=>/json/}
+                                       namespace_project_create_dir POST     /*namespace_id/:project_id/create_dir/*id(.:format)                                           projects/tree#create_dir {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
+                                            namespace_project_blame GET      /*namespace_id/:project_id/blame/*id(.:format)                                                projects/blame#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
+                                          namespace_project_commits GET      /*namespace_id/:project_id/commits/*id(.:format)                                              projects/commits#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>false}
+                                         transfer_namespace_project PUT      /*namespace_id/:id/transfer(.:format)                                                         projects#transfer {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      remove_fork_namespace_project DELETE   /*namespace_id/:id/remove_fork(.:format)                                                      projects#remove_fork {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                          archive_namespace_project POST     /*namespace_id/:id/archive(.:format)                                                          projects#archive {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                        unarchive_namespace_project POST     /*namespace_id/:id/unarchive(.:format)                                                        projects#unarchive {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                     housekeeping_namespace_project POST     /*namespace_id/:id/housekeeping(.:format)                                                     projects#housekeeping {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                      toggle_star_namespace_project POST     /*namespace_id/:id/toggle_star(.:format)                                                      projects#toggle_star {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                 preview_markdown_namespace_project POST     /*namespace_id/:id/preview_markdown(.:format)                                                 projects#preview_markdown {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                           export_namespace_project POST     /*namespace_id/:id/export(.:format)                                                           projects#export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                    remove_export_namespace_project POST     /*namespace_id/:id/remove_export(.:format)                                                    projects#remove_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                              generate_new_export_namespace_project POST     /*namespace_id/:id/generate_new_export(.:format)                                              projects#generate_new_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                  download_export_namespace_project GET      /*namespace_id/:id/download_export(.:format)                                                  projects#download_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                         activity_namespace_project GET      /*namespace_id/:id/activity(.:format)                                                         projects#activity {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                             refs_namespace_project GET      /*namespace_id/:id/refs(.:format)                                                             projects#refs {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                new_issue_address_namespace_project PUT      /*namespace_id/:id/new_issue_address(.:format)                                                projects#new_issue_address {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                             edit_namespace_project GET      /*namespace_id/:id/edit(.:format)                                                             projects#edit {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                  namespace_project GET      /*namespace_id/:id(.:format)                                                                  projects#show {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PATCH    /*namespace_id/:id(.:format)                                                                  projects#update {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    PUT      /*namespace_id/:id(.:format)                                                                  projects#update {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                                    DELETE   /*namespace_id/:id(.:format)                                                                  projects#destroy {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
+                                                               root GET      /                                                                                             root#index
+                                                              group GET      /*id(.:format)                                                                                groups#show {:format=>/(html|json|atom)/}
+                                                                    PATCH    /*id(.:format)                                                                                groups#update {:format=>/(html|json|atom)/}
+                                                                    PUT      /*id(.:format)                                                                                groups#update {:format=>/(html|json|atom)/}
+                                                                    DELETE   /*id(.:format)                                                                                groups#destroy {:format=>/(html|json|atom)/}
+                                                                    GET      /*unmatched_route(.:format)                                                                   application#route_not_found
+                                                                    GET      /health_check(/:checks)(.:format)                                                             health_check/health_check#index
+
+Routes for LetterOpenerWeb::Engine:
+clear_letters DELETE /clear(.:format)                 letter_opener_web/letters#clear
+delete_letter DELETE /:id(.:format)                   letter_opener_web/letters#destroy
+      letters GET    /                                letter_opener_web/letters#index
+       letter GET    /:id(/:style)(.:format)          letter_opener_web/letters#show
+              GET    /:id/attachments/:file(.:format) letter_opener_web/letters#attachment
-- 
GitLab


From 6d6127f665e8645216bf2c679f8e3a13b22bab35 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 3 Mar 2017 16:46:07 +0900
Subject: [PATCH 03/28] change favicon name

---
 lib/gitlab/ci/status/build/failed_allowed.rb |   2 +-
 lib/gitlab/ci/status/canceled.rb             |   2 +-
 lib/gitlab/ci/status/created.rb              |   2 +-
 lib/gitlab/ci/status/failed.rb               |   2 +-
 lib/gitlab/ci/status/pending.rb              |   2 +-
 lib/gitlab/ci/status/running.rb              |   2 +-
 lib/gitlab/ci/status/skipped.rb              |   2 +-
 lib/gitlab/ci/status/success.rb              |   2 +-
 lib/gitlab/ci/status/success_warning.rb      |   2 +-
 routes.txt                                   | 974 -------------------
 10 files changed, 9 insertions(+), 983 deletions(-)
 delete mode 100644 routes.txt

diff --git a/lib/gitlab/ci/status/build/failed_allowed.rb b/lib/gitlab/ci/status/build/failed_allowed.rb
index 93c7475f47d..8693bd5849f 100644
--- a/lib/gitlab/ci/status/build/failed_allowed.rb
+++ b/lib/gitlab/ci/status/build/failed_allowed.rb
@@ -14,7 +14,7 @@ module Gitlab
           end
 
           def favicon
-            'build_status_warning'
+            'favicon_status_warning'
           end
 
           def group
diff --git a/lib/gitlab/ci/status/canceled.rb b/lib/gitlab/ci/status/canceled.rb
index e8558164602..97c121ce7b9 100644
--- a/lib/gitlab/ci/status/canceled.rb
+++ b/lib/gitlab/ci/status/canceled.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_canceled'
+          'favicon_status_canceled'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/created.rb b/lib/gitlab/ci/status/created.rb
index 1b01210077a..0721bf6ec7c 100644
--- a/lib/gitlab/ci/status/created.rb
+++ b/lib/gitlab/ci/status/created.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_created'
+          'favicon_status_created'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/failed.rb b/lib/gitlab/ci/status/failed.rb
index 5b180ba45fb..cb75e9383a8 100644
--- a/lib/gitlab/ci/status/failed.rb
+++ b/lib/gitlab/ci/status/failed.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_failed'
+          'favicon_status_failed'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/pending.rb b/lib/gitlab/ci/status/pending.rb
index 25ce6f4449e..f40cc1314dc 100644
--- a/lib/gitlab/ci/status/pending.rb
+++ b/lib/gitlab/ci/status/pending.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_pending'
+          'favicon_status_pending'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/running.rb b/lib/gitlab/ci/status/running.rb
index 59e6bf3812d..1237cd47dc8 100644
--- a/lib/gitlab/ci/status/running.rb
+++ b/lib/gitlab/ci/status/running.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_running'
+          'favicon_status_running'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/skipped.rb b/lib/gitlab/ci/status/skipped.rb
index 49ddeda5057..28005d91503 100644
--- a/lib/gitlab/ci/status/skipped.rb
+++ b/lib/gitlab/ci/status/skipped.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_skipped'
+          'favicon_status_skipped'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/success.rb b/lib/gitlab/ci/status/success.rb
index 428598d0e24..88f7758a270 100644
--- a/lib/gitlab/ci/status/success.rb
+++ b/lib/gitlab/ci/status/success.rb
@@ -15,7 +15,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_success'
+          'favicon_status_success'
         end
       end
     end
diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index 8bb2a2e5e4e..5b640162100 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -21,7 +21,7 @@ module Gitlab
         end
 
         def favicon
-          'build_status_warning'
+          'favicon_status_warning'
         end
         
         def group
diff --git a/routes.txt b/routes.txt
deleted file mode 100644
index f136b8d8eb7..00000000000
--- a/routes.txt
+++ /dev/null
@@ -1,974 +0,0 @@
-                                                             Prefix Verb     URI Pattern                                                                                   Controller#Action
-                                                  letter_opener_web          /rails/letter_opener                                                                          LetterOpenerWeb::Engine
-                                                      ci_ci_api_api          /ci/api                                                                                       Ci::API::API
-                                                            ci_lint POST     /ci/lint(.:format)                                                                            ci/lints#create
-                                                                    GET      /ci/lint(.:format)                                                                            ci/lints#show
-                                                  status_ci_project GET      /ci/projects/:id/status(.:format)                                                             ci/projects#badge
-                                                        ci_projects GET      /ci/projects(.:format)                                                                        ci/projects#index
-                                                         ci_project GET      /ci/projects/:id(.:format)                                                                    ci/projects#show
-                                                            ci_root GET      /ci(.:format)                                                                                 ci/projects#index
-                                                                    GET      /oauth/authorize/:code(.:format)                                                              oauth/authorizations#show
-                                                oauth_authorization GET      /oauth/authorize(.:format)                                                                    oauth/authorizations#new
-                                                                    POST     /oauth/authorize(.:format)                                                                    oauth/authorizations#create
-                                                                    DELETE   /oauth/authorize(.:format)                                                                    oauth/authorizations#destroy
-                                                        oauth_token POST     /oauth/token(.:format)                                                                        doorkeeper/tokens#create
-                                                       oauth_revoke POST     /oauth/revoke(.:format)                                                                       doorkeeper/tokens#revoke
-                                                 oauth_applications GET      /oauth/applications(.:format)                                                                 oauth/applications#index
-                                                                    POST     /oauth/applications(.:format)                                                                 oauth/applications#create
-                                              new_oauth_application GET      /oauth/applications/new(.:format)                                                             oauth/applications#new
-                                             edit_oauth_application GET      /oauth/applications/:id/edit(.:format)                                                        oauth/applications#edit
-                                                  oauth_application GET      /oauth/applications/:id(.:format)                                                             oauth/applications#show
-                                                                    PATCH    /oauth/applications/:id(.:format)                                                             oauth/applications#update
-                                                                    PUT      /oauth/applications/:id(.:format)                                                             oauth/applications#update
-                                                                    DELETE   /oauth/applications/:id(.:format)                                                             oauth/applications#destroy
-                                      oauth_authorized_applications GET      /oauth/authorized_applications(.:format)                                                      oauth/authorized_applications#index
-                                       oauth_authorized_application DELETE   /oauth/authorized_applications/:id(.:format)                                                  oauth/authorized_applications#destroy
-                                                   oauth_token_info GET      /oauth/token/info(.:format)                                                                   doorkeeper/token_info#show
-                                                 autocomplete_users GET      /autocomplete/users(.:format)                                                                 autocomplete#users
-                                                                    GET      /autocomplete/users/:id(.:format)                                                             autocomplete#user
-                                              autocomplete_projects GET      /autocomplete/projects(.:format)                                                              autocomplete#projects
-                                                             emojis GET      /emojis(.:format)                                                                             emojis#index
-                                                             search GET      /search(.:format)                                                                             search#show
-                                                search_autocomplete GET      /search/autocomplete(.:format)                                                                search#autocomplete
-                                                           jwt_auth GET      /jwt/auth(.:format)                                                                           jwt#auth
-                                                       health_check GET      /health_check(/:checks)(.:format)                                                             health_check#index
-                                                             koding GET      /koding(.:format)                                                                             koding#index
-                                                            api_api          /api                                                                                          API::API
-                                                            sidekiq          /admin/sidekiq                                                                                Sidekiq::Web
-                                                               help GET      /help(.:format)                                                                               help#index
-                                                     help_shortcuts GET      /help/shortcuts(.:format)                                                                     help#shortcuts
-                                                            help_ui GET      /help/ui(.:format)                                                                            help#ui
-                                                          help_page GET      /help/*path(.:format)                                                                         help#show
-                                                        raw_snippet GET      /snippets/:id/raw(.:format)                                                                   snippets#raw
-                                                   download_snippet GET      /snippets/:id/download(.:format)                                                              snippets#download
-                                               mark_as_spam_snippet POST     /snippets/:id/mark_as_spam(.:format)                                                          snippets#mark_as_spam
-                                         toggle_award_emoji_snippet POST     /snippets/:id/toggle_award_emoji(.:format)                                                    snippets#toggle_award_emoji
-                                                           snippets GET      /snippets(.:format)                                                                           snippets#index
-                                                                    POST     /snippets(.:format)                                                                           snippets#create
-                                                        new_snippet GET      /snippets/new(.:format)                                                                       snippets#new
-                                                       edit_snippet GET      /snippets/:id/edit(.:format)                                                                  snippets#edit
-                                                            snippet GET      /snippets/:id(.:format)                                                                       snippets#show
-                                                                    PATCH    /snippets/:id(.:format)                                                                       snippets#update
-                                                                    PUT      /snippets/:id(.:format)                                                                       snippets#update
-                                                                    DELETE   /snippets/:id(.:format)                                                                       snippets#destroy
-                                                                    GET      /s/:username(.:format)                                                                        redirect(301, /u/%{username}/snippets) {:username=>/[a-zA-Z.0-9_\-]+(?<!\.atom)/}
-                                                      accept_invite POST     /invites/:id/accept(.:format)                                                                 invites#accept {:id=>/[A-Za-z0-9_-]+/}
-                                                     decline_invite GET|POST /invites/:id/decline(.:format)                                                                invites#decline {:id=>/[A-Za-z0-9_-]+/}
-                                                             invite GET      /invites/:id(.:format)                                                                        invites#show {:id=>/[A-Za-z0-9_-]+/}
-                                      unsubscribe_sent_notification GET      /sent_notifications/:id/unsubscribe(.:format)                                                 sent_notifications#unsubscribe {:id=>/\h{32}/}
-                                                      abuse_reports POST     /abuse_reports(.:format)                                                                      abuse_reports#create
-                                                   new_abuse_report GET      /abuse_reports/new(.:format)                                                                  abuse_reports#new
-                                              notification_settings POST     /notification_settings(.:format)                                                              notification_settings#create
-                                               notification_setting PATCH    /notification_settings/:id(.:format)                                                          notification_settings#update
-                                                                    PUT      /notification_settings/:id(.:format)                                                          notification_settings#update
-                                personal_access_token_import_github POST     /import/github/personal_access_token(.:format)                                                import/github#personal_access_token
-                                               status_import_github GET      /import/github/status(.:format)                                                               import/github#status
-                                             callback_import_github GET      /import/github/callback(.:format)                                                             import/github#callback
-                                                 jobs_import_github GET      /import/github/jobs(.:format)                                                                 import/github#jobs
-                                                      import_github POST     /import/github(.:format)                                                                      import/github#create
-                                                  new_import_github GET      /import/github/new(.:format)                                                                  import/github#new
-                                 personal_access_token_import_gitea POST     /import/gitea/personal_access_token(.:format)                                                 import/gitea#personal_access_token
-                                                status_import_gitea GET      /import/gitea/status(.:format)                                                                import/gitea#status
-                                                  jobs_import_gitea GET      /import/gitea/jobs(.:format)                                                                  import/gitea#jobs
-                                                       import_gitea POST     /import/gitea(.:format)                                                                       import/gitea#create
-                                                   new_import_gitea GET      /import/gitea/new(.:format)                                                                   import/gitea#new
-                                               status_import_gitlab GET      /import/gitlab/status(.:format)                                                               import/gitlab#status
-                                             callback_import_gitlab GET      /import/gitlab/callback(.:format)                                                             import/gitlab#callback
-                                                 jobs_import_gitlab GET      /import/gitlab/jobs(.:format)                                                                 import/gitlab#jobs
-                                                      import_gitlab POST     /import/gitlab(.:format)                                                                      import/gitlab#create
-                                            status_import_bitbucket GET      /import/bitbucket/status(.:format)                                                            import/bitbucket#status
-                                          callback_import_bitbucket GET      /import/bitbucket/callback(.:format)                                                          import/bitbucket#callback
-                                              jobs_import_bitbucket GET      /import/bitbucket/jobs(.:format)                                                              import/bitbucket#jobs
-                                                   import_bitbucket POST     /import/bitbucket(.:format)                                                                   import/bitbucket#create
-                                          status_import_google_code GET      /import/google_code/status(.:format)                                                          import/google_code#status
-                                        callback_import_google_code POST     /import/google_code/callback(.:format)                                                        import/google_code#callback
-                                            jobs_import_google_code GET      /import/google_code/jobs(.:format)                                                            import/google_code#jobs
-                                    new_user_map_import_google_code GET      /import/google_code/user_map(.:format)                                                        import/google_code#new_user_map
-                                 create_user_map_import_google_code POST     /import/google_code/user_map(.:format)                                                        import/google_code#create_user_map
-                                                 import_google_code POST     /import/google_code(.:format)                                                                 import/google_code#create
-                                             new_import_google_code GET      /import/google_code/new(.:format)                                                             import/google_code#new
-                                              status_import_fogbugz GET      /import/fogbugz/status(.:format)                                                              import/fogbugz#status
-                                            callback_import_fogbugz POST     /import/fogbugz/callback(.:format)                                                            import/fogbugz#callback
-                                                jobs_import_fogbugz GET      /import/fogbugz/jobs(.:format)                                                                import/fogbugz#jobs
-                                        new_user_map_import_fogbugz GET      /import/fogbugz/user_map(.:format)                                                            import/fogbugz#new_user_map
-                                     create_user_map_import_fogbugz POST     /import/fogbugz/user_map(.:format)                                                            import/fogbugz#create_user_map
-                                                     import_fogbugz POST     /import/fogbugz(.:format)                                                                     import/fogbugz#create
-                                                 new_import_fogbugz GET      /import/fogbugz/new(.:format)                                                                 import/fogbugz#new
-                                              import_gitlab_project POST     /import/gitlab_project(.:format)                                                              import/gitlab_projects#create
-                                                                    POST     /import/gitlab_project(.:format)                                                              import/gitlab_projects#create
-                                          new_import_gitlab_project GET      /import/gitlab_project/new(.:format)                                                          import/gitlab_projects#new
-                                                                    GET      /uploads/:model/:mounted_as/:id/:filename(.:format)                                           uploads#show {:model=>/note|user|group|project/, :mounted_as=>/avatar|attachment/, :filename=>/[^\/]+/}
-                                                                    GET      /uploads/:model/:mounted_as/:id/:filename(.:format)                                           uploads#show {:model=>/appearance/, :mounted_as=>/logo|header_logo/, :filename=>/.+/}
-                                                                    GET      /uploads/:namespace_id/:project_id/:secret/:filename(.:format)                                projects/uploads#show {:namespace_id=>/[a-zA-Z.0-9_\-]+/, :project_id=>/[a-zA-Z.0-9_\-]+/, :filename=>/[^\/]+/}
-                                                                    GET      /files/note/:id/:filename(.:format)                                                           redirect(301, uploads/note/attachment/%{id}/%{filename}) {:filename=>/[^\/]+/}
-                                          trending_explore_projects GET      /explore/projects/trending(.:format)                                                          explore/projects#trending
-                                           starred_explore_projects GET      /explore/projects/starred(.:format)                                                           explore/projects#starred
-                                                   explore_projects GET      /explore/projects(.:format)                                                                   explore/projects#index
-                                                     explore_groups GET      /explore/groups(.:format)                                                                     explore/groups#index
-                                                   explore_snippets GET      /explore/snippets(.:format)                                                                   explore/snippets#index
-                                                       explore_root GET      /explore(.:format)                                                                            explore/projects#trending
-                                                             public GET      /public(.:format)                                                                             explore/projects#index
-                                                    public_projects GET      /public/projects(.:format)                                                                    explore/projects#index
-                                                     admin_user_key GET      /admin/users/:user_id/keys/:id(.:format)                                                      admin/keys#show {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    DELETE   /admin/users/:user_id/keys/:id(.:format)                                                      admin/keys#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                              admin_user_identities GET      /admin/users/:user_id/identities(.:format)                                                    admin/identities#index {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    POST     /admin/users/:user_id/identities(.:format)                                                    admin/identities#create {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                            new_admin_user_identity GET      /admin/users/:user_id/identities/new(.:format)                                                admin/identities#new {:user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                           edit_admin_user_identity GET      /admin/users/:user_id/identities/:id/edit(.:format)                                           admin/identities#edit {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                admin_user_identity PATCH    /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    PUT      /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    DELETE   /admin/users/:user_id/identities/:id(.:format)                                                admin/identities#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                projects_admin_user GET      /admin/users/:id/projects(.:format)                                                           admin/users#projects {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                    keys_admin_user GET      /admin/users/:id/keys(.:format)                                                               admin/users#keys {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                   block_admin_user PUT      /admin/users/:id/block(.:format)                                                              admin/users#block {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                 unblock_admin_user PUT      /admin/users/:id/unblock(.:format)                                                            admin/users#unblock {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                  unlock_admin_user PUT      /admin/users/:id/unlock(.:format)                                                             admin/users#unlock {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                 confirm_admin_user PUT      /admin/users/:id/confirm(.:format)                                                            admin/users#confirm {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                             impersonate_admin_user POST     /admin/users/:id/impersonate(.:format)                                                        admin/users#impersonate {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                      disable_two_factor_admin_user PATCH    /admin/users/:id/disable_two_factor(.:format)                                                 admin/users#disable_two_factor {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                            remove_email_admin_user DELETE   /admin/users/:id/remove/:email_id(.:format)                                                   admin/users#remove_email {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                        admin_users GET      /admin/users(.:format)                                                                        admin/users#index
-                                                                    POST     /admin/users(.:format)                                                                        admin/users#create
-                                                     new_admin_user GET      /admin/users/new(.:format)                                                                    admin/users#new
-                                                    edit_admin_user GET      /admin/users/:id/edit(.:format)                                                               admin/users#edit {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                         admin_user GET      /admin/users/:id(.:format)                                                                    admin/users#show {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    PATCH    /admin/users/:id(.:format)                                                                    admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    PUT      /admin/users/:id(.:format)                                                                    admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                                    DELETE   /admin/users/:id(.:format)                                                                    admin/users#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/}
-                                                admin_impersonation DELETE   /admin/impersonation(.:format)                                                                admin/impersonations#destroy
-                                                admin_abuse_reports GET      /admin/abuse_reports(.:format)                                                                admin/abuse_reports#index
-                                                 admin_abuse_report DELETE   /admin/abuse_reports/:id(.:format)                                                            admin/abuse_reports#destroy
-                                         mark_as_ham_admin_spam_log POST     /admin/spam_logs/:id/mark_as_ham(.:format)                                                    admin/spam_logs#mark_as_ham
-                                                    admin_spam_logs GET      /admin/spam_logs(.:format)                                                                    admin/spam_logs#index
-                                                     admin_spam_log DELETE   /admin/spam_logs/:id(.:format)                                                                admin/spam_logs#destroy
-                                                 admin_applications GET      /admin/applications(.:format)                                                                 admin/applications#index
-                                                                    POST     /admin/applications(.:format)                                                                 admin/applications#create
-                                              new_admin_application GET      /admin/applications/new(.:format)                                                             admin/applications#new
-                                             edit_admin_application GET      /admin/applications/:id/edit(.:format)                                                        admin/applications#edit
-                                                  admin_application GET      /admin/applications/:id(.:format)                                                             admin/applications#show
-                                                                    PATCH    /admin/applications/:id(.:format)                                                             admin/applications#update
-                                                                    PUT      /admin/applications/:id(.:format)                                                             admin/applications#update
-                                                                    DELETE   /admin/applications/:id(.:format)                                                             admin/applications#destroy
-                                                       admin_groups GET      /admin/groups(.:format)                                                                       admin/groups#index
-                                                                    POST     /admin/groups(.:format)                                                                       admin/groups#create
-                                                    new_admin_group GET      /admin/groups/new(.:format)                                                                   admin/groups#new
-                                         admin_group_members_update PUT      /admin/groups/*id/members_update(.:format)                                                    admin/groups#members_update {:format=>/(html|json|atom)/}
-                                                   admin_group_edit GET      /admin/groups/*id/edit(.:format)                                                              admin/groups#edit {:format=>/(html|json|atom)/}
-                                                        admin_group GET      /admin/groups/*id(.:format)                                                                   admin/groups#show {:format=>/(html|json|atom)/}
-                                                                    PATCH    /admin/groups/*id(.:format)                                                                   admin/groups#update {:format=>/(html|json|atom)/}
-                                                                    PUT      /admin/groups/*id(.:format)                                                                   admin/groups#update {:format=>/(html|json|atom)/}
-                                                                    DELETE   /admin/groups/*id(.:format)                                                                   admin/groups#destroy {:format=>/(html|json|atom)/}
-                                                  admin_deploy_keys GET      /admin/deploy_keys(.:format)                                                                  admin/deploy_keys#index
-                                                                    POST     /admin/deploy_keys(.:format)                                                                  admin/deploy_keys#create
-                                               new_admin_deploy_key GET      /admin/deploy_keys/new(.:format)                                                              admin/deploy_keys#new
-                                                   admin_deploy_key DELETE   /admin/deploy_keys/:id(.:format)                                                              admin/deploy_keys#destroy
-                                                    admin_hook_test GET      /admin/hooks/:hook_id/test(.:format)                                                          admin/hooks#test
-                                                        admin_hooks GET      /admin/hooks(.:format)                                                                        admin/hooks#index
-                                                                    POST     /admin/hooks(.:format)                                                                        admin/hooks#create
-                                                         admin_hook DELETE   /admin/hooks/:id(.:format)                                                                    admin/hooks#destroy
-                                   preview_admin_broadcast_messages POST     /admin/broadcast_messages/preview(.:format)                                                   admin/broadcast_messages#preview
-                                           admin_broadcast_messages GET      /admin/broadcast_messages(.:format)                                                           admin/broadcast_messages#index
-                                                                    POST     /admin/broadcast_messages(.:format)                                                           admin/broadcast_messages#create
-                                       edit_admin_broadcast_message GET      /admin/broadcast_messages/:id/edit(.:format)                                                  admin/broadcast_messages#edit
-                                            admin_broadcast_message PATCH    /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#update
-                                                                    PUT      /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#update
-                                                                    DELETE   /admin/broadcast_messages/:id(.:format)                                                       admin/broadcast_messages#destroy
-                                                         admin_logs GET      /admin/logs(.:format)                                                                         admin/logs#show
-                                                 admin_health_check GET      /admin/health_check(.:format)                                                                 admin/health_check#show
-                                              admin_background_jobs GET      /admin/background_jobs(.:format)                                                              admin/background_jobs#show
-                                                  admin_system_info GET      /admin/system_info(.:format)                                                                  admin/system_info#show
-                                            admin_requests_profiles GET      /admin/requests_profiles(.:format)                                                            admin/requests_profiles#index
-                                             admin_requests_profile GET      /admin/requests_profiles/:name(.:format)                                                      admin/requests_profiles#show {:name=>/.+\.html/}
-                                                     admin_projects GET      /admin/projects(.:format)                                                                     admin/projects#index
-                                   transfer_admin_namespace_project PUT      /admin/projects/*namespace_id/:id/transfer(.:format)                                          admin/projects#transfer {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                           repository_check_admin_namespace_project POST     /admin/projects/*namespace_id/:id/repository_check(.:format)                                  admin/projects#repository_check {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                            admin_namespace_project_runner_projects POST     /admin/projects/*namespace_id/:project_id/runner_projects(.:format)                           admin/runner_projects#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             admin_namespace_project_runner_project DELETE   /admin/projects/*namespace_id/:project_id/runner_projects/:id(.:format)                       admin/runner_projects#destroy {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            admin_namespace_project GET      /admin/projects/*namespace_id/:id(.:format)                                                   admin/projects#show {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          preview_admin_appearances GET      /admin/appearance/preview(.:format)                                                           admin/appearances#preview
-                                             logo_admin_appearances DELETE   /admin/appearance/logo(.:format)                                                              admin/appearances#logo
-                                     header_logos_admin_appearances DELETE   /admin/appearance/header_logos(.:format)                                                      admin/appearances#header_logos
-                                                  admin_appearances POST     /admin/appearance(.:format)                                                                   admin/appearances#create
-                                                                    GET      /admin/appearance(.:format)                                                                   admin/appearances#show
-                                                                    PATCH    /admin/appearance(.:format)                                                                   admin/appearances#update
-                                                                    PUT      /admin/appearance(.:format)                                                                   admin/appearances#update
-                                admin_application_settings_services GET      /admin/application_settings/services(.:format)                                                admin/services#index
-                            edit_admin_application_settings_service GET      /admin/application_settings/services/:id/edit(.:format)                                       admin/services#edit
-                                 admin_application_settings_service PATCH    /admin/application_settings/services/:id(.:format)                                            admin/services#update
-                                                                    PUT      /admin/application_settings/services/:id(.:format)                                            admin/services#update
-                     reset_runners_token_admin_application_settings PUT      /admin/application_settings/reset_runners_token(.:format)                                     admin/application_settings#reset_runners_token
-                reset_health_check_token_admin_application_settings PUT      /admin/application_settings/reset_health_check_token(.:format)                                admin/application_settings#reset_health_check_token
-           clear_repository_check_states_admin_application_settings PUT      /admin/application_settings/clear_repository_check_states(.:format)                           admin/application_settings#clear_repository_check_states
-                                         admin_application_settings GET      /admin/application_settings(.:format)                                                         admin/application_settings#show
-                                                                    PATCH    /admin/application_settings(.:format)                                                         admin/application_settings#update
-                                                                    PUT      /admin/application_settings(.:format)                                                         admin/application_settings#update
-                                                       admin_labels GET      /admin/labels(.:format)                                                                       admin/labels#index
-                                                                    POST     /admin/labels(.:format)                                                                       admin/labels#create
-                                                    new_admin_label GET      /admin/labels/new(.:format)                                                                   admin/labels#new
-                                                   edit_admin_label GET      /admin/labels/:id/edit(.:format)                                                              admin/labels#edit
-                                                        admin_label GET      /admin/labels/:id(.:format)                                                                   admin/labels#show
-                                                                    PATCH    /admin/labels/:id(.:format)                                                                   admin/labels#update
-                                                                    PUT      /admin/labels/:id(.:format)                                                                   admin/labels#update
-                                                                    DELETE   /admin/labels/:id(.:format)                                                                   admin/labels#destroy
-                                                resume_admin_runner GET      /admin/runners/:id/resume(.:format)                                                           admin/runners#resume
-                                                 pause_admin_runner GET      /admin/runners/:id/pause(.:format)                                                            admin/runners#pause
-                                                      admin_runners GET      /admin/runners(.:format)                                                                      admin/runners#index
-                                                       admin_runner GET      /admin/runners/:id(.:format)                                                                  admin/runners#show
-                                                                    PATCH    /admin/runners/:id(.:format)                                                                  admin/runners#update
-                                                                    PUT      /admin/runners/:id(.:format)                                                                  admin/runners#update
-                                                                    DELETE   /admin/runners/:id(.:format)                                                                  admin/runners#destroy
-                                            cancel_all_admin_builds POST     /admin/builds/cancel_all(.:format)                                                            admin/builds#cancel_all
-                                                       admin_builds GET      /admin/builds(.:format)                                                                       admin/builds#index
-                                                         admin_root GET      /admin(.:format)                                                                              admin/dashboard#index
-                                                  audit_log_profile GET      /profile/audit_log(.:format)                                                                  profiles#audit_log
-                                               applications_profile GET      /profile/applications(.:format)                                                               oauth/applications#index
-                                        reset_private_token_profile PUT      /profile/reset_private_token(.:format)                                                        profiles#reset_private_token
-                                 reset_incoming_email_token_profile PUT      /profile/reset_incoming_email_token(.:format)                                                 profiles#reset_incoming_email_token
-                                            update_username_profile PUT      /profile/update_username(.:format)                                                            profiles#update_username
-                                             unlink_profile_account DELETE   /profile/account/unlink(.:format)                                                             profiles/accounts#unlink
-                                                    profile_account GET      /profile/account(.:format)                                                                    profiles/accounts#show
-                                              profile_notifications GET      /profile/notifications(.:format)                                                              profiles/notifications#show
-                                                                    PATCH    /profile/notifications(.:format)                                                              profiles/notifications#update
-                                                                    PUT      /profile/notifications(.:format)                                                              profiles/notifications#update
-                                             reset_profile_password PUT      /profile/password/reset(.:format)                                                             profiles/passwords#reset
-                                                   profile_password POST     /profile/password(.:format)                                                                   profiles/passwords#create
-                                               new_profile_password GET      /profile/password/new(.:format)                                                               profiles/passwords#new
-                                              edit_profile_password GET      /profile/password/edit(.:format)                                                              profiles/passwords#edit
-                                                                    PATCH    /profile/password(.:format)                                                                   profiles/passwords#update
-                                                                    PUT      /profile/password(.:format)                                                                   profiles/passwords#update
-                                                profile_preferences GET      /profile/preferences(.:format)                                                                profiles/preferences#show
-                                                                    PATCH    /profile/preferences(.:format)                                                                profiles/preferences#update
-                                                                    PUT      /profile/preferences(.:format)                                                                profiles/preferences#update
-                                                       profile_keys GET      /profile/keys(.:format)                                                                       profiles/keys#index
-                                                                    POST     /profile/keys(.:format)                                                                       profiles/keys#create
-                                                    new_profile_key GET      /profile/keys/new(.:format)                                                                   profiles/keys#new
-                                                        profile_key GET      /profile/keys/:id(.:format)                                                                   profiles/keys#show
-                                                                    DELETE   /profile/keys/:id(.:format)                                                                   profiles/keys#destroy
-                                                     profile_emails GET      /profile/emails(.:format)                                                                     profiles/emails#index
-                                                                    POST     /profile/emails(.:format)                                                                     profiles/emails#create
-                                                      profile_email DELETE   /profile/emails/:id(.:format)                                                                 profiles/emails#destroy
-                                            deny_profile_chat_names DELETE   /profile/chat_names/deny(.:format)                                                            profiles/chat_names#deny
-                                                 profile_chat_names GET      /profile/chat_names(.:format)                                                                 profiles/chat_names#index
-                                                                    POST     /profile/chat_names(.:format)                                                                 profiles/chat_names#create
-                                              new_profile_chat_name GET      /profile/chat_names/new(.:format)                                                             profiles/chat_names#new
-                                                  profile_chat_name DELETE   /profile/chat_names/:id(.:format)                                                             profiles/chat_names#destroy
-                                                     profile_avatar DELETE   /profile/avatar(.:format)                                                                     profiles/avatars#destroy
-                               revoke_profile_personal_access_token PUT      /profile/personal_access_tokens/:id/revoke(.:format)                                          profiles/personal_access_tokens#revoke
-                                     profile_personal_access_tokens GET      /profile/personal_access_tokens(.:format)                                                     profiles/personal_access_tokens#index
-                                                                    POST     /profile/personal_access_tokens(.:format)                                                     profiles/personal_access_tokens#create
-                                 create_u2f_profile_two_factor_auth POST     /profile/two_factor_auth/create_u2f(.:format)                                                 profiles/two_factor_auths#create_u2f
-                                      codes_profile_two_factor_auth POST     /profile/two_factor_auth/codes(.:format)                                                      profiles/two_factor_auths#codes
-                                       skip_profile_two_factor_auth PATCH    /profile/two_factor_auth/skip(.:format)                                                       profiles/two_factor_auths#skip
-                                            profile_two_factor_auth POST     /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#create
-                                                                    GET      /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#show
-                                                                    DELETE   /profile/two_factor_auth(.:format)                                                            profiles/two_factor_auths#destroy
-                                           profile_u2f_registration DELETE   /profile/u2f_registrations/:id(.:format)                                                      profiles/u2f_registrations#destroy
-                                                            profile GET      /profile(.:format)                                                                            profiles#show
-                                                                    PATCH    /profile(.:format)                                                                            profiles#update
-                                                                    PUT      /profile(.:format)                                                                            profiles#update
-                                                   issues_dashboard GET      /dashboard/issues(.:format)                                                                   dashboard#issues
-                                           merge_requests_dashboard GET      /dashboard/merge_requests(.:format)                                                           dashboard#merge_requests
-                                                 activity_dashboard GET      /dashboard/activity(.:format)                                                                 dashboard#activity
-                                               dashboard_milestones GET      /dashboard/milestones(.:format)                                                               dashboard/milestones#index
-                                                dashboard_milestone GET      /dashboard/milestones/:id(.:format)                                                           dashboard/milestones#show
-                                                   dashboard_labels GET      /dashboard/labels(.:format)                                                                   dashboard/labels#index
-                                                   dashboard_groups GET      /dashboard/groups(.:format)                                                                   dashboard/groups#index
-                                                 dashboard_snippets GET      /dashboard/snippets(.:format)                                                                 dashboard/snippets#index
-                                        destroy_all_dashboard_todos DELETE   /dashboard/todos/destroy_all(.:format)                                                        dashboard/todos#destroy_all
-                                             restore_dashboard_todo PATCH    /dashboard/todos/:id/restore(.:format)                                                        dashboard/todos#restore
-                                                    dashboard_todos GET      /dashboard/todos(.:format)                                                                    dashboard/todos#index
-                                                     dashboard_todo DELETE   /dashboard/todos/:id(.:format)                                                                dashboard/todos#destroy
-                                         starred_dashboard_projects GET      /dashboard/projects/starred(.:format)                                                         dashboard/projects#starred
-                                                 dashboard_projects GET      /dashboard/projects(.:format)                                                                 dashboard/projects#index
-                                                     root_dashboard GET      /dashboard(.:format)                                                                          dashboard/projects#index
-                                                             groups GET      /groups(.:format)                                                                             groups#index
-                                                                    POST     /groups(.:format)                                                                             groups#create
-                                                          new_group GET      /groups/new(.:format)                                                                         groups#new
-                                   resend_invite_group_group_member POST     /groups/*group_id/group_members/:id/resend_invite(.:format)                                   groups/group_members#resend_invite
-                                          leave_group_group_members DELETE   /groups/*group_id/group_members/leave(.:format)                                               groups/group_members#leave
-                                 request_access_group_group_members POST     /groups/*group_id/group_members/request_access(.:format)                                      groups/group_members#request_access
-                          approve_access_request_group_group_member POST     /groups/*group_id/group_members/:id/approve_access_request(.:format)                          groups/group_members#approve_access_request
-                                                group_group_members GET      /groups/*group_id/group_members(.:format)                                                     groups/group_members#index
-                                                                    POST     /groups/*group_id/group_members(.:format)                                                     groups/group_members#create
-                                                 group_group_member PATCH    /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#update
-                                                                    PUT      /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#update
-                                                                    DELETE   /groups/*group_id/group_members/:id(.:format)                                                 groups/group_members#destroy
-                                                       group_avatar DELETE   /groups/*group_id/avatar(.:format)                                                            groups/avatars#destroy
-                                                   group_milestones GET      /groups/*group_id/milestones(.:format)                                                        groups/milestones#index
-                                                                    POST     /groups/*group_id/milestones(.:format)                                                        groups/milestones#create
-                                                new_group_milestone GET      /groups/*group_id/milestones/new(.:format)                                                    groups/milestones#new
-                                                    group_milestone GET      /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#show {:id=>/[^\/]+/}
-                                                                    PATCH    /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#update {:id=>/[^\/]+/}
-                                                                    PUT      /groups/*group_id/milestones/:id(.:format)                                                    groups/milestones#update {:id=>/[^\/]+/}
-                                    toggle_subscription_group_label POST     /groups/*group_id/labels/:id/toggle_subscription(.:format)                                    groups/labels#toggle_subscription
-                                                       group_labels GET      /groups/*group_id/labels(.:format)                                                            groups/labels#index
-                                                                    POST     /groups/*group_id/labels(.:format)                                                            groups/labels#create
-                                                    new_group_label GET      /groups/*group_id/labels/new(.:format)                                                        groups/labels#new
-                                                   edit_group_label GET      /groups/*group_id/labels/:id/edit(.:format)                                                   groups/labels#edit
-                                                        group_label PATCH    /groups/*group_id/labels/:id(.:format)                                                        groups/labels#update
-                                                                    PUT      /groups/*group_id/labels/:id(.:format)                                                        groups/labels#update
-                                                                    DELETE   /groups/*group_id/labels/:id(.:format)                                                        groups/labels#destroy
-                                                         edit_group GET      /groups/*id/edit(.:format)                                                                    groups#edit {:format=>/(html|json|atom)/}
-                                                       issues_group GET      /groups/*id/issues(.:format)                                                                  groups#issues {:format=>/(html|json|atom)/}
-                                               merge_requests_group GET      /groups/*id/merge_requests(.:format)                                                          groups#merge_requests {:format=>/(html|json|atom)/}
-                                                     projects_group GET      /groups/*id/projects(.:format)                                                                groups#projects {:format=>/(html|json|atom)/}
-                                                     activity_group GET      /groups/*id/activity(.:format)                                                                groups#activity {:format=>/(html|json|atom)/}
-                                                    subgroups_group GET      /groups/*id/subgroups(.:format)                                                               groups#subgroups {:format=>/(html|json|atom)/}
-                                                    group_canonical GET      /groups/*id(.:format)                                                                         groups#show {:format=>/(html|json|atom)/}
-                                                   new_user_session GET      /users/sign_in(.:format)                                                                      sessions#new
-                                                       user_session POST     /users/sign_in(.:format)                                                                      sessions#create
-                                               destroy_user_session DELETE   /users/sign_out(.:format)                                                                     sessions#destroy
-                                                      user_password POST     /users/password(.:format)                                                                     passwords#create
-                                                  new_user_password GET      /users/password/new(.:format)                                                                 passwords#new
-                                                 edit_user_password GET      /users/password/edit(.:format)                                                                passwords#edit
-                                                                    PATCH    /users/password(.:format)                                                                     passwords#update
-                                                                    PUT      /users/password(.:format)                                                                     passwords#update
-                                           cancel_user_registration GET      /users/cancel(.:format)                                                                       registrations#cancel
-                                                  user_registration POST     /users(.:format)                                                                              registrations#create
-                                              new_user_registration GET      /users/sign_up(.:format)                                                                      registrations#new
-                                             edit_user_registration GET      /users/edit(.:format)                                                                         registrations#edit
-                                                                    PATCH    /users(.:format)                                                                              registrations#update
-                                                                    PUT      /users(.:format)                                                                              registrations#update
-                                                                    DELETE   /users(.:format)                                                                              registrations#destroy
-                                                  user_confirmation POST     /users/confirmation(.:format)                                                                 confirmations#create
-                                              new_user_confirmation GET      /users/confirmation/new(.:format)                                                             confirmations#new
-                                                                    GET      /users/confirmation(.:format)                                                                 confirmations#show
-                                                        user_unlock POST     /users/unlock(.:format)                                                                       devise/unlocks#create
-                                                    new_user_unlock GET      /users/unlock/new(.:format)                                                                   devise/unlocks#new
-                                                                    GET      /users/unlock(.:format)                                                                       devise/unlocks#show
-                                                     omniauth_error GET      /users/auth/:provider/omniauth_error(.:format)                                                omniauth_callbacks#omniauth_error
-                                                 users_almost_there GET      /users/almost_there(.:format)                                                                 confirmations#almost_there
-                                                                    GET      /:username.keys(.:format)                                                                     profiles/keys#get_keys {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                               user GET      /:username(.:format)                                                                          users#show {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                      user_calendar GET      /users/:username/calendar(.:format)                                                           users#calendar {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                           user_calendar_activities GET      /users/:username/calendar_activities(.:format)                                                users#calendar_activities {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                        user_groups GET      /users/:username/groups(.:format)                                                             users#groups {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                      user_projects GET      /users/:username/projects(.:format)                                                           users#projects {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                          user_contributed_projects GET      /users/:username/contributed(.:format)                                                        users#contributed {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                      user_snippets GET      /users/:username/snippets(.:format)                                                           users#snippets {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                        user_exists GET      /users/:username/exists(.:format)                                                             users#exists {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /users/:username(.:format)                                                                    redirect(301, /%{username}) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /u/:username(.:format)                                                                        redirect(301, /%{username}) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /u/:username/groups(.:format)                                                                 redirect(301, /users/%{username}/groups) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /u/:username/projects(.:format)                                                               redirect(301, /users/%{username}/projects) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /u/:username/snippets(.:format)                                                               redirect(301, /users/%{username}/snippets) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                                    GET      /u/:username/contributed(.:format)                                                            redirect(301, /users/%{username}/contributed) {:username=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?<!\.git|\.atom)/}
-                                                           projects GET      /projects(.:format)                                                                           projects#index
-                                                                    POST     /projects(.:format)                                                                           projects#create
-                                                        new_project GET      /projects/new(.:format)                                                                       projects#new
-                                                          info_refs GET      /*namespace_id/:project_id/info/refs(.:format)                                                projects/git_http#info_refs {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                    git_upload_pack POST     /*namespace_id/:project_id/git-upload-pack(.:format)                                          projects/git_http#git_upload_pack {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                   git_receive_pack POST     /*namespace_id/:project_id/git-receive-pack(.:format)                                         projects/git_http#git_receive_pack {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                              batch POST     /*namespace_id/:project_id/info/lfs/objects/batch(.:format)                                   projects/lfs_api#batch {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    POST     /*namespace_id/:project_id/info/lfs/objects(.:format)                                         projects/lfs_api#deprecated {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    GET      /*namespace_id/:project_id/info/lfs/objects/*oid(.:format)                                    projects/lfs_api#deprecated {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    GET      /*namespace_id/:project_id/gitlab-lfs/objects/*oid(.:format)                                  projects/lfs_storage#download {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    PUT      /*namespace_id/:project_id/gitlab-lfs/objects/*oid/*size/authorize(.:format)                  projects/lfs_storage#upload_authorize {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    PUT      /*namespace_id/:project_id/gitlab-lfs/objects/*oid/*size(.:format)                            projects/lfs_storage#upload_finalize {:format=>nil, :project_id=>/[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*\.git/}
-                                                                    GET      /*namespace_id/:project_id/info/refs(.:format)                                                redirect(301) {:format=>nil, :project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                      emojis_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/emojis(.:format)                              projects/autocomplete_sources#emojis {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                     members_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/members(.:format)                             projects/autocomplete_sources#members {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                      issues_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/issues(.:format)                              projects/autocomplete_sources#issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-              merge_requests_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/merge_requests(.:format)                      projects/autocomplete_sources#merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                      labels_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/labels(.:format)                              projects/autocomplete_sources#labels {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                  milestones_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/milestones(.:format)                          projects/autocomplete_sources#milestones {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                    commands_namespace_project_autocomplete_sources GET      /*namespace_id/:project_id/autocomplete_sources/commands(.:format)                            projects/autocomplete_sources#commands {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         namespace_project_template GET      /*namespace_id/:project_id/templates/:template_type/:key(.:format)                            projects/templates#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           namespace_project_avatar GET      /*namespace_id/:project_id/avatar(.:format)                                                   projects/avatars#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:project_id/avatar(.:format)                                                   projects/avatars#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  branches_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/branches(.:format)                                      projects/commit#branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                                 pipelines_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/pipelines(.:format)                                     projects/commit#pipelines {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                                    revert_namespace_project_commit POST     /*namespace_id/:project_id/commit/:id/revert(.:format)                                        projects/commit#revert {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                               cherry_pick_namespace_project_commit POST     /*namespace_id/:project_id/commit/:id/cherry_pick(.:format)                                   projects/commit#cherry_pick {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                             diff_for_path_namespace_project_commit GET      /*namespace_id/:project_id/commit/:id/diff_for_path(.:format)                                 projects/commit#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                                           namespace_project_commit GET      /*namespace_id/:project_id/commit/:id(.:format)                                               projects/commit#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{7,40}/}
-                                    namespace_project_pages_domains POST     /*namespace_id/:project_id/pages/domains(.:format)                                            projects/pages_domains#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 new_namespace_project_pages_domain GET      /*namespace_id/:project_id/pages/domains/new(.:format)                                        projects/pages_domains#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     namespace_project_pages_domain GET      /*namespace_id/:project_id/pages/domains/:id(.:format)                                        projects/pages_domains#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                                                    DELETE   /*namespace_id/:project_id/pages/domains/:id(.:format)                                        projects/pages_domains#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                            namespace_project_pages GET      /*namespace_id/:project_id/pages(.:format)                                                    projects/pages#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:project_id/pages(.:format)                                                    projects/pages#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                      diff_for_path_namespace_project_compare_index GET      /*namespace_id/:project_id/compare/diff_for_path(.:format)                                    projects/compare#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    namespace_project_compare_index GET      /*namespace_id/:project_id/compare(.:format)                                                  projects/compare#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/compare(.:format)                                                  projects/compare#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          namespace_project_compare GET      /*namespace_id/:project_id/compare/:from...:to(.:format)                                      projects/compare#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :from=>/.+/, :to=>/.+/}
-                                          namespace_project_network GET      /*namespace_id/:project_id/network/:id                                                        projects/network#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                    commits_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/commits                                                 projects/graphs#commits {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                         ci_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/ci                                                      projects/graphs#ci {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                  languages_namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id/languages                                               projects/graphs#languages {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                            namespace_project_graph GET      /*namespace_id/:project_id/graphs/:id                                                         projects/graphs#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                      raw_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id/raw(.:format)                                         projects/snippets#raw {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                             mark_as_spam_namespace_project_snippet POST     /*namespace_id/:project_id/snippets/:id/mark_as_spam(.:format)                                projects/snippets#mark_as_spam {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                       toggle_award_emoji_namespace_project_snippet POST     /*namespace_id/:project_id/snippets/:id/toggle_award_emoji(.:format)                          projects/snippets#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                         namespace_project_snippets GET      /*namespace_id/:project_id/snippets(.:format)                                                 projects/snippets#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/snippets(.:format)                                                 projects/snippets#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      new_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/new(.:format)                                             projects/snippets#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     edit_namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id/edit(.:format)                                        projects/snippets#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                          namespace_project_snippet GET      /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PATCH    /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/snippets/:id(.:format)                                             projects/snippets#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                     test_namespace_project_service GET      /*namespace_id/:project_id/services/:id/test(.:format)                                        projects/services#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                         namespace_project_services GET      /*namespace_id/:project_id/services(.:format)                                                 projects/services#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     edit_namespace_project_service GET      /*namespace_id/:project_id/services/:id/edit(.:format)                                        projects/services#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                          namespace_project_service PATCH    /*namespace_id/:project_id/services/:id(.:format)                                             projects/services#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                                                    PUT      /*namespace_id/:project_id/services/:id(.:format)                                             projects/services#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[^\/]+/}
-                                       namespace_project_mattermost POST     /*namespace_id/:project_id/mattermost(.:format)                                               projects/mattermosts#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   new_namespace_project_mattermost GET      /*namespace_id/:project_id/mattermost/new(.:format)                                           projects/mattermosts#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                enable_namespace_project_deploy_key PUT      /*namespace_id/:project_id/deploy_keys/:id/enable(.:format)                                   projects/deploy_keys#enable {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                               disable_namespace_project_deploy_key PUT      /*namespace_id/:project_id/deploy_keys/:id/disable(.:format)                                  projects/deploy_keys#disable {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                      namespace_project_deploy_keys GET      /*namespace_id/:project_id/deploy_keys(.:format)                                              projects/deploy_keys#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/deploy_keys(.:format)                                              projects/deploy_keys#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   new_namespace_project_deploy_key GET      /*namespace_id/:project_id/deploy_keys/new(.:format)                                          projects/deploy_keys#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            namespace_project_forks GET      /*namespace_id/:project_id/forks(.:format)                                                    projects/forks#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/forks(.:format)                                                    projects/forks#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         new_namespace_project_fork GET      /*namespace_id/:project_id/forks/new(.:format)                                                projects/forks#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           namespace_project_import POST     /*namespace_id/:project_id/import(.:format)                                                   projects/imports#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       new_namespace_project_import GET      /*namespace_id/:project_id/import/new(.:format)                                               projects/imports#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    GET      /*namespace_id/:project_id/import(.:format)                                                   projects/imports#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                            commits_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/commits(.:format)                               projects/merge_requests#commits {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                              diffs_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/diffs(.:format)                                 projects/merge_requests#diffs {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                          conflicts_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/conflicts(.:format)                             projects/merge_requests#conflicts {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                  conflict_for_path_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/conflict_for_path(.:format)                     projects/merge_requests#conflict_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                          pipelines_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/pipelines(.:format)                             projects/merge_requests#pipelines {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                        merge_check_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/merge_check(.:format)                           projects/merge_requests#merge_check {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                              merge_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/merge(.:format)                                 projects/merge_requests#merge {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-               merge_widget_refresh_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/merge_widget_refresh(.:format)                  projects/merge_requests#merge_widget_refresh {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-cancel_merge_when_pipeline_succeeds_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/cancel_merge_when_pipeline_succeeds(.:format)   projects/merge_requests#cancel_merge_when_pipeline_succeeds {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                          ci_status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/ci_status(.:format)                             projects/merge_requests#ci_status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                             status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/status(.:format)                                projects/merge_requests#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-             ci_environments_status_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/ci_environments_status(.:format)                projects/merge_requests#ci_environments_status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                toggle_subscription_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/toggle_subscription(.:format)                   projects/merge_requests#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                         remove_wip_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/remove_wip(.:format)                            projects/merge_requests#remove_wip {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                      diff_for_path_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/diff_for_path(.:format)                         projects/merge_requests#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                  resolve_conflicts_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/resolve_conflicts(.:format)                     projects/merge_requests#resolve_conflicts {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-              assign_related_issues_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/assign_related_issues(.:format)                 projects/merge_requests#assign_related_issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                       branch_from_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/branch_from(.:format)                               projects/merge_requests#branch_from {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                         branch_to_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/branch_to(.:format)                                 projects/merge_requests#branch_to {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                   update_branches_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/update_branches(.:format)                           projects/merge_requests#update_branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                     diff_for_path_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/diff_for_path(.:format)                             projects/merge_requests#diff_for_path {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                       bulk_update_namespace_project_merge_requests POST     /*namespace_id/:project_id/merge_requests/bulk_update(.:format)                               projects/merge_requests#bulk_update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                         new_diffs_namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests/new/diffs(.:format)                                 projects/merge_requests#new_diffs {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                 resolve_namespace_project_merge_request_discussion POST     /*namespace_id/:project_id/merge_requests/:merge_request_id/discussions/:id/resolve(.:format) projects/discussions#resolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{40}/, :merge_request_id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/merge_requests/:merge_request_id/discussions/:id/resolve(.:format) projects/discussions#unresolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\h{40}/, :merge_request_id=>/\d+/}
-                 toggle_award_emoji_namespace_project_merge_request POST     /*namespace_id/:project_id/merge_requests/:id/toggle_award_emoji(.:format)                    projects/merge_requests#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                   namespace_project_merge_requests GET      /*namespace_id/:project_id/merge_requests(.:format)                                           projects/merge_requests#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/merge_requests(.:format)                                           projects/merge_requests#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                new_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/new(.:format)                                       projects/merge_requests#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                               edit_namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id/edit(.:format)                                  projects/merge_requests#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                    namespace_project_merge_request GET      /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PATCH    /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/merge_requests/:id(.:format)                                       projects/merge_requests#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                         namespace_project_branches GET      /*namespace_id/:project_id/branches(.:format)                                                 projects/branches#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/branches(.:format)                                                 projects/branches#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       new_namespace_project_branch GET      /*namespace_id/:project_id/branches/new(.:format)                                             projects/branches#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           namespace_project_branch DELETE   /*namespace_id/:project_id/branches/:id(.:format)                                             projects/branches#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                  namespace_project_merged_branches DELETE   /*namespace_id/:project_id/merged_branches(.:format)                                          projects/branches#destroy_all_merged {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 edit_namespace_project_tag_release GET      /*namespace_id/:project_id/tags/:tag_id/release/edit(.:format)                                projects/releases#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                      namespace_project_tag_release PATCH    /*namespace_id/:project_id/tags/:tag_id/release(.:format)                                     projects/releases#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                                                    PUT      /*namespace_id/:project_id/tags/:tag_id/release(.:format)                                     projects/releases#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :tag_id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                             namespace_project_tags GET      /*namespace_id/:project_id/tags(.:format)                                                     projects/tags#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/tags(.:format)                                                     projects/tags#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          new_namespace_project_tag GET      /*namespace_id/:project_id/tags/new(.:format)                                                 projects/tags#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                              namespace_project_tag GET      /*namespace_id/:project_id/tags/:id(.:format)                                                 projects/tags#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                                                    DELETE   /*namespace_id/:project_id/tags/:id(.:format)                                                 projects/tags#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                               namespace_project_protected_branches GET      /*namespace_id/:project_id/protected_branches(.:format)                                       projects/protected_branches#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/protected_branches(.:format)                                       projects/protected_branches#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 namespace_project_protected_branch GET      /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                                                    PATCH    /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                                                    PUT      /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                                                    DELETE   /*namespace_id/:project_id/protected_branches/:id(.:format)                                   projects/protected_branches#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                        namespace_project_variables GET      /*namespace_id/:project_id/variables(.:format)                                                projects/variables#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/variables(.:format)                                                projects/variables#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         namespace_project_variable GET      /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PATCH    /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:project_id/variables/:id(.:format)                                            projects/variables#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         namespace_project_triggers GET      /*namespace_id/:project_id/triggers(.:format)                                                 projects/triggers#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/triggers(.:format)                                                 projects/triggers#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          namespace_project_trigger DELETE   /*namespace_id/:project_id/triggers/:id(.:format)                                             projects/triggers#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                               namespace_project_pipelines_settings GET      /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PATCH    /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/pipelines/settings(.:format)                                       projects/pipelines_settings#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   stage_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/stage(.:format)                                      projects/pipelines#stage {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  cancel_namespace_project_pipeline POST     /*namespace_id/:project_id/pipelines/:id/cancel(.:format)                                     projects/pipelines#cancel {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   retry_namespace_project_pipeline POST     /*namespace_id/:project_id/pipelines/:id/retry(.:format)                                      projects/pipelines#retry {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  builds_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/builds(.:format)                                     projects/pipelines#builds {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  status_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id/status(.:format)                                     projects/pipelines#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                        namespace_project_pipelines GET      /*namespace_id/:project_id/pipelines(.:format)                                                projects/pipelines#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/pipelines(.:format)                                                projects/pipelines#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     new_namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/new(.:format)                                            projects/pipelines#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         namespace_project_pipeline GET      /*namespace_id/:project_id/pipelines/:id(.:format)                                            projects/pipelines#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 stop_namespace_project_environment POST     /*namespace_id/:project_id/environments/:id/stop(.:format)                                    projects/environments#stop {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             terminal_namespace_project_environment GET      /*namespace_id/:project_id/environments/:id/terminal(.:format)                                projects/environments#terminal {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    GET      /*namespace_id/:project_id/environments/:id/terminal.ws/authorize(.:format)                   projects/environments#terminal_websocket_authorize {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>nil}
-                              folder_namespace_project_environments GET      /*namespace_id/:project_id/environments/folders/:id(.:format)                                 projects/environments#folder {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     namespace_project_environments GET      /*namespace_id/:project_id/environments(.:format)                                             projects/environments#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/environments(.:format)                                             projects/environments#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  new_namespace_project_environment GET      /*namespace_id/:project_id/environments/new(.:format)                                         projects/environments#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 edit_namespace_project_environment GET      /*namespace_id/:project_id/environments/:id/edit(.:format)                                    projects/environments#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      namespace_project_environment GET      /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PATCH    /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/environments/:id(.:format)                                         projects/environments#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  namespace_project_cycle_analytics GET      /*namespace_id/:project_id/cycle_analytics(.:format)                                          projects/cycle_analytics#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                            namespace_project_cycle_analytics_issue GET      /*namespace_id/:project_id/cycle_analytics/events/issue(.:format)                             projects/cycle_analytics/events#issue {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             namespace_project_cycle_analytics_plan GET      /*namespace_id/:project_id/cycle_analytics/events/plan(.:format)                              projects/cycle_analytics/events#plan {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             namespace_project_cycle_analytics_code GET      /*namespace_id/:project_id/cycle_analytics/events/code(.:format)                              projects/cycle_analytics/events#code {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             namespace_project_cycle_analytics_test GET      /*namespace_id/:project_id/cycle_analytics/events/test(.:format)                              projects/cycle_analytics/events#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                           namespace_project_cycle_analytics_review GET      /*namespace_id/:project_id/cycle_analytics/events/review(.:format)                            projects/cycle_analytics/events#review {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                          namespace_project_cycle_analytics_staging GET      /*namespace_id/:project_id/cycle_analytics/events/staging(.:format)                           projects/cycle_analytics/events#staging {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                       namespace_project_cycle_analytics_production GET      /*namespace_id/:project_id/cycle_analytics/events/production(.:format)                        projects/cycle_analytics/events#production {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                cancel_all_namespace_project_builds POST     /*namespace_id/:project_id/builds/cancel_all(.:format)                                        projects/builds#cancel_all {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                       latest_succeeded_namespace_project_artifacts GET      /*namespace_id/:project_id/builds/artifacts/*ref_name_and_path                                projects/artifacts#latest_succeeded {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     status_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/status(.:format)                                        projects/builds#status {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                     cancel_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/cancel(.:format)                                        projects/builds#cancel {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                      retry_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/retry(.:format)                                         projects/builds#retry {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                       play_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/play(.:format)                                          projects/builds#play {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                      erase_namespace_project_build POST     /*namespace_id/:project_id/builds/:id/erase(.:format)                                         projects/builds#erase {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                      trace_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/trace(.:format)                                         projects/builds#trace {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                        raw_namespace_project_build GET      /*namespace_id/:project_id/builds/:id/raw(.:format)                                           projects/builds#raw {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                         download_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/download(.:format)                      projects/artifacts#download {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
-                           browse_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/browse(/*path)                          projects/artifacts#browse {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
-                             file_namespace_project_build_artifacts GET      /*namespace_id/:project_id/builds/:build_id/artifacts/file/*path                              projects/artifacts#file {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
-                             keep_namespace_project_build_artifacts POST     /*namespace_id/:project_id/builds/:build_id/artifacts/keep(.:format)                          projects/artifacts#keep {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :build_id=>/\d+/}
-                                           namespace_project_builds GET      /*namespace_id/:project_id/builds(.:format)                                                   projects/builds#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            namespace_project_build GET      /*namespace_id/:project_id/builds/:id(.:format)                                               projects/builds#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                        test_namespace_project_hook GET      /*namespace_id/:project_id/hooks/:id/test(.:format)                                           projects/hooks#test {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                            namespace_project_hooks GET      /*namespace_id/:project_id/hooks(.:format)                                                    projects/hooks#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/hooks(.:format)                                                    projects/hooks#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                             namespace_project_hook DELETE   /*namespace_id/:project_id/hooks/:id(.:format)                                                projects/hooks#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                         namespace_project_container_registry_index GET      /*namespace_id/:project_id/container_registry(.:format)                                       projects/container_registry#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                               namespace_project_container_registry DELETE   /*namespace_id/:project_id/container_registry/:id(.:format)                                   projects/container_registry#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                            sort_issues_namespace_project_milestone PUT      /*namespace_id/:project_id/milestones/:id/sort_issues(.:format)                               projects/milestones#sort_issues {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                    sort_merge_requests_namespace_project_milestone PUT      /*namespace_id/:project_id/milestones/:id/sort_merge_requests(.:format)                       projects/milestones#sort_merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                       namespace_project_milestones GET      /*namespace_id/:project_id/milestones(.:format)                                               projects/milestones#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/milestones(.:format)                                               projects/milestones#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    new_namespace_project_milestone GET      /*namespace_id/:project_id/milestones/new(.:format)                                           projects/milestones#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   edit_namespace_project_milestone GET      /*namespace_id/:project_id/milestones/:id/edit(.:format)                                      projects/milestones#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                        namespace_project_milestone GET      /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PATCH    /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/milestones/:id(.:format)                                           projects/milestones#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                  generate_namespace_project_labels POST     /*namespace_id/:project_id/labels/generate(.:format)                                          projects/labels#generate {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                            set_priorities_namespace_project_labels POST     /*namespace_id/:project_id/labels/set_priorities(.:format)                                    projects/labels#set_priorities {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    promote_namespace_project_label POST     /*namespace_id/:project_id/labels/:id/promote(.:format)                                       projects/labels#promote {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                        toggle_subscription_namespace_project_label POST     /*namespace_id/:project_id/labels/:id/toggle_subscription(.:format)                           projects/labels#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                            remove_priority_namespace_project_label DELETE   /*namespace_id/:project_id/labels/:id/remove_priority(.:format)                               projects/labels#remove_priority {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                           namespace_project_labels GET      /*namespace_id/:project_id/labels(.:format)                                                   projects/labels#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/labels(.:format)                                                   projects/labels#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                        new_namespace_project_label GET      /*namespace_id/:project_id/labels/new(.:format)                                               projects/labels#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       edit_namespace_project_label GET      /*namespace_id/:project_id/labels/:id/edit(.:format)                                          projects/labels#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                            namespace_project_label PATCH    /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/labels/:id(.:format)                                               projects/labels#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                        toggle_subscription_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/toggle_subscription(.:format)                           projects/issues#toggle_subscription {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                               mark_as_spam_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/mark_as_spam(.:format)                                  projects/issues#mark_as_spam {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                  referenced_merge_requests_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/referenced_merge_requests(.:format)                     projects/issues#referenced_merge_requests {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                           related_branches_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/related_branches(.:format)                              projects/issues#related_branches {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                          can_create_branch_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/can_create_branch(.:format)                             projects/issues#can_create_branch {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                               bulk_update_namespace_project_issues POST     /*namespace_id/:project_id/issues/bulk_update(.:format)                                       projects/issues#bulk_update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                         toggle_award_emoji_namespace_project_issue POST     /*namespace_id/:project_id/issues/:id/toggle_award_emoji(.:format)                            projects/issues#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                           namespace_project_issues GET      /*namespace_id/:project_id/issues(.:format)                                                   projects/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/issues(.:format)                                                   projects/issues#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                        new_namespace_project_issue GET      /*namespace_id/:project_id/issues/new(.:format)                                               projects/issues#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       edit_namespace_project_issue GET      /*namespace_id/:project_id/issues/:id/edit(.:format)                                          projects/issues#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                            namespace_project_issue GET      /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PATCH    /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/issues/:id(.:format)                                               projects/issues#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                            leave_namespace_project_project_members DELETE   /*namespace_id/:project_id/project_members/leave(.:format)                                    projects/project_members#leave {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                           import_namespace_project_project_members GET      /*namespace_id/:project_id/project_members/import(.:format)                                   projects/project_members#import {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                     apply_import_namespace_project_project_members POST     /*namespace_id/:project_id/project_members/apply_import(.:format)                             projects/project_members#apply_import {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                     resend_invite_namespace_project_project_member POST     /*namespace_id/:project_id/project_members/:id/resend_invite(.:format)                        projects/project_members#resend_invite {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
-                   request_access_namespace_project_project_members POST     /*namespace_id/:project_id/project_members/request_access(.:format)                           projects/project_members#request_access {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-            approve_access_request_namespace_project_project_member POST     /*namespace_id/:project_id/project_members/:id/approve_access_request(.:format)               projects/project_members#approve_access_request {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
-                                  namespace_project_project_members GET      /*namespace_id/:project_id/project_members(.:format)                                          projects/project_members#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/project_members(.:format)                                          projects/project_members#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   namespace_project_project_member PATCH    /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
-                                                                    PUT      /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
-                                                                    DELETE   /*namespace_id/:project_id/project_members/:id(.:format)                                      projects/project_members#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/[a-zA-Z.\/0-9_\-#%+]+/}
-                                      namespace_project_group_links GET      /*namespace_id/:project_id/group_links(.:format)                                              projects/group_links#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/group_links(.:format)                                              projects/group_links#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       namespace_project_group_link PATCH    /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/group_links/:id(.:format)                                          projects/group_links#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                           delete_attachment_namespace_project_note DELETE   /*namespace_id/:project_id/notes/:id/delete_attachment(.:format)                              projects/notes#delete_attachment {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                     resolve_namespace_project_note POST     /*namespace_id/:project_id/notes/:id/resolve(.:format)                                        projects/notes#resolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/notes/:id/resolve(.:format)                                        projects/notes#unresolve {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                          toggle_award_emoji_namespace_project_note POST     /*namespace_id/:project_id/notes/:id/toggle_award_emoji(.:format)                             projects/notes#toggle_award_emoji {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                            namespace_project_notes GET      /*namespace_id/:project_id/notes(.:format)                                                    projects/notes#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/notes(.:format)                                                    projects/notes#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                             namespace_project_note PATCH    /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    PUT      /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                                                    DELETE   /*namespace_id/:project_id/notes/:id(.:format)                                                projects/notes#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\d+/}
-                                     namespace_project_board_issues GET      /*namespace_id/:project_id/boards/:board_id/issues(.:format)                                  projects/boards/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      namespace_project_board_issue PATCH    /*namespace_id/:project_id/boards/:board_id/issues/:id(.:format)                              projects/boards/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/boards/:board_id/issues/:id(.:format)                              projects/boards/issues#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                             generate_namespace_project_board_lists POST     /*namespace_id/:project_id/boards/:board_id/lists/generate(.:format)                          projects/boards/lists#generate {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                namespace_project_board_list_issues GET      /*namespace_id/:project_id/boards/:board_id/lists/:list_id/issues(.:format)                   projects/boards/issues#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/boards/:board_id/lists/:list_id/issues(.:format)                   projects/boards/issues#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      namespace_project_board_lists GET      /*namespace_id/:project_id/boards/:board_id/lists(.:format)                                   projects/boards/lists#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/boards/:board_id/lists(.:format)                                   projects/boards/lists#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                       namespace_project_board_list PATCH    /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:project_id/boards/:board_id/lists/:id(.:format)                               projects/boards/lists#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           namespace_project_boards GET      /*namespace_id/:project_id/boards(.:format)                                                   projects/boards#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            namespace_project_board GET      /*namespace_id/:project_id/boards/:id(.:format)                                               projects/boards#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            namespace_project_todos POST     /*namespace_id/:project_id/todos(.:format)                                                    projects/todos#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     show_namespace_project_uploads GET      /*namespace_id/:project_id/uploads/:secret/:filename(.:format)                                projects/uploads#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :filename=>/[^\/]+/}
-                                          namespace_project_uploads POST     /*namespace_id/:project_id/uploads(.:format)                                                  projects/uploads#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    resume_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/resume(.:format)                                       projects/runners#resume {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     pause_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/pause(.:format)                                        projects/runners#pause {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                    toggle_shared_runners_namespace_project_runners POST     /*namespace_id/:project_id/runners/toggle_shared_runners(.:format)                            projects/runners#toggle_shared_runners {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          namespace_project_runners GET      /*namespace_id/:project_id/runners(.:format)                                                  projects/runners#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      edit_namespace_project_runner GET      /*namespace_id/:project_id/runners/:id/edit(.:format)                                         projects/runners#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           namespace_project_runner GET      /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PATCH    /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:project_id/runners/:id(.:format)                                              projects/runners#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  namespace_project_runner_projects POST     /*namespace_id/:project_id/runner_projects(.:format)                                          projects/runner_projects#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   namespace_project_runner_project DELETE   /*namespace_id/:project_id/runner_projects/:id(.:format)                                      projects/runner_projects#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     build_namespace_project_badges GET      /*namespace_id/:project_id/badges/*ref/build(.:format)                                        projects/badges#build {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/svg/}
-                                  coverage_namespace_project_badges GET      /*namespace_id/:project_id/badges/*ref/coverage(.:format)                                     projects/badges#coverage {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/svg/}
-                                           namespace_project_badges GET      /*namespace_id/:project_id/badges(.:format)                                                   projects/badges#index {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 namespace_project_settings_members GET      /*namespace_id/:project_id/settings/members(.:format)                                         projects/settings/members#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                   namespace_project_settings_ci_cd GET      /*namespace_id/:project_id/settings/ci_cd(.:format)                                           projects/settings/ci_cd#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                            namespace_project_settings_integrations GET      /*namespace_id/:project_id/settings/integrations(.:format)                                    projects/settings/integrations#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 namespace_project_wikis_git_access GET      /*namespace_id/:project_id/wikis/git_access(.:format)                                         projects/wikis#git_access {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      namespace_project_wikis_pages GET      /*namespace_id/:project_id/wikis/pages(.:format)                                              projects/wikis#pages {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                            namespace_project_wikis GET      /*namespace_id/:project_id/wikis(.:format)                                                    redirect(301, /%{namespace_id}/%{project_id}/wikis/home) {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    POST     /*namespace_id/:project_id/wikis(.:format)                                                    projects/wikis#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                        namespace_project_wiki_edit GET      /*namespace_id/:project_id/wikis/*id/edit                                                     projects/wikis#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                                     namespace_project_wiki_history GET      /*namespace_id/:project_id/wikis/*id/history                                                  projects/wikis#history {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                            namespace_project_wiki_preview_markdown POST     /*namespace_id/:project_id/wikis/*id/preview_markdown                                         projects/wikis#preview_markdown {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                                             namespace_project_wiki GET      /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                                                                    PUT      /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                                                                    DELETE   /*namespace_id/:project_id/wikis/*id                                                          projects/wikis#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/\S+/}
-                               archive_namespace_project_repository GET      /*namespace_id/:project_id/repository/archive(.:format)                                       projects/repositories#archive {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>/(zip|tar|tar\.gz|tgz|gz|tar\.bz2|tbz|tbz2|tb2|bz2)/}
-                                       namespace_project_repository POST     /*namespace_id/:project_id/repository(.:format)                                               projects/repositories#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      switch_namespace_project_refs GET      /*namespace_id/:project_id/refs/switch(.:format)                                              projects/refs#switch {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    logs_tree_namespace_project_ref GET      /*namespace_id/:project_id/refs/:id/logs_tree(.:format)                                       projects/refs#logs_tree {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/
-        (?!
-           (?# doesn't begins with)
-           \/|                    (?# rule #6)
-           (?# doesn't contain)
-           .*(?:
-              [\/.]\.|            (?# rule #1,3)
-              \/\/|               (?# rule #6)
-              @\{|                (?# rule #8)
-              \\                  (?# rule #9)
-           )
-        )
-        [^\000-\040\177~^:?*\[]+  (?# rule #4-5)
-        (?# doesn't end with)
-        (?<!\.lock)               (?# rule #1)
-        (?<![\/.])                (?# rule #6-7)
-      /x}
-                                    logs_file_namespace_project_ref GET      /*namespace_id/:project_id/refs/:id/logs_tree/*path(.:format)                                 projects/refs#logs_tree {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :path=>/.*/, :id=>/.*/}
-                                         namespace_project_new_blob GET      /*namespace_id/:project_id/new/*id(.:format)                                                  projects/blob#new {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                      namespace_project_create_blob POST     /*namespace_id/:project_id/create/*id(.:format)                                               projects/blob#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                        namespace_project_edit_blob GET      /*namespace_id/:project_id/edit/*id(.:format)                                                 projects/blob#edit {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                      namespace_project_update_blob PUT      /*namespace_id/:project_id/update/*id(.:format)                                               projects/blob#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                     namespace_project_preview_blob POST     /*namespace_id/:project_id/preview/*id(.:format)                                              projects/blob#preview {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                        namespace_project_blob_diff GET      /*namespace_id/:project_id/blob/*id/diff(.:format)                                            projects/blob#diff {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
-                                             namespace_project_blob GET      /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
-                                                                    DELETE   /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#destroy {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
-                                                                    POST     /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#create {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
-                                                                    PUT      /*namespace_id/:project_id/blob/*id(.:format)                                                 projects/blob#update {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :format=>false}
-                                              namespace_project_raw GET      /*namespace_id/:project_id/raw/*id(.:format)                                                  projects/raw#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
-                                             namespace_project_tree GET      /*namespace_id/:project_id/tree/*id(.:format)                                                 projects/tree#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
-                                        namespace_project_find_file GET      /*namespace_id/:project_id/find_file/*id(.:format)                                            projects/find_file#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/html/}
-                                            namespace_project_files GET      /*namespace_id/:project_id/files/*id(.:format)                                                projects/find_file#list {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/(?:[^.]|\.(?!json$))+/, :format=>/json/}
-                                       namespace_project_create_dir POST     /*namespace_id/:project_id/create_dir/*id(.:format)                                           projects/tree#create_dir {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/}
-                                            namespace_project_blame GET      /*namespace_id/:project_id/blame/*id(.:format)                                                projects/blame#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>/(html|js)/}
-                                          namespace_project_commits GET      /*namespace_id/:project_id/commits/*id(.:format)                                              projects/commits#show {:project_id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/, :id=>/.+/, :format=>false}
-                                         transfer_namespace_project PUT      /*namespace_id/:id/transfer(.:format)                                                         projects#transfer {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      remove_fork_namespace_project DELETE   /*namespace_id/:id/remove_fork(.:format)                                                      projects#remove_fork {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                          archive_namespace_project POST     /*namespace_id/:id/archive(.:format)                                                          projects#archive {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                        unarchive_namespace_project POST     /*namespace_id/:id/unarchive(.:format)                                                        projects#unarchive {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                     housekeeping_namespace_project POST     /*namespace_id/:id/housekeeping(.:format)                                                     projects#housekeeping {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                      toggle_star_namespace_project POST     /*namespace_id/:id/toggle_star(.:format)                                                      projects#toggle_star {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                 preview_markdown_namespace_project POST     /*namespace_id/:id/preview_markdown(.:format)                                                 projects#preview_markdown {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                           export_namespace_project POST     /*namespace_id/:id/export(.:format)                                                           projects#export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                    remove_export_namespace_project POST     /*namespace_id/:id/remove_export(.:format)                                                    projects#remove_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                              generate_new_export_namespace_project POST     /*namespace_id/:id/generate_new_export(.:format)                                              projects#generate_new_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                  download_export_namespace_project GET      /*namespace_id/:id/download_export(.:format)                                                  projects#download_export {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                         activity_namespace_project GET      /*namespace_id/:id/activity(.:format)                                                         projects#activity {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                             refs_namespace_project GET      /*namespace_id/:id/refs(.:format)                                                             projects#refs {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                new_issue_address_namespace_project PUT      /*namespace_id/:id/new_issue_address(.:format)                                                projects#new_issue_address {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                             edit_namespace_project GET      /*namespace_id/:id/edit(.:format)                                                             projects#edit {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                  namespace_project GET      /*namespace_id/:id(.:format)                                                                  projects#show {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PATCH    /*namespace_id/:id(.:format)                                                                  projects#update {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    PUT      /*namespace_id/:id(.:format)                                                                  projects#update {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                                    DELETE   /*namespace_id/:id(.:format)                                                                  projects#destroy {:id=>/(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*)(?<!\.git|\.atom)/}
-                                                               root GET      /                                                                                             root#index
-                                                              group GET      /*id(.:format)                                                                                groups#show {:format=>/(html|json|atom)/}
-                                                                    PATCH    /*id(.:format)                                                                                groups#update {:format=>/(html|json|atom)/}
-                                                                    PUT      /*id(.:format)                                                                                groups#update {:format=>/(html|json|atom)/}
-                                                                    DELETE   /*id(.:format)                                                                                groups#destroy {:format=>/(html|json|atom)/}
-                                                                    GET      /*unmatched_route(.:format)                                                                   application#route_not_found
-                                                                    GET      /health_check(/:checks)(.:format)                                                             health_check/health_check#index
-
-Routes for LetterOpenerWeb::Engine:
-clear_letters DELETE /clear(.:format)                 letter_opener_web/letters#clear
-delete_letter DELETE /:id(.:format)                   letter_opener_web/letters#destroy
-      letters GET    /                                letter_opener_web/letters#index
-       letter GET    /:id(/:style)(.:format)          letter_opener_web/letters#show
-              GET    /:id/attachments/:file(.:format) letter_opener_web/letters#attachment
-- 
GitLab


From 04b1741cd15e77329009bc40a92c642014c4ec0a Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Mon, 6 Mar 2017 18:10:19 +0900
Subject: [PATCH 04/28] Remove def favicon from extended status

---
 lib/gitlab/ci/status/build/failed_allowed.rb | 4 ----
 lib/gitlab/ci/status/success_warning.rb      | 4 ----
 2 files changed, 8 deletions(-)

diff --git a/lib/gitlab/ci/status/build/failed_allowed.rb b/lib/gitlab/ci/status/build/failed_allowed.rb
index 8693bd5849f..807afe24bd5 100644
--- a/lib/gitlab/ci/status/build/failed_allowed.rb
+++ b/lib/gitlab/ci/status/build/failed_allowed.rb
@@ -13,10 +13,6 @@ module Gitlab
             'icon_status_warning'
           end
 
-          def favicon
-            'favicon_status_warning'
-          end
-
           def group
             'failed_with_warnings'
           end
diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index 5b640162100..8568302f1ee 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -19,10 +19,6 @@ module Gitlab
         def icon
           'icon_status_warning'
         end
-
-        def favicon
-          'favicon_status_warning'
-        end
         
         def group
           'success_with_warnings'
-- 
GitLab


From af86d33653790d328a13cef65883cd820aae6209 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Mon, 6 Mar 2017 18:12:28 +0900
Subject: [PATCH 05/28] Add changelog

---
 ...r-gitlab-ci-status-for-pipeline-job-and-merge-request.yml | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 changelogs/unreleased/12818-expose-simple-cicd-status-endpoints-with-status-serializer-gitlab-ci-status-for-pipeline-job-and-merge-request.yml

diff --git a/changelogs/unreleased/12818-expose-simple-cicd-status-endpoints-with-status-serializer-gitlab-ci-status-for-pipeline-job-and-merge-request.yml b/changelogs/unreleased/12818-expose-simple-cicd-status-endpoints-with-status-serializer-gitlab-ci-status-for-pipeline-job-and-merge-request.yml
new file mode 100644
index 00000000000..953009213df
--- /dev/null
+++ b/changelogs/unreleased/12818-expose-simple-cicd-status-endpoints-with-status-serializer-gitlab-ci-status-for-pipeline-job-and-merge-request.yml
@@ -0,0 +1,5 @@
+---
+title: Expose CI/CD status API endpoints with Gitlab::Ci::Status facility on pipeline,
+  job and merge request for favicon
+merge_request: 9561
+author: dosuken123
-- 
GitLab


From 4fa4a2ce999c75aee1261815656e47f66d73c725 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Mon, 6 Mar 2017 21:01:18 +0900
Subject: [PATCH 06/28] Add controllers spec

---
 .../projects/builds_controller_spec.rb        | 30 +++++++++++++++++++
 .../merge_requests_controller_spec.rb         | 20 +++++++++++++
 .../projects/pipelines_controller_spec.rb     | 17 +++++++++++
 3 files changed, 67 insertions(+)
 create mode 100644 spec/controllers/projects/builds_controller_spec.rb

diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
new file mode 100644
index 00000000000..3abf3fa1aeb
--- /dev/null
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -0,0 +1,30 @@
+require 'spec_helper'
+
+describe Projects::BuildsController do
+  include ApiHelpers
+
+  let(:user) { create(:user) }
+  let(:project) { create(:empty_project, :public) }
+
+  before do
+    sign_in(user)
+  end
+
+  describe 'GET status.json' do
+    context 'when accessing status' do
+      before do
+        pipeline = create(:ci_pipeline, project: project)
+        build = create(:ci_build, pipeline: pipeline, status: 'success')
+        get :status, namespace_id: project.namespace,
+                  project_id: project,
+                  id: build.id,
+                  format: :json
+      end
+
+      it 'returns pipeline status via BuildSerializer' do
+        expect(response).to have_http_status(:ok)
+        expect(json_response['details']['status']['text']).to eq 'passed'
+      end
+    end
+  end
+end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index c310d830e81..433dbdb37bf 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1178,4 +1178,24 @@ describe Projects::MergeRequestsController do
       end
     end
   end
+
+  describe 'GET status.json' do
+    context 'when accessing status' do
+      before do
+        create(:ci_pipeline, project: merge_request.source_project,
+          ref: merge_request.source_branch,
+          sha: merge_request.diff_head_sha,
+          status: 'success')
+        get :status, namespace_id: project.namespace,
+                  project_id: project,
+                  id: merge_request.iid,
+                  format: :json
+      end
+
+      it 'returns pipeline status via PipelineSerializer' do
+        expect(response).to have_http_status(:ok)
+        expect(json_response['details']['status']['text']).to eq 'passed'
+      end
+    end
+  end
 end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 04bb5cbbd59..b8ab9933f33 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -69,4 +69,21 @@ describe Projects::PipelinesController do
                   format: :json
     end
   end
+
+  describe 'GET status.json' do
+    context 'when accessing status' do
+      before do
+        pipeline = create(:ci_pipeline, project: project, status: 'success')
+        get :status, namespace_id: project.namespace,
+                  project_id: project,
+                  id: pipeline.id,
+                  format: :json
+      end
+
+      it 'returns pipeline status via PipelineSerializer' do
+        expect(response).to have_http_status(:ok)
+        expect(json_response['details']['status']['text']).to eq 'passed'
+      end
+    end
+  end
 end
-- 
GitLab


From 0191455471a977a9c7aac5de5574f6826c9bd2d1 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Mon, 6 Mar 2017 21:01:58 +0900
Subject: [PATCH 07/28] Remove legacy def status from builds_controller

---
 app/controllers/projects/builds_controller.rb | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index 8d00f2bf1b2..f141cd6c3be 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -73,9 +73,6 @@ class Projects::BuildsController < Projects::ApplicationController
     redirect_to build_path(@build)
   end
 
-  # def status
-  #   render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha)
-  # end
   def status
     render json: BuildSerializer
       .new(project: @project, user: @current_user)
-- 
GitLab


From 617292046cf69ff4a41da875fe67f0ce7f612ea3 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 7 Mar 2017 00:09:48 +0900
Subject: [PATCH 08/28] Add spec for entity and serializer

---
 spec/serializers/build_entity_spec.rb        | 13 +++++++++-
 spec/serializers/build_serializer_spec.rb    | 26 ++++++++++++++++++++
 spec/serializers/pipeline_entity_spec.rb     |  2 +-
 spec/serializers/pipeline_serializer_spec.rb | 13 ++++++++++
 spec/serializers/status_entity_spec.rb       |  2 +-
 5 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 spec/serializers/build_serializer_spec.rb

diff --git a/spec/serializers/build_entity_spec.rb b/spec/serializers/build_entity_spec.rb
index 60c9642ee2c..cd30b00c711 100644
--- a/spec/serializers/build_entity_spec.rb
+++ b/spec/serializers/build_entity_spec.rb
@@ -1,10 +1,16 @@
 require 'spec_helper'
 
 describe BuildEntity do
+  let(:user) { create(:user) }
   let(:build) { create(:ci_build) }
+  let(:request) { double('request') }
+
+  before do
+    allow(request).to receive(:user).and_return(user)
+  end
 
   let(:entity) do
-    described_class.new(build, request: double)
+    described_class.new(build, request: request)
   end
 
   subject { entity.as_json }
@@ -22,6 +28,11 @@ describe BuildEntity do
     expect(subject).to include(:created_at, :updated_at)
   end
 
+  it 'contains details' do
+    expect(subject).to include :details
+    expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
+  end
+
   context 'when build is a regular job' do
     it 'does not contain path to play action' do
       expect(subject).not_to include(:play_path)
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
new file mode 100644
index 00000000000..ef75a2941c2
--- /dev/null
+++ b/spec/serializers/build_serializer_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe BuildSerializer do
+  let(:user) { create(:user) }
+
+  let(:serializer) do
+    described_class.new(user: user)
+  end
+
+  subject { serializer.represent(resource) }
+
+  describe '#represent' do
+    context 'when used with status' do
+      let(:serializer) do
+        described_class.new(user: user)
+          .with_status
+      end
+      let(:resource) { create(:ci_build) }
+
+      it 'serializes only status' do
+        expect(subject[:details][:status]).not_to be_empty
+        expect(subject[:details].keys.count).to eq 1
+      end
+    end
+  end
+end
diff --git a/spec/serializers/pipeline_entity_spec.rb b/spec/serializers/pipeline_entity_spec.rb
index ccb72973f9c..93d5a21419d 100644
--- a/spec/serializers/pipeline_entity_spec.rb
+++ b/spec/serializers/pipeline_entity_spec.rb
@@ -30,7 +30,7 @@ describe PipelineEntity do
           .to include :duration, :finished_at
         expect(subject[:details])
           .to include :stages, :artifacts, :manual_actions
-        expect(subject[:details][:status]).to include :icon, :text, :label
+        expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
       end
 
       it 'contains flags' do
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 2aaef03cb93..3bf4a667853 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -93,5 +93,18 @@ describe PipelineSerializer do
         end
       end
     end
+
+    context 'when used with status' do
+      let(:serializer) do
+        described_class.new(user: user)
+          .with_status
+      end
+      let(:resource) { create(:ci_empty_pipeline) }
+
+      it 'serializes only status' do
+        expect(subject[:details][:status]).not_to be_empty
+        expect(subject[:details].keys.count).to eq 1
+      end
+    end
   end
 end
diff --git a/spec/serializers/status_entity_spec.rb b/spec/serializers/status_entity_spec.rb
index 89428b4216e..c94902dbab8 100644
--- a/spec/serializers/status_entity_spec.rb
+++ b/spec/serializers/status_entity_spec.rb
@@ -16,7 +16,7 @@ describe StatusEntity do
     subject { entity.as_json }
 
     it 'contains status details' do
-      expect(subject).to include :text, :icon, :label, :group
+      expect(subject).to include :text, :icon, :favicon, :label, :group
       expect(subject).to include :has_details, :details_path
     end
   end
-- 
GitLab


From f8d6e81b92e85663bead6036e80407d7ab55a643 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 7 Mar 2017 00:42:39 +0900
Subject: [PATCH 09/28] Fix rubocop anger

---
 app/serializers/build_serializer.rb                  |  2 +-
 app/serializers/pipeline_serializer.rb               |  2 +-
 spec/controllers/projects/builds_controller_spec.rb  |  6 +++---
 .../projects/merge_requests_controller_spec.rb       | 12 ++++++------
 .../projects/pipelines_controller_spec.rb            |  6 +++---
 5 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index 39460bbd092..b1739caaf5f 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -2,7 +2,7 @@ class BuildSerializer < BaseSerializer
   entity BuildEntity
 
   def with_status
-    tap { @status_only = {only: [{details: [:status]}]} }
+    tap { @status_only = { only: [{ details: [:status] }] } }
   end
 
   def represent(resource, opts = {})
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 4de9e620f64..6b6e4a8f0f0 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -12,7 +12,7 @@ class PipelineSerializer < BaseSerializer
   end
 
   def with_status
-    tap { @status_only = {only: [{details: [:status]}]} }
+    tap { @status_only = { only: [{ details: [:status] }] } }
   end
 
   def represent(resource, opts = {})
diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
index 3abf3fa1aeb..53a307aa362 100644
--- a/spec/controllers/projects/builds_controller_spec.rb
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -16,9 +16,9 @@ describe Projects::BuildsController do
         pipeline = create(:ci_pipeline, project: project)
         build = create(:ci_build, pipeline: pipeline, status: 'success')
         get :status, namespace_id: project.namespace,
-                  project_id: project,
-                  id: build.id,
-                  format: :json
+                     project_id: project,
+                     id: build.id,
+                     format: :json
       end
 
       it 'returns pipeline status via BuildSerializer' do
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 433dbdb37bf..2cbb46d8274 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1183,13 +1183,13 @@ describe Projects::MergeRequestsController do
     context 'when accessing status' do
       before do
         create(:ci_pipeline, project: merge_request.source_project,
-          ref: merge_request.source_branch,
-          sha: merge_request.diff_head_sha,
-          status: 'success')
+                             ref: merge_request.source_branch,
+                             sha: merge_request.diff_head_sha,
+                             status: 'success')
         get :status, namespace_id: project.namespace,
-                  project_id: project,
-                  id: merge_request.iid,
-                  format: :json
+                     project_id: project,
+                     id: merge_request.iid,
+                     format: :json
       end
 
       it 'returns pipeline status via PipelineSerializer' do
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index b8ab9933f33..5a9e02331f7 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -75,9 +75,9 @@ describe Projects::PipelinesController do
       before do
         pipeline = create(:ci_pipeline, project: project, status: 'success')
         get :status, namespace_id: project.namespace,
-                  project_id: project,
-                  id: pipeline.id,
-                  format: :json
+                     project_id: project,
+                     id: pipeline.id,
+                     format: :json
       end
 
       it 'returns pipeline status via PipelineSerializer' do
-- 
GitLab


From 21e62c9ef96b43af9934a886312d3b930c315cad Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 7 Mar 2017 01:10:33 +0900
Subject: [PATCH 10/28] Roolback unneccesary changes

---
 lib/gitlab/ci/status/success_warning.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index 8568302f1ee..d4cdab6957a 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -19,7 +19,7 @@ module Gitlab
         def icon
           'icon_status_warning'
         end
-        
+
         def group
           'success_with_warnings'
         end
-- 
GitLab


From 170e54236999aebcdf1508b47a00f9b692b3f8db Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 7 Mar 2017 03:22:23 +0900
Subject: [PATCH 11/28] Fix deployment_entity_spec.rb. It also reads
 BuildSerializer.

---
 spec/serializers/deployment_entity_spec.rb | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/spec/serializers/deployment_entity_spec.rb b/spec/serializers/deployment_entity_spec.rb
index ea87771e2a2..22b566ec3ca 100644
--- a/spec/serializers/deployment_entity_spec.rb
+++ b/spec/serializers/deployment_entity_spec.rb
@@ -1,8 +1,15 @@
 require 'spec_helper'
 
 describe DeploymentEntity do
+  let(:user) { create(:user) }
+  let(:request) { double('request') }
+
+  before do
+    allow(request).to receive(:user).and_return(user)
+  end
+  
   let(:entity) do
-    described_class.new(deployment, request: double)
+    described_class.new(deployment, request: request)
   end
 
   let(:deployment) { create(:deployment) }
-- 
GitLab


From 2b33e9eeb68199f7085102a85c06821b991ecd4d Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 10 Mar 2017 18:30:39 +0900
Subject: [PATCH 12/28] with_status to only_status

---
 app/controllers/projects/builds_controller.rb         | 2 +-
 app/controllers/projects/merge_requests_controller.rb | 2 +-
 app/controllers/projects/pipelines_controller.rb      | 2 +-
 app/serializers/build_serializer.rb                   | 2 +-
 app/serializers/pipeline_serializer.rb                | 2 +-
 spec/serializers/build_serializer_spec.rb             | 2 +-
 spec/serializers/pipeline_serializer_spec.rb          | 2 +-
 7 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index f141cd6c3be..caa3d335765 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -76,7 +76,7 @@ class Projects::BuildsController < Projects::ApplicationController
   def status
     render json: BuildSerializer
       .new(project: @project, user: @current_user)
-      .with_status
+      .only_status
       .represent(@build)
   end
 
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 5087abedf40..c873d06de5a 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -476,7 +476,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
-      .with_status
+      .only_status
       .represent(@merge_request.head_pipeline)
   end
 
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 976827040ac..12ab43665f2 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -75,7 +75,7 @@ class Projects::PipelinesController < Projects::ApplicationController
   def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
-      .with_status
+      .only_status
       .represent(@pipeline)
   end
 
diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index b1739caaf5f..e0096dc7b4a 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -1,7 +1,7 @@
 class BuildSerializer < BaseSerializer
   entity BuildEntity
 
-  def with_status
+  def only_status
     tap { @status_only = { only: [{ details: [:status] }] } }
   end
 
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 6b6e4a8f0f0..c667fc840b2 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -11,7 +11,7 @@ class PipelineSerializer < BaseSerializer
     @paginator.present?
   end
 
-  def with_status
+  def only_status
     tap { @status_only = { only: [{ details: [:status] }] } }
   end
 
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
index ef75a2941c2..e6437538328 100644
--- a/spec/serializers/build_serializer_spec.rb
+++ b/spec/serializers/build_serializer_spec.rb
@@ -13,7 +13,7 @@ describe BuildSerializer do
     context 'when used with status' do
       let(:serializer) do
         described_class.new(user: user)
-          .with_status
+          .only_status
       end
       let(:resource) { create(:ci_build) }
 
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 3bf4a667853..0e043e980ac 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -97,7 +97,7 @@ describe PipelineSerializer do
     context 'when used with status' do
       let(:serializer) do
         described_class.new(user: user)
-          .with_status
+          .only_status
       end
       let(:resource) { create(:ci_empty_pipeline) }
 
-- 
GitLab


From 3b635002976e1dd45e58271efdb71f7349719d02 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 10 Mar 2017 21:56:35 +0900
Subject: [PATCH 13/28] 3 lines to One line. Correct spec caption.

---
 app/serializers/build_entity.rb                             | 4 +---
 app/serializers/pipeline_entity.rb                          | 5 +----
 spec/controllers/projects/builds_controller_spec.rb         | 2 +-
 spec/controllers/projects/merge_requests_controller_spec.rb | 2 +-
 spec/controllers/projects/pipelines_controller_spec.rb      | 2 +-
 5 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/app/serializers/build_entity.rb b/app/serializers/build_entity.rb
index 10151d94e68..35566c55950 100644
--- a/app/serializers/build_entity.rb
+++ b/app/serializers/build_entity.rb
@@ -20,9 +20,7 @@ class BuildEntity < Grape::Entity
   expose :updated_at
 
   expose :details do
-    expose :detailed_status,
-        as: :status,
-        with: StatusEntity
+    expose :detailed_status, as: :status, with: StatusEntity
   end
 
   private
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index 1c1fa9e3dee..3f16dd66d54 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -12,10 +12,7 @@ class PipelineEntity < Grape::Entity
   end
 
   expose :details do
-    expose :detailed_status,
-      as: :status,
-      with: StatusEntity
-
+    expose :detailed_status, as: :status, with: StatusEntity
     expose :duration
     expose :finished_at
     expose :stages, using: StageEntity
diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
index 53a307aa362..4411069918a 100644
--- a/spec/controllers/projects/builds_controller_spec.rb
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -21,7 +21,7 @@ describe Projects::BuildsController do
                      format: :json
       end
 
-      it 'returns pipeline status via BuildSerializer' do
+      it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
         expect(json_response['details']['status']['text']).to eq 'passed'
       end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 2cbb46d8274..3bcea2b6517 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1192,7 +1192,7 @@ describe Projects::MergeRequestsController do
                      format: :json
       end
 
-      it 'returns pipeline status via PipelineSerializer' do
+      it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
         expect(json_response['details']['status']['text']).to eq 'passed'
       end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 5a9e02331f7..aa6415d58e8 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -80,7 +80,7 @@ describe Projects::PipelinesController do
                      format: :json
       end
 
-      it 'returns pipeline status via PipelineSerializer' do
+      it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
         expect(json_response['details']['status']['text']).to eq 'passed'
       end
-- 
GitLab


From a5b96417f39a5ab8b4d2ddde1fd654937244a73c Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 00:16:48 +0900
Subject: [PATCH 14/28] with_status to represent_status

---
 app/serializers/build_entity.rb              |  5 +----
 app/serializers/build_serializer.rb          | 13 +++++--------
 app/serializers/pipeline_serializer.rb       | 13 +++++--------
 spec/serializers/build_serializer_spec.rb    | 18 +++++++++++-------
 spec/serializers/pipeline_serializer_spec.rb | 16 +++++++++-------
 5 files changed, 31 insertions(+), 34 deletions(-)

diff --git a/app/serializers/build_entity.rb b/app/serializers/build_entity.rb
index 35566c55950..fadd6c5c597 100644
--- a/app/serializers/build_entity.rb
+++ b/app/serializers/build_entity.rb
@@ -18,10 +18,7 @@ class BuildEntity < Grape::Entity
 
   expose :created_at
   expose :updated_at
-
-  expose :details do
-    expose :detailed_status, as: :status, with: StatusEntity
-  end
+  expose :detailed_status, as: :status, with: StatusEntity
 
   private
 
diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index e0096dc7b4a..2c9cf99811e 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -1,15 +1,12 @@
 class BuildSerializer < BaseSerializer
   entity BuildEntity
 
-  def only_status
-    tap { @status_only = { only: [{ details: [:status] }] } }
-  end
-
   def represent(resource, opts = {})
-    if @status_only.present?
-      opts.merge!(@status_only)
-    end
-
     super(resource, opts)
   end
+
+  def represent_status(resource)
+    data = represent(resource, { only: [:status] })
+    data[:status]
+  end
 end
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index c667fc840b2..62f31d4c5ad 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -11,23 +11,20 @@ class PipelineSerializer < BaseSerializer
     @paginator.present?
   end
 
-  def only_status
-    tap { @status_only = { only: [{ details: [:status] }] } }
-  end
-
   def represent(resource, opts = {})
     if resource.is_a?(ActiveRecord::Relation)
       resource = resource.includes(project: :namespace)
     end
 
-    if @status_only.present?
-      opts.merge!(@status_only)
-    end
-
     if paginated?
       super(@paginator.paginate(resource), opts)
     else
       super(resource, opts)
     end
   end
+
+  def represent_status(resource)
+    data = represent(resource, { only: [{ details: [:status] }] })
+    data[:details][:status]
+  end
 end
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
index e6437538328..a8069004e7b 100644
--- a/spec/serializers/build_serializer_spec.rb
+++ b/spec/serializers/build_serializer_spec.rb
@@ -10,16 +10,20 @@ describe BuildSerializer do
   subject { serializer.represent(resource) }
 
   describe '#represent' do
-    context 'when used with status' do
-      let(:serializer) do
-        described_class.new(user: user)
-          .only_status
+    # TODO:
+  end
+
+  describe '#represent_status' do
+    context 'when represents only status' do
+      let(:status) do
+        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
       end
-      let(:resource) { create(:ci_build) }
+      let(:resource) { create(:ci_build, status: :success) }
+
+      subject { serializer.represent_status(resource) }
 
       it 'serializes only status' do
-        expect(subject[:details][:status]).not_to be_empty
-        expect(subject[:details].keys.count).to eq 1
+        expect(subject[:favicon]).to eq(status.favicon)
       end
     end
   end
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 0e043e980ac..a668d9df11a 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -93,17 +93,19 @@ describe PipelineSerializer do
         end
       end
     end
+  end
 
-    context 'when used with status' do
-      let(:serializer) do
-        described_class.new(user: user)
-          .only_status
+  describe '#represent_status' do
+    context 'when represents only status' do
+      let(:status) do
+        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
       end
-      let(:resource) { create(:ci_empty_pipeline) }
+      let(:resource) { create(:ci_pipeline, status: :success) }
+
+      subject { serializer.represent_status(resource) }
 
       it 'serializes only status' do
-        expect(subject[:details][:status]).not_to be_empty
-        expect(subject[:details].keys.count).to eq 1
+        expect(subject[:favicon]).to eq(status.favicon)
       end
     end
   end
-- 
GitLab


From 49f9ab9064d5c902293389852bdc91750c08ecb4 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 00:49:52 +0900
Subject: [PATCH 15/28] Add spec for spec/lib/gitlab/ci/status

---
 lib/gitlab/ci/status/manual.rb             | 4 ++++
 spec/lib/gitlab/ci/status/canceled_spec.rb | 4 ++++
 spec/lib/gitlab/ci/status/created_spec.rb  | 4 ++++
 spec/lib/gitlab/ci/status/failed_spec.rb   | 4 ++++
 spec/lib/gitlab/ci/status/manual_spec.rb   | 4 ++++
 spec/lib/gitlab/ci/status/pending_spec.rb  | 4 ++++
 spec/lib/gitlab/ci/status/running_spec.rb  | 4 ++++
 spec/lib/gitlab/ci/status/skipped_spec.rb  | 4 ++++
 spec/lib/gitlab/ci/status/success_spec.rb  | 4 ++++
 9 files changed, 36 insertions(+)

diff --git a/lib/gitlab/ci/status/manual.rb b/lib/gitlab/ci/status/manual.rb
index 5f28521901d..f8f6c2903ba 100644
--- a/lib/gitlab/ci/status/manual.rb
+++ b/lib/gitlab/ci/status/manual.rb
@@ -13,6 +13,10 @@ module Gitlab
         def icon
           'icon_status_manual'
         end
+
+        def favicon
+          'favicon_status_manual'
+        end
       end
     end
   end
diff --git a/spec/lib/gitlab/ci/status/canceled_spec.rb b/spec/lib/gitlab/ci/status/canceled_spec.rb
index 768f8926f1d..530639a5897 100644
--- a/spec/lib/gitlab/ci/status/canceled_spec.rb
+++ b/spec/lib/gitlab/ci/status/canceled_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Canceled do
     it { expect(subject.icon).to eq 'icon_status_canceled' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_canceled' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'canceled' }
   end
diff --git a/spec/lib/gitlab/ci/status/created_spec.rb b/spec/lib/gitlab/ci/status/created_spec.rb
index e96c13aede3..aef982e17f1 100644
--- a/spec/lib/gitlab/ci/status/created_spec.rb
+++ b/spec/lib/gitlab/ci/status/created_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Created do
     it { expect(subject.icon).to eq 'icon_status_created' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_created' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'created' }
   end
diff --git a/spec/lib/gitlab/ci/status/failed_spec.rb b/spec/lib/gitlab/ci/status/failed_spec.rb
index e5da0a91159..9a25743885c 100644
--- a/spec/lib/gitlab/ci/status/failed_spec.rb
+++ b/spec/lib/gitlab/ci/status/failed_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Failed do
     it { expect(subject.icon).to eq 'icon_status_failed' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_failed' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'failed' }
   end
diff --git a/spec/lib/gitlab/ci/status/manual_spec.rb b/spec/lib/gitlab/ci/status/manual_spec.rb
index 3fd3727b92d..6fdc3801d71 100644
--- a/spec/lib/gitlab/ci/status/manual_spec.rb
+++ b/spec/lib/gitlab/ci/status/manual_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Manual do
     it { expect(subject.icon).to eq 'icon_status_manual' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_manual' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'manual' }
   end
diff --git a/spec/lib/gitlab/ci/status/pending_spec.rb b/spec/lib/gitlab/ci/status/pending_spec.rb
index 8d09cf2a05a..ffc53f0506b 100644
--- a/spec/lib/gitlab/ci/status/pending_spec.rb
+++ b/spec/lib/gitlab/ci/status/pending_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Pending do
     it { expect(subject.icon).to eq 'icon_status_pending' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_pending' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'pending' }
   end
diff --git a/spec/lib/gitlab/ci/status/running_spec.rb b/spec/lib/gitlab/ci/status/running_spec.rb
index 10d3bf749c1..0babf1fb54e 100644
--- a/spec/lib/gitlab/ci/status/running_spec.rb
+++ b/spec/lib/gitlab/ci/status/running_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Running do
     it { expect(subject.icon).to eq 'icon_status_running' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_running' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'running' }
   end
diff --git a/spec/lib/gitlab/ci/status/skipped_spec.rb b/spec/lib/gitlab/ci/status/skipped_spec.rb
index 10db93d3802..670747c9f0b 100644
--- a/spec/lib/gitlab/ci/status/skipped_spec.rb
+++ b/spec/lib/gitlab/ci/status/skipped_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Skipped do
     it { expect(subject.icon).to eq 'icon_status_skipped' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_skipped' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'skipped' }
   end
diff --git a/spec/lib/gitlab/ci/status/success_spec.rb b/spec/lib/gitlab/ci/status/success_spec.rb
index 230f24b94a4..ff65b074808 100644
--- a/spec/lib/gitlab/ci/status/success_spec.rb
+++ b/spec/lib/gitlab/ci/status/success_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::Success do
     it { expect(subject.icon).to eq 'icon_status_success' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_success' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'success' }
   end
-- 
GitLab


From ea08e2c8afa468afecede56836b5ceb5dcd1f63e Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 01:15:46 +0900
Subject: [PATCH 16/28] Add favicon spec for factory_spec

---
 spec/lib/gitlab/ci/status/build/factory_spec.rb | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/spec/lib/gitlab/ci/status/build/factory_spec.rb b/spec/lib/gitlab/ci/status/build/factory_spec.rb
index 8b3bd08cf13..f6bc3eac9e3 100644
--- a/spec/lib/gitlab/ci/status/build/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/factory_spec.rb
@@ -27,6 +27,7 @@ describe Gitlab::Ci::Status::Build::Factory do
     it 'fabricates status with correct details' do
       expect(status.text).to eq 'passed'
       expect(status.icon).to eq 'icon_status_success'
+      expect(status.favicon).to eq 'favicon_status_success'
       expect(status.label).to eq 'passed'
       expect(status).to have_details
       expect(status).to have_action
@@ -53,6 +54,7 @@ describe Gitlab::Ci::Status::Build::Factory do
       it 'fabricates status with correct details' do
         expect(status.text).to eq 'failed'
         expect(status.icon).to eq 'icon_status_failed'
+        expect(status.favicon).to eq 'favicon_status_failed'
         expect(status.label).to eq 'failed'
         expect(status).to have_details
         expect(status).to have_action
@@ -79,6 +81,7 @@ describe Gitlab::Ci::Status::Build::Factory do
       it 'fabricates status with correct details' do
         expect(status.text).to eq 'failed'
         expect(status.icon).to eq 'icon_status_warning'
+        expect(status.favicon).to eq 'favicon_status_warning'
         expect(status.label).to eq 'failed (allowed to fail)'
         expect(status).to have_details
         expect(status).to have_action
@@ -107,6 +110,7 @@ describe Gitlab::Ci::Status::Build::Factory do
     it 'fabricates status with correct details' do
       expect(status.text).to eq 'canceled'
       expect(status.icon).to eq 'icon_status_canceled'
+      expect(status.favicon).to eq 'favicon_status_canceled'
       expect(status.label).to eq 'canceled'
       expect(status).to have_details
       expect(status).to have_action
@@ -132,6 +136,7 @@ describe Gitlab::Ci::Status::Build::Factory do
     it 'fabricates status with correct details' do
       expect(status.text).to eq 'running'
       expect(status.icon).to eq 'icon_status_running'
+      expect(status.favicon).to eq 'favicon_status_running'
       expect(status.label).to eq 'running'
       expect(status).to have_details
       expect(status).to have_action
@@ -157,6 +162,7 @@ describe Gitlab::Ci::Status::Build::Factory do
     it 'fabricates status with correct details' do
       expect(status.text).to eq 'pending'
       expect(status.icon).to eq 'icon_status_pending'
+      expect(status.favicon).to eq 'favicon_status_pending'
       expect(status.label).to eq 'pending'
       expect(status).to have_details
       expect(status).to have_action
@@ -181,6 +187,7 @@ describe Gitlab::Ci::Status::Build::Factory do
     it 'fabricates status with correct details' do
       expect(status.text).to eq 'skipped'
       expect(status.icon).to eq 'icon_status_skipped'
+      expect(status.favicon).to eq 'favicon_status_skipped'
       expect(status.label).to eq 'skipped'
       expect(status).to have_details
       expect(status).not_to have_action
@@ -208,6 +215,7 @@ describe Gitlab::Ci::Status::Build::Factory do
         expect(status.text).to eq 'manual'
         expect(status.group).to eq 'manual'
         expect(status.icon).to eq 'icon_status_manual'
+        expect(status.favicon).to eq 'favicon_status_manual'
         expect(status.label).to eq 'manual play action'
         expect(status).to have_details
         expect(status).to have_action
@@ -235,6 +243,7 @@ describe Gitlab::Ci::Status::Build::Factory do
         expect(status.text).to eq 'manual'
         expect(status.group).to eq 'manual'
         expect(status.icon).to eq 'icon_status_manual'
+        expect(status.favicon).to eq 'favicon_status_manual'
         expect(status.label).to eq 'manual stop action'
         expect(status).to have_details
         expect(status).to have_action
-- 
GitLab


From 38b1ec2cc04e850ff4898615cf9596de0f6235e1 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 02:44:41 +0900
Subject: [PATCH 17/28] Fix rspec failure

---
 app/controllers/projects/builds_controller.rb             | 3 +--
 app/controllers/projects/merge_requests_controller.rb     | 3 +--
 app/controllers/projects/pipelines_controller.rb          | 3 +--
 spec/controllers/projects/builds_controller_spec.rb       | 8 ++++++--
 .../projects/merge_requests_controller_spec.rb            | 8 ++++++--
 spec/controllers/projects/pipelines_controller_spec.rb    | 8 ++++++--
 6 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index caa3d335765..3441d3919e2 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -76,8 +76,7 @@ class Projects::BuildsController < Projects::ApplicationController
   def status
     render json: BuildSerializer
       .new(project: @project, user: @current_user)
-      .only_status
-      .represent(@build)
+      .represent_status(@build)
   end
 
   def erase
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index c873d06de5a..a20334757e0 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -476,8 +476,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
-      .only_status
-      .represent(@merge_request.head_pipeline)
+      .represent_status(@merge_request.head_pipeline)
   end
 
   def ci_environments_status
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 12ab43665f2..43a1abaa662 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -75,8 +75,7 @@ class Projects::PipelinesController < Projects::ApplicationController
   def status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
-      .only_status
-      .represent(@pipeline)
+      .represent_status(@pipeline)
   end
 
   def stage
diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
index 4411069918a..c6a3bce93da 100644
--- a/spec/controllers/projects/builds_controller_spec.rb
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -12,9 +12,13 @@ describe Projects::BuildsController do
 
   describe 'GET status.json' do
     context 'when accessing status' do
+      let(:status) do
+        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
+      end
+
       before do
         pipeline = create(:ci_pipeline, project: project)
-        build = create(:ci_build, pipeline: pipeline, status: 'success')
+        build = create(:ci_build, pipeline: pipeline, status: :success)
         get :status, namespace_id: project.namespace,
                      project_id: project,
                      id: build.id,
@@ -23,7 +27,7 @@ describe Projects::BuildsController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
-        expect(json_response['details']['status']['text']).to eq 'passed'
+        expect(json_response['favicon']).to eq status.favicon
       end
     end
   end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 3bcea2b6517..19c4ba25d1b 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1181,11 +1181,15 @@ describe Projects::MergeRequestsController do
 
   describe 'GET status.json' do
     context 'when accessing status' do
+      let(:status) do
+        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
+      end
+
       before do
         create(:ci_pipeline, project: merge_request.source_project,
                              ref: merge_request.source_branch,
                              sha: merge_request.diff_head_sha,
-                             status: 'success')
+                             status: :success)
         get :status, namespace_id: project.namespace,
                      project_id: project,
                      id: merge_request.iid,
@@ -1194,7 +1198,7 @@ describe Projects::MergeRequestsController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
-        expect(json_response['details']['status']['text']).to eq 'passed'
+        expect(json_response['favicon']).to eq status.favicon
       end
     end
   end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index aa6415d58e8..53d0ebda2d5 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -72,8 +72,12 @@ describe Projects::PipelinesController do
 
   describe 'GET status.json' do
     context 'when accessing status' do
+      let(:status) do
+        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
+      end
+
       before do
-        pipeline = create(:ci_pipeline, project: project, status: 'success')
+        pipeline = create(:ci_pipeline, project: project, status: :success)
         get :status, namespace_id: project.namespace,
                      project_id: project,
                      id: pipeline.id,
@@ -82,7 +86,7 @@ describe Projects::PipelinesController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
-        expect(json_response['details']['status']['text']).to eq 'passed'
+        expect(json_response['favicon']).to eq status.favicon
       end
     end
   end
-- 
GitLab


From 74f13e0ddf1d7adb14fd4df9dd95519498157013 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 19:56:05 +0900
Subject: [PATCH 18/28] Fix unchanged structure. Add favicon for
 'failed_allowed' and 'success_warning' because it'll be used.

---
 lib/gitlab/ci/status/build/failed_allowed.rb           | 4 ++++
 lib/gitlab/ci/status/success_warning.rb                | 4 ++++
 spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb | 6 ++++++
 spec/lib/gitlab/ci/status/success_warning_spec.rb      | 4 ++++
 spec/serializers/build_entity_spec.rb                  | 4 ++--
 5 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/lib/gitlab/ci/status/build/failed_allowed.rb b/lib/gitlab/ci/status/build/failed_allowed.rb
index 807afe24bd5..8693bd5849f 100644
--- a/lib/gitlab/ci/status/build/failed_allowed.rb
+++ b/lib/gitlab/ci/status/build/failed_allowed.rb
@@ -13,6 +13,10 @@ module Gitlab
             'icon_status_warning'
           end
 
+          def favicon
+            'favicon_status_warning'
+          end
+
           def group
             'failed_with_warnings'
           end
diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index d4cdab6957a..9b735ed235a 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -20,6 +20,10 @@ module Gitlab
           'icon_status_warning'
         end
 
+        def favicon
+          'favicon_status_warning'
+        end
+
         def group
           'success_with_warnings'
         end
diff --git a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
index 20f71459738..b39ccbb1f60 100644
--- a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
@@ -22,6 +22,12 @@ describe Gitlab::Ci::Status::Build::FailedAllowed do
     end
   end
 
+  describe '#favicon' do
+    it 'returns a warning favicon' do
+      expect(subject.favicon).to eq 'favicon_status_warning'
+    end
+  end
+
   describe '#label' do
     it 'returns information about failed but allowed to fail status' do
       expect(subject.label).to eq 'failed (allowed to fail)'
diff --git a/spec/lib/gitlab/ci/status/success_warning_spec.rb b/spec/lib/gitlab/ci/status/success_warning_spec.rb
index 7e2269397c6..19d0da499f9 100644
--- a/spec/lib/gitlab/ci/status/success_warning_spec.rb
+++ b/spec/lib/gitlab/ci/status/success_warning_spec.rb
@@ -17,6 +17,10 @@ describe Gitlab::Ci::Status::SuccessWarning do
     it { expect(subject.icon).to eq 'icon_status_warning' }
   end
 
+  describe '#favicon' do
+    it { expect(subject.favicon).to eq 'favicon_status_warning' }
+  end
+
   describe '#group' do
     it { expect(subject.group).to eq 'success_with_warnings' }
   end
diff --git a/spec/serializers/build_entity_spec.rb b/spec/serializers/build_entity_spec.rb
index cd30b00c711..7dcdf54fd93 100644
--- a/spec/serializers/build_entity_spec.rb
+++ b/spec/serializers/build_entity_spec.rb
@@ -29,8 +29,8 @@ describe BuildEntity do
   end
 
   it 'contains details' do
-    expect(subject).to include :details
-    expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
+    expect(subject).to include :status
+    expect(subject[:status]).to include :icon, :favicon, :text, :label
   end
 
   context 'when build is a regular job' do
-- 
GitLab


From 448c695c2afeb9b69fa274244a7ac6b85ef50f00 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 22:24:36 +0900
Subject: [PATCH 19/28] Revert adding favicon to extended statuses. Change
 extended statues specs to use core status

---
 lib/gitlab/ci/status/build/failed_allowed.rb           | 4 ----
 lib/gitlab/ci/status/success_warning.rb                | 4 ----
 spec/lib/gitlab/ci/status/build/factory_spec.rb        | 2 +-
 spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb | 6 ------
 spec/lib/gitlab/ci/status/success_warning_spec.rb      | 4 ----
 5 files changed, 1 insertion(+), 19 deletions(-)

diff --git a/lib/gitlab/ci/status/build/failed_allowed.rb b/lib/gitlab/ci/status/build/failed_allowed.rb
index 8693bd5849f..807afe24bd5 100644
--- a/lib/gitlab/ci/status/build/failed_allowed.rb
+++ b/lib/gitlab/ci/status/build/failed_allowed.rb
@@ -13,10 +13,6 @@ module Gitlab
             'icon_status_warning'
           end
 
-          def favicon
-            'favicon_status_warning'
-          end
-
           def group
             'failed_with_warnings'
           end
diff --git a/lib/gitlab/ci/status/success_warning.rb b/lib/gitlab/ci/status/success_warning.rb
index 9b735ed235a..d4cdab6957a 100644
--- a/lib/gitlab/ci/status/success_warning.rb
+++ b/lib/gitlab/ci/status/success_warning.rb
@@ -20,10 +20,6 @@ module Gitlab
           'icon_status_warning'
         end
 
-        def favicon
-          'favicon_status_warning'
-        end
-
         def group
           'success_with_warnings'
         end
diff --git a/spec/lib/gitlab/ci/status/build/factory_spec.rb b/spec/lib/gitlab/ci/status/build/factory_spec.rb
index f6bc3eac9e3..e648a3ac3a2 100644
--- a/spec/lib/gitlab/ci/status/build/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/factory_spec.rb
@@ -81,7 +81,7 @@ describe Gitlab::Ci::Status::Build::Factory do
       it 'fabricates status with correct details' do
         expect(status.text).to eq 'failed'
         expect(status.icon).to eq 'icon_status_warning'
-        expect(status.favicon).to eq 'favicon_status_warning'
+        expect(status.favicon).to eq 'favicon_status_failed'
         expect(status.label).to eq 'failed (allowed to fail)'
         expect(status).to have_details
         expect(status).to have_action
diff --git a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
index b39ccbb1f60..20f71459738 100644
--- a/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb
@@ -22,12 +22,6 @@ describe Gitlab::Ci::Status::Build::FailedAllowed do
     end
   end
 
-  describe '#favicon' do
-    it 'returns a warning favicon' do
-      expect(subject.favicon).to eq 'favicon_status_warning'
-    end
-  end
-
   describe '#label' do
     it 'returns information about failed but allowed to fail status' do
       expect(subject.label).to eq 'failed (allowed to fail)'
diff --git a/spec/lib/gitlab/ci/status/success_warning_spec.rb b/spec/lib/gitlab/ci/status/success_warning_spec.rb
index 19d0da499f9..7e2269397c6 100644
--- a/spec/lib/gitlab/ci/status/success_warning_spec.rb
+++ b/spec/lib/gitlab/ci/status/success_warning_spec.rb
@@ -17,10 +17,6 @@ describe Gitlab::Ci::Status::SuccessWarning do
     it { expect(subject.icon).to eq 'icon_status_warning' }
   end
 
-  describe '#favicon' do
-    it { expect(subject.favicon).to eq 'favicon_status_warning' }
-  end
-
   describe '#group' do
     it { expect(subject.group).to eq 'success_with_warnings' }
   end
-- 
GitLab


From 08a0bc5397b6f41deef5d2e492c6cf101db741ae Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sat, 11 Mar 2017 23:30:25 +0900
Subject: [PATCH 20/28] Add more specs

---
 .../projects/builds_controller_spec.rb        |  3 +++
 .../merge_requests_controller_spec.rb         |  3 +++
 .../projects/pipelines_controller_spec.rb     |  3 +++
 spec/serializers/build_serializer_spec.rb     | 19 ++++++++++++++++++-
 spec/serializers/pipeline_serializer_spec.rb  |  3 +++
 5 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
index c6a3bce93da..2234b2e6131 100644
--- a/spec/controllers/projects/builds_controller_spec.rb
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -27,6 +27,9 @@ describe Projects::BuildsController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
+        expect(json_response['text']).to eq status.text
+        expect(json_response['label']).to eq status.label
+        expect(json_response['icon']).to eq status.icon
         expect(json_response['favicon']).to eq status.favicon
       end
     end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 19c4ba25d1b..8b9a26aabff 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1198,6 +1198,9 @@ describe Projects::MergeRequestsController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
+        expect(json_response['text']).to eq status.text
+        expect(json_response['label']).to eq status.label
+        expect(json_response['icon']).to eq status.icon
         expect(json_response['favicon']).to eq status.favicon
       end
     end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 53d0ebda2d5..9ce8f8e8da1 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -86,6 +86,9 @@ describe Projects::PipelinesController do
 
       it 'return a correct pipeline status' do
         expect(response).to have_http_status(:ok)
+        expect(json_response['text']).to eq status.text
+        expect(json_response['label']).to eq status.label
+        expect(json_response['icon']).to eq status.icon
         expect(json_response['favicon']).to eq status.favicon
       end
     end
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
index a8069004e7b..5a55d9d7dc1 100644
--- a/spec/serializers/build_serializer_spec.rb
+++ b/spec/serializers/build_serializer_spec.rb
@@ -10,7 +10,21 @@ describe BuildSerializer do
   subject { serializer.represent(resource) }
 
   describe '#represent' do
-    # TODO:
+    context 'when a single object is being serialized' do
+      let(:resource) { create(:ci_build) }
+
+      it 'serializers the pipeline object' do
+        expect(subject[:id]).to eq resource.id
+      end
+    end
+
+    context 'when multiple objects are being serialized' do
+      let(:resource) { create_list(:ci_build, 2) }
+
+      it 'serializers the array of pipelines' do
+        expect(subject).not_to be_empty
+      end
+    end
   end
 
   describe '#represent_status' do
@@ -23,6 +37,9 @@ describe BuildSerializer do
       subject { serializer.represent_status(resource) }
 
       it 'serializes only status' do
+        expect(subject[:text]).to eq(status.text)
+        expect(subject[:label]).to eq(status.label)
+        expect(subject[:icon]).to eq(status.icon)
         expect(subject[:favicon]).to eq(status.favicon)
       end
     end
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index a668d9df11a..261f2152c22 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -105,6 +105,9 @@ describe PipelineSerializer do
       subject { serializer.represent_status(resource) }
 
       it 'serializes only status' do
+        expect(subject[:text]).to eq(status.text)
+        expect(subject[:label]).to eq(status.label)
+        expect(subject[:icon]).to eq(status.icon)
         expect(subject[:favicon]).to eq(status.favicon)
       end
     end
-- 
GitLab


From d8343a0c41444b4f8bcff5e157f97d8a3cb8a766 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Sun, 12 Mar 2017 02:22:08 +0900
Subject: [PATCH 21/28] Remove unnecessary spaces

---
 spec/serializers/deployment_entity_spec.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spec/serializers/deployment_entity_spec.rb b/spec/serializers/deployment_entity_spec.rb
index 22b566ec3ca..95eca5463eb 100644
--- a/spec/serializers/deployment_entity_spec.rb
+++ b/spec/serializers/deployment_entity_spec.rb
@@ -7,7 +7,7 @@ describe DeploymentEntity do
   before do
     allow(request).to receive(:user).and_return(user)
   end
-  
+
   let(:entity) do
     described_class.new(deployment, request: request)
   end
-- 
GitLab


From 361f85122b4d226224e6fc8c9e4beac940ff10bf Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 17 Mar 2017 15:58:12 +0900
Subject: [PATCH 22/28] Rename endpoints 'status' to 'pipeline_status' in
 merge_requests

---
 .../projects/merge_requests_controller.rb            |  4 ++--
 config/routes/project.rb                             |  2 +-
 .../projects/merge_requests_controller_spec.rb       | 12 ++++++------
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index a20334757e0..165035285f4 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -10,7 +10,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   before_action :module_enabled
   before_action :merge_request, only: [
     :edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :pipelines, :merge, :merge_check,
-    :ci_status, :status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
+    :ci_status, :pipeline_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_pipeline_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
   ]
   before_action :validates_merge_request, only: [:show, :diffs, :commits, :pipelines]
   before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines]
@@ -473,7 +473,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     render json: response
   end
 
-  def status
+  def pipeline_status
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
       .represent_status(@merge_request.head_pipeline)
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 1df066ff55d..823e0614aeb 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -102,7 +102,7 @@ constraints(ProjectUrlConstrainer.new) do
           get :merge_widget_refresh
           post :cancel_merge_when_pipeline_succeeds
           get :ci_status
-          get :status
+          get :pipeline_status
           get :ci_environments_status
           post :toggle_subscription
           post :remove_wip
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 8b9a26aabff..9fa509c339e 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1179,8 +1179,8 @@ describe Projects::MergeRequestsController do
     end
   end
 
-  describe 'GET status.json' do
-    context 'when accessing status' do
+  describe 'GET pipeline_status.json' do
+    context 'when accessing pipeline_status' do
       let(:status) do
         Gitlab::Ci::Status::Success.new(double('object'), double('user'))
       end
@@ -1190,10 +1190,10 @@ describe Projects::MergeRequestsController do
                              ref: merge_request.source_branch,
                              sha: merge_request.diff_head_sha,
                              status: :success)
-        get :status, namespace_id: project.namespace,
-                     project_id: project,
-                     id: merge_request.iid,
-                     format: :json
+        get :pipeline_status, namespace_id: project.namespace,
+                              project_id: project,
+                              id: merge_request.iid,
+                              format: :json
       end
 
       it 'return a correct pipeline status' do
-- 
GitLab


From 9d56cb6a0d562ba7e2c9429af1d2ab0677871a37 Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Fri, 17 Mar 2017 17:05:27 +0900
Subject: [PATCH 23/28] Using fetch instead of direct refference for hash

---
 app/serializers/build_serializer.rb    | 2 +-
 app/serializers/pipeline_serializer.rb | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index 2c9cf99811e..c5dbb391ce0 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -7,6 +7,6 @@ class BuildSerializer < BaseSerializer
 
   def represent_status(resource)
     data = represent(resource, { only: [:status] })
-    data[:status]
+    data.fetch(:status, {})
   end
 end
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 62f31d4c5ad..384e881da06 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -25,6 +25,6 @@ class PipelineSerializer < BaseSerializer
 
   def represent_status(resource)
     data = represent(resource, { only: [{ details: [:status] }] })
-    data[:details][:status]
+    data.fetch(:details, {}).fetch(:status, {})
   end
 end
-- 
GitLab


From c4441c623e7c33839e682819db269a7ee4cb8faa Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 21 Mar 2017 21:07:01 +0900
Subject: [PATCH 24/28] Use superclass represent

---
 app/serializers/build_serializer.rb | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/app/serializers/build_serializer.rb b/app/serializers/build_serializer.rb
index c5dbb391ce0..79b67001199 100644
--- a/app/serializers/build_serializer.rb
+++ b/app/serializers/build_serializer.rb
@@ -1,10 +1,6 @@
 class BuildSerializer < BaseSerializer
   entity BuildEntity
 
-  def represent(resource, opts = {})
-    super(resource, opts)
-  end
-
   def represent_status(resource)
     data = represent(resource, { only: [:status] })
     data.fetch(:status, {})
-- 
GitLab


From 6dcd2d591fa00be027b92e8c0e6b3b129921f4fa Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 21 Mar 2017 21:15:20 +0900
Subject: [PATCH 25/28] fetch to dig

---
 app/serializers/pipeline_serializer.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 384e881da06..412390737cb 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -25,6 +25,6 @@ class PipelineSerializer < BaseSerializer
 
   def represent_status(resource)
     data = represent(resource, { only: [{ details: [:status] }] })
-    data.fetch(:details, {}).fetch(:status, {})
+    data.dig(:details, :status) || {}
   end
 end
-- 
GitLab


From a375d80eb072d62962af9b6f2decf9782cd7ee1f Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Tue, 21 Mar 2017 22:21:13 +0900
Subject: [PATCH 26/28] Use detailed_status effectively. Remove unnecesarry
 context(nest). Add new context in merge_requests_controller_spec.rb and fix a
 bug. Correct description of spec.

---
 .../projects/merge_requests_controller.rb     |  1 +
 .../projects/builds_controller_spec.rb        | 34 ++++++++---------
 .../merge_requests_controller_spec.rb         | 37 ++++++++++++-------
 .../projects/pipelines_controller_spec.rb     | 32 +++++++---------
 spec/serializers/build_serializer_spec.rb     |  6 +--
 spec/serializers/pipeline_serializer_spec.rb  |  6 +--
 6 files changed, 58 insertions(+), 58 deletions(-)

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 165035285f4..6a116f99f13 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -474,6 +474,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   end
 
   def pipeline_status
+    render json: {} and return unless @merge_request.head_pipeline.present?
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
       .represent_status(@merge_request.head_pipeline)
diff --git a/spec/controllers/projects/builds_controller_spec.rb b/spec/controllers/projects/builds_controller_spec.rb
index 2234b2e6131..683667129e5 100644
--- a/spec/controllers/projects/builds_controller_spec.rb
+++ b/spec/controllers/projects/builds_controller_spec.rb
@@ -11,27 +11,23 @@ describe Projects::BuildsController do
   end
 
   describe 'GET status.json' do
-    context 'when accessing status' do
-      let(:status) do
-        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
-      end
+    let(:pipeline) { create(:ci_pipeline, project: project) }
+    let(:build) { create(:ci_build, pipeline: pipeline) }
+    let(:status) { build.detailed_status(double('user')) }
 
-      before do
-        pipeline = create(:ci_pipeline, project: project)
-        build = create(:ci_build, pipeline: pipeline, status: :success)
-        get :status, namespace_id: project.namespace,
-                     project_id: project,
-                     id: build.id,
-                     format: :json
-      end
+    before do
+      get :status, namespace_id: project.namespace,
+                   project_id: project,
+                   id: build.id,
+                   format: :json
+    end
 
-      it 'return a correct pipeline status' do
-        expect(response).to have_http_status(:ok)
-        expect(json_response['text']).to eq status.text
-        expect(json_response['label']).to eq status.label
-        expect(json_response['icon']).to eq status.icon
-        expect(json_response['favicon']).to eq status.favicon
-      end
+    it 'return a detailed build status in json' do
+      expect(response).to have_http_status(:ok)
+      expect(json_response['text']).to eq status.text
+      expect(json_response['label']).to eq status.label
+      expect(json_response['icon']).to eq status.icon
+      expect(json_response['favicon']).to eq status.favicon
     end
   end
 end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 9fa509c339e..72f41f7209a 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1180,23 +1180,18 @@ describe Projects::MergeRequestsController do
   end
 
   describe 'GET pipeline_status.json' do
-    context 'when accessing pipeline_status' do
-      let(:status) do
-        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
-      end
-
-      before do
+    context 'when head_pipeline exists' do
+      let!(:pipeline) do
         create(:ci_pipeline, project: merge_request.source_project,
                              ref: merge_request.source_branch,
-                             sha: merge_request.diff_head_sha,
-                             status: :success)
-        get :pipeline_status, namespace_id: project.namespace,
-                              project_id: project,
-                              id: merge_request.iid,
-                              format: :json
+                             sha: merge_request.diff_head_sha)
       end
 
-      it 'return a correct pipeline status' do
+      let(:status) { pipeline.detailed_status(double('user')) }
+
+      before { get_pipeline_status }
+
+      it 'return a detailed head_pipeline status in json' do
         expect(response).to have_http_status(:ok)
         expect(json_response['text']).to eq status.text
         expect(json_response['label']).to eq status.label
@@ -1204,5 +1199,21 @@ describe Projects::MergeRequestsController do
         expect(json_response['favicon']).to eq status.favicon
       end
     end
+
+    context 'when head_pipeline does not exist' do
+      before { get_pipeline_status }
+
+      it 'return empty' do
+        expect(response).to have_http_status(:ok)
+        expect(json_response).to be_empty
+      end
+    end
+
+    def get_pipeline_status
+      get :pipeline_status, namespace_id: project.namespace,
+                            project_id: project,
+                            id: merge_request.iid,
+                            format: :json
+    end
   end
 end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 9ce8f8e8da1..d8f9bfd0d37 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -71,26 +71,22 @@ describe Projects::PipelinesController do
   end
 
   describe 'GET status.json' do
-    context 'when accessing status' do
-      let(:status) do
-        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
-      end
+    let(:pipeline) { create(:ci_pipeline, project: project) }
+    let(:status) { pipeline.detailed_status(double('user')) }
 
-      before do
-        pipeline = create(:ci_pipeline, project: project, status: :success)
-        get :status, namespace_id: project.namespace,
-                     project_id: project,
-                     id: pipeline.id,
-                     format: :json
-      end
+    before do
+      get :status, namespace_id: project.namespace,
+                   project_id: project,
+                   id: pipeline.id,
+                   format: :json
+    end
 
-      it 'return a correct pipeline status' do
-        expect(response).to have_http_status(:ok)
-        expect(json_response['text']).to eq status.text
-        expect(json_response['label']).to eq status.label
-        expect(json_response['icon']).to eq status.icon
-        expect(json_response['favicon']).to eq status.favicon
-      end
+    it 'return a detailed pipeline status in json' do
+      expect(response).to have_http_status(:ok)
+      expect(json_response['text']).to eq status.text
+      expect(json_response['label']).to eq status.label
+      expect(json_response['icon']).to eq status.icon
+      expect(json_response['favicon']).to eq status.favicon
     end
   end
 end
diff --git a/spec/serializers/build_serializer_spec.rb b/spec/serializers/build_serializer_spec.rb
index 5a55d9d7dc1..3cc791bca50 100644
--- a/spec/serializers/build_serializer_spec.rb
+++ b/spec/serializers/build_serializer_spec.rb
@@ -29,10 +29,8 @@ describe BuildSerializer do
 
   describe '#represent_status' do
     context 'when represents only status' do
-      let(:status) do
-        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
-      end
-      let(:resource) { create(:ci_build, status: :success) }
+      let(:resource) { create(:ci_build) }
+      let(:status) { resource.detailed_status(double('user')) }
 
       subject { serializer.represent_status(resource) }
 
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 261f2152c22..8642b803844 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -97,10 +97,8 @@ describe PipelineSerializer do
 
   describe '#represent_status' do
     context 'when represents only status' do
-      let(:status) do
-        Gitlab::Ci::Status::Success.new(double('object'), double('user'))
-      end
-      let(:resource) { create(:ci_pipeline, status: :success) }
+      let(:resource) { create(:ci_pipeline) }
+      let(:status) { resource.detailed_status(double('user')) }
 
       subject { serializer.represent_status(resource) }
 
-- 
GitLab


From 1d75989551090ce1f21984cb2630e29493d9065b Mon Sep 17 00:00:00 2001
From: Shinya Maeda <gitlab.shinyamaeda@gmail.com>
Date: Thu, 23 Mar 2017 17:18:11 +0900
Subject: [PATCH 27/28] Move conditional statement to
 PipelineSerializer#represent_status

---
 app/controllers/projects/merge_requests_controller.rb | 1 -
 app/serializers/pipeline_serializer.rb                | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 6a116f99f13..165035285f4 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -474,7 +474,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   end
 
   def pipeline_status
-    render json: {} and return unless @merge_request.head_pipeline.present?
     render json: PipelineSerializer
       .new(project: @project, user: @current_user)
       .represent_status(@merge_request.head_pipeline)
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 412390737cb..0094e3f4114 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -24,6 +24,7 @@ class PipelineSerializer < BaseSerializer
   end
 
   def represent_status(resource)
+    return {} unless resource.present?
     data = represent(resource, { only: [{ details: [:status] }] })
     data.dig(:details, :status) || {}
   end
-- 
GitLab


From b3375a49647853f45df11b464bf7aa3e34af0f88 Mon Sep 17 00:00:00 2001
From: Dosuken shinya <gitlab.shinyamaeda@gmail.com>
Date: Thu, 23 Mar 2017 10:37:27 +0000
Subject: [PATCH 28/28] Add a blank line after a guard clause

---
 app/serializers/pipeline_serializer.rb | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 0094e3f4114..7829df9fada 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -25,6 +25,7 @@ class PipelineSerializer < BaseSerializer
 
   def represent_status(resource)
     return {} unless resource.present?
+
     data = represent(resource, { only: [{ details: [:status] }] })
     data.dig(:details, :status) || {}
   end
-- 
GitLab