Full Code of jordansissel/fpm for AI

main 107c892b9b03 cached
175 files
1023.3 KB
312.4k tokens
324 symbols
1 requests
Download .txt
Showing preview only (1,076K chars total). Download the full file or copy to clipboard to get everything.
Repository: jordansissel/fpm
Branch: main
Commit: 107c892b9b03
Files: 175
Total size: 1023.3 KB

Directory structure:
gitextract_i3qht6sd/

├── .github/
│   └── workflows/
│       └── ruby.yml
├── .gitignore
├── .readthedocs.yaml
├── .rubocop.yml
├── Brewfile
├── CHANGELOG.rst
├── CODE_OF_CONDUCT.md
├── CONTRIBUTORS
├── Dockerfile
├── Gemfile
├── LICENSE
├── Makefile
├── README.rst
├── Vagrantfile
├── bin/
│   └── fpm
├── docs/
│   ├── Dockerfile
│   ├── Makefile
│   ├── Makefile.sphinx
│   ├── changelog.rst
│   ├── changelog_links.rst
│   ├── cli-reference.rst
│   ├── conf.py
│   ├── contributing.rst
│   ├── docker.rst
│   ├── generate-cli-reference.rb
│   ├── getting-started.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── packages/
│   │   ├── apk.rst
│   │   ├── cli/
│   │   │   ├── apk.rst
│   │   │   ├── cpan.rst
│   │   │   ├── deb.rst
│   │   │   ├── dir.rst
│   │   │   ├── empty.rst
│   │   │   ├── freebsd.rst
│   │   │   ├── gem.rst
│   │   │   ├── npm.rst
│   │   │   ├── osxpkg.rst
│   │   │   ├── p5p.rst
│   │   │   ├── pacman.rst
│   │   │   ├── pear.rst
│   │   │   ├── pkgin.rst
│   │   │   ├── pleaserun.rst
│   │   │   ├── puppet.rst
│   │   │   ├── python.rst
│   │   │   ├── rpm.rst
│   │   │   ├── sh.rst
│   │   │   ├── snap.rst
│   │   │   ├── solaris.rst
│   │   │   ├── tar.rst
│   │   │   ├── virtualenv.rst
│   │   │   └── zip.rst
│   │   ├── cpan.rst
│   │   ├── deb.rst
│   │   ├── dir.rst
│   │   ├── empty.rst
│   │   ├── freebsd.rst
│   │   ├── gem.rst
│   │   ├── npm.rst
│   │   ├── osxpkg.rst
│   │   ├── p5p.rst
│   │   ├── pacman.rst
│   │   ├── pear.rst
│   │   ├── pkgin.rst
│   │   ├── pleaserun.rst
│   │   ├── puppet.rst
│   │   ├── python.rst
│   │   ├── rpm.rst
│   │   ├── sh.rst
│   │   ├── snap.rst
│   │   ├── solaris.rst
│   │   ├── tar.rst
│   │   ├── virtualenv.rst
│   │   └── zip.rst
│   ├── packaging-types.rst
│   └── requirements.txt
├── fpm.gemspec
├── lib/
│   ├── fpm/
│   │   ├── command.rb
│   │   ├── errors.rb
│   │   ├── namespace.rb
│   │   ├── package/
│   │   │   ├── apk.rb
│   │   │   ├── cpan.rb
│   │   │   ├── deb.rb
│   │   │   ├── dir.rb
│   │   │   ├── empty.rb
│   │   │   ├── freebsd.rb
│   │   │   ├── gem.rb
│   │   │   ├── npm.rb
│   │   │   ├── osxpkg.rb
│   │   │   ├── p5p.rb
│   │   │   ├── pacman.rb
│   │   │   ├── pear.rb
│   │   │   ├── pkgin.rb
│   │   │   ├── pleaserun.rb
│   │   │   ├── puppet.rb
│   │   │   ├── pyfpm/
│   │   │   │   ├── __init__.py
│   │   │   │   └── parse_requires.py
│   │   │   ├── python.rb
│   │   │   ├── rpm.rb
│   │   │   ├── sh.rb
│   │   │   ├── snap.rb
│   │   │   ├── solaris.rb
│   │   │   ├── tar.rb
│   │   │   ├── virtualenv.rb
│   │   │   └── zip.rb
│   │   ├── package.rb
│   │   ├── rake_task.rb
│   │   ├── util/
│   │   │   └── tar_writer.rb
│   │   ├── util.rb
│   │   └── version.rb
│   └── fpm.rb
├── notify-failure.sh
├── requirements.txt
├── singularity.def
├── spec/
│   ├── acceptance/
│   │   └── puppet/
│   │       └── manifests/
│   │           ├── install.pp
│   │           └── remove.pp
│   ├── conversion/
│   │   └── gem_to_deb.rb
│   ├── fixtures/
│   │   ├── deb/
│   │   │   ├── meta_test
│   │   │   ├── staging/
│   │   │   │   └── etc/
│   │   │   │       └── init.d/
│   │   │   │           └── test
│   │   │   └── triggers
│   │   ├── gem/
│   │   │   └── example/
│   │   │       ├── bin/
│   │   │       │   └── example
│   │   │       └── example.gemspec
│   │   ├── mockpackage.rb
│   │   ├── python/
│   │   │   ├── METADATA
│   │   │   ├── easy_install_default.py
│   │   │   ├── requirements.txt
│   │   │   └── setup.py
│   │   ├── python-pyproject.toml/
│   │   │   └── pyproject.toml
│   │   └── virtualenv/
│   │       └── requirements.txt
│   ├── fpm/
│   │   ├── command_spec.rb
│   │   ├── package/
│   │   │   ├── cpan_spec.rb
│   │   │   ├── deb_spec.rb
│   │   │   ├── dir_spec.rb
│   │   │   ├── empty_spec.rb
│   │   │   ├── freebsd_spec.rb
│   │   │   ├── gem_spec.rb
│   │   │   ├── npm_spec.rb
│   │   │   ├── osxpkg_spec.rb
│   │   │   ├── pacman_spec.rb
│   │   │   ├── python_spec.rb
│   │   │   ├── rpm_spec.rb
│   │   │   ├── sh_spec.rb
│   │   │   ├── snap_spec.rb
│   │   │   ├── tar_spec.rb
│   │   │   └── virtualenv_spec.rb
│   │   ├── package_convert_spec.rb
│   │   ├── package_spec.rb
│   │   ├── rake_task_spec.rb
│   │   └── util_spec.rb
│   ├── requirements.txt
│   └── spec_setup.rb
├── templates/
│   ├── deb/
│   │   ├── changelog.erb
│   │   ├── deb.changes.erb
│   │   ├── ldconfig.sh.erb
│   │   ├── postinst_upgrade.sh.erb
│   │   ├── postrm_upgrade.sh.erb
│   │   ├── preinst_upgrade.sh.erb
│   │   └── prerm_upgrade.sh.erb
│   ├── deb.erb
│   ├── osxpkg.erb
│   ├── p5p_metadata.erb
│   ├── pacman/
│   │   └── INSTALL.erb
│   ├── pacman.erb
│   ├── pleaserun/
│   │   ├── generate-cleanup.sh
│   │   ├── install-path.sh
│   │   ├── install.sh
│   │   └── scripts/
│   │       ├── after-install.sh
│   │       └── before-remove.sh
│   ├── puppet/
│   │   ├── package/
│   │   │   └── remove.pp.erb
│   │   └── package.pp.erb
│   ├── rpm/
│   │   └── filesystem_list
│   ├── rpm.erb
│   ├── sh.erb
│   └── solaris.erb
└── test/
    └── vagrant.pp

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/ruby.yml
================================================
name: Ruby
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        ruby-version: ['2.7', '3.0', '3.1', '3.4']
    steps:
    - run: |
        sudo apt-get update
        sudo apt install -y libarchive-tools lintian cpanminus
    - uses: actions/checkout@v3
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby-version }}
        bundler-cache: true # runs 'bundle install' and caches installed gems automatically
    - name: Run test suite
      run: |
        if [ ! -z "$RUNNER_DEBUG" ] ; then
          DEBUG=1 bundle exec rspec -fd
        else
          bundle exec rspec
        fi
      env:
        SHELL: /usr/bin/bash


================================================
FILE: .gitignore
================================================
# vim
.*.sw[a-z]

# emacs
\#*#
*~
.#*

# package builds
*.rpm
*.deb
*.pkg.tar*

