From 8212dfcf14c63c006b9e1c37595f3d62eab052cf Mon Sep 17 00:00:00 2001
From: "Mark J. Titorenko" <mark@titorenko.net>
Date: Thu, 29 Nov 2018 18:36:20 +0000
Subject: Do nothing when the same block is included again.

If the same block is included multiple times, we no longer raise an exception
or overwrite the included block instance variable.

Fixes #14802.

[Mark J. Titorenko + Vlad Bokov]
---
 activesupport/CHANGELOG.md                          |  4 ++++
 activesupport/lib/active_support/concern.rb         | 10 +++++++---
 activesupport/test/concern_test.rb                  |  8 ++++++++
 activesupport/test/fixtures/concern/some_concern.rb | 11 +++++++++++
 4 files changed, 30 insertions(+), 3 deletions(-)
 create mode 100644 activesupport/test/fixtures/concern/some_concern.rb

(limited to 'activesupport')

diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md
index 98d232da33..ba8aaf47f9 100644
--- a/activesupport/CHANGELOG.md
+++ b/activesupport/CHANGELOG.md
@@ -1,3 +1,7 @@
+*   If the same block is `included` multiple times for a Concern, an exception is no longer raised.
+
+    *Mark J. Titorenko*, *Vlad Bokov*
+
 *   Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
     would not act as alias for `#symbolize_keys`.
 
diff --git a/activesupport/lib/active_support/concern.rb b/activesupport/lib/active_support/concern.rb
index b0a0d845e5..5d356a0ab6 100644
--- a/activesupport/lib/active_support/concern.rb
+++ b/activesupport/lib/active_support/concern.rb
@@ -125,9 +125,13 @@ module ActiveSupport
 
     def included(base = nil, &block)
       if base.nil?
-        raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block)
-
-        @_included_block = block
+        if instance_variable_defined?(:@_included_block)
+          if @_included_block.source_location != block.source_location
+            raise MultipleIncludedBlocks
+          end
+        else
+          @_included_block = block
+        end
       else
         super
       end
diff --git a/activesupport/test/concern_test.rb b/activesupport/test/concern_test.rb
index 98d8f3ee0d..4b3cfcd1d2 100644
--- a/activesupport/test/concern_test.rb
+++ b/activesupport/test/concern_test.rb
@@ -128,4 +128,12 @@ class ConcernTest < ActiveSupport::TestCase
       end
     end
   end
+
+  def test_no_raise_on_same_included_call
+    assert_nothing_raised do
+      2.times do
+        load File.expand_path("../fixtures/concern/some_concern.rb", __FILE__)
+      end
+    end
+  end
 end
diff --git a/activesupport/test/fixtures/concern/some_concern.rb b/activesupport/test/fixtures/concern/some_concern.rb
new file mode 100644
index 0000000000..87f660a81e
--- /dev/null
+++ b/activesupport/test/fixtures/concern/some_concern.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require "active_support/concern"
+
+module SomeConcern
+  extend ActiveSupport::Concern
+
+  included do
+    # shouldn't raise when module is loaded more than once
+  end
+end
-- 
cgit v1.2.3