Enable additional temporarily disabled cops (#9394)

This commit is contained in:
Maximilian Downey Twiss
2024-03-02 04:24:31 +11:00
committed by GitHub
parent fe6e9c4003
commit eddca7e0e8
19 changed files with 334 additions and 438 deletions

View File

@@ -20,101 +20,15 @@ AllCops:
Security/Eval:
Enabled: false
Naming/ClassAndModuleCamelCase:
# Disable this cop for every file in packages/
Enabled: false
Naming/MethodParameterName:
Enabled: false
Naming/MethodName:
Enabled: false
Naming/VariableName:
Enabled: false
Naming/PredicateName:
Enabled: false
Metrics/AbcSize:
Enabled: false
Metrics/MethodLength:
Enabled: false
Metrics/ModuleLength:
Enabled: false
Metrics/BlockLength:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false
Metrics/BlockNesting:
Enabled: false
Metrics/ParameterLists:
Enabled: false
Layout/LineContinuationLeadingSpace:
Enabled: false
Lint/ConstantDefinitionInBlock:
Enabled: false
Lint/EmptyBlock:
Enabled: false
Lint/ImplicitStringConcatenation:
Enabled: false
Lint/UnreachableCode:
Enabled: false
Lint/DuplicateBranch:
Enabled: false
Lint/AssignmentInCondition:
Enabled: false
Lint/LiteralAsCondition:
Enabled: false
Lint/UnderscorePrefixedVariableName:
Enabled: false
Lint/EmptyWhen:
Enabled: false
Lint/UselessAssignment:
Enabled: false
Lint/MissingSuper:
Enabled: false
Lint/ShadowingOuterLocalVariable:
Enabled: false
Lint/SuppressedException:
Enabled: false
Lint/RedundantSafeNavigation:
Enabled: false
Layout/LineLength:
AllowedPatterns:
- '#'
- 'description'
# When this is reenabled, keep the AllowedPatterns configuration
Enabled: false
Layout/HashAlignment:
EnforcedHashRocketStyle:
- separator
@@ -141,6 +55,9 @@ Layout/IndentationStyle:
Layout/LeadingCommentSpace:
Enabled: false
Layout/LineLength:
Enabled: false
Layout/SpaceInsideBlockBraces:
Enabled: false
@@ -150,6 +67,9 @@ Layout/SpaceInsideParens:
Layout/TrailingEmptyLines:
Enabled: false
Lint/LiteralAsCondition:
Enabled: false
Style/RedundantReturn:
Enabled: false
@@ -195,12 +115,25 @@ Style/RedundantLineContinuation:
Style/RedundantStringEscape:
Enabled: false
Metrics:
Enabled: false
Naming/AccessorMethodName:
Enabled: false
Naming/BlockParameterName:
Enabled: false
Naming/ClassAndModuleCamelCase:
Exclude:
- 'packages/*'
Naming/VariableName:
EnforcedStyle: snake_case
# Allow variable names which are in all caps (with optional numbers and underscores)
AllowedPatterns:
- '^@?[A-Z0-9_]+$'
Naming/VariableNumber:
Enabled: false

366
bin/crew
View File

@@ -153,9 +153,6 @@ class ExitMessage
end
at_exit do
unless $ERROR_INFO.nil? || ($ERROR_INFO.is_a?(SystemExit) && $ERROR_INFO.success?)
code = $ERROR_INFO.is_a?(SystemExit) ? $ERROR_INFO.status : 1
end
# Print exit messages.
ExitMessage.print
end
@@ -169,12 +166,12 @@ def load_json
@device.transform_values! {|val| val.is_a?(String) ? val.to_sym : val }
end
def print_package(pkgPath, extra = false)
pkgName = File.basename pkgPath, '.rb'
def print_package(pkg_path, extra = false)
pkg_name = File.basename pkg_path, '.rb'
begin
set_package pkgName, pkgPath
set_package pkg_name, pkg_path
rescue StandardError => e
warn "Error with #{pkgName}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
warn "Error with #{pkg_name}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
end
print_current_package extra
end
@@ -207,9 +204,9 @@ def print_current_package(extra = false)
puts ''
end
def set_package(pkgName, pkgPath)
def set_package(pkg_name, pkg_path)
begin
@pkg = Package.load_package(pkgPath, pkgName)
@pkg = Package.load_package(pkg_path, pkg_name)
rescue SyntaxError => e
warn "#{e.class}: #{e.message}".red
end
@@ -225,18 +222,18 @@ end
def list_available
Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename|
pkgName = File.basename(filename, '.rb')
filelist = File.join(CREW_META_PATH, "#{pkgName}.filelist")
notInstalled = !File.file?(filelist)
pkg_name = File.basename(filename, '.rb')
filelist = File.join(CREW_META_PATH, "#{pkg_name}.filelist")
not_installed = !File.file?(filelist)
next unless notInstalled
next unless not_installed
begin
set_package pkgName, filename
set_package pkg_name, filename
rescue StandardError => e
puts "Error with #{pkgName}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
puts "Error with #{pkg_name}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
end
puts pkgName if @pkg.compatible?
puts pkg_name if @pkg.compatible?
end
end
@@ -264,17 +261,17 @@ end
def list_compatible(compat = true)
Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename|
pkgName = File.basename filename, '.rb'
if @device[:compatible_packages].any? { |elem| elem[:name] == pkgName }
pkg_name = File.basename filename, '.rb'
if @device[:compatible_packages].any? { |elem| elem[:name] == pkg_name }
if compat
if File.file? "#{CREW_META_PATH}/#{pkgName}.filelist"
puts pkgName.lightgreen
if File.file? "#{CREW_META_PATH}/#{pkg_name}.filelist"
puts pkg_name.lightgreen
else
puts pkgName
puts pkg_name
end
end
elsif !compat
puts pkgName.lightred
puts pkg_name.lightred
end
end
end
@@ -283,19 +280,19 @@ def generate_compatible
puts 'Generating compatible packages...'.orange if @opt_verbose
@device[:compatible_packages] = []
Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename|
pkgName = File.basename filename, '.rb'
pkg_name = File.basename filename, '.rb'
begin
set_package pkgName, filename
set_package pkg_name, filename
rescue StandardError => e
puts "Error with #{pkgName}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
puts "Error with #{pkg_name}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
end
puts "Checking #{pkgName} for compatibility.".orange if @opt_verbose
puts "Checking #{pkg_name} for compatibility.".orange if @opt_verbose
if @pkg.compatible?
# add to compatible packages
puts "Adding #{pkgName} #{@pkg.version} to compatible packages.".lightgreen if @opt_verbose
puts "Adding #{pkg_name} #{@pkg.version} to compatible packages.".lightgreen if @opt_verbose
@device[:compatible_packages].push(name: @pkg.name)
elsif @opt_verbose
puts "#{pkgName} is not a compatible package.".lightred
puts "#{pkg_name} is not a compatible package.".lightred
end
end
File.open(File.join(CREW_CONFIG_PATH, 'device.json'), 'w') do |file|
@@ -305,40 +302,40 @@ def generate_compatible
puts 'Generating compatible packages done.'.orange if @opt_verbose
end
def search(pkgName, silent = false)
pkgPath = File.join(CREW_PACKAGES_PATH, "#{pkgName}.rb")
def search(pkg_name, silent = false)
pkg_path = File.join(CREW_PACKAGES_PATH, "#{pkg_name}.rb")
begin
return set_package(pkgName, pkgPath) if File.file?(pkgPath)
return set_package(pkg_name, pkg_path) if File.file?(pkg_path)
rescue StandardError => e
puts "Error with #{pkgName}.rb: #{e}".lightred unless e.to_s.include?('uninitialized constant')
puts "Error with #{pkg_name}.rb: #{e}".lightred unless e.to_s.include?('uninitialized constant')
end
unless File.file?(pkgPath) && silent
unless File.file?(pkg_path) && silent
@pkg = nil
abort "Package #{pkgName} not found. 😞".lightred unless silent
abort "Package #{pkg_name} not found. 😞".lightred unless silent
return
end
end
def regexp_search(pkgPat)
re = Regexp.new(pkgPat, true)
def regexp_search(pkg_pat)
re = Regexp.new(pkg_pat, true)
results = Dir["#{CREW_PACKAGES_PATH}/*.rb"] \
.select { |f| File.basename(f, '.rb') =~ re } \
.each { |f| print_package(f, @opt_verbose) }
if results.empty?
Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |packagePath|
packageName = File.basename packagePath, '.rb'
Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |package_path|
package_name = File.basename package_path, '.rb'
begin
set_package packageName, packagePath
set_package package_name, package_path
rescue StandardError => e
puts "Error with #{pkgName}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
puts "Error with #{pkg_name}.rb: #{e}".red unless e.to_s.include?('uninitialized constant')
end
if @pkg.description =~ /#{pkgPat}/i
if @pkg.description =~ /#{pkg_pat}/i
print_current_package @opt_verbose
results.push(packageName)
results.push(package_name)
end
end
end
abort "Package #{pkgPat} not found. :(".lightred if results.empty?
abort "Package #{pkg_pat} not found. :(".lightred if results.empty?
end
def cache_build
@@ -384,9 +381,9 @@ def const(var = nil)
end
end
def files(pkgName)
local_filelist = File.join(CREW_META_PATH, "#{pkgName}.filelist")
manifest_filelist = File.join(CREW_LIB_PATH, "manifest/#{ARCH}/#{pkgName[0]}/#{pkgName}.filelist")
def files(pkg_name)
local_filelist = File.join(CREW_META_PATH, "#{pkg_name}.filelist")
manifest_filelist = File.join(CREW_LIB_PATH, "manifest/#{ARCH}/#{pkg_name[0]}/#{pkg_name}.filelist")
if File.exist?(local_filelist)
# search for local filelist first
@@ -396,7 +393,7 @@ def files(pkgName)
filelist_path = manifest_filelist
else
# package does not have any filelist available
warn "Package #{pkgName} is not installed. :(".lightred
warn "Package #{pkg_name} is not installed. :(".lightred
return false
end
@@ -419,7 +416,7 @@ end
def prop(silent = false)
props = []
pkg = Package.new
excluded_methods = %w[compatible is_binary is_source json_creatable autoload include const_defined class_variable_defined singleton_class method_defined public_method_defined private_method_defined protected_method_defined instance_variable_defined instance_of kind_of is_a frozen nil eql respond_to equal]
excluded_methods = %w[compatible binary source json_creatable autoload include const_defined class_variable_defined singleton_class method_defined public_method_defined private_method_defined protected_method_defined instance_variable_defined instance_of kind_of is_a frozen nil eql respond_to equal]
all_methods = pkg.class.methods.grep(/\?$/).to_s.gsub(/([?:,\[\]])/, '').split
all_methods.each do |method|
props.push(method) unless excluded_methods.include?(method)
@@ -432,25 +429,25 @@ def prop(silent = false)
end
end
def whatprovides(regexPat)
matchedList = `grep -R "#{regexPat}" #{CREW_LIB_PATH}/manifest/#{ARCH}`.lines(chomp: true).flat_map do |result|
filelist, matchedFile = result.split(':', 2)
pkgName = File.basename(filelist, '.filelist')
pkgNameStatus = pkgName
if @device[:compatible_packages].any? { |elem| elem[:name] == pkgName }
pkgNameStatus = pkgName.lightgreen if File.file? "#{CREW_META_PATH}/#{pkgName}.filelist"
def whatprovides(regex_pat)
matched_list = `grep -R "#{regex_pat}" #{CREW_LIB_PATH}/manifest/#{ARCH}`.lines(chomp: true).flat_map do |result|
filelist, matched_file = result.split(':', 2)
pkg_name = File.basename(filelist, '.filelist')
pkg_name_status = pkg_name
if @device[:compatible_packages].any? { |elem| elem[:name] == pkg_name }
pkg_name_status = pkg_name.lightgreen if File.file? "#{CREW_META_PATH}/#{pkg_name}.filelist"
else
pkgNameStatus = pkgName.lightred
pkg_name_status = pkg_name.lightred
end
"#{pkgNameStatus}: #{matchedFile}"
"#{pkg_name_status}: #{matched_file}"
end.sort
puts matchedList, "\nTotal found: #{matchedList.length}".lightgreen if matchedList.any?
puts matched_list, "\nTotal found: #{matched_list.length}".lightgreen if matched_list.any?
end
def update
abort "'crew update' is used to update crew itself. Use 'crew upgrade <package1> [<package2> ...]' to update specific packages.".orange if @pkgName
abort "'crew update' is used to update crew itself. Use 'crew upgrade <package1> [<package2> ...]' to update specific packages.".orange if @pkg_name
# update package lists
Dir.chdir(CREW_LIB_PATH) do
@@ -472,31 +469,31 @@ def update
# check for outdated installed packages
puts 'Checking for package updates...'
canBeUpdated = 0
can_be_updated = 0
@device[:installed_packages].each do |package|
search package[:name], true
unless @pkg
puts "Package file for #{package[:name]} not found. :(".lightred if @opt_verbose
next
end
differentVersion = (package[:version] != @pkg.version)
hasSha = !(@pkg.get_binary_sha256(@device[:architecture]).to_s.empty? || package[:binary_sha256].to_s.empty?)
differentSha = hasSha && package[:binary_sha256] != @pkg.get_binary_sha256(@device[:architecture])
different_version = (package[:version] != @pkg.version)
has_sha = !(@pkg.get_binary_sha256(@device[:architecture]).to_s.empty? || package[:binary_sha256].to_s.empty?)
different_sha = has_sha && package[:binary_sha256] != @pkg.get_binary_sha256(@device[:architecture])
canBeUpdated += 1 if differentVersion || differentSha
can_be_updated += 1 if different_version || different_sha
if differentVersion && !differentSha && hasSha
canBeUpdated -= 1
if different_version && !different_sha && has_sha
can_be_updated -= 1
puts "#{@pkg.name} has a version change but does not have updated binaries".yellow
elsif differentVersion
elsif different_version
puts "#{@pkg.name} could be updated from #{package[:version]} to #{@pkg.version}"
elsif !differentVersion && differentSha
elsif !different_version && different_sha
puts "#{@pkg.name} could be updated (rebuild)"
end
end
if canBeUpdated.positive?
puts "\n#{canBeUpdated} packages can be updated."
if can_be_updated.positive?
puts "\n#{can_be_updated} packages can be updated."
puts 'Run `crew upgrade` to update all packages or `crew upgrade <package1> [<package2> ...]` to update specific packages.'
else
puts 'Your software is up to date.'.lightgreen
@@ -504,42 +501,42 @@ def update
end
def upgrade(*pkgs, build_from_source: false)
check_update_avail = lambda do |pkgFile|
pkgName = File.basename(pkgFile, '.rb')
check_update_avail = lambda do |pkg_file|
pkg_name = File.basename(pkg_file, '.rb')
unless File.file?(pkgFile)
warn "Package file for installed package #{pkgName} is missing.".lightred
unless File.file?(pkg_file)
warn "Package file for installed package #{pkg_name} is missing.".lightred
return false
end
pkgs.each do
unless @device[:installed_packages].any? { |package| package[:name] == pkgName }
puts 'Package '.lightred + pkgName.orange + ' is not installed. 😔 You may try this: '.lightred + "crew install #{pkgName}".lightblue
unless @device[:installed_packages].any? { |package| package[:name] == pkg_name }
puts 'Package '.lightred + pkg_name.orange + ' is not installed. 😔 You may try this: '.lightred + "crew install #{pkg_name}".lightblue
return false
end
end
pkgVer_latest = Package.load_package(pkgFile, pkgName).version
pkgVer_installed = @device[:installed_packages].select { |pkg| pkg[:name] == pkgName } [0][:version]
pkgHash_latest = Package.load_package(pkgFile, pkgName).get_binary_sha256(@device[:architecture])
pkgHash_installed = @device[:installed_packages].select { |pkg| pkg[:name] == pkgName } [0][:binary_sha256]
pkg_ver_latest = Package.load_package(pkg_file, pkg_name).version
pkg_ver_installed = @device[:installed_packages].select { |pkg| pkg[:name] == pkg_name } [0][:version]
pkg_hash_latest = Package.load_package(pkg_file, pkg_name).get_binary_sha256(@device[:architecture])
pkg_hash_installed = @device[:installed_packages].select { |pkg| pkg[:name] == pkg_name } [0][:binary_sha256]
return pkgHash_latest != pkgHash_installed unless !pkgHash_installed || pkgHash_latest == ''
return pkgVer_latest != pkgVer_installed
return pkg_hash_latest != pkg_hash_installed unless !pkg_hash_installed || pkg_hash_latest == ''
return pkg_ver_latest != pkg_ver_installed
end
to_be_upgraded = []
if pkgs.any?
# check for specific package(s)
pkgs.each do |pkgName|
pkgFile = File.join(CREW_PACKAGES_PATH, "#{pkgName}.rb")
to_be_upgraded << pkgName if check_update_avail.call(pkgFile)
pkgs.each do |pkg_name|
pkg_file = File.join(CREW_PACKAGES_PATH, "#{pkg_name}.rb")
to_be_upgraded << pkg_name if check_update_avail.call(pkg_file)
end
else
# check for all packages if no package name provided
@device[:installed_packages].each do |pkg|
pkgFile = File.join(CREW_PACKAGES_PATH, "#{pkg[:name]}.rb")
to_be_upgraded << pkg[:name] if check_update_avail.call(pkgFile)
pkg_file = File.join(CREW_PACKAGES_PATH, "#{pkg[:name]}.rb")
to_be_upgraded << pkg[:name] if check_update_avail.call(pkg_file)
end
end
@@ -566,16 +563,16 @@ def upgrade(*pkgs, build_from_source: false)
end
# install new dependencies (if any)
to_be_upgraded.each do |pkgName|
search(pkgName)
to_be_upgraded.each do |pkg_name|
search(pkg_name)
resolve_dependencies
end
puts 'Updating packages...'
# upgrade packages
to_be_upgraded.each do |pkgName|
search(pkgName)
to_be_upgraded.each do |pkg_name|
search(pkg_name)
print_current_package
@pkg.build_from_source = (build_from_source || CREW_BUILD_FROM_SOURCE)
@@ -591,7 +588,7 @@ end
def download
url = @pkg.get_url(@device[:architecture])
source = @pkg.is_source?(@device[:architecture])
source = @pkg.source?(@device[:architecture])
uri = URI.parse url
filename = File.basename(uri.path)
@@ -832,7 +829,7 @@ def build_and_preconfigure(target_dir)
begin
@pkg.build
rescue StandardError => e
rescue StandardError
if CREW_CACHE_FAILED_BUILD
cache_build
abort 'There was a build error, caching build directory.'.lightred
@@ -1029,6 +1026,8 @@ def patchelf_set_need_paths(dir)
puts 'Patchelf is currently disabled during builds due to problems with upx.'.yellow
return
# Disable unreachable code check, as this is a temporary situation
# rubocop:disable Lint/UnreachableCode
Dir.chdir dir do
puts 'Running patchelf'.lightblue
abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf")
@@ -1079,6 +1078,7 @@ def patchelf_set_need_paths(dir)
system "patchelf --set-interpreter #{patchelf_interpreter} #{execfiletopatch}"
end
end
# rubocop:enable Lint/UnreachableCode
end
def strip_find_files(find_cmd, strip_option = '')
@@ -1225,12 +1225,10 @@ def install_package(pkgdir)
FileUtils.mv 'filelist', File.join(CREW_META_PATH, "#{@pkg.name}.filelist"), verbose: @fileutils_verbose
unless CREW_NOT_LINKS || @pkg.no_links?
brokensymlinks = nil
brokensymlinks = `find . -type l -exec test ! -e {} \\; -print`.chomp
unless brokensymlinks.to_s.empty?
puts 'There are broken symlinks. Will try to fix.'.orange if @opt_verbose
brokensymlinks.each_line(chomp: true) do |fixlink|
brokentarget = fixedtarget = nil
brokentarget = `readlink -n #{fixlink}`.chomp
puts "Attempting fix of: #{fixlink.delete_prefix('.')} -> #{brokentarget}".orange if @opt_verbose
fixedtarget = brokentarget.delete_prefix(CREW_DEST_DIR)
@@ -1308,14 +1306,14 @@ def resolve_dependencies
# compare dependency version with required range (if installed)
@dependencies.each do |dep|
depName = dep.keys[0]
dep_info = @device[:installed_packages].select {|pkg| pkg[:name] == depName } [0]
dep_name = dep.keys[0]
dep_info = @device[:installed_packages].select {|pkg| pkg[:name] == dep_name } [0]
# skip if dependency is not installed
next unless dep_info
tags, version_check = dep.values[0]
installed_version = dep_info[:version]
_tags, version_check = dep.values[0]
installed_version = dep_info[:version]
next unless version_check
@@ -1327,12 +1325,12 @@ def resolve_dependencies
@dependencies.map!(&:keys).flatten!
# leave only not installed packages in dependencies
@dependencies.reject! { |depName| @device[:installed_packages].any? { |pkg| pkg[:name] == depName } }
@dependencies.reject! { |dep_name| @device[:installed_packages].any? { |pkg| pkg[:name] == dep_name } }
# run preflight check for dependencies
@dependencies.each do |depName|
dep_pkgPath = File.join(CREW_PACKAGES_PATH, "#{depName}.rb")
Package.load_package(dep_pkgPath, depName).preflight
@dependencies.each do |dep_name|
dep_pkg_path = File.join(CREW_PACKAGES_PATH, "#{dep_name}.rb")
Package.load_package(dep_pkg_path, dep_name).preflight
end
return if @dependencies.empty?
@@ -1517,27 +1515,27 @@ def archive_package(crew_archive_dest)
system "sha256sum #{crew_archive_dest}/#{pkg_name} > #{crew_archive_dest}/#{pkg_name}.sha256"
# Copy package file for the successfully generated package to CREW_LOCAL_REPO_ROOT only if force is set.
if @opt_force
FileUtils.cp "#{CREW_PACKAGES_PATH}/#{@pkgName}.rb", "#{CREW_LOCAL_REPO_ROOT}/packages/"
puts "The package file for #{@pkgName} used has been copied to #{CREW_LOCAL_REPO_ROOT}/packages/".lightblue
FileUtils.cp "#{CREW_PACKAGES_PATH}/#{@pkg_name}.rb", "#{CREW_LOCAL_REPO_ROOT}/packages/"
puts "The package file for #{@pkg_name} used has been copied to #{CREW_LOCAL_REPO_ROOT}/packages/".lightblue
if @device[:installed_packages].any? { |pkg| pkg[:name] == @pkg.name }
puts "#{@pkgName} will now be upgraded...".lightblue
puts "#{@pkg_name} will now be upgraded...".lightblue
system "crew reinstall #{@pkg.name}"
else
puts "#{@pkgName} will now be installed...".lightblue
puts "#{@pkg_name} will now be installed...".lightblue
system "crew install #{@pkg.name}"
end
end
end
def remove(pkgName)
def remove(pkg_name)
# make sure the package is actually installed
unless @device[:installed_packages].any? { |pkg| pkg[:name] == pkgName } || File.file?(File.join(CREW_META_PATH, "#{pkgName}.filelist"))
puts "Package #{pkgName} isn't installed.".lightred
unless @device[:installed_packages].any? { |pkg| pkg[:name] == pkg_name } || File.file?(File.join(CREW_META_PATH, "#{pkg_name}.filelist"))
puts "Package #{pkg_name} isn't installed.".lightred
return
end
# Perform any operations required prior to package removal.
search pkgName, true
search pkg_name, true
@pkg.preremove unless @in_fixup
# Preserve CREW_ESSENTIAL_FILES and make sure they are real files
@@ -1553,13 +1551,13 @@ def remove(pkgName)
end
end
conflicts = determine_conflicts(Dir.pwd, pkgName)
conflicts = determine_conflicts(Dir.pwd, pkg_name)
# if the filelist exists, remove the files and directories installed by the package
if File.file?(File.join(CREW_META_PATH, "#{pkgName}.filelist"))
if File.file?(File.join(CREW_META_PATH, "#{pkg_name}.filelist"))
Dir.chdir CREW_CONFIG_PATH do
# remove all files installed by the package
File.foreach("meta/#{pkgName}.filelist", chomp: true) do |line|
File.foreach("meta/#{pkg_name}.filelist", chomp: true) do |line|
# Do not remove essential files which crew (and dependencies)
# rely on, especially during package upgrades or reinstalls.
# These essential files are enumerated in const.rb as
@@ -1571,7 +1569,7 @@ def remove(pkgName)
puts "filelist contains #{line}".lightred if @opt_verbose && !line.include?(CREW_PREFIX)
if line.start_with?(CREW_PREFIX)
if conflicts.include?(line)
puts "#{line} is in another package. It will not be removed during the removal of #{pkgName}".orange
puts "#{line} is in another package. It will not be removed during the removal of #{pkg_name}".orange
else
FileUtils.rm_rf line
end
@@ -1580,7 +1578,7 @@ def remove(pkgName)
end
# remove all directories installed by the package
File.foreach("meta/#{pkgName}.directorylist", chomp: true) do |line|
File.foreach("meta/#{pkg_name}.directorylist", chomp: true) do |line|
puts "directorylist contains #{line}".lightred if @opt_verbose && !line.include?(CREW_PREFIX)
next unless Dir.exist?(line) && Dir.empty?(line) && line.include?(CREW_PREFIX)
@@ -1589,46 +1587,46 @@ def remove(pkgName)
end
# remove the file and directory list
FileUtils.rm_f Dir["meta/#{pkgName}.{file,directory}list"]
FileUtils.rm_f Dir["meta/#{pkg_name}.{file,directory}list"]
end
end
# remove from installed packages
puts "Removing package #{pkgName}".lightred if @opt_verbose
@device[:installed_packages].delete_if { |elem| elem[:name] == pkgName }
puts "Removing package #{pkg_name}".lightred if @opt_verbose
@device[:installed_packages].delete_if { |elem| elem[:name] == pkg_name }
# update the device manifest
File.write "#{CREW_CONFIG_PATH}/device.json", JSON.pretty_generate(JSON.parse(@device.to_json))
search pkgName, true
search pkg_name, true
@pkg.remove unless @in_fixup
puts "#{pkgName.capitalize} removed!".lightgreen
puts "#{pkg_name.capitalize} removed!".lightgreen
end
def print_deps_tree(args)
warn 'Walking through dependencies recursively, this may take a while...', ''
# depHash: Hash object returned by @pkg.get_deps_list
depHash = @pkg.get_deps_list(hash: true, include_build_deps: args['--include-build-deps'] || 'auto', exclude_buildessential: args['--exclude-buildessential'])
# dep_hash: Hash object returned by @pkg.get_deps_list
dep_hash = @pkg.get_deps_list(hash: true, include_build_deps: args['--include-build-deps'] || 'auto', exclude_buildessential: args['--exclude-buildessential'])
# convert returned hash to json and format it
jsonView = JSON.pretty_generate(depHash)
json_view = JSON.pretty_generate(dep_hash)
# convert formatted json string to tree structure
treeView = jsonView.gsub(/\{\s*/m, '└─────').gsub(/[\[\]{},":]/, '').gsub(/^\s*$\n/, '').gsub(/\s*$/, '')
tree_view = json_view.gsub(/\{\s*/m, '└─────').gsub(/[\[\]{},":]/, '').gsub(/^\s*$\n/, '').gsub(/\s*$/, '')
# add pipe char to connect endpoints and starting points, improve readability
# find the horizontal location of all arrow symbols
index_with_pipe_char = treeView.lines.map { |line| line.index('└') }.compact.uniq
index_with_pipe_char = tree_view.lines.map { |line| line.index('└') }.compact.uniq
# determine whatever a pipe char should be added according to the horizontal location of arrow symbols
treeView = treeView.lines.each_with_index.map do |line, line_i|
tree_view = tree_view.lines.each_with_index.map do |line, line_i|
index_with_pipe_char.each do |char_i|
# check if there have any non-space char (pkgNames) between starting point ([line_i][char_i]) and endpoint vertically ([next_arrow_line_offset][char_i])
# check if there have any non-space char (pkg_names) between starting point ([line_i][char_i]) and endpoint vertically ([next_arrow_line_offset][char_i])
# (used to determine if the starting point and endpoint are in same branch, use pipe char to connect them if true)
next_arrow_line_offset = treeView.lines[line_i..].index { |l| l[char_i] == '└' }
have_line_with_non_empty_char = treeView.lines[line_i + 1..line_i + next_arrow_line_offset.to_i - 1].any? { |l| l[char_i].nil? or l[char_i] =~ /\S/ }
next_arrow_line_offset = tree_view.lines[line_i..].index { |l| l[char_i] == '└' }
have_line_with_non_empty_char = tree_view.lines[line_i + 1..line_i + next_arrow_line_offset.to_i - 1].any? { |l| l[char_i].nil? or l[char_i] =~ /\S/ }
line[char_i] = '│' if next_arrow_line_offset && (line[char_i] == ' ') && !have_line_with_non_empty_char
end
@@ -1636,7 +1634,7 @@ def print_deps_tree(args)
end.join
# replace arrow symbols with a tee symbol on branch intersection
treeView = treeView.lines.each_with_index.map do |line, line_i|
tree_view = tree_view.lines.each_with_index.map do |line, line_i|
# orig_arrow_index_connecter: the horizontal location of the arrow symbol used to connect parent branch
#
# example:
@@ -1659,9 +1657,9 @@ def print_deps_tree(args)
orig_arrow_index_newbranch = orig_arrow_index_connecter + 4
# if the char under the processing arrow symbol (orig_arrow_index_connecter) is also arrow or pipe, change the processing char to tee symbol
line[orig_arrow_index_connecter] = '├' if orig_arrow_index_connecter && treeView.lines[line_i + 1].to_s[orig_arrow_index_connecter] =~ (/[└│]/)
line[orig_arrow_index_connecter] = '├' if orig_arrow_index_connecter && tree_view.lines[line_i + 1].to_s[orig_arrow_index_connecter] =~ (/[└│]/)
# if the char under the processing arrow symbol (orig_arrow_index_newbranch) is also arrow or pipe, change the processing char to tee symbol
line[orig_arrow_index_newbranch] = '┬' if orig_arrow_index_newbranch && treeView.lines[line_i + 1].to_s[orig_arrow_index_newbranch] =~ (/[└├]/)
line[orig_arrow_index_newbranch] = '┬' if orig_arrow_index_newbranch && tree_view.lines[line_i + 1].to_s[orig_arrow_index_newbranch] =~ (/[└├]/)
next line # return modified line
end.join
@@ -1674,22 +1672,22 @@ def print_deps_tree(args)
# (the first string in each #{} is used for commenting only, will not be included in output)
# replace special symbols returned by @pkg.get_deps_list to actual color code
treeView.gsub!(/\*(.+)\*/, '\1'.lightcyan)
treeView.gsub!(/\+(.+)\+/, "\e[45m\\1\e[0m")
tree_view.gsub!(/\*(.+)\*/, '\1'.lightcyan)
tree_view.gsub!(/\+(.+)\+/, "\e[45m\\1\e[0m")
end
puts treeView
puts tree_view
end
def upload(pkgName = nil)
def upload(pkg_name = nil)
abort "\nGITLAB_TOKEN environment variable not set.\n".lightred if ENV.fetch('GITLAB_TOKEN', nil).nil?
packages = pkgName
packages = pkg_name
binary_compression_set = nil
gitlab_token = ENV.fetch('GITLAB_TOKEN', nil)
base_url = 'https://gitlab.com/api/v4/projects/26210301/packages/generic'
if pkgName.nil?
if pkg_name.nil?
%w[.tar.xz .tar.zst].each do |ext|
packages += `find #{CREW_LOCAL_REPO_ROOT}/release/*/*#{ext} -exec basename -s #{ext} {} + | cut -d- -f1 | sort | uniq | xargs`
packages += ' '
@@ -1827,27 +1825,27 @@ def build_command(args)
# If a package file is explicitly passed, then use that package file, whereever it is.
if name.include?('.rb') && File.file?(name)
FileUtils.cp name, "#{CREW_PACKAGES_PATH}/"
@pkgName = File.basename(name).gsub('.rb', '')
@pkg_name = File.basename(name).gsub('.rb', '')
else
@pkgName = name
@pkg_name = name
end
# Prompt to copy the local repo package to crew if the package is not found.
if !File.file?("#{CREW_PACKAGES_PATH}/#{@pkgName}.rb") && File.file?("#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb")
if !File.file?("#{CREW_PACKAGES_PATH}/#{@pkg_name}.rb") && File.file?("#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb")
if @opt_force
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb exists but crew is unable to find this package.".yellow
print "\nWould you like to copy #{@pkgName}.rb to crew and start the build [Y/n] ".yellow
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb exists but crew is unable to find this package.".yellow
print "\nWould you like to copy #{@pkg_name}.rb to crew and start the build [Y/n] ".yellow
response = $stdin.gets.chomp.downcase
case response
when 'n', 'no'
puts 'Build skipped.'
next
when '', 'y', 'yes'
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "I don't understand `#{response}`. :(".lightred
puts 'Build skipped.'
@@ -1859,27 +1857,27 @@ def build_command(args)
# Compare local repo package to the crew repo package and prompt to copy if necessary to prepare for the build.
crew_package_updated = ''
Dir.chdir CREW_PACKAGES_PATH do
crew_package_updated = `git diff #{CREW_PACKAGES_PATH}/#{@pkgName}.rb`.chomp
crew_package_updated = `git diff #{CREW_PACKAGES_PATH}/#{@pkg_name}.rb`.chomp
end
local_package_updated = ''
Dir.chdir CREW_LOCAL_REPO_ROOT do
local_package_updated = `git diff #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb`.chomp
local_package_updated = `git diff #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb`.chomp
end
if local_package_updated != '' && crew_package_updated == ''
if @opt_force
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb has been updated but the crew package is unchanged.".yellow
print "\nWould you like to copy #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to crew and start the build [Y/n] ".yellow
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb has been updated but the crew package is unchanged.".yellow
print "\nWould you like to copy #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to crew and start the build [Y/n] ".yellow
response = $stdin.gets.chomp.downcase
case response
when 'n', 'no'
puts 'Build skipped.'
next
when '', 'y', 'yes'
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "I don't understand `#{response}`. :(".lightred
puts 'Build skipped.'
@@ -1889,19 +1887,19 @@ def build_command(args)
end
if local_package_updated != '' && crew_package_updated != '' && local_package_updated != crew_package_updated
if @opt_force
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb has been updated and does not match the crew updated package.".yellow
print "\nWould you like to copy #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to crew and start the build [Y/n] ".yellow
puts "\n#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb has been updated and does not match the crew updated package.".yellow
print "\nWould you like to copy #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to crew and start the build [Y/n] ".yellow
response = $stdin.gets.chomp.downcase
case response
when 'n', 'no'
puts 'Build skipped.'
next
when '', 'y', 'yes'
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkgName}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
FileUtils.cp "#{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb", "#{CREW_PACKAGES_PATH}/"
puts "\nCopied #{CREW_LOCAL_REPO_ROOT}/packages/#{@pkg_name}.rb to #{CREW_PACKAGES_PATH}.\n".lightgreen
else
puts "I don't understand `#{response}`. :(".lightred
puts 'Build skipped.'
@@ -1910,19 +1908,19 @@ def build_command(args)
end
end
search @pkgName
search @pkg_name
print_current_package @opt_verbose
next unless @pkgName
next unless @pkg_name
# Process preflight block to see if package should be built
pre_flight
if !@pkg.is_fake? && @pkg.compatible? && @pkg.is_source?(ARCH) && @pkg.source_url.to_s.upcase != 'SKIP' && !@pkg.no_compile_needed?
if !@pkg.is_fake? && @pkg.compatible? && @pkg.source?(ARCH) && @pkg.source_url.to_s.upcase != 'SKIP' && !@pkg.no_compile_needed?
resolve_dependencies_and_build
else
puts 'Unable to build a fake package. Skipping build.'.lightred if @pkg.is_fake?
puts "Package #{@pkg.name} is not compatible with your device architecture (#{ARCH}). Skipping build.".lightred unless @pkg.compatible?
puts 'Unable to build without source. Skipping build.'.lightred unless @pkg.is_source?(ARCH) && @pkg.source_url.to_s.upcase != 'SKIP'
puts 'Unable to build without source. Skipping build.'.lightred unless @pkg.source?(ARCH) && @pkg.source_url.to_s.upcase != 'SKIP'
puts 'Compile not needed. Skipping build.'.lightred if @pkg.no_compile_needed?
end
end
@@ -1941,8 +1939,8 @@ end
def deps_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName
@pkg_name = name
search @pkg_name
if args['--tree']
# call `print_deps_tree` (print dependency tree) if --tree is specified
@@ -1958,8 +1956,8 @@ end
def download_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName
@pkg_name = name
search @pkg_name
@pkg.build_from_source = true if @opt_source
print_current_package @opt_verbose
download
@@ -1968,8 +1966,8 @@ end
def files_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName
@pkg_name = name
search @pkg_name
print_current_package
files name
end
@@ -1981,11 +1979,11 @@ end
def install_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName
@pkg_name = name
search @pkg_name
print_current_package true
@pkg.build_from_source = true if @opt_source || @opt_recursive || CREW_BUILD_FROM_SOURCE
next unless @pkgName
next unless @pkg_name
if @pkg.compatible?
resolve_dependencies_and_install
@@ -2009,12 +2007,12 @@ end
def postinstall_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName, true
if @device[:installed_packages].any? { |elem| elem[:name] == @pkgName }
@pkg_name = name
search @pkg_name, true
if @device[:installed_packages].any? { |elem| elem[:name] == @pkg_name }
@pkg.postinstall
else
puts "Package #{@pkgName} is not installed. :(".lightred
puts "Package #{@pkg_name} is not installed. :(".lightred
end
end
end
@@ -2025,11 +2023,11 @@ end
def reinstall_command(args)
args['<name>'].each do |name|
@pkgName = name
search @pkgName
@pkg_name = name
search @pkg_name
print_current_package
@pkg.build_from_source = true if @opt_source || @opt_recursive || CREW_BUILD_FROM_SOURCE
next unless @pkgName
next unless @pkg_name
if @pkg.compatible?
@pkg.in_upgrade = true
@@ -2118,7 +2116,7 @@ def whatprovides_command(args)
end
end
def is_command(name) = !!!name[/^[-<]/]
def command?(name) = !!!name[/^[-<]/]
Signal.trap('INT') do
if CREW_CACHE_FAILED_BUILD && CREW_CACHE_ENABLED && @pkg.in_build
@@ -2131,5 +2129,5 @@ Signal.trap('INT') do
end
load_json
command_name = args.select { |k, v| v && is_command(k) }.keys[0]
command_name = args.select { |k, v| v && command?(k) }.keys[0]
send("#{command_name}_command", args)

View File

@@ -72,18 +72,16 @@ CREW_IS_AMD = CREW_CPU_VENDOR.eql?('AuthenticAMD')
CREW_IS_INTEL = %w[x86_64 i686].include?(ARCH) && %w[unknown GenuineIntel].include?(CREW_CPU_VENDOR)
# Use sane minimal defaults if in container and no override specified.
if CREW_IN_CONTAINER && ENV['CREW_KERNEL_VERSION'].nil?
case ARCH
when 'i686'
CREW_KERNEL_VERSION = '3.8'
when 'aarch64', 'armv7l'
CREW_KERNEL_VERSION = '5.10'
when 'x86_64'
CREW_KERNEL_VERSION = '5.10'
end
else
CREW_KERNEL_VERSION = ENV.fetch('CREW_KERNEL_VERSION', `uname -r`.rpartition('.')[0])
end
CREW_KERNEL_VERSION = if CREW_IN_CONTAINER && ENV['CREW_KERNEL_VERSION'].nil?
case ARCH
when 'i686'
'3.8'
else
'5.10'
end
else
ENV.fetch('CREW_KERNEL_VERSION', `uname -r`.rpartition('.')[0])
end
CREW_LIB_PREFIX = File.join(CREW_PREFIX, ARCH_LIB)
CREW_MAN_PREFIX = File.join(CREW_PREFIX, 'share/man')

View File

@@ -11,25 +11,25 @@ module DebUtils
# extract_deb('example.deb', /*/) # extract all files from example.deb
#
file_found = false
src_fileIO = File.open(file, 'rb')
file_size = src_fileIO.size
src_file_io = File.open(file, 'rb')
file_size = src_file_io.size
# get first line of the given file, should be a signature string (`!<arch>\n`) if it is a valid deb file
signature = src_fileIO.gets
signature = src_file_io.gets
abort 'Malformed archive :/'.lightred unless signature == "!<arch>\n"
# process each file in archive
while (line = src_fileIO.gets)
if line.chomp.empty? && (file_size == src_fileIO.tell)
while (line = src_file_io.gets)
if line.chomp.empty? && (file_size == src_file_io.tell)
# early return if trailing newline is detected
break
elsif line.chomp.empty?
warn "Unexpected newline in offset #{src_fileIO.tell}, ignoring...".yellow
warn "Unexpected newline in offset #{src_file_io.tell}, ignoring...".yellow
next
end
# read file meta
name, modtime, uid, gid, mode, size, end_char = \
name, _modtime, _uid, _gid, mode, size, end_char = \
line.scan(/(.{16})(.{12})(.{6})(.{6})(.{8})(.{10})(.{1})/).flatten.map(&:strip)
# remove slash suffix from filename (if any)
@@ -40,18 +40,18 @@ module DebUtils
abort 'Malformed archive :/'.lightred unless end_char == '`'
# capture file in archive with given offset bytes (file size)
fileContent = src_fileIO.read(size.to_i)
file_content = src_file_io.read(size.to_i)
# filter filename if a target file is specified
if target.is_a?(String) && (name == target)
# if target is passed as string, write matched file to filesyetem and exit function
# write to filesystem
return File.binwrite(name, fileContent, perm: mode.to_i(8))
return File.binwrite(name, file_content, perm: mode.to_i(8))
elsif target.is_a?(Regexp) && name =~ (target)
# if target is passed as regex, write matched file to filesyetem and continue
# searching for another matched file until EOF
# write to filesystem
File.binwrite(name, fileContent, perm: mode.to_i(8))
File.binwrite(name, file_content, perm: mode.to_i(8))
file_found = true
end
end

View File

@@ -93,6 +93,7 @@ def http_downloader(uri, filename = File.basename(url), verbose = false)
http.request(Net::HTTP::Get.new(uri)) do |response|
case
when response.is_a?(Net::HTTPSuccess)
# Response is successful, don't abort
when response.is_a?(Net::HTTPRedirection) # follow HTTP redirection
puts <<~EOT if verbose
* Follow HTTP redirection: #{response['Location']}

View File

@@ -102,7 +102,7 @@ pkg_update_arr.each do |pkg|
# Ok to write working device.json
File.write "#{CREW_CONFIG_PATH}/device.json", JSON.pretty_generate(JSON.parse(@device.to_json))
puts "#{pkg[:pkg_name].capitalize} renamed to #{pkg[:pkg_rename].capitalize}".lightgreen
rescue StandardError => e
rescue StandardError
puts 'Restoring old filelist, directorylist, and device.json...'.lightred
FileUtils.mv new_filelist, old_filelist
FileUtils.mv new_directorylist, old_directorylist

View File

@@ -30,20 +30,20 @@ class Package
attr_accessor :name, :cached_build, :in_build, :build_from_source, :in_upgrade
end
def self.load_package(pkgFile, pkgName = File.basename(pkgFile, '.rb'))
def self.load_package(pkg_file, pkg_name = File.basename(pkg_file, '.rb'))
# self.load_package: load a package under 'Package' class scope
#
className = pkgName.capitalize
class_name = pkg_name.capitalize
# read and eval package script under 'Package' class
class_eval(File.read(pkgFile, encoding: Encoding::UTF_8), pkgFile) unless const_defined?("Package::#{className}")
class_eval(File.read(pkg_file, encoding: Encoding::UTF_8), pkg_file) unless const_defined?("Package::#{class_name}")
pkgObj = const_get(className)
pkgObj.name = pkgName
pkg_obj = const_get(class_name)
pkg_obj.name = pkg_name
@crew_current_package = @crew_current_package.nil? ? pkgObj.name : @crew_current_package
@crew_current_package = @crew_current_package.nil? ? pkg_obj.name : @crew_current_package
return pkgObj
return pkg_obj
end
def self.dependencies
@@ -53,11 +53,11 @@ class Package
@dependencies ||= {}
end
def self.get_deps_list(pkgName = name, return_attr: false, hash: false, include_build_deps: 'auto', include_self: false,
pkgTags: [], verCheck: nil, highlight_build_deps: true, exclude_buildessential: false, top_level: true)
# get_deps_list: get dependencies list of pkgName (current package by default)
def self.get_deps_list(pkg_name = name, return_attr: false, hash: false, include_build_deps: 'auto', include_self: false,
pkg_tags: [], ver_check: nil, highlight_build_deps: true, exclude_buildessential: false, top_level: true)
# get_deps_list: get dependencies list of pkg_name (current package by default)
#
# pkgName: package to check dependencies, current package by default
# pkg_name: package to check dependencies, current package by default
# return_attr: return package attribute (tags and version lambda) also
# hash: return result in nested hash, used by `print_deps_tree` (`bin/crew`)
#
@@ -65,26 +65,26 @@ class Package
# if set to false, all build dependencies will not be returned
# if set to "auto" (default), return build dependencies if pre-built binaries not available
#
# include_self: include #{pkgName} itself in returned result, only used in recursive calls (see `expandedDeps` below)
# include_self: include #{pkg_name} itself in returned result, only used in recursive calls (see `expanded_deps` below)
# highlight_build_deps: include corresponding symbols in return value, you can convert it to actual ascii color codes later
# exclude_buildessential: do not insert `buildessential` dependency automatically
#
# top_level: if set to true, return satisfied dependencies
# (dependencies that might be a sub-dependency of a dependency that checked before),
# always set to false if this function is called in recursive loop (see `expandedDeps` below)
# always set to false if this function is called in recursive loop (see `expanded_deps` below)
#
@checked_list ||= {} # create @checked_list placeholder if not exist
# add current package to @checked_list for preventing extra checks
@checked_list.merge!({ pkgName => pkgTags })
@checked_list.merge!({ pkg_name => pkg_tags })
pkgObj = load_package("#{CREW_PACKAGES_PATH}/#{pkgName}.rb")
is_source = pkgObj.is_source?(ARCH.to_sym) or pkgObj.build_from_source
deps = pkgObj.dependencies
pkg_obj = load_package("#{CREW_PACKAGES_PATH}/#{pkg_name}.rb")
is_source = pkg_obj.source?(ARCH.to_sym) or pkg_obj.build_from_source
deps = pkg_obj.dependencies
# append buildessential to deps if building from source is needed/specified
if ((include_build_deps == true) || ((include_build_deps == 'auto') && is_source)) && \
!pkgObj.no_compile_needed? && \
!pkg_obj.no_compile_needed? && \
!exclude_buildessential && \
!@checked_list.keys.include?('buildessential')
@@ -92,22 +92,22 @@ class Package
end
# parse dependencies recursively
expandedDeps = deps.uniq.map do |dep, (depTags, verCheck)|
expanded_deps = deps.uniq.map do |dep, (dep_tags, ver_check)|
# check build dependencies only if building from source is needed/specified
# Do not recursively find :build based build dependencies.
next unless (include_build_deps == true && @crew_current_package == pkgObj.name) || \
((include_build_deps == 'auto') && is_source && @crew_current_package == pkgObj.name) || \
!depTags.include?(:build)
next unless (include_build_deps == true && @crew_current_package == pkg_obj.name) || \
((include_build_deps == 'auto') && is_source && @crew_current_package == pkg_obj.name) || \
!dep_tags.include?(:build)
# overwrite tags if parent dependency is a build dependency
# (for build dependencies highlighting)
tags = pkgTags.include?(:build) ? pkgTags : depTags
tags = pkg_tags.include?(:build) ? pkg_tags : dep_tags
if @checked_list.keys.none?(dep)
# check dependency by calling this function recursively
next \
send(
__method__, dep, pkgTags: tags, verCheck:, include_self: true, top_level: false,
__method__, dep, pkg_tags: tags, ver_check:, include_self: true, top_level: false,
hash:, return_attr:, include_build_deps:, highlight_build_deps:, exclude_buildessential:
)
elsif hash && top_level
@@ -127,21 +127,21 @@ class Package
if hash
# the '*' symbol tell `print_deps_tree` (`bin/crew`) to color this package as "build dependency"
if highlight_build_deps && pkgTags.include?(:build)
return { "*#{pkgName}*" => expandedDeps }
if highlight_build_deps && pkg_tags.include?(:build)
return { "*#{pkg_name}*" => expanded_deps }
else
return { pkgName => expandedDeps }
return { pkg_name => expanded_deps }
end
elsif include_self
# return pkgName itself if this function is called as a recursive loop (see `expandedDeps`)
# return pkg_name itself if this function is called as a recursive loop (see `expanded_deps`)
if return_attr
return [expandedDeps, { pkgName => [pkgTags, verCheck] }].flatten
return [expanded_deps, { pkg_name => [pkg_tags, ver_check] }].flatten
else
return [expandedDeps, pkgName].flatten
return [expanded_deps, pkg_name].flatten
end
else
# if this function is called outside of this function, return parsed dependencies only
return expandedDeps.flatten
return expanded_deps.flatten
end
end
@@ -162,13 +162,13 @@ class Package
# add element in "[ name, [ tag1, tag2, ... ] ]" format
if dependency.is_a?(Hash)
# parse "depends_on name => <tags: Symbol|Array>"
depName, tags = dependency.first
dep_name, tags = dependency.first
# convert `tags` to array in case `tags` is a symbol
dep_tags += [tags].flatten
else
# parse "depends_on name"
depName = dependency
dep_name = dependency
end
# process dependency version range if specified
@@ -184,7 +184,7 @@ class Package
unless Gem::Version.new(installed_ver).send( operator.to_sym, Gem::Version.new(target_ver) )
# print error if the range is not fulfilled
warn <<~EOT.lightred
Package #{name} depends on '#{depName}' (#{operator} #{target_ver}), however version '#{installed_ver}' is currently installed :/
Package #{name} depends on '#{dep_name}' (#{operator} #{target_ver}), however version '#{installed_ver}' is currently installed :/
Run `crew update && crew upgrade` and try again?
EOT
@@ -194,7 +194,7 @@ class Package
end
end
@dependencies.store(depName, [dep_tags, ver_check])
@dependencies.store(dep_name, [dep_tags, ver_check])
end
def self.get_url(architecture)
@@ -227,8 +227,8 @@ class Package
def self.get_binary_sha256(architecture) = @binary_sha256&.key?(architecture) ? @binary_sha256[architecture] : ''
def self.get_extract_dir = "#{name}.#{Time.now.utc.strftime('%Y%m%d%H%M%S')}.dir"
def self.is_binary?(architecture) = !@build_from_source && @binary_sha256 && @binary_sha256.key?(architecture)
def self.is_source?(architecture) = !(is_binary?(architecture) || is_fake?)
def self.binary?(architecture) = !@build_from_source && @binary_sha256 && @binary_sha256.key?(architecture)
def self.source?(architecture) = !(binary?(architecture) || is_fake?)
def self.system(*args, **opt_args)
@crew_env_options_hash = if no_env_options?

View File

@@ -89,16 +89,16 @@ class ProgressBar
uncompleted_length = @bar_width - completed_length
# print info and progress bar
@info_before_bar.each_pair do |varName, width|
printf '%*.*s ', width, width, instance_variable_get("@#{varName}")
@info_before_bar.each_pair do |var_name, width|
printf '%*.*s ', width, width, instance_variable_get("@#{var_name}")
end
# print progress bar with color code
print (@bar_char * completed_length).send(*@bar_front_color),
(@bar_char * uncompleted_length).send(*@bar_bg_color)
@info_after_bar.each_pair do |varName, width|
printf ' %*.*s', width, width, instance_variable_get("@#{varName}")
@info_after_bar.each_pair do |var_name, width|
printf ' %*.*s', width, width, instance_variable_get("@#{var_name}")
end
# stop when 100%

View File

@@ -4,18 +4,18 @@ class MutableMatrix < Matrix
public :'[]='
end
# Returns the edit distance between strings a and b
# Returns the edit distance between strings string1 and string12
# https://en.wikipedia.org/wiki/Edit_distance
def edit_distance(a, b)
def edit_distance(string1, string2)
# memo is the matrix for dynamic programming
# memo[i, j] = the edit distance between the
# prefixes of a and b of size i and j.
memo = MutableMatrix.zero(a.size + 1, b.size + 1)
a.size.times { |i| memo[i + 1, 0] = i + 1 }
b.size.times { |j| memo[0, j + 1] = j + 1 }
a.size.times do |i|
b.size.times do |j|
memo[i + 1, j + 1] = if a[i] == b[j]
# prefixes of string1 and string2 of size i and j.
memo = MutableMatrix.zero(string1.size + 1, string2.size + 1)
string1.size.times { |i| memo[i + 1, 0] = i + 1 }
string2.size.times { |j| memo[0, j + 1] = j + 1 }
string1.size.times do |i|
string2.size.times do |j|
memo[i + 1, j + 1] = if string1[i] == string2[j]
memo[i, j]
else
[
@@ -27,5 +27,5 @@ def edit_distance(a, b)
end
end
return memo[a.size, b.size]
return memo[string1.size, string2.size]
end

View File

@@ -67,22 +67,22 @@ class Icu4c < Package
@oldicuver = %w[72 72.1]
@oldicuver.each do |oldver|
puts "Finding Packages expecting icu4c version #{oldver} that may need updating:".lightgreen
@fileArray = []
@libArray = []
@file_array = []
@lib_array = []
@nmresults = `nm -A *.so* 2>/dev/null | grep ucol_open_#{oldver}`.chop.split(/$/).map(&:strip)
@nmresults.each { |fileLine| @libArray.push(fileLine.partition(':').first) }
@libArray.each do |f|
@nmresults.each { |file_line| @lib_array.push(file_line.partition(':').first) }
@lib_array.each do |f|
@grepresults = `grep "#{f}" #{CREW_META_PATH}/*.filelist`.chomp.gsub('.filelist', '').partition(':').first.gsub(
CREW_META_PATH, ''
).split(/$/).map(&:strip)
@grepresults.each { |fileLine| @fileArray.push(fileLine) }
@grepresults.each { |file_line| @file_array.push(file_line) }
end
# Mozjs contains an internal icu which will not match this version.
# Update the following when there is a new version of mozjs.
@fileArray.delete_if { |item| item == 'js102' }
next if @fileArray.empty?
@file_array.delete_if { |item| item == 'js102' }
next if @file_array.empty?
@fileArray.uniq.sort.each do |item|
@file_array.uniq.sort.each do |item|
puts item.lightred
end
end

View File

@@ -20,7 +20,7 @@ class Imagemagick < Package
puts " 7 = ImageMagick #{Imagemagick7.version}"
puts ' 0 = Cancel'
while version = $stdin.gets.chomp.downcase
while (version = $stdin.gets.chomp.downcase)
case version
when '6'
depends_on 'imagemagick6'
@@ -30,7 +30,6 @@ class Imagemagick < Package
break
when '0'
abort
break
else
puts ' Please select from one of the options or enter 0 to cancel.'
end

View File

@@ -7,9 +7,9 @@ class Jdk < Package
compatibility 'all'
# full version number extracted from jdk*.rb recipes
@avail_jdk_ver = Dir["#{CREW_PACKAGES_PATH}/jdk?*.rb"].map do |pkgFile|
jdk_majver = pkgFile[/jdk(\d+).rb/, 1].to_i
pkg = Package.load_package(pkgFile)
@avail_jdk_ver = Dir["#{CREW_PACKAGES_PATH}/jdk?*.rb"].map do |pkg_file|
jdk_majver = pkg_file[/jdk(\d+).rb/, 1].to_i
pkg = Package.load_package(pkg_file)
[jdk_majver, pkg.version]
end.sort_by do |(jdk_majver, _)|

View File

@@ -39,11 +39,8 @@ class Llvm16_dev < Package
@filelist = File.readlines(@filelist_path, chomp: true).sort
@filelist.each do |filename|
if filename.include?('.so') && filename.include?('libLLVM')
next
elsif filename.include?('llvm-strip')
next
end
next if filename.include?('.so') && filename.include?('libLLVM')
next if filename.include?('llvm-strip')
@destpath = File.join(CREW_DEST_DIR, filename)
@filename_target = File.realpath(filename)

View File

@@ -42,11 +42,8 @@ class Llvm17_dev < Package
@filelist = File.readlines(@filelist_path, chomp: true).sort
@filelist.each do |filename|
if filename.include?('.so') && filename.include?('libLLVM')
next
elsif filename.include?('llvm-strip')
next
end
next if filename.include?('.so') && filename.include?('libLLVM')
next if filename.include?('llvm-strip')
@destpath = File.join(CREW_DEST_DIR, filename)
@filename_target = File.realpath(filename)

View File

@@ -33,21 +33,15 @@ MONGO-TOOLS***'"
system "scons -j#{CREW_NPROC} install --ssl --prefix=#{CREW_DEST_PREFIX} --use-new-tools"
when 'i686'
system "scons -j#{CREW_NPROC} install --ssl --wiredtiger=off --prefix=#{CREW_DEST_PREFIX} --use-new-tools"
when 'armv7l'
when 'armv7l', 'aarch64'
# Arm 64 bit architecture is supported, but Chrome OS aarch64 is 32 bit.
# So, it is required to pretend it is armv7l.
# Arm 32 bit architecture is not supported officaially.
# Please read https://groups.google.com/forum/#!msg/mongodb-dev/G-kGjZEEam0/VSVB9fYCBAAJ for details
system 'cd src/third_party/mozjs-38/; ./get_sources.sh'
system 'cd src/third_party/mozjs-38/; ./gen-config.sh arm linux'
system 'cd src/third_party/mozjs-38/; rm -rf firefix* mozilla-release'
system "scons -j#{CREW_NPROC} install --ssl --wiredtiger=off --mmapv1=on --prefix=#{CREW_DEST_PREFIX} --use-new-tools"
when 'aarch64'
# Arm 64 bit architecture is supported, but Chrome OS aarch64 is 32 bit.
# So, it is required to pretend it is armv7l.
system 'cd src/third_party/mozjs-38/; ./get_sources.sh'
system 'cd src/third_party/mozjs-38/; ./gen-config.sh arm linux'
system 'cd src/third_party/mozjs-38/; rm -rf firefix* mozilla-release'
# Not sure how to pretend it under scons
system "scons -j#{CREW_NPROC} install --ssl --wiredtiger=off --mmapv1=on --prefix=#{CREW_DEST_PREFIX} --use-new-tools"
end
# guide messages

View File

@@ -1,9 +1,9 @@
require 'package'
Dir["#{CREW_PACKAGES_PATH}/openjdk*.rb"].each do |openjdkFile|
next unless openjdkFile =~ /openjdk(\d+).rb/
Dir["#{CREW_PACKAGES_PATH}/openjdk*.rb"].each do |openjdk_file|
next unless openjdk_file =~ /openjdk(\d+).rb/
openjdkName = File.basename(openjdkFile, '.rb')
require_relative openjdkName
openjdk_name = File.basename(openjdk_file, '.rb')
require_relative openjdk_name
end
class Openjdk < Package
@@ -11,18 +11,17 @@ class Openjdk < Package
homepage 'https://openjdk.org/'
key = 1
versions = []
@openjdkVersions = []
Dir["#{CREW_PACKAGES_PATH}/openjdk*.rb"].each do |openjdkFile|
next unless openjdkFile =~ /openjdk(\d+).rb/
@openjdk_versions = []
Dir["#{CREW_PACKAGES_PATH}/openjdk*.rb"].each do |openjdk_file|
next unless openjdk_file =~ /openjdk(\d+).rb/
openjdkName = File.basename(openjdkFile, '.rb')
openjdkVer = Object.const_get(openjdkName.capitalize).version.to_s.gsub(/-(\d+)/, '')
openjdkMajVer = openjdkVer.match?(/^1.8/) ? '8' : openjdkVer.partition('.')[0]
@openjdkVersions.push [key, openjdkName, openjdkVer]
openjdk_name = File.basename(openjdk_file, '.rb')
openjdk_ver = Object.const_get(openjdk_name.capitalize).version.to_s.gsub(/-(\d+)/, '')
@openjdk_versions.push [key, openjdk_name, openjdk_ver]
key += 1
end
@openjdkVersions.each do |openjdkVer|
versions.push openjdkVer[2]
@openjdk_versions.each do |openjdk_ver|
versions.push openjdk_ver[2]
end
versions.sort!
version "#{versions.first}-#{versions.last}"
@@ -34,9 +33,9 @@ class Openjdk < Package
def self.preflight
if ARGV.include?('install')
puts "\n Select version:"
@openjdkVersions.each do |openjdkVer|
option = " #{openjdkVer[0]} = Openjdk #{openjdkVer[2]}"
if File.file? "#{CREW_META_PATH}/#{openjdkVer[1]}.filelist"
@openjdk_versions.each do |openjdk_ver|
option = " #{openjdk_ver[0]} = Openjdk #{openjdk_ver[2]}"
if File.file? "#{CREW_META_PATH}/#{openjdk_ver[1]}.filelist"
puts option.lightgreen
else
puts option
@@ -44,15 +43,15 @@ class Openjdk < Package
end
puts ' 0 = Cancel'
while version = $stdin.gets.chomp.downcase.to_i
version = 0 if version.negative? || version > @openjdkVersions.length
while (version = $stdin.gets.chomp.downcase.to_i)
version = 0 if version.negative? || version > @openjdk_versions.length
key = version - 1
case version
when @openjdkVersions[key][0]
if File.file? "#{CREW_META_PATH}/#{@openjdkVersions[key][1]}.filelist"
abort "Package #{@openjdkVersions[key][1]} already installed.".lightgreen
when @openjdk_versions[key][0]
if File.file? "#{CREW_META_PATH}/#{@openjdk_versions[key][1]}.filelist"
abort "Package #{@openjdk_versions[key][1]} already installed.".lightgreen
else
depends_on @openjdkVersions[key][1]
depends_on @openjdk_versions[key][1]
end
break
when 0

View File

@@ -1,27 +1,27 @@
require 'package'
Dir["#{CREW_PACKAGES_PATH}/php*.rb"].each do |phpFile|
next unless phpFile =~ /php(\d+).rb/
Dir["#{CREW_PACKAGES_PATH}/php*.rb"].each do |php_file|
next unless php_file =~ /php(\d+).rb/
phpName = File.basename(phpFile, '.rb')
require_relative phpName
php_name = File.basename(php_file, '.rb')
require_relative php_name
end
class Php < Package
description 'PHP is a popular general-purpose scripting language that is especially suited to web development.'
homepage 'http://www.php.net/'
key = 1
@phpVersions = []
Dir["#{CREW_PACKAGES_PATH}/php*.rb"].each do |phpFile|
next unless phpFile =~ /php(\d+).rb/
@php_versions = []
Dir["#{CREW_PACKAGES_PATH}/php*.rb"].each do |php_file|
next unless php_file =~ /php(\d+).rb/
phpName = File.basename(phpFile, '.rb')
phpVer = Object.const_get(phpName.capitalize).version.to_s.gsub(/-(\d+)/, '')
@phpVersions.push [key, phpName, phpVer]
@minPhpVer = phpVer if key == 1
@maxPhpVer = phpVer
php_name = File.basename(php_file, '.rb')
php_ver = Object.const_get(php_name.capitalize).version.to_s.gsub(/-(\d+)/, '')
@php_versions.push [key, php_name, php_ver]
@min_php_ver = php_ver if key == 1
@max_php_ver = php_ver
key += 1
end
version "#{@minPhpVer}-#{@maxPhpVer}"
version "#{@min_php_ver}-#{@max_php_ver}"
license 'PHP-3.01'
compatibility 'all'
@@ -35,17 +35,17 @@ class Php < Package
abort "Enter `crew remove php#{major}#{minor} && crew install php` to install a different version."
end
puts "\nSelect version:"
@phpVersions.each do |phpVer|
puts "#{phpVer[0]} = PHP #{phpVer[2]}"
@php_versions.each do |php_ver|
puts "#{php_ver[0]} = PHP #{php_ver[2]}"
end
puts '0 = Cancel'
while version = $stdin.gets.chomp.downcase.to_i
version = 0 if version.negative? || version > @phpVersions.length
while (version = $stdin.gets.chomp.downcase.to_i)
version = 0 if version.negative? || version > @php_versions.length
key = version - 1
case version
when @phpVersions[key][0]
depends_on @phpVersions[key][1]
when @php_versions[key][0]
depends_on @php_versions[key][1]
break
when 0
abort

View File

@@ -10,7 +10,7 @@ class Ruby_rubocop < RUBY
license 'MIT'
compatibility 'all'
source_url 'https://github.com/chromebrew/chromebrew/raw/master/.rubocop.yml'
source_sha256 '60e2e5b6e56b6c5b8cd760e47d7abfee2ea920a6fcb6985ece95d6097bc76c07'
source_sha256 '38f6c68465c7224bdd7bcb1b37f7b49283f46def71dc56553069e749afab4b85'
depends_on 'libyaml'
depends_on 'xdg_base'

View File

@@ -175,10 +175,6 @@ task :automake do
rest: '| sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr | head -1'
end
desc 'Check for new version of autossh'
task :autossh do
end
desc 'Check for new version of aws'
task :aws do
check_version pkg_name: 'aws',
@@ -416,10 +412,6 @@ task :gawk do
rest: '| sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr | head -1'
end
desc 'Check for new version of gcc'
task :gcc do
end
desc 'Check for new version of gdal'
task :gdal do
check_version pkg_name: 'gdal',
@@ -1018,10 +1010,6 @@ task :postgres do
rest: '| sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr | head -1'
end
desc 'Check for new version of powerline_fonts'
task :powerline_fonts do
end
desc 'Check for new version of powerstat'
task :powerstat do
check_version pkg_name: 'powerstat',
@@ -1046,10 +1034,6 @@ task :pv do
rest: ''
end
desc 'Check for new version of pwgen'
task :pwgen do
end
desc 'Check for new version of python27'
task :python27 do
check_version pkg_name: 'python27',
@@ -1260,10 +1244,6 @@ task :unrar do
rest: ''
end
desc 'Check for new version of unzip'
task :unzip do
end
desc 'Check for new version of vifm'
task :vifm do
check_version pkg_name: 'vifm',