diff --git a/app/controllers/projects/build_artifacts_controller.rb b/app/controllers/projects/build_artifacts_controller.rb new file mode 100644 index 00000000000..873246f484e --- /dev/null +++ b/app/controllers/projects/build_artifacts_controller.rb @@ -0,0 +1,49 @@ +class Projects::BuildArtifactsController < Projects::ApplicationController + include ExtractsPath + include RendersBlob + + before_action :extract_ref_name_and_path + + def download + redirect_to download_namespace_project_job_artifacts_path(project.namespace, project, job) + end + + def browse + redirect_to browse_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path]) + end + + def file + redirect_to file_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path]) + end + + def raw + redirect_to raw_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path]) + end + + def latest_succeeded + redirect_to latest_succeeded_namespace_project_artifacts_path(project.namespace, project, job, ref_name_and_path: params[:ref_name_and_path], job: params[:job]) + end + + private + + def extract_ref_name_and_path + return unless params[:ref_name_and_path] + + @ref_name, @path = extract_ref(params[:ref_name_and_path]) + end + + def job + @job ||= job_from_id || job_from_ref + end + + def job_from_id + project.builds.find_by(id: params[:build_id]) if params[:build_id] + end + + def job_from_ref + return unless @ref_name + + jobs = project.latest_successful_builds_for(@ref_name) + jobs.find_by(name: params[:job]) + end +end diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb new file mode 100644 index 00000000000..013797a7313 --- /dev/null +++ b/app/controllers/projects/builds_controller.rb @@ -0,0 +1,27 @@ +class Projects::BuildsController < Projects::ApplicationController + def index + redirect_to namespace_project_jobs_path(project.namespace, project) + end + + def show + redirect_to namespace_project_job_path(project.namespace, project, job) + end + + def trace + redirect_to trace_namespace_project_job_path(project.namespace, project, job, format: params[:format]) + end + + def status + redirect_to status_namespace_project_job_path(project.namespace, project, job, format: params[:format]) + end + + def raw + redirect_to raw_namespace_project_job_path(project.namespace, project, job) + end + + private + + def job + @job ||= project.builds.find(params[:id]) + end +end diff --git a/lib/gitlab/routes/legacy_builds.rb b/lib/gitlab/routes/legacy_builds.rb index 2ae6a93981b..cbb8b960c7e 100644 --- a/lib/gitlab/routes/legacy_builds.rb +++ b/lib/gitlab/routes/legacy_builds.rb @@ -1,4 +1,3 @@ - module Gitlab module Routes class LegacyBuilds @@ -10,52 +9,33 @@ module Gitlab end def draw - redirect_artifacts = @map.redirect(&method(:redirect_artifacts)) - redirect_builds = @map.redirect(&method(:redirect_builds)) + @map.instance_eval do + resources :builds, only: [:index, :show], constraints: { id: /\d+/ } do + collection do + resources :artifacts, only: [], controller: 'build_artifacts' do + collection do + get :latest_succeeded, + path: '*ref_name_and_path', + format: false + end + end + end - @map.get '/builds(/:id)/artifacts/*action', to: redirect_artifacts, - as: 'legacy_artifacts', - format: false + member do + get :status + get :trace, defaults: { format: 'json' } + get :raw + end - @map.get '/builds(/:id(/*action))', to: redirect_builds, - as: 'legacy_builds', - format: false - end - - private - - def redirect_artifacts(params, req) - if params[:id] - project = fake_project(*params.values_at(:namespace_id, :project_id)) - - artifacts_action_path(params[:action], project, params[:id]) - else - latest_succeeded_namespace_project_artifacts_path(params[:namespace_id], params[:project_id], params[:action], job: req.GET[:job]) - end - end - - def redirect_builds(params, req) - args = params.values_at(:namespace_id, :project_id, :id).compact - - if params[:id] - case params[:action] - when 'status' - status_namespace_project_job_path(*args, format: params[:format]) - when 'trace' - trace_namespace_project_job_path(*args, format: params[:format]) - when 'raw' - raw_namespace_project_job_path(*args) - else # show - namespace_project_job_path(*args) + resource :artifacts, only: [], controller: 'build_artifacts' do + get :download + get :browse, path: 'browse(/*path)', format: false + get :file, path: 'file/*path', format: false + get :raw, path: 'raw/*path', format: false + end end - else # index - namespace_project_jobs_path(*args) end end - - def fake_project(namespace_id, project_id) - Struct.new(:namespace, :to_param).new(namespace_id, project_id) - end end end end