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