summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValery Sizov <vsv2711@gmail.com>2015-04-29 16:59:28 +0300
committerValery Sizov <vsv2711@gmail.com>2015-04-29 18:26:12 +0300
commit4886b2d58436026fba7499a04ec7b6419c321c76 (patch)
treef34eca80cd12ac357f00bf0ce6505570daa6a905
parent3bbd2f55a299b31a702b7ae6aa2624e5116bc8e8 (diff)
downloadgitlab-ci-4886b2d58436026fba7499a04ec7b6419c321c76.tar.gz
Better support forks
-rw-r--r--app/controllers/application_controller.rb4
-rw-r--r--app/controllers/jobs_controller.rb1
-rw-r--r--app/controllers/projects_controller.rb6
-rw-r--r--app/models/project.rb5
-rw-r--r--app/services/create_project_service.rb7
-rw-r--r--app/views/jobs/_list.html.haml2
-rw-r--r--app/views/jobs/index.html.haml45
-rw-r--r--app/views/layouts/_nav_project.html.haml10
-rw-r--r--app/views/projects/_form_for_fork.html.haml47
-rw-r--r--app/views/projects/edit.html.haml5
-rw-r--r--db/migrate/20150429000160_add_parent_id_to_project.rb5
-rw-r--r--db/schema.rb3
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|