diff options
Diffstat (limited to 'scripts/used-feature-flags')
-rwxr-xr-x | scripts/used-feature-flags | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/scripts/used-feature-flags b/scripts/used-feature-flags deleted file mode 100755 index 74180d02a91..00000000000 --- a/scripts/used-feature-flags +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require 'set' -require 'fileutils' -require_relative '../lib/gitlab_edition' - -class String - def red - "\e[31m#{self}\e[0m" - end - - def yellow - "\e[33m#{self}\e[0m" - end - - def green - "\e[32m#{self}\e[0m" - end - - def bold - "\e[1m#{self}\e[0m" - end -end - -flags_paths = [ - 'config/feature_flags/**/*.yml' -] - -# For EE additionally process `ee/` feature flags -if GitlabEdition.ee? - flags_paths << 'ee/config/feature_flags/**/*.yml' - - # Geo feature flags are constructed dynamically and there's no explicit checks in the codebase so we mark all - # the replicators' derived feature flags as used. - # See https://gitlab.com/gitlab-org/gitlab/-/blob/54e802e8fe76b6f93656d75ef9b566bf57b60f41/ee/lib/gitlab/geo/replicator.rb#L183-185 - Dir.glob('ee/app/replicators/geo/*_replicator.rb').each_with_object(Set.new) do |path, memo| - replicator_name = File.basename(path, '.rb') - feature_flag_name = "geo_#{replicator_name.delete_suffix('_replicator')}_replication" - - FileUtils.touch(File.join('tmp', 'feature_flags', "#{feature_flag_name}.used")) - end -end - -# For JH additionally process `jh/` feature flags -if GitlabEdition.jh? - flags_paths << 'jh/config/feature_flags/**/*.yml' - - Dir.glob('jh/app/replicators/geo/*_replicator.rb').each_with_object(Set.new) do |path, memo| - replicator_name = File.basename(path, '.rb') - feature_flag_name = "geo_#{replicator_name.delete_suffix('_replicator')}_replication" - - FileUtils.touch(File.join('tmp', 'feature_flags', "#{feature_flag_name}.used")) - end -end - -all_flags = {} -additional_flags = Set.new - -# Iterate all defined feature flags -# to discover which were used -flags_paths.each do |flags_path| - puts flags_path - Dir.glob(flags_path).each do |path| - feature_flag_name = File.basename(path, '.yml') - - # TODO: we need a better way of tracking use of Gitaly FF across Gitaly and GitLab - if feature_flag_name.start_with?('gitaly_') - puts "Skipping the #{feature_flag_name} feature flag since it starts with 'gitaly_'." - next - end - - all_flags[feature_flag_name] = File.exist?(File.join('tmp', 'feature_flags', feature_flag_name + '.used')) - end -end - -# Iterate all used feature flags -# to discover which flags are undefined -Dir.glob('tmp/feature_flags/*.used').each do |path| - feature_flag_name = File.basename(path, '.used') - - additional_flags.add(feature_flag_name) unless all_flags[feature_flag_name] -end - -used_flags = all_flags.select { |name, used| used } -unused_flags = all_flags.reject { |name, used| used } - -puts "=========================================".green.bold -puts "Feature Flags usage summary:".green.bold -puts - -puts "- #{all_flags.count + additional_flags.count} was found" -puts "- #{unused_flags.count} appear(s) to be UNUSED".yellow -puts "- #{additional_flags.count} appear(s) to be unknown".yellow -puts "- #{used_flags.count} appear(s) to be used".green -puts - -if additional_flags.count > 0 - puts "==================================================".green.bold - puts "There are feature flags that appear to be unknown".yellow - puts - puts "They appear to be used by CI, but we do lack their YAML definition".yellow - puts "This is likely expected, so feel free to ignore that list:".yellow - puts - additional_flags.sort.each do |name| - puts "- #{name}".yellow - end - puts -end - -if unused_flags.count > 0 - puts "========================================".green.bold - puts "These feature flags appear to be UNUSED".red.bold - puts - puts "If they are really no longer needed REMOVE their .yml definition".red - puts "If they are needed you need to ENSURE that their usage is covered with specs to continue.".red - puts "Feature flag usage is detected via Rubocop, which is unable to resolve dynamic feature flag usage,".red.bold - puts "interpolated strings however are optimistically matched. For more details consult test suite:".red - puts "https://gitlab.com/gitlab-org/gitlab/-/blob/69cb5d36db95881b495966c95655672cfb816f62/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb".red - puts - unused_flags.keys.sort.each do |name| - puts "- #{name}".yellow - end - puts - puts "Feature flag usage check failed.".red.bold - exit(1) -end - -puts "Everything is fine here!".green -puts |