Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-08-16 16:30:06 +0300
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-09-04 15:17:01 +0300
commit2c41fbb14821c8028e389c270d2f39380e5fbe04 (patch)
treedd7c4069b7cb05247bb605589388bc2a0320d305 /lib
parentef26622d62fe37371adf0d66c81f8428ad4bb1b6 (diff)
Detect circular dependenies in CI/CD `extends:` entry
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