Add timeout to crew highline prompts with defaults (#10498)

* Add timeout to agree_with_default functions.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add more timeouts.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
This commit is contained in:
Satadru Pramanik, DO, MPH, MEng
2024-09-19 15:59:11 -04:00
committed by GitHub
parent 437dacb243
commit b77cb15fdf
3 changed files with 31 additions and 15 deletions

View File

@@ -3,7 +3,7 @@
require 'etc'
OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0'
CREW_VERSION ||= '1.52.5' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
CREW_VERSION ||= '1.52.6' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
# Kernel architecture.
KERN_ARCH ||= Etc.uname[:machine]
@@ -107,6 +107,8 @@ CREW_NPROC ||= \
end
# Set following as boolean if environment variables exist.
# Timeout for agree questions in package.rb:
CREW_AGREE_TIMEOUT_SECONDS ||= ENV.fetch('CREW_AGREE_TIMEOUT_SECONDS', 10) unless defined?(CREW_AGREE_TIMEOUT_SECONDS)
CREW_CACHE_ENABLED ||= ENV.fetch('CREW_CACHE_ENABLED', false) unless defined?(CREW_CACHE_ENABLED)
CREW_CONFLICTS_ONLY_ADVISORY ||= ENV.fetch('CREW_CONFLICTS_ONLY_ADVISORY', false) unless defined?(CREW_CONFLICTS_ONLY_ADVISORY)
# or use conflicts_ok

View File

@@ -25,6 +25,7 @@ def require_gem(gem_name_and_require = nil, require_override = nil)
require requires
end
require_gem 'highline'
require_gem 'timeout'
def agree_with_default(yes_or_no_question_msg, character = nil, default:)
yes_or_no_question = yes_or_no_question_msg.lightpurple
@@ -67,6 +68,22 @@ class Package
attr_accessor :build_from_source, :cached_build, :in_build, :in_install, :in_upgrade, :name
end
def self.agree_default_no(message = nil)
Timeout.timeout(CREW_AGREE_TIMEOUT_SECONDS) do
return agree_with_default("#{message} (yes/NO)?", true, default: 'n')
end
rescue Timeout::Error
return true
end
def self.agree_default_yes(message = nil)
Timeout.timeout(CREW_AGREE_TIMEOUT_SECONDS) do
return agree_with_default("#{message} (YES/no)?", true, default: 'y')
end
rescue Timeout::Error
return true
end
def self.agree_to_remove(config_object = nil)
if File.file? config_object
identifier = 'file'
@@ -75,22 +92,14 @@ class Package
else
abort "Cannot identify #{config_object}.".lightred
end
if agree_with_default("Would you like to remove the config #{identifier}: #{config_object} (YES/no)?", true, default: 'y')
if agree_default_no("Would you like to remove the config #{identifier}: #{config_object}")
puts "#{config_object} saved.".lightgreen
else
FileUtils.rm_rf config_object
puts "#{config_object} removed.".lightgreen
else
puts "#{config_object} saved.".lightgreen
end
end
def self.agree_default_no(message = nil)
return agree_with_default("#{message} (yes/NO)?", true, default: 'n')
end
def self.agree_default_yes(message = nil)
return agree_with_default("#{message} (YES/no)?", true, default: 'y')
end
def self.load_package(pkg_file)
# self.load_package: load a package under 'Package' class scope
#

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env ruby
# build_updated_packages version 1.1 (for Chromebrew)
# build_updated_packages version 1.2 (for Chromebrew)
# This updates the versions in python pip packages by calling
# tools/update_python_pip_packages.rb, checks for updated ruby packages
# by calling tools/update_ruby_gem_packages.rb, and then checks if any
@@ -36,6 +36,7 @@ def require_gem(gem_name_and_require = nil, require_override = nil)
require requires
end
require_gem 'highline'
require_gem 'timeout'
# The following is from lib/package_helpers.rb
def property(*properties)
@@ -112,8 +113,12 @@ def agree_with_default(yes_or_no_question_msg, character = nil, default:)
end
end
def agree_default_yes(message = nil)
return agree_with_default("#{message} (YES/no)?", true, default: 'y')
def self.agree_default_yes(message = nil)
Timeout.timeout(CREW_AGREE_TIMEOUT_SECONDS) do
return agree_with_default("#{message} (YES/no)?", true, default: 'y')
end
rescue Timeout::Error
return true
end
# Get all boolean properties from package.rb