# build byproducts
build-*/*
fpm.wiki
*.gem
*.pkg

# python
*.pyc
*.egg-info

# RVM
.rvmrc
.ruby-gemset
.ruby-version

.yardoc
coverage
test/tmp
Gemfile.lock

# OS X
.DS_Store

.rbx
.vagrant

# RubyMine
.idea/

docs/_build
docs/.work

.docker-test-everything
.docker-test-minimal


================================================
FILE: .readthedocs.yaml
================================================
# https://blog.readthedocs.com/build-errors-docutils-0-18/
version: 2

build:
  os: ubuntu-24.04
  tools:
    python: "3.13"

sphinx:
  configuration: docs/conf.py

python:
  install:
  - requirements: docs/requirements.txt


================================================
FILE: .rubocop.yml
================================================
# Let's not argue over this...
StringLiterals:
  Enabled: false

# I can't find a reason for raise vs fail.
SignalException:
  Enabled: false

# I can't find a reason to prefer 'map' when 'collect' is what I mean.
# I'm collecting things from a list. Maybe someone can help me understand the
# semantics here.
CollectionMethods:
  Enabled: false

# Why do you even *SEE* trailing whitespace? Because your editor was
# misconfigured to highlight trailing whitespace, right? Maybe turn that off?
# ;)
TrailingWhitespace:
  Enabled: false

# Line length is another weird problem that somehow in the past 40 years of
# computing we don't seem to have solved. It's a display problem :(
LineLength:
  Max: 9000

# %w() vs [ "x", "y", ... ]
# The complaint is on lib/pleaserun/detector.rb's map of OS=>Runner,
# i'll ignore it.
WordArray:
  MinSize: 5

# A 20-line method isn't too bad.
MethodLength:
  Max: 20

# Hash rockets (=>) forever. Why? Not all of my hash keys are static symbols.
HashSyntax:
  EnforcedStyle: hash_rockets

# I prefer explicit return. It makes it clear in the code that the
# code author intended to return a value from a method.
RedundantReturn:
  Enabled: false

# My view on a readable case statement seems to disagree with 
# what rubocop wants and it doesn't let me configure it other than
# enable/disable.
CaseIndentation:
  Enabled: false

# module This::Module::Definition is good.
Style/ClassAndModuleChildren:
  Enabled: true
  EnforcedStyle: compact

# "in interpolation #{use.some("double quotes is ok")}"
Style/StringLiteralsInInterpolation:
  Enabled: true
  EnforcedStyle: double_quotes

# Long-block `if !something ... end` are more readable to me than `unless something ... end`
Style/NegatedIf:
  Enabled: false


================================================
FILE: Brewfile
================================================
brew 'dpkg'
brew 'rpm'
brew 'gnu-tar'
brew 'xz'


================================================
FILE: CHANGELOG.rst
================================================
Release Notes and Change Log
============================

1.17.0 (October 2, 2025)
^^^^^^^^^^^^^^^^^^^^^^^^

* python: Support modern Python project features: pyproject.toml, wheels, etc. Now, any project that can be built or installed with ``pip`` can be packaged by fpm. Previously, fpm relied on a long-deprecated features in setup.py to see a python project's metadata such as name, version, and dependencies. Fpm now uses python's package tools to identify the project's name, version, dependencies, and other information. (`#2104`_, `#2105`_, `#2040`_, `#1982`_, `#2029`_; Jordan Sissel, cwegener, amdei, gmabey)
* dir: When copying files, only use hardlinks if the original files were also hardlinks. (`#2103`_, `#2102`_; Michael Telatynski, Matthew Rathbone, Jordan Sissel). :w
  Related: https://github.com/electron-userland/electron-builder/issues/5721
* deb: bug fix: when a file given with ``--config-files <path>`` copied into the package, fpm was forgetting to mark the file as being a config file in the package, aka Debian "conffiles" (`#2027`_, `#1823`_; Alexandr Zarubkin, Kientz Arnaud)
* pacman: Now can build packages with aarch64 and arm7hf architecture (`#2017`_; Markson Hon)
* rpm: Paths with '{' and '}' characters can now be included in rpms (`#2088`_ `#2087`_; Jordan Sissel, Manish2481983)
* docs: Updated urls which pointed at rpm documentation (`#2092`_, `#2011`_, `#2054`_; André Kelpe, Natanael Arndt)
* Ruby 3.4.0 no longer gives warnings related to `ostruct` (`#2106`_, also `#2104`_ and `#2103`_; Jordan Sissel)

1.16.0 (December 8, 2024)
^^^^^^^^^^^^^^^^^^^^^^^^^

* deb: Add support for zstd compression (`#2009`_, `#2084`_; Ștefan Rusu)
* deb: Add compression level setting, ``--deb-compression-level`` (`#2036`_; Hugo Beauzée-Luyssen)
* rpm: Generate an empty rpm changelog if none is given. This should help cases where ``rpmlint`` would complain about missing a changelog entry in the rpm. (`#2041`_; Gordon Bleux)
* deb: When converting from an rpm, remove package information that is not valid on Debian systems. (`#2053`_, `#1627`; Jordan Stopford, Jamesits)
* python: Fix bug when PYTHONPATH has spaces in it (`#2062`_; Kristof Willaert)
* deb: You can now choose a different systemd directory with ``--deb-systemd-path`` (`#2063`_; Reinier Schoof)
* freebsd: OS version can now be specified with ``--freebsd-osversion``: (`#2064`_; David Newhall II)
* freebsd: Improve the 'architecture' value used by fpm to generate freebsd packages (`#2064`_, `#1880`_; David Newhall II, Matthew R Kasun)
* deb: Timer units can be given to ``--deb-systemd`` now (`#2065`_, `#1978`_; phillipp, Robert Schneider)
* rpm: When converting cpan packages, use newer ``perl-interpreter`` dependency name. To use the old dependency name ``perl``, use the flag ``--rpm-old-perl-dependency-name`` (`#2066`_, `#2085`_; Kevin Duret, Nicholas Hubbard, William N. Braswell, Jr., Jordan Sissel))
* Some errors now correctly print just an error message instead of dumping a ruby stack trace (`#2067`_; Jordan Sissel)
* python: Support modules which download as zip files (`#2068`_, `#2074`_, `#2072`_; Matt Ezell, hussainbani, hbani)
* rpm: Fix rpm build failures on Fedora 41 (`#2082`_, `#2076`_; Wayne Heaney, Antheas Kapenekakis, Romain Geissler)


1.15.1 (January 31, 2023)
^^^^^^^^^^^^^^^^^^^^^^^^^
* Ruby 3.2.0 now supported. This fixes error 'undefined method exists? for File' '(`#1981`_, `#1988`_; Nicholas Hubbard, romulasry)

1.15.0 (November 13, 2022)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* New flag ``--fpm-options-file path/to/file`` which allows you to specify additional fpm flags in an external file of your choosing. (`#1905`_, `#1902`_, `#1827`_; Jordan Sissel, Will Furnell, hjpotter92)
* deb: Periods are now accepted in package names (`#1899`_; C. Cooke)
* Fix bug where fpm would crash if ``--workdir`` pointed at a path that didn't
  exist. (`#1959`_; Jordan Sissel)
* osxpkg: this package format now supports the fpm ``--prefix`` flag(`#1909`_, `#1908`_; Jordan Sissel, mcataga)
* cpan: Fix bug where fpm would fail on certain Perl modules due to their source tarball structure (`#1940`_; Nicholas Hubbard, William N. Braswell, Jr.)
* cpan: Fix crash on certain CPAN modules where the author field was blank (`#1942`_, `#1937`_, `#1523`_, `#1528`_; Nicholas Hubbard, William N. Braswell, Jr.)
* deb: The distribution field of the debian changelog and changes files will now use the value set by ``--deb-dist`` (default is "unstable") (`#1934`_; Chabert Loïc)
* python: Fix errors in how fpm invoked ``pip``. Previously, fpm would use pip's ``--build`` flag, but this was removed a while ago, and fpm is now aware! (`#1896`_, `#1831`_, `#1893`_, `#1916`_; Jordan Sissel, Svyatogor Chuykov)
* pleaserun: Add ``--pleaserun-user`` flag. (`#1912`_; Evgeny Stambulchik)
* deb: The default ``--deb-priority`` is now "optional" instead of "extra" (`#1913`_; Chris Novakovic)
* Enable installation of fpm on older versions of ruby. This change removed ``git`` rubygem dependency. (`#1946`_, `#1923`_; Jordan Sissel, Andreas Wirooks, Ruslan Kuprieiev, jamshid, Lorenzo Castellino, Sam Hughes)
* Enable operation of fpm on very old versions of ruby (as old as Ruby 1.9.3). This changed removed ``json`` rubygem dependency. (`#1950`_, `#1949`_, `#1741`_, `#1264`_, `#1798`_, `#1800`_, `#1784`_; Jordan Sissel and many others)
* Fix bug where subprocesses could hang waiting for input (`#1955`_, `#1519`_, `#1522`_; Nicholas Hubbard, William N. Braswell, Jr.)
* Update Dockerfile to use ubuntu:20.04 (`#1935`_; Gnought)
* internal: Fix a code typo (`#1948`_; Nicholas Hubbard)
* internal tests: Support newer versions of lintian (`#1939`_, `#1907`_; Jordan Sissel)
* Improve support for Ruby 3.1.0 and newer that would previously crash with an error mentioning Psych::DisallowedClass (`#1898`_, `#1895`_; Jordan Sissel, Alexandre ZANNI)
* Improve support for Ruby 3.1.0 and newer that changed the API for ERB (`#1897`_; Jordan Sissel)

1.14.2 (March 30, 2022)
^^^^^^^^^^^^^^^^^^^^^^^
* deb: fix bug causing ``--deb-compression none`` to invoke ``tar`` incorrectly (`#1879`_; John Howard)
* rpm: Better support for paths that have spaces and mixed quotation marks in them. (`#1882`_, `#1886`_, `#1385`_; John Bollinger and Jordan Sissel)
* pacman: Fix typo preventing the use of ``--pacman-compression xz`` (`#1876`_; mszprejda)
* docs: All supported package types now have dedicated documentation pages. Some pages are small stubs and would benefit from future improvement. (`#1884`_; mcandre, Jordan Sissel)
* docs: Small but lovely documentation fixes (`#1875`_ by Corey Quinn, `#1864`_ by Geoff Beier)
* Fixed mistake causing the test suite to fail when ``rake`` wasn't available. (`#1877`_; Jordan Sissel)

1.14.1 (November 10, 2021)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix a bug that impacted fpm api usage (from other ruby programs) that caused an error "NameError: uninitialized constant FPM::Package::CPAN" when trying to output a Deb package. (`#1854`_, `#1856`_; Karol Bucek, Jordan Sissel)

1.14.0 (November 9, 2021)
^^^^^^^^^^^^^^^^^^^^^^^^^
* python: Use pip by default for fetching Python packages. This matches the Python 3 "installation" docs which recommend calling pip as ``python -m pip`` where ``python`` depends on ``--python-bin`` (default "python"). Previous default was to use `easy_install` which is no longer available on many newer systems. To use easy_install, you can set ``--no-python-internal-pip`` to revert this pip default. Further, you can specify your own pip path instead of using ``python -m pip`` with the ``--python-pip /path/to/pip`` flag. (`#1820`_, `#1821`_; Jordan Sissel)
* python: Support extras_require build markers in python packages (`#1307`_, `#1816`_; Joris Vandermeersch)
* freebsd: Fix bug which caused fpm to generate incorrect FreeBSD packages "missing leading `/`" (`#1811`_, `#1812`_, `#1844`_, `#1832`_, `#1845`_; Vlastimil Holer, Clayton Wong, Markus Ueberall, Jordan Sissel)
* deb: In order to only allow fpm to create valid packages, fpm now rejects packages with invalid "provides" (``--provides``) values. (`#1829`_, `#1825`_; Jordan Sissel, Peter Teichman)
* deb: Only show a warning about /etc and config files if there are files in /etc (`#1852`_, `#1851`_; Jordan Sissel)

* rpm: replace dash with underscore in rpm's "Release" field aka what fpm calls ``--iteration``. (`#1834`_, `#1833`_; Jordan Sissel)
* empty: `fpm -s empty ...` now defaults to "all" architecture instead of "native". (`#1850`_, `#1846`_; Jordan Sissel)
* Significant documentation improvements rewriting most of the documentation. New overview pages, full CLI flag listing, and new sections dedicated package types (rpm, cpan, deb, etc). (`#1815`_, `#1817`_, `#1838`_; Vedant K, Jordan Sissel)
* Typo fixes in documentation are always appreciated! (`#1842`_; Clayton Wong)
* fpm can now (we hope!) now be tested more easily from docker (`#1818`_, `#1682`_, `#1453`_; @directionless, Jordan Sissel, Douglas Muth)

1.13.1 (July 6, 2021)
^^^^^^^^^^^^^^^^^^^^^
* deb: The `--provides` flag now allows for versions. Previously, fpm would
  remove the version part of a provides field when generating deb packages.
  (`#1788`_, `#1803`_; Jordan Sissel, Phil Schwartz, tympanix)
* osxpkg: Update documentation to include installing `rpm` tools on OSX
  (`#1797`_; allen joslin)

1.13.0 (June 19, 2021)
^^^^^^^^^^^^^^^^^^^^^^
* Apple M1 users should now work (`#1772`_, `#1785`_, `#1786`_; Jordan Sissel)
* Removed `ffi` ruby library as a dependency. This should make it easier to support a wider range of Ruby versions (Ruby 2.2, 3.0, etc) and platforms (like arm64, Apple M1, etc) in the future. (`#1785`_, `#1786`_; Jordan Sissel)
* Now uses the correct architecture synonym for ARM 64 systems. Debian uses `arm64` as a synonym for what other systems call `aarch64` (linux kernel, RPM, Arch Linux). (`#1775`_; Steve Kamerman)
* Docs: Fix a typo in an example (`#1785`_; Zoe O'Connell)
* rpm: File paths can now contain single-quote characters (`#1774`_; Jordan Sissel)
* rpm: Use correct SPEC syntax when using --after-upgrade or similar features (`#1761`_; Jo Vandeginste. Robert Fielding)
* Ruby 3.0 support: Added `rexml` as a runtime dependency. In Ruby 2.0, `rexml` came by default, but in Ruby 3.0, `rexml` is now a bundled gem and some distributiosn do not include it by default. (`#1794`_; Jordan Sissel)
* Fix error "git: not found (Git::GitExecuteError)". Now loads `git` library only when using git features. (`#1753`_, `#1748`_, `#1751`_, `#1766`_; Jordan Sissel, Cameron Nemo, Jason Rogers, Luke Short)
* deb: Fix syntax error in `postinst` (`--after-install`) script. (`#1752`_, `#1749`_, `#1764`_; rmanus, Adam Mohammed, Elliot Murphy, kimw, Jordan Sissel)
* deb: --deb-compression now uses the same compression and file suffix on the control.tar file (`#1760`_; Philippe Poilbarbe)


1.12.0 (January 19, 2021)
^^^^^^^^^^^^^^^^^^^^^^^^^

* Pin ffi dependency to ruby ffi 1.12.x to try keeping fpm compatible with older/abandoned rubies like 2.0 and 2.1. (`#1709`_; Matt Patterson)
* deb: New flag to add 'set -e' to all scripts. `--deb-maintainerscripts-force-errorchecks` which defaults to off. (`#1697`_; Andreas Ulm)
* deb: Fix bug when converting rubygems to debs where certain constraints like `~>1` would generate a deb dependency that couldn't be satisfied. (`#1699`_; Vlastimil Holer)
* deb: Fix error 'uninitialized constant FPM::Package::Deb::Zlib' (`#1739`_, `#1740`_; Federico Lancerin)
* python: Prepend to PYTHONPATH instead of replacing it. This should help on platforms that rely heavily on PYTHONPATH, such as NixOSX (`#1711`_, `#1710`_; anarg)
* python: Add `--python-trusted-host` flag which passes `--trusted-host` flag to `pip` (`#1737`_; Vladimir Ponarevsky)
* Documentation improvements (`#1724`_, `#1738`_, `#1667`_, `#1636`_)
* Dockerfile updated to Alpine 3.12 (`#1745`_; Cameron Nemo)
* Remove the 'backports' deprecation warning (`#1727`_; Jose Galvez)
* sh: Performance improvement when printing package metadata (`#1729`_; James Logsdon, Ed Healy)
* rpm: Add support for `xzmt` compression (multithreaded xz compressor) to help when creating very large packages (several gigabytes). (`#1447`_, `#1419`_; amnobc)
* rpm: Add `--rpm-macro-expansion` flag to enable macro expansion in scripts during rpmbuild. See https://rpm.org/user_doc/scriptlet_expansion.html for more details. (`#1642`_; juliantrzeciak)
* deb: use correct control.tar filename (`#1668`_; Mike Perham)

1.11.0 (January 30, 2019)
^^^^^^^^^^^^^^^^^^^^^^^^^

* snap: Snap packages can now be created! (`#1490`_; kyrofa)
* Fix an installation problem where a dependency (childprocess) fails to install correctly. (#1592; Jordan Sissel)

1.10.2 (July 3, 2018)
^^^^^^^^^^^^^^^^^^^^^

* cpan: Fix a crash where fpm would crash trying to parse a perl version string (`#1515`_, `#1514`; Jordan Sissel, William N. Braswell, Jr)

1.10.1 (July 3, 2018)
^^^^^^^^^^^^^^^^^^^^^

* cpan: Fixes some package building by setting PERL5LIB correctly (`#1509`_, `#1511`_; William N. Braswell, Jr)
* cpan: Adds `--[no-]cpan-verbose` flag which, when set, runs `cpanm` with the `--verbose` flag (`#1511`_; William N. Braswell, Jr)

1.10.0 (May 21, 2018)
^^^^^^^^^^^^^^^^^^^^^

* Pin `ruby-xz` dependency to one which allows Ruby versions older than 2.3.0 (`#1494`_; Marat Sharafutdinov)
* Documentation improvements: `#1488`_; Arthur Burkart. `#1384`_; Justin Kolberg. `#1452`_; Anatoli Babenia.
* python: Improve support for the `~=` dependency comparison. (`#1482`_; Roman Vasilyev)
* deb: Add `--deb-generate-changes` flag to have fpm output a `.changes` file (`#1492`_; Spida)
* deb: Add `--deb-dist` flag to set the target distribution (similar to `--rpm-dist`). (`#1492`_; Spida)
* apk: Make --before-install, --before-upgrade, and --after-upgrade work correctly. (`#1422`_; Charles R. Portwood II)
* rpm: add `xzmt` for multithreaded xz compression (Amnon BC)
* rpm: fix shell function name `install` conflicting with `install` program. In
  postinst (after-install), the function is now called `_install` to avoid
  conflicting with `/usr/bin/install` (`#1434`_; Torsten Schmidt)
* rpm: Allow binary "arch dependent" files in noarch rpms (Jordan Sissel)
* - deb: --config-files ? (`#1440`_, `#1443`_; NoBodyCam)
* FPM source repo now contains a Brewfile for use with Homebrew.
* FPM source repo has a Dockerfile for invoking fpm with docker. (`#1484`_, ;Allan Lewis

1.9.3 (September 11, 2017)
^^^^^^^^^^^^^^^^^^^^^^^^^^

* fix a bug when coyping a symlink using path mapping would result in the link creating a directory to hold think. (`#1395`_; Nemanja Boric)

1.9.2 (July 29, 2017)
^^^^^^^^^^^^^^^^^^^^^

* rpm: Fix `--config-files` handling (`#1390`_, `#1391`_; Jordan Sissel)

1.9.1 (July 28, 2017) happy sysadmin day!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* Documentation improvements: `#1291`_; Pablo Castellano. `#1321`_; ge-fa. `#1309`_; jesusbagpuss. `#1349`_; Perry Stole. `#1352`_, Jordan Sissel. `#1384`_; Justin Kolberg.
* Testing improvements: `#1320`_; Rob Young. `#1266`_; Ryan Parman. `#1374`_; Thiago Figueiró.
* Fix bug so fpm can now copy symlinks correctly (`#1348`_; ServiusHack)
* apk: Improve performance (`#1358`_; Jan Delgado)
* cpan: Fix crash when CPAN query returns a version value that was a number and fpm was expecting a string. (`#1344`_, `#1343`_; liger1978)
* cpan: Fix MetaCPAN searches to use v1 of MetaCPAN's API. The v0 API is no longer provided by MetaCPAN. (`#1341`_, `#1339`_; Bob Bell)
* cpan: Have perl modules implicitly "provide" (`--provides`) capabilities. (`#1340`_; Bob Bell. `#1345`_; liger1978)
* cpan: Now transforms perl version values like "5.008001" to "5.8.1" (`#1342`_; Bob Bell)
* cpan: Use `>=` ("this version or newer") for package dependencies instead of `=` ("exactly this version"). (`#1338`_; Bob Bell)
* deb: Add `--deb-after-purge` flag for running a script after `apt-get purge` is run. (Alexander Weidinger)
* deb: fix bug when using `--deb-upstart` would use the wrong file name (`#1325`_, `#1287`_; vbakayev)
* deb: New flags `--deb-interest-noawait` and `--deb-activate-nowait`. (`#1225`_, `#1359`_; Philippe Poilbarbe)
* dir: Remove a debug statement that would put fpm into a debug prompt (`#1293`_, `#1259`_; Joseph Anthony Pasquale Holsten)
* dir: When using `path mapping`_ (`a=b` syntax), and `a` is a symlink, use the path `b` as the symlink, not `b/a` (`#1253`_, Nemanja Boric)
* gem: Can now make reproducible_builds_ when building a deb (`-s gem -t deb`). See the `Deterministic output`_ docs.
* gem: Add `--gem-embed-dependencies` flag to include in the output package all dependent gems of the target. For example, `fpm -s gem -t rpm --gem-embed-dependencies rails` will create a single `rails` rpm that includes active_support, active_record, etc.
* pleaserun: Add more flags (`--pleaserun-chdir`, `--pleaserun-user`, etc) to allow more customization of pleaserun services. (`#1311`_; Paulo Sousa)
* python: Add `--python-setup-py-arguments` flag for passing arbitrary flags to `python setup.py install` (`#1120`_, `#1376`_; Ward Vandewege, Joseph Anthony Pasquale Holsten)
* rpm: --config-files can now copy files from outside of the package source. This means you can do things like `fpm -s gem -t rpm --config-files etc/my/config` and have `etc/my/config` come from the local filesystem. (`#860`_, `#1379`_; jakerobinson, Joseph Anthony Pasquale Holsten)
* tar: Only create `.scripts` directory if there are scripts to include (`#1123`_, `#1374`_; Thiago Figueiró)
* virtualenv: Add `--virtualenv-find-links` flag which appends `--find-links` to the `pip install` command.
* virtualenv: documentation improvements (Nick Griffiths)
* virtualenv: Make `--prefix` useful and deprecate `--virtualenv-install-location` (`#1262`_; Nick Griffiths)
* zip: fix bug in output where the temporary directory would be included in the file listing (`#1313`_, `#1314`_; Bob Vincent)
* Other: Remove unused archive-tar-minitar as a dependency of fpm (`#1355`_; Diego Martins)
* Other: Add stud as a runtime dependency (`#1354`_; Elan Ruusamäe)

.. _reproducible_builds: https://reproducible-builds.org/
.. _path mapping: source/dir.html#path-mapping
.. _Deterministic output: source/gem.html

1.9.0 (July 28, 2017)
^^^^^^^^^^^^^^^^^^^^^

Yanked offline. I forgot some dependency changes. Hi.

1.8.1 (February 7, 2017)
^^^^^^^^^^^^^^^^^^^^^^^^
* Pin archive-tar-minitar library to version 0.5.2 to work around a problem breaking `gem install fpm`

1.8.0 (December 28, 2016)
^^^^^^^^^^^^^^^^^^^^^^^^^
* virtualenv: Add `--virtualenv-setup-install` flag to run `setup.py install` after pip finishes installing things. (`#1218`_; John Stowers)
* virtualenv: Add `--virtualenv-system-site-package` flag which creates the virtualenv in a way that allows it to use the system python packages. (`#1218`_; John Stowers)
* cpan: Fix bug preventing some perl modules from being installed (`#1236`_, `#1241`_; Richard Grainger)
* rpm: Documentation improvements (`#1242`_; Nick Griffiths)

1.7.0 (November 28, 2016)
^^^^^^^^^^^^^^^^^^^^^^^^^
* virtualenv: Fix a bug where `pip` might be run incorrectly (`#1210`_; Nico Griffiths)
* FreeBSD: --architecture (-a) flag now sets FreeBSD package ABI (`#1196`_; Matt Sharpe)
* perl/cpan: Fix bug and now local modules can be packaged (`#1202`_, `#1203`_; liger1978)
* perl/cpan: Add support for `http_proxy` environment variable and improve how fpm queries CPAN for package information. (`#1206`_, `#1208`_; liger1978)
* Fix crash for some users (`#1231`_, `#1148`_; Jose Diaz-Gonzalez) 
* Documentation now published on fpm.readthedocs.io. This is a work-in progress. Contributions welcome! <3 (`#1237`_, Jordan Sissel)
* deb: Can now read bz2-compressed debian packages. (`#1213`_; shalq)
* pleaserun: New flag --pleaserun-chdir for setting the working directory of a service. (`#1235`_; Claus F. Strasburger)

1.6.3 (September 15, 2016)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix bug in fpm's release that accidentally included a few `.pyc` files (`#1191`_)

1.6.2 (July 1, 2016)
^^^^^^^^^^^^^^^^^^^^
* Reduce `json` dependency version to avoid requiring Ruby 2.0 (`#1146`_, `#1147`_; patch by Matt Hoffman)
* pacman: skip automatic dependencies if --no-auto-depends is given (Leo P)
* rpm: Fix bug where --rpm-tag was accidentally ignored (`#1134`_, Michal Mach)
* deb: Omit certain fields from control file if (Breaks, Depends, Recommends, etc) if there are no values to put in that field. (`#1113`_, TomyLobo)
* rpm: remove trailing slash from Prefix for rpm packages (`#819`_, luto)
* virtualenv: Now supports being given a requirements.txt as the input. (Nick Griffiths)

1.6.1 (June 10, 2016)
^^^^^^^^^^^^^^^^^^^^^
* freebsd: Only load xz support if we are doing a freebsd output. (`#1132`_, `#1090`_, Ketan Padegaonkar)

1.6.0 (May 25, 2016)
^^^^^^^^^^^^^^^^^^^^
* New source: pleaserun. This lets you create packages that will install a system service. An after-install script is used in the package to determine which service platform to target (systemd, upstart, etc). Originated from Aaron Mildenstein's work on solving this problem for Logstash. (`#1119`_, `#1112`_)
* New target: Alpine Linux "apk" packages. (`#1054`_, George Lester)
* deb: don't append `.conf` to an upstart file if the file name already ends in `.conf`. (`#1115`_, josegonzalez)
* freebsd: fix bug where --package flag was ignored. (`#1093`_, Paweł Tomulik)
* Improvements to the fpm rake tasks (`#1101`_, Evan Gilman)
  
1.5.0 (April 12, 2016)
^^^^^^^^^^^^^^^^^^^^^^
* Arch package support is now available via -s pacman and -t pacman.  (`#916`_; wonderful community effort making this happen!)
* FreeBSD packages can now be built `-t freebsd` (`#1073`_; huge community effort making this happen!)
* You can now set fpm flags and arguments with the FPMOPTS environment variable (`#977`_, mildred)
* Using --exclude-file no longer causes a crash. Yay! (`#982`_, wyaeld)
* A new rake task is available for folks who want to invoke fpm from rake (`#756`_, pstengel)
* On FreeBSD, when tarring, gtar is now used. (`#1008`_, liv3d)
* virtualenv: Add --virtualenv-pypi-extra-url flag to specify additional PyPI locations to use when searching for packages (`#1012`_, Paul Krohn)
* deb: Init scripts, etc/default, and upstart files are automatically added as config files in a debian package. Disable this behavior with ---deb-auto-config-files
* deb: Small changes to make lintian complain less about our resulting debs.
* deb: New flag --deb-systemd lets you specify a systemd service file to include in your package. (`#952`_, Jens Peter Schroer)
* cpan: Add --[no-]cpan-cpanm-force flag to pass --force to cpanm.
* rpm: File names with both spaces and symbols should now be packageable.  (`#946`_, iwonbigbro)
* cpan: Now queries MetaCPAN for package info if we can't find any in the cpan archive we just downloaded. (`#849`_, BaxterStockman)
* rpm: You can now specify custom rpm tags at the command line. Be careful, as no validation is done on this before sending to rpmbuild. (`#687`_, vStone)
* cpan: Install if the package name given is a local file (`#986`_, mdom)
* sh: Metadata now available as env vars for post-install scripts (`#1006`_, Ed Healy)
* rpm: No more warning if you don't set an epoch. (`#1053`_, Joseph Frazier)


1.4.0 (July 26, 2015)
^^^^^^^^^^^^^^^^^^^^^
* Solaris 11 IPS packages 'p5p' now supported `-t p5p`. (Jonathan Craig)
* Python Virtualenv is now supported `-t virtualenv` (`#930`_, Simone Margaritelli and Daniel Haskin)
* deb: Files in /etc are now by default marked as config files. (`#877`_, Vincent Bernat)
* `fpm --help` output now includes a list of supported package types (`#896`_, Daniel Haskin)
* cpan: --[no-]cpan-sandbox-non-core flag to make non-core module sandboxing optional during packaging (`#752`_, Matt Sharpe)
* rpm: Add --rpm-dist flag for specifically setting the target distribution of an rpm.  (Adam Lamar)
* rpm: Fix a crash if --before-upgrade or --after-upgrade were used. (`#822`_, Dave Anderson)
* deb: Ensure maintainer scripts have shebang lines (`#836`_, Wesley Spikes)
* deb: Fix bug in maintainer scripts where sometimes we would write an empty shell function. Empty functions aren't valid in shell. (Wesley Spikes)
* Fix symlink copying bug (`#863`_, Pete Fritchman)
* python: Default to https for pypi queries (Timothy Sutton)
* New flag --exclude-file for providing a file containing line-delimited exclusions (Jamie Lawrence)
* python: new flag --python-disable-dependency to disable specific python dependencies (Ward Vandewege)
* python: ensure we avoid wheel packages for now until fpm better supports them.  (`#885`_, Matt Callaway)
* deb: Add support for installation states "abort-remove" and "abort-install" (`#887`_, Daniel Haskin)
* If PATH isn't set, and we need it, tell the user (`#886`_, Ranjib Dey)
* cpan: --[no-]cpan-test now works correctly (`#853`_, Matt Schreiber)
* deb-to-rpm: some improved support for config file knowledge passing from deb to rpm packages (Daniel Haskin)
    
1.3.3 (December 11, 2014)
^^^^^^^^^^^^^^^^^^^^^^^^^
* The fpm project now uses Contributor Covenant. You can read more about this on the website: http://contributor-covenant.org/
* npm: Fix bug causing all `-s npm` attempts to fail due to a missing method.  This bug was introduced in 1.3.0. (`#800`_, `#806`_; Jordan Sissel)
* rpm: fix bug in rpm input causing a crash if the input rpm did not have any triggers (`#801`_, `#802`_; Ted Elwartowski)

1.3.2 (November 4, 2014)
^^^^^^^^^^^^^^^^^^^^^^^^
* deb: conversion from another deb will automatically use any changelog found in the source deb (Jordan Sissel)

1.3.1 (November 4, 2014)
^^^^^^^^^^^^^^^^^^^^^^^^
* deb: fix md5sums generation such that `dpkg -V` now works (`#799`_, Matteo Panella)
* rpm: Use maximum compression when choosing xz (`#797`_, Ashish Kulkarni)
  
1.3.0 (October 25, 2014)
^^^^^^^^^^^^^^^^^^^^^^^^
* Fixed a bunch of Ruby 1.8.7-related bugs. (Jordan Sissel)
* cpan: Fix bug in author handling (`#744`_, Leon Weidauer)
* cpan: Better removal of perllocal.pod (`#763`_, `#443`_, `#510`_, Mathias Lafeldt)
* rpm: Use lstat calls instead of stat, so we don't follow symlinks (`#765`_, Shrijeet Paliwal)
* rpm and deb: Now supports script actions on upgrades. This adds two new flags: --before-upgrade and --after-upgrade. (`#772`_, `#661`_; Daniel Haskin)
* rpm: Package triggers are now supported. New flags: --rpm-trigger-before-install, --rpm-trigger-after-install, --rpm-trigger-before-uninstall, --rpm-trigger-after-target-uninstall. (`#626`_, Maxime Caumartin)
* rpm: Add --rpm-init flag; similar to --deb-init. (Josh Dolitsky)
* sh: Skip installation if already installed for the given version. If forced, the old installation is renamed. (`#776`_, Chris Gerber)
* deb: Allow Vendor field to be omitted now by specifying `--vendor ""` (`#778`_, Nate Brown)
* general: Add --log=level flag for setting log level. Levels are error, warn, info, debug. (Jordan SIssel)
* cpan: Check for Build.PL first before Makefile.PL (`#787`_, Daniel Jay Haskin)
* dir: Don't follow symlinks when copying files (`#658`_, Jordan Sissel)
* deb: Automatically provide a 'changes' file in debs because lintian complains if they are missing. (`#784`_, Jordan Sissel)
* deb: Fix and warn for package names that have spaces (`#779`_, Grantlyk)
* npm: Automatically set the prefix to `npm prefix -g` (`#758`_, Brady Wetherington and Jordan Sissel)

1.2.0 (July 25, 2014)
^^^^^^^^^^^^^^^^^^^^^
* rpm: Add --rpm-verifyscript for adding a custom rpm verify script to your package. (Remi Hakim)
* Allow the -p flag to target a directory for writing the output package (`#656`_, Jordan Sissel)
* Add --debug-workspace which skips any workspace cleanup to let users debug things if they break. (`#720`_, `#734`_; Jordan Sissel)
* rpm: Add --rpm-attr for controlling attribute settings per file. This setting will likely be removed in the future once rpmbuild is no longer needed.  (`#719`_)
* deb: Add --deb-meta-file to add arbitrary files to the control dir (`#599`_, Dan Brown)
* deb: Add --deb-interest and --deb-activate for adding package triggers (`#595`_, Dan Brown)
* cpan: Fix small bug in handling empty metadata fields (`#712`_, Mathias Lafeldt)
* rpm: Fix bug when specifying both --architecture and --rpm-os (`#707`_, `#716`_; Alan Ivey)
* gem: Fix bug where --gem-version-bins is given but package has no bins (`#688`_, Jan Vansteenkiste)
* deb: Set permissions correct on the package's internals. Makes lintian happier. (Jan Vansteenkiste)
* rpm: rpmbuild's _tmppath now respects --workdir (`#714`_, Jordan Sissel)
* gem/rpm: Add --rpm-verbatim-gem-dependencies to use old-style (fpm 0.4.x) rpm gem dependencies (`#724`_, Jordan Sissel)
* gem/rpm: Fix bug for gem pessimistic constraints when converting to rpm (Tom Duckering)
* python: Fix small bug with pip invocations (`#727`_, Dane Knecht)

1.1.0 (April 23, 2014)
^^^^^^^^^^^^^^^^^^^^^^
* New package type: zip, for converting to and from zip files (Jordan Sissel)
* New package type: sh, a self-extracting package installation shell archive. (`#651`_, Chris Gerber)
* 'fpm --version' will now emit the version of fpm.
* rpm: supports packaging fifo files (Adam Stephens)
* deb: Add --deb-use-file-permissions (Adam Stephens)
* cpan: Improve how fpm tries to find cpan artifacts for download (`#614`_, Tim Nicholas)
* gem: Add --gem-disable-dependency for removing one or more specific rubygem dependencies from the automatically-generated list (`#598`_, Derek Olsen)
* python: Add --python-scripts-executable for setting a custom interpreter to use for the hashbang line at the top of may python package scripts.  (`#628`_, Vladimir Rutsky)
* Allow absolute paths with --directories even when --prefix is used (Vladimir Rutsky)
* dir: Now correctly identifies hardlinked files and creates a package correctly with that knowledge (`#365`_, `#623`_, `#659`_; Vladimir Rutsky)
* rpm: Add --rpm-auto-add-exclude-directories for excluding directories from the --rpm-auto-add-directories behavior (`#640`_, Vladimir Rutsky)
* general: --config-files now accepts directories and will recursively mark any files within as config files inside the package (`#642`_, Vladimir Rutsky)
* general: If you specify a --config-files path that doesn't exist, you will now get an error. (`#654`_, Alan Franzoni)
* python: Support --python-pypi when using --python-pip (`#652`_, David Lindquist)
* deb: Tests now try to make packages ensure we don't upset lintian (`#648`_, Sam Crang)
* rpm: Fix architecture targeting (`#676`_, Rob Kinyon)
* rpm: Allow --rpm-user and --rpm-group to override the user/group even if --rpm-use-file-permissions is enabled. (`#679`_, Jordan Sissel)
* gem: Add --gem-version-bins for appending the gem version to the file name of executable scripts a rubygem may install. (Jan Vansteenkiste)
* python: Attempt to provide better error messages for known issues in python environments (`#664`_, Jordan Sissel)

1.0.2 (January 10, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^
* rpm: No longer converts - to _ in dependency strings (`#603`_, Bulat Shakirzyanov)
* Handle Darwin/OSX tar invocations (now tries 'gnutar' and 'gtar'). (Jordan Sissel)
* Process $HOME/.fpm, and $PWD/.fpm in the correct order and allow CLI flags to override fpm config file settings. (`#615`_, Jordan Sissel)
* Don't leave empty gem bin paths in packages that don't need them (`#612`_, Jordan Sissel)
* deb: Make --deb-compression=gz work correctly (`#616`_, `#617`_; Evan Krall, Jason Yan)

1.0.1 (December 7, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^
* deb: Correctly handle --config-files given with a leading / (Jordan Sissel)

1.0.0 (December 5, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^
* Config file of flags is now supported. Searches for $HOME/.fpm and $PWD/.fpm. If both exist, $HOME is loaded first so $PWD can override.  (Pranay Kanwar)
* pkgin: Basic support for SmartOS/pkgsrc's pkgin format. (`#567`_, Brian Akins)
* cpan: catch more cases of perllocal.pod and delete them (`#510`_, Jordan Sissel)
* cpan: Correctly support module version selection (`#518`_, Matt Sharpe)
* cpan: include builddeps in PERL5LIB when running cpan tests (`#500`_, Matt Sharpe)
* cpan: Avoid old system perl modules when doing module builds (`#442`_, `#513`_; Matt Sharpe)
* python: safer gathering of python module dependencies.
* python: better handling of unicode strings in python package metadata (`#575`_, Bruno Renié)
* cpan: Support 'http_proxy' env var. (`#491`_, Patrick Cable)
* deb: --deb-user and --deb-group both default to 'root' now (`#504`_, Pranay Kanwar)
* deb: convert '>' to '>>' in deb version constraints (`#503`_, `#439`_, Pranay Kanwar)
* deb: Warn if epoch is set. Just so you know what's going on, since the default filename doesn't include the epoch. (`#502`_, Pranay Kanwar)
* deb,rpm: --config-files is now recursive if you give it a directory.  This seems to be the most expected behavior by users.  (`#171`_, `#506`_; Pranay Kanwar)
* dir: Respect -C when using path mapping (`#498`_, `#507`_; Pranay Kanwar)
* rpm: Add --rpm-ignore-iteration-in-dependencies to let you to depend on any release (aka iteration) of the same version of a package.  (`#364`_, `#508`_; Pranay Kanwar)
* dir: Handle copying of special files when possible (`#347`_, `#511`_, `#539`_, `#561`_; Pranay Kanwar)
* rpm: Don't mistake symlinks as actual directories (`#521`_, Nathan Huff)
* npm: Choose an alternate npm registry with --npm-registry (`#445`_, `#524`_; Matt Sharpe)
* cpan: Choose an alternate cpan server with --cpan-mirror. Additionally, you can use --cpan-mirror-only to only use this mirror for metadata queries.  (`#524`_, Matt Sharpe)
* deb: Fix broken --deb-changelog flag (`#543`_, `#544`_; Tray Torrance)
* deb: When --deb-upstart is given, automatically create an upstart-sysv symlink /etc/init.d/<name> to /lib/init/upstart-job (`#545`_, Igor Galić)
* rpm: Fix bug when generating spec file listings on files with strange characters in the names. (`#547`_, Chris Chandler)
* dir: Fix bug where the new directory mapping feature would cause you not to be able to select files with '=' in the name for packaging.  (`#556`_, `#554`_; Pranay Kanwar)
* python: Fix some unicode string issues in package metadata (`#575`_, Bruno Renié)
* gem-rpm: Now respects the --gem-package-name-prefix when generating the 'rubygem(name)' provides statement (`#585`_, Stepan Stipl)
* deb: Downcase and replace underscores with dashes in 'provides' list.  (`#591`_, Eric Connell)
* deb: Fix a lintian complaint about md5sums permissions (`#593`_, Sam Crang)
* cpan: Modules with 'MYMETA' files are now supported (`#573`_, Michael Donlon)

0.4.42 (July 23, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* dir: make source=destination mappings behave the same way 'rsync -a' does with respect to source and destination paths.

0.4.41 (July 17, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* cpan: handle cases where modules don't specify a license
* deb: support multiple init scripts (`#487`_, patch by Kristian Glass)

0.4.40 (July 12, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* dir: supports mapping one path to another. You set mappings by using 'source=destination' syntax. For example: % fpm -s dir -t deb -n example /home/jls/.zshrc=/etc/skel/ The key above is the '=' symbol. The result of the above will be a package containing only /etc/skel/.zshrc For more, see https://github.com/jordansissel/fpm/wiki/Source:-dir#mapping
* python: the default scripts location is now chosen by python itself. The previous default was "/usr/bin" and was not a good default. (`#480`_)
* rpm: config files should have attributes (`#484`_, patch by adamcstephens)
* python: correctly log the python setup.py exit code (`#481`_, patch by Derek Ludwig)

0.4.39 (June 27, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* cpan: support more complex dependency specifications (reported by Mabi Knittel)
  
0.4.38 (June 24, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* cpan: fpm's cpan code now works under ruby 1.8.7
* python: fix a bug in dependency handling (`#461`_, Pranay Kanwar)
* pear: Added --pear-data-dir flag (`#465`_, Zsolt Takács)
* cpan: fix a bug with some clean up on certain 64bit systems
* gem: improve detection of the gem bin install path (`#476`_, Tray Torrance)
* rpm: fix bug when calling using --rpm-use-file-permissions (`#464`_, Rich Horwood)

0.4.37 (May 30, 2013)
^^^^^^^^^^^^^^^^^^^^^
* deb: fix creation failures on OS X (`#450`_, patch by Anthony Scalisi and Matthew M. Boedicker)
* deb: you can now set --deb-build-depends. This is generally for extremely rare use cases. (`#451`_, patch by torrancew)
* perl: add --cpan-perl-lib-path for a custom perl library installation path (`#447`_, patch by Brett Gailey)

0.4.36 (May 15, 2013)
^^^^^^^^^^^^^^^^^^^^^
* pear: only do channel-discover if necessary (`#438`_, patch by Hatt)
* cpan: now supports cpan modules that use Module::Build
* cpan: --no-cpan-test now skips tests for build/configure dependencies
* rpm: Add --rpm-defattrfile and --rpm-defattrdir flags (`#428`_, patch by phrawzty)

0.4.35 -- was not announced 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.4.34 (May 7, 2013)
^^^^^^^^^^^^^^^^^^^^
* Now supports CPAN - Perl mongers rejoice! For example: 'fpm -s cpan -t deb DBI'
* deb: fixed some additional complaints by lintian (`#420`_, patch by Pranay Kanwar)
* rpm: add flags --rpm-autoreqprov, --rpm-autoreq, and --rpm-autoprov to tell rpm to enable that feature in the rpm spec. (`#416`_, patch by Adam Stephens)

0.4.33 (April 9, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* Now supports npm, the node package manager. For example: 'fpm -s npm -t deb express'

0.4.32 (April 9, 2013)
^^^^^^^^^^^^^^^^^^^^^^
* COMPATIBILITY WARNING: rpm: The default epoch is now nothing because this aligns more closely with typical rpm packages in the real world. This decision was reached in `#381`_. If you need the previous behavior, you must now specify '--epoch 1' (`#388`_, patch by Pranay Kanwar)
* python: new flag --python-obey-requirements-txt which makes a requirements.txt file from the python package used for the package dependencies instead of the usual setup.py dependencies. The default behavior without this flag is to respect setup.py. (`#384`_)
* deb: new flag --deb-shlibs to specify the content of the 'shlibs' file in the debian package (`#405`_, patch by Aman Gupta)
* deb: fixed a few lintian errors (empty conffiles, md5sums on symlinks, etc)
* Add '-f' / '--force' flag to force overwriting an existing package output path (`#385`_, Timothy Sutton)
* New flag: --no-auto-depends flag to skip any automatic dependencies that would normally be added by gem, python, deb, and rpms input packages.  (`#386`_, `#374`_; patch by Pranay Kanwar)
* gem: Use 'gem' command to download gems and read gem package information.  (`#389`_, `#394`_, `#378`_, `#233`_; patches by Pranay Kanwar and Chris Roberts)
* rpm: dashes are now replaced with underscores in rpm version strings (`#395`_, `#393`_, `#399`_;  patches by Jeff Terrace and Richard Guest)
* python: Only use the first line of a license; some python packages (like 'requests') embed their full license copy into the license field. For the sake of sanity and function with most packaging systems, fpm only uses the first line of that license.
* rpm: Add new 'none' option to --rpm-compression to disable compression entirely. (`#398`_, patch by Richard Guest)
* deb: Make dependencies using the '!=' operator represented as "Breaks" in the deb package (previously used "Conflicts"). (`#400`_)
* deb: Add md5sums to the debian packages which improves correctness of the package. (`#403`_, `#401`_; patch by Pranay Kanwar)
* rpm: Convert all '!=' dependency operators to 'Conflicts'. Previously, this only applied to packages converting from python to rpm.  (`#404`_, `#396`_; patch by Pranay Kanwar)

0.4.31 (March 21, 2013)
^^^^^^^^^^^^^^^^^^^^^^^
* rpm: new flag --rpm-use-file-permissions which try to create an rpm that has file ownership/modes that exactly mirror how they are on the filesystem at package time. (`#377`_, patch by Paul Rhodes)
* general: remove empty directories only when they match the exclude pattern (`#323`_, patch by Pranay Kanwar)

0.4.30 (March 21, 2013)
^^^^^^^^^^^^^^^^^^^^^^^
* Solaris: --solaris-user and --solaris-group flags to specify the owner of files in a package. (`#342`_, patch by Derek Olsen)
* rpm: (bug fix) epoch of 0 is permitted now (`#343`_, patch by Ben Hughes)
* pear: add flags --pear-bin-dir --pear-php-bin --pear-php-dir (`#358`_, patch by Zsolt Takács)
* New 'source' type: empty. Allows you to create packages without any files in them (sometimes called 'meta packages'). Useful when you want to have one package be simply dependencies or when you want to spoof a package you don't want installed, etc. (`#359`_, 349; patch by Pranay Kanwar)
* solaris: Add --solaris-user and --solaris-group flags (`#342`_, Patch by Derek Olsen)
* gem: new flag --env-shebang; default true (disable with --no-env-shebang).  Lets you disable #! (shebang) mangling done by gem installation. (`#363`_, patch by Grier Johnson)
* deb: fix bug on changelog handling (`#376`_, patch by mbakke)
* rpm: fix --rpm-rpmbuild-define (`#383`_, patch by Eric Merritt)

0.4.29 (January 22, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^^
* Copy links literally, not what they point at (`#337`_, patch by Dane Knecht)

0.4.28 (January 21, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix a dependency on the 'cabin' gem. (`#344`_, reported by Jay Buffington)

0.4.27 (January 16, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^^
* Make all fpm output go through the logger (`#329`_; patch by jaybuff)
* New package type: osxpkg, for building packages installable on OS X. (`#332`_, patch by Timothy Sutton)
* Fix crash bug when converting rpms to something else (`#316`_, `#325`_; patch by rtucker-mozilla)
* deb: Add --deb-field for setting a custom field in the control file.  For more information on this setting, see section 5.7 "User-defined fields" of the debian policy manual: http://www.debian.org/doc/debian-policy/ch-controlfields.html#s5.7
* deb: Add --deb-recommends and --deb-suggests (`#285`_, `#310`_; patch by Pranay Kanwar)
* python to rpm: convert "!=" dependency operators in python to "Conflicts" in rpm. (`#263`_, `#312`_; patch by Pranay Kanwar)
* python: fix bug - ignore blank lines in requirements.txt (`#312`_, patch by Pranay Kanwar)

0.4.26 (December 27, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* rpm: add --rpm-sign flag to sign packages using the 'rpmbuild --sign' flag.  (`#311`_, Patch by Pranay Kanwar)
* rpm: fix flag ordering when calling rpmbuild (`#309`_, `#315`_, patch by Trotter Cashion)
* deb: re-enable "Predepends" support (`#319`_, `#320`_, patch by Pranay Kanwar)
* rpm: fix default 'rpm os' value (`#321`_, 314, 309)

0.4.25 (December 7, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^
* Added --deb-changelog and --rpm-changelog support flags. Both take a path to a changelog file. Both must be valid changelog formats for their respective package types. (`#300`_, patch by Pranay Kanwar)
* deb: Multiple "provides" are now supported. (`#301`_, patch by Pranay Kanwar)
* rpm: Added --rpm-os flag to set the OS target for the rpm. This lets you build rpms for linux on OS X and other platforms (with --rpm-os linux). (`#309`_)
* rpm: Avoid platform-dependent commands in the %install phase (`#309`_, fixes 'cp -d' on OSX)
* python: ignore comments in requirements.txt (`#304`_, patch by Pranay Kanwar)
* Fixed warning 'already initialized constant' (`#274`_)

0.4.24 (November 30, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* Don't include an empty url in rpm spec (`#296`_, `#276`_; patch by Pranay Kanwar)
* Don't require extra parameters if you use --inputs (`#278`_, `#297`_; Patch by Pranay Kanwar)
* python: supports requirements.txt now for dependency information.
* python: supports pip now. Use '--python-pip path/to/pip' to have fpm use it instead of easy_install.
* solaris: package building works again (`#216`_, `#299`_, patch by Pierre-Yves Ritschard)

0.4.23 (November 26, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* The --directories flag is now recursive when the output package is rpm.  This makes all directories under a given path as owned by the package so they'll be removed when the package is uninstalled (`#245`_, `#293`_, `#294`_, patch by Justin Ellison)
* Add fpm version info to '--help' output (`#281`_)
* gem to rpm: Use 'rubygem(gemname)' for dependencies (`#284`_, patch by Jan Vansteenkiste)
* Fix a bug in gem version mangling (`#292`_, `#291`_; patch by Pranay Kanwar)
* Fix compatibility with Python 2.5 (`#279`_, patch by Denis Bilenko)

0.4.22 (November 15, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* Add --no-depends flag for creating packages with no dependencies listed (`#289`_, patch by Brett Gailey)
* Fix a bug where blank lines were present in a debian control file.  (`#288`_, patch by Andrew Bunday)

0.4.21 (November 8, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^
* gem: remove restriction on expected gem names (`#287`_)
* add --directory flag; lets you mark a directory as being owned by a package. (`#260`_, `#245`_, patch by ajf8)
* deb: don't include a version in the Provides field (`#280`_)
* gem: if the version is '1.1' make it imply '1.1.0' (`#269`_, patch by Radim Marek)

0.4.20 (October 5, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^
* python: only specify --install-{scripts,lib,data} flags to setup.py if they were given on the command line to fpm. Fixes `#273`_.

0.4.19 (September 26, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Escape '%' characters in file names (`#266`_, `#222`_. Patch by John Wittkoski)

0.4.18 (September 25, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix regression in rpm building where the epoch in was missing in the rpm, but prior fpm versions defaulted it to 1. This caused rpms built with newer fpms to appear "older" than older rpms. Tests added to ensure this regression is caught prior to future releases! (Reported by eliklein)

0.4.17 (September 12, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Remove accidental JSON warning when using '-s python'

0.4.16 (September 6, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix compatibility with Ruby 1.8.7 (broken in 0.4.15)

0.4.15 (September 6, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^
* pear: support custom channels with --pear-channel <channel> (`#207`_) Example: fpm -s pear -t deb --pear-channel pear.drush.org drush
* permit literal '\n' in --description, fpm will replace with a newline character. Example: fpm --description "line one\nline two" (`#251`_)
* improve error messaging when trying to output a package to a directory that doesn't exist (`#244`_)
* deb: convert '>' and '<' dependency operators to the correct '>>' and '<<' debian version operators (`#250`_, patch by Thomas Meson).
* deb: add --deb-priority flag (`#232`_) for setting the debian 'priority' value for your package.
* add --template-value. Used to expose arbitrary values to script templates.  If you do --template-value hello=world, in your template you can do <%= hello %> to get 'world' to show up in your maintainer scripts.
* python: add --python-install-data flag to set the --install-data option to setup.py (`#255`_, patch by Thomas Meson)
* Reject bad dependency flags (ones containing commas) and offer alternative.  (`#257`_)
* Try to copy a file if hardlinking fails with permission problems (`#253`_, patch by Jacek Lach)
* Make --exclude, if a directory, include itself and any children, recursive.  (`#248`_)

0.4.14 (August 24, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^
* rpm: Replace newlines with space in any license setting. (`#252`_)

0.4.13 (August 14, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^
* Make --exclude accept path prefixes as well. If you have a files in 'usr/share/man' in your package, you can now exclude all of a subdir by doing '--exclude usr/share/man'

0.4.12 (August 10, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^
* Fix a major bug introduced in 0.4.11 that caused all deb packages to contain empty maintainer scripts if not otherwise specified, which made apt/dpkg quite unhappy

0.4.11 (August 7, 2012)
^^^^^^^^^^^^^^^^^^^^^^^
* Fix some symlink handling to prevent links from being followed during cleanup (`#228`_, patch by sbuss)
* rpm: 'vendor' in rpm spec is now omitted if empty or nil. This fixes a bug where rpmbuild fails due to empty 'Vendor' tag if you convert rpm to rpm.
* internal: remove empty directories marked by --exclude (`#205`_, patch by jimbrowne)
* dir: don't try to set utime on symlinks (`#234`_, `#240`_, patch by ctgswallow)
* rpm: relocatable rpms now supported when using the '--prefix' flag.  Example: fpm -s dir -t rpm --prefix /usr/local -n example /etc/motd (patch by jkoppe)
* deb: --deb-compression flag: Support different compression methods.  Default continues to be gzip.
* new flag: --template-scripts. This lets you write script templates for --after-install, etc. Templates are ERB, so you can do things like '<%= name %>' to get the package name in the script, etc.
* warn on command invocations that appear to have stray flags to try and help users who have complex command lines that are failling.

0.4.10 (May 25, 2012)
^^^^^^^^^^^^^^^^^^^^^
* Fix python package support for python3 (`#212`_, patch by Slezhuk Evgeniy)
* Preserve file metadata (time, owner, etc) when copying with the dir package. (`#217`_, patch by Marshall T. Vandegrift)
* Missing executables will now error more readably in fpm.
* Fix gem and python 'version' selection (`#215`_, `#204`_)
* Dependencies using '!=' will now map to 'Conflicts' in deb packages. (`#221`_, patch by Sven Fischer)
* Allow setting default user/group for files in rpm packages (`#208`_, patch by Jason Rogers). Note: This adds --user and --group flags to effect this.  These flags may go away in the future, but if they do, they will be
* In python packages set 'install-data' correctly. (`#223`_, patch by Jamie Scheinblum)

0.4.9 (April 25, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Fix --prefix support when building gems (`#213`_, patch by Jan Vansteenkiste)

0.4.8 (April 25, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* RPM: use 'noreplace' option for config files (`#194`_, patch by Steve Lum)
* Python: Fix bug around exact dependency versions (`#206`_, patch by Lars van de Kerkhof)
* Gem->RPM: Make 'provides' "rubygem(thegemname)" instead of "rubygem-thegemname"
* Fix oddity where Ruby would complain about constant redefinition (`#198`_, patch by Marcus Vinicius Ferreira)

0.4.7 skipped.
^^^^^^^^^^^^^^

0.4.6 (April 10, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Work around more problems in RPM with respect to file listing (`#202`_)

0.4.5 (April 3, 2012)
^^^^^^^^^^^^^^^^^^^^^
* Fix gem->rpm conversion where the '~>' rubygem version operator (`#193`_, patch by antoncohen)
* Escape filenames RPM install process (permits files with spaces, dollar signs, etc) (`#196`_, reported by pspiertz)

0.4.4 (March 30, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Fix a bug in gem bin_dir handling (Calen Pennington)
* The --config-files flag should work again (Brian Akins)
* Fix syntax error when using --deb-pre-depends (Andrew Bennett)
* Make --exclude work again (`#185`_, `#186`_) (Calen Pennington)
* Fix file listing so that rpm packages don't declare ownership on / and /usr, etc.
* make --deb-custom-control to work again (Tor Arne Vestbø)
* Add --rpm-digest flag to allow selection of the rpm 'file name' digest algorithm. Default is 'md5' since it works on the most rpm systems.
* Reimplement old behavior assuming "." as the input when using '-s dir' and also setting -C (`#187`_)
* Set BuildRoot on rpm to work around an rpmbuild bug(?) on CentOS 5 (`#191`_)
* Add --rpm-compression flag to allow selection of the rpm payload compression. Default is 'gzip' since it works on the most rpm systems
* Specs now pass on ubuntu/32bit systems (found by travis-ci.org's test runner)
* Improve default values of iteration and epoch (`#190`_)
* Make FPM::Package#files list only 'leaf' nodes (files, empty directories, symlinks, etc).

0.4.3 (March 21, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Fix bug in python packaging when invoked with a relative path to a setup.py (Reported by Thomas Meson, https://github.com/jordansissel/fpm/pull/180)

0.4.2 (March 21, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Set default temporary directory to /tmp (https://github.com/jordansissel/fpm/issues/174)
* Improve symlink handling (patch by Aleix Conchillo Flaqué, pull/177))
* Python package support changes (thanks to input by Luke Macken):

  * New flag: --python-install-bin. Sets the location for python package scripts (default: /usr/bin)
  * New flag: --python-install-lib. Sets the location for the python package to install libs to, default varies by system. Usually something like /usr/lib/python2.7/site-packages.
  * Fix up --prefix support
  * Improve staged package installation

0.4.1 (March 19, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Fix fpm so it works in ruby 1.8 again. Tests run, and passing: rvm 1.8.7,1.9.2,1.9.3 do bundle exec rspec

0.4.0 (March 18, 2012)
^^^^^^^^^^^^^^^^^^^^^^
* Complete rewrite of pretty much everything.

    * Otherwise, the 'fpm' command functionality should be the same
    * Please let me know if something broke!

* Now has an API (see examples/api directory)
* Also has a proper test suite
* Updated the rpm spec generator to disable all the ways I've found rpmbuild to be weird about packages. This means that fpm-generated rpms will no longer strip libraries, move files around, randomly mutate jar files, etc.
* Add --license and --vendor settings (via Pieter Loubser)
* python support: try to name python packages sanely. Some pypi packages are literally called 'python-foo' so make sure we generate packages named 'python-foo' and not 'python-python-foo' (via Thomas Meson)
* rpm support: Add --rpm-rpmbuild-define for passing a --define flag to rpmbuild (via Naresh V)
* PHP pear source support (fpm -s pear ...) (via Andrew Gaffney)

0.3.10 (Oct 10, 2011)
^^^^^^^^^^^^^^^^^^^^^
* Allow taking a list of files/inputs on stdin with '-' or with the --inputs flag. (Matt Patterson)
* (python) pass -U to easy_install (Khalid Goudeaux)
* (debian) quote paths in md5sum calls (Matt Patterson)
* (debian) quiet stderr from dpkg --print-architecture

0.3.9 (Sep 8, 2011)
^^^^^^^^^^^^^^^^^^^
* Fix bug in 'dir' source that breaks full paths
* Added a bunch of tests (yaay)

0.3.8 and earlier: I have not kept this file up to date very well... Sorry :(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.2.29 (May 20, 2011)
^^^^^^^^^^^^^^^^^^^^^
* Add 'tar' source support. Useful for binary releases to repackage as rpms and debs. Example::

    fpm -s tar -t rpm -n firefox -v 4.0.1 --prefix /opt/firefox/4.0.1 firefox-4.0.1.tar.bz2

0.2.28 (May 18, 2011)
^^^^^^^^^^^^^^^^^^^^^
* Use --replaces as "Obsoletes" in rpms.

0.2.27 (May 18, 2011)
^^^^^^^^^^^^^^^^^^^^^
* If present, DEBEMAIL and DEBFULLNAME environment variables will be used as the default maintainer. Previously the default was simply <$user@$hostname> https://github.com/jordansissel/fpm/issues/37
* Add '--replaces' flag for specifying packages replaced by the one you are building. This only functions in .deb packages now until I find a suitable synonym in RPM.
* Add --python-bin and --python-easyinstall flags. This lets you choose specific python and easy_install tools to use when building. Default is simply 'python' and 'easy_install' respectively.
* Add support for ~/.fpmrc - The format of this file is the same as the flags.  One flag per line. https://github.com/jordansissel/fpm/issues/38. Example::

      --python-bin=/usr/bin/python2.7
      --python-easyinstall=/usr/bin/easy_install2.7

0.2.26 and earlier
^^^^^^^^^^^^^^^^^^
  No changelist tracked. My bad, yo.


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at jls@semicomplete.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]

[homepage]: https://contributor-covenant.org
[version]: https://contributor-covenant.org/version/1/4/


================================================
FILE: CONTRIBUTORS
================================================
The following awesome folks have contributed ideas, 
bug reports, code, or other to fpm:

anthezium
Curt Micol
Jeanine Adkisson
Jordan Sissel
Marc Fournier
Michael Blume
Pierre-Yves Ritschard
sabowski
Thomas Haggett
Pieter Loubser
Aleix Conchillo Flaqué (github: aconchillo)
Luke Macken (github: lmacken)
Matt Blair (github: mblair)
Thomas Meson (github: zllak)
Oliver Hookins (github: ohookins)
llasram
sbuss
Brett Gailey (github: dnbert)
Daniel Haskin (github: djhaskin987)
Richard Grainger (github: liger1978)
seph (github: directionless)

If you have contributed (bug reports, feature requests, help in IRC, blog
posts, code, etc) and aren't listed here, please let me know if you wish to be
added!


================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1

# Are we running against the minimal container, or the everything
# container? Minimal is mostly the compiled package tools. Everything
# pulls in scripting langauges.
ARG BASE_ENV=everything

# Are we running tests, or a release? Tests build and run against the
# CWD, where release will use the downloaded gem.
ARG TARGET=test

# Container to throw an error if called with a bare `docker build .`
FROM ubuntu:20.04 as error
RUN <<EOF
  printf '\n\n\n%s\n\n\n' "Hey! Use buildkit. See the Makefile or docs"
  false
EOF

# Base container is used for various release and test things
FROM ubuntu:20.04 as minimal-base
ARG DEBIAN_FRONTEND=noninteractive
ARG TZ=Etc/UTC
# Runtime deps. Build deps go in the build or test containers
# hadolint ignore=DL3009
RUN <<EOF
  apt-get update
  apt-get install --no-install-recommends --no-install-suggests -y \
    'ruby=*' \
    'ruby-dev=*' \
    'libarchive-tools=*' \
    'cpio=*' \
    'debsigs=*' \
    'pacman=*' \
    'rpm=*'  \
    'squashfs-tools=*' \
    'xz-utils=*' \
    'zip=*' \
    'gcc=*' \
    'libc6-dev=*' \
    'make=*' \
    'lintian=*' \
    'git=*'
    useradd -ms /bin/bash fpm
EOF

# everything container includes all the scripting languages. These
# greatly embiggen the underlying docker container, so they're
# conditionalized.
FROM minimal-base as everything-base
RUN <<EOF
  apt-get install --no-install-recommends --no-install-suggests -y \
    'cpanminus=*' \
    'npm=*' \
    'perl=*' \
    'python3-pip=*'
  pip3 --no-cache-dir install 'setuptools>=45' 'wheel>=0.34' 'virtualenv>=20' 'virtualenv-tools3>=2'
  update-alternatives --install /usr/bin/python python /usr/bin/python3 10
EOF

# hadolint ignore=DL3006
FROM ${BASE_ENV}-base as base
RUN <<EOF
  rm -rf /var/lib/apt/lists/*
  apt-get clean
EOF

# Run tests against the current working directory. This is a bit
# orthogonal to the container release process, but it has a lot of
# same dependancies, so we reuse it. This uses COPY to allow rspect to
# initall the gems, but runtime usage expects you to mount a volume
# into /src
FROM base AS test
# installing ffi here is a bit of an optimization for how COPY and layer reuse works
RUN gem install --no-document ffi:*
USER fpm
WORKDIR /origsrc
ENV HOME=/origsrc
ENV BUNDLE_PATH=/origsrc/.bundle
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN <<EOF
  # Install a specific version of bundler
  install -d -o fpm /origsrc
  gem install -v "$(grep -A1 '^BUNDLED WITH' Gemfile.lock | tail -1)" bundler:*
  bundle install
EOF

CMD ["bundle", "exec", "rspec"]

# build a container from a released gem. install build deps here, so
# we can omit them from the final release package
FROM base AS build
ENV GEM_PATH=/fpm
ENV PATH="/fpm/bin:${PATH}"
# hadolint ignore=DL3028
RUN gem install --no-document --install-dir=/fpm fpm

FROM base as release
COPY --from=build /fpm /fpm
ENV GEM_PATH=/fpm
ENV PATH="/fpm/bin:${PATH}"
USER fpm
WORKDIR /src
ENTRYPOINT ["/fpm/bin/fpm"]

# This target is to help docker buildkit in resolving things.
# hadolint ignore=DL3006
FROM ${TARGET}


================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'

gemspec


================================================
FILE: LICENSE
================================================
(This is an MIT-style license)

Copyright (c) 2011-2021 Jordan Sissel and contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: Makefile
================================================
GEMSPEC=$(shell ls *.gemspec)
VERSION=$(shell awk -F\" '/VERSION =/ { print $$2 }' lib/fpm/version.rb)
NAME=$(shell awk -F\" '/spec.name/ { print $$2 }' $(GEMSPEC))
GEM=$(NAME)-$(VERSION).gem

.PHONY: test
test:
	rm -rf .yardoc
	sh notify-failure.sh rspec

.PHONY: testloop
testloop:
	while true; do \
		$(MAKE) test; \
		$(MAKE) wait-for-changes; \
	done

.PHONY: serve-coverage
serve-coverage:
	cd coverage; python -mSimpleHTTPServer

.PHONY: wait-for-changes
wait-for-changes:
	-inotifywait --exclude '\.swp' -e modify $$(find $(DIRS) -name '*.rb'; find $(DIRS) -type d)

.PHONY: package
package: | $(GEM)

.PHONY: gem
gem: $(GEM)

$(GEM):
	gem build $(GEMSPEC)

.PHONY: test-package
test-package: $(GEM)
	# Sometimes 'gem build' makes a faulty gem.
	gem unpack $(GEM)
	rm -rf ftw-$(VERSION)/

.PHONY: publish
publish: test-package
	gem push $(GEM)

.PHONY: install
install: $(GEM)
	gem install $(GEM)

.PHONY:
clean:
	rm -rf package-*/ *.rpm *.deb *.gz *.tar *.gem .yardoc/

