diff options
author | Valery Sizov <vsv2711@gmail.com> | 2015-04-29 16:59:28 +0300 |
---|---|---|
committer | Valery Sizov <vsv2711@gmail.com> | 2015-04-29 18:26:12 +0300 |
commit | 4886b2d58436026fba7499a04ec7b6419c321c76 (patch) | |
tree | f34eca80cd12ac357f00bf0ce6505570daa6a905 | |
parent | 3bbd2f55a299b31a702b7ae6aa2624e5116bc8e8 (diff) | |
download | gitlab-ci-4886b2d58436026fba7499a04ec7b6419c321c76.tar.gz |
Better support forks
-rw-r--r-- | app/controllers/application_controller.rb | 4 | ||||
-rw-r--r-- | app/controllers/jobs_controller.rb | 1 | ||||
-rw-r--r-- | app/controllers/projects_controller.rb | 6 | ||||
-rw-r--r-- | app/models/project.rb | 5 | ||||
-rw-r--r-- | app/services/create_project_service.rb | 7 | ||||
-rw-r--r-- | app/views/jobs/_list.html.haml | 2 | ||||
-rw-r--r-- | app/views/jobs/index.html.haml | 45 | ||||
-rw-r--r-- | app/views/layouts/_nav_project.html.haml | 10 | ||||
-rw-r--r-- | app/views/projects/_form_for_fork.html.haml | 47 | ||||
-rw-r--r-- | app/views/projects/edit.html.haml | 5 | ||||
-rw-r--r-- | db/migrate/20150429000160_add_parent_id_to_project.rb | 5 | ||||
-rw-r--r-- | db/schema.rb | 3 |
12 files changed, 105 insertions, 35 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c412a45..4692bd1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -60,6 +60,10 @@ class ApplicationController < ActionController::Base end end + def check_fork! + page_404 if @project.fork? + end + def page_404 render file: "#{Rails.root}/public/404.html", status: 404, layout: false end diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb index 7d029aa..9ea13e5 100644 --- a/app/controllers/jobs_controller.rb +++ b/app/controllers/jobs_controller.rb @@ -3,6 +3,7 @@ class JobsController < ApplicationController before_filter :project before_filter :authorize_access_project! before_filter :authorize_manage_project! + before_filter :check_fork!, only: :deploy_jobs layout 'project' diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index dfef9bf..6b88ff5 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -64,7 +64,7 @@ class ProjectsController < ApplicationController end def update - if project.update_attributes(project_params) + if project.update_attributes(project.fork? ? project_params_for_forks : project_params) EventService.new.change_project_settings(current_user, project) redirect_to :back, notice: 'Project was successfully updated.' @@ -124,4 +124,8 @@ class ProjectsController < ApplicationController :email_recipients, :email_add_pusher, :email_only_broken_builds, :coverage_regex, :shared_runners_enabled, { jobs_attributes: [:id, :name, :build_branches, :build_tags, :tag_list, :commands, :refs, :_destroy, :job_type] }) end + + def project_params_for_forks + params.require(:project).permit(:always_build, :polling_interval, :default_ref, :skip_refs) + end end diff --git a/app/models/project.rb b/app/models/project.rb index 31ce6ab..0cc95d7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -39,6 +39,7 @@ class Project < ActiveRecord::Base has_many :services, dependent: :destroy has_one :slack_service, dependent: :destroy has_one :mail_service, dependent: :destroy + belongs_to :parent, class_name: "Project", foreign_key: "parent_id" accepts_nested_attributes_for :jobs, allow_destroy: true @@ -158,6 +159,10 @@ ls -la services.any? end + def fork? + !!parent_id + end + def timeout_in_minutes timeout / 60 end diff --git a/app/services/create_project_service.rb b/app/services/create_project_service.rb index 63cbd86..5cca00f 100644 --- a/app/services/create_project_service.rb +++ b/app/services/create_project_service.rb @@ -19,17 +19,12 @@ class CreateProjectService end if forked_project - # Copy jobs - @project.jobs = forked_project.jobs.map do |job| - Job.new(job.attributes.except("id")) - end - # Copy settings settings = forked_project.attributes.select do |attr_name, value| ["public", "shared_runners_enabled", "allow_git_fetch"].include? attr_name end - @project.update(settings) + @project.update(settings.merge({parent_id: forked_project.id})) end EventService.new.create_project(current_user, @project) diff --git a/app/views/jobs/_list.html.haml b/app/views/jobs/_list.html.haml index 440985b..17a3f31 100644 --- a/app/views/jobs/_list.html.haml +++ b/app/views/jobs/_list.html.haml @@ -7,7 +7,7 @@ %th Tags %tbody - - @project.jobs.each do |job| + - @project.jobs.parallel.each do |job| %tr %td= job.name %td= check_box_tag nil, nil, job.build_branches, disabled: true diff --git a/app/views/jobs/index.html.haml b/app/views/jobs/index.html.haml index f1b82af..cfa63bf 100644 --- a/app/views/jobs/index.html.haml +++ b/app/views/jobs/index.html.haml @@ -1,24 +1,27 @@ -%ul.nav.nav-tabs.append-bottom-20 - %li{class: "active"} - = link_to 'Test (run in parallel)', project_jobs_path(@project) - %li - = link_to 'Deploy (run on success)', deploy_jobs_project_jobs_path(@project) - - +- if @project.fork? + = render 'list' +- else + %ul.nav.nav-tabs.append-bottom-20 + %li{class: "active"} + = link_to 'Test (run in parallel)', project_jobs_path(@project) + %li + = link_to 'Deploy (run on success)', deploy_jobs_project_jobs_path(@project) + + -.btn-group.pull-right - = link_to project_jobs_path(@project), class: "btn #{'active' unless params[:list]}" do - %i.icon-edit - Edit - = link_to project_jobs_path(@project, list: 'true'), class: "btn #{'active' if params[:list]}" do - %i.icon-list - List -%p.slead - Jobs are scripts you want CI to run on each push to repository + .btn-group.pull-right + = link_to project_jobs_path(@project), class: "btn #{'active' unless params[:list]}" do + %i.icon-edit + Edit + = link_to project_jobs_path(@project, list: 'true'), class: "btn #{'active' if params[:list]}" do + %i.icon-list + List + %p.slead + Jobs are scripts you want CI to run on each push to repository -%hr + %hr -- if params[:list] - = render 'list' -- else - = render 'edit' + - if params[:list] + = render 'list' + - else + = render 'edit'
\ No newline at end of file diff --git a/app/views/layouts/_nav_project.html.haml b/app/views/layouts/_nav_project.html.haml index 4f3e3b3..34fbc53 100644 --- a/app/views/layouts/_nav_project.html.haml +++ b/app/views/layouts/_nav_project.html.haml @@ -24,10 +24,12 @@ = link_to project_services_path(@project) do %i.icon-gear Services - = nav_link path: 'events#index' do - = link_to project_events_path(@project) do - %i.icon-book - Events + - unless @project.fork? + = nav_link path: 'events#index' do + = link_to project_events_path(@project) do + %i.icon-book + Events + %li %hr = nav_link path: 'projects#edit' do diff --git a/app/views/projects/_form_for_fork.html.haml b/app/views/projects/_form_for_fork.html.haml new file mode 100644 index 0000000..4d8581d --- /dev/null +++ b/app/views/projects/_form_for_fork.html.haml @@ -0,0 +1,47 @@ += nested_form_for @project, html: { class: 'form-horizontal' } do |f| + - if @project.errors.any? + #error_explanation + %p.lead= "#{pluralize(@project.errors.count, "error")} prohibited this project from being saved:" + .alert.alert-error + %ul + - @project.errors.full_messages.each do |msg| + %li= msg + + %fieldset + %legend Build Schedule + .form-group + = f.label :always_build, 'Schedule build', class: 'control-label' + .col-sm-10 + .checkbox + = f.label :always_build do + = f.check_box :always_build + %span.light Repeat last build after X hours if no builds + .form-group + = f.label :polling_interval, "Build interval", class: 'control-label' + .col-sm-10 + = f.number_field :polling_interval, placeholder: '5', min: '0', class: 'form-control' + .light In hours + + %fieldset + %legend Project settings + .form-group + = f.label :default_ref, "Make tabs for the following branches", class: 'control-label' + .col-sm-10 + = f.text_field :default_ref, class: 'form-control', placeholder: 'master, stable' + .light You will be able to filter builds by the following branches + + + %fieldset + %legend Advanced settings + .form-group + = f.label :skip_refs, "Skip refs", class: 'control-label' + .col-sm-10 + = f.text_field :skip_refs, class: 'form-control', placeholder: 'branch1, branch2, feature/*' + .light + You can specify git references to skip CI builds. Accepts strings and glob pattern syntax + + .form-actions + = f.submit 'Save changes', class: 'btn btn-save' + = link_to 'Cancel', projects_path, class: 'btn' + - unless @project.new_record? + = link_to 'Remove Project', project_path(@project), method: :delete, data: { confirm: 'Project will be removed. Are you sure?' }, class: 'btn btn-danger pull-right' diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index bcc5832..c6896fd 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -1 +1,4 @@ -= render 'form' +- if @project.fork? + = render 'form_for_fork' +- else + = render 'form' diff --git a/db/migrate/20150429000160_add_parent_id_to_project.rb b/db/migrate/20150429000160_add_parent_id_to_project.rb new file mode 100644 index 0000000..9c728b4 --- /dev/null +++ b/db/migrate/20150429000160_add_parent_id_to_project.rb @@ -0,0 +1,5 @@ +class AddParentIdToProject < ActiveRecord::Migration + def change + add_column :projects, :parent_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index f16ae4c..77cceaa 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150417000045) do +ActiveRecord::Schema.define(version: 20150429000160) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -100,6 +100,7 @@ ActiveRecord::Schema.define(version: 20150417000045) do t.string "skip_refs" t.string "coverage_regex" t.boolean "shared_runners_enabled", default: false + t.integer "parent_id" end create_table "runner_projects", force: true do |t| |