diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index f484ed8..1f3323d 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -117,6 +117,9 @@ class IssuesController < ApplicationController @changesets = @issue.changesets @changesets.reverse! if User.current.wants_comments_in_reverse_order? @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + @allowed_changesets = @issue.changesets.select do |changeset| + User.current.allowed_to?(:view_changesets, changeset.project) + end @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @priorities = IssuePriority.all @time_entry = TimeEntry.new diff --git a/app/models/changeset.rb b/app/models/changeset.rb index 336632a..ac45ff0 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -80,6 +80,11 @@ class Changeset < ActiveRecord::Base # status and optional done ratio applied fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id) done_ratio = Setting.commit_fix_done_ratio.blank? ? nil : Setting.commit_fix_done_ratio.to_i + if Setting.cross_project_commit_keywords? + issues_finder = Issue + else + issues_finder = repository.project.issues + end kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") return if kw_regexp.blank? @@ -90,13 +95,13 @@ class Changeset < ActiveRecord::Base # find any issue ID in the comments target_issue_ids = [] comments.scan(%r{([\s\(\[,-]|^)#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] } - referenced_issues += repository.project.issues.find_all_by_id(target_issue_ids) + referenced_issues += issues_finder.find_all_by_id(target_issue_ids) end comments.scan(Regexp.new("(#{kw_regexp})[\s:]+(([\s,;&]*#?\\d+)+)", Regexp::IGNORECASE)).each do |match| action = match[0] target_issue_ids = match[1].scan(/\d+/) - target_issues = repository.project.issues.find_all_by_id(target_issue_ids) + target_issues = issues_finder.find_all_by_id(target_issue_ids) if fix_status && fix_keywords.include?(action.downcase) # update status of issues logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug? diff --git a/app/views/issues/show.rhtml b/app/views/issues/show.rhtml index a7d5692..9ab8000 100644 --- a/app/views/issues/show.rhtml +++ b/app/views/issues/show.rhtml @@ -80,10 +80,10 @@ -<% if @changesets.any? && User.current.allowed_to?(:view_changesets, @project) %> +<% if @allowed_changesets.any? %>

<%=l(:label_associated_revisions)%>

-<%= render :partial => 'changesets', :locals => { :changesets => @changesets} %> +<%= render :partial => 'changesets', :locals => { :changesets => @allowed_changesets} %>
<% end %> diff --git a/app/views/settings/_repositories.rhtml b/app/views/settings/_repositories.rhtml index 4f07f05..fed48d0 100644 --- a/app/views/settings/_repositories.rhtml +++ b/app/views/settings/_repositories.rhtml @@ -11,6 +11,11 @@ <%= check_box_tag 'settings[sys_api_enabled]', 1, Setting.sys_api_enabled? %>

+

+<%= hidden_field_tag 'settings[cross_project_commit_keywords]', 0 %> +<%= check_box_tag 'settings[cross_project_commit_keywords]', 1, Setting.cross_project_commit_keywords? %> +

+

<% REDMINE_SUPPORTED_SCM.each do |scm| -%> <%= check_box_tag 'settings[enabled_scm][]', scm, Setting.enabled_scm.include?(scm) %> <%= scm %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 71e599a..d4ff9b8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -285,6 +285,7 @@ en: setting_default_projects_public: New projects are public by default setting_autofetch_changesets: Autofetch commits setting_sys_api_enabled: Enable WS for repository management + setting_cross_project_commit_keywords: Allow cross project references in commit messages setting_commit_ref_keywords: Referencing keywords setting_commit_fix_keywords: Fixing keywords setting_autologin: Autologin diff --git a/config/settings.yml b/config/settings.yml index e0950c5..0c13687 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -94,6 +94,8 @@ commit_fix_status_id: default: 0 commit_fix_done_ratio: default: 100 +cross_project_commit_keywords: + default: 0 # autologin duration in days # 0 means autologin is disabled autologin: diff --git a/test/unit/repository_test.rb b/test/unit/repository_test.rb index 6512c06..bc51a63 100644 --- a/test/unit/repository_test.rb +++ b/test/unit/repository_test.rb @@ -104,6 +104,9 @@ class RepositoryTest < ActiveSupport::TestCase # ignoring commits referencing an issue of another project assert_equal [], Issue.find(4).changesets + Setting.cross_project_commit_keywords = 1 + Repository.scan_changesets_for_issue_ids + assert_equal [103], Issue.find(4).changeset_ids end def test_for_changeset_comments_strip