153 lines
3.0 KiB
Crystal
153 lines
3.0 KiB
Crystal
|
|
require "spec"
|
|
require "./src/context.cr"
|
|
require "./src/recipe.cr"
|
|
|
|
extend Package
|
|
|
|
# FIXME: recipe.clean? context autoclean?
|
|
context = Context.new()
|
|
context.packaging_backend = "apk"
|
|
|
|
recipes = [] of Package::Recipe
|
|
|
|
class SpecFileParser
|
|
def get_string?(id) : String?
|
|
entry = self.assignments[id]?
|
|
|
|
unless entry.is_a? StringContainer
|
|
nil
|
|
else
|
|
entry.value
|
|
end
|
|
end
|
|
def get_string(id) : String
|
|
entry = self.assignments[id]?
|
|
|
|
unless entry.is_a? StringContainer
|
|
raise Exception.new "`#{id}` was expected to be a string, but was a #{entry.class}."
|
|
end
|
|
|
|
entry.value
|
|
end
|
|
|
|
def get_long_string?(id) : String?
|
|
entry = self.assignments[id]?
|
|
|
|
unless entry.is_a? LongStringContainer
|
|
nil
|
|
else
|
|
entry.value
|
|
end
|
|
end
|
|
|
|
def get_string_any?(id) : String?
|
|
get_string?(id) || get_long_string?(id)
|
|
end
|
|
|
|
def get_list?(id) : Array(String)?
|
|
entry = assignments[id]?
|
|
|
|
case entry
|
|
when SpecFileParser::ArrayContainer
|
|
entry.value
|
|
when SpecFileParser::StringContainer
|
|
entry.value.split(",")
|
|
when Nil
|
|
return nil
|
|
else
|
|
raise Exception.new "`#{id}` was expected to be a list (string), but was a `#{entry.class}`"
|
|
end
|
|
end
|
|
end
|
|
|
|
class Package::Recipe
|
|
def initialize(@context, specs : SpecFileParser)
|
|
pp! specs
|
|
|
|
@name = specs.get_string "name"
|
|
@version = specs.get_string "version"
|
|
@release = specs.get_string?("release").try(&.to_i) || 1
|
|
|
|
@url = specs.get_string? "url"
|
|
@description = specs.get_string_any? "description"
|
|
@packager = specs.get_string? "packager"
|
|
@maintainer = specs.get_string? "packager"
|
|
|
|
specs.get_string_any?("configure").try do |script|
|
|
@instructions.configure << script
|
|
end
|
|
|
|
specs.get_string_any?("build").try do |script|
|
|
@instructions.build << script
|
|
end
|
|
|
|
specs.get_string_any?("install").try do |script|
|
|
@instructions.install << script
|
|
end
|
|
|
|
specs.get_list?("dependencies").try &.each do |atom|
|
|
@dependencies << atom
|
|
end
|
|
|
|
specs.get_list?("conflicts").try &.each do |atom|
|
|
@conflicts << atom
|
|
end
|
|
|
|
specs.get_list?("provides").try &.each do |atom|
|
|
@provides << atom
|
|
end
|
|
|
|
specs.get_list?("sources").try &.each do |source|
|
|
@sources << source
|
|
end
|
|
|
|
specs.get_list?("options").try &.each do |option|
|
|
match = option.match /\(.*\) *= *\(.*\)/
|
|
unless match
|
|
puts "WARNING: misformed option: #{option}"
|
|
next
|
|
end
|
|
|
|
name, value = match
|
|
|
|
puts "OPTION: #{name} -> #{value}"
|
|
|
|
@options[name] = value
|
|
end
|
|
end
|
|
end
|
|
|
|
class Package::Context
|
|
def read_recipe(filename : String)
|
|
specs = SpecFileParser.parse filename
|
|
|
|
if specs.nil?
|
|
raise Exception.new "file could not be parsed"
|
|
end
|
|
|
|
Recipe.new self, specs
|
|
end
|
|
end
|
|
|
|
pp! context.read_recipe "test.spec"
|
|
|
|
if ARGV.size == 0 || ARGV[0]? == "-h"
|
|
pp recipes.map &.name
|
|
exit 0
|
|
end
|
|
|
|
|
|
recipes.each do |recipe|
|
|
pp recipe
|
|
|
|
raise "oh no, download failed" unless recipe.download
|
|
raise "oh no, extraction failed" unless recipe.extract
|
|
|
|
raise "oh no, build failed" unless recipe.build
|
|
raise "oh no, packaging failed" unless recipe.package
|
|
|
|
recipe.clean
|
|
end
|
|
|