class FPM::Package::FreeBSD

Constants

SCRIPT_MAP

Public Instance Methods

add_path(tar, tar_path, path) click to toggle source
# File lib/fpm/package/freebsd.rb, line 117
def add_path(tar, tar_path, path)
  stat = File.lstat(path)
  if stat.directory?
    tar.mkdir(tar_path, stat.mode)
  elsif stat.symlink?
    tar.add_symlink(tar_path, File.readlink(path), stat.mode)
  else
    tar.add_file_simple(tar_path, stat.mode, stat.size) do |io|
      File.open(path) do |fd|
        chunk = nil
        size = 0
        while chunk = fd.read(16384) do
          size += io.write(chunk)
        end
        if size != stat.size
          raise "Failed to add #{path} to the archive; expected to " +
                "write #{stat.size} bytes, only wrote #{size}"
        end
      end
    end # tar.tar.add_file_simple
  end
end
architecture() click to toggle source

Handle architecture naming conversion: <osname>:<osversion>:<arch>:<wordsize>

# File lib/fpm/package/freebsd.rb, line 94
def architecture
  osname    = %x{uname -s}.chomp
  osversion = %x{uname -r}.chomp.split('.').first

  # Essentially because no testing on other platforms
  arch = 'x86'

  wordsize = case @architecture
  when nil, 'native'
    %x{getconf LONG_BIT}.chomp # 'native' is current arch
  when 'arm64'
    '64'
  when 'amd64'
    '64'
  when 'i386'
    '32'
  else
    %x{getconf LONG_BIT}.chomp # default to native, the current arch
  end

  return [osname, osversion, arch, wordsize].join(':')
end
output(output_path) click to toggle source
# File lib/fpm/package/freebsd.rb, line 19
def output(output_path)
  output_check(output_path)

  # Build the packaging metadata files.
  checksums = {}
  self.files.each do |f|
    path = staging_path(f)
    if File.symlink?(path)
      checksums[f] = "-"
    elsif File.file?(path)
      checksums[f] = Digest::SHA256.file(path).hexdigest
    end
  end

  pkg_origin = attributes[:freebsd_origin]
  if pkg_origin == "fpm/<name>"  # fill in default
    pkg_origin = "fpm/#{name}"
  end

  # Follow similar rules to these used in ``to_s_fullversion`` method.
  # FIXME: maybe epoch should also be introduced somehow ("#{version},#{epoch})?
  #        should it go to pkgdata["version"] or to another place?
  # https://www.freebsd.org/doc/en/books/porters-handbook/makefile-naming.html
  pkg_version = (iteration and (iteration.to_i > 0)) ?  "#{version}-#{iteration}" : "#{version}"

  pkgdata = {
    "arch" => architecture,
    "name" => name,
    "version" => pkg_version,
    "comment" => description,
    "desc" => description,
    "origin" => pkg_origin,
    "maintainer" => maintainer,
    "www" => url,
    # prefix is required, but it doesn't seem to matter
    "prefix" => "/",
  }

  # Write +COMPACT_MANIFEST, without the "files" section.
  File.open(staging_path("+COMPACT_MANIFEST"), "w+") do |file|
    file.write(pkgdata.to_json + "\n")
  end

  # Populate files + checksums, then write +MANIFEST.
  pkgdata["files"] = {}
  checksums.each do |f, shasum|
    # pkg expands % URL-style escapes, so make sure to escape % as %25
    pkgdata["files"]["/" + f.gsub("%", "%25")] = shasum
  end

  # Populate scripts
  pkgdata["scripts"] = {}
  scripts.each do |name, data|
    pkgdata["scripts"][SCRIPT_MAP[name]] = data
  end

  File.open(staging_path("+MANIFEST"), "w+") do |file|
    file.write(pkgdata.to_json + "\n")
  end

  file_list = File.new(build_path("file_list"), "w")
  files.each do |i|
    file_list.puts(i)
  end
  file_list.close

  # Create the .txz package archive from the files in staging_path.
  # We use --files-from here to keep the tar entries from having `./` as the prefix.
  # This is done as a best effor to mimic what FreeBSD packages do, having everything at the top-level as
  # file names, like "+MANIFEST" instead of "./+MANIFEST"
  safesystem("tar", "-Jcf", output_path, "-C", staging_path, "--files-from", build_path("file_list"), "--transform", 's|^\([^+]\)|/\1|')
end
to_s(format=nil) click to toggle source
Calls superclass method FPM::Package#to_s
# File lib/fpm/package/freebsd.rb, line 148
def to_s(format=nil)
  return super(format.nil? ? "NAME-FULLVERSION.EXTENSION" : format)
end
to_s_extension() click to toggle source
# File lib/fpm/package/freebsd.rb, line 140
def to_s_extension; "txz"; end
to_s_fullversion() click to toggle source
# File lib/fpm/package/freebsd.rb, line 142
def to_s_fullversion()
  # iteration (PORTREVISION on FreeBSD) shall be appended only(?) if non-zero.
  # https://www.freebsd.org/doc/en/books/porters-handbook/makefile-naming.html
  (iteration and (iteration.to_i > 0)) ?  "#{version}_#{iteration}" : "#{version}"
end