Commit 93a4f621 authored by Jean-Philippe Lang's avatar Jean-Philippe Lang Committed by Eric Davis

Prevent SystemStackError on Issue#all_dependent_issues with mutiple circular dependencies (#7320).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5104 e93f8b46-1217-0410-a6f0-8f06a7374b81
parent 43868845
...@@ -455,11 +455,11 @@ class Issue < ActiveRecord::Base ...@@ -455,11 +455,11 @@ class Issue < ActiveRecord::Base
(relations_from + relations_to).sort (relations_from + relations_to).sort
end end
def all_dependent_issues(except=nil) def all_dependent_issues(except=[])
except ||= self except << self
dependencies = [] dependencies = []
relations_from.each do |relation| relations_from.each do |relation|
if relation.issue_to && relation.issue_to != except if relation.issue_to && !except.include?(relation.issue_to)
dependencies << relation.issue_to dependencies << relation.issue_to
dependencies += relation.issue_to.all_dependent_issues(except) dependencies += relation.issue_to.all_dependent_issues(except)
end end
......
...@@ -686,6 +686,18 @@ class IssueTest < ActiveSupport::TestCase ...@@ -686,6 +686,18 @@ class IssueTest < ActiveSupport::TestCase
assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort
end end
def test_all_dependent_issues_with_persistent_multiple_circular_dependencies
IssueRelation.delete_all
assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_RELATES)
assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_RELATES)
assert IssueRelation.create!(:issue_from => Issue.find(3), :issue_to => Issue.find(8), :relation_type => IssueRelation::TYPE_RELATES)
# Validation skipping
assert IssueRelation.new(:issue_from => Issue.find(8), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_RELATES).save(false)
assert IssueRelation.new(:issue_from => Issue.find(3), :issue_to => Issue.find(1), :relation_type => IssueRelation::TYPE_RELATES).save(false)
assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
end
context "#done_ratio" do context "#done_ratio" do
setup do setup do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment