Check-in [fd4ea6c3d6]
Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | add doc comments |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
fd4ea6c3d6a98aabb5ff9edd5b55f822 |
User & Date: | jls@semicomplete.com 2012-03-17 23:12:35 |
Context
2012-03-19
| ||
05:55 | Add package scripts spec to rpm check-in: 343caae46d user: jls@semicomplete.com tags: trunk | |
2012-03-17
| ||
23:12 | add doc comments check-in: fd4ea6c3d6 user: jls@semicomplete.com tags: trunk | |
23:12 | add more default specs check-in: 5013cad036 user: jls@semicomplete.com tags: trunk | |
Changes
Changes to lib/fpm/package/dir.rb.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | require "fpm/package" require "backports" require "fileutils" require "find" require "socket" class FPM::Package::Dir < FPM::Package private def input(path) @logger.debug("Copying", :input => path) @logger["method"] = "input" ::Dir.chdir(@attributes[:chdir] || ".") do if @attributes[:prefix] clone(path, File.join(staging_path, @attributes[:prefix])) else clone(path, staging_path) end 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 @logger.remove("method") end # def input def output(dir) dir = File.expand_path(dir) ::Dir.chdir(staging_path) do @logger["method"] = "output" clone(".", dir) end ensure | > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | require "fpm/package" require "backports" require "fileutils" require "find" require "socket" # 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. class FPM::Package::Dir < FPM::Package private # Add a new path to this 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") def input(path) @logger.debug("Copying", :input => path) @logger["method"] = "input" ::Dir.chdir(@attributes[:chdir] || ".") do if @attributes[:prefix] clone(path, File.join(staging_path, @attributes[:prefix])) else clone(path, staging_path) end 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 # def input # Output this package to the given directory. def output(dir) dir = File.expand_path(dir) ::Dir.chdir(staging_path) do @logger["method"] = "output" clone(".", dir) end ensure |
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 68 69 | Find.find(source).each do |file| next if source == file && File.directory?(file) # ignore the directory itself target = File.join(destination, file) copy(file, target) end end # def clone def copy(source, destination) directory = File.dirname(destination) if !File.directory?(directory) FileUtils.mkdir_p(directory) end # Create a directory if this path is a directory | > > > | 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | Find.find(source).each do |file| next if source == file && File.directory?(file) # ignore the directory itself target = File.join(destination, file) copy(file, target) end end # def clone # Copy, recursively, from source to destination. # # Files will be hardlinked if possible, but copied otherwise. def copy(source, destination) directory = File.dirname(destination) if !File.directory?(directory) FileUtils.mkdir_p(directory) end # Create a directory if this path is a directory |
︙ | ︙ |
Changes to lib/fpm/package/pear.rb.
1 2 3 4 5 6 | require "fpm/namespace" require "fpm/package" require "fileutils" require "fpm/util" class FPM::Package::PEAR < FPM::Package | > > > | | > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | require "fpm/namespace" require "fpm/package" require "fileutils" require "fpm/util" # This provides PHP PEAR package support. # # This provides input support, but not output support. class FPM::Package::PEAR < FPM::Package option "--package-name-prefix", "PREFIX", "Name prefix for pear package", :default => "php-pear" # Input a PEAR package. # # The parameter is a PHP PEAR package name. # # Attributes that affect behavior here: # * :prefix - changes the install root, default is /usr/share # * :pear_package_name_prefix - changes the def input(input_package) if !program_in_path?("pear") raise ExecutableNotFound.new("pear") end # Create a temporary config file @logger.debug("Creating pear config file") config = File.expand_path(build_path("pear.config")) installroot = attributes[:prefix] || "/usr/share" safesystem("pear", "config-create", staging_path(installroot), config) @logger.info("Fetching package information", :package => input_package) pear_cmd = "pear -c #{config} remote-info #{input_package}" name = %x{#{pear_cmd} | sed -ne '/^Package\s*/s/^Package\s*//p'}.chomp self.name = "#{attributes[:pear_package_name_prefix]}-#{name}" self.version = %x{#{pear_cmd} | sed -ne '/^Latest\s*/s/^Latest\s*//p'}.chomp self.description = %x{#{pear_cmd} | sed -ne '/^Summary\s*/s/^Summary\s*//p'}.chomp @logger.info("Installing pear package", :package => input_package, :directory => staging_path) ::Dir.chdir(staging_path) do safesystem("pear", "-c", config, "install", "-n", "-f", "-P", ".", |
︙ | ︙ |
Changes to lib/fpm/package/python.rb.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | require "fpm/namespace" require "fpm/package" require "fpm/util" require "rubygems/package" require "rubygems" require "fileutils" require "tmpdir" require "json" class FPM::Package::Python < FPM::Package # Flags '--foo' will be accessable as attributes[:python_foo] option "--bin", "PYTHON_EXECUTABLE", "The path to the python executable you wish to run.", :default => "python" option "--easyinstall", "EASYINSTALL_EXECUTABLE", "The path to the easy_install executable tool", :default => "easy_install" option "--pypi", "PYPI_URL", | > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | require "fpm/namespace" require "fpm/package" require "fpm/util" require "rubygems/package" require "rubygems" require "fileutils" require "tmpdir" require "json" # Support for python packages. # # This supports input, but not output. # # Example: # # # Download the django python package: # pkg = FPM::Package::Python.new # pkg.input("Django") # class FPM::Package::Python < FPM::Package # Flags '--foo' will be accessable as attributes[:python_foo] option "--bin", "PYTHON_EXECUTABLE", "The path to the python executable you wish to run.", :default => "python" option "--easyinstall", "EASYINSTALL_EXECUTABLE", "The path to the easy_install executable tool", :default => "easy_install" option "--pypi", "PYPI_URL", |
︙ | ︙ | |||
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | "name with.", :default => "python" option "--fix-name", :flag, "Should the target package name be prefixed?", :default => true option "--fix-dependencies", :flag, "Should the package dependencies be " \ "prefixed?", :default => true def input(package) path_to_package = download_if_necessary(package, version) if File.directory?(path_to_package) setup_py = File.join(path_to_package, "setup.py") else setup_py = path_to_package end if !File.exists?(setup_py) @logger.error("Could not find 'setup.py'", :path => setup_py) raise "Unable to find python package; tried #{setup_py}" end load_package_info(setup_py) install_to_staging(setup_py) end # def input def download_if_necessary(package, version=nil) path = package # If it's a path, assume local build. if File.directory?(path) or (File.exists?(path) and File.basename(path) == "setup.py") return path end @logger.info("Trying to download", :package => package) | > > > > > > > > > > > > > | 37 38 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 | "name with.", :default => "python" option "--fix-name", :flag, "Should the target package name be prefixed?", :default => true option "--fix-dependencies", :flag, "Should the package dependencies be " \ "prefixed?", :default => true private # Input a package. # # The 'package' can be any of: # # * A name of a package on pypi (ie; easy_install some-package) # * The path to a directory containing setup.py # * The path to a setup.py def input(package) path_to_package = download_if_necessary(package, version) if File.directory?(path_to_package) setup_py = File.join(path_to_package, "setup.py") else setup_py = path_to_package end if !File.exists?(setup_py) @logger.error("Could not find 'setup.py'", :path => setup_py) raise "Unable to find python package; tried #{setup_py}" end load_package_info(setup_py) install_to_staging(setup_py) end # def input # Download the given package if necessary. If version is given, that version # will be downloaded, otherwise the latest is fetched. def download_if_necessary(package, version=nil) # TODO(sissel): this should just be a 'download' method, the 'if_necessary' # part should go elsewhere. path = package # If it's a path, assume local build. if File.directory?(path) or (File.exists?(path) and File.basename(path) == "setup.py") return path end @logger.info("Trying to download", :package => package) |
︙ | ︙ | |||
75 76 77 78 79 80 81 82 83 84 85 86 87 88 | dirs = ::Dir.glob(File.join(target, "*")) if dirs.length != 1 raise "Unexpected directory layout after easy_install. Maybe file a bug? The directory is #{build_path}" end return dirs.first end # def download def load_package_info(setup_py) if !attributes[:python_package_prefix].nil? attributes[:python_package_name_prefix] = attributes[:python_package_prefix] end # Add ./pyfpm/ to the python library path pylib = File.expand_path(File.dirname(__FILE__)) | > | 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | dirs = ::Dir.glob(File.join(target, "*")) if dirs.length != 1 raise "Unexpected directory layout after easy_install. Maybe file a bug? The directory is #{build_path}" end return dirs.first end # def download # Load the package information like name, version, dependencies. def load_package_info(setup_py) if !attributes[:python_package_prefix].nil? attributes[:python_package_name_prefix] = attributes[:python_package_prefix] end # Add ./pyfpm/ to the python library path pylib = File.expand_path(File.dirname(__FILE__)) |
︙ | ︙ | |||
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | # prepending the package name prefix. return [attributes[:python_package_name_prefix], name.gsub(/^python-/, "")].join("-") else return [attributes[:python_package_name_prefix], name].join("-") end end # def fix_name def install_to_staging(setup_py) dir = File.dirname(setup_py) # Some setup.py's assume $PWD == current directory of setup.py, so let's # chdir first. ::Dir.chdir(dir) do # Install with a specific prefix if requested if attributes[:prefix] safesystem(attributes[:python_bin], "setup.py", "install", "--prefix", File.join(staging_path, attributes[:prefix])) else # Otherwise set the root in staging_path # TODO(sissel): there needs to be a way to force safesystem(attributes[:python_bin], "setup.py", "install", "--root", staging_path) end end end # def install_to_staging end # class FPM::Package::Python | > > > | 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | # prepending the package name prefix. return [attributes[:python_package_name_prefix], name.gsub(/^python-/, "")].join("-") else return [attributes[:python_package_name_prefix], name].join("-") end end # def fix_name # Install this package to the staging directory def install_to_staging(setup_py) dir = File.dirname(setup_py) # Some setup.py's assume $PWD == current directory of setup.py, so let's # chdir first. ::Dir.chdir(dir) do # Install with a specific prefix if requested if attributes[:prefix] safesystem(attributes[:python_bin], "setup.py", "install", "--prefix", File.join(staging_path, attributes[:prefix])) else # Otherwise set the root in staging_path # TODO(sissel): there needs to be a way to force safesystem(attributes[:python_bin], "setup.py", "install", "--root", staging_path) end end end # def install_to_staging public(:input) end # class FPM::Package::Python |