Installations from repositories.
parent
e458df0afd
commit
c8228e95f7
|
@ -26,6 +26,8 @@ begin
|
||||||
context.install args.map { |s| Package::Atom.from_string s }
|
context.install args.map { |s| Package::Atom.from_string s }
|
||||||
when "remove"
|
when "remove"
|
||||||
context.remove args.map { |s| Package::Atom.from_string s }
|
context.remove args.map { |s| Package::Atom.from_string s }
|
||||||
|
when "update"
|
||||||
|
context.update_repository_cache
|
||||||
end
|
end
|
||||||
rescue e : Package::CollisionException
|
rescue e : Package::CollisionException
|
||||||
context.error e
|
context.error e
|
||||||
|
|
|
@ -20,7 +20,11 @@ class Package::Atom
|
||||||
|
|
||||||
# FIXME: What if other data are provided?
|
# FIXME: What if other data are provided?
|
||||||
def to_s
|
def to_s
|
||||||
"#{name} :#{slot}"
|
if slot
|
||||||
|
"#{name} :#{slot}"
|
||||||
|
else
|
||||||
|
name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# FIXME: Parse slot syntax, parse operators.
|
# FIXME: Parse slot syntax, parse operators.
|
||||||
|
|
|
@ -18,12 +18,26 @@ class Package::Configuration
|
||||||
specs.sections.each do |section|
|
specs.sections.each do |section|
|
||||||
case section.name
|
case section.name
|
||||||
when "repository"
|
when "repository"
|
||||||
@repositories << Repository.new(
|
repository_url = section.options[0]
|
||||||
File.read("#{section.options[0]}/repository.spec"),
|
repository_uri = URI.parse repository_url
|
||||||
section.options[0]
|
spec_url = "#{repository_url}/repository.spec"
|
||||||
)
|
spec_uri = URI.parse spec_url
|
||||||
|
|
||||||
|
if spec_uri.scheme == "" || spec_uri.scheme == "file"
|
||||||
|
@repositories << Repository.new(
|
||||||
|
File.read(spec_uri.path),
|
||||||
|
repository_uri
|
||||||
|
)
|
||||||
|
else
|
||||||
|
@repositories << Repository.new(repository_uri)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def download_index(context : Context)
|
||||||
|
cache = context.get_indices_cache
|
||||||
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ class Package::Context < Weird::Context
|
||||||
def root=(@root)
|
def root=(@root)
|
||||||
@database.root = "#{@root}#{Database::PATH_FROM_ROOT}"
|
@database.root = "#{@root}#{Database::PATH_FROM_ROOT}"
|
||||||
@configuration = Configuration.new "#{@root}#{Configuration::PATH_FROM_ROOT}"
|
@configuration = Configuration.new "#{@root}#{Configuration::PATH_FROM_ROOT}"
|
||||||
|
@configuration.repositories.each &.import_index(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def install(package : Package, data_directory : String)
|
def install(package : Package, data_directory : String)
|
||||||
|
@ -97,7 +98,7 @@ class Package::Context < Weird::Context
|
||||||
tuple = get_installable atom
|
tuple = get_installable atom
|
||||||
|
|
||||||
if tuple.nil?
|
if tuple.nil?
|
||||||
raise Exception.new "Could not find '#{atom}'."
|
raise Exception.new "Could not find '#{atom.to_s}'."
|
||||||
end
|
end
|
||||||
|
|
||||||
packages_to_install << tuple
|
packages_to_install << tuple
|
||||||
|
@ -117,11 +118,10 @@ class Package::Context < Weird::Context
|
||||||
download tuple
|
download tuple
|
||||||
end
|
end
|
||||||
|
|
||||||
# FIXME: Install everything here.
|
|
||||||
packages_to_install.reverse.each do |tuple|
|
packages_to_install.reverse.each do |tuple|
|
||||||
repository, package = tuple
|
repository, package = tuple
|
||||||
|
|
||||||
url = "#{repository.url}/#{package.file_path}"
|
url = "#{repository.uri.path}/#{package.file_path}"
|
||||||
|
|
||||||
install url
|
install url
|
||||||
end
|
end
|
||||||
|
@ -133,17 +133,23 @@ class Package::Context < Weird::Context
|
||||||
warning "(unimplemented) upgrade(Atom)"
|
warning "(unimplemented) upgrade(Atom)"
|
||||||
end
|
end
|
||||||
|
|
||||||
# XXX: Unimplemented.
|
|
||||||
def download(tuple : Tuple(Repository, Package))
|
def download(tuple : Tuple(Repository, Package))
|
||||||
repository, package = tuple
|
repository, package = tuple
|
||||||
|
|
||||||
uri = URI.parse package.file_path
|
uri = repository.uri
|
||||||
|
|
||||||
if uri.scheme == "http" || uri.scheme == "https"
|
if uri.scheme == "http" || uri.scheme == "https"
|
||||||
FileUtils.mkdir_p @cache_directory
|
FileUtils.mkdir_p @cache_directory
|
||||||
|
|
||||||
pp package.file_path
|
destination = "#{get_cache_directory}/#{package.file_path}"
|
||||||
#File.write HTTP::Client.get
|
full_url = "#{repository.uri.to_s}/#{package.file_path}"
|
||||||
|
|
||||||
|
debug "Downloading '#{package.file_path}'"
|
||||||
|
|
||||||
|
# FIXME: Check errors, probably. :|
|
||||||
|
File.write destination, HTTP::Client.get(full_url).body
|
||||||
|
|
||||||
|
package.file_path = destination
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -228,6 +234,9 @@ class Package::Context < Weird::Context
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_repository_cache
|
def update_repository_cache
|
||||||
|
@configuration.repositories.each do |repository|
|
||||||
|
repository.download_index self
|
||||||
|
end
|
||||||
end
|
end
|
||||||
def download_to_cache(atom : Atom, url : String)
|
def download_to_cache(atom : Atom, url : String)
|
||||||
end
|
end
|
||||||
|
@ -240,5 +249,18 @@ class Package::Context < Weird::Context
|
||||||
FileUtils.mkdir_p directory
|
FileUtils.mkdir_p directory
|
||||||
directory
|
directory
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_indices_cache
|
||||||
|
directory = "#{@root}/var/cache/package"
|
||||||
|
FileUtils.mkdir_p directory
|
||||||
|
directory
|
||||||
|
end
|
||||||
|
|
||||||
|
# Should this really be the same place? :shrug:
|
||||||
|
def get_cache_directory
|
||||||
|
directory = "#{@root}/var/cache/package"
|
||||||
|
FileUtils.mkdir_p directory
|
||||||
|
directory
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Package::Package
|
||||||
|
|
||||||
getter dependencies = Array(Atom).new
|
getter dependencies = Array(Atom).new
|
||||||
|
|
||||||
getter file_path : String
|
property file_path : String
|
||||||
|
|
||||||
def initialize(@file_path)
|
def initialize(@file_path)
|
||||||
specs = SpecParser.parse File.read file_path
|
specs = SpecParser.parse File.read file_path
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
require "uri"
|
||||||
|
require "http"
|
||||||
|
|
||||||
require "specparser"
|
require "specparser"
|
||||||
|
|
||||||
require "./exception.cr"
|
require "./exception.cr"
|
||||||
|
@ -17,11 +20,19 @@ class Package::Package
|
||||||
end
|
end
|
||||||
|
|
||||||
class Package::Repository < Array(Package::Package)
|
class Package::Repository < Array(Package::Package)
|
||||||
getter url : String
|
getter uri : URI
|
||||||
|
|
||||||
def initialize(index_body : String, @url)
|
def initialize(@uri)
|
||||||
|
initialize
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(index_body : String, @uri)
|
||||||
initialize
|
initialize
|
||||||
|
|
||||||
|
import_index index_body
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_index(index_body : String)
|
||||||
specs = SpecParser.parse index_body
|
specs = SpecParser.parse index_body
|
||||||
|
|
||||||
specs.sections.each do |section|
|
specs.sections.each do |section|
|
||||||
|
@ -31,5 +42,32 @@ class Package::Repository < Array(Package::Package)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private def cache_file
|
||||||
|
Base64.strict_encode @uri.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def download_index(context : Context)
|
||||||
|
cache = context.get_indices_cache
|
||||||
|
|
||||||
|
if @uri.scheme == "http" || @uri.scheme == "https"
|
||||||
|
context.info "Updating '#{@uri}'"
|
||||||
|
index = HTTP::Client.get("#{@uri.to_s}/repository.spec").body
|
||||||
|
|
||||||
|
File.write "#{cache}/#{cache_file}.spec", index
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_index(context : Context)
|
||||||
|
cache = context.get_indices_cache
|
||||||
|
|
||||||
|
if @uri.scheme == "http" || @uri.scheme == "https"
|
||||||
|
cache_path = "#{cache}/#{cache_file}.spec"
|
||||||
|
|
||||||
|
if File.exists? cache_path
|
||||||
|
import_index File.read cache_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue