diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/ci/config/extendable/collection.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/ci/config/extendable/entry.rb | 18 |
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 |