From 537cd66d7e4237f0df6db88b3225327c8e4140c5 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 09:28:17 -0800 Subject: [PATCH 1/3] Add gitlab internal issue tracker service. --- app/controllers/application_controller.rb | 2 +- .../projects/services_controller.rb | 5 +--- app/models/project.rb | 24 ++++++++++++++----- .../gitlab_issue_tracker_service.rb | 13 ++++++++++ .../project_services/issue_tracker_service.rb | 4 ++++ 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 app/models/project_services/gitlab_issue_tracker_service.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ad13a0ac3e..36e1370676 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -181,7 +181,7 @@ class ApplicationController < ActionController::Base end def add_gon_variables - gon.default_issues_tracker = Project.issues_tracker.default_value + gon.default_issues_tracker = Project.new.default_issue_tracker.to_param gon.api_version = API::API.version gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 09bccb4bf8..5dda869a15 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -9,7 +9,7 @@ class Projects::ServicesController < Projects::ApplicationController def index @project.build_missing_services - @services = @project.services.reload + @services = @project.services.where.not(type: 'GitlabIssueTrackerService').reload end def edit @@ -17,9 +17,6 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) - if @service.activated? && @service.issue_tracker? - @project.update_attributes(issues_tracker: @service.to_param) - end redirect_to edit_project_service_path(@project, @service.to_param), notice: 'Successfully updated.' else diff --git a/app/models/project.rb b/app/models/project.rb index 12751bb77e..9e31c019fd 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -77,6 +77,7 @@ class Project < ActiveRecord::Base has_one :jira_service, dependent: :destroy has_one :redmine_service, dependent: :destroy has_one :custom_issue_tracker_service, dependent: :destroy + has_one :gitlab_issue_tracker_service, dependent: :destroy has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" @@ -149,8 +150,6 @@ class Project < ActiveRecord::Base scope :public_and_internal_only, -> { where(visibility_level: Project.public_and_internal_levels) } scope :non_archived, -> { where(archived: false) } - enumerize :issues_tracker, in: (Service.issue_tracker_service_list).append(:gitlab), default: :gitlab - state_machine :import_status, initial: :none do event :import_start do transition [:none, :finished] => :started @@ -317,19 +316,32 @@ class Project < ActiveRecord::Base end end + def default_issue_tracker + unless gitlab_issue_tracker_service + create_gitlab_issue_tracker_service + end + + gitlab_issue_tracker_service + end + + def issues_tracker + if external_issue_tracker + external_issue_tracker + else + default_issue_tracker + end + end + def default_issues_tracker? if external_issue_tracker false else - unless self.issues_tracker == Project.issues_tracker.default_value - self.update_attributes(issues_tracker: Project.issues_tracker.default_value) - end true end end def external_issues_trackers - services.select { |service| service.issue_tracker? } + services.select(&:issue_tracker?).reject(&:default?) end def external_issue_tracker diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb new file mode 100644 index 0000000000..46649a7475 --- /dev/null +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -0,0 +1,13 @@ +class GitlabIssueTrackerService < IssueTrackerService + + prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + + + def default? + true + end + + def to_param + 'gitlab' + end +end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index fc7b2fe5ac..810ecbe46f 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -6,6 +6,10 @@ class IssueTrackerService < Service :issue_tracker end + def default? + false + end + def project_url # implement inside child end From c6c7552e41cba12ca84238bd466d522aa1712220 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 13:19:32 -0800 Subject: [PATCH 2/3] Build the urls inside of the service. --- app/helpers/issues_helper.rb | 19 +++---------------- .../gitlab_issue_tracker_service.rb | 14 +++++++++++++- .../project_services/issue_tracker_service.rb | 4 ++++ spec/helpers/gitlab_markdown_helper_spec.rb | 1 + 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 2bf430f914..9fe183e6e2 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -16,32 +16,19 @@ module IssuesHelper def url_for_project_issues(project = @project) return '' if project.nil? - if project.default_issues_tracker? - project_issues_path(project) - else - project.external_issue_tracker.project_url - end + project.issues_tracker.project_url end def url_for_new_issue(project = @project) return '' if project.nil? - if project.default_issues_tracker? - url = new_project_issue_path project_id: project - else - project.external_issue_tracker.new_issue_url - end + project.issues_tracker.new_issue_url end def url_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.default_issues_tracker? - url = project_issue_url project_id: project, id: issue_iid - else - url = project.external_issue_tracker.issues_url - url.gsub(':id', issue_iid.to_s) - end + project.issues_tracker.issue_url(issue_iid) end def title_for_issue(issue_iid, project = @project) diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 46649a7475..8e548a6d63 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -1,5 +1,5 @@ class GitlabIssueTrackerService < IssueTrackerService - + include Rails.application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url @@ -10,4 +10,16 @@ class GitlabIssueTrackerService < IssueTrackerService def to_param 'gitlab' end + + def project_url + project_issues_path(project) + end + + def new_issue_url + new_project_issue_path project_id: project + end + + def issue_url(iid) + "#{Gitlab.config.gitlab.url}#{project_issue_path project_id: project, id: iid}" + end end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 810ecbe46f..632f053d17 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -22,6 +22,10 @@ class IssueTrackerService < Service # implement inside child end + def issue_url(iid) + self.issues_url.gsub(':id', iid.to_s) + end + def fields [ { type: 'text', name: 'description', placeholder: description }, diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb index 5c9eea956f..d633287b2a 100644 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ b/spec/helpers/gitlab_markdown_helper_spec.rb @@ -23,6 +23,7 @@ describe GitlabMarkdownHelper do @project = project @ref = 'markdown' @repository = project.repository + @request.host = Gitlab.config.gitlab.host end describe "#gfm" do From 68f7302474768351abf12767c7741823f56f35cd Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 14:25:55 -0800 Subject: [PATCH 3/3] Add a scope for visible services, code styling changes for easier readability. --- app/controllers/projects/services_controller.rb | 2 +- app/models/project.rb | 6 +----- app/models/project_services/gitlab_issue_tracker_service.rb | 2 +- app/models/service.rb | 2 ++ 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 5dda869a15..5b35cc9041 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -9,7 +9,7 @@ class Projects::ServicesController < Projects::ApplicationController def index @project.build_missing_services - @services = @project.services.where.not(type: 'GitlabIssueTrackerService').reload + @services = @project.services.visible.reload end def edit diff --git a/app/models/project.rb b/app/models/project.rb index 9e31c019fd..b26c697a7b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -317,11 +317,7 @@ class Project < ActiveRecord::Base end def default_issue_tracker - unless gitlab_issue_tracker_service - create_gitlab_issue_tracker_service - end - - gitlab_issue_tracker_service + gitlab_issue_tracker_service ||= create_gitlab_issue_tracker_service end def issues_tracker diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 8e548a6d63..25f5f23bdf 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -20,6 +20,6 @@ class GitlabIssueTrackerService < IssueTrackerService end def issue_url(iid) - "#{Gitlab.config.gitlab.url}#{project_issue_path project_id: project, id: iid}" + "#{Gitlab.config.gitlab.url}#{project_issue_path(project_id: project, id: iid)}" end end diff --git a/app/models/service.rb b/app/models/service.rb index 4241947534..15948e63e4 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -26,6 +26,8 @@ class Service < ActiveRecord::Base validates :project_id, presence: true + scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') } + def activated? active end