lib/gdk/command/update.rb (86 lines of code) (raw):

# frozen_string_literal: true require 'time' module GDK module Command # Handles `gdk update` command execution class Update < BaseCommand GdkNotFoundError = Class.new(StandardError) WEEK_IN_SECONDS = 7 * 24 * 60 * 60 def run(_args = []) success = update! success = run_rake(:reconfigure) if success && config.gdk.auto_reconfigure? if success Announcements.new.render_all GDK::Output.success('Successfully updated!') run_weekly_diagnostics else GDK::Output.error('Failed to update.', report_error: false) display_help_message end success rescue Support::Rake::TaskWithLogger::LoggerError => e e.print! false ensure check_gdk_available end private def update! GDK::Hooks.with_hooks(config.gdk.update_hooks, 'gdk update') do # Run `self-update` first to make sure Makefiles are up-to-date. # This ensures the next `make update` call works with the latest updates and instructions. if self_update? result = self_update! next false unless result end old_env = ENV.to_h ENV.merge! update_env success = run_rake('gdk:migrate') success = run_rake(:update) if success success ensure update_env.keys.map { |k| ENV.delete(k) } ENV.merge! old_env || {} end end def self_update! previous_revision = current_git_revision sh = GDK.make('self-update') return false unless sh.success? if previous_revision != current_git_revision Dir.chdir(config.gdk_root.to_s) ENV['GDK_SELF_UPDATE'] = '0' Kernel.exec 'gdk update' end true end def self_update? %w[1 yes true].include?(ENV.fetch('GDK_SELF_UPDATE', '1')) end def update_env { 'PG_AUTO_UPDATE' => '1', 'GDK_SKIP_MAKEFILE_TIMEIT' => '1' } end def current_git_revision Shellout.new(%w[git rev-parse HEAD], chdir: config.gdk_root).run end def check_gdk_available return if Utils.executable_exist_via_tooling_manager?('gdk') out.error('The `gdk` is no longer available after `gdk update`. This is unexpected, please report this in https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/2388.') GDK::Telemetry.capture_exception(GdkNotFoundError.new('`gdk` command is no longer available')) end def run_weekly_diagnostics return unless GDK::ReminderHelper.should_run_reminder?('diagnostics') # Empty for now. Add diagnostic checks here as needed. diagnostics = [] diagnostics.each do |diagnostic| next if diagnostic.success? GDK::Output.puts GDK::Output.warn('Upcoming change notice - Action required:') GDK::Output.divider GDK::Output.puts(diagnostic.detail.strip) GDK::Output.divider GDK::Output.info('We will send you a reminder in a week to help you prepare for this change.') end GDK::ReminderHelper.update_reminder_timestamp!('diagnostics') end end end end