diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-08-16 15:30:06 +0200 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-09-04 14:17:01 +0200 |
commit | 2c41fbb14821c8028e389c270d2f39380e5fbe04 (patch) | |
tree | dd7c4069b7cb05247bb605589388bc2a0320d305 /lib | |
parent | ef26622d62fe37371adf0d66c81f8428ad4bb1b6 (diff) | |
download | gitlab-ce-2c41fbb14821c8028e389c270d2f39380e5fbe04.tar.gz |
Detect circular dependenies in CI/CD `extends:` entry
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 |