##// END OF EJS Templates
Prevent SystemStackError on Issue#all_dependent_issues with circular dependency (#7320)....
Jean-Philippe Lang -
r4603:befd725b8b24
parent child
Show More
@@ -456,11 +456,14 class Issue < ActiveRecord::Base
456 (relations_from + relations_to).sort
456 (relations_from + relations_to).sort
457 end
457 end
458
458
459 def all_dependent_issues
459 def all_dependent_issues(except=nil)
460 except ||= self
460 dependencies = []
461 dependencies = []
461 relations_from.each do |relation|
462 relations_from.each do |relation|
462 dependencies << relation.issue_to
463 if relation.issue_to && relation.issue_to != except
463 dependencies += relation.issue_to.all_dependent_issues
464 dependencies << relation.issue_to
465 dependencies += relation.issue_to.all_dependent_issues(except)
466 end
464 end
467 end
465 dependencies
468 dependencies
466 end
469 end
@@ -618,6 +618,25 class IssueTest < ActiveSupport::TestCase
618 end
618 end
619 end
619 end
620
620
621 def test_all_dependent_issues
622 IssueRelation.delete_all
623 assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_PRECEDES)
624 assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_PRECEDES)
625 assert IssueRelation.create!(:issue_from => Issue.find(3), :issue_to => Issue.find(8), :relation_type => IssueRelation::TYPE_PRECEDES)
626
627 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
628 end
629
630 def test_all_dependent_issues_with_persistent_circular_dependency
631 IssueRelation.delete_all
632 assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_PRECEDES)
633 assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_PRECEDES)
634 # Validation skipping
635 assert IssueRelation.new(:issue_from => Issue.find(3), :issue_to => Issue.find(1), :relation_type => IssueRelation::TYPE_PRECEDES).save(false)
636
637 assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort
638 end
639
621 context "#done_ratio" do
640 context "#done_ratio" do
622 setup do
641 setup do
623 @issue = Issue.find(1)
642 @issue = Issue.find(1)
General Comments 0
You need to be logged in to leave comments. Login now