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
Raw Normal View History

2019-09-10 16:30:30 +02:00
require "openssl"
2019-09-06 00:39:11 +02:00
require "../backends.cr"
class WeirdBackend < Package::Backend::Packaging
def initialize
@name = "weird"
end
def package(context : Package::Context, package : Package::Package) : Bool
2019-09-06 00:39:11 +02:00
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"
2019-09-10 16:30:30 +02:00
context.detail "Generating manifest"
generate_manifest context, package, "#{tmpdir}/manifest"
2019-09-06 00:39:11 +02:00
context.detail "Assembling '#{destination_package_file}'"
r = context.run tmpdir, "tar", [
"cf", destination_package_file,
2019-09-10 16:30:30 +02:00
"control.spec", "manifest", "data.tar.xz"
2019-09-06 00:39:11 +02:00
]
r.exit_status == 0
end
def generate_spec(package : Package::Package, file_name : String)
2019-09-19 17:52:56 +02:00
du = `du -sk #{package.fake_root_directory}`
size = du.sub(/[ \t].*/, "").to_i * 1024
2019-09-06 00:39:11 +02:00
file = File.open file_name, "w"
file.puts "name: #{package.name}"
file.puts "version: #{package.version}"
file.puts "release: #{package.release}"
file.puts
2019-09-19 17:52:56 +02:00
file.puts "size: #{size}"
file.puts "origin: #{package.recipe.name}"
file.puts "slot: #{package.prefix}"
file.puts
2019-09-06 00:39:11 +02:00
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
2019-09-10 16:30:30 +02:00
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|
2019-09-14 17:44:01 +02:00
file = path.lchop
2019-09-10 16:30:30 +02:00
if File.symlink? path
2019-09-14 17:44:01 +02:00
manifest.puts [file, "symlink", File.readlink(path)].join ':'
2019-09-10 16:30:30 +02:00
elsif File.directory? path
2019-09-14 17:44:01 +02:00
manifest.puts [file, "directory"].join ':'
2019-09-10 16:30:30 +02:00
elsif File.info?(path).try &.file?
digest = OpenSSL::Digest.new("sha256").file(path).hexdigest
2019-09-14 17:44:01 +02:00
manifest.puts [file, "file", digest].join ':'
2019-09-10 16:30:30 +02:00
else
2019-09-14 17:44:01 +02:00
manifest.puts [file, "other"].join ':'
2019-09-10 16:30:30 +02:00
end
end
manifest.close
ensure
Dir.cd old_pwd.not_nil!
end
2019-09-06 00:39:11 +02:00
end