publish-docs:
	$(MAKE) -C docs publish

release-prep: package
	rm -f docs/changelog_links.rst docs/cli-reference.rst
	make -C docs build package-type-cli

# Testing in docker.
# The dot file is a sentinal file that will built a docker image, and tag it.
# The normal make target runs said image, mounting CWD against it.
SECONDARY: .docker-test-minimal .docker-test-everything
.docker-test-%: Gemfile.lock fpm.gemspec Dockerfile
	DOCKER_BUILDKIT=1 docker build -t fpm-test-$*  --build-arg BASE_ENV=$* --build-arg TARGET=test .
	touch "$@"

docker-test-%: .docker-test-%
	docker run -v `pwd`:/src fpm-test-$*

docker-release-%:
	DOCKER_BUILDKIT=1 docker build -t fpm  --build-arg BASE_ENV=$* --build-arg TARGET=release --squash .



================================================
FILE: README.rst
================================================
fpm
===

|Gem|

The goal of fpm is to make it easy and quick to build packages such as rpms,
debs, OSX packages, etc.

fpm, as a project, exists to help you build packages, therefore:

* If fpm is not helping you make packages easily, then there is a bug in fpm.
* If you are having a bad time with fpm, then there is a bug in fpm.
* If the documentation is confusing, then this is a bug in fpm.

If there is a bug in fpm, then we can work together to fix it. If you wish to
report a bug/problem/whatever, I welcome you to do on `the project issue tracker`_.

.. _the project issue tracker: https://github.com/jordansissel/fpm/issues

You can find out how to use fpm in the `documentation`_.

.. _documentation: https://fpm.readthedocs.io/en/latest/

You can learn how to install fpm on your platform in the `installation guide`_.

.. _installation guide: https://fpm.readthedocs.io/en/latest/installation.html

Project Principles
------------------

* Community: If a newbie has a bad time, it's a bug.
* Engineering: Make it work, then make it right, then make it fast.
* Capabilities: If it doesn't do a thing today, we can make it do it tomorrow.


Backstory
---------

Sometimes packaging is done wrong (because you can't do it right for all
situations), but small tweaks can fix it.

And sometimes, there isn't a package available for the tool you need.

And sometimes if you ask "How do I get python 3.9 on RHEL 8?" some unhelpful
trolls will tell you to "Use another distro"

Further, job switches have me flipping between Ubuntu and CentOS. These use
two totally different package systems with completely different packaging
policies and support tools. Learning both was painful and confusing. I want to
save myself (and you) that pain in the future.

It should be easy to say "here's my install dir and here's some dependencies;
please make a package"

The Solution - FPM
------------------

I wanted a simple way to create packages without needing to memorize too much.

I wanted a tool to help me deliver software with minimal steps or training.

The goal of FPM is to be able to easily build platform-native packages.

With fpm, you can do many things, including:

* Creating packages easily (deb, rpm, freebsd, etc)
* Tweaking existing packages (removing files, changing metadata/dependencies)
* Stripping pre/post/maintainer scripts from packages

.. include: docs/installing

Things that should work
-----------------------

Sources:

* gem (even autodownloaded for you)
* python modules (autodownload for you)
* pear (also downloads for you)
* directories
* tar(.gz) archives
* rpm
* deb
* node packages (npm)
* pacman (ArchLinux) packages

Targets:

* deb
* rpm
* solaris
* freebsd
* tar
* directories
* Mac OS X `.pkg` files (`osxpkg`)
* pacman (ArchLinux) packages

.. include: docs/contributing

.. |Gem| image:: https://img.shields.io/gem/v/fpm.svg
   :target: https://rubygems.org/gems/fpm


================================================
FILE: Vagrantfile
================================================
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.


  config.vm.define "centos6" do |centos6|
    centos6.vm.box = "puppetlabs/centos-6.6-64-puppet"
  end

  config.vm.define "centos7" do |centos7|
    centos7.vm.box = "puppetlabs/centos-7.0-64-puppet"
  end

  config.vm.define "debian6" do |debian6|
    debian6.vm.box = "puppetlabs/debian-6.0.10-64-puppet"
  end

  config.vm.define "debian7" do |debian7|
    debian7.vm.box = "puppetlabs/centos-7.0-64-puppet"
  end

  config.vm.define "arch" do |arch|
    arch.vm.box = "jfredett/arch-puppet"
  end

  config.vm.define "freebsd10" do |freebsd10|
    freebsd10.vm.box = "tjay/freebsd-10.1"
  end

  config.vm.define :smartos do |smartos|
    smartos.vm.box = "smartos-base1310-64-virtualbox-20130806.box"
    smartos.vm.box_url = "http://dlc-int.openindiana.org/aszeszo/vagrant/smartos-base1310-64-virtualbox-20130806.box"
  end

  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = "test"
    puppet.manifest_file = "vagrant.pp"
  end
end


================================================
FILE: bin/fpm
================================================
#!/usr/bin/env ruby

$: << File.join(File.dirname(__FILE__), "..", "lib")
require "fpm"
require "fpm/command"

exit(FPM::Command.run || 0)


================================================
FILE: docs/Dockerfile
================================================
# This Dockerfile produces a docker image which is used to build the fpm docs.
FROM  debian:latest
RUN   apt-get update
RUN   DEBIAN_FRONTEND=noninteractive apt-get install -y python3-pip 
RUN   apt-get install -y python3-sphinx #pip3 install Sphinx
#==1.8
RUN   apt-get install -y python3-sphinx python3-sphinx-rtd-theme python3-sphinx-autobuild

CMD ["/bin/bash"] 


================================================
FILE: docs/Makefile
================================================
include Makefile.sphinx

IMAGE=fpm-sphinx
WORKDIR=./.work
GITROOT=$(shell git rev-parse --show-toplevel)
GITREMOTE=$(shell git remote -v | awk '/(push)/ {print $$2}')

GENERATED_FILES=cli-reference.rst changelog_links.rst

$(WORKDIR):
	mkdir $(WORKDIR)

# A task to generate reST syntax for issue links mentioned in CHANGELOG.rst
changelog_links.rst: ../CHANGELOG.rst Makefile
	grep -Eo '#[0-9]+' $< \
		| tr -d '#' \
		| awk '{printf ".. _#%s: https://github.com/jordansissel/fpm/issues/%s\n", $$1, $$1 }' \
		| sort -u > $@

