lib/gdk.rb (80 lines of code) (raw):

# frozen_string_literal: true # GitLab Development Kit CLI parser / executor # # This file is loaded by the 'gdk' command in the gem. This file is NOT # part of the gitlab-development-kit gem so that we can iterate faster. $LOAD_PATH.unshift(__dir__) require 'pathname' require 'securerandom' require 'zeitwerk' require_relative 'gdk_src' loader = Zeitwerk::Loader.new loader.tag = File.basename(__FILE__, '.rb') loader.inflector.inflect( { 'gdk' => 'GDK', 'http_helper' => 'HTTPHelper', 'open_ldap' => 'OpenLDAP', 'test_url' => 'TestURL' }) loader.push_dir(__dir__) loader.setup # GitLab Development Kit module GDK StandardErrorWithMessage = Class.new(StandardError) HookCommandError = Class.new(StandardError) # requires `gitlab-development-kit` gem to be at least this version REQUIRED_GEM_VERSION = '0.2.18' PROGNAME = 'gdk' MAKE = RUBY_PLATFORM.include?('bsd') ? 'gmake' : 'make' # Entry point for the GDK binary. # # Do not remove because we need to support that use case where a new GDK binary # calls older GDK code. def self.main @pwd = Dir.pwd Dir.chdir(GDK.root) preload_team_member_info set_mac_env_vars setup_rake Command.run(ARGV) ensure Dir.chdir(@pwd) @pwd = nil end def self.pwd @pwd || Dir.pwd end def self.setup_rake require 'rake' Rake.application.init('rake', %W[--rakefile #{GDK.root}/Rakefile]) Rake.application.load_rakefile end def self.config @config ||= GDK::Config.load_from_file end # Return the path to the GDK base path # # @return [Pathname] path to GDK base directory def self.root GDK::SRC end def self.make(*targets, env: {}) sh = Shellout.new(MAKE, targets, env: env) sh.stream sh end def self.set_mac_env_vars # This is a temporary work around to facilitate issues with icu4c & strchnul errors in macOS 15.4 update # See: # https://gitlab.com/gitlab-org/gitlab-development-kit/-/work_items/2522 # https://gitlab.com/gitlab-org/gitlab-development-kit/-/work_items/2556 # https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/2558 return unless RUBY_PLATFORM.include?('darwin') unless Utils.executable_exist?('brew') GDK::Output.error "ERROR: Homebrew is required but cannot be found." exit(-1) end icu4c_prefix = `brew --prefix icu4c`.strip.split('@').first || '' openssl_prefix = `brew --prefix openssl`.strip.split('@').first || '' if icu4c_prefix.empty? GDK::Output.error "ERROR: icu4c is required but cannot be found." exit(-1) end if openssl_prefix.empty? GDK::Output.error "ERROR: openssl is required but cannot be found." exit(-1) end macos_version = `sw_vers --productVersion`.chomp is_atleast_15_3 = Gem::Version.new(macos_version) >= Gem::Version.new('15.3') ENV['PKG_CONFIG_PATH'] = [ENV.fetch('PKG_CONFIG_PATH', nil), "#{openssl_prefix}/lib/pkgconfig", "#{icu4c_prefix}/lib/pkgconfig"].compact.join(':') ENV['LDFLAGS'] = [ENV.fetch('LDFLAGS', nil), "-L#{icu4c_prefix}/lib"].compact.join(' ') ENV['CPPFLAGS'] = [ENV.fetch('CPPFLAGS', nil), "-I#{icu4c_prefix}/include"].compact.join(' ') ENV['BUNDLE_BUILD__PG_QUERY'] = [ENV.fetch('BUNDLE_BUILD__PG_QUERY', nil), "--with-cflags=-DHAVE_STRCHRNUL"].compact.join(' ') if is_atleast_15_3 ENV['MACOSX_DEPLOYMENT_TARGET'] = macos_version end # Speeds up telemetry by memoizing team_member? async at GDK startup def self.preload_team_member_info Thread.new { GDK::Telemetry.team_member? } end end