Files
chromebrew/lib/package_utils.rb
Satadru Pramanik, DO, MPH, MEng c6b102fece Use grep better to speed up crew remove of packages. (#10309)
* use grep to speed up crew remove

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

* bump version

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

* adjust logic

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

* Add back CREW_ESSENTIAL_FILES to handle files like libC.so.6

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

* adjust CREW_ESSENTIAL_FILES logic

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

* fix package_files_that_overlap

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

* cleanup output of package_files_that_overlap

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

* debug

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

* Back out CREW_ESSENTIAL_FILES change, and use Package.load_package('pkg.rb').get_deps_list to find dependent packages of CREW_ESSENTIAL_PACKAGES in commands/remove.rb, and also fix Package.load_package('pkg.rb').get_deps_list to enable using it from commands/remove.rb

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

* Adjust removal message in crew.

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

* Adjust some punctuation and capitalization.

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

* fix pkg_file path detection

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

* Only use CREW_LOCAL_REPO_ROOT file if it exists.

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

* suggested changes

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

* Fix ESSENTIAL_PACKAGE dependency expansion.

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

* Fix essential_deps logic.

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

* Adjust remove logic to return quietly if in_upgrade, else exit 1, and also properly figure out essential_packages list.

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

* Fix docopt so options like '-d' work.

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

* Add suggested changes for testing, add testing file for remove.rb, also in testing.

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

* fixup

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

* more testing

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

* Move recursive package function to package.rb

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

* Adjust function name.

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

* simplify

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

* simplify

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

* Use File.mtime for @last_update_check as per suggestion by @Zopolis4.

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

* Move essential package determination to crew:generate_compatible.

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

* Move load_json and save_json to package_utils and just use symbols for the json array in remove and package_utils.

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

* Unify json usage globally.

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

* Fix one remove test.

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

* lint

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

* Update remove.rb test.

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

* cleanup

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

* Adjust remove test.

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

* Try to use new Unit Tests...

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

* Fix installsh: git config --local commands cannot be run unless the git repo is already setup.

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

* Move json functions to package_utils.

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

* Fix docopt for real, add docopt unit test, have install.sh generate ruby gem filelists just like a regular buildsystems/ruby gem install.

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

* Use CREW_META_PATH in install.sh.

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

* Cleanup remove.rb tests.

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

* Add 'crew list essential'.

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

* Add unit test for list command.

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

* Cleanup remove.rb test.

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

* Cleanup wording.

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

* Move print_deps_tree to lib/package.rb.

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

* lint

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

* Return changes from #10317

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

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
2024-08-17 14:09:09 -05:00

70 lines
2.6 KiB
Ruby

require 'json'
require_relative 'const'
require_relative 'crewlog'
class PackageUtils
def self.load_json
return JSON.load_file(File.join(CREW_CONFIG_PATH, 'device.json'), symbolize_names: true).transform_values! { |val| val.is_a?(String) ? val.to_sym : val }
end
def self.save_json(json_object)
crewlog 'Saving device.json...'
begin
File.write File.join(CREW_CONFIG_PATH, 'device.json.tmp'), JSON.pretty_generate(JSON.parse(json_object.to_json))
rescue StandardError
puts 'Error writing updated packages json file!'.lightred
abort
end
# Copy over original if the write to the tmp file succeeds.
FileUtils.cp("#{CREW_CONFIG_PATH}/device.json.tmp", File.join(CREW_CONFIG_PATH, 'device.json')) && FileUtils.rm("#{CREW_CONFIG_PATH}/device.json.tmp")
end
def self.installed?(pkg_name)
return load_json[:installed_packages].any? { |elem| elem[:name] == pkg_name }
end
def self.compatible?(pkg)
return pkg.compatibility.casecmp?('all') || pkg.compatibility.include?(ARCH)
end
def self.get_url(pkg, build_from_source: false)
if !build_from_source && pkg.binary_sha256&.key?(ARCH.to_sym)
return "https://gitlab.com/api/v4/projects/26210301/packages/generic/#{pkg.name}/#{pkg.version}_#{ARCH}/#{pkg.name}-#{pkg.version}-chromeos-#{ARCH}.#{pkg.binary_compression}"
elsif pkg.source_url.is_a?(Hash) && pkg.source_url&.key?(ARCH.to_sym)
return pkg.source_url[ARCH.to_sym]
else
return pkg.source_url
end
end
def self.get_sha256(pkg, build_from_source: false)
if !build_from_source && pkg.binary_sha256&.key?(ARCH.to_sym)
return pkg.binary_sha256[ARCH.to_sym]
elsif pkg.source_sha256.is_a?(Hash) && pkg.source_sha256&.key?(ARCH.to_sym)
return pkg.source_sha256[ARCH.to_sym]
else
return pkg.source_sha256
end
end
def self.get_clean_version(pkg_version)
# Trim kde- suffixes in qt5 packages so nothing else gets confused.
pkg_version.delete_prefix!('kde-')
# Delete -py3.12, futureproofed until Python 4
pkg_version.gsub!(/-py3\.\d{2}/, '')
# Delete -perl 5.40, futureproofed until Perl 5.100
pkg_version.gsub!(/-perl5\.\d{2}/, '')
# Delete -llvm18, futureproofed until llvm 100
pkg_version.gsub!(/-llvm\d{2}/, '')
# Delete -glibc2.39, or whatever the system glibc is.
pkg_version.delete_suffix!("-glibc#{LIBC_VERSION}")
# Delete git version tags (1.2.4-qnd73k6), avoiding overmatching and hitting things that arent git hashtags.
pkg_version.gsub!(/-[\w]{7}$/, '')
# Delete -icu75.1, futureproofed until icu 100
pkg_version.gsub!(/-icu\d{2}\.\d/, '')
return pkg_version
end
end