summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/ci/config/extendable/collection.rb1
-rw-r--r--lib/gitlab/ci/config/extendable/entry.rb18
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/gitlab/ci/config/extendable/collection.rb b/lib/gitlab/ci/config/extendable/collection.rb
index 3a71e06e3e2..e59884439a2 100644
--- a/lib/gitlab/ci/config/extendable/collection.rb
+++ b/lib/gitlab/ci/config/extendable/collection.rb
@@ -6,6 +6,7 @@ module Gitlab
include Enumerable
ExtensionError = Class.new(StandardError)
+ CircularDependencyError = Class.new(ExtensionError)
def initialize(hash)
@hash = hash
diff --git a/lib/gitlab/ci/config/extendable/entry.rb b/lib/gitlab/ci/config/extendable/entry.rb
index 5844cb098b9..96b0bd1a2ce 100644
--- a/lib/gitlab/ci/config/extendable/entry.rb
+++ b/lib/gitlab/ci/config/extendable/entry.rb
@@ -5,9 +5,9 @@ module Gitlab
class Entry
attr_reader :key
- def initialize(key, hash, parent = nil)
+ def initialize(key, context, parent = nil)
@key = key
- @hash = hash
+ @context = context
@parent = parent
end
@@ -16,12 +16,12 @@ module Gitlab
end
def value
- @value ||= @hash.fetch(@key)
+ @value ||= @context.fetch(@key)
end
def base
Extendable::Entry
- .new(extends, @hash, self)
+ .new(extends, @context, self)
.extend!
end
@@ -33,9 +33,17 @@ module Gitlab
value.fetch(:extends).to_sym
end
+ def path
+ Array(@parent&.path).compact.push(key)
+ end
+
def extend!
+ if path.count(key) > 1
+ raise Extendable::Collection::CircularDependencyError
+ end
+
if extensible?
- @hash[key] = base.deep_merge(value)
+ @context[key] = base.deep_merge(value)
else
value
end