Commit 1d2c83cf authored by Pedro Pombeiro's avatar Pedro Pombeiro

Address MR review comments

parent 2a61ddc6
...@@ -13,27 +13,24 @@ module Gitlab ...@@ -13,27 +13,24 @@ module Gitlab
end end
def valid? def valid?
return @valid unless @valid.nil? strong_memoize(:valid) do
errors.nil?
@valid = check_errors.nil? end
end end
# check_errors sorts an array of variables, ignoring unknown variable references, # errors sorts an array of variables, ignoring unknown variable references,
# and returning an error string if a circular variable reference is found # and returning an error string if a circular variable reference is found
def check_errors def errors
return if Feature.disabled?(:variable_inside_variable) return if Feature.disabled?(:variable_inside_variable)
message = nil strong_memoize(:errors) do
# Check for cyclic dependencies and build error message in that case
# Check for cyclic dependencies and build error message in that case errors = each_strongly_connected_component.filter_map do |component|
each_strongly_connected_component do |component| "#{component.map { |v| v[:key] }.inspect}" if component.size > 1
if component.size > 1
message = "circular variable reference detected: #{component.map { |v| v[:key] }.inspect}"
break
end end
end
message "circular variable reference detected: #{errors.join(', ')}" if errors.any?
end
end end
# sort sorts an array of variables, ignoring unknown variable references. # sort sorts an array of variables, ignoring unknown variable references.
...@@ -41,14 +38,16 @@ module Gitlab ...@@ -41,14 +38,16 @@ module Gitlab
def sort def sort
return @variables if Feature.disabled?(:variable_inside_variable) return @variables if Feature.disabled?(:variable_inside_variable)
clear_memoization(:valid)
begin begin
# Perform a topological sort # Perform a topological sort
variables = tsort variables = tsort
@valid = true valid = true
rescue TSort::Cyclic rescue TSort::Cyclic
variables = @variables variables = @variables
@valid = false valid = false
end end
strong_memoize(:valid) { valid }
variables variables
end end
...@@ -64,7 +63,7 @@ module Gitlab ...@@ -64,7 +63,7 @@ module Gitlab
end end
def input_vars def input_vars
strong_memoize(:inclusion) do strong_memoize(:input_vars) do
@variables.index_by { |env| env.fetch(:key) } @variables.index_by { |env| env.fetch(:key) }
end end
end end
......
...@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do ...@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do
stub_feature_flags(variable_inside_variable: variable_inside_variable_enabled) stub_feature_flags(variable_inside_variable: variable_inside_variable_enabled)
end end
describe '#check_errors' do describe '#errors' do
context 'when FF :variable_inside_variable is disabled' do context 'when FF :variable_inside_variable is disabled' do
let(:variable_inside_variable_enabled) { false } let(:variable_inside_variable_enabled) { false }
...@@ -60,7 +60,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do ...@@ -60,7 +60,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do
subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables) } subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables) }
it 'does not report error' do it 'does not report error' do
expect(subject.check_errors).to eq(nil) expect(subject.errors).to eq(nil)
end end
it 'valid? reports true' do it 'valid? reports true' do
...@@ -104,8 +104,8 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do ...@@ -104,8 +104,8 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sorted do
with_them do with_them do
subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables) } subject { Gitlab::Ci::Variables::Collection::Sorted.new(variables) }
it 'check_errors matches expected validation result' do it 'errors matches expected validation result' do
expect(subject.check_errors).to eq(validation_result) expect(subject.errors).to eq(validation_result)
end end
it 'valid? matches expected validation result' do it 'valid? matches expected validation result' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment