mirror of
https://github.com/chromebrew/chromebrew.git
synced 2026-01-10 07:57:59 -05:00
217 lines
5.5 KiB
Ruby
Executable File
217 lines
5.5 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
require 'find'
|
|
require 'net/http'
|
|
require 'uri'
|
|
require 'digest/sha1'
|
|
require 'json'
|
|
require 'fileutils'
|
|
|
|
@command = ARGV[0]
|
|
@pkgName = ARGV[1]
|
|
|
|
CBREW_PREFIX = '/usr/local'
|
|
CBREW_LIB_PATH = CBREW_PREFIX + '/lib/cbrew/'
|
|
CBREW_CONFIG_PATH = CBREW_PREFIX + '/etc/cbrew/'
|
|
CBREW_BREW_DIR = CBREW_PREFIX + '/tmp/cbrew/'
|
|
|
|
$LOAD_PATH.push CBREW_LIB_PATH
|
|
|
|
@device = JSON.parse(File.read(CBREW_CONFIG_PATH + 'device.json'), symbolize_names: true)
|
|
#symbolize also values
|
|
@device.each do |key, elem|
|
|
@device[key] = @device[key].to_sym rescue @device[key]
|
|
end
|
|
|
|
def setPkg (pkgName, silent = false)
|
|
require CBREW_LIB_PATH + 'packages/' + pkgName
|
|
@pkg = Object.const_get(pkgName.capitalize)
|
|
@pkg.name = pkgName
|
|
puts "Found #{pkgName}, version #{@pkg.version}" unless silent
|
|
end
|
|
|
|
def search (pkgName, silent = false)
|
|
Find.find (CBREW_LIB_PATH + 'packages') do |filename|
|
|
return setPkg(pkgName, silent) if filename == CBREW_LIB_PATH + 'packages/' + pkgName + '.rb'
|
|
end
|
|
abort "package #{pkgName} not found :("
|
|
end
|
|
|
|
def download
|
|
if @pkg.binary_url && @pkg.binary_url.has_key?(@device[:architecture])
|
|
url = @pkg.binary_url[@device[:architecture]]
|
|
source = false
|
|
puts "Precompiled binary available, downloading..."
|
|
else
|
|
url = @pkg.source_url
|
|
source = true
|
|
puts "No precompiled binary available for your platform, downloading source..."
|
|
end
|
|
uri = URI.parse url
|
|
filename = File.basename(uri.path)
|
|
Dir.chdir CBREW_BREW_DIR do
|
|
system('wget', '--content-disposition', url)
|
|
abort 'Checksum mismatch :/ try again' unless Digest::SHA1.hexdigest( File.read("./#{filename}") ) == @pkg.binary_sha1[@device[:architecture]]
|
|
end
|
|
puts "Archive downloaded"
|
|
return {source: source, filename: filename}
|
|
end
|
|
|
|
def resolveDependenciesAndInstall
|
|
origin = @pkgName
|
|
|
|
resolveDependencies
|
|
|
|
search origin
|
|
install
|
|
end
|
|
|
|
def resolveDependencies
|
|
@dependencies = []
|
|
|
|
def pushDeps
|
|
if @pkg.dependencies
|
|
@dependencies << @pkg.dependencies
|
|
|
|
@pkg.dependencies.each do |dep|
|
|
search dep, true
|
|
pushDeps
|
|
end
|
|
end
|
|
end
|
|
|
|
pushDeps
|
|
|
|
return if @dependencies.empty?
|
|
|
|
puts "Following packages also need to be installed: "
|
|
@dependencies.flatten!.each do |dep|
|
|
print dep + " "
|
|
end
|
|
puts ""
|
|
puts "Do you agree? [Y/n]"
|
|
response = STDIN.getc
|
|
case response
|
|
when "n"
|
|
abort "No changes made."
|
|
when "\n", "y", "Y"
|
|
puts "Proceeding..."
|
|
proceed = true
|
|
else
|
|
puts "I don't understand '#{response}' :("
|
|
abort "No changes made."
|
|
end
|
|
|
|
if proceed
|
|
@dependencies.each do |dep|
|
|
search dep
|
|
install
|
|
end
|
|
end
|
|
end
|
|
|
|
def install
|
|
if @device[:installed_packages].any? { |pkg| pkg[:name] == @pkg.name }
|
|
puts "Package #{@pkg.name} already installed, skipping..."
|
|
return
|
|
end
|
|
|
|
unless @pkg.is_fake?
|
|
meta = download
|
|
if meta[:source] == true
|
|
puts "Building from source, this may take a while..."
|
|
@pkg.build
|
|
puts "Installing..."
|
|
@pkg.install
|
|
else
|
|
Dir.chdir CBREW_BREW_DIR do
|
|
puts "Unpacking archive, this may take a while..."
|
|
system "tar", "zxf", meta[:filename]
|
|
|
|
puts "Installing..."
|
|
|
|
FileUtils.mv './dlist', CBREW_CONFIG_PATH + "meta/#{@pkg.name}.directorylist"
|
|
FileUtils.mv './filelist', CBREW_CONFIG_PATH + "meta/#{@pkg.name}.filelist"
|
|
end
|
|
|
|
Dir.chdir CBREW_CONFIG_PATH do
|
|
File.open("meta/#{@pkg.name}.directorylist").each_line do |line|
|
|
system "mkdir", "-p", line.chomp
|
|
end
|
|
|
|
File.open("meta/#{@pkg.name}.filelist").each_line do |line|
|
|
Dir.chdir CBREW_BREW_DIR do
|
|
system "mv", '.' + line.chomp, line.chomp
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
#add to installed packages
|
|
@device[:installed_packages].push(name: @pkg.name, version: @pkg.version)
|
|
File.open(CBREW_CONFIG_PATH + 'device.json', 'w') do |file|
|
|
output = JSON.parse @device.to_json
|
|
file.write JSON.pretty_generate(output)
|
|
end
|
|
puts "#{@pkg.name.capitalize} installed!"
|
|
end
|
|
|
|
def remove
|
|
unless @device[:installed_packages].any? { |pkg| pkg[:name] == @pkg.name }
|
|
puts "Package #{@pkg.name} isn't installed."
|
|
return
|
|
end
|
|
|
|
unless @pkg.is_fake?
|
|
Dir.chdir CBREW_CONFIG_PATH do
|
|
File.open("meta/#{@pkg.name}.filelist").each_line do |line|
|
|
begin
|
|
File.unlink '.' + line.chomp
|
|
rescue => exception #swallow exception
|
|
end
|
|
end
|
|
|
|
File.readlines("meta/#{@pkg.name}.directorylist").reverse.each do |line|
|
|
begin
|
|
Dir.rmdir '.' + line.chomp
|
|
rescue => exception #swallow exception
|
|
end
|
|
end
|
|
|
|
File.unlink "meta/#{@pkg.name}.filelist"
|
|
File.unlink "meta/#{@pkg.name}.directorylist"
|
|
end
|
|
end
|
|
|
|
#remove from installed packages
|
|
@device[:installed_packages].each do |elem|
|
|
@device[:installed_packages].delete elem if elem[:name] == @pkg.name
|
|
end
|
|
File.open(CBREW_CONFIG_PATH + 'device.json', 'w') do |file|
|
|
out = JSON.parse @device.to_json
|
|
file.write JSON.pretty_generate(out)
|
|
end
|
|
puts "#{@pkgName.capitalize} removed!"
|
|
end
|
|
|
|
case @command
|
|
when "search"
|
|
search @pkgName
|
|
when "download"
|
|
search @pkgName
|
|
download
|
|
when "install"
|
|
search @pkgName
|
|
resolveDependenciesAndInstall
|
|
when "remove"
|
|
search @pkgName
|
|
remove
|
|
when nil
|
|
puts "Chromebrew, version 0.1"
|
|
puts "Usage: cbrew [command] [package]"
|
|
puts "Available commands: search, download, install, remove"
|
|
else
|
|
puts "I have no idea how to do #{@command} :("
|
|
puts "Available commands: search, download, install, remove"
|
|
end
|