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