This repository has been archived on 2022-01-17. You can view files and clone it, but cannot push or open issues/pull-requests.
packaging/src/backends/weird.cr

88 lines
2.4 KiB
Crystal

require "openssl"
require "../backends.cr"
class WeirdBackend < Package::Backend::Packaging
def initialize
@name = "weird"
end
def package(context : Package::Context, package : Package::Package) : Bool
destination_package_file = "#{context.packages_directory}/#{package.name}-#{package.version}-#{package.release}.weird"
tmpdir = package.recipe.working_directory
fake_root = package.fake_root_directory
context.detail "Archiving package content"
context.run fake_root, "tar", ["cJf", "#{tmpdir}/data.tar.xz", "."]
context.detail "Generating control.spec"
generate_spec package, "#{tmpdir}/control.spec"
context.detail "Generating manifest"
generate_manifest context, package, "#{tmpdir}/manifest"
context.detail "Assembling '#{destination_package_file}'"
r = context.run tmpdir, "tar", [
"cf", destination_package_file,
"control.spec", "manifest", "data.tar.xz"
]
r.exit_status == 0
end
def generate_spec(package : Package::Package, file_name : String)
du = `du -sk #{package.fake_root_directory}`
size = du.sub(/[ \t].*/, "").to_i * 1024
file = File.open file_name, "w"
file.puts "name: #{package.name}"
file.puts "version: #{package.version}"
file.puts "release: #{package.release}"
file.puts
file.puts "size: #{size}"
file.puts "origin: #{package.recipe.name}"
file.puts "slot: #{package.prefix}"
file.puts
file.puts "url: #{package.url}"
file.puts "description: #{package.description}"
file.puts
file.puts "dependencies: #{package.dependencies.join ", "}"
file.puts "conflicts: #{package.conflicts.join ", "}"
file.puts "provides: #{package.provides.join ", "}"
file.close
end
def generate_manifest(context : Package::Context, package : Package::Package, file_name : String)
old_pwd = Dir.current
manifest = File.open(file_name, "w").not_nil!
Dir.cd package.fake_root_directory
FileUtils.find "." do |path|
file = path.lchop
if File.symlink? path
manifest.puts [file, "symlink", File.readlink(path)].join ':'
elsif File.directory? path
manifest.puts [file, "directory"].join ':'
elsif File.info?(path).try &.file?
digest = OpenSSL::Digest.new("sha256").file(path).hexdigest
manifest.puts [file, "file", digest].join ':'
else
manifest.puts [file, "other"].join ':'
end
end
manifest.close
ensure
Dir.cd old_pwd.not_nil!
end
end