# CLI reference is generated based on the the command line flags
cli-reference.rst: generate-cli-reference.rb Makefile
cli-reference.rst: ../lib/fpm/package/*.rb ../lib/fpm/package.rb
	ruby -I ../lib generate-cli-reference.rb > $@

package-type-cli: 
	$(MAKE) $(addprefix packages/cli/,$(addsuffix .rst,$(notdir $(basename $(wildcard ../lib/fpm/package/*.rb)))))

packages/cli:
	mkdir $@

packages/cli/%.rst: ../lib/fpm/package/%.rb packages/cli generate-cli-reference.rb Makefile
	ruby -I ../lib generate-cli-reference.rb $* > $@


.PHONY: docker-prep
docker-prep: Dockerfile
	@docker images fpm-sphinx | grep -q '^fpm-sphinx ' \
	|| docker build -t $(IMAGE) .

.PHONY: build
build: $(GENERATED_FILES) | docker-prep package-type-cli
	docker run -it -v $$PWD/../:/project:z $(IMAGE) sh -xc 'make -C /project/docs html && chown -R 1000:1000 /project/docs'


.PHONY: build
view: $(GENERATED_FILES) | docker-prep
	docker run -p 127.0.0.1:8000:8000 -it -v $$PWD/../:/project:z $(IMAGE) sh -xc 'make -C /project/docs livehtml'


================================================
FILE: docs/Makefile.sphinx
================================================
# Makefile for Sphinx documentation

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help
help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  applehelp  to make an Apple Help Book"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  epub3      to make an epub3"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  texinfo    to make Texinfo files"
	@echo "  info       to make Texinfo files and run them through makeinfo"
	@echo "  gettext    to make PO message catalogs"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  xml        to make Docutils-native XML files"
	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
	@echo "  coverage   to run coverage check of the documentation (if enabled)"

.PHONY: clean
clean:
	rm -rf $(BUILDDIR)/*

.PHONY: html
html:
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

.PHONY: dirhtml
dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

.PHONY: singlehtml
singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

.PHONY: pickle
pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

.PHONY: json
json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

.PHONY: htmlhelp
htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

.PHONY: qthelp
qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/fpm.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/fpm.qhc"

.PHONY: applehelp
applehelp:
	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
	@echo
	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
	@echo "N.B. You won't be able to view it unless you put it in" \
	      "~/Library/Documentation/Help or install it in your application" \
	      "bundle."

.PHONY: devhelp
devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/fpm"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/fpm"
	@echo "# devhelp"

.PHONY: epub
epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

.PHONY: epub3
epub3:
	$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
	@echo
	@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."

.PHONY: latex
latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

.PHONY: latexpdf
latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

.PHONY: latexpdfja
latexpdfja:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through platex and dvipdfmx..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

.PHONY: text
text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

.PHONY: man
man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

.PHONY: texinfo
texinfo:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
	@echo "Run \`make' in that directory to run these through makeinfo" \
	      "(use \`make info' here to do that automatically)."

.PHONY: info
info:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo "Running Texinfo files through makeinfo..."
	make -C $(BUILDDIR)/texinfo info
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

.PHONY: gettext
gettext:
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
	@echo
	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."

.PHONY: changes
changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

.PHONY: linkcheck
linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

.PHONY: doctest
doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."

.PHONY: coverage
coverage:
	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
	@echo "Testing of coverage in the sources finished, look at the " \
	      "results in $(BUILDDIR)/coverage/python.txt."

.PHONY: xml
xml:
	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
	@echo
	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."

.PHONY: pseudoxml
pseudoxml:
	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
	@echo
	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

livehtml:
		sphinx-autobuild --host 0.0.0.0 "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)



================================================
FILE: docs/changelog.rst
================================================
.. include:: changelog_links.rst
.. include:: ../CHANGELOG.rst


================================================
FILE: docs/changelog_links.rst
================================================
.. _#1006: https://github.com/jordansissel/fpm/issues/1006
.. _#1008: https://github.com/jordansissel/fpm/issues/1008
.. _#1012: https://github.com/jordansissel/fpm/issues/1012
.. _#1053: https://github.com/jordansissel/fpm/issues/1053
.. _#1054: https://github.com/jordansissel/fpm/issues/1054
.. _#1073: https://github.com/jordansissel/fpm/issues/1073
.. _#1090: https://github.com/jordansissel/fpm/issues/1090
.. _#1093: https://github.com/jordansissel/fpm/issues/1093
.. _#1101: https://github.com/jordansissel/fpm/issues/1101
.. _#1112: https://github.com/jordansissel/fpm/issues/1112
.. _#1113: https://github.com/jordansissel/fpm/issues/1113
.. _#1115: https://github.com/jordansissel/fpm/issues/1115
.. _#1119: https://github.com/jordansissel/fpm/issues/1119
.. _#1120: https://github.com/jordansissel/fpm/issues/1120
.. _#1123: https://github.com/jordansissel/fpm/issues/1123
.. _#1132: https://github.com/jordansissel/fpm/issues/1132
.. _#1134: https://github.com/jordansissel/fpm/issues/1134
.. _#1146: https://github.com/jordansissel/fpm/issues/1146
.. _#1147: https://github.com/jordansissel/fpm/issues/1147
.. _#1148: https://github.com/jordansissel/fpm/issues/1148
.. _#1191: https://github.com/jordansissel/fpm/issues/1191
.. _#1196: https://github.com/jordansissel/fpm/issues/1196
.. _#1202: https://github.com/jordansissel/fpm/issues/1202
.. _#1203: https://github.com/jordansissel/fpm/issues/1203
.. _#1206: https://github.com/jordansissel/fpm/issues/1206
.. _#1208: https://github.com/jordansissel/fpm/issues/1208
.. _#1210: https://github.com/jordansissel/fpm/issues/1210
.. _#1213: https://github.com/jordansissel/fpm/issues/1213
.. _#1218: https://github.com/jordansissel/fpm/issues/1218
.. _#1225: https://github.com/jordansissel/fpm/issues/1225
.. _#1231: https://github.com/jordansissel/fpm/issues/1231
.. _#1235: https://github.com/jordansissel/fpm/issues/1235
.. _#1236: https://github.com/jordansissel/fpm/issues/1236
.. _#1237: https://github.com/jordansissel/fpm/issues/1237
.. _#1241: https://github.com/jordansissel/fpm/issues/1241
.. _#1242: https://github.com/jordansissel/fpm/issues/1242
.. _#1253: https://github.com/jordansissel/fpm/issues/1253
.. _#1259: https://github.com/jordansissel/fpm/issues/1259
.. _#1262: https://github.com/jordansissel/fpm/issues/1262
.. _#1264: https://github.com/jordansissel/fpm/issues/1264
.. _#1266: https://github.com/jordansissel/fpm/issues/1266
.. _#1287: https://github.com/jordansissel/fpm/issues/1287
.. _#1291: https://github.com/jordansissel/fpm/issues/1291
.. _#1293: https://github.com/jordansissel/fpm/issues/1293
.. _#1307: https://github.com/jordansissel/fpm/issues/1307
.. _#1309: https://github.com/jordansissel/fpm/issues/1309
.. _#1311: https://github.com/jordansissel/fpm/issues/1311
.. _#1313: https://github.com/jordansissel/fpm/issues/1313
.. _#1314: https://github.com/jordansissel/fpm/issues/1314
.. _#1320: https://github.com/jordansissel/fpm/issues/1320
.. _#1321: https://github.com/jordansissel/fpm/issues/1321
.. _#1325: https://github.com/jordansissel/fpm/issues/1325
.. _#1338: https://github.com/jordansissel/fpm/issues/1338
.. _#1339: https://github.com/jordansissel/fpm/issues/1339
.. _#1340: https://github.com/jordansissel/fpm/issues/1340
.. _#1341: https://github.com/jordansissel/fpm/issues/1341
.. _#1342: https://github.com/jordansissel/fpm/issues/1342
.. _#1343: https://github.com/jordansissel/fpm/issues/1343
.. _#1344: https://github.com/jordansissel/fpm/issues/1344
.. _#1345: https://github.com/jordansissel/fpm/issues/1345
.. _#1348: https://github.com/jordansissel/fpm/issues/1348
.. _#1349: https://github.com/jordansissel/fpm/issues/1349
.. _#1352: https://github.com/jordansissel/fpm/issues/1352
.. _#1354: https://github.com/jordansissel/fpm/issues/1354
.. _#1355: https://github.com/jordansissel/fpm/issues/1355
.. _#1358: https://github.com/jordansissel/fpm/issues/1358
.. _#1359: https://github.com/jordansissel/fpm/issues/1359
.. _#1374: https://github.com/jordansissel/fpm/issues/1374
.. _#1376: https://github.com/jordansissel/fpm/issues/1376
.. _#1379: https://github.com/jordansissel/fpm/issues/1379
.. _#1384: https://github.com/jordansissel/fpm/issues/1384
.. _#1385: https://github.com/jordansissel/fpm/issues/1385
.. _#1390: https://github.com/jordansissel/fpm/issues/1390
.. _#1391: https://github.com/jordansissel/fpm/issues/1391
.. _#1395: https://github.com/jordansissel/fpm/issues/1395
.. _#1419: https://github.com/jordansissel/fpm/issues/1419
.. _#1422: https://github.com/jordansissel/fpm/issues/1422
.. _#1434: https://github.com/jordansissel/fpm/issues/1434
.. _#1440: https://github.com/jordansissel/fpm/issues/1440
.. _#1443: https://github.com/jordansissel/fpm/issues/1443
.. _#1447: https://github.com/jordansissel/fpm/issues/1447
.. _#1452: https://github.com/jordansissel/fpm/issues/1452
.. _#1453: https://github.com/jordansissel/fpm/issues/1453
.. _#1482: https://github.com/jordansissel/fpm/issues/1482
.. _#1484: https://github.com/jordansissel/fpm/issues/1484
.. _#1488: https://github.com/jordansissel/fpm/issues/1488
.. _#1490: https://github.com/jordansissel/fpm/issues/1490
.. _#1492: https://github.com/jordansissel/fpm/issues/1492
.. _#1494: https://github.com/jordansissel/fpm/issues/1494
.. _#1509: https://github.com/jordansissel/fpm/issues/1509
.. _#1511: https://github.com/jordansissel/fpm/issues/1511
.. _#1514: https://github.com/jordansissel/fpm/issues/1514
.. _#1515: https://github.com/jordansissel/fpm/issues/1515
.. _#1519: https://github.com/jordansissel/fpm/issues/1519
.. _#1522: https://github.com/jordansissel/fpm/issues/1522
.. _#1523: https://github.com/jordansissel/fpm/issues/1523
.. _#1528: https://github.com/jordansissel/fpm/issues/1528
.. _#1592: https://github.com/jordansissel/fpm/issues/1592
.. _#1627: https://github.com/jordansissel/fpm/issues/1627
.. _#1636: https://github.com/jordansissel/fpm/issues/1636
.. _#1642: https://github.com/jordansissel/fpm/issues/1642
.. _#1667: https://github.com/jordansissel/fpm/issues/1667
.. _#1668: https://github.com/jordansissel/fpm/issues/1668
.. _#1682: https://github.com/jordansissel/fpm/issues/1682
.. _#1697: https://github.com/jordansissel/fpm/issues/1697
.. _#1699: https://github.com/jordansissel/fpm/issues/1699
.. _#1709: https://github.com/jordansissel/fpm/issues/1709
.. _#1710: https://github.com/jordansissel/fpm/issues/1710
.. _#1711: https://github.com/jordansissel/fpm/issues/1711
.. _#171: https://github.com/jordansissel/fpm/issues/171
.. _#1724: https://github.com/jordansissel/fpm/issues/1724
.. _#1727: https://github.com/jordansissel/fpm/issues/1727
.. _#1729: https://github.com/jordansissel/fpm/issues/1729
.. _#1737: https://github.com/jordansissel/fpm/issues/1737
.. _#1738: https://github.com/jordansissel/fpm/issues/1738
.. _#1739: https://github.com/jordansissel/fpm/issues/1739
.. _#1740: https://github.com/jordansissel/fpm/issues/1740
.. _#1741: https://github.com/jordansissel/fpm/issues/1741
.. _#1745: https://github.com/jordansissel/fpm/issues/1745
.. _#1748: https://github.com/jordansissel/fpm/issues/1748
.. _#1749: https://github.com/jordansissel/fpm/issues/1749
.. _#1751: https://github.com/jordansissel/fpm/issues/1751
.. _#1752: https://github.com/jordansissel/fpm/issues/1752
.. _#1753: https://github.com/jordansissel/fpm/issues/1753
.. _#1760: https://github.com/jordansissel/fpm/issues/1760
.. _#1761: https://github.com/jordansissel/fpm/issues/1761
.. _#1764: https://github.com/jordansissel/fpm/issues/1764
.. _#1766: https://github.com/jordansissel/fpm/issues/1766
.. _#1772: https://github.com/jordansissel/fpm/issues/1772
.. _#1774: https://github.com/jordansissel/fpm/issues/1774
.. _#1775: https://github.com/jordansissel/fpm/issues/1775
.. _#1784: https://github.com/jordansissel/fpm/issues/1784
.. _#1785: https://github.com/jordansissel/fpm/issues/1785
.. _#1786: https://github.com/jordansissel/fpm/issues/1786
.. _#1788: https://github.com/jordansissel/fpm/issues/1788
.. _#1794: https://github.com/jordansissel/fpm/issues/1794
.. _#1797: https://github.com/jordansissel/fpm/issues/1797
.. _#1798: https://github.com/jordansissel/fpm/issues/1798
.. _#1800: https://github.com/jordansissel/fpm/issues/1800
.. _#1803: https://github.com/jordansissel/fpm/issues/1803
.. _#1811: https://github.com/jordansissel/fpm/issues/1811
.. _#1812: https://github.com/jordansissel/fpm/issues/1812
.. _#1815: https://github.com/jordansissel/fpm/issues/1815
.. _#1816: https://github.com/jordansissel/fpm/issues/1816
.. _#1817: https://github.com/jordansissel/fpm/issues/1817
.. _#1818: https://github.com/jordansissel/fpm/issues/1818
.. _#1820: https://github.com/jordansissel/fpm/issues/1820
.. _#1821: https://github.com/jordansissel/fpm/issues/1821
.. _#1823: https://github.com/jordansissel/fpm/issues/1823
.. _#1825: https://github.com/jordansissel/fpm/issues/1825
.. _#1827: https://github.com/jordansissel/fpm/issues/1827
.. _#1829: https://github.com/jordansissel/fpm/issues/1829
.. _#1831: https://github.com/jordansissel/fpm/issues/1831
.. _#1832: https://github.com/jordansissel/fpm/issues/1832
.. _#1833: https://github.com/jordansissel/fpm/issues/1833
.. _#1834: https://github.com/jordansissel/fpm/issues/1834
.. _#1838: https://github.com/jordansissel/fpm/issues/1838
.. _#1842: https://github.com/jordansissel/fpm/issues/1842
.. _#1844: https://github.com/jordansissel/fpm/issues/1844
.. _#1845: https://github.com/jordansissel/fpm/issues/1845
.. _#1846: https://github.com/jordansissel/fpm/issues/1846
.. _#1850: https://github.com/jordansissel/fpm/issues/1850
.. _#1851: https://github.com/jordansissel/fpm/issues/1851
.. _#1852: https://github.com/jordansissel/fpm/issues/1852
.. _#1854: https://github.com/jordansissel/fpm/issues/1854
.. _#1856: https://github.com/jordansissel/fpm/issues/1856
.. _#185: https://github.com/jordansissel/fpm/issues/185
.. _#1864: https://github.com/jordansissel/fpm/issues/1864
.. _#186: https://github.com/jordansissel/fpm/issues/186
.. _#1875: https://github.com/jordansissel/fpm/issues/1875
.. _#1876: https://github.com/jordansissel/fpm/issues/1876
.. _#1877: https://github.com/jordansissel/fpm/issues/1877
.. _#1879: https://github.com/jordansissel/fpm/issues/1879
.. _#187: https://github.com/jordansissel/fpm/issues/187
.. _#1880: https://github.com/jordansissel/fpm/issues/1880
.. _#1882: https://github.com/jordansissel/fpm/issues/1882
.. _#1884: https://github.com/jordansissel/fpm/issues/1884
.. _#1886: https://github.com/jordansissel/fpm/issues/1886
.. _#1893: https://github.com/jordansissel/fpm/issues/1893
.. _#1895: https://github.com/jordansissel/fpm/issues/1895
.. _#1896: https://github.com/jordansissel/fpm/issues/1896
.. _#1897: https://github.com/jordansissel/fpm/issues/1897
.. _#1898: https://github.com/jordansissel/fpm/issues/1898
.. _#1899: https://github.com/jordansissel/fpm/issues/1899
.. _#1902: https://github.com/jordansissel/fpm/issues/1902
.. _#1905: https://github.com/jordansissel/fpm/issues/1905
.. _#1907: https://github.com/jordansissel/fpm/issues/1907
.. _#1908: https://github.com/jordansissel/fpm/issues/1908
.. _#1909: https://github.com/jordansissel/fpm/issues/1909
.. _#190: https://github.com/jordansissel/fpm/issues/190
.. _#1912: https://github.com/jordansissel/fpm/issues/1912
.. _#1913: https://github.com/jordansissel/fpm/issues/1913
.. _#1916: https://github.com/jordansissel/fpm/issues/1916
.. _#191: https://github.com/jordansissel/fpm/issues/191
.. _#1923: https://github.com/jordansissel/fpm/issues/1923
.. _#1934: https://github.com/jordansissel/fpm/issues/1934
.. _#1935: https://github.com/jordansissel/fpm/issues/1935
.. _#1937: https://github.com/jordansissel/fpm/issues/1937
.. _#1939: https://github.com/jordansissel/fpm/issues/1939
.. _#193: https://github.com/jordansissel/fpm/issues/193
.. _#1940: https://github.com/jordansissel/fpm/issues/1940
.. _#1942: https://github.com/jordansissel/fpm/issues/1942
.. _#1946: https://github.com/jordansissel/fpm/issues/1946
.. _#1948: https://github.com/jordansissel/fpm/issues/1948
.. _#1949: https://github.com/jordansissel/fpm/issues/1949
.. _#194: https://github.com/jordansissel/fpm/issues/194
.. _#1950: https://github.com/jordansissel/fpm/issues/1950
.. _#1955: https://github.com/jordansissel/fpm/issues/1955
.. _#1959: https://github.com/jordansissel/fpm/issues/1959
.. _#196: https://github.com/jordansissel/fpm/issues/196
.. _#1978: https://github.com/jordansissel/fpm/issues/1978
.. _#1981: https://github.com/jordansissel/fpm/issues/1981
.. _#1982: https://github.com/jordansissel/fpm/issues/1982
.. _#1988: https://github.com/jordansissel/fpm/issues/1988
.. _#198: https://github.com/jordansissel/fpm/issues/198
.. _#2009: https://github.com/jordansissel/fpm/issues/2009
.. _#2011: https://github.com/jordansissel/fpm/issues/2011
.. _#2017: https://github.com/jordansissel/fpm/issues/2017
.. _#2027: https://github.com/jordansissel/fpm/issues/2027
.. _#2029: https://github.com/jordansissel/fpm/issues/2029
.. _#202: https://github.com/jordansissel/fpm/issues/202
.. _#2036: https://github.com/jordansissel/fpm/issues/2036
.. _#2040: https://github.com/jordansissel/fpm/issues/2040
.. _#2041: https://github.com/jordansissel/fpm/issues/2041
.. _#204: https://github.com/jordansissel/fpm/issues/204
.. _#2053: https://github.com/jordansissel/fpm/issues/2053
.. _#2054: https://github.com/jordansissel/fpm/issues/2054
.. _#205: https://github.com/jordansissel/fpm/issues/205
.. _#2062: https://github.com/jordansissel/fpm/issues/2062
.. _#2063: https://github.com/jordansissel/fpm/issues/2063
.. _#2064: https://github.com/jordansissel/fpm/issues/2064
.. _#2065: https://github.com/jordansissel/fpm/issues/2065
.. _#2066: https://github.com/jordansissel/fpm/issues/2066
.. _#2067: https://github.com/jordansissel/fpm/issues/2067
.. _#2068: https://github.com/jordansissel/fpm/issues/2068
.. _#206: https://github.com/jordansissel/fpm/issues/206
.. _#2072: https://github.com/jordansissel/fpm/issues/2072
.. _#2074: https://github.com/jordansissel/fpm/issues/2074
.. _#2076: https://github.com/jordansissel/fpm/issues/2076
.. _#207: https://github.com/jordansissel/fpm/issues/207
.. _#2082: https://github.com/jordansissel/fpm/issues/2082
.. _#2084: https://github.com/jordansissel/fpm/issues/2084
.. _#2085: https://github.com/jordansissel/fpm/issues/2085
.. _#2087: https://github.com/jordansissel/fpm/issues/2087
.. _#2088: https://github.com/jordansissel/fpm/issues/2088
.. _#208: https://github.com/jordansissel/fpm/issues/208
.. _#2092: https://github.com/jordansissel/fpm/issues/2092
.. _#2102: https://github.com/jordansissel/fpm/issues/2102
.. _#2103: https://github.com/jordansissel/fpm/issues/2103
.. _#2104: https://github.com/jordansissel/fpm/issues/2104
.. _#2105: https://github.com/jordansissel/fpm/issues/2105
.. _#2106: https://github.com/jordansissel/fpm/issues/2106
.. _#212: https://github.com/jordansissel/fpm/issues/212
.. _#213: https://github.com/jordansissel/fpm/issues/213
.. _#215: https://github.com/jordansissel/fpm/issues/215
.. _#216: https://github.com/jordansissel/fpm/issues/216
.. _#217: https://github.com/jordansissel/fpm/issues/217
.. _#221: https://github.com/jordansissel/fpm/issues/221
.. _#222: https://github.com/jordansissel/fpm/issues/222
.. _#223: https://github.com/jordansissel/fpm/issues/223
.. _#228: https://github.com/jordansissel/fpm/issues/228
.. _#232: https://github.com/jordansissel/fpm/issues/232
.. _#233: https://github.com/jordansissel/fpm/issues/233
.. _#234: https://github.com/jordansissel/fpm/issues/234
.. _#240: https://github.com/jordansissel/fpm/issues/240
.. _#244: https://github.com/jordansissel/fpm/issues/244
.. _#245: https://github.com/jordansissel/fpm/issues/245
.. _#248: https://github.com/jordansissel/fpm/issues/248
.. _#250: https://github.com/jordansissel/fpm/issues/250
.. _#251: https://github.com/jordansissel/fpm/issues/251
.. _#252: https://github.com/jordansissel/fpm/issues/252
.. _#253: https://github.com/jordansissel/fpm/issues/253
.. _#255: https://github.com/jordansissel/fpm/issues/255
.. _#257: https://github.com/jordansissel/fpm/issues/257
.. _#260: https://github.com/jordansissel/fpm/issues/260
.. _#263: https://github.com/jordansissel/fpm/issues/263
.. _#266: https://github.com/jordansissel/fpm/issues/266
.. _#269: https://github.com/jordansissel/fpm/issues/269
.. _#273: https://github.com/jordansissel/fpm/issues/273
.. _#274: https://github.com/jordansissel/fpm/issues/274
.. _#276: https://github.com/jordansissel/fpm/issues/276
.. _#278: https://github.com/jordansissel/fpm/issues/278
.. _#279: https://github.com/jordansissel/fpm/issues/279
.. _#280: https://github.com/jordansissel/fpm/issues/280
.. _#281: https://github.com/jordansissel/fpm/issues/281
.. _#284: https://github.com/jordansissel/fpm/issues/284
.. _#285: https://github.com/jordansissel/fpm/issues/285
.. _#287: https://github.com/jordansissel/fpm/issues/287
.. _#288: https://github.com/jordansissel/fpm/issues/288
.. _#289: https://github.com/jordansissel/fpm/issues/289
.. _#291: https://github.com/jordansissel/fpm/issues/291
.. _#292: https://github.com/jordansissel/fpm/issues/292
.. _#293: https://github.com/jordansissel/fpm/issues/293
.. _#294: https://github.com/jordansissel/fpm/issues/294
.. _#296: https://github.com/jordansissel/fpm/issues/296
.. _#297: https://github.com/jordansissel/fpm/issues/297
.. _#299: https://github.com/jordansissel/fpm/issues/299
.. _#300: https://github.com/jordansissel/fpm/issues/300
.. _#301: https://github.com/jordansissel/fpm/issues/301
.. _#304: https://github.com/jordansissel/fpm/issues/304
.. _#309: https://github.com/jordansissel/fpm/issues/309
.. _#310: https://github.com/jordansissel/fpm/issues/310
.. _#311: https://github.com/jordansissel/fpm/issues/311
.. _#312: https://github.com/jordansissel/fpm/issues/312
.. _#315: https://github.com/jordansissel/fpm/issues/315
.. _#316: https://github.com/jordansissel/fpm/issues/316
.. _#319: https://github.com/jordansissel/fpm/issues/319
.. _#320: https://github.com/jordansissel/fpm/issues/320
.. _#321: https://github.com/jordansissel/fpm/issues/321
.. _#323: https://github.com/jordansissel/fpm/issues/323
.. _#325: https://github.com/jordansissel/fpm/issues/325
.. _#329: https://github.com/jordansissel/fpm/issues/329
.. _#332: https://github.com/jordansissel/fpm/issues/332
.. _#337: https://github.com/jordansissel/fpm/issues/337
.. _#342: https://github.com/jordansissel/fpm/issues/342
.. _#343: https://github.com/jordansissel/fpm/issues/343
.. _#344: https://github.com/jordansissel/fpm/issues/344
.. _#347: https://github.com/jordansissel/fpm/issues/347
.. _#358: https://github.com/jordansissel/fpm/issues/358
.. _#359: https://github.com/jordansissel/fpm/issues/359
.. _#363: https://github.com/jordansissel/fpm/issues/363
.. _#364: https://github.com/jordansissel/fpm/issues/364
.. _#365: https://github.com/jordansissel/fpm/issues/365
.. _#374: https://github.com/jordansissel/fpm/issues/374
.. _#376: https://github.com/jordansissel/fpm/issues/376
.. _#377: https://github.com/jordansissel/fpm/issues/377
.. _#378: https://github.com/jordansissel/fpm/issues/378
.. _#381: https://github.com/jordansissel/fpm/issues/381
.. _#383: https://github.com/jordansissel/fpm/issues/383
.. _#384: https://github.com/jordansissel/fpm/issues/384
.. _#385: https://github.com/jordansissel/fpm/issues/385
.. _#386: https://github.com/jordansissel/fpm/issues/386
.. _#388: https://github.com/jordansissel/fpm/issues/388
.. _#389: https://github.com/jordansissel/fpm/issues/389
.. _#393: https://github.com/jordansissel/fpm/issues/393
.. _#394: https://github.com/jordansissel/fpm/issues/394
.. _#395: https://github.com/jordansissel/fpm/issues/395
.. _#396: https://github.com/jordansissel/fpm/issues/396
.. _#398: https://github.com/jordansissel/fpm/issues/398
.. _#399: https://github.com/jordansissel/fpm/issues/399
.. _#400: https://github.com/jordansissel/fpm/issues/400
.. _#401: https://github.com/jordansissel/fpm/issues/401
.. _#403: https://github.com/jordansissel/fpm/issues/403
.. _#404: https://github.com/jordansissel/fpm/issues/404
.. _#405: https://github.com/jordansissel/fpm/issues/405
.. _#416: https://github.com/jordansissel/fpm/issues/416
.. _#420: https://github.com/jordansissel/fpm/issues/420
.. _#428: https://github.com/jordansissel/fpm/issues/428
.. _#438: https://github.com/jordansissel/fpm/issues/438
.. _#439: https://github.com/jordansissel/fpm/issues/439
.. _#442: https://github.com/jordansissel/fpm/issues/442
.. _#443: https://github.com/jordansissel/fpm/issues/443
.. _#445: https://github.com/jordansissel/fpm/issues/445
.. _#447: https://github.com/jordansissel/fpm/issues/447
.. _#450: https://github.com/jordansissel/fpm/issues/450
.. _#451: https://github.com/jordansissel/fpm/issues/451
.. _#461: https://github.com/jordansissel/fpm/issues/461
.. _#464: https://github.com/jordansissel/fpm/issues/464
.. _#465: https://github.com/jordansissel/fpm/issues/465
.. _#476: https://github.com/jordansissel/fpm/issues/476
.. _#480: https://github.com/jordansissel/fpm/issues/480
.. _#481: https://github.com/jordansissel/fpm/issues/481
.. _#484: https://github.com/jordansissel/fpm/issues/484
.. _#487: https://github.com/jordansissel/fpm/issues/487
.. _#491: https://github.com/jordansissel/fpm/issues/491
.. _#498: https://github.com/jordansissel/fpm/issues/498
.. _#500: https://github.com/jordansissel/fpm/issues/500
.. _#502: https://github.com/jordansissel/fpm/issues/502
.. _#503: https://github.com/jordansissel/fpm/issues/503
.. _#504: https://github.com/jordansissel/fpm/issues/504
.. _#506: https://github.com/jordansissel/fpm/issues/506
.. _#507: https://github.com/jordansissel/fpm/issues/507
.. _#508: https://github.com/jordansissel/fpm/issues/508
.. _#510: https://github.com/jordansissel/fpm/issues/510
.. _#511: https://github.com/jordansissel/fpm/issues/511
.. _#513: https://github.com/jordansissel/fpm/issues/513
.. _#518: https://github.com/jordansissel/fpm/issues/518
.. _#521: https://github.com/jordansissel/fpm/issues/521
.. _#524: https://github.com/jordansissel/fpm/issues/524
.. _#539: https://github.com/jordansissel/fpm/issues/539
.. _#543: https://github.com/jordansissel/fpm/issues/543
.. _#544: https://github.com/jordansissel/fpm/issues/544
.. _#545: https://github.com/jordansissel/fpm/issues/545
.. _#547: https://github.com/jordansissel/fpm/issues/547
.. _#554: https://github.com/jordansissel/fpm/issues/554
.. _#556: https://github.com/jordansissel/fpm/issues/556
.. _#561: https://github.com/jordansissel/fpm/issues/561
.. _#567: https://github.com/jordansissel/fpm/issues/567
.. _#573: https://github.com/jordansissel/fpm/issues/573
.. _#575: https://github.com/jordansissel/fpm/issues/575
.. _#585: https://github.com/jordansissel/fpm/issues/585
.. _#591: https://github.com/jordansissel/fpm/issues/591
.. _#593: https://github.com/jordansissel/fpm/issues/593
.. _#595: https://github.com/jordansissel/fpm/issues/595
.. _#598: https://github.com/jordansissel/fpm/issues/598
.. _#599: https://github.com/jordansissel/fpm/issues/599
.. _#603: https://github.com/jordansissel/fpm/issues/603
.. _#612: https://github.com/jordansissel/fpm/issues/612
.. _#614: https://github.com/jordansissel/fpm/issues/614
.. _#615: https://github.com/jordansissel/fpm/issues/615
.. _#616: https://github.com/jordansissel/fpm/issues/616
.. _#617: https://github.com/jordansissel/fpm/issues/617
.. _#623: https://github.com/jordansissel/fpm/issues/623
.. _#626: https://github.com/jordansissel/fpm/issues/626
.. _#628: https://github.com/jordansissel/fpm/issues/628
.. _#640: https://github.com/jordansissel/fpm/issues/640
.. _#642: https://github.com/jordansissel/fpm/issues/642
.. _#648: https://github.com/jordansissel/fpm/issues/648
.. _#651: https://github.com/jordansissel/fpm/issues/651
.. _#652: https://github.com/jordansissel/fpm/issues/652
.. _#654: https://github.com/jordansissel/fpm/issues/654
.. _#656: https://github.com/jordansissel/fpm/issues/656
.. _#658: https://github.com/jordansissel/fpm/issues/658
.. _#659: https://github.com/jordansissel/fpm/issues/659
.. _#661: https://github.com/jordansissel/fpm/issues/661
.. _#664: https://github.com/jordansissel/fpm/issues/664
.. _#676: https://github.com/jordansissel/fpm/issues/676
.. _#679: https://github.com/jordansissel/fpm/issues/679
.. _#687: https://github.com/jordansissel/fpm/issues/687
.. _#688: https://github.com/jordansissel/fpm/issues/688
.. _#707: https://github.com/jordansissel/fpm/issues/707
.. _#712: https://github.com/jordansissel/fpm/issues/712
.. _#714: https://github.com/jordansissel/fpm/issues/714
.. _#716: https://github.com/jordansissel/fpm/issues/716
.. _#719: https://github.com/jordansissel/fpm/issues/719
.. _#720: https://github.com/jordansissel/fpm/issues/720
.. _#724: https://github.com/jordansissel/fpm/issues/724
.. _#727: https://github.com/jordansissel/fpm/issues/727
.. _#734: https://github.com/jordansissel/fpm/issues/734
.. _#744: https://github.com/jordansissel/fpm/issues/744
.. _#752: https://github.com/jordansissel/fpm/issues/752
.. _#756: https://github.com/jordansissel/fpm/issues/756
.. _#758: https://github.com/jordansissel/fpm/issues/758
.. _#763: https://github.com/jordansissel/fpm/issues/763
.. _#765: https://github.com/jordansissel/fpm/issues/765
.. _#772: https://github.com/jordansissel/fpm/issues/772
.. _#776: https://github.com/jordansissel/fpm/issues/776
.. _#778: https://github.com/jordansissel/fpm/issues/778
.. _#779: https://github.com/jordansissel/fpm/issues/779
.. _#784: https://github.com/jordansissel/fpm/issues/784
.. _#787: https://github.com/jordansissel/fpm/issues/787
.. _#797: https://github.com/jordansissel/fpm/issues/797
.. _#799: https://github.com/jordansissel/fpm/issues/799
.. _#800: https://github.com/jordansissel/fpm/issues/800
.. _#801: https://github.com/jordansissel/fpm/issues/801
.. _#802: https://github.com/jordansissel/fpm/issues/802
.. _#806: https://github.com/jordansissel/fpm/issues/806
.. _#819: https://github.com/jordansissel/fpm/issues/819
.. _#822: https://github.com/jordansissel/fpm/issues/822
.. _#836: https://github.com/jordansissel/fpm/issues/836
.. _#849: https://github.com/jordansissel/fpm/issues/849
.. _#853: https://github.com/jordansissel/fpm/issues/853
.. _#860: https://github.com/jordansissel/fpm/issues/860
.. _#863: https://github.com/jordansissel/fpm/issues/863
.. _#877: https://github.com/jordansissel/fpm/issues/877
.. _#885: https://github.com/jordansissel/fpm/issues/885
.. _#886: https://github.com/jordansissel/fpm/issues/886
.. _#887: https://github.com/jordansissel/fpm/issues/887
.. _#896: https://github.com/jordansissel/fpm/issues/896
.. _#916: https://github.com/jordansissel/fpm/issues/916
.. _#930: https://github.com/jordansissel/fpm/issues/930
.. _#946: https://github.com/jordansissel/fpm/issues/946
.. _#952: https://github.com/jordansissel/fpm/issues/952
.. _#977: https://github.com/jordansissel/fpm/issues/977
.. _#982: https://github.com/jordansissel/fpm/issues/982
.. _#986: https://github.com/jordansissel/fpm/issues/986


================================================
FILE: docs/cli-reference.rst
================================================
Command-line Reference
==========================

This page documents the command-line flags available in FPM. You can also see this content in your terminal by running ``fpm --help``

General Options
---------------
* ``-C CHDIR``
    - Alternate option spellings: ``--chdir``
    - Change directory to here before searching for files

* ``-S PACKAGE_NAME_SUFFIX``
    - Alternate option spellings: ``--package-name-suffix``
    - a name suffix to append to package and dependencies.

* ``-a ARCHITECTURE``
    - Alternate option spellings: ``--architecture``
    - The architecture name. Usually matches 'uname -m'. For automatic values, you can use '-a all' or '-a native'. These two strings will be translated into the correct value for your platform and target package type.

* ``-d DEPENDENCY``
    - Alternate option spellings: ``--depends``
    - A dependency. This flag can be specified multiple times. Value is usually in the form of: -d 'name' or -d 'name > version'

* ``-e``
    - Alternate option spellings: ``--edit``
    - Edit the package spec before building.

* ``-f``
    - Alternate option spellings: ``--force``
    - Force output even if it will overwrite an existing file

* ``-m MAINTAINER``
    - Alternate option spellings: ``--maintainer``
    - The maintainer of this package.

* ``-n NAME``
    - Alternate option spellings: ``--name``
    - The name to give to the package

* ``-p OUTPUT``
    - Alternate option spellings: ``--package``
    - The package file path to output.

* ``-s INPUT_TYPE``
    - Alternate option spellings: ``--input-type``
    - the package type to use as input (gem, rpm, python, etc)

* ``-t OUTPUT_TYPE``
    - Alternate option spellings: ``--output-type``
    - the type of package you want to create (deb, rpm, solaris, etc)

* ``-v VERSION``
    - Alternate option spellings: ``--version``
    - The version to give to the package

* ``-x EXCLUDE_PATTERN``
    - Alternate option spellings: ``--exclude``
    - Exclude paths matching pattern (shell wildcard globs valid here). If you have multiple file patterns to exclude, specify this flag multiple times.

* ``--after-install FILE``
    - A script to be run after package installation

* ``--after-remove FILE``
    - A script to be run after package removal

* ``--after-upgrade FILE``
    - A script to be run after package upgrade. If not specified, --before-install, --after-install, --before-remove, and  --after-remove will behave in a backwards-compatible manner (they will not be upgrade-case aware). Currently only supports deb, rpm and pacman packages.

* ``--before-install FILE``
    - A script to be run before package installation

* ``--before-remove FILE``
    - A script to be run before package removal

* ``--before-upgrade FILE``
    - A script to be run before package upgrade. If not specified, --before-install, --after-install, --before-remove, and  --after-remove will behave in a backwards-compatible manner (they will not be upgrade-case aware). Currently only supports deb, rpm and pacman packages.

* ``--category CATEGORY``
    - (optional) category this package belongs to

* ``--config-files CONFIG_FILES``
    - Mark a file in the package as being a config file. This uses 'conffiles' in debs and %config in rpm. If you have multiple files to mark as configuration files, specify this flag multiple times.  If argument is directory all files inside it will be recursively marked as config files.

* ``--conflicts CONFLICTS``
    - Other packages/versions this package conflicts with. This flag can be specified multiple times.

* ``--debug``
    - Enable debug output

* ``--debug-workspace``
    - Keep any file workspaces around for debugging. This will disable automatic cleanup of package staging and build paths. It will also print which directories are available.

* ``--description DESCRIPTION``
    - Add a description for this package. You can include '\n' sequences to indicate newline breaks.

* ``--directories DIRECTORIES``
    - Recursively mark a directory as being owned by the package. Use this flag multiple times if you have multiple directories and they are not under the same parent directory 

* ``--epoch EPOCH``
    - The epoch value for this package. RPM and Debian calls this 'epoch'. FreeBSD calls this 'PORTEPOCH'

* ``--exclude-file EXCLUDE_PATH``
    - The path to a file containing a newline-sparated list of patterns to exclude from input.

* ``--fpm-options-file FPM_OPTIONS_FILE``
    - A file that contains additional fpm options. Any fpm flag format is valid in this file. This can be useful on build servers where you want to use a common configuration or inject other parameters from a file instead of from a command-line flag..

* ``--inputs INPUTS_PATH``
    - The path to a file containing a newline-separated list of files and dirs to use as input.

* ``--iteration ITERATION``
    - The iteration to give to the package. RPM calls this the 'release'. FreeBSD calls it 'PORTREVISION'. Debian calls this 'debian_revision'

* ``--license LICENSE``
    - (optional) license name for this package

* ``--log LEVEL``
    - Set the log level. Values: error, warn, info, debug.

* ``--no-auto-depends``
    - Do not list any dependencies in this package automatically

* ``--no-depends``
    - Do not list any dependencies in this package

* ``--post-install FILE``
    - (DEPRECATED, use --after-install) A script to be run after package installation

* ``--post-uninstall FILE``
    - (DEPRECATED, use --after-remove) A script to be run after package removal

* ``--pre-install FILE``
    - (DEPRECATED, use --before-install) A script to be run before package installation

* ``--pre-uninstall FILE``
    - (DEPRECATED, use --before-remove) A script to be run before package removal

* ``--prefix PREFIX``
    - A path to prefix files with when building the target package. This may not be necessary for all input packages. For example, the 'gem' type will prefix with your gem directory automatically.

* ``--provides PROVIDES``
    - What this package provides (usually a name). This flag can be specified multiple times.

* ``--replaces REPLACES``
    - Other packages/versions this package replaces. Equivalent of rpm's 'Obsoletes'. This flag can be specified multiple times.

* ``--source-date-epoch-default SOURCE_DATE_EPOCH_DEFAULT``
    - If no release date otherwise specified, use this value as timestamp on generated files to reduce nondeterminism. Reproducible build environments such as dpkg-dev and rpmbuild set this via envionment variable SOURCE_DATE_EPOCH variable to the integer unix timestamp to use in generated archives, and expect tools like fpm to use it as a hint to avoid nondeterministic output. This is a Unix timestamp, i.e. number of seconds since 1 Jan 1970 UTC. See https://reproducible-builds.org/specs/source-date-epoch 

* ``--source-date-epoch-from-changelog``
    - Use release date from changelog as timestamp on generated files to reduce nondeterminism. Experimental; only implemented for gem so far. 

* ``--template-scripts``
    - Allow scripts to be templated. This lets you use ERB to template your packaging scripts (for --after-install, etc). For example, you can do things like <%= name %> to get the package name. For more information, see the fpm wiki: https://github.com/jordansissel/fpm/wiki/Script-Templates

* ``--template-value KEY=VALUE``
    - Make 'key' available in script templates, so <%= key %> given will be the provided value. Implies --template-scripts

* ``--url URI``
    - Add a url for this package.

* ``--vendor VENDOR``
    - (optional) vendor name for this package

* ``--verbose``
    - Enable verbose output

* ``--workdir WORKDIR``
    - The directory you want fpm to do its work in, where 'work' is any file copying, downloading, etc. Roughly any scratch space fpm needs to build your package.

apk
---

This package type has no additional options

cpan
----

* ``--cpan-cpanm-bin CPANM_EXECUTABLE``
    - The path to the cpanm executable you wish to run.
* ``--[no-]cpan-cpanm-force``
    - Pass the --force parameter to cpanm
* ``--cpan-mirror CPAN_MIRROR``
    - The CPAN mirror to use instead of the default.
* ``--[no-]cpan-mirror-only``
    - Only use the specified mirror for metadata.
* ``--cpan-package-name-prefix NAME_PREFIX``
    - Name to prefix the package name with.
* ``--cpan-perl-bin PERL_EXECUTABLE``
    - The path to the perl executable you wish to run.
* ``--cpan-perl-lib-path PERL_LIB_PATH``
    - Path of target Perl Libraries
* ``--[no-]cpan-sandbox-non-core``
    - Sandbox all non-core modules, even if they're already installed
* ``--[no-]cpan-test``
    - Run the tests before packaging?
* ``--[no-]cpan-verbose``
    - Produce verbose output from cpanm?

deb
---

* ``--deb-activate EVENT``
    - Package activates EVENT trigger
* ``--deb-activate-noawait EVENT``
    - Package activates EVENT trigger
* ``--deb-after-purge FILE``
    - A script to be run after package removal to purge remaining (config) files (a.k.a. postrm purge within apt-get purge)
* ``--[no-]deb-auto-config-files``
    - Init script and default configuration files will be labeled as configuration files for Debian packages.
* ``--deb-build-depends DEPENDENCY``
    - Add DEPENDENCY as a Build-Depends
* ``--deb-changelog FILEPATH``
    - Add FILEPATH as debian changelog
* ``--deb-compression COMPRESSION``
    - The compression type to use, must be one of gz, bzip2, xz, zst, none.
* ``--deb-compression-level [0-9]``
    - Select a compression level. 0 is none or minimal. 9 is max compression.
* ``--deb-config SCRIPTPATH``
    - Add SCRIPTPATH as debconf config file.
* ``--deb-custom-control FILEPATH``
    - Custom version of the Debian control file.
* ``--deb-default FILEPATH``
    - Add FILEPATH as /etc/default configuration
* ``--deb-dist DIST-TAG``
    - Set the deb distribution.
* ``--deb-field 'FIELD: VALUE'``
    - Add custom field to the control file
* ``--[no-]deb-generate-changes``
    - Generate PACKAGENAME.changes file.
* ``--deb-group GROUP``
    - The group owner of files in this package
* ``--[no-]deb-ignore-iteration-in-dependencies``
    - For '=' (equal) dependencies, allow iterations on the specified version. Default is to be specific. This option allows the same version of a package but any iteration is permitted
* ``--deb-init FILEPATH``
    - Add FILEPATH as an init script
* ``--deb-installed-size KILOBYTES``
    - The installed size, in kilobytes. If omitted, this will be calculated automatically
* ``--deb-interest EVENT``
    - Package is interested in EVENT trigger
* ``--deb-interest-noawait EVENT``
    - Package is interested in EVENT trigger without awaiting
* ``--[no-]deb-maintainerscripts-force-errorchecks``
    - Activate errexit shell option according to lintian. https://lintian.debian.org/tags/maintainer-script-ignores-errors.html
* ``--deb-meta-file FILEPATH``
    - Add FILEPATH to DEBIAN directory
* ``--[no-]deb-no-default-config-files``
    - Do not add all files in /etc as configuration files by default for Debian packages.
* ``--deb-pre-depends DEPENDENCY``
    - Add DEPENDENCY as a Pre-Depends
* ``--deb-priority PRIORITY``
    - The debian package 'priority' value.
* ``--deb-recommends PACKAGE``
    - Add PACKAGE to Recommends
* ``--deb-shlibs SHLIBS``
    - Include control/shlibs content. This flag expects a string that is used as the contents of the shlibs file. See the following url for a description of this file and its format: http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-shlibs
* ``--deb-suggests PACKAGE``
    - Add PACKAGE to Suggests
* ``--deb-systemd FILEPATH``
    - Add FILEPATH as a systemd script
* ``--[no-]deb-systemd-auto-start``
    - Start service after install or upgrade
* ``--[no-]deb-systemd-enable``
    - Enable service on install or upgrade
* ``--deb-systemd-path FILEPATH``
    - Relative path to the systemd service directory
* ``--[no-]deb-systemd-restart-after-upgrade``
    - Restart service after upgrade
* ``--deb-templates FILEPATH``
    - Add FILEPATH as debconf templates file.
* ``--deb-upstart FILEPATH``
    - Add FILEPATH as an upstart script
* ``--deb-upstream-changelog FILEPATH``
    - Add FILEPATH as upstream changelog
* ``--[no-]deb-use-file-permissions``
    - Use existing file permissions when defining ownership and modes
* ``--deb-user USER``
    - The owner of files in this package

dir
---

This package type has no additional options

empty
-----

This package type has no additional options

freebsd
-------

* ``--freebsd-origin ABI``
    - Sets the FreeBSD 'origin' pkg field
* ``--freebsd-osversion VERSION``
    - Sets the FreeBSD 'version' pkg field, ie 12 or 13, use '*' for all.

gem
---

* ``--gem-bin-path DIRECTORY``
    - The directory to install gem executables
* ``--gem-disable-dependency gem_name``
    - The gem name to remove from dependency list
* ``--[no-]gem-embed-dependencies``
    - Should the gem dependencies be installed?
* ``--[no-]gem-env-shebang``
    - Should the target package have the shebang rewritten to use env?
* ``--[no-]gem-fix-dependencies``
    - Should the package dependencies be prefixed?
* ``--[no-]gem-fix-name``
    - Should the target package name be prefixed?
* ``--gem-gem PATH_TO_GEM``
    - The path to the 'gem' tool (defaults to 'gem' and searches your $PATH)
* ``--gem-git-branch GIT_BRANCH``
    - When using a git repo as the source of the gem instead of rubygems.org, use this git branch.
* ``--gem-git-repo GIT_REPO``
    - Use this git repo address as the source of the gem instead of rubygems.org.
* ``--gem-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--gem-package-prefix NAMEPREFIX``
    - (DEPRECATED, use --package-name-prefix) Name to prefix the package name with.
* ``--[no-]gem-prerelease``
    - Allow prerelease versions of a gem
* ``--gem-shebang SHEBANG``
    - Replace the shebang in the executables in the bin path with a custom string
* ``--gem-stagingdir STAGINGDIR``
    - The directory where fpm installs the gem temporarily before conversion. Normally a random subdirectory of workdir.
* ``--[no-]gem-version-bins``
    - Append the version to the bins

npm
---

* ``--npm-bin NPM_EXECUTABLE``
    - The path to the npm executable you wish to run.
* ``--npm-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--npm-registry NPM_REGISTRY``
    - The npm registry to use instead of the default.

osxpkg
------

* ``--osxpkg-dont-obsolete DONT_OBSOLETE_PATH``
    - A file path for which to 'dont-obsolete' in the built PackageInfo. Can be specified multiple times.
* ``--osxpkg-identifier-prefix IDENTIFIER_PREFIX``
    - Reverse domain prefix prepended to package identifier, ie. 'org.great.my'. If this is omitted, the identifer will be the package name.
* ``--osxpkg-ownership OWNERSHIP``
    - --ownership option passed to pkgbuild. Defaults to 'recommended'. See pkgbuild(1).
* ``--[no-]osxpkg-payload-free``
    - Define no payload, assumes use of script options.
* ``--osxpkg-postinstall-action POSTINSTALL_ACTION``
    - Post-install action provided in package metadata. Optionally one of 'logout', 'restart', 'shutdown'.

p5p
---

* ``--p5p-group GROUP``
    - Set the group to GROUP in the prototype file.
* ``--[no-]p5p-lint``
    - Check manifest with pkglint
* ``--p5p-publisher PUBLISHER``
    - Set the publisher name for the repository
* ``--p5p-user USER``
    - Set the user to USER in the prototype files.
* ``--[no-]p5p-validate``
    - Validate with pkg install
* ``--p5p-zonetype ZONETYPE``
    - Set the allowed zone types (global, nonglobal, both)

pacman
------

* ``--pacman-compression COMPRESSION``
    - The compression type to use, must be one of gz, bzip2, xz, zstd, none.
* ``--pacman-group GROUP``
    - The group owner of files in this package
* ``--pacman-optional-depends PACKAGE``
    - Add an optional dependency to the pacman package.
* ``--[no-]pacman-use-file-permissions``
    - Use existing file permissions when defining ownership and modes
* ``--pacman-user USER``
    - The owner of files in this package

pear
----

* ``--pear-bin-dir BIN_DIR``
    - Directory to put binaries in
* ``--pear-channel CHANNEL_URL``
    - The pear channel url to use instead of the default.
* ``--[no-]pear-channel-update``
    - call 'pear channel-update' prior to installation
* ``--pear-data-dir DATA_DIR``
    - Specify php dir relative to prefix if differs from pear default (pear/data)
* ``--pear-package-name-prefix PREFIX``
    - Name prefix for pear package
* ``--pear-php-bin PHP_BIN``
    - Specify php executable path if differs from the os used for packaging
* ``--pear-php-dir PHP_DIR``
    - Specify php dir relative to prefix if differs from pear default (pear/php)

pkgin
-----

This package type has no additional options

pleaserun
---------

* ``--pleaserun-chdir CHDIR``
    - The working directory used by the service
* ``--pleaserun-name SERVICE_NAME``
    - The name of the service you are creating
* ``--pleaserun-user USER``
    - The user to use for executing this program.

puppet
------

This package type has no additional options

python
------

* ``--python-bin PYTHON_EXECUTABLE``
    - The path to the python executable you wish to run.
* ``--[no-]python-dependencies``
    - Include requirements defined by the python package as dependencies.
* ``--python-disable-dependency python_package_name``
    - The python package name to remove from dependency list
* ``--[no-]python-downcase-dependencies``
    - Should the package dependencies be in lowercase?
* ``--[no-]python-downcase-name``
    - Should the target package name be in lowercase?
* ``--python-easyinstall EASYINSTALL_EXECUTABLE``
    - The path to the easy_install executable tool
* ``--[no-]python-fix-dependencies``
    - Should the package dependencies be prefixed?
* ``--[no-]python-fix-name``
    - Should the target package name be prefixed?
* ``--python-install-bin BIN_PATH``
    - (DEPRECATED, does nothing) The path to where python scripts should be installed to.
* ``--python-install-data DATA_PATH``
    - (DEPRECATED, does nothing) The path to where data should be installed to. This is equivalent to 'python setup.py --install-data DATA_PATH
* ``--python-install-lib LIB_PATH``
    - (DEPRECATED, does nothing) The path to where python libs should be installed to (default depends on your python installation). Want to find out what your target platform is using? Run this: python -c 'from distutils.sysconfig import get_python_lib; print get_python_lib()'
* ``--[no-]python-internal-pip``
    - Use the pip module within python to install modules - aka 'python -m pip'. This is the recommended usage since Python 3.4 (2014) instead of invoking the 'pip' script
* ``--[no-]python-obey-requirements-txt``
    - Use a requirements.txt file in the top-level directory of the python package for dependency detection.
* ``--python-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--python-package-prefix NAMEPREFIX``
    - (DEPRECATED, use --package-name-prefix) Name to prefix the package name with.
* ``--python-pip PIP_EXECUTABLE``
    - The path to the pip executable tool. If not specified, easy_install is used instead
* ``--python-pypi PYPI_URL``
    - PyPi Server uri for retrieving packages.
* ``--python-scripts-executable PYTHON_EXECUTABLE``
    - (DEPRECATED) Set custom python interpreter in installing scripts. By default distutils will replace python interpreter in installing scripts (specified by shebang) with current python interpreter (sys.executable). This option is equivalent to appending 'build_scripts --executable PYTHON_EXECUTABLE' arguments to 'setup.py install' command.
* ``--python-setup-py-arguments setup_py_argument``
    - (DEPRECATED) Arbitrary argument(s) to be passed to setup.py
* ``--python-trusted-host PYPI_TRUSTED``
    - Mark this host or host:port pair as trusted for pip

rpm
---

* ``--rpm-attr ATTRFILE``
    - Set the attribute for a file (%attr), e.g. --rpm-attr 750,user1,group1:/some/file
* ``--[no-]rpm-auto-add-directories``
    - Auto add directories not part of filesystem
* ``--rpm-auto-add-exclude-directories DIRECTORIES``
    - Additional directories ignored by '--rpm-auto-add-directories' flag
* ``--[no-]rpm-autoprov``
    - Enable RPM's AutoProv option
* ``--[no-]rpm-autoreq``
    - Enable RPM's AutoReq option
* ``--[no-]rpm-autoreqprov``
    - Enable RPM's AutoReqProv option
* ``--rpm-changelog FILEPATH``
    - Add changelog from FILEPATH contents
* ``--rpm-compression none|xz|xzmt|gzip|bzip2``
    - Select a compression method. gzip works on the most platforms.
* ``--rpm-compression-level [0-9]``
    - Select a compression level. 0 is store-only. 9 is max compression.
* ``--rpm-defattrdir ATTR``
    - Set the default dir mode (%defattr).
* ``--rpm-defattrfile ATTR``
    - Set the default file mode (%defattr).
* ``--rpm-digest md5|sha1|sha256|sha384|sha512``
    - Select a digest algorithm. md5 works on the most platforms.
* ``--rpm-dist DIST-TAG``
    - Set the rpm distribution.
* ``--rpm-filter-from-provides REGEX``
    - Set %filter_from_provides to the supplied REGEX.
* ``--rpm-filter-from-requires REGEX``
    - Set %filter_from_requires to the supplied REGEX.
* ``--rpm-group GROUP``
    - Set the group to GROUP in the %files section. Overrides the group when used with use-file-permissions setting.
* ``--[no-]rpm-ignore-iteration-in-dependencies``
    - For '=' (equal) dependencies, allow iterations on the specified version. Default is to be specific. This option allows the same version of a package but any iteration is permitted
* ``--rpm-init FILEPATH``
    - Add FILEPATH as an init script
* ``--[no-]rpm-macro-expansion``
    - install-time macro expansion in %pre %post %preun %postun scripts (see: https://rpm-software-management.github.io/rpm/manual/scriptlet_expansion.html)
* ``--[no-]rpm-old-perl-dependency-name``
    - Use older 'perl' depdency name. Newer Red Hat (and derivatives) use a dependency named 'perl-interpreter'.
* ``--rpm-os OS``
    - The operating system to target this rpm for. You want to set this to 'linux' if you are using fpm on OS X, for example
* ``--rpm-posttrans FILE``
    - posttrans script
* ``--rpm-pretrans FILE``
    - pretrans script
* ``--rpm-rpmbuild-define DEFINITION``
    - Pass a --define argument to rpmbuild.
* ``--[no-]rpm-sign``
    - Pass --sign to rpmbuild
* ``--rpm-summary SUMMARY``
    - Set the RPM summary. Overrides the first line on the description if set
* ``--rpm-tag TAG``
    - Adds a custom tag in the spec file as is. Example: --rpm-tag 'Requires(post): /usr/sbin/alternatives'
* ``--rpm-trigger-after-install '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-after-target-uninstall '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-before-install '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-before-uninstall '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--[no-]rpm-use-file-permissions``
    - Use existing file permissions when defining ownership and modes.
* ``--rpm-user USER``
    - Set the user to USER in the %files section. Overrides the user when used with use-file-permissions setting.
* ``--[no-]rpm-verbatim-gem-dependencies``
    - When converting from a gem, leave the old (fpm 0.4.x) style dependency names. This flag will use the old 'rubygem-foo' names in rpm requires instead of the redhat style rubygem(foo).
* ``--rpm-verifyscript FILE``
    - a script to be run on verification

sh
--

This package type has no additional options

snap
----

* ``--snap-confinement CONFINEMENT``
    - Type of confinement to use for this snap.
* ``--snap-grade GRADE``
    - Grade of this snap.
* ``--snap-yaml FILEPATH``
    - Custom version of the snap.yaml file.

solaris
-------

* ``--solaris-group GROUP``
    - Set the group to GROUP in the prototype file.
* ``--solaris-user USER``
    - Set the user to USER in the prototype files.

tar
---

This package type has no additional options

virtualenv
----------

* ``--virtualenv-find-links PIP_FIND_LINKS``
    - If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.
* ``--[no-]virtualenv-fix-name``
    - Should the target package name be prefixed?
* ``--virtualenv-install-location DIRECTORY``
    - DEPRECATED: Use --prefix instead.  Location to which to install the virtualenv by default.
* ``--virtualenv-other-files-dir DIRECTORY``
    - Optionally, the contents of the specified directory may be added to the package. This is useful if the virtualenv needs configuration files, etc.
* ``--virtualenv-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--virtualenv-pypi PYPI_URL``
    - PyPi Server uri for retrieving packages.
* ``--virtualenv-pypi-extra-url PYPI_EXTRA_URL``
    - PyPi extra-index-url for pointing to your priviate PyPi
* ``--[no-]virtualenv-setup-install``
    - After building virtualenv run setup.py install useful when building a virtualenv for packages and including their requirements from requirements.txt
* ``--[no-]virtualenv-system-site-packages``
    - Give the virtual environment access to the global site-packages

zip
---

This package type has no additional options



================================================
FILE: docs/conf.py
================================================
# -*- coding: utf-8 -*-
#
# fpm documentation build configuration file, created by
# sphinx-quickstart on Sun Nov 27 05:23:34 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

import sys
import os

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))

# -- General configuration ------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    'sphinx_rtd_theme'
]

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'

# The encoding of source files.
#source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = u'fpm - packaging made simple'
copyright = u'2025, Jordan Sissel and contributors'
author = u'Jordan Sissel'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'1.17'
# The full version, including alpha/beta/rc tags.
release = u'1.17.0'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = "en"

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']

# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []

# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False

# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False


# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}

# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []

# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
#html_title = u'fpm v1.6.3'

# A shorter title for the navigation bar.  Default is the same as html_title.
#html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None

# The name of an image file (relative to this directory) to use as a favicon of
# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []

# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
#html_last_updated_fmt = None

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}

# If false, no module index is generated.
#html_domain_indices = True

# If false, no index is generated.
#html_use_index = True

# If true, the index is split into individual pages for each letter.
#html_split_index = False

# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None

# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
#html_search_language = 'en'

# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
#html_search_options = {'type': 'default'}

# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'

# Output file base name for HTML help builder.
htmlhelp_basename = 'fpmdoc'

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',

# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',

# Additional stuff for the LaTeX preamble.
#'preamble': '',

# Latex figure (float) alignment
#'figure_align': 'htbp',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, documentclass [howto, manual, or own class]).
latex_documents = [
    (master_doc, 'fpm.tex', u'fpm Documentation',
     u'Jordan Sissel', 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False

# If true, show page references after internal links.
#latex_show_pagerefs = False

# If true, show URL addresses after external links.
#latex_show_urls = False

# Documents to append as an appendix to all manuals.
#latex_appendices = []

# If false, no module index is generated.
#latex_domain_indices = True


# -- Options for manual page output ---------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    (master_doc, 'fpm', u'fpm Documentation',
     [author], 1)
]

# If true, show URL addresses after external links.
#man_show_urls = False


# -- Options for Texinfo output -------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
    (master_doc, 'fpm', u'fpm Documentation',
     author, 'fpm', 'One line description of project.',
     'Miscellaneous'),
]

# Documents to append as an appendix to all manuals.
#texinfo_appendices = []

# If false, no module index is generated.
#texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'

# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False


================================================
FILE: docs/contributing.rst
================================================
Contributing/Issues
===================

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See the `Code of Conduct`_ for details.

.. _Code of Conduct: https://github.com/jordansissel/fpm/blob/master/CODE_OF_CONDUCT.md

All contributions are welcome: ideas, patches, documentation, bug reports, complaints, and even something you drew up on a napkin :)

It is more important that you are able to contribute and get help if you need it than it is how you contribute or get help.

That said, some points to get started:

* Have a problem you want FPM to solve for you? You can email the `mailing list`_, or join the IRC channel #fpm on irc.freenode.org, or email me personally (jls@semicomplete.com)
* Have an idea or a feature request? File a ticket on `github`_, or email the `mailing list`_, or email me personally (jls@semicomplete.com) if that is more comfortable.
* If you think you found a bug, it probably is a bug. File it on `github`_ or send details to the `mailing list`_.
* If you want to send patches, best way is to fork this repo and send me a pull request. If you don't know git, I also accept diff(1) formatted patches - whatever is most comfortable for you.
* Want to lurk about and see what others are doing? IRC (#fpm on irc.freenode.org) is a good place for this as is the `mailing list`_.

.. _mailing list: https://groups.google.com/group/fpm-users
.. _github: https://github.com/jordansissel/fpm

Contributing changes by forking from GitHub
-------------------------------------------

First, create a GitHub account if you do not already have one. Log in to
GitHub and go to [the main FPM GitHub page](https://github.com/jordansissel/fpm).

At the top right, click on the button labeled "Fork".  This will put a forked
copy of the main FPM repo into your account.  Next, clone your account's GitHub
repo of FPM. For example:

    $ git clone git@github.com:yourusername/fpm.git

Development Environment
-----------------------

If you don't already have the bundler gem installed, install it now:

    $ gem install bundler

Now change to the root of the FPM repo and run:

    $ bundle install

This will install all of the dependencies required for running FPM from source.
Most importantly, you should see the following output from the bundle command
when it lists the FPM gem:

    ...
    Using json (1.8.1)
    Using fpm (0.4.42) from source at .
    Using hitimes (1.2.1)
    ...

If your system doesn't have `bsdtar` by default, make sure to install it or some
tests will fail:

    apt-get install bsdtar || apt install libarchive-tools
    
    yum install bsdtar


You also need these tools:

    apt-get install lintian cpanminus

Next, run make in root of the FPM repo. If there are any problems (such as
missing dependencies) you should receive an error

At this point, the FPM command should run directly from the code in your cloned
repo.  Now simply make whatever changes you want, commit the code, and push
your commit back to master.

If you think your changes are ready to be merged back to the main FPM repo, you
can generate a pull request on the GitHub website for your repo and send it in
for review.

Problems running bundle install?
--------------------------------

If you are installing on Mac OS 10.9 (Mavericks) you will need to make sure that 
you have the standalone command line tools separate from Xcode:

    $ xcode-select --install

Finally, click the install button on the prompt that appears.

Editing Documentation
---------------------

If you want to edit the documentation, here's a quick guide to getting started:

* Install `docker`_.
* All documentation is located in the `docs` folder. ``cd`` into the docs folder and run the following command once::

	make docker-prep

* Once that is done, run ``make build`` whenever you want to build the site. It will generate the html in the `_build/html` directory.
* You can use any tool like `serve _build/html` (npm package) or ``python -m http.server -d _build/html 5000`` to serve the static html on your machine (http://localhost:5000).

.. _docker: https://docs.docker.com/engine/install/

Now you can simply make whatever changes you want, commit the code, and push your commit back to master.

If you think your changes are ready to be merged back to the main FPM repo, you can generate a pull request on the GitHub website for your repo and send it in for review.


================================================
FILE: docs/docker.rst
================================================
FPM and Docker
==============

Because fpm depends on so many underlying system tools, docker can
alleviate the need to install them locally.

An end user may use a docker container in lieu of installing
locally. And a developer can use docker to run the test suite.


Running FPM inside docker
-------------------------

First, build a container will all the dependencies::

   make docker-release-everything

Now, run it as you would the fpm command. Note that you will have to
mount your source directly into the docker volume::

   docker run -v $(pwd):/src fpm --help

As a full example::

   mkdir /tmp/fpm-test
   mkdir /tmp/fpm-test/files
   touch /tmp/fpm-test/files/one
   touch /tmp/fpm-test/files/two

   docker run -v /tmp/fpm-test/files:/src -v /tmp/fpm-test:/out fpm -s dir -t tar -n example -p /out/out.tar .

   tar tf /tmp/fpm-test/out.tar

Depending on your needs, you will have to adjust the volume mounts and
relative paths to fit your particular situation.

Running rpsec inside docker
---------------------------

The Makefile provides some targets for testing. They will build a
docker container with the dependencies, and then invoked `rspec`
inside it. The makefile uses a sentinel file to indicate that the
docker image has been build, and can be reused.

   make docker-test-everything



How does this work
------------------

The Dockerfile makes heavy use of multistage
builds. This allows the various output containers to build on the same
earlier stages.

There are two ``base`` images. A ``minimal`` image, which contains
compiled dependencies and ruby. And an ``everything`` image which brings
in scripting systems like ``python`` and ``perl``. These are split to
allow a smaller ``minimal`` image in cases where building scripting
language packages are not needed.

The Dockerfile the argument ``BASE_ENV`` to specify what base image to
use. This can be set to either ``minimal`` or ``everything``. If
unspecified, it defaults to ``everything``

We want to use the same set of base images for both the ``rspec``
testing, as well as the run time containerization. We do this by using
the ``TARGET`` argument to select which container to build.

The makefile encodes this logic with two pattern rules.


================================================
FILE: docs/generate-cli-reference.rb
================================================
#!/usr/bin/env ruby

require_relative "../lib/fpm/command"

flagsort = lambda { |x| x.sub(/^--(?:\[no-\])?/, "") }

if ARGV.length == 0
  puts "Command-line Reference"
  puts "=========================="
  puts

  puts "This page documents the command-line flags available in FPM. You can also see this content in your terminal by running ``fpm --help``"
  puts

  puts "General Options"
  puts "---------------"

  #FPM::Command.instance_variable_get(:@declared_options).sort_by { |o| flagsort.call(o.switches.first) }.each do |option|
  FPM::Command::GENERAL_OPTIONS.sort_by { |o| flagsort.call(o.switches.first) }.each do |option|
      text = option.description.gsub("\n", " ")

      if option.type == :flag
          # it's a flag which means there are no parameters to the option
          puts "* ``#{option.switches.first}``"
      else
          puts "* ``#{option.switches.first} #{option.type}``"
      end

      if option.switches.length > 1
          puts "    - Alternate option spellings: ``#{option.switches[1..-1].join(", ")}``"
      end
      puts "    - #{text}"
      puts
  end
end


FPM::Package.types.sort_by { |k,v| k }.each do |name, type|
    next if ARGV.length > 0 && ARGV[0].downcase != name.downcase

    options = type.instance_variable_get(:@options)

    # Only print the section header if no arguments are given
    # -- aka, generate the list of all flags grouped by package type.
    if ARGV.length == 0
      puts "#{name}"
      puts "-" * name.size
      puts
    end

    if options.empty?
        puts "This package type has no additional options"
    end

    options.sort_by { |flag, _| flagsort.call(flag.first) }.each do |flag, param, help, options, block|
        if param == :flag 
            puts "* ``#{flag.first}``"
        else
            puts "* ``#{flag.first} #{param}``"
        end

        text = help.sub(/^\([^)]+\) /, "")
        puts "    - #{text}"
    end

    puts
end


================================================
FILE: docs/getting-started.rst
================================================
Getting Started
===============

FPM takes your program and builds packages that can be installed easily on various operating systems.

Understanding the basics of FPM
-------------------------------

The ``fpm`` command takes in three arguments:

* The type of sources to include in the package
* The type of package to output
* The sources themselves

The source could be a:

* file OR a directory with various files needed to run the program - ``dir``
* nodejs (npm) package - ``npm``
* ruby (gem) package - ``gem``
* python (using easy_install or a local setup.py) package - ``python``
* python virtualenv - ``virtualenv``
* pear package - ``pear``
* perl (cpan) module - ``cpan``
* .deb package - ``deb``
* .rpm package - ``rpm``
* pacman (.pkg.tar.zst) package - ``pacman``
* .pkgin package - ``pkgin``
* package without any files (useful for meta packages) - ``empty``

The target (output package format) could be:

* A .deb package (for Debian and Debian-based) - ``deb``
* A .rpm package (for RedHat based) - ``rpm``
* A .solaris package (for Solaris) - ``solaris``
* A .freebsd package (for FreeBSD) - ``freebsd``
* MacOS .pkg files - ``osxpkg``
* Pacman packages (.pkg.tar.zst) (for Arch Linux and Arch-based) - ``pacman``
* A puppet module - ``puppet``
* A p5p module - ``p5p``
* A self-extracting installer - ``sh``
* A tarfile that can be extracted into the root of any machine to install the program - ``tar``
* A zipfile that can be extracted into the root of any machine to install the program - ``zip``
* A directory that can be copied to the root of any machine to install the program - ``dir``

Given a source and a target, FPM can convert all the source files into a package of the target format.

Using it to package an executable
---------------------------------

To simplyify things a bit, let's take an example. Suppose you have a bash script that prints 'Hello, world!' in multiple colors when it is run::

	--- File: hello-world

	#!/usr/bin/env bash
	
	#
	# == hello-world 0.1.0 ==
	#

	echo "Hello, world!" | lolcat

Let's say you even wrote a manpage (manual page) for it::

	--- File: hello-world.1
	
	.TH HELLO WORLD "1" "July 2021" "hello-world 0.1.0" "User Commands"
	.SH NAME
	hello-world \- manual page for hello-world 0.1.0
	.SH DESCRIPTION
	.IP
	USAGE: hello-world
	.SH "SEE ALSO"
	.IP
	Website: https://example.com/hello-world
	.SH "OTHER"
	.IP
	Made by You The Amazing Person <you are an amazing person at example dot com>
	.IP
	This program is distributed under the AGPL 3.0 license.

Now you want to package this script and its manual page and distribute to the world as a .deb file. To do that using FPM, here is the command we need to run::

	fpm \
	  -s dir -t deb \
	  -p hello-world-0.1.0-1-any.deb \
	  --name hello-world \
	  --license agpl3 \
	  --version 0.1.0 \
	  --architecture all \
	  --depends bash --depends lolcat \
	  --description "Say hi!" \
	  --url "https://example.com/hello-world" \
	  --maintainer "You The Amazing Person <you are an amazing person at example dot com>" \
	  hello-world=/usr/bin/hello-world hello-world.1=/usr/share/man/man1/hello-world.1

If you have installed FPM, and have the hello-world script in your current directory, you should be able to see a ``hello-world-0.1.0-1-any.deb`` file in your current directory after you run this command.

Let's break the command down, option by option:

* ``-s dir`` [required]
	- The ``-s`` option tells FPM what sources to use to build the package.
	- In this case [``dir``], we are telling FPM that we want to build a package from source files that we have on our computer.

* ``-t deb`` [required]
	- The ``-t`` option tells FPM what type of package to build (target package).
	- In this case [``deb``], we are telling FPM that we want to build a .deb package, that can be installed on Debian and Debian-based operating systems, such as Ubuntu.

* ``-p hello-world-0.1.0-1-any.deb``
	- The ``-p`` option tells FPM what to name the package once it has been created.
	- In this case, we name it ``<package name>-<version>-<package rel/iteration>-<architecture>.<file extension>``, but you can call it whatever you want.

* ``--name hello-world``
	- The name of the program that FPM is packaging.
	- In this case, it is hello-world.

* ``--license agpl3``
	- The license the program uses
	- In this case, we use the AGPL 3.0 license (If you have a custom license, use ``custom`` instead of AGPL3)

* ``--version 0.1.0``
	- The version of the program
	- In this case, the version is 0.1.0

* ``--architecture all``
	- The architecture required to run the program [valid values are: x86_64/amd64, aarch64, native (current architecture), all/noarch/any]
	- In this case, the program is just a bash script, so we can run on all architectures

* ``--depends bash --depends lolcat``
	- The dependencies the program needs to run 
	- In this case, we need bash and lolcat - bash to run the program itself, and lolcat to display the text in multiple colors

* ``--description "Say hi!"``
	- The program description
	- In this case, it is Say hi!

* ``--url "https://example.com/hello-world"``
	- The URL to the program``s website or URL to program source

* ``--maintainer "You The Amazing Person <you are an amazing person at example dot com>"``
	- The name and (optionally) email of the person creating the package

* ``hello-world=/usr/bin/hello-world hello-world.1=/usr/share/man/man1/hello-world.1`` [required]
	- This is the most important part. It tells FPM which file (relative paths from the current directory) should be installed to which path in the machine.
	- In this case, we want the user to be able to execute the command ``hello-world`` from terminal; so we put the hello-world script in the user's PATH, that is, in /usr/bin/. We also want the user to access the manual page using ``man hello-world``, so we put the manpage (hello-world.1) in the /usr/share/man/man1/ directory.

For more detailed documentation about each and every flag (there are some package-type-specific flags that exist as well), run ``fpm --help``.

Using it to package an existing package
---------------------------------------

We've seen how to package a program if you have an executable, but what if you already have a program that you have not written as an executable script, but in a language like nodejs instead? FPM can help here too. It can take any nodejs package, ruby gem or even a python package and turn it into a deb, rpm, pacman, etc. package. Here are a couple of examples.

Packaging a NodeJS application that's already on NPM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. note::
	This assumes you have nodejs and npm already installed on your machine.

Run the following command::

	fpm -s npm -t <deb/rpm/pacman/solaris/freebsd/osxpkg/tar> <npm-package-name>

E.g.: To package yarn for Arch Linux::

	fpm -s npm -t pacman yarn

This will download the latest ``yarn`` package from npm.com and convert it to a .pkg.tar.zst (pacman) package. It will create a package named ‘node-yarn-VERSION_ARCH.deb’ with the appropriate version/arch in place. FPM will automatically pick the package name, version, maintainer, section, homepage, and description all from the npm package itself. Nothing for you to worry about :)

Packaging a ruby gem
~~~~~~~~~~~~~~~~~~~~

.. note::
	This assumes you have ruby already installed on your machine.

Run the following command::

	fpm -s gem -t <deb/rpm/pacman/solaris/freebsd/osxpkg/tar> <gem-name>

E.g.: To package FPM using FPM for Debian::

	# FPM-ception :D
	fpm -s gem -t deb fpm

This will download the latest ``fpm`` rubygem from rubygems.org and convert it to a .deb. It will create a package named ‘rubygem-fpm-VERSION_ARCH.deb’ with the appropriate version/arch in place. FPM will automatically pick the package name, version, maintainer, section, homepage, and description all from the rubygem itself. Nothing for you to worry about :)

Packaging a CPAN module
~~~~~~~~~~~~~~~~~~~~~~~

.. note::
	This assumes you have perl already installed on your machine.

Run the following command package the perl Fennec module for Debian::

	fpm -s cpan -t deb Fennec

This will download Fennec from CPAN and build a Debian package of the Fennec Perl module locally.

By default, FPM believes the following to be true:

* That your local Perl lib path will be the target Perl lib path
* That you want the package name to be prefixed with the word perl
* That the dependencies from CPAN are valid and that the naming scheme for those dependencies are prefixed with perl

If you wish to change any of the above, use the following::

	fpm -t deb -s cpan -–cpan-perl-lib-path /usr/share/perl5 Fennec

	fpm -t deb -s cpan --cpan-package-name-prefix fubar /usr/share/perl5 Fennec

The first command will change the target path to where perl will be. Your local perl install may be /opt/usr/share/perl5.10 but the package will be constructed so that the module will be installed to /usr/share/perl5

The second command will change the prefix of the package, i.e., from perl-Fennec to fubar-Fennec.

Configuration file
-------------------

If you are using FPM in to build packages for multiple targets and keep repeating several options (like version, description, name, license, maintainer, url, architecture, files to package, etc.), you can add a ``.fpm`` file in your working directory, with a list of options as well as arguments that you want to pass to the CLI. Extending the example of the hello-world program, say we want to package it as a .deb and a .rpm. We could create the following .fpm file::

	--- File: .fpm

	-s dir
	--name hello-world
	--license agpl3
	--version 0.1.0
	--architecture all
	--depends bash --depends lolcat
	--description "Say hi!"
	--url "https://example.com/hello-world"
	--maintainer "You The Amazing Person <you are an amazing person at example dot com>"

	hello-world=/usr/bin/hello-world hello-world.1=/usr/share/man/man1/hello-world.1

.. note::
	CLI flags will override those in the ``.fpm`` file.

Meanwhile, we could run the following commands in terminal to build the .deb and .rpm::

	fpm -t deb -p hello-world-0.1.0-1-any.deb

	fpm -t rpm -p hello-world-0.1.0-1-any.rpm

Tada! You will have a .deb (for Debian) and .rpm (for RedHat), with no unnecessary duplication of metadata. You can put any other valid CLI options in the ``.fpm`` file too.

For more detailed information regarding all CLI flags, see the :doc:`CLI reference. <cli-reference>`


================================================
FILE: docs/index.rst
================================================
fpm - packaging made simple
===========================

.. note::
  The documentation here is a work-in-progress; it is by no means extensive. If you want to contribute new docs or report problems, you are invited to do so on `the project issue tracker`_.

Welcome to the fpm documentation!

fpm is a tool which lets you easily create packages for Debian, Ubuntu, Fedora, CentOS, RHEL, Arch Linux, FreeBSD, macOS, and more!

fpm isn't a new packaging system, it's a tool to help you make packages for existing systems with less effort. It does this by offering a command-line interface to allow you to create packages easily. Here are some examples using fpm:

* ``fpm -s npm -t deb express`` -- Make a Debian package for the nodejs `express` library
* ``fpm -s cpan -t rpm Fennec`` -- Make an rpm for the perl Fennec module
* ``fpm -s dir -t pacman -n fancy ~/.zshrc`` -- Put your ~/.zshrc into an Arch Linux pacman package named "fancy"
* ``fpm -s python -t freebsd Django`` -- Create a FreeBSD package containing the Python Django library
* ``fpm -s rpm -t deb mysql.rpm`` -- Convert an rpm to deb

This project has a few important principles which guide development:

* Community: If a newbie has a bad time, it's a bug.
* Engineering: Make it work, make it right, then make it fast.
* Capabilities: If it doesn't do a thing today, we can make it do it tomorrow.

`Install fpm <installation.html>`_ and you'll quickly begin making packages for whatever you need!

You can view the changelog `here`_.

Table of Contents
-----------------

.. toctree::
	:includehidden:

	installation
	getting-started
	packaging-types
	cli-reference
	docker
	contributing
	changelog

.. _here: /changelog.html

.. _the project issue tracker: https://github.com/jordansissel/fpm/issues


================================================
FILE: docs/installation.rst
================================================
Installation
============

FPM is written in ruby and can be installed using `gem`. For some package formats (like rpm and snap), you will need certain packages installed to build them.

Installing FPM
--------------

.. note::
	You must have ruby installed on your machine before installing fpm. `Here`_ are instructions to install Ruby on your machine.

.. _Here: https://www.ruby-lang.org/en/documentation/installation/

You can install FPM with the ``gem`` tool::

    gem install fpm

To make sure fpm is installed correctly, try running the following command::

    fpm --version

You should get some output like this, although the exact output will depend on which version of FPM you have installed.::

    % fpm --version
    1.17.0

Now you can go on to `using FPM! <getting-started.html>`_

Installing optional dependencies
--------------------------------

.. warning::
	This section may be imperfect; please make sure you are installing the right package for your OS.

Some package formats require other tools to be installed on your machine to be built; especially if you are building a package for another operating system/distribution.

* RPM: rpm/rpm-tools/rpm-build [This dependency might be removed in the future, see `issue #54`_ on github]
* Snap: squashfs/squashfs-tools
* Python: a requirements.txt file is provided to list Python dependencies: `$ pip install -r requirements.txt`

.. _issue #54: https://github.com/jordansissel/fpm/issues/54

.. note::
	You will not be able to build an osxpkg package (.pkg) for MacOS unless you are running MacOS.

Here are instructions to install these dependencies on your machine:

On OSX/macOS::

    brew install rpm squashfs

On Arch Linux and Arch-based systems (Manjaro, EndeavourOS, etc)::

    pacman -S rpm-tools squashfs-tools

On Debian and Debian-based systems (Ubuntu, Linux Mint, Pop!_OS, etc)::

    apt-get install squashfs-tools

On Red Hat systems (Fedora 22 or older, CentOS, Rocky Linux, etc)::

    yum install rpm-build squashfs-tools

On Fedora 23 or newer::

    dnf install rpm-build squashfs-tools

On Oracle Linux 7.x systems::

    yum-config-manager --enable ol7_optional_latest
    yum install rpm-build squashfs-tools


================================================
FILE: docs/packages/apk.rst
================================================
apk - Alpine package format
===========================

Supported Uses in FPM
---------------------

fpm supports using ``apk`` only as an output type. This means you can create ``apk`` packages from input types like ``deb``, ``dir``, or ``npm``

apk-specific command line flags
-------------------------------

.. include:: cli/apk.rst


================================================
FILE: docs/packages/cli/apk.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/cpan.rst
================================================
* ``--cpan-cpanm-bin CPANM_EXECUTABLE``
    - The path to the cpanm executable you wish to run.
* ``--[no-]cpan-cpanm-force``
    - Pass the --force parameter to cpanm
* ``--cpan-mirror CPAN_MIRROR``
    - The CPAN mirror to use instead of the default.
* ``--[no-]cpan-mirror-only``
    - Only use the specified mirror for metadata.
* ``--cpan-package-name-prefix NAME_PREFIX``
    - Name to prefix the package name with.
* ``--cpan-perl-bin PERL_EXECUTABLE``
    - The path to the perl executable you wish to run.
* ``--cpan-perl-lib-path PERL_LIB_PATH``
    - Path of target Perl Libraries
* ``--[no-]cpan-sandbox-non-core``
    - Sandbox all non-core modules, even if they're already installed
* ``--[no-]cpan-test``
    - Run the tests before packaging?
* ``--[no-]cpan-verbose``
    - Produce verbose output from cpanm?



================================================
FILE: docs/packages/cli/deb.rst
================================================
* ``--deb-activate EVENT``
    - Package activates EVENT trigger
* ``--deb-activate-noawait EVENT``
    - Package activates EVENT trigger
* ``--deb-after-purge FILE``
    - A script to be run after package removal to purge remaining (config) files (a.k.a. postrm purge within apt-get purge)
* ``--[no-]deb-auto-config-files``
    - Init script and default configuration files will be labeled as configuration files for Debian packages.
* ``--deb-build-depends DEPENDENCY``
    - Add DEPENDENCY as a Build-Depends
* ``--deb-changelog FILEPATH``
    - Add FILEPATH as debian changelog
* ``--deb-compression COMPRESSION``
    - The compression type to use, must be one of gz, bzip2, xz, zst, none.
* ``--deb-compression-level [0-9]``
    - Select a compression level. 0 is none or minimal. 9 is max compression.
* ``--deb-config SCRIPTPATH``
    - Add SCRIPTPATH as debconf config file.
* ``--deb-custom-control FILEPATH``
    - Custom version of the Debian control file.
* ``--deb-default FILEPATH``
    - Add FILEPATH as /etc/default configuration
* ``--deb-dist DIST-TAG``
    - Set the deb distribution.
* ``--deb-field 'FIELD: VALUE'``
    - Add custom field to the control file
* ``--[no-]deb-generate-changes``
    - Generate PACKAGENAME.changes file.
* ``--deb-group GROUP``
    - The group owner of files in this package
* ``--[no-]deb-ignore-iteration-in-dependencies``
    - For '=' (equal) dependencies, allow iterations on the specified version. Default is to be specific. This option allows the same version of a package but any iteration is permitted
* ``--deb-init FILEPATH``
    - Add FILEPATH as an init script
* ``--deb-installed-size KILOBYTES``
    - The installed size, in kilobytes. If omitted, this will be calculated automatically
* ``--deb-interest EVENT``
    - Package is interested in EVENT trigger
* ``--deb-interest-noawait EVENT``
    - Package is interested in EVENT trigger without awaiting
* ``--[no-]deb-maintainerscripts-force-errorchecks``
    - Activate errexit shell option according to lintian. https://lintian.debian.org/tags/maintainer-script-ignores-errors.html
* ``--deb-meta-file FILEPATH``
    - Add FILEPATH to DEBIAN directory
* ``--[no-]deb-no-default-config-files``
    - Do not add all files in /etc as configuration files by default for Debian packages.
* ``--deb-pre-depends DEPENDENCY``
    - Add DEPENDENCY as a Pre-Depends
* ``--deb-priority PRIORITY``
    - The debian package 'priority' value.
* ``--deb-recommends PACKAGE``
    - Add PACKAGE to Recommends
* ``--deb-shlibs SHLIBS``
    - Include control/shlibs content. This flag expects a string that is used as the contents of the shlibs file. See the following url for a description of this file and its format: http://www.debian.org/doc/debian-policy/ch-sharedlibs.html#s-shlibs
* ``--deb-suggests PACKAGE``
    - Add PACKAGE to Suggests
* ``--deb-systemd FILEPATH``
    - Add FILEPATH as a systemd script
* ``--[no-]deb-systemd-auto-start``
    - Start service after install or upgrade
* ``--[no-]deb-systemd-enable``
    - Enable service on install or upgrade
* ``--deb-systemd-path FILEPATH``
    - Relative path to the systemd service directory
* ``--[no-]deb-systemd-restart-after-upgrade``
    - Restart service after upgrade
* ``--deb-templates FILEPATH``
    - Add FILEPATH as debconf templates file.
* ``--deb-upstart FILEPATH``
    - Add FILEPATH as an upstart script
* ``--deb-upstream-changelog FILEPATH``
    - Add FILEPATH as upstream changelog
* ``--[no-]deb-use-file-permissions``
    - Use existing file permissions when defining ownership and modes
* ``--deb-user USER``
    - The owner of files in this package



================================================
FILE: docs/packages/cli/dir.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/empty.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/freebsd.rst
================================================
* ``--freebsd-origin ABI``
    - Sets the FreeBSD 'origin' pkg field
* ``--freebsd-osversion VERSION``
    - Sets the FreeBSD 'version' pkg field, ie 12 or 13, use '*' for all.



================================================
FILE: docs/packages/cli/gem.rst
================================================
* ``--gem-bin-path DIRECTORY``
    - The directory to install gem executables
* ``--gem-disable-dependency gem_name``
    - The gem name to remove from dependency list
* ``--[no-]gem-embed-dependencies``
    - Should the gem dependencies be installed?
* ``--[no-]gem-env-shebang``
    - Should the target package have the shebang rewritten to use env?
* ``--[no-]gem-fix-dependencies``
    - Should the package dependencies be prefixed?
* ``--[no-]gem-fix-name``
    - Should the target package name be prefixed?
* ``--gem-gem PATH_TO_GEM``
    - The path to the 'gem' tool (defaults to 'gem' and searches your $PATH)
* ``--gem-git-branch GIT_BRANCH``
    - When using a git repo as the source of the gem instead of rubygems.org, use this git branch.
* ``--gem-git-repo GIT_REPO``
    - Use this git repo address as the source of the gem instead of rubygems.org.
* ``--gem-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--gem-package-prefix NAMEPREFIX``
    - (DEPRECATED, use --package-name-prefix) Name to prefix the package name with.
* ``--[no-]gem-prerelease``
    - Allow prerelease versions of a gem
* ``--gem-shebang SHEBANG``
    - Replace the shebang in the executables in the bin path with a custom string
* ``--gem-stagingdir STAGINGDIR``
    - The directory where fpm installs the gem temporarily before conversion. Normally a random subdirectory of workdir.
* ``--[no-]gem-version-bins``
    - Append the version to the bins



================================================
FILE: docs/packages/cli/npm.rst
================================================
* ``--npm-bin NPM_EXECUTABLE``
    - The path to the npm executable you wish to run.
* ``--npm-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--npm-registry NPM_REGISTRY``
    - The npm registry to use instead of the default.



================================================
FILE: docs/packages/cli/osxpkg.rst
================================================
* ``--osxpkg-dont-obsolete DONT_OBSOLETE_PATH``
    - A file path for which to 'dont-obsolete' in the built PackageInfo. Can be specified multiple times.
* ``--osxpkg-identifier-prefix IDENTIFIER_PREFIX``
    - Reverse domain prefix prepended to package identifier, ie. 'org.great.my'. If this is omitted, the identifer will be the package name.
* ``--osxpkg-ownership OWNERSHIP``
    - --ownership option passed to pkgbuild. Defaults to 'recommended'. See pkgbuild(1).
* ``--[no-]osxpkg-payload-free``
    - Define no payload, assumes use of script options.
* ``--osxpkg-postinstall-action POSTINSTALL_ACTION``
    - Post-install action provided in package metadata. Optionally one of 'logout', 'restart', 'shutdown'.



================================================
FILE: docs/packages/cli/p5p.rst
================================================
* ``--p5p-group GROUP``
    - Set the group to GROUP in the prototype file.
* ``--[no-]p5p-lint``
    - Check manifest with pkglint
* ``--p5p-publisher PUBLISHER``
    - Set the publisher name for the repository
* ``--p5p-user USER``
    - Set the user to USER in the prototype files.
* ``--[no-]p5p-validate``
    - Validate with pkg install
* ``--p5p-zonetype ZONETYPE``
    - Set the allowed zone types (global, nonglobal, both)



================================================
FILE: docs/packages/cli/pacman.rst
================================================
* ``--pacman-compression COMPRESSION``
    - The compression type to use, must be one of gz, bzip2, xz, zstd, none.
* ``--pacman-group GROUP``
    - The group owner of files in this package
* ``--pacman-optional-depends PACKAGE``
    - Add an optional dependency to the pacman package.
* ``--[no-]pacman-use-file-permissions``
    - Use existing file permissions when defining ownership and modes
* ``--pacman-user USER``
    - The owner of files in this package



================================================
FILE: docs/packages/cli/pear.rst
================================================
* ``--pear-bin-dir BIN_DIR``
    - Directory to put binaries in
* ``--pear-channel CHANNEL_URL``
    - The pear channel url to use instead of the default.
* ``--[no-]pear-channel-update``
    - call 'pear channel-update' prior to installation
* ``--pear-data-dir DATA_DIR``
    - Specify php dir relative to prefix if differs from pear default (pear/data)
* ``--pear-package-name-prefix PREFIX``
    - Name prefix for pear package
* ``--pear-php-bin PHP_BIN``
    - Specify php executable path if differs from the os used for packaging
* ``--pear-php-dir PHP_DIR``
    - Specify php dir relative to prefix if differs from pear default (pear/php)



================================================
FILE: docs/packages/cli/pkgin.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/pleaserun.rst
================================================
* ``--pleaserun-chdir CHDIR``
    - The working directory used by the service
* ``--pleaserun-name SERVICE_NAME``
    - The name of the service you are creating
* ``--pleaserun-user USER``
    - The user to use for executing this program.



================================================
FILE: docs/packages/cli/puppet.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/python.rst
================================================
* ``--python-bin PYTHON_EXECUTABLE``
    - The path to the python executable you wish to run.
* ``--[no-]python-dependencies``
    - Include requirements defined by the python package as dependencies.
* ``--python-disable-dependency python_package_name``
    - The python package name to remove from dependency list
* ``--[no-]python-downcase-dependencies``
    - Should the package dependencies be in lowercase?
* ``--[no-]python-downcase-name``
    - Should the target package name be in lowercase?
* ``--python-easyinstall EASYINSTALL_EXECUTABLE``
    - The path to the easy_install executable tool
* ``--[no-]python-fix-dependencies``
    - Should the package dependencies be prefixed?
* ``--[no-]python-fix-name``
    - Should the target package name be prefixed?
* ``--python-install-bin BIN_PATH``
    - (DEPRECATED, does nothing) The path to where python scripts should be installed to.
* ``--python-install-data DATA_PATH``
    - (DEPRECATED, does nothing) The path to where data should be installed to. This is equivalent to 'python setup.py --install-data DATA_PATH
* ``--python-install-lib LIB_PATH``
    - (DEPRECATED, does nothing) The path to where python libs should be installed to (default depends on your python installation). Want to find out what your target platform is using? Run this: python -c 'from distutils.sysconfig import get_python_lib; print get_python_lib()'
* ``--[no-]python-internal-pip``
    - Use the pip module within python to install modules - aka 'python -m pip'. This is the recommended usage since Python 3.4 (2014) instead of invoking the 'pip' script
* ``--[no-]python-obey-requirements-txt``
    - Use a requirements.txt file in the top-level directory of the python package for dependency detection.
* ``--python-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--python-package-prefix NAMEPREFIX``
    - (DEPRECATED, use --package-name-prefix) Name to prefix the package name with.
* ``--python-pip PIP_EXECUTABLE``
    - The path to the pip executable tool. If not specified, easy_install is used instead
* ``--python-pypi PYPI_URL``
    - PyPi Server uri for retrieving packages.
* ``--python-scripts-executable PYTHON_EXECUTABLE``
    - (DEPRECATED) Set custom python interpreter in installing scripts. By default distutils will replace python interpreter in installing scripts (specified by shebang) with current python interpreter (sys.executable). This option is equivalent to appending 'build_scripts --executable PYTHON_EXECUTABLE' arguments to 'setup.py install' command.
* ``--python-setup-py-arguments setup_py_argument``
    - (DEPRECATED) Arbitrary argument(s) to be passed to setup.py
* ``--python-trusted-host PYPI_TRUSTED``
    - Mark this host or host:port pair as trusted for pip



================================================
FILE: docs/packages/cli/rpm.rst
================================================
* ``--rpm-attr ATTRFILE``
    - Set the attribute for a file (%attr), e.g. --rpm-attr 750,user1,group1:/some/file
* ``--[no-]rpm-auto-add-directories``
    - Auto add directories not part of filesystem
* ``--rpm-auto-add-exclude-directories DIRECTORIES``
    - Additional directories ignored by '--rpm-auto-add-directories' flag
* ``--[no-]rpm-autoprov``
    - Enable RPM's AutoProv option
* ``--[no-]rpm-autoreq``
    - Enable RPM's AutoReq option
* ``--[no-]rpm-autoreqprov``
    - Enable RPM's AutoReqProv option
* ``--rpm-changelog FILEPATH``
    - Add changelog from FILEPATH contents
* ``--rpm-compression none|xz|xzmt|gzip|bzip2``
    - Select a compression method. gzip works on the most platforms.
* ``--rpm-compression-level [0-9]``
    - Select a compression level. 0 is store-only. 9 is max compression.
* ``--rpm-defattrdir ATTR``
    - Set the default dir mode (%defattr).
* ``--rpm-defattrfile ATTR``
    - Set the default file mode (%defattr).
* ``--rpm-digest md5|sha1|sha256|sha384|sha512``
    - Select a digest algorithm. md5 works on the most platforms.
* ``--rpm-dist DIST-TAG``
    - Set the rpm distribution.
* ``--rpm-filter-from-provides REGEX``
    - Set %filter_from_provides to the supplied REGEX.
* ``--rpm-filter-from-requires REGEX``
    - Set %filter_from_requires to the supplied REGEX.
* ``--rpm-group GROUP``
    - Set the group to GROUP in the %files section. Overrides the group when used with use-file-permissions setting.
* ``--[no-]rpm-ignore-iteration-in-dependencies``
    - For '=' (equal) dependencies, allow iterations on the specified version. Default is to be specific. This option allows the same version of a package but any iteration is permitted
* ``--rpm-init FILEPATH``
    - Add FILEPATH as an init script
* ``--[no-]rpm-macro-expansion``
    - install-time macro expansion in %pre %post %preun %postun scripts (see: https://rpm-software-management.github.io/rpm/manual/scriptlet_expansion.html)
* ``--[no-]rpm-old-perl-dependency-name``
    - Use older 'perl' depdency name. Newer Red Hat (and derivatives) use a dependency named 'perl-interpreter'.
* ``--rpm-os OS``
    - The operating system to target this rpm for. You want to set this to 'linux' if you are using fpm on OS X, for example
* ``--rpm-posttrans FILE``
    - posttrans script
* ``--rpm-pretrans FILE``
    - pretrans script
* ``--rpm-rpmbuild-define DEFINITION``
    - Pass a --define argument to rpmbuild.
* ``--[no-]rpm-sign``
    - Pass --sign to rpmbuild
* ``--rpm-summary SUMMARY``
    - Set the RPM summary. Overrides the first line on the description if set
* ``--rpm-tag TAG``
    - Adds a custom tag in the spec file as is. Example: --rpm-tag 'Requires(post): /usr/sbin/alternatives'
* ``--rpm-trigger-after-install '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-after-target-uninstall '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-before-install '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--rpm-trigger-before-uninstall '[OPT]PACKAGE: FILEPATH'``
    - Adds a rpm trigger script located in FILEPATH, having 'OPT' options and linking to 'PACKAGE'. PACKAGE can be a comma seperated list of packages. See: https://rpm-software-management.github.io/rpm/manual/triggers.html
* ``--[no-]rpm-use-file-permissions``
    - Use existing file permissions when defining ownership and modes.
* ``--rpm-user USER``
    - Set the user to USER in the %files section. Overrides the user when used with use-file-permissions setting.
* ``--[no-]rpm-verbatim-gem-dependencies``
    - When converting from a gem, leave the old (fpm 0.4.x) style dependency names. This flag will use the old 'rubygem-foo' names in rpm requires instead of the redhat style rubygem(foo).
* ``--rpm-verifyscript FILE``
    - a script to be run on verification



================================================
FILE: docs/packages/cli/sh.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/snap.rst
================================================
* ``--snap-confinement CONFINEMENT``
    - Type of confinement to use for this snap.
* ``--snap-grade GRADE``
    - Grade of this snap.
* ``--snap-yaml FILEPATH``
    - Custom version of the snap.yaml file.



================================================
FILE: docs/packages/cli/solaris.rst
================================================
* ``--solaris-group GROUP``
    - Set the group to GROUP in the prototype file.
* ``--solaris-user USER``
    - Set the user to USER in the prototype files.



================================================
FILE: docs/packages/cli/tar.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cli/virtualenv.rst
================================================
* ``--virtualenv-find-links PIP_FIND_LINKS``
    - If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.
* ``--[no-]virtualenv-fix-name``
    - Should the target package name be prefixed?
* ``--virtualenv-install-location DIRECTORY``
    - DEPRECATED: Use --prefix instead.  Location to which to install the virtualenv by default.
* ``--virtualenv-other-files-dir DIRECTORY``
    - Optionally, the contents of the specified directory may be added to the package. This is useful if the virtualenv needs configuration files, etc.
* ``--virtualenv-package-name-prefix PREFIX``
    - Name to prefix the package name with.
* ``--virtualenv-pypi PYPI_URL``
    - PyPi Server uri for retrieving packages.
* ``--virtualenv-pypi-extra-url PYPI_EXTRA_URL``
    - PyPi extra-index-url for pointing to your priviate PyPi
* ``--[no-]virtualenv-setup-install``
    - After building virtualenv run setup.py install useful when building a virtualenv for packages and including their requirements from requirements.txt
* ``--[no-]virtualenv-system-site-packages``
    - Give the virtual environment access to the global site-packages



================================================
FILE: docs/packages/cli/zip.rst
================================================
This package type has no additional options



================================================
FILE: docs/packages/cpan.rst
================================================
cpan - Perl packages from CPAN
===============================

Supported Uses in FPM
---------------------

fpm supports using ``cpan`` only as an input type. This means you can convert
``cpan`` input packages to output packages like ``deb``, ``rpm``, and more.

Arguments when used as input type
---------------------------------

Any number of arguments are supported and behave as follows:

* A name to search on MetaCPAN_. If a module is found on MetaCPAN_, it will be downloaded and used when building the package.
* or, a local directory containing a Perl module to build. 

.. _MetaCPAN: https://metacpan.org/

Sample Usage
------------

Let's take the `Regexp::Common <https://metacpan.org/pod/Regexp::Common>`_ Perl module and package it as a deb. We can let fpm do the hard work here of finding the module on cpan and downloading it::

  % fpm -s cpan -t deb Regexp::Common
  Downcasing provides 'perl-Regexp-Common' because deb packages  don't work so good with uppercase names {:level=>:warn}
  Downcasing provides 'perl-Regexp-Common-Entry' because deb packages  don't work so good with uppercase names {:level=>:warn}
  Debian tools (dpkg/apt) don't do well with packages that use capital letters in the name. In some cases it will automatically downcase them, in others it will not. It is confusing. Best to not use any capital letters at all. I have downcased the package name for you just to be safe. {:oldname=>"perl-Regexp-Common", :fixedname=>"perl-regexp-common", :level=>:warn}
  Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag {:level=>:warn}
  Created package {:path=>"perl-regexp-common_2017060201_all.deb"}

Fpm did a bunch of nice work for you. First, it searched MetaCPAN_ for Regexp::Common. Then it downloaded the latest version. If you wanted to specify a version, you can use the ``-v`` flag, such as ``-v 2016060201``.

In the example above, a few warning messages appear. Fpm's job is to help you convert packages. In this case, we're converting a Perl module named "Regexp::Common" to a Debian package. In this situation, we need to make sure our Debian package is accepted by Debian's tools! This means fpm will do the following:

* Debian package names appear to all use lowercase names, so fpm does this for you.
* Debian package names also cannot have "::" in the names, so fpm replaces these with a dash "-"

Let's try to use our new package! First, installing it::

  % sudo dpkg -i perl-regexp-common_2017060201_all.deb
  Selecting previously unselected package perl-regexp-common.
  (Reading database ... 81209 files and directories currently installed.)
  Preparing to unpack perl-regexp-common_2017060201_all.deb ...
  Unpacking perl-regexp-common (2017060201) ...
  Setting up perl-regexp-common (2017060201) ...
  Processing triggers for man-db (2.9.1-1) ...

And try to use it. Let's ask Regexp::Common for a regular expression that matches real numbers::

  % perl -MRegexp::Common -e 'print $RE{num}{real}'
  (?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

Nice!

Fun Examples
------------

.. note::
  Do you have any examples you want to share that use the ``cpan`` package type? Share your knowledge here: https://github.com/jordansissel/fpm/issues/new

cpan-specific command line flags
--------------------------------

.. include:: cli/cpan.rst


================================================
FILE: docs/packages/deb.rst
================================================
deb - Debian package format
===========================

Supported Uses in FPM
---------------------

fpm supports input and output for Debian package (deb). This means you can read a deb and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a deb package.

Arguments when used as input type
---------------------------------

For the sample command reading a deb file as input and outputting an rpm package::

	fpm -s deb -t rpm file.deb

The argument is used as a file and read as a debian package file.

Sample Usage
------------

Let's create a Debian package of Hashicorp's Terraform. To do this, we'll need to download it and put the files into a Debian package::

    # Download Terraform 1.0.10
    % wget https://releases.hashicorp.com/terraform/1.0.10/terraform_1.0.10_linux_amd64.zip

The Terraform release .zip file contains a single file, `terraform` itself. You can see the files in this zip by using `unzip -l`::

    % unzip -l ~/build/z/terraform_1.0.10_linux_amd64.zip
    Archive:  /home/jls/build/z/terraform_1.0.10_linux_amd64.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
    79348596  2021-10-28 07:15   terraform
    ---------                     -------
    79348596                     1 file

We can use fpm to convert this zip file into a debian package with one step::

    % fpm -s zip -t deb --prefix /usr/bin -n terraform -v 1.0.10 terraform_1.0.10_linux_amd64.zip
    Created package {:path=>"terraform_1.0.10_amd64.deb"}

Nice! We just converted a zip file into a debian package. Let's talk through the command-line flags here:

* ``-s zip`` tells fpm to use "zip" as the input type. This allows fpm to read zip files.
* ``-t deb`` tells fpm to output a Debian package.
* ``--prefix /usr/bin`` tells fpm to move all files in the .zip file to the /usr/bin file path. In this case, it results in a single file in the path `/usr/bin/terraform`
* ``-n terraform`` names the package "terraform"
* ``-v 1.0.10`` sets the package version. This is useful to package systems when considering whether a given package is an upgrade, downgrade, or already installed.
* Finally, the last argument, `terraform_1.0.10_linux_amd64.zip`. This is given to the fpm to process as a zip file.

You can inspect the package contents with `dpkg --contents terraform_1.0.10_amd64.deb`::

    % dpkg --contents terraform_1.0.10_amd64.deb
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./usr/
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./usr/share/
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./usr/share/doc/
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./usr/share/doc/terraform/
    -rw-r--r-- 0/0             141 2021-11-02 23:33 ./usr/share/doc/terraform/changelog.gz
    drwxr-xr-x 0/0               0 2021-11-02 23:33 ./usr/bin/
    -rwxr-xr-x 0/0        79348596 2021-10-28 07:15 ./usr/bin/terraform

The ``changelog.gz`` file is a recommended Debian practice for packaging. FPM will provide a generated changelog for you, by default. You can provide your own with the ``--deb-changelog`` flag.

Lets install our terraform package and try it out::

    % sudo apt install ./terraform_1.0
Download .txt
gitextract_i3qht6sd/

├── .github/
│   └── workflows/
│       └── ruby.yml
├── .gitignore
├── .readthedocs.yaml
├── .rubocop.yml
├── Brewfile
├── CHANGELOG.rst
├── CODE_OF_CONDUCT.md
├── CONTRIBUTORS
├── Dockerfile
├── Gemfile
├── LICENSE
├── Makefile
├── README.rst
├── Vagrantfile
├── bin/
│   └── fpm
├── docs/
│   ├── Dockerfile
│   ├── Makefile
│   ├── Makefile.sphinx
│   ├── changelog.rst
│   ├── changelog_links.rst
│   ├── cli-reference.rst
│   ├── conf.py
│   ├── contributing.rst
│   ├── docker.rst
│   ├── generate-cli-reference.rb
│   ├── getting-started.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── packages/
│   │   ├── apk.rst
│   │   ├── cli/
│   │   │   ├── apk.rst
│   │   │   ├── cpan.rst
│   │   │   ├── deb.rst
│   │   │   ├── dir.rst
│   │   │   ├── empty.rst
│   │   │   ├── freebsd.rst
│   │   │   ├── gem.rst
│   │   │   ├── npm.rst
│   │   │   ├── osxpkg.rst
│   │   │   ├── p5p.rst
│   │   │   ├── pacman.rst
│   │   │   ├── pear.rst
│   │   │   ├── pkgin.rst
│   │   │   ├── pleaserun.rst
│   │   │   ├── puppet.rst
│   │   │   ├── python.rst
│   │   │   ├── rpm.rst
│   │   │   ├── sh.rst
│   │   │   ├── snap.rst
│   │   │   ├── solaris.rst
│   │   │   ├── tar.rst
│   │   │   ├── virtualenv.rst
│   │   │   └── zip.rst
│   │   ├── cpan.rst
│   │   ├── deb.rst
│   │   ├── dir.rst
│   │   ├── empty.rst
│   │   ├── freebsd.rst
│   │   ├── gem.rst
│   │   ├── npm.rst
│   │   ├── osxpkg.rst
│   │   ├── p5p.rst
│   │   ├── pacman.rst
│   │   ├── pear.rst
│   │   ├── pkgin.rst
│   │   ├── pleaserun.rst
│   │   ├── puppet.rst
│   │   ├── python.rst
│   │   ├── rpm.rst
│   │   ├── sh.rst
│   │   ├── snap.rst
│   │   ├── solaris.rst
│   │   ├── tar.rst
│   │   ├── virtualenv.rst
│   │   └── zip.rst
│   ├── packaging-types.rst
│   └── requirements.txt
├── fpm.gemspec
├── lib/
│   ├── fpm/
│   │   ├── command.rb
│   │   ├── errors.rb
│   │   ├── namespace.rb
│   │   ├── package/
│   │   │   ├── apk.rb
│   │   │   ├── cpan.rb
│   │   │   ├── deb.rb
│   │   │   ├── dir.rb
│   │   │   ├── empty.rb
│   │   │   ├── freebsd.rb
│   │   │   ├── gem.rb
│   │   │   ├── npm.rb
│   │   │   ├── osxpkg.rb
│   │   │   ├── p5p.rb
│   │   │   ├── pacman.rb
│   │   │   ├── pear.rb
│   │   │   ├── pkgin.rb
│   │   │   ├── pleaserun.rb
│   │   │   ├── puppet.rb
│   │   │   ├── pyfpm/
│   │   │   │   ├── __init__.py
│   │   │   │   └── parse_requires.py
│   │   │   ├── python.rb
│   │   │   ├── rpm.rb
│   │   │   ├── sh.rb
│   │   │   ├── snap.rb
│   │   │   ├── solaris.rb
│   │   │   ├── tar.rb
│   │   │   ├── virtualenv.rb
│   │   │   └── zip.rb
│   │   ├── package.rb
│   │   ├── rake_task.rb
│   │   ├── util/
│   │   │   └── tar_writer.rb
│   │   ├── util.rb
│   │   └── version.rb
│   └── fpm.rb
├── notify-failure.sh
├── requirements.txt
├── singularity.def
├── spec/
│   ├── acceptance/
│   │   └── puppet/
│   │       └── manifests/
│   │           ├── install.pp
│   │           └── remove.pp
│   ├── conversion/
│   │   └── gem_to_deb.rb
│   ├── fixtures/
│   │   ├── deb/
│   │   │   ├── meta_test
│   │   │   ├── staging/
│   │   │   │   └── etc/
│   │   │   │       └── init.d/
│   │   │   │           └── test
│   │   │   └── triggers
│   │   ├── gem/
│   │   │   └── example/
│   │   │       ├── bin/
│   │   │       │   └── example
│   │   │       └── example.gemspec
│   │   ├── mockpackage.rb
│   │   ├── python/
│   │   │   ├── METADATA
│   │   │   ├── easy_install_default.py
│   │   │   ├── requirements.txt
│   │   │   └── setup.py
│   │   ├── python-pyproject.toml/
│   │   │   └── pyproject.toml
│   │   └── virtualenv/
│   │       └── requirements.txt
│   ├── fpm/
│   │   ├── command_spec.rb
│   │   ├── package/
│   │   │   ├── cpan_spec.rb
│   │   │   ├── deb_spec.rb
│   │   │   ├── dir_spec.rb
│   │   │   ├── empty_spec.rb
│   │   │   ├── freebsd_spec.rb
│   │   │   ├── gem_spec.rb
│   │   │   ├── npm_spec.rb
│   │   │   ├── osxpkg_spec.rb
│   │   │   ├── pacman_spec.rb
│   │   │   ├── python_spec.rb
│   │   │   ├── rpm_spec.rb
│   │   │   ├── sh_spec.rb
│   │   │   ├── snap_spec.rb
│   │   │   ├── tar_spec.rb
│   │   │   └── virtualenv_spec.rb
│   │   ├── package_convert_spec.rb
│   │   ├── package_spec.rb
│   │   ├── rake_task_spec.rb
│   │   └── util_spec.rb
│   ├── requirements.txt
│   └── spec_setup.rb
├── templates/
│   ├── deb/
│   │   ├── changelog.erb
│   │   ├── deb.changes.erb
│   │   ├── ldconfig.sh.erb
│   │   ├── postinst_upgrade.sh.erb
│   │   ├── postrm_upgrade.sh.erb
│   │   ├── preinst_upgrade.sh.erb
│   │   └── prerm_upgrade.sh.erb
│   ├── deb.erb
│   ├── osxpkg.erb
│   ├── p5p_metadata.erb
│   ├── pacman/
│   │   └── INSTALL.erb
│   ├── pacman.erb
│   ├── pleaserun/
│   │   ├── generate-cleanup.sh
│   │   ├── install-path.sh
│   │   ├── install.sh
│   │   └── scripts/
│   │       ├── after-install.sh
│   │       └── before-remove.sh
│   ├── puppet/
│   │   ├── package/
│   │   │   └── remove.pp.erb
│   │   └── package.pp.erb
│   ├── rpm/
│   │   └── filesystem_list
│   ├── rpm.erb
│   ├── sh.erb
│   └── solaris.erb
└── test/
    └── vagrant.pp
Download .txt
SYMBOL INDEX (324 symbols across 42 files)

FILE: lib/fpm/command.rb
  class FPM::Command (line 22) | class FPM::Command < Clamp::Command
    method help (line 25) | def help(*args)
    method initialize (line 271) | def initialize(*args)
    method execute (line 282) | def execute
    method run (line 548) | def run(run_args)
    method load_options (line 605) | def load_options(path)
    class Validator (line 682) | class Validator
      method initialize (line 686) | def initialize(command)
      method ok? (line 694) | def ok?
      method validate (line 698) | def validate
      method mandatory (line 747) | def mandatory(value, message)
      method messages (line 754) | def messages

FILE: lib/fpm/errors.rb
  class FPM::InvalidPackageConfiguration (line 4) | class FPM::InvalidPackageConfiguration < StandardError; end

FILE: lib/fpm/namespace.rb
  type FPM (line 2) | module FPM
    class Package (line 3) | class Package; end

FILE: lib/fpm/package.rb
  class FPM::Package (line 15) | class FPM::Package
    class InvalidArgument (line 20) | class InvalidArgument < StandardError; end
    class FileAlreadyExists (line 23) | class FileAlreadyExists < StandardError
      method to_s (line 25) | def to_s
    class ParentDirectoryMissing (line 32) | class ParentDirectoryMissing < StandardError
      method to_s (line 33) | def to_s
    method initialize (line 119) | def initialize
    method type (line 188) | def type
    method convert (line 193) | def convert(klass)
    method converted_from (line 226) | def converted_from(origin)
    method input (line 244) | def input(thing_to_input)
    method output (line 250) | def output(path)
    method staging_path (line 255) | def staging_path(path=nil)
    method build_path (line 265) | def build_path(path=nil)
    method cleanup (line 276) | def cleanup
    method cleanup_staging (line 281) | def cleanup_staging
    method cleanup_build (line 288) | def cleanup_build
    method files (line 303) | def files
    method template_dir (line 325) | def template_dir
    method template (line 329) | def template(path)
    method to_s_arch (line 344) | def to_s_arch;        architecture.to_s;  end
    method to_s_name (line 345) | def to_s_name;        name.to_s;          end
    method to_s_fullversion (line 346) | def to_s_fullversion; iteration ? "#{version}-#{iteration}" : "#{versi...
    method to_s_version (line 347) | def to_s_version;     version.to_s;       end
    method to_s_iteration (line 348) | def to_s_iteration;   iteration.to_s;     end
    method to_s_epoch (line 349) | def to_s_epoch;       epoch.to_s;         end
    method to_s_type (line 350) | def to_s_type;        type.to_s;          end
    method to_s_extension (line 351) | def to_s_extension;   type.to_s;          end
    method to_s (line 354) | def to_s(fmt=nil)
    method edit_file (line 366) | def edit_file(path)
    method exclude (line 384) | def exclude
    method inherited (line 414) | def inherited(klass)
    method types (line 420) | def types
    method option (line 425) | def option(flag, param, help, options={}, &block)
    method apply_options (line 453) | def apply_options(clampcommand)
    method default_attributes (line 461) | def default_attributes(&block)
    method type (line 473) | def type
    method version (line 479) | def version
    method script? (line 495) | def script?(name)
    method write_scripts (line 500) | def write_scripts
    method script (line 519) | def script(script_name)
    method output_check (line 530) | def output_check(output_path)
    method provides= (line 544) | def provides=(value)

FILE: lib/fpm/package/apk.rb
  class FPM::Package::APK (line 14) | class FPM::Package::APK< FPM::Package
    method name (line 45) | def name
    method prefix (line 64) | def prefix
    method architecture (line 68) | def architecture
    method input (line 77) | def input(input_path)
    method output (line 81) | def output(output_path)
    method write_pkginfo (line 120) | def write_pkginfo(base_path)
    method write_control_scripts (line 142) | def write_control_scripts(base_path)
    method register_script (line 161) | def register_script(key, value, hash)
    method cut_tar_record (line 172) | def cut_tar_record(target_path)
    method hash_datatar (line 218) | def hash_datatar(target_path)
    method concat_zip_tars (line 296) | def concat_zip_tars(apath, bpath, target_path)
    method determine_record_length (line 334) | def determine_record_length(record_length)
    method checksum_header (line 348) | def checksum_header(header)
    method hash_record (line 368) | def hash_record(data)
    method tar_path (line 398) | def tar_path(path, target_path)
    method add_paxstring (line 436) | def add_paxstring(ret)
    method pad_string_to (line 455) | def pad_string_to(ret, length)
    method replace_string_range (line 465) | def replace_string_range(str, start, finish, character)
    method replace_ownership_headers (line 475) | def replace_ownership_headers(header, nullify_names)
    method to_s (line 504) | def to_s(format=nil)

FILE: lib/fpm/package/cpan.rb
  class FPM::Package::CPAN (line 8) | class FPM::Package::CPAN < FPM::Package
    method input (line 48) | def input(package)
    method unpack (line 306) | def unpack(tarball)
    method download (line 315) | def download(metadata, cpan_version=nil)
    method search_module (line 370) | def search_module(module_name, version=nil)
    method search_provided_modules (line 404) | def search_provided_modules(distribution, version)
    method cap_name (line 446) | def cap_name(name)
    method fix_name (line 450) | def fix_name(name)
    method httpfetch (line 457) | def httpfetch(url)
    method httppost (line 474) | def httppost(url, body)

FILE: lib/fpm/package/deb.rb
  class FPM::Package::Deb (line 18) | class FPM::Package::Deb < FPM::Package
    method initialize (line 248) | def initialize(*args)
    method architecture (line 258) | def architecture
    method name (line 294) | def name
    method prefix (line 320) | def prefix
    method version (line 324) | def version
    method input (line 339) | def input(input_path)
    method extract_info (line 344) | def extract_info(package)
    method parse_depends (line 443) | def parse_depends(data)
    method extract_files (line 468) | def extract_files(package)
    method output (line 498) | def output(output_path)
    method converted_from (line 773) | def converted_from(origin)
    method debianize_op (line 880) | def debianize_op(op)
    method fix_dependency (line 886) | def fix_dependency(dep)
    method valid_provides_field? (line 964) | def valid_provides_field?(text)
    method valid_relationship_field? (line 981) | def valid_relationship_field?(text)
    method fix_provides (line 990) | def fix_provides(provides)
    method control_path (line 1017) | def control_path(path=nil)
    method write_control_tarball (line 1028) | def write_control_tarball
    method write_control (line 1083) | def write_control
    method write_scripts (line 1123) | def write_scripts
    method write_conffiles (line 1136) | def write_conffiles
    method write_shlibs (line 1229) | def write_shlibs
    method write_debconf (line 1238) | def write_debconf
    method write_meta_files (line 1250) | def write_meta_files
    method write_triggers (line 1260) | def write_triggers
    method write_md5sums (line 1278) | def write_md5sums
    method mkdir_p (line 1299) | def mkdir_p(dir)
    method to_s (line 1303) | def to_s(format=nil)
    method data_tar_flags (line 1309) | def data_tar_flags

FILE: lib/fpm/package/dir.rb
  class FPM::Package::Dir (line 13) | class FPM::Package::Dir < FPM::Package
    method input (line 39) | def input(path)
    method output (line 94) | def output(output_path)
    method clone (line 121) | def clone(source, destination)
    method copy (line 166) | def copy(source, destination)

FILE: lib/fpm/package/empty.rb
  class FPM::Package::Empty (line 6) | class FPM::Package::Empty < FPM::Package
    method initialize (line 7) | def initialize(*args)
    method output (line 19) | def output(output_path)
    method to_s (line 22) | def to_s(fmt)

FILE: lib/fpm/package/freebsd.rb
  class FPM::Package::FreeBSD (line 7) | class FPM::Package::FreeBSD < FPM::Package
    method output (line 23) | def output(output_path)
    method architecture (line 98) | def architecture
    method add_path (line 129) | def add_path(tar, tar_path, path)
    method to_s_extension (line 152) | def to_s_extension; "txz"; end
    method to_s_fullversion (line 154) | def to_s_fullversion()
    method to_s (line 160) | def to_s(format=nil)

FILE: lib/fpm/package/gem.rb
  class FPM::Package::Gem (line 17) | class FPM::Package::Gem < FPM::Package
    method staging_path (line 66) | def staging_path(path=nil)
    method input (line 77) | def input(gem)
    method download_if_necessary (line 89) | def download_if_necessary(gem, gem_version)
    method download (line 99) | def download(gem_name, gem_version=nil)
    method load_package_info (line 138) | def load_package_info(gem_path)
    method install_to_staging (line 222) | def install_to_staging(gem_path)
    method fix_name (line 313) | def fix_name(name)
    method detect_source_date_from_changelog (line 339) | def detect_source_date_from_changelog(installdir)

FILE: lib/fpm/package/npm.rb
  class FPM::Package::NPM (line 6) | class FPM::Package::NPM < FPM::Package
    method input (line 21) | def input(package)
    method set_default_prefix (line 103) | def set_default_prefix
    method default_prefix (line 108) | def self.default_prefix

FILE: lib/fpm/package/osxpkg.rb
  class FPM::Package::OSXpkg (line 12) | class FPM::Package::OSXpkg < FPM::Package
    method identifier (line 59) | def identifier
    method scripts_path (line 68) | def scripts_path(path=nil)
    method write_scripts (line 79) | def write_scripts
    method pkginfo_template_path (line 95) | def pkginfo_template_path
    method extract_info (line 104) | def extract_info(package)
    method input (line 118) | def input(input_path)
    method output (line 131) | def output(output_path)
    method to_s_extension (line 162) | def to_s_extension; "pkg"; end
    method to_s (line 164) | def to_s(format=nil)

FILE: lib/fpm/package/p5p.rb
  class FPM::Package::P5P (line 7) | class FPM::Package::P5P < FPM::Package
    method architecture (line 38) | def architecture
    method output (line 49) | def output(output_path)

FILE: lib/fpm/package/pacman.rb
  class FPM::Package::Pacman (line 8) | class FPM::Package::Pacman < FPM::Package
    method initialize (line 32) | def initialize(*args)
    method architecture (line 37) | def architecture
    method iteration (line 56) | def iteration
    method config_files (line 60) | def config_files
    method dependencies (line 64) | def dependencies
    method input (line 101) | def input(pacman_pkg_path)
    method compression_option (line 214) | def compression_option
    method compression_ending (line 233) | def compression_ending
    method output (line 253) | def output(output_path)
    method data_tar_flags (line 297) | def data_tar_flags
    method default_output (line 319) | def default_output
    method to_s_extension (line 329) | def to_s_extension; "pkg.tar#{compression_ending}"; end
    method to_s (line 331) | def to_s(format=nil)
    method generate_mtree (line 339) | def generate_mtree
    method gobble_function (line 357) | def gobble_function(cons,prod)
    method parse_install_script (line 380) | def parse_install_script(path)

FILE: lib/fpm/package/pear.rb
  class FPM::Package::PEAR (line 9) | class FPM::Package::PEAR < FPM::Package
    method input (line 38) | def input(input_package)

FILE: lib/fpm/package/pkgin.rb
  class FPM::Package::Pkgin (line 1) | class FPM::Package::Pkgin < FPM::Package
    method output (line 3) | def output(output_path)
    method iteration (line 30) | def iteration

FILE: lib/fpm/package/pleaserun.rb
  class FPM::Package::PleaseRun (line 11) | class FPM::Package::PleaseRun < FPM::Package
    method input (line 24) | def input(command)

FILE: lib/fpm/package/puppet.rb
  class FPM::Package::Puppet (line 8) | class FPM::Package::Puppet < FPM::Package
    method architecture (line 9) | def architecture
    method generate_specfile (line 19) | def generate_specfile(builddir)
    method unpack_data_to (line 48) | def unpack_data_to
    method build! (line 52) | def build!(params)
    method default_output (line 85) | def default_output
    method puppetsort (line 90) | def puppetsort(hash)
    method uid2user (line 97) | def uid2user(uid)
    method gid2group (line 109) | def gid2group(gid)

FILE: lib/fpm/package/pyfpm/parse_requires.py
  function evaluate_requirements (line 13) | def evaluate_requirements(fd):

FILE: lib/fpm/package/python.rb
  class FPM::Package::Python (line 20) | class FPM::Package::Python < FPM::Package
    class PythonMetadata (line 101) | class PythonMetadata
      class MissingField (line 104) | class MissingField < StandardError; end
      class UnexpectedContent (line 105) | class UnexpectedContent < StandardError; end
      method parse (line 113) | def self.parse(input)
      method from (line 174) | def self.from(input)
      method initialize (line 200) | def initialize(headers, body=nil)
      method process_description (line 221) | def process_description(headers, body)
      method process_license (line 257) | def process_license(headers)
      method process_homepage (line 276) | def process_homepage(headers)
      method process_maintainer (line 300) | def process_maintainer(headers)
    method input (line 319) | def input(package)
    method explore_environment (line 366) | def explore_environment
    method download_if_necessary (line 395) | def download_if_necessary(package, version=nil)
    method load_package_info (line 479) | def load_package_info(path)
    method fix_name (line 587) | def fix_name(name)
    method install_to_staging (line 598) | def install_to_staging(path)

FILE: lib/fpm/package/rpm.rb
  class FPM::Package::RPM (line 19) | class FPM::Package::RPM < FPM::Package
    method rpm_fix_name (line 201) | def rpm_fix_name(name)
    method rpm_file_entry (line 224) | def rpm_file_entry(file)
    method architecture (line 256) | def architecture
    method iteration (line 275) | def iteration
    method changelog (line 286) | def changelog
    method converted_from (line 304) | def converted_from(origin)
    method rpm_get_trigger_type (line 396) | def rpm_get_trigger_type(flag)
    method input (line 414) | def input(path)
    method prefixed_path (line 488) | def prefixed_path(path)
    method output (line 492) | def output(output_path)
    method prefix (line 617) | def prefix
    method build_sub_dir (line 625) | def build_sub_dir
    method summary (line 630) | def summary
    method version (line 638) | def version
    method epoch (line 649) | def epoch
    method to_s_dist (line 659) | def to_s_dist;
    method to_s (line 663) | def to_s(format=nil)
    method payload_compression (line 674) | def payload_compression
    method digest_algorithm (line 683) | def digest_algorithm

FILE: lib/fpm/package/sh.rb
  class FPM::Package::Sh (line 16) | class FPM::Package::Sh < FPM::Package
    method output (line 18) | def output(output_path)
    method create_scripts (line 26) | def create_scripts
    method install_script (line 32) | def install_script
    method payload (line 41) | def payload
    method fpm_meta_path (line 62) | def fpm_meta_path

FILE: lib/fpm/package/snap.rb
  class FPM::Package::Snap (line 11) | class FPM::Package::Snap < FPM::Package
    method input (line 38) | def input(input_snap)
    method output (line 44) | def output(output_snap)
    method to_s (line 54) | def to_s(format=nil)
    method extract_snap_to_staging (line 62) | def extract_snap_to_staging(snap_path)
    method extract_snap_metadata_from_staging (line 66) | def extract_snap_metadata_from_staging
    method write_snap_yaml (line 90) | def write_snap_yaml

FILE: lib/fpm/package/solaris.rb
  class FPM::Package::Solaris (line 9) | class FPM::Package::Solaris < FPM::Package
    method architecture (line 19) | def architecture
    method specfile (line 30) | def specfile(builddir)
    method output (line 34) | def output(output_path)
    method default_output (line 85) | def default_output

FILE: lib/fpm/package/tar.rb
  class FPM::Package::Tar (line 10) | class FPM::Package::Tar < FPM::Package
    method input (line 13) | def input(input_path)
    method output (line 49) | def output(output_path)
    method tar_compression_flag (line 66) | def tar_compression_flag(path)

FILE: lib/fpm/package/virtualenv.rb
  class FPM::Package::Virtualenv (line 11) | class FPM::Package::Virtualenv < FPM::Package
    method input (line 56) | def input(package)
    method remove_python_compiled_files (line 222) | def remove_python_compiled_files path

FILE: lib/fpm/package/zip.rb
  class FPM::Package::Zip (line 10) | class FPM::Package::Zip < FPM::Package
    method input (line 13) | def input(input_path)
    method output (line 40) | def output(output_path)

FILE: lib/fpm/rake_task.rb
  class FPM::RakeTask (line 5) | class FPM::RakeTask < Rake::TaskLib
    class Options (line 6) | class Options
      method initialize (line 9) | def initialize(defaults=nil)
      method method_missing (line 17) | def method_missing(m, *args)
      method to_h (line 27) | def to_h
    method initialize (line 34) | def initialize(package_name, opts = {}, &block)
    method parsed_options (line 55) | def parsed_options
    method run_cli (line 74) | def run_cli

FILE: lib/fpm/util.rb
  type FPM::Util (line 6) | module FPM::Util
    class ExecutableNotFound (line 9) | class ExecutableNotFound < StandardError; end
    class ProcessFailed (line 12) | class ProcessFailed < StandardError; end
    class NamedPipeCannotBeCopied (line 15) | class NamedPipeCannotBeCopied < StandardError; end
    class UnsupportedSpecialFile (line 18) | class UnsupportedSpecialFile < StandardError; end
    function program_in_path? (line 21) | def program_in_path?(program)
    function program_exists? (line 30) | def program_exists?(program)
    function default_shell (line 37) | def default_shell
    function execmd (line 97) | def execmd(*args)
    function safesystem (line 177) | def safesystem(*args)
    function safesystemout (line 201) | def safesystemout(*args)
    function ar_cmd (line 227) | def ar_cmd
    function ar_cmd_deterministic? (line 259) | def ar_cmd_deterministic?
    function tar_cmd (line 265) | def tar_cmd
    function tar_cmd_supports_sort_names_and_set_mtime? (line 306) | def tar_cmd_supports_sort_names_and_set_mtime?
    function copy_metadata (line 311) | def copy_metadata(source, destination)
    function copy_entry (line 334) | def copy_entry(src, dst, preserve=false, remove_destination=false)
    function copied_entries (line 381) | def copied_entries
    function expand_pessimistic_constraints (line 394) | def expand_pessimistic_constraints(constraint)
    function logger (line 426) | def logger
    function erbnew (line 430) | def erbnew(template_code)

FILE: lib/fpm/util/tar_writer.rb
  type FPM (line 5) | module FPM
    type Issues (line 6) | module Issues
      type TarWriter (line 7) | module TarWriter
        function has_issue_1608? (line 9) | def self.has_issue_1608?
        function has_issues_with_split_name? (line 18) | def self.has_issues_with_split_name?
        function has_issues_with_add_symlink? (line 23) | def self.has_issues_with_add_symlink?
    type Util (line 30) | module Util; end
  type FPM (line 30) | module FPM; module Util; end; end
    type Issues (line 6) | module Issues
      type TarWriter (line 7) | module TarWriter
        function has_issue_1608? (line 9) | def self.has_issue_1608?
        function has_issues_with_split_name? (line 18) | def self.has_issues_with_split_name?
        function has_issues_with_add_symlink? (line 23) | def self.has_issues_with_add_symlink?
    type Util (line 30) | module Util; end
  class FPM::Util::TarWriter (line 33) | class FPM::Util::TarWriter < ::Gem::Package::TarWriter
    method split_name (line 35) | def split_name(name)
    method add_symlink (line 66) | def add_symlink(name, target, mode)

FILE: lib/fpm/version.rb
  type FPM (line 1) | module FPM

FILE: spec/fixtures/mockpackage.rb
  class FPM::Package::Mock (line 4) | class FPM::Package::Mock < FPM::Package
    method input (line 5) | def input(*args); end
    method output (line 6) | def output(*args); end

FILE: spec/fixtures/python/easy_install_default.py
  class _easy_install_default (line 4) | class _easy_install_default(easy_install):
    method __init__ (line 10) | def __init__(self):

FILE: spec/fpm/package/deb_spec.rb
  function dpkg_field (line 282) | def dpkg_field(field)

FILE: spec/fpm/package/dir_spec.rb
  type SecureRandom (line 9) | module SecureRandom
    function uuid (line 10) | def self.uuid

FILE: spec/fpm/package/pacman_spec.rb
  function skip? (line 18) | def skip?

FILE: spec/fpm/package/python_spec.rb
  function find_python (line 6) | def find_python
  function python_usable? (line 13) | def python_usable?
  function easy_install_default (line 24) | def easy_install_default(python_bin, option)

FILE: spec/fpm/package/rpm_spec.rb
  function files (line 103) | def subject.files; [__FILE__]; end
  function rpmspec (line 104) | def subject.rpmspec; @rpmspec; end
  function render_template (line 105) | def subject.render_template; @rpmspec = template("rpm.erb").result(bindi...
  function files (line 127) | def subject.files; [__FILE__]; end
  function rpmspec (line 128) | def subject.rpmspec; @rpmspec; end
  function render_template (line 129) | def subject.render_template; @rpmspec = template("rpm.erb").result(bindi...

FILE: spec/fpm/package/sh_spec.rb
  function make_sh_package (line 17) | def make_sh_package

FILE: spec/fpm/package/virtualenv_spec.rb
  function virtualenv_usable? (line 6) | def virtualenv_usable?

FILE: spec/spec_setup.rb
  function subscribe (line 31) | def subscribe(io)
  type Kernel (line 41) | module Kernel
    function system (line 43) | def system(*args)
Condensed preview — 175 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,102K chars).
[
  {
    "path": ".github/workflows/ruby.yml",
    "chars": 747,
    "preview": "name: Ruby\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-24.0"
  },
  {
    "path": ".gitignore",
    "chars": 360,
    "preview": "# vim\n.*.sw[a-z]\n\n# emacs\n\\#*#\n*~\n.#*\n\n# package builds\n*.rpm\n*.deb\n*.pkg.tar*\n\n# build byproducts\nbuild-*/*\nfpm.wiki\n*."
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 224,
    "preview": "# https://blog.readthedocs.com/build-errors-docutils-0-18/\nversion: 2\n\nbuild:\n  os: ubuntu-24.04\n  tools:\n    python: \"3"
  },
  {
    "path": ".rubocop.yml",
    "chars": 1750,
    "preview": "# Let's not argue over this...\nStringLiterals:\n  Enabled: false\n\n# I can't find a reason for raise vs fail.\nSignalExcept"
  },
  {
    "path": "Brewfile",
    "chars": 48,
    "preview": "brew 'dpkg'\nbrew 'rpm'\nbrew 'gnu-tar'\nbrew 'xz'\n"
  },
  {
    "path": "CHANGELOG.rst",
    "chars": 55511,
    "preview": "Release Notes and Change Log\n============================\n\n1.17.0 (October 2, 2025)\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n* python: "
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3220,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTORS",
    "chars": 703,
    "preview": "The following awesome folks have contributed ideas, \nbug reports, code, or other to fpm:\n\nanthezium\nCurt Micol\nJeanine A"
  },
  {
    "path": "Dockerfile",
    "chars": 3078,
    "preview": "# syntax=docker/dockerfile:1\n\n# Are we running against the minimal container, or the everything\n# container? Minimal is "
  },
  {
    "path": "Gemfile",
    "chars": 39,
    "preview": "source 'https://rubygems.org'\n\ngemspec\n"
  },
  {
    "path": "LICENSE",
    "chars": 1112,
    "preview": "(This is an MIT-style license)\n\nCopyright (c) 2011-2021 Jordan Sissel and contributors.\n\nPermission is hereby granted, f"
  },
  {
    "path": "Makefile",
    "chars": 1709,
    "preview": "GEMSPEC=$(shell ls *.gemspec)\nVERSION=$(shell awk -F\\\" '/VERSION =/ { print $$2 }' lib/fpm/version.rb)\nNAME=$(shell awk "
  },
  {
    "path": "README.rst",
    "chars": 2913,
    "preview": "fpm\n===\n\n|Gem|\n\nThe goal of fpm is to make it easy and quick to build packages such as rpms,\ndebs, OSX packages, etc.\n\nf"
  },
  {
    "path": "Vagrantfile",
    "chars": 1244,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n  # All Vagrant configuration is done here."
  },
  {
    "path": "bin/fpm",
    "chars": 139,
    "preview": "#!/usr/bin/env ruby\n\n$: << File.join(File.dirname(__FILE__), \"..\", \"lib\")\nrequire \"fpm\"\nrequire \"fpm/command\"\n\nexit(FPM:"
  },
  {
    "path": "docs/Dockerfile",
    "chars": 367,
    "preview": "# This Dockerfile produces a docker image which is used to build the fpm docs.\nFROM  debian:latest\nRUN   apt-get update\n"
  },
  {
    "path": "docs/Makefile",
    "chars": 1549,
    "preview": "include Makefile.sphinx\n\nIMAGE=fpm-sphinx\nWORKDIR=./.work\nGITROOT=$(shell git rev-parse --show-toplevel)\nGITREMOTE=$(she"
  },
  {
    "path": "docs/Makefile.sphinx",
    "chars": 7473,
    "preview": "# Makefile for Sphinx documentation\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   "
  },
  {
    "path": "docs/changelog.rst",
    "chars": 63,
    "preview": ".. include:: changelog_links.rst\n.. include:: ../CHANGELOG.rst\n"
  },
  {
    "path": "docs/changelog_links.rst",
    "chars": 27034,
    "preview": ".. _#1006: https://github.com/jordansissel/fpm/issues/1006\n.. _#1008: https://github.com/jordansissel/fpm/issues/1008\n.."
  },
  {
    "path": "docs/cli-reference.rst",
    "chars": 26159,
    "preview": "Command-line Reference\n==========================\n\nThis page documents the command-line flags available in FPM. You can "
  },
  {
    "path": "docs/conf.py",
    "chars": 9391,
    "preview": "# -*- coding: utf-8 -*-\n#\n# fpm documentation build configuration file, created by\n# sphinx-quickstart on Sun Nov 27 05:"
  },
  {
    "path": "docs/contributing.rst",
    "chars": 4480,
    "preview": "Contributing/Issues\n===================\n\nPlease note that this project is released with a Contributor Code of Conduct. B"
  },
  {
    "path": "docs/docker.rst",
    "chars": 2236,
    "preview": "FPM and Docker\n==============\n\nBecause fpm depends on so many underlying system tools, docker can\nalleviate the need to "
  },
  {
    "path": "docs/generate-cli-reference.rb",
    "chars": 1939,
    "preview": "#!/usr/bin/env ruby\n\nrequire_relative \"../lib/fpm/command\"\n\nflagsort = lambda { |x| x.sub(/^--(?:\\[no-\\])?/, \"\") }\n\nif A"
  },
  {
    "path": "docs/getting-started.rst",
    "chars": 10464,
    "preview": "Getting Started\n===============\n\nFPM takes your program and builds packages that can be installed easily on various oper"
  },
  {
    "path": "docs/index.rst",
    "chars": 1772,
    "preview": "fpm - packaging made simple\n===========================\n\n.. note::\n  The documentation here is a work-in-progress; it is"
  },
  {
    "path": "docs/installation.rst",
    "chars": 2209,
    "preview": "Installation\n============\n\nFPM is written in ruby and can be installed using `gem`. For some package formats (like rpm a"
  },
  {
    "path": "docs/packages/apk.rst",
    "chars": 338,
    "preview": "apk - Alpine package format\n===========================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports using"
  },
  {
    "path": "docs/packages/cli/apk.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/cpan.rst",
    "chars": 826,
    "preview": "* ``--cpan-cpanm-bin CPANM_EXECUTABLE``\n    - The path to the cpanm executable you wish to run.\n* ``--[no-]cpan-cpanm-fo"
  },
  {
    "path": "docs/packages/cli/deb.rst",
    "chars": 3642,
    "preview": "* ``--deb-activate EVENT``\n    - Package activates EVENT trigger\n* ``--deb-activate-noawait EVENT``\n    - Package activa"
  },
  {
    "path": "docs/packages/cli/dir.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/empty.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/freebsd.rst",
    "chars": 178,
    "preview": "* ``--freebsd-origin ABI``\n    - Sets the FreeBSD 'origin' pkg field\n* ``--freebsd-osversion VERSION``\n    - Sets the Fr"
  },
  {
    "path": "docs/packages/cli/gem.rst",
    "chars": 1470,
    "preview": "* ``--gem-bin-path DIRECTORY``\n    - The directory to install gem executables\n* ``--gem-disable-dependency gem_name``\n  "
  },
  {
    "path": "docs/packages/cli/npm.rst",
    "chars": 257,
    "preview": "* ``--npm-bin NPM_EXECUTABLE``\n    - The path to the npm executable you wish to run.\n* ``--npm-package-name-prefix PREFI"
  },
  {
    "path": "docs/packages/cli/osxpkg.rst",
    "chars": 720,
    "preview": "* ``--osxpkg-dont-obsolete DONT_OBSOLETE_PATH``\n    - A file path for which to 'dont-obsolete' in the built PackageInfo."
  },
  {
    "path": "docs/packages/cli/p5p.rst",
    "chars": 433,
    "preview": "* ``--p5p-group GROUP``\n    - Set the group to GROUP in the prototype file.\n* ``--[no-]p5p-lint``\n    - Check manifest w"
  },
  {
    "path": "docs/packages/cli/pacman.rst",
    "chars": 464,
    "preview": "* ``--pacman-compression COMPRESSION``\n    - The compression type to use, must be one of gz, bzip2, xz, zstd, none.\n* ``"
  },
  {
    "path": "docs/packages/cli/pear.rst",
    "chars": 647,
    "preview": "* ``--pear-bin-dir BIN_DIR``\n    - Directory to put binaries in\n* ``--pear-channel CHANNEL_URL``\n    - The pear channel "
  },
  {
    "path": "docs/packages/cli/pkgin.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/pleaserun.rst",
    "chars": 240,
    "preview": "* ``--pleaserun-chdir CHDIR``\n    - The working directory used by the service\n* ``--pleaserun-name SERVICE_NAME``\n    - "
  },
  {
    "path": "docs/packages/cli/puppet.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/python.rst",
    "chars": 2776,
    "preview": "* ``--python-bin PYTHON_EXECUTABLE``\n    - The path to the python executable you wish to run.\n* ``--[no-]python-dependen"
  },
  {
    "path": "docs/packages/cli/rpm.rst",
    "chars": 4406,
    "preview": "* ``--rpm-attr ATTRFILE``\n    - Set the attribute for a file (%attr), e.g. --rpm-attr 750,user1,group1:/some/file\n* ``--"
  },
  {
    "path": "docs/packages/cli/sh.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/snap.rst",
    "chars": 208,
    "preview": "* ``--snap-confinement CONFINEMENT``\n    - Type of confinement to use for this snap.\n* ``--snap-grade GRADE``\n    - Grad"
  },
  {
    "path": "docs/packages/cli/solaris.rst",
    "chars": 158,
    "preview": "* ``--solaris-group GROUP``\n    - Set the group to GROUP in the prototype file.\n* ``--solaris-user USER``\n    - Set the "
  },
  {
    "path": "docs/packages/cli/tar.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cli/virtualenv.rst",
    "chars": 1232,
    "preview": "* ``--virtualenv-find-links PIP_FIND_LINKS``\n    - If a url or path to an html file, then parse for links to archives. I"
  },
  {
    "path": "docs/packages/cli/zip.rst",
    "chars": 45,
    "preview": "This package type has no additional options\n\n"
  },
  {
    "path": "docs/packages/cpan.rst",
    "chars": 3566,
    "preview": "cpan - Perl packages from CPAN\n===============================\n\nSupported Uses in FPM\n---------------------\n\nfpm support"
  },
  {
    "path": "docs/packages/deb.rst",
    "chars": 5056,
    "preview": "deb - Debian package format\n===========================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports input"
  },
  {
    "path": "docs/packages/dir.rst",
    "chars": 3374,
    "preview": "dir - Local Files\n=================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports using ``dir`` as an input"
  },
  {
    "path": "docs/packages/empty.rst",
    "chars": 1568,
    "preview": "empty - A package with no files\n===============================\n\nSupported Uses in FPM\n---------------------\n\nfpm suppor"
  },
  {
    "path": "docs/packages/freebsd.rst",
    "chars": 356,
    "preview": "freebsd - FreeBSD pkg\n===============================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports using `"
  },
  {
    "path": "docs/packages/gem.rst",
    "chars": 349,
    "preview": "gem - Ruby's rubygem packages\n=============================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports u"
  },
  {
    "path": "docs/packages/npm.rst",
    "chars": 3025,
    "preview": "npm - Packages for NodeJS\n===============================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports usi"
  },
  {
    "path": "docs/packages/osxpkg.rst",
    "chars": 480,
    "preview": "osxpkg - Apple macOS and OSX packages\n=====================================\n\nSupported Uses in FPM\n---------------------"
  },
  {
    "path": "docs/packages/p5p.rst",
    "chars": 485,
    "preview": "p5p - Oracle Solaris 11 p5p packages\n====================================\n\nThis package format for the Solaris Image Pac"
  },
  {
    "path": "docs/packages/pacman.rst",
    "chars": 437,
    "preview": "pacman - Arch Linux package format\n==================================\n\nSupported Uses in FPM\n---------------------\n\nfpm "
  },
  {
    "path": "docs/packages/pear.rst",
    "chars": 344,
    "preview": "pear - PHP PEAR Packages\n========================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports using ``pea"
  },
  {
    "path": "docs/packages/pkgin.rst",
    "chars": 372,
    "preview": "pkgin - NetBSD's pkgsrc binary packages\n=======================================\n\nSupported Uses in FPM\n-----------------"
  },
  {
    "path": "docs/packages/pleaserun.rst",
    "chars": 859,
    "preview": "pleaserun - Pleaserun services\n==============================\n\nPleaserun helps generate service definitions for a variet"
  },
  {
    "path": "docs/packages/puppet.rst",
    "chars": 496,
    "preview": "puppet - Puppet Manifests (deprecated)\n======================================\n\nNote: This package type hasn't been maint"
  },
  {
    "path": "docs/packages/python.rst",
    "chars": 376,
    "preview": "python - Python packages, PyPI, etc\n===================================\n\nSupported Uses in FPM\n---------------------\n\nfp"
  },
  {
    "path": "docs/packages/rpm.rst",
    "chars": 2455,
    "preview": "rpm - RedHat Package Manager\n============================\n\nrpm is the package format used on RedHat Enterprise (RHEL), F"
  },
  {
    "path": "docs/packages/sh.rst",
    "chars": 667,
    "preview": "sh - Self-managing shell archive\n================================\n\nThe 'sh' output in fpm will generate a shell script t"
  },
  {
    "path": "docs/packages/snap.rst",
    "chars": 516,
    "preview": "snap - Application package files for Linux\n==========================================\n\nYou can learn more about ``snap``"
  },
  {
    "path": "docs/packages/solaris.rst",
    "chars": 731,
    "preview": "solaris - Solaris SRV4 package format\n=====================================\n\nThis package format is typically used in ol"
  },
  {
    "path": "docs/packages/tar.rst",
    "chars": 399,
    "preview": "tar - Tape archives aka \"tar\" files\n===================================\n\nSupported Uses in FPM\n---------------------\n\nfp"
  },
  {
    "path": "docs/packages/virtualenv.rst",
    "chars": 386,
    "preview": "virtualenv - Python virtualenv\n==============================\n\nSupported Uses in FPM\n---------------------\n\nfpm supports"
  },
  {
    "path": "docs/packages/zip.rst",
    "chars": 358,
    "preview": "zip - Zip files\n===============\n\nSupported Uses in FPM\n---------------------\n\nfpm supports input and output for zip file"
  },
  {
    "path": "docs/packaging-types.rst",
    "chars": 84,
    "preview": "Packaging Types\n===============\n\n.. toctree::\n\t:includehidden:\n\t:glob:\n\n\tpackages/*\n"
  },
  {
    "path": "docs/requirements.txt",
    "chars": 17,
    "preview": "sphinx_rtd_theme\n"
  },
  {
    "path": "fpm.gemspec",
    "chars": 2061,
    "preview": "require File.join(File.dirname(__FILE__), \"lib/fpm/version\")\nGem::Specification.new do |spec|\n  files = []\n  dirs = %w{l"
  },
  {
    "path": "lib/fpm/command.rb",
    "chars": 29473,
    "preview": "require \"rubygems\"\nrequire \"fpm/namespace\"\nrequire \"fpm/version\"\nrequire \"fpm/util\"\nrequire \"clamp\"\nrequire \"fpm\"\nrequir"
  },
  {
    "path": "lib/fpm/errors.rb",
    "chars": 143,
    "preview": "require \"fpm/namespace\"\n\n# Raised if a package is configured in an unsupported way\nclass FPM::InvalidPackageConfiguratio"
  },
  {
    "path": "lib/fpm/namespace.rb",
    "chars": 56,
    "preview": "# The FPM namespace\nmodule FPM\n  class Package; end\nend\n"
  },
  {
    "path": "lib/fpm/package/apk.rb",
    "chars": 14129,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"fpm/util\"\nrequire \"backports/l"
  },
  {
    "path": "lib/fpm/package/cpan.rb",
    "chars": 18178,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\nrequire \"find\"\nrequire \"pathname\"\n\n"
  },
  {
    "path": "lib/fpm/package/deb.rb",
    "chars": 50621,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"fpm/util\"\nrequire \"backports/l"
  },
  {
    "path": "lib/fpm/package/dir.rb",
    "chars": 7640,
    "preview": "require \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"backports/latest\"\nrequire \"fileutils\"\nrequire \"find\"\nrequire \"socket\"\n"
  },
  {
    "path": "lib/fpm/package/empty.rb",
    "chars": 664,
    "preview": "require \"fpm/package\"\nrequire \"backports/latest\"\n\n# Empty Package type. For strict/meta/virtual package creation\n\nclass "
  },
  {
    "path": "lib/fpm/package/freebsd.rb",
    "chars": 4991,
    "preview": "require \"backports/latest\" # gem backports/latest\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"digest\"\nrequire \"fil"
  },
  {
    "path": "lib/fpm/package/gem.rb",
    "chars": 15250,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"rubygems\"\nrequire \"fileutils\"\nrequire \"fpm/util\"\nrequire \"yaml\"\n\n"
  },
  {
    "path": "lib/fpm/package/npm.rb",
    "chars": 4202,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\n\nclass FPM::Package::NPM < FPM::Pac"
  },
  {
    "path": "lib/fpm/package/osxpkg.rb",
    "chars": 5599,
    "preview": "require \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\nrequire \"fpm/package/dir\"\nrequire 'tempfile'  # stdlib\nrequ"
  },
  {
    "path": "lib/fpm/package/p5p.rb",
    "chars": 3850,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"fpm/util\"\n\nclass FPM::Package:"
  },
  {
    "path": "lib/fpm/package/pacman.rb",
    "chars": 13128,
    "preview": "# -*- coding: utf-8 -*-\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"backports/latest\"\nrequire \"fileutils\"\nrequire "
  },
  {
    "path": "lib/fpm/package/pear.rb",
    "chars": 4919,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fileutils\"\nrequire \"fpm/util\"\n\n# This provides PHP PEAR package s"
  },
  {
    "path": "lib/fpm/package/pkgin.rb",
    "chars": 992,
    "preview": "class FPM::Package::Pkgin < FPM::Package\n\n  def output(output_path)\n    output_check(output_path)\n\n    File.write(build_"
  },
  {
    "path": "lib/fpm/package/pleaserun.rb",
    "chars": 3220,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\n\nrequire \"pleaserun/cli\"\n\n# A pleas"
  },
  {
    "path": "lib/fpm/package/puppet.rb",
    "chars": 3368,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"etc\"\nrequire \"fileutils\"\n\nclas"
  },
  {
    "path": "lib/fpm/package/pyfpm/__init__.py",
    "chars": 29,
    "preview": "__all__ = [ \"get_metadata\" ]\n"
  },
  {
    "path": "lib/fpm/package/pyfpm/parse_requires.py",
    "chars": 864,
    "preview": "#!/usr/bin/env python3\n\n#import pkg_resources\nimport packaging.requirements\nimport packaging.markers\nimport json\nimport "
  },
  {
    "path": "lib/fpm/package/python.rb",
    "chars": 25733,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"rubygems/package\"\nrequire \"rubygems\"\nrequire \""
  },
  {
    "path": "lib/fpm/package/rpm.rb",
    "chars": 24568,
    "preview": "require \"fpm/package\"\nrequire \"backports/latest\"\nrequire \"fileutils\"\nrequire \"find\"\nrequire \"arr-pm/file\" # gem 'arr-pm'"
  },
  {
    "path": "lib/fpm/package/sh.rb",
    "chars": 1839,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"fpm/util\"\nrequire \"backports/l"
  },
  {
    "path": "lib/fpm/package/snap.rb",
    "chars": 3749,
    "preview": "require \"yaml\"\n\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\nrequire \"fpm/package/dir\"\n\n# Support for sn"
  },
  {
    "path": "lib/fpm/package/solaris.rb",
    "chars": 3002,
    "preview": "require \"erb\"\nrequire \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/errors\"\nrequire \"fpm/util\"\n\n# TODO(sissel): Add"
  },
  {
    "path": "lib/fpm/package/tar.rb",
    "chars": 2144,
    "preview": "require \"backports/latest\" # gem backports/latest\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\nrequire \""
  },
  {
    "path": "lib/fpm/package/virtualenv.rb",
    "chars": 8180,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\nrequire \"fpm/util\"\n\nrequire \"fpm/package/dir\"\n\n# Support for python virtua"
  },
  {
    "path": "lib/fpm/package/zip.rb",
    "chars": 1343,
    "preview": "require \"backports/latest\" # gem backports/latest\nrequire \"fpm/package\"\nrequire \"fpm/util\"\nrequire \"fileutils\"\nrequire \""
  },
  {
    "path": "lib/fpm/package.rb",
    "chars": 18111,
    "preview": "require \"fpm/namespace\" # local\nrequire \"fpm/util\" # local\nrequire \"pathname\" # stdlib\nrequire \"find\"\nrequire \"tmpdir\" #"
  },
  {
    "path": "lib/fpm/rake_task.rb",
    "chars": 2158,
    "preview": "require \"fpm/namespace\"\nrequire \"rake\"\nrequire \"rake/tasklib\"\n\nclass FPM::RakeTask < Rake::TaskLib\n  class Options\n    a"
  },
  {
    "path": "lib/fpm/util/tar_writer.rb",
    "chars": 2945,
    "preview": "require 'rubygems/package'\n\nrequire 'stringio'\n\nmodule FPM\n  module Issues\n    module TarWriter\n      # See https://gith"
  },
  {
    "path": "lib/fpm/util.rb",
    "chars": 15131,
    "preview": "require \"fpm/namespace\"\nrequire \"fileutils\"\nrequire \"stud/temporary\"\n\n# Some utility functions\nmodule FPM::Util\n\n  # Rai"
  },
  {
    "path": "lib/fpm/version.rb",
    "chars": 36,
    "preview": "module FPM\n  VERSION = \"1.17.0\"\nend\n"
  },
  {
    "path": "lib/fpm.rb",
    "chars": 539,
    "preview": "require \"fpm/namespace\"\n\nrequire \"fpm/package\"\nrequire \"fpm/package/dir\"\nrequire \"fpm/package/gem\"\nrequire \"fpm/package/"
  },
  {
    "path": "notify-failure.sh",
    "chars": 190,
    "preview": "#!/bin/sh\n\n\"$@\"\nstatus=$?\n\nif [ ! -z \"$TMUX\" ] ; then\n  if [ \"$status\" -ne 0 ] ; then\n    tmux display-message \"Tests Fa"
  },
  {
    "path": "requirements.txt",
    "chars": 57,
    "preview": "# Listing of fpm's Python package dependencies\npackaging\n"
  },
  {
    "path": "singularity.def",
    "chars": 431,
    "preview": "# Build command:\n#\n#   singularity build fpm.simg singularity.def\n#\n# Execute instructions:\n#\n#   singularity exec fpm.s"
  },
  {
    "path": "spec/acceptance/puppet/manifests/install.pp",
    "chars": 852,
    "preview": "node default {\n  $package_provider = \"$operatingsystem-$operatingsystemrelease\" ? {\n    /^(Fedora|RedHat|CentOS|OpenSuSE"
  },
  {
    "path": "spec/acceptance/puppet/manifests/remove.pp",
    "chars": 620,
    "preview": "node default {\n  $package_provider = \"$operatingsystem-$operatingsystemrelease\" ? {\n    /^(Fedora|RedHat|CentOS)/ => \"rp"
  },
  {
    "path": "spec/conversion/gem_to_deb.rb",
    "chars": 1024,
    "preview": "require \"spec_setup\"\nrequire \"fpm/command\" # local\nrequire \"fpm/package/deb\" # local\nrequire \"fpm/package/gem\" # local\nr"
  },
  {
    "path": "spec/fixtures/deb/meta_test",
    "chars": 5,
    "preview": "asdf\n"
  },
  {
    "path": "spec/fixtures/deb/staging/etc/init.d/test",
    "chars": 457,
    "preview": "#! /bin/sh\n# Start/stop the test daemon.\n#\n### BEGIN INIT INFO\n# Provides:          test\n# Required-Start:    $syslog\n# "
  },
  {
    "path": "spec/fixtures/deb/triggers",
    "chars": 24,
    "preview": "interest from-meta-file\n"
  },
  {
    "path": "spec/fixtures/gem/example/bin/example",
    "chars": 20,
    "preview": "#!/usr/bin/env ruby\n"
  },
  {
    "path": "spec/fixtures/gem/example/example.gemspec",
    "chars": 510,
    "preview": "Gem::Specification.new do |spec|\n  spec.name = \"example\"\n  spec.version = \"1.0\"\n  spec.summary = \"sample summary\"\n  spec"
  },
  {
    "path": "spec/fixtures/mockpackage.rb",
    "chars": 140,
    "preview": "require \"fpm/namespace\"\nrequire \"fpm/package\"\n\nclass FPM::Package::Mock < FPM::Package\n  def input(*args); end\n  def out"
  },
  {
    "path": "spec/fixtures/python/METADATA",
    "chars": 4126,
    "preview": "Metadata-Version: 2.4\nName: Django\nVersion: 5.2.6\nSummary: A high-level Python web framework that encourages rapid devel"
  },
  {
    "path": "spec/fixtures/python/easy_install_default.py",
    "chars": 859,
    "preview": "# The following python code helps predicting easy_install's default behavior.\n# See: http://stackoverflow.com/a/9155056\n"
  },
  {
    "path": "spec/fixtures/python/requirements.txt",
    "chars": 102,
    "preview": "rtxt-dep1 > 0.1\nrtxt-dep2 == 0.1\nrtxt-dep3; python_version == \"2.0\"\nrtxt-dep4; python_version > \"2.0\"\n"
  },
  {
    "path": "spec/fixtures/python/setup.py",
    "chars": 428,
    "preview": "from setuptools import setup\n\nsetup(name=\"Example\",\n      version=\"1.0\",\n      description=\"sample description\",\n      a"
  },
  {
    "path": "spec/fixtures/python-pyproject.toml/pyproject.toml",
    "chars": 113,
    "preview": "[project]\nname = \"example\"\nversion = \"1.2.3\"\nauthors = [ { name = \"Captain Fancy\", email = \"foo@example.com\" } ]\n"
  },
  {
    "path": "spec/fixtures/virtualenv/requirements.txt",
    "chars": 11,
    "preview": "pip==8.1.2\n"
  },
  {
    "path": "spec/fpm/command_spec.rb",
    "chars": 7415,
    "preview": "require \"spec_setup\"\nrequire \"stud/temporary\"\nrequire \"fpm\" # local\nrequire \"fpm/command\" # local\nrequire \"fixtures/mock"
  },
  {
    "path": "spec/fpm/package/cpan_spec.rb",
    "chars": 5859,
    "preview": "require \"spec_setup\"\nrequire \"tmpdir\" # for Dir.mktmpdir\nrequire \"fpm\" # local\nrequire \"fpm/package/cpan\" # local\n\nhave_"
  },
  {
    "path": "spec/fpm/package/deb_spec.rb",
    "chars": 19428,
    "preview": "require \"spec_setup\"\nrequire 'fileutils'\nrequire \"fpm\" # local\nrequire \"fpm/package/deb\" # local\nrequire \"fpm/package/di"
  },
  {
    "path": "spec/fpm/package/dir_spec.rb",
    "chars": 7571,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/dir\" # local\nrequire \"stud/temporary\"\nrequire \"insist/as"
  },
  {
    "path": "spec/fpm/package/empty_spec.rb",
    "chars": 880,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\n\ndescribe FPM::Package::Empty do\n  describe \"#to_s\" do\n    before do\n      su"
  },
  {
    "path": "spec/fpm/package/freebsd_spec.rb",
    "chars": 1895,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/freebsd\" # local\nrequire \"stud/temporary\"\n\ndescribe FPM:"
  },
  {
    "path": "spec/fpm/package/gem_spec.rb",
    "chars": 4512,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/gem\" # local\n\nhave_gem = program_exists?(\"gem\")\nif !have"
  },
  {
    "path": "spec/fpm/package/npm_spec.rb",
    "chars": 588,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/npm\" # local\n\nhave_npm = program_exists?(\"npm\")\nif !have"
  },
  {
    "path": "spec/fpm/package/osxpkg_spec.rb",
    "chars": 2355,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/osxpkg\" # local\n\nplatform_is_darwin = (%x{uname -s}.chom"
  },
  {
    "path": "spec/fpm/package/pacman_spec.rb",
    "chars": 9492,
    "preview": "require \"spec_setup\"\nrequire 'fileutils'\nrequire \"fpm\" # local\nrequire \"fpm/package/pacman\" # local\nrequire \"stud/tempor"
  },
  {
    "path": "spec/fpm/package/python_spec.rb",
    "chars": 10739,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/python\" # local\nrequire \"find\" # stdlib\n\ndef find_python"
  },
  {
    "path": "spec/fpm/package/rpm_spec.rb",
    "chars": 29970,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/rpm\" # local\nrequire \"fpm/package/dir\" # local\nrequire \""
  },
  {
    "path": "spec/fpm/package/sh_spec.rb",
    "chars": 2369,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/sh\" # local\nrequire \"tmpdir\"\n\nshell_is_bash = (%r{/bash}"
  },
  {
    "path": "spec/fpm/package/snap_spec.rb",
    "chars": 6711,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"English\" # for $CHILD_STATUS\n\nIS_OLD_RUBY = (RUBY_VERSION =~ /^((1\\."
  },
  {
    "path": "spec/fpm/package/tar_spec.rb",
    "chars": 1005,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"English\" # for $CHILD_STATUS\n\ndescribe FPM::Package::Tar do\n  before"
  },
  {
    "path": "spec/fpm/package/virtualenv_spec.rb",
    "chars": 4808,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/package/virtualenv\" # local\nrequire \"find\" # stdlib\n\ndef virtual"
  },
  {
    "path": "spec/fpm/package_convert_spec.rb",
    "chars": 909,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\n\ndescribe \"FPM::Package#convert\" do\n\n  let(:gem_package_name_prefix) { 'rubyg"
  },
  {
    "path": "spec/fpm/package_spec.rb",
    "chars": 6931,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\n\ndescribe FPM::Package do\n  after do\n    subject.cleanup\n  end # after\n\n  sha"
  },
  {
    "path": "spec/fpm/rake_task_spec.rb",
    "chars": 2066,
    "preview": "require \"rspec\" # Avoid setup_spec due to overrides\nrequire \"fpm/command\"\nrequire \"fpm/rake_task\"\nrequire \"tmpdir\"\n\ndesc"
  },
  {
    "path": "spec/fpm/util_spec.rb",
    "chars": 5014,
    "preview": "require \"spec_setup\"\nrequire \"fpm\" # local\nrequire \"fpm/util\" # local\nrequire \"stud/temporary\"\nrequire \"timeout\"\n\n\ndescr"
  },
  {
    "path": "spec/requirements.txt",
    "chars": 69,
    "preview": "# Listing of fpm test-suite's Python package dependencies\nsetuptools\n"
  },
  {
    "path": "spec/spec_setup.rb",
    "chars": 1302,
    "preview": "require \"rubygems\" # for ruby 1.8\nrequire \"insist\" # gem \"insist\"\nrequire \"cabin\" # gem \"cabin\"\nrequire \"tmpdir\" # stdli"
  },
  {
    "path": "templates/deb/changelog.erb",
    "chars": 336,
    "preview": "<%= name %> (<%= \"#{epoch}:\" if epoch %><%= version %><%= \"-\" + iteration.to_s if iteration %>) <%= distribution %>; urg"
  },
  {
    "path": "templates/deb/deb.changes.erb",
    "chars": 1234,
    "preview": "Format: 1.8\nDate: <%= (if attributes[:source_date_epoch].nil? then Time.now() else Time.at(attributes[:source_date_epoch"
  },
  {
    "path": "templates/deb/ldconfig.sh.erb",
    "chars": 381,
    "preview": "#!/bin/sh\n# This script is automatically added by fpm when you specify\n# conditions that usually require running ldconfi"
  },
  {
    "path": "templates/deb/postinst_upgrade.sh.erb",
    "chars": 2895,
    "preview": "#!/bin/sh\n\n<% if attributes[:deb_maintainerscripts_force_errorchecks?] -%>\nset -e\n<% end -%>\n\nafter_upgrade() {\n<%# Maki"
  },
  {
    "path": "templates/deb/postrm_upgrade.sh.erb",
    "chars": 1824,
    "preview": "#!/bin/sh\n\n<% if attributes[:deb_maintainerscripts_force_errorchecks?] -%>\nset -e\n<% end -%>\n\nafter_remove() {\n<%# Makin"
  },
  {
    "path": "templates/deb/preinst_upgrade.sh.erb",
    "chars": 1383,
    "preview": "#!/bin/sh\n\n<% if attributes[:deb_maintainerscripts_force_errorchecks?] -%>\nset -e\n<% end -%>\n\nbefore_upgrade() {\n<%# Mak"
  },
  {
    "path": "templates/deb/prerm_upgrade.sh.erb",
    "chars": 1384,
    "preview": "#!/bin/sh\n\n<% if attributes[:deb_maintainerscripts_force_errorchecks?] -%>\nset -e\n<% end -%>\n\nbefore_remove() {\n<%# Maki"
  },
  {
    "path": "templates/deb.erb",
    "chars": 2396,
    "preview": "Package: <%= name %>\nVersion: <%= \"#{epoch}:\" if epoch %><%= version %><%= \"-\" + iteration.to_s if iteration %>\nLicense:"
  },
  {
    "path": "templates/osxpkg.erb",
    "chars": 376,
    "preview": "<pkg-info \n<% if !attributes[:osxpkg_postinstall_action].nil? -%>postinstall-action=\"<%= attributes[:osxpkg_postinstall_"
  },
  {
    "path": "templates/p5p_metadata.erb",
    "chars": 626,
    "preview": "set name=pkg.fmri value=\"<%=@name%>@<%=@version%>\"\nset name=pkg.summary value=\"<%=@description%>\"\nset name=pkg.human-ver"
  },
  {
    "path": "templates/pacman/INSTALL.erb",
    "chars": 900,
    "preview": "<%# In each function, a `:` is the first command. -%>\n<%# This makes sure that at least one command is in the function -"
  },
  {
    "path": "templates/pacman.erb",
    "chars": 1343,
    "preview": "# Generated by fpm\n# Hello packaging friend!\n#\n# If you find yourself using this 'fpm --edit' feature frequently, it is\n"
  },
  {
    "path": "templates/pleaserun/generate-cleanup.sh",
    "chars": 261,
    "preview": "#!/bin/sh\n\nshow_cleanup_step() {\n  d=\"${1##.}\"\n  if [ ! -z \"$d\" ] ; then \n    if [ -d \"$1\" -a ! -d \"$d\" ] ; then \n      "
  },
  {
    "path": "templates/pleaserun/install-path.sh",
    "chars": 241,
    "preview": "#!/bin/sh\n\ninstall_path() {\n  d=\"${1##.}\"\n  if [ ! -z \"$d\" ] ; then \n    if [ -d \"$1\" -a ! -d \"$d\" ] ; then \n      mkdir"
  },
  {
    "path": "templates/pleaserun/install.sh",
    "chars": 2928,
    "preview": "#!/bin/sh\n\nsource=\"<%= attributes[:prefix] %>\"\n\ncleanup_script=\"$source/cleanup.sh\"\n\nsilent() {\n  \"$@\" > /dev/null 2>&1\n"
  },
  {
    "path": "templates/pleaserun/scripts/after-install.sh",
    "chars": 76,
    "preview": "#!/bin/sh\n\nsource=\"<%= attributes[:prefix] %>\"\nexec sh \"$source/install.sh\"\n"
  },
  {
    "path": "templates/pleaserun/scripts/before-remove.sh",
    "chars": 303,
    "preview": "#!/bin/sh\n\nsource=\"<%= attributes[:prefix] %>\"\n\nif [ -f \"$source/cleanup.sh\" ] ; then\n  echo \"Running cleanup to remove "
  },
  {
    "path": "templates/puppet/package/remove.pp.erb",
    "chars": 277,
    "preview": "class <%= name %>::package::remove {\n  $version = \"<%= version %>\"\n  $iteration = \"<%= iteration %>\"\n\n  fail(\"DO NOT USE"
  },
  {
    "path": "templates/puppet/package.pp.erb",
    "chars": 925,
    "preview": "# TODO(sissel): implement 'anti' class for this package.\nclass <%= name %>::package {\n  $version = \"<%= version %>\"\n  $i"
  },
  {
    "path": "templates/rpm/filesystem_list",
    "chars": 357783,
    "preview": "# List of directories from filesystem package\n# $ rpm -ql filesystem-2.4.30-3.el6.x86_64\n/\n/bin\n/boot\n/dev\n/etc\n/etc/opt"
  },
  {
    "path": "templates/rpm.erb",
    "chars": 8369,
    "preview": "# Hello packaging friend!\n#\n# If you find yourself using this 'fpm --edit' feature frequently, it is\n# a sign that fpm i"
  },
  {
    "path": "templates/sh.erb",
    "chars": 12684,
    "preview": "#!/bin/bash\n\n# bail out if any part of this fails\nset -e\n\n# This is the self-extracting installer script for an FPM shel"
  },
  {
    "path": "templates/solaris.erb",
    "chars": 511,
    "preview": "CLASSES=none\nTZ=PST\nPATH=/sbin:/usr/sbin:/usr/bin:/usr/sadm/install/bin\nBASEDIR=/\nPKG=<%= name %>\nNAME=<%= name %>\nARCH="
  },
  {
    "path": "test/vagrant.pp",
    "chars": 654,
    "preview": "case $operatingsystem {\n  centos, redhat, fedora: {\n    $pkgupdate = \"yum clean all\"\n    $devsuffix = \"-devel\"\n  }\n  deb"
  }
]

About this extraction

This page contains the full source code of the jordansissel/fpm GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 175 files (1023.3 KB), approximately 312.4k tokens, and a symbol index with 324 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!