Class: FPM::Package::Dir

Inherits:
FPM::Package show all
Defined in:
lib/fpm/package/dir.rb

Overview

A directory package.

This class supports both input and output. As a note, 'output' will only emit the files, not any metadata. This is an effective way to extract another package type.

Instance Attribute Summary

Attributes inherited from FPM::Package

#architecture, #attributes, #attrs, #category, #config_files, #conflicts, #dependencies, #description, #directories, #epoch, #iteration, #license, #maintainer, #name, #provides, #replaces, #scripts, #url, #vendor, #version

Instance Method Summary collapse

Methods inherited from FPM::Package

apply_options, #build_path, #cleanup, #cleanup_build, #cleanup_staging, #convert, #converted_from, default_attributes, #edit_file, #files, inherited, #initialize, option, #script, #staging_path, #to_s, #type, type, types

Methods included from Util

#ar_cmd, #ar_cmd_deterministic?, #copied_entries, #copy_entry, #copy_metadata, #default_shell, #execmd, #expand_pessimistic_constraints, #logger, #mknod_w, #program_exists?, #program_in_path?, #safesystem, #safesystemout, #tar_cmd, #tar_cmd_supports_sort_names_and_set_mtime?

Constructor Details

This class inherits a constructor from FPM::Package

Instance Method Details

#input(path) ⇒ Object

Add a new path to this package.

A special handling of the path occurs if it includes a '=' symbol. You can say “source=destination” and it will copy files from that source to the given destination in the package.

This lets you take a local directory and map it to the desired location at packaging time. Such as: “./src/redis-server=/usr/local/bin” will make the local file ./src/redis-server appear as /usr/local/bin/redis-server in your package.

If the path is a directory, it is copied recursively. The behavior of the copying is modified by the :chdir and :prefix attributes.

If :prefix is set, the destination path is prefixed with that value. If :chdir is set, the current directory is changed to that value during the copy.

Example: Copy /etc/X11 into this package as /opt/xorg/X11:

package.attributes[:prefix] = "/opt/xorg"
package.attributes[:chdir] = "/etc"
package.input("X11")

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/fpm/package/dir.rb', line 39

def input(path)
  chdir = attributes[:chdir] || "."

  # Support mapping source=dest
  # This mapping should work the same way 'rsync -a' does
  #   Meaning 'rsync -a source dest'
  #   and 'source=dest' in fpm work the same as the above rsync
  if path =~ /.=./ && !File.exists?(chdir == '.' ? path : File.join(chdir, path))
    origin, destination = path.split("=", 2)

    if File.directory?(origin) && origin[-1,1] == "/"
      chdir = chdir == '.' ? origin : File.join(chdir, origin)
      source = "."
    else
      origin_dir = File.dirname(origin)
      chdir = chdir == '.' ? origin_dir : File.join(chdir, origin_dir)
      source = File.basename(origin)
    end
  else
    source, destination = path, "/"
  end

  if attributes[:prefix]
    destination = File.join(attributes[:prefix], destination)
  end

  destination = File.join(staging_path, destination)

  logger["method"] = "input"
  begin
    ::Dir.chdir(chdir) do
      begin
        clone(source, destination)
      rescue Errno::ENOENT => e
        raise FPM::InvalidPackageConfiguration,
          "Cannot package the path '#{File.join(chdir, source)}', does it exist?"
      end
    end
  rescue Errno::ENOENT => e
    raise FPM::InvalidPackageConfiguration,
      "Cannot chdir to '#{chdir}'. Does it exist?"
  end

  # Set some defaults. This is useful because other package types
  # can include license data from themselves (rpms, gems, etc),
  # but to make sure a simple dir -> rpm works without having
  # to specify a license.
  self.license ||= "unknown"
  self.vendor ||= [ENV["USER"], Socket.gethostname].join("@")
ensure
  # Clean up any logger context we added.
  logger.remove("method")
end

#output(output_path) ⇒ Object

Output this package to the given directory.


94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/fpm/package/dir.rb', line 94

def output(output_path)
  output_check(output_path)

  output_path = File.expand_path(output_path)
  ::Dir.chdir(staging_path) do
    logger["method"] = "output"
    clone(".", output_path)
  end

  # Write the scripts, too.
  write_scripts
ensure
  logger.remove("method")
end