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 `` 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/ 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 (`#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 <=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 < $@ # 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 ' where 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. # " v 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 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 .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 " \ 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 ``---.``, 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 "`` - 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 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 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 " 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. ` ================================================ 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 `_ 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! `_ 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 `_ 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.10_amd64.deb ... % dpkg -l terraform Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-========================-=================-=================-===================================================== ii terraform 1.0.10 amd64 no description given % terraform -version Terraform v1.0.10 on linux_amd64 You may remove the package at any time:: % sudo apt remove terraform ... Removing terraform (1.0.10) ... Fun Examples ------------ Hi! The fpm project would love to have any fun examples you have for using this package type. Please consider contributing your ideas by submitting them on the fpm issue tracker: https://github.com/jordansissel/fpm/issues/new Changing an existing deb ~~~~~~~~~~~~~~~~~~~~~~~~ fpm supports deb as both an input and output type (``-s`` and ``-t`` flags), so you can use this to modify an existing deb. For example, let's create an deb to use for our example:: % fpm -s empty -t deb -n example Created package {:path=>"example_1.0_amd64.deb"} Lets say we made a mistake and want to rename the package:: % fpm -s deb -t deb -n newname example_1.0_amd64.deb Created package {:path=>"newname_1.0_amd64.deb"} And maybe the architecture is wrong. fpm defaulted to amd64 (what fpm calls "native"), and we really want what Debian calls "all":: % fpm -s deb -t deb -a all newname_1.0_amd64.deb Created package {:path=>"newname_1.0_all.deb"} Deb-specific command line flags ------------------------------- .. include:: cli/deb.rst ================================================ FILE: docs/packages/dir.rst ================================================ dir - Local Files ================= Supported Uses in FPM --------------------- fpm supports using ``dir`` as an input type and output type. This means you can use ``dir`` to put files into other package types (like Debian or Red Hat packages). You can also use this as an output type to extract files from packages. Arguments when used as input type --------------------------------- Any number of arguments are supported and behave as follows: 1) A path to a local file or directory will be put into the output package as-is with the same path, contents, and metadata (file owner, modification date, etc) 2) A syntax of "localpath=destinationpath" to copy local paths into the output package with the destination path. The local file paths are modified by the ``--chdir`` flag. The destination file paths are modified by the ``--prefix`` flag. Sample Usage ------------ For this example, let's look at packaging the Kubernetes tool, ``kubectl``. The installation for ``kubectl`` recommends downloading a pre-compiled binary. Let's do this and then package it into a Debian package. First, we download the ``kubectl`` binary, according to the kubernetes documentation for kubectl installation on Linux:: # Query the latest version of kubectl and store the value in the 'version' variable % version="$(curl -L -s https://dl.k8s.io/release/stable.txt)" # Download the Linux amd64 binary % curl -LO "https://dl.k8s.io/release/${version}/bin/linux/amd64/kubectl" # Make it executable % chmod 755 kubectl The above shell will find the latest version of ``kubectl`` and download it. We'll use the file and the version number next to make our package:: # Create the package that installs kubectl as /usr/bin/kubectl % fpm -s dir -t deb -n kubectl -a amd64 -v ${version#v*} kubectl=/usr/bin/kubectl Created package {:path=>"kubectl_v1.22.3_amd64.deb"} .. note:: We use ``${version#v*}`` in our shell to set the package version. This is because Kuberenetes versions have a text that starts with "v" and this is not valid in Debian packages. This will turn "v1.2.3" into "1.2.3" for our package. Now we can check our package to make sure it looks the way we want:: % dpkg --contents kubectl_1.22.3_amd64.deb [ ... output abbreviated for easier reading ... ] -rw-r--r-- 0/0 46907392 2021-11-05 20:09 ./usr/bin/kubectl % dpkg --field kubectl_1.22.3_amd64.deb Package Version Architecture Package: kubectl Version: 1.22.3 Architecture: amd64 And install it to test things and make sure it's what we wanted:: % sudo dpkg -i kubectl_1.22.3_amd64.deb Selecting previously unselected package kubectl. (Reading database ... 58110 files and directories currently installed.) Preparing to unpack kubectl_1.22.3_amd64.deb ... Unpacking kubectl (1.22.3) ... Setting up kubectl (1.22.3) ... And try to use it:: % which kubectl /usr/bin/kubectl % kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:41:28Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"} Cool :) Fun Examples ------------ .. note:: Do you have any examples you want to share that use the ``dir`` package type? Share your knowledge here: https://github.com/jordansissel/fpm/issues/new ================================================ FILE: docs/packages/empty.rst ================================================ empty - A package with no files =============================== Supported Uses in FPM --------------------- fpm supports using ``empty`` only as an input type. Arguments when used as input type --------------------------------- Extra arguments are ignored for this type. As an example, where with ``fpm -s dir ...`` the arguments are file paths, ``fpm -s empty`` takes no input arguments because there's no file contents to use. Sample Usage ------------ The ``empty`` package type is great for creating "meta" packages which are used to group dependencies together. For example, if you want to make it easier to install a collection of developer tools, you could create a single package that depends on all of your desired developer tools. Let's create a Debian package named 'devtools' which installs the following: * git * curl * nodejs Here's the fpm command to do this:: % fpm -s empty -t rpm -n devtools -a all -d git -d curl -d nodejs Created package {:path=>"devtools-1.0-1.noarch.rpm"} We can check the dependencies on this package:: % rpm -qp devtools-1.0-1.noarch.rpm --requires curl git nodejs rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 And see that there are no files:: % rpm -ql devtools-1.0-1.noarch.rpm (contains no files) Fun Examples ------------ Hi! The fpm project would love to have any fun examples you have for using this package type. Please consider contributing your ideas by submitting them on the fpm issue tracker: https://github.com/jordansissel/fpm/issues/new ================================================ FILE: docs/packages/freebsd.rst ================================================ freebsd - FreeBSD pkg =============================== Supported Uses in FPM --------------------- fpm supports using ``freebsd`` only as an output type. This means you can create ``freebsd`` packages from input types like ``deb``, ``dir``, or ``npm`` freebsd-specific command line flags ----------------------------------- .. include:: cli/freebsd.rst ================================================ FILE: docs/packages/gem.rst ================================================ gem - Ruby's rubygem packages ============================= Supported Uses in FPM --------------------- fpm supports using ``gem`` only as an input type. This means you can convert ``gem`` input packages to output packages like ``deb``, ``rpm``, and more. gem-specific command line flags ------------------------------- .. include:: cli/gem.rst ================================================ FILE: docs/packages/npm.rst ================================================ npm - Packages for NodeJS =============================== Supported Uses in FPM --------------------- fpm supports using ``npm`` only as an input type. Arguments when used as input type --------------------------------- Any number of arguments are supported and behave as follows: * ``name@version`` -- a specific named package at the given version. * ``name`` -- the name of a node package. In this use, the ``--version`` flag is used to pick the version to download. If no version is given, the latest version of the package is downloaded. Sample Usage ------------ You'll need ``npm`` installed for this example. Let's turn the ``ascii-art`` npm package into a Debian package. For this example, we'll pick a specific version, 2.8.5:: % fpm --debug -s npm -t deb --depends nodejs ascii-art@2.8.5 Created package {:path=>"node-ascii-art_2.8.5_amd64.deb"} Fpm uses ``npm`` to download the correct package. Additionally, the package name is given a ``node-`` prefix because this is common in distribution packages to prefix a library with the platform name, such as ``python-foo`` or ``node-foo``. It also parses the package's ``package.json`` to collect any useful data such as the package name, author, homepage, description, etc:: % dpkg --field node-ascii-art_2.8.5_amd64.deb Package Version Vendor Homepage Description Package: node-ascii-art Version: 2.8.5 Vendor: Abbey Hawk Sparrow <@khrome> Homepage: git://github.com/khrome/ascii-art.git Description: Ansi codes, figlet fonts, and ascii art. 100% JS Let's install the package and try to use it:: % sudo apt-get install ./node-ascii-art_2.8.5_amd64.deb And now we can use this package:: % ascii-art text -F Doom "Hello World" _ _ _ _ _ _ _ _ | | | | | || | | | | | | | | | | |_| | ___ | || | ___ | | | | ___ _ __ | | __| | | _ | / _ \| || | / _ \ | |/\| | / _ \ | '__|| | / _` | | | | || __/| || || (_) | \ /\ /| (_) || | | || (_| | \_| |_/ \___||_||_| \___/ \/ \/ \___/ |_| |_| \__,_| Fpm asked ``npm`` where to install things using ``npm prefix -g``. On my system, this caused the package to install to ``/usr/local/lib/node_modules``. You can change the default prefix with the fpm ``--prefix`` flag or by changing the default global prefix in the ``npm`` tool. Let's try to invoke ``ascii-art`` from node:: % export NODE_PATH=/usr/local/lib/node_modules % node > let art = require("ascii-art") > art.font("Hello", "Doom", (err, rendered) => console.log(rendered)) _ _ _ _ | | | | | || | | |_| | ___ | || | ___ | _ | / _ \| || | / _ \ | | | || __/| || || (_) | \_| |_/ \___||_||_| \___/ Nice :) Fun Examples ------------ .. note:: Do you have any examples you want to share that use the ``npm`` package type? Share your knowledge here: https://github.com/jordansissel/fpm/issues/new npm-specific command line flags ------------------------------- .. include:: cli/npm.rst ================================================ FILE: docs/packages/osxpkg.rst ================================================ osxpkg - Apple macOS and OSX packages ===================================== Supported Uses in FPM --------------------- fpm supports input and output for Apple's package files. These files typically end in ".pkg". This means you can read a ``.pkg`` file and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a ``.pkg`` package file. osxpkg-specific command line flags ---------------------------------- .. include:: cli/osxpkg.rst ================================================ FILE: docs/packages/p5p.rst ================================================ p5p - Oracle Solaris 11 p5p packages ==================================== This package format for the Solaris Image Packaging System (IPS) and should be useful for OpenSolaris, Solaris 11, and Illumos. Supported Uses in FPM --------------------- fpm supports using ``p5p`` only as an output type. This means you can create ``p5p`` packages from input types like ``deb``, ``dir``, or ``npm`` p5p-specific command line flags ------------------------------- .. include:: cli/p5p.rst ================================================ FILE: docs/packages/pacman.rst ================================================ pacman - Arch Linux package format ================================== Supported Uses in FPM --------------------- fpm supports input and output for Arch Linux's package format, pacman. This means you can read a pacman and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a pacman package. pacman-specific command line flags ---------------------------------- .. include:: cli/pacman.rst ================================================ FILE: docs/packages/pear.rst ================================================ pear - PHP PEAR Packages ======================== Supported Uses in FPM --------------------- fpm supports using ``pear`` only as an input type. This means you can convert ``pear`` input packages to output packages like ``deb``, ``rpm``, and more. pear-specific command line flags -------------------------------- .. include:: cli/pear.rst ================================================ FILE: docs/packages/pkgin.rst ================================================ pkgin - NetBSD's pkgsrc binary packages ======================================= Supported Uses in FPM --------------------- fpm supports using ``pkgin`` only as an output type. This means you can create ``pkgin`` packages from input types like ``deb``, ``dir``, or ``npm`` pkgin-specific command line flags --------------------------------- .. include:: cli/pkgin.rst ================================================ FILE: docs/packages/pleaserun.rst ================================================ pleaserun - Pleaserun services ============================== Pleaserun helps generate service definitions for a variety of service manangers such as systemd and sysv. When used as an input, fpm will generate a package that include multiple service definitions, one for each type (systemd, sysv, etc). At package installation, the package will attempt to detect the best service manager used on the system and will install only that definition. You can learn more on the project website: https://github.com/jordansissel/pleaserun#readme Supported Uses in FPM --------------------- fpm supports using ``pleaserun`` only as an input type. This means you can convert ``pleaserun`` input packages to output packages like ``deb``, ``rpm``, and more. pleaserun-specific command line flags ------------------------------------- .. include:: cli/pleaserun.rst ================================================ FILE: docs/packages/puppet.rst ================================================ puppet - Puppet Manifests (deprecated) ====================================== Note: This package type hasn't been maintained since 2012 and generates puppet manifests that target Puppet 2.4 or 3.x. Supported Uses in FPM --------------------- fpm supports using ``puppet`` only as an output type. This means you can create ``puppet`` packages from input types like ``deb``, ``dir``, or ``npm`` puppet-specific command line flags ---------------------------------- .. include:: cli/puppet.rst ================================================ FILE: docs/packages/python.rst ================================================ python - Python packages, PyPI, etc =================================== Supported Uses in FPM --------------------- fpm supports using ``python`` only as an input type. This means you can convert ``python`` input packages to output packages like ``deb``, ``rpm``, and more. python-specific command line flags ---------------------------------- .. include:: cli/python.rst ================================================ FILE: docs/packages/rpm.rst ================================================ rpm - RedHat Package Manager ============================ rpm is the package format used on RedHat Enterprise (RHEL), Fedora, CentOS, and a number of other Linux distributions. You may be familiar with tools such as `dnf` and `yum` for installing packages from repositories. The package files that these tools install are rpms. Supported Uses in FPM --------------------- fpm supports input and output for rpms. This means you can read an rpm and convert it to a different output type (such as a `dir` or `deb`). It also means you can write an rpm. Arguments when used as input type --------------------------------- For the sample command reading an rpm as input and outputting a debian package:: fpm -s rpm -t deb file.rpm The the argument is used as a file and read as an rpm. Sample Usage ------------ Create a package with no files but having dependencies:: % fpm -s empty -t rpm -n example --depends nginx Created package {:path=>"example-1.0-1.x86_64.rpm"} We can now inspect the package with rpm's tools if you wish:: % rpm -qp example-1.0-1.x86_64.rpm -i Name : example Version : 1.0 Release : 1 Architecture: x86_64 Install Date: (not installed) Group : default Size : 0 License : unknown Signature : (none) Source RPM : example-1.0-1.src.rpm Build Date : Wed 20 Oct 2021 09:43:25 PM PDT Build Host : snickerdoodle.localdomain Relocations : / Packager : Vendor : none URL : http://example.com/no-uri-given Summary : no description given Description : no description given Fun Examples ------------ Changing an existing RPM ~~~~~~~~~~~~~~~~~~~~~~~~ fpm supports rpm as both an input and output type (`-s` and `-t` flags), so you can use this to modify an existing rpm. For example, let's create an rpm to use for our example:: % fpm -s empty -t rpm -n example Created package {:path=>"example-1.0-1.x86_64.rpm"} Lets say we made a mistake and want to rename the package:: % fpm -s rpm -t rpm -n newname example-1.0-1.x86_64.rpm Created package {:path=>"newname-1.0-1.x86_64.rpm"} And maybe the architecture is wrong. fpm defaulted to x86_64 (what fpm calls "native"), and we really want what rpm calls "noarch":: % fpm -s rpm -t rpm -a noarch newname-1.0-1.x86_64.rpm Created package {:path=>"newname-1.0-1.noarch.rpm"} RPM-specific command line flags ------------------------------- .. include:: cli/rpm.rst ================================================ FILE: docs/packages/sh.rst ================================================ sh - Self-managing shell archive ================================ The 'sh' output in fpm will generate a shell script that is, itself, an archive. The resulting shell script will install the files you provided. You can run the resulting shell script to see more helpful information. # Create an example.sh package % fpm -s empty -t sh -n example # Get help. % ./example.sh -h Supported Uses in FPM --------------------- fpm supports using ``sh`` only as an output type. This means you can create ``sh`` packages from input types like ``deb``, ``dir``, or ``npm`` sh-specific command line flags ------------------------------- .. include:: cli/sh.rst ================================================ FILE: docs/packages/snap.rst ================================================ snap - Application package files for Linux ========================================== You can learn more about ``snap`` itself by visiting the website: https://snapcraft.io/about Supported Uses in FPM --------------------- fpm supports input and output for snap packages. This means you can read a snap and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a snap package. snap-specific command line flags -------------------------------- .. include:: cli/snap.rst ================================================ FILE: docs/packages/solaris.rst ================================================ solaris - Solaris SRV4 package format ===================================== This package format is typically used in older Solaris versions (Solaris 7, 8, 9, and 10). You may also know them by files with a SUNW prefix and may have file names that end in ".pkg". If you're using Solaris 11, OpenSolaris, or Illumos, you might want to use `the newer package format, p5p`_. .. _the newer package format, p5p: /packages/p5p.html Supported Uses in FPM --------------------- fpm supports using ``solaris`` only as an output type. This means you can create ``solaris`` packages from input types like ``deb``, ``dir``, or ``npm`` solaris-specific command line flags ----------------------------------- .. include:: cli/solaris.rst ================================================ FILE: docs/packages/tar.rst ================================================ tar - Tape archives aka "tar" files =================================== Supported Uses in FPM --------------------- fpm supports input and output for NAME (tar). This means you can read a tar and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a tar package. tar-specific command line flags ------------------------------- .. include:: cli/tar.rst ================================================ FILE: docs/packages/virtualenv.rst ================================================ virtualenv - Python virtualenv ============================== Supported Uses in FPM --------------------- fpm supports using ``virtualenv`` only as an input type. This means you can convert ``virtualenv`` input packages to output packages like ``deb``, ``rpm``, and more. virtualenv-specific command line flags -------------------------------------- .. include:: cli/virtualenv.rst ================================================ FILE: docs/packages/zip.rst ================================================ zip - Zip files =============== Supported Uses in FPM --------------------- fpm supports input and output for zip files. This means you can read a zip and convert it to a different output type (such as a `dir` or `rpm`). It also means you can create a zip package. zip-specific command line flags ------------------------------- .. include:: cli/zip.rst ================================================ FILE: docs/packaging-types.rst ================================================ Packaging Types =============== .. toctree:: :includehidden: :glob: packages/* ================================================ FILE: docs/requirements.txt ================================================ sphinx_rtd_theme ================================================ FILE: fpm.gemspec ================================================ require File.join(File.dirname(__FILE__), "lib/fpm/version") Gem::Specification.new do |spec| files = [] dirs = %w{lib bin templates} dirs.each do |dir| files += Dir["#{dir}/**/*"] end files << "LICENSE" files << "CONTRIBUTORS" files << "CHANGELOG.rst" files = files.reject { |path| path =~ /\.pyc$/ } spec.name = "fpm" spec.version = FPM::VERSION spec.summary = "fpm - package building and mangling" spec.description = "Convert directories, rpms, python eggs, rubygems, and " \ "more to rpms, debs, solaris packages and more. Win at package " \ "management without wasting pointless hours debugging bad rpm specs!" spec.license = "MIT-like" spec.required_ruby_version = '>= 1.9.3' # For logging # https://github.com/jordansissel/ruby-cabin spec.add_dependency("cabin", ">= 0.9.1") # license: Apache 2 # For backports to older rubies # https://github.com/marcandre/backports spec.add_dependency("backports", ">= 2.6.2") # license: MIT # For reading and writing rpms spec.add_dependency("arr-pm", "~> 0.0.11") # license: Apache 2 # For command-line flag support # https://github.com/mdub/clamp/blob/master/README.markdown spec.add_dependency("clamp", ">= 1.0.0") # license: MIT # For sourcing from pleaserun spec.add_dependency("pleaserun", "~> 0.0.29") # license: Apache 2 spec.add_dependency("stud") # In Ruby 3.0, rexml was moved to a bundled gem instead of a default one, # so I think this needs to be added explicitly? spec.add_dependency("rexml") spec.add_development_dependency("rspec", "~> 3.13.0") # license: MIT (according to wikipedia) spec.add_development_dependency("insist", "~> 1.0.0") # license: Apache 2 spec.add_development_dependency("pry") spec.add_development_dependency("rake") # For FPM::RakeTask, #1877, #756 spec.files = files spec.require_paths << "lib" spec.bindir = "bin" spec.executables << "fpm" spec.author = "Jordan Sissel" spec.email = "jls@semicomplete.com" spec.homepage = "https://github.com/jordansissel/fpm" end ================================================ FILE: lib/fpm/command.rb ================================================ require "rubygems" require "fpm/namespace" require "fpm/version" require "fpm/util" require "clamp" require "fpm" require "tmpdir" # for Dir.tmpdir if $DEBUG Cabin::Channel.get(Kernel).subscribe($stdout) Cabin::Channel.get(Kernel).level = :debug end Dir[File.join(File.dirname(__FILE__), "package", "*.rb")].each do |plugin| Cabin::Channel.get(Kernel).info("Loading plugin", :path => plugin) require "fpm/package/#{File.basename(plugin)}" end # The main fpm command entry point. class FPM::Command < Clamp::Command include FPM::Util def help(*args) lines = [ "Intro:", "", " This is fpm version #{FPM::VERSION}", "", " If you think something is wrong, it's probably a bug! :)", " Please file these here: https://github.com/jordansissel/fpm/issues", "", " You can find support on irc (#fpm on freenode irc) or via email with", " fpm-users@googlegroups.com", "", "Loaded package types:", ] FPM::Package.types.each do |name, _| lines.push(" - #{name}") end lines.push("") lines.push(super) return lines.join("\n") end # def help option ["-t", "--output-type"], "OUTPUT_TYPE", "the type of package you want to create (deb, rpm, solaris, etc)", :attribute_name => :output_type option ["-s", "--input-type"], "INPUT_TYPE", "the package type to use as input (gem, rpm, python, etc)", :attribute_name => :input_type option ["-C", "--chdir"], "CHDIR", "Change directory to here before searching for files", :attribute_name => :chdir option "--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." option ["-p", "--package"], "OUTPUT", "The package file path to output." option ["-f", "--force"], :flag, "Force output even if it will overwrite an " \ "existing file", :default => false option ["-n", "--name"], "NAME", "The name to give to the package" loglevels = %w(error warn info debug) option "--log", "LEVEL", "Set the log level. Values: #{loglevels.join(", ")}.", :attribute_name => :log_level do |val| val.downcase.tap do |v| if !loglevels.include?(v) raise FPM::Package::InvalidArgument, "Invalid log level, #{v.inspect}. Must be one of: #{loglevels.join(", ")}" end end end # --log option "--verbose", :flag, "Enable verbose output" option "--debug", :flag, "Enable debug output" option "--debug-workspace", :flag, "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." option ["-v", "--version"], "VERSION", "The version to give to the package", :default => 1.0 option "--iteration", "ITERATION", "The iteration to give to the package. RPM calls this the 'release'. " \ "FreeBSD calls it 'PORTREVISION'. Debian calls this 'debian_revision'" option "--epoch", "EPOCH", "The epoch value for this package. RPM and Debian calls this 'epoch'. " \ "FreeBSD calls this 'PORTEPOCH'" option "--license", "LICENSE", "(optional) license name for this package" option "--vendor", "VENDOR", "(optional) vendor name for this package" option "--category", "CATEGORY", "(optional) category this package belongs to", :default => "none" option ["-d", "--depends"], "DEPENDENCY", "A dependency. This flag can be specified multiple times. Value is " \ "usually in the form of: -d 'name' or -d 'name > version'", :multivalued => true, :attribute_name => :dependencies option "--no-depends", :flag, "Do not list any dependencies in this package", :default => false option "--no-auto-depends", :flag, "Do not list any dependencies in this " \ "package automatically", :default => false option "--provides", "PROVIDES", "What this package provides (usually a name). This flag can be " \ "specified multiple times.", :multivalued => true, :attribute_name => :provides option "--conflicts", "CONFLICTS", "Other packages/versions this package conflicts with. This flag can be " \ "specified multiple times.", :multivalued => true, :attribute_name => :conflicts option "--replaces", "REPLACES", "Other packages/versions this package replaces. Equivalent of rpm's 'Obsoletes'. " \ "This flag can be specified multiple times.", :multivalued => true, :attribute_name => :replaces option "--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.", :multivalued => true, :attribute_name => :config_files option "--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 ", :multivalued => true, :attribute_name => :directories option ["-a", "--architecture"], "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." option ["-m", "--maintainer"], "MAINTAINER", "The maintainer of this package.", :default => "<#{ENV["USER"]}@#{Socket.gethostname}>" option ["-S", "--package-name-suffix"], "PACKAGE_NAME_SUFFIX", "a name suffix to append to package and dependencies." option ["-e", "--edit"], :flag, "Edit the package spec before building.", :default => false excludes = [] option ["-x", "--exclude"], "EXCLUDE_PATTERN", "Exclude paths matching pattern (shell wildcard globs valid here). " \ "If you have multiple file patterns to exclude, specify this flag " \ "multiple times.", :attribute_name => :excludes do |val| excludes << val next excludes end # -x / --exclude option "--exclude-file", "EXCLUDE_PATH", "The path to a file containing a newline-sparated list of "\ "patterns to exclude from input." option "--description", "DESCRIPTION", "Add a description for this package." \ " You can include '\\n' sequences to indicate newline breaks.", :default => "no description" option "--url", "URI", "Add a url for this package.", :default => "http://example.com/no-uri-given" option "--inputs", "INPUTS_PATH", "The path to a file containing a newline-separated list of " \ "files and dirs to use as input." option "--post-install", "FILE", "(DEPRECATED, use --after-install) A script to be run after " \ "package installation" do |val| @after_install = File.expand_path(val) # Get the full path to the script end # --post-install (DEPRECATED) option "--pre-install", "FILE", "(DEPRECATED, use --before-install) A script to be run before " \ "package installation" do |val| @before_install = File.expand_path(val) # Get the full path to the script end # --pre-install (DEPRECATED) option "--post-uninstall", "FILE", "(DEPRECATED, use --after-remove) A script to be run after " \ "package removal" do |val| @after_remove = File.expand_path(val) # Get the full path to the script end # --post-uninstall (DEPRECATED) option "--pre-uninstall", "FILE", "(DEPRECATED, use --before-remove) A script to be run before " \ "package removal" do |val| @before_remove = File.expand_path(val) # Get the full path to the script end # --pre-uninstall (DEPRECATED) option "--after-install", "FILE", "A script to be run after package installation" do |val| File.expand_path(val) # Get the full path to the script end # --after-install option "--before-install", "FILE", "A script to be run before package installation" do |val| File.expand_path(val) # Get the full path to the script end # --before-install option "--after-remove", "FILE", "A script to be run after package removal" do |val| File.expand_path(val) # Get the full path to the script end # --after-remove option "--before-remove", "FILE", "A script to be run before package removal" do |val| File.expand_path(val) # Get the full path to the script end # --before-remove option "--after-upgrade", "FILE", "A script to be run after package upgrade. If not specified,\n" \ "--before-install, --after-install, --before-remove, and \n" \ "--after-remove will behave in a backwards-compatible manner\n" \ "(they will not be upgrade-case aware).\n" \ "Currently only supports deb, rpm and pacman packages." do |val| File.expand_path(val) # Get the full path to the script end # --after-upgrade option "--before-upgrade", "FILE", "A script to be run before package upgrade. If not specified,\n" \ "--before-install, --after-install, --before-remove, and \n" \ "--after-remove will behave in a backwards-compatible manner\n" \ "(they will not be upgrade-case aware).\n" \ "Currently only supports deb, rpm and pacman packages." do |val| File.expand_path(val) # Get the full path to the script end # --before-upgrade option "--template-scripts", :flag, "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" option "--template-value", "KEY=VALUE", "Make 'key' available in script templates, so <%= key %> given will be " \ "the provided value. Implies --template-scripts", :multivalued => true do |kv| @template_scripts = true next kv.split("=", 2) end option "--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.", :default => Dir.tmpdir option "--source-date-epoch-from-changelog", :flag, "Use release date from changelog as timestamp on generated files to reduce nondeterminism. " \ "Experimental; only implemented for gem so far. ", :default => false option "--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 ", :environment_variable => "SOURCE_DATE_EPOCH" option "--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.." do |path| load_options(path) end parameter "[ARGS] ...", "Inputs to the source package type. For the 'dir' type, this is the files" \ " and directories you want to include in the package. For others, like " \ "'gem', it specifies the packages to download and use as the gem input", :attribute_name => :args # Keep a copy of the original flags (ones declared above, not by package types) # This helps when generating the documentation GENERAL_OPTIONS = @declared_options.clone FPM::Package.types.each do |name, klass| # This adds each package's flags to the main command klass.apply_options(self) end # A new FPM::Command def initialize(*args) super(*args) @conflicts = [] @replaces = [] @provides = [] @dependencies = [] @config_files = [] @directories = [] end # def initialize # Execute this command. See Clamp::Command#execute and Clamp's documentation def execute logger.level = :warn logger.level = :info if verbose? # --verbose logger.level = :debug if debug? # --debug if log_level logger.level = log_level.to_sym end if (stray_flags = args.grep(/^-/); stray_flags.any?) logger.warn("All flags should be before the first argument " \ "(stray flags found: #{stray_flags}") end # Some older behavior, if you specify: # 'fpm -s dir -t ... -C somepath' # fpm would assume you meant to add '.' to the end of the commandline. # Let's hack that. https://github.com/jordansissel/fpm/issues/187 if input_type == "dir" and args.empty? and !chdir.nil? logger.info("No args, but -s dir and -C are given, assuming '.' as input") args << "." end if !File.exist?(workdir) logger.fatal("Given --workdir=#{workdir} is not a path that exists.") raise FPM::Package::InvalidArgument, "The given workdir '#{workdir}' does not exist." end if !File.directory?(workdir) logger.fatal("Given --workdir=#{workdir} must be a directory") raise FPM::Package::InvalidArgument, "The given workdir '#{workdir}' must be a directory." end logger.info("Setting workdir", :workdir => workdir) ENV["TMP"] = workdir validator = Validator.new(self) if !validator.ok? validator.messages.each do |message| logger.warn(message) end logger.fatal("Fix the above problems, and you'll be rolling packages in no time!") return 1 end input_class = FPM::Package.types[input_type] output_class = FPM::Package.types[output_type] input = input_class.new # Merge in package settings. # The 'settings' stuff comes in from #apply_options, which goes through # all the options defined in known packages and puts them into our command. # Flags in packages defined as "--foo-bar" become named "---foo-bar" # They are stored in 'settings' as :gem_foo_bar. input.attributes ||= {} # Iterate over all the options and set their values in the package's # attribute hash. # # Things like '--foo-bar' will be available as pkg.attributes[:foo_bar] self.class.declared_options.each do |option| option.attribute_name.tap do |attr| next if attr == "help" # clamp makes option attributes available as accessor methods # --foo-bar is available as 'foo_bar'. Put these in the package # attributes hash. (See FPM::Package#attributes) # # In the case of 'flag' options, the accessor is actually 'foo_bar?' # instead of just 'foo_bar' # If the instance variable @{attr} is defined, then # it means the flag was given on the command line. flag_given = instance_variable_defined?("@#{attr}") input.attributes["#{attr}_given?".to_sym] = flag_given attr = "#{attr}?" if !respond_to?(attr) # handle boolean :flag cases input.attributes[attr.to_sym] = send(attr) if respond_to?(attr) logger.debug("Setting attribute", attr.to_sym => send(attr)) end end if input_type == "pleaserun" # Special case for pleaserun that all parameters are considered the 'command' # to run through pleaserun. input.input(args) else # Each remaining command line parameter is used as an 'input' argument. # For directories, this means paths. For things like gem and python, this # means package name or paths to the packages (rails, foo-1.0.gem, django, # bar/setup.py, etc) args.each do |arg| input.input(arg) end end # If --inputs was specified, read it as a file. if !inputs.nil? if !File.exist?(inputs) logger.fatal("File given for --inputs does not exist (#{inputs})") return 1 end # Read each line as a path File.new(inputs, "r").each_line do |line| # Handle each line as if it were an argument input.input(line.strip) end end # If --exclude-file was specified, read it as a file and append to # the exclude pattern list. if !exclude_file.nil? if !File.exist?(exclude_file) logger.fatal("File given for --exclude-file does not exist (#{exclude_file})") return 1 end # Ensure hash is initialized input.attributes[:excludes] ||= [] # Read each line as a path File.new(exclude_file, "r").each_line do |line| # Handle each line as if it were an argument input.attributes[:excludes] << line.strip end end # Override package settings if they are not the default flag values # the below proc essentially does: # # if someflag != default_someflag # input.someflag = someflag # end set = proc do |object, attribute| # if the package's attribute is currently nil *or* the flag setting for this # attribute is non-default, use the value. # Not all options have a default value, so we assume `nil` if there's no default. (#1543) # In clamp >= 1.3.0, options without `:default => ..` will not have any # `default_xyz` # methods generated, so we need to check for the presence of this method first. default = respond_to?("default_#{attribute}") ? send("default_#{attribute}") : nil if object.send(attribute).nil? || send(attribute) != default logger.info("Setting from flags: #{attribute}=#{send(attribute)}") object.send("#{attribute}=", send(attribute)) end end set.call(input, :architecture) set.call(input, :category) set.call(input, :description) set.call(input, :epoch) set.call(input, :iteration) set.call(input, :license) set.call(input, :maintainer) set.call(input, :name) set.call(input, :url) set.call(input, :vendor) set.call(input, :version) input.conflicts += conflicts input.dependencies += dependencies input.provides += provides input.replaces += replaces input.config_files += config_files input.directories += directories h = {} attrs.each do | e | s = e.split(':', 2) h[s.last] = s.first end input.attrs = h script_errors = [] setscript = proc do |scriptname| # 'self.send(scriptname) == self.before_install == --before-install # Gets the path to the script path = self.send(scriptname) # Skip scripts not set next if path.nil? if !File.exist?(path) logger.error("No such file (for #{scriptname.to_s}): #{path.inspect}") script_errors << path end # Load the script into memory. input.scripts[scriptname] = File.read(path) end setscript.call(:before_install) setscript.call(:after_install) setscript.call(:before_remove) setscript.call(:after_remove) setscript.call(:before_upgrade) setscript.call(:after_upgrade) # Bail if any setscript calls had errors. We don't need to log # anything because we've already logged the error(s) above. return 1 if script_errors.any? # Validate the package if input.name.nil? or input.name.empty? logger.fatal("No name given for this package (set name with '-n', " \ "for example, '-n packagename')") return 1 end # Convert to the output type output = input.convert(output_class) # Provide any template values as methods on the package. if template_scripts? template_value_list.each do |key, value| (class << output; self; end).send(:define_method, key) { value } end end # Write the output somewhere, package can be nil if no --package is specified, # and that's OK. # If the package output (-p flag) is a directory, write to the default file name # but inside that directory. if ! package.nil? && File.directory?(package) package_file = File.join(package, output.to_s) else package_file = output.to_s(package) end begin output.output(package_file) rescue FPM::Package::FileAlreadyExists => e logger.fatal(e.message) return 1 rescue FPM::Package::ParentDirectoryMissing => e logger.fatal(e.message) return 1 end logger.log("Created package", :path => package_file) return 0 rescue FPM::Util::ExecutableNotFound => e logger.error("Need executable '#{e}' to convert #{input_type} to #{output_type}") return 1 rescue FPM::InvalidPackageConfiguration => e logger.error("Invalid package configuration: #{e}") return 1 rescue FPM::Util::ProcessFailed => e logger.error("Process failed: #{e}") return 1 ensure if debug_workspace? # only emit them if they have files [input, output].each do |plugin| next if plugin.nil? [:staging_path, :build_path].each do |pathtype| path = plugin.send(pathtype) next unless Dir.open(path).to_a.size > 2 logger.log("plugin directory", :plugin => plugin.type, :pathtype => pathtype, :path => path) end end else input.cleanup unless input.nil? output.cleanup unless output.nil? end end # def execute def run(run_args) logger.subscribe(STDOUT) # Short circuit for a `fpm --version` or `fpm -v` short invocation that # is the user asking us for the version of fpm. if run_args == [ "-v" ] || run_args == [ "--version" ] puts FPM::VERSION return 0 end # fpm initialization files, note the order of the following array is # important, try .fpm in users home directory first and then the current # directory rc_files = [ ".fpm" ] rc_files << File.join(ENV["HOME"], ".fpm") if ENV["HOME"] rc_args = [] if ENV["FPMOPTS"] logger.warn("Loading flags from FPMOPTS environment variable") rc_args.push(*Shellwords.shellsplit(ENV["FPMOPTS"])) end rc_files.each do |rc_file| if File.readable? rc_file logger.warn("Loading flags from rc file #{rc_file}") rc_args.push(*Shellwords.shellsplit(File.read(rc_file))) end end flags = [] args = [] while rc_args.size > 0 do arg = rc_args.shift opt = self.class.find_option(arg) if opt and not opt.flag? flags.push(arg) flags.push(rc_args.shift) elsif opt or arg[0] == "-" flags.push(arg) else args.push(arg) end end logger.warn("Additional options: #{flags.join " "}") if flags.size > 0 logger.warn("Additional arguments: #{args.join " "}") if args.size > 0 ARGV.unshift(*flags) ARGV.push(*args) super(run_args) rescue FPM::Package::InvalidArgument => e logger.error("Invalid package argument: #{e}") return 1 end # def run def load_options(path) @loaded_files ||= [] if @loaded_files.include?(path) #logger.error("Options file was already loaded once. Refusing to load a second time.", :path => path) raise FPM::Package::InvalidArgument, "Options file already loaded once. Refusing to load a second time. Maybe a file tries to load itself? Path: #{path}" end if !File.exist?(path) logger.fatal("Cannot load options from file because the file doesn't exist.", :path => path) end if !File.readable?(path) logger.fatal("Cannot load options from file because the file isn't readable.", :path => path) end @loaded_files << path logger.info("Loading flags from file", :path => path) # Safety check, abort if the file is huge. Arbitrarily chosen limit is 100kb stat = File.stat(path) max = 100 * 1024 if stat.size > max logger.fatal("Refusing to load options from file because the file seems pretty large.", :path => path, :size => stat.size) raise FPM::Package::InvalidArgument, "Options file given to --fpm-options-file is seems too large. For safety, fpm is refusing to load this. Path: #{path} - Size: #{stat.size}, maximum allowed size #{max}." end File.read(path).split($/).each do |line| logger.info("Processing flags from file", :path => path, :line => line) # With apologies for this hack to mdub (Mike Williams, author of Clamp)... # The following code will read a file and parse the file # as flags as if they were in same argument position as the given --fpm-options-file option. args = Shellwords.split(line) while args.any? arg = args.shift # Lookup the Clamp option by its --flag-name or short name like -f if arg =~ /^-/ # Single-letter options like -a or -z if single_letter = arg.match(/^(-[A-Za-z0-9])(.*)$/) option = self.class.find_option(single_letter.match(1)) arg, remainder = single_letter.match(1), single_letter.match(2) if option.flag? # Flags aka switches take no arguments, so we push the rest of the 'arg' entry back onto the args list # For combined letter flags, like `-abc`, we want to consume the # `-a` and then push `-bc` back to be processed. # Only do this if there's more flags, like, not for `-a` but yes for `-abc` args.unshift("-" + remainder) unless remainder.empty? else # Single letter options that take arguments, like `-ohello` same as `-o hello` # For single letter flags with values, like `-ofilename` aka `-o filename`, push the remainder ("filename") # back onto the args list so that it is consumed when we extract the flag value. args.unshift(remainder) unless remainder.empty? end elsif arg.match(/^--/) # Lookup the flag by its long --flag-name option = self.class.find_option(arg) end end # Extract the flag value, if any, from the remaining args list. value = option.extract_value(arg, args) # Process the flag into `self` option.of(self).take(value) end end end # def load_options # A simple flag validator # # The goal of this class is to ensure the flags and arguments given # are a valid configuration. class Validator include FPM::Util private def initialize(command) @command = command @valid = true @messages = [] validate end # def initialize def ok? return @valid end # def ok? def validate # Make sure the user has passed '-s' and '-t' flags mandatory(@command.input_type, "Missing required -s flag. What package source did you want?") mandatory(@command.output_type, "Missing required -t flag. What package output did you want?") # Verify the types requested are valid types = FPM::Package.types.keys.sort @command.input_type.tap do |val| next if val.nil? mandatory(FPM::Package.types.include?(val), "Invalid input package -s flag) type #{val.inspect}. " \ "Expected one of: #{types.join(", ")}") end @command.output_type.tap do |val| next if val.nil? mandatory(FPM::Package.types.include?(val), "Invalid output package (-t flag) type #{val.inspect}. " \ "Expected one of: #{types.join(", ")}") end @command.dependencies.tap do |dependencies| # Verify dependencies don't include commas (#257) dependencies.each do |dep| next unless dep.include?(",") splitdeps = dep.split(/\s*,\s*/) @messages << "Dependencies should not " \ "include commas. If you want to specify multiple dependencies, use " \ "the '-d' flag multiple times. Example: " + \ splitdeps.map { |d| "-d '#{d}'" }.join(" ") end end if @command.inputs mandatory(@command.input_type == "dir", "--inputs is only valid with -s dir") end mandatory(@command.args.any? || @command.inputs || @command.input_type == 'empty', "No parameters given. You need to pass additional command " \ "arguments so that I know what you want to build packages " \ "from. For example, for '-s dir' you would pass a list of " \ "files and directories. For '-s gem' you would pass a one" \ " or more gems to package from. As a full example, this " \ "will make an rpm of the 'json' rubygem: " \ "`fpm -s gem -t rpm json`") end # def validate def mandatory(value, message) if value.nil? or !value @messages << message @valid = false end end # def mandatory def messages return @messages end # def messages public(:initialize, :ok?, :messages) end # class Validator end # class FPM::Command ================================================ FILE: lib/fpm/errors.rb ================================================ require "fpm/namespace" # Raised if a package is configured in an unsupported way class FPM::InvalidPackageConfiguration < StandardError; end ================================================ FILE: lib/fpm/namespace.rb ================================================ # The FPM namespace module FPM class Package; end end ================================================ FILE: lib/fpm/package/apk.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "fpm/util" require "backports/latest" require "fileutils" require "digest" require 'digest/sha1' # Support for Alpine packages (.apk files) # # This class supports both input and output of packages. class FPM::Package::APK< FPM::Package TAR_CHUNK_SIZE = 512 TAR_TYPEFLAG_OFFSET = 156 TAR_NAME_OFFSET_START = 0 TAR_NAME_OFFSET_END = 99 TAR_LENGTH_OFFSET_START = 124 TAR_LENGTH_OFFSET_END = 135 TAR_CHECKSUM_OFFSET_START = 148 TAR_CHECKSUM_OFFSET_END = 155 TAR_MAGIC_START = 257 TAR_MAGIC_END = 264 TAR_UID_START = 108 TAR_UID_END = 115 TAR_GID_START = 116 TAR_GID_END = 123 TAR_UNAME_START = 265 TAR_UNAME_END = 296 TAR_GNAME_START = 297 TAR_GNAME_END = 328 TAR_MAJOR_START = 329 TAR_MAJOR_END = 336 TAR_MINOR_START = 337 TAR_MINOR_END = 344 private # Get the name of this package. See also FPM::Package#name # # This accessor actually modifies the name if it has some invalid or unwise # characters. def name if @name =~ /[A-Z]/ logger.warn("apk packages should not have uppercase characters in their names") @name = @name.downcase end if @name.include?("_") logger.warn("apk packages should not include underscores") @name = @name.gsub(/[_]/, "-") end if @name.include?(" ") logger.warn("apk packages should not contain spaces") @name = @name.gsub(/[ ]/, "-") end return @name end def prefix return (attributes[:prefix] or "/") end def architecture # "native" in apk should be "noarch" if @architecture.nil? or @architecture == "native" @architecture = "noarch" end return @architecture end def input(input_path) logger.error("apk extraction is not yet implemented") end def output(output_path) output_check(output_path) control_path = build_path("control") controltar_path = build_path("control.tar") datatar_path = build_path("data.tar") FileUtils.mkdir(control_path) # data tar. tar_path(staging_path(""), datatar_path) # control tar. begin write_pkginfo(control_path) write_control_scripts(control_path) tar_path(control_path, controltar_path) ensure FileUtils.rm_r(control_path) end # concatenate the two into a real apk. begin # cut end-of-tar record from control tar cut_tar_record(controltar_path) # calculate/rewrite sha1 hashes for data tar hash_datatar(datatar_path) # concatenate the two into the final apk concat_zip_tars(controltar_path, datatar_path, output_path) end logger.warn("apk output does not currently sign packages.") logger.warn("It's recommended that your package be installed with '--allow-untrusted'") end def write_pkginfo(base_path) pkginfo = "" pkginfo << "# Generated by fpm\n" pkginfo << "pkgname = #{@name}\n" pkginfo << "pkgver = #{to_s("FULLVERSION")}\n" pkginfo << "arch = #{architecture()}\n" pkginfo << "pkgdesc = #{description()}\n" pkginfo << "url = #{url()}\n" pkginfo << "size = 102400\n" # totally magic, not sure what it's used for. # write depends lines for dependency in dependencies() pkginfo << "depend = #{dependency}\n" end File.write("#{base_path}/.PKGINFO", pkginfo) end # Writes each control script from template into the build path, # in the folder given by [base_path] def write_control_scripts(base_path) scripts = {} scripts = register_script('post-install', :after_install, scripts) scripts = register_script('pre-install', :before_install, scripts) scripts = register_script('pre-upgrade', :before_upgrade, scripts) scripts = register_script('post-upgrade', :after_upgrade, scripts) scripts = register_script('pre-deinstall', :before_remove, scripts) scripts = register_script('post-deinstall', :after_remove, scripts) scripts.each do |key, content| File.write("#{base_path}/.#{key}", content) end end # Convenience method for 'write_control_scripts' to register control scripts # if they exist. def register_script(key, value, hash) if(script?(value)) hash[key] = scripts[value] end return hash end # Removes the end-of-tar records from the given [target_path]. # End of tar records are two contiguous empty tar records at the end of the file # Taken together, they comprise 1k of null data. def cut_tar_record(target_path) temporary_target_path = target_path + "~" record_length = 0 empty_records = 0 open(temporary_target_path, "wb") do |target_file| # Scan to find the location of the two contiguous null records open(target_path, "rb") do |file| until(empty_records == 2) header = file.read(TAR_CHUNK_SIZE) # clear off ownership info header = replace_ownership_headers(header, true) typeflag = header[TAR_TYPEFLAG_OFFSET] ascii_length = header[TAR_LENGTH_OFFSET_START..TAR_LENGTH_OFFSET_END] if(file.eof?()) raise StandardError.new("Invalid tar stream, eof before end-of-tar record") end if(typeflag == "\0") empty_records += 1 next end record_length = ascii_length.to_i(8) record_length = determine_record_length(record_length) target_file.write(header) target_file.write(file.read(record_length)) end end end FileUtils::mv(temporary_target_path, target_path) end # Rewrites the tar file located at the given [target_tar_path] # to have its record headers use a simple checksum, # and the apk sha1 hash extension. def hash_datatar(target_path) header = extension_header = "" data = extension_data = "" record_length = extension_length = 0 empty_records = 0 temporary_file_name = target_path + "~" target_file = open(temporary_file_name, "wb") file = open(target_path, "rb") begin until(file.eof?() || empty_records == 2) header = file.read(TAR_CHUNK_SIZE) typeflag = header[TAR_TYPEFLAG_OFFSET] record_length = header[TAR_LENGTH_OFFSET_START..TAR_LENGTH_OFFSET_END].to_i(8) data = "" record_length = determine_record_length(record_length) until(data.length == record_length) data << file.read(TAR_CHUNK_SIZE) end # Clear ownership fields header = replace_ownership_headers(header, false) # If it's not a null record, do extension hash. if(typeflag != "\0") extension_header = header.dup() extension_header = replace_ownership_headers(extension_header, true) # directories have a magic string inserted into their name full_record_path = extension_header[TAR_NAME_OFFSET_START..TAR_NAME_OFFSET_END].delete("\0") full_record_path = add_paxstring(full_record_path) # hash data contents with sha1, if there is any content. if(typeflag == '5') extension_data = "" # ensure it doesn't end with a slash if(full_record_path[full_record_path.length-1] == '/') full_record_path = full_record_path.chop() end else extension_data = hash_record(data) end full_record_path = pad_string_to(full_record_path, 100) extension_header[TAR_NAME_OFFSET_START..TAR_NAME_OFFSET_END] = full_record_path extension_header[TAR_TYPEFLAG_OFFSET] = 'x' extension_header[TAR_LENGTH_OFFSET_START..TAR_LENGTH_OFFSET_END] = extension_data.length.to_s(8).rjust(12, '0') extension_header = checksum_header(extension_header) # write extension record target_file.write(extension_header) target_file.write(extension_data) else empty_records += 1 end # write header and data to target file. target_file.write(header) target_file.write(data) end FileUtils.mv(temporary_file_name, target_path) ensure file.close() target_file.close() end end # Concatenates each of the given [apath] and [bpath] into the given [target_path] def concat_zip_tars(apath, bpath, target_path) temp_apath = apath + "~" temp_bpath = bpath + "~" # zip each path separately Zlib::GzipWriter.open(temp_apath) do |target_writer| open(apath, "rb") do |file| until(file.eof?()) target_writer.write(file.read(4096)) end end end Zlib::GzipWriter.open(temp_bpath) do |target_writer| open(bpath, "rb") do |file| until(file.eof?()) target_writer.write(file.read(4096)) end end end # concat both into one. File.open(target_path, "wb") do |target_writer| open(temp_apath, "rb") do |file| until(file.eof?()) target_writer.write(file.read(4096)) end end open(temp_bpath, "rb") do |file| until(file.eof?()) target_writer.write(file.read(4096)) end end end end # Rounds the given [record_length] to the nearest highest evenly-divisble number of 512. def determine_record_length(record_length) sans_size = TAR_CHUNK_SIZE-1 if(record_length % TAR_CHUNK_SIZE != 0) record_length = (record_length + sans_size) & ~sans_size; end return record_length end # Checksums the entire contents of the given [header] # Writes the resultant checksum into indices 148-155 of the same [header], # and returns the modified header. # 148-155 is the "size" range in a tar/ustar header. def checksum_header(header) # blank out header checksum replace_string_range(header, TAR_CHECKSUM_OFFSET_START, TAR_CHECKSUM_OFFSET_END, ' ') # calculate new checksum checksum = 0 for i in 0..(TAR_CHUNK_SIZE-1) checksum += header.getbyte(i) end checksum = checksum.to_s(8).rjust(6, '0') header[TAR_CHECKSUM_OFFSET_START..TAR_CHECKSUM_OFFSET_END-2] = checksum header[TAR_CHECKSUM_OFFSET_END-1] = "\0" return header end # SHA-1 hashes the given data, then places it in the APK hash string format # then returns. def hash_record(data) # %u %s=%s\n # len name=hash hash = Digest::SHA1.hexdigest(data) name = "APK-TOOLS.checksum.SHA1" ret = "#{name}=#{hash}\n" # the length requirement needs to know its own length too, because the length # is the entire length of the line, not just the contents. length = ret.length line_length = length.to_s length += line_length.length candidate_ret = "#{line_length} #{ret}" if(candidate_ret.length != length) length += 1 candidate_ret = "#{length.to_s} #{ret}" end ret = candidate_ret # pad out the result ret = pad_string_to(ret, TAR_CHUNK_SIZE) return ret end # Tars the current contents of the given [path] to the given [target_path]. def tar_path(path, target_path) # Change directory to the source path, and glob files # This is done so that we end up with a "flat" archive, that doesn't # have any path artifacts from the packager's absolute path. ::Dir::chdir(path) do entries = ::Dir::glob("**", File::FNM_DOTMATCH) args = [ tar_cmd, "-f", target_path, "-c" ] # Move pkginfo to the front, if it exists. for i in (0..entries.length) if(entries[i] == ".PKGINFO") entries[i] = entries[0] entries[0] = ".PKGINFO" break end end # add entries to arguments. entries.each do |entry| unless(entry == '..' || entry == '.') args = args << entry end end safesystem(*args) end end # APK adds a "PAX" magic string into most directory names. # This takes an unchanged directory name and "paxifies" it. def add_paxstring(ret) pax_slash = ret.rindex('/') if(pax_slash == nil) pax_slash = 0 else pax_slash = ret.rindex('/', pax_slash-1) if(pax_slash == nil || pax_slash < 0) pax_slash = 0 end end ret = ret.insert(pax_slash, "/PaxHeaders.14670/") ret = ret.sub("//", "/") return ret end # Appends null zeroes to the end of [ret] until it is divisible by [length]. # Returns the padded result. def pad_string_to(ret, length) until(ret.length % length == 0) ret << "\0" end return ret end # Replaces every character between [start] and [finish] in the given [str] # with [character]. def replace_string_range(str, start, finish, character) for i in (start..finish) str[i] = character end return str end # Nulls out the ownership bits of the given tar [header]. def replace_ownership_headers(header, nullify_names) # magic header[TAR_MAGIC_START..TAR_MAGIC_END] = "ustar\0" + "00" # ids header = replace_string_range(header, TAR_UID_START, TAR_UID_END, "0") header = replace_string_range(header, TAR_GID_START, TAR_GID_END, "0") header[TAR_GID_END] = "\0" header[TAR_UID_END] = "\0" # names if(nullify_names) header = replace_string_range(header, TAR_UNAME_START, TAR_UNAME_END, "\0") header = replace_string_range(header, TAR_GNAME_START, TAR_GNAME_END, "\0") # major/minor header[TAR_MAJOR_START..TAR_MAJOR_END] = "0".rjust(8, '0') header[TAR_MINOR_START..TAR_MINOR_END] = "0".rjust(8, '0') header[TAR_MAJOR_END] = "\0" header[TAR_MINOR_END] = "\0" else header[TAR_UNAME_START..TAR_UNAME_END] = pad_string_to("root", 32) header[TAR_GNAME_START..TAR_GNAME_END] = pad_string_to("root", 32) end return header end def to_s(format=nil) return super("NAME_FULLVERSION_ARCH.TYPE") if format.nil? return super(format) end public(:input, :output, :architecture, :name, :prefix, :converted_from, :to_s) end ================================================ FILE: lib/fpm/package/cpan.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/util" require "fileutils" require "find" require "pathname" class FPM::Package::CPAN < FPM::Package # Flags '--foo' will be accessable as attributes[:npm_foo] option "--perl-bin", "PERL_EXECUTABLE", "The path to the perl executable you wish to run.", :default => "perl" option "--cpanm-bin", "CPANM_EXECUTABLE", "The path to the cpanm executable you wish to run.", :default => "cpanm" option "--mirror", "CPAN_MIRROR", "The CPAN mirror to use instead of the default." option "--mirror-only", :flag, "Only use the specified mirror for metadata.", :default => false option "--package-name-prefix", "NAME_PREFIX", "Name to prefix the package name with.", :default => "perl" option "--disable-dependency", "MODULE", "Filter modules matching MODULE from those generated by " \ "the auto-depends for CPAN modules. This flag can be specified " \ "multiple times. Use the perl module name, IE: URI::Escape.", :multivalued => true, :attribute_name => :rejects, :default => ['vars','warnings','strict','Config'] option "--test", :flag, "Run the tests before packaging?", :default => true option "--verbose", :flag, "Produce verbose output from cpanm?", :default => false option "--perl-lib-path", "PERL_LIB_PATH", "Path of target Perl Libraries" option "--sandbox-non-core", :flag, "Sandbox all non-core modules, even if they're already installed", :default => true option "--cpanm-force", :flag, "Pass the --force parameter to cpanm", :default => false private def input(package) #if RUBY_VERSION =~ /^1\.8/ #raise FPM::Package::InvalidArgument, #"Sorry, CPAN support requires ruby 1.9 or higher. You have " \ #"#{RUBY_VERSION}. If this negatively impacts you, please let " \ #"me know by filing an issue: " \ #"https://github.com/jordansissel/fpm/issues" #end require "net/http" require "json" if File.exist?(package) moduledir = package result = {} else result = search_module(package, version) tarball = download(result, version) moduledir = unpack(tarball) end # Read package metadata (name, version, etc) if File.exist?(File.join(moduledir, "META.json")) local_metadata = JSON.parse(File.read(File.join(moduledir, ("META.json")))) elsif File.exist?(File.join(moduledir, ("META.yml"))) require "yaml" local_metadata = YAML.load_file(File.join(moduledir, ("META.yml"))) elsif File.exist?(File.join(moduledir, "MYMETA.json")) local_metadata = JSON.parse(File.read(File.join(moduledir, ("MYMETA.json")))) elsif File.exist?(File.join(moduledir, ("MYMETA.yml"))) require "yaml" local_metadata = YAML.load_file(File.join(moduledir, ("MYMETA.yml"))) end # Merge the MetaCPAN query result and the metadata pulled from the local # META file(s). The local data overwrites the query data for all keys the # two hashes have in common. Merge with an empty hash if there was no # local META file. metadata = result.merge(local_metadata || {}) if metadata.empty? raise FPM::InvalidPackageConfiguration, "Could not find package metadata. Checked for META.json, META.yml, and MetaCPAN API data" end self.version = metadata["version"] self.description = metadata["abstract"] self.license = case metadata["license"] when Array; metadata["license"].first when nil; "unknown" else; metadata["license"] end unless metadata["release"].nil? dist_name, _, dist_version = metadata["release"].rpartition('-') logger.info("Setting package name from 'distribution'", :distribution => dist_name) self.name = fix_name(dist_name) self.provides = search_provided_modules(dist_name, dist_version) else logger.info("Setting package name from 'name'", :name => metadata["name"]) self.name = fix_name(metadata["name"]) self.provides << cap_name(metadata["name"]) + " = #{self.version}" end # author is not always set or it may be a string instead of an array self.vendor = case metadata["author"] when String; metadata["author"] when Array; metadata["author"].join(", ") when NilClass; "No Vendor Or Author Provided" else raise FPM::InvalidPackageConfiguration, "Unexpected CPAN 'author' field type: #{metadata["author"].class}. This is a bug." end if metadata.include?("author") self.url = metadata["resources"]["homepage"] rescue "unknown" # TODO(sissel): figure out if this perl module compiles anything # and set the architecture appropriately. self.architecture = "all" # Install any build/configure dependencies with cpanm. # We'll install to a temporary directory. logger.info("Installing any build or configure dependencies") if attributes[:cpan_sandbox_non_core?] cpanm_flags = ["-L", build_path("cpan"), moduledir] else cpanm_flags = ["-l", build_path("cpan"), moduledir] end # This flag causes cpanm to ONLY download dependencies, skipping the target # module itself. This is fine, because the target module has already been # downloaded, and there's no need to download twice, test twice, etc. cpanm_flags += ["--installdeps"] cpanm_flags += ["-n"] if !attributes[:cpan_test?] cpanm_flags += ["--mirror", "#{attributes[:cpan_mirror]}"] if !attributes[:cpan_mirror].nil? cpanm_flags += ["--mirror-only"] if attributes[:cpan_mirror_only?] && !attributes[:cpan_mirror].nil? cpanm_flags += ["--force"] if attributes[:cpan_cpanm_force?] cpanm_flags += ["--verbose"] if attributes[:cpan_verbose?] safesystem(attributes[:cpan_cpanm_bin], *cpanm_flags) if !attributes[:no_auto_depends?] found_dependencies = {} if metadata["requires"] found_dependencies.merge!(metadata["requires"]) end if metadata["prereqs"] if metadata["prereqs"]["runtime"] if metadata["prereqs"]["runtime"]["requires"] found_dependencies.merge!(metadata["prereqs"]["runtime"]["requires"]) end end end unless found_dependencies.empty? found_dependencies.each do |dep_name, version| # Special case for representing perl core as a version. if dep_name == "perl" m = version.to_s.match(/^(\d)\.(\d{3})(\d{3})$/) if m version = m[1] + '.' + m[2].sub(/^0*/, '') + '.' + m[3].sub(/^0*/, '') end self.dependencies << "#{dep_name} >= #{version}" next end name = cap_name(dep_name) if version.to_s == "0" # Assume 'Foo = 0' means any version? self.dependencies << "#{name}" else # The 'version' string can be something complex like: # ">= 0, != 1.0, != 1.2" # If it is not specified explicitly, require the given # version or newer, as that is all CPAN itself enforces if version.is_a?(String) version.split(/\s*,\s*/).each do |v| if v =~ /\s*[><=]/ self.dependencies << "#{name} #{v}" else self.dependencies << "#{name} >= #{v}" end end else self.dependencies << "#{name} >= #{version}" end end end end end #no_auto_depends ::Dir.chdir(moduledir) do # TODO(sissel): install build and config dependencies to resolve # build/configure requirements. # META.yml calls it 'configure_requires' and 'build_requires' # META.json calls it prereqs/build and prereqs/configure prefix = attributes[:prefix] || "/usr/local" # TODO(sissel): Set default INSTALL path? # Try Makefile.PL, Build.PL # if File.exist?("Build.PL") # Module::Build is in use here; different actions required. safesystem(attributes[:cpan_perl_bin], "-Mlocal::lib=#{build_path("cpan")}", "Build.PL") safesystem(attributes[:cpan_perl_bin], "-Mlocal::lib=#{build_path("cpan")}", "./Build") if attributes[:cpan_test?] safesystem(attributes[:cpan_perl_bin], "-Mlocal::lib=#{build_path("cpan")}", "./Build", "test") end if attributes[:cpan_perl_lib_path] perl_lib_path = attributes[:cpan_perl_lib_path] safesystem("./Build install --install_path lib=#{perl_lib_path} \ --destdir #{staging_path} --prefix #{prefix} --destdir #{staging_path}") else safesystem("./Build", "install", "--prefix", prefix, "--destdir", staging_path, # Empty install_base to avoid local::lib being used. "--install_base", "") end elsif File.exist?("Makefile.PL") if attributes[:cpan_perl_lib_path] perl_lib_path = attributes[:cpan_perl_lib_path] safesystem(attributes[:cpan_perl_bin], "-Mlocal::lib=#{build_path("cpan")}", "Makefile.PL", "PREFIX=#{prefix}", "LIB=#{perl_lib_path}", # Empty install_base to avoid local::lib being used. "INSTALL_BASE=") else safesystem(attributes[:cpan_perl_bin], "-Mlocal::lib=#{build_path("cpan")}", "Makefile.PL", "PREFIX=#{prefix}", # Empty install_base to avoid local::lib being used. "INSTALL_BASE=") end make = [ "env", "PERL5LIB=#{build_path("cpan/lib/perl5")}", "make" ] safesystem(*make) safesystem(*(make + ["test"])) if attributes[:cpan_test?] safesystem(*(make + ["DESTDIR=#{staging_path}", "install"])) else raise FPM::InvalidPackageConfiguration, "I don't know how to build #{name}. No Makefile.PL nor " \ "Build.PL found" end # Fix any files likely to cause conflicts that are duplicated # across packages. # https://github.com/jordansissel/fpm/issues/443 # https://github.com/jordansissel/fpm/issues/510 glob_prefix = attributes[:cpan_perl_lib_path] || prefix ::Dir.glob(File.join(staging_path, glob_prefix, "**/perllocal.pod")).each do |path| logger.debug("Removing useless file.", :path => path.gsub(staging_path, "")) File.unlink(path) end # Remove useless .packlist files and their empty parent folders # https://github.com/jordansissel/fpm/issues/1179 ::Dir.glob(File.join(staging_path, glob_prefix, "**/.packlist")).each do |path| logger.debug("Removing useless file.", :path => path.gsub(staging_path, "")) File.unlink(path) Pathname.new(path).parent.ascend do |parent| if ::Dir.entries(parent).sort == ['.', '..'].sort FileUtils.rmdir parent else break end end end end # TODO(sissel): figure out if this perl module compiles anything # and set the architecture appropriately. self.architecture = "all" # Find any shared objects in the staging directory to set architecture as # native if found; otherwise keep the 'all' default. Find.find(staging_path) do |path| if path =~ /\.so$/ logger.info("Found shared library, setting architecture=native", :path => path) self.architecture = "native" end end end # def input def unpack(tarball) directory = build_path("module") ::Dir.mkdir(directory) args = [ "-C", directory, "-zxf", tarball, %q{--transform=s,[./]*[^/]*/,,} ] safesystem("tar", *args) return directory end # def unpack def download(metadata, cpan_version=nil) distribution = metadata["distribution"] author = metadata["author"] logger.info("Downloading perl module", :distribution => distribution, :version => cpan_version) # default to latest version unless we specify one if cpan_version.nil? self.version = "#{metadata["version"]}" else self.version = "#{cpan_version}" end # Search metacpan to get download URL for this version of the module metacpan_search_url = "https://fastapi.metacpan.org/v1/release/_search?_source=download_url" metacpan_search_query = {"query":{"term":{"name": "#{distribution}-#{self.version}" } } }.to_json begin search_response = httppost(metacpan_search_url,metacpan_search_query) rescue Net::HTTPServerException => e logger.error("metacpan release query failed.", :error => e.message, :url => metacpan_search_url) raise FPM::InvalidPackageConfiguration, "metacpan release query failed" end data = search_response.body release_metadata = JSON.parse(data) download_url = release_metadata['hits']['hits'][0]['_source']['download_url'] download_path = URI.parse(download_url).path tarball = File.basename(download_path) url_base = "http://www.cpan.org/" url_base = "#{attributes[:cpan_mirror]}" if !attributes[:cpan_mirror].nil? url = "#{url_base}#{download_path}" logger.debug("Fetching perl module", :url => url) begin response = httpfetch(url) rescue Net::HTTPServerException => e #logger.error("Download failed", :error => response.status_line, #:url => url) logger.error("Download failed", :error => e, :url => url) raise FPM::InvalidPackageConfiguration, "metacpan query failed" end File.open(build_path(tarball), "w") do |fd| #response.read_body { |c| fd.write(c) } fd.write(response.body) end return build_path(tarball) end # def download def search_module(module_name, version=nil) logger.info("Asking metacpan about a module", :module => module_name, :version => version) metacpan_api_url = "https://fastapi.metacpan.org/v1/module/_search" metacpan_api_query = <<-EOS { "query": { "bool": { "must": [ { "term": { "module.name": "#{module_name}" } }, { "term": { "maturity": "released" } }, { "term": { #{version.nil? ? '"status": "latest"' : '"module.version": "' + version + '"'} } } ] } }, "size": 1 } EOS begin response = httppost(metacpan_api_url, metacpan_api_query) rescue Net::HTTPServerException => e #logger.error("metacpan query failed.", :error => response.status_line, #:module => package, :url => metacpan_url) logger.error("metacpan query failed.", :error => e.message, :module => module_name, :version => version, :url => metacpan_api_url) raise FPM::InvalidPackageConfiguration, "metacpan query failed" end #data = "" #response.read_body { |c| p c; data << c } data = response.body metadata = JSON.parse(data)['hits']['hits'][0]['_source'] return metadata end # def search def search_provided_modules(distribution, version) logger.info("Asking metacpan about a releases provided modules", :distribution => distribution, :version => version) metacpan_api_url = "https://fastapi.metacpan.org/v1/module/_search?_source=module.name,module.version" metacpan_api_query = <<-EOS { "query": { "bool": { "filter": [ { "exists": { "field": "module" } }, { "term": { "release": "#{distribution}-#{version}" } } ] } }, "sort": [ { "module.name": { "order": "asc" } } ], "size": 5000 } EOS begin response = httppost(metacpan_api_url, metacpan_api_query) rescue Net::HTTPServerException => e logger.error("metacpan release query failed.", :error => e.message, :url => metacpan_api_url) raise FPM::InvalidPackageConfiguration, "metacpan release query failed" end query_hits = JSON.parse(response.body)['hits']['hits'] provided_modules = [] query_hits.each do |h| h["_source"]["module"].each do |m| module_name = m["name"] module_version = m["version"] Array(module_name).zip(Array(module_version)).each do |name, version| provided_modules << cap_name(name) + (version ? " = #{version}" : "") end end end return provided_modules end # def search_provided_modules def cap_name(name) return "perl(" + name.gsub("-", "::") + ")" end # def cap_name def fix_name(name) case name when "perl"; return "perl" else; return [attributes[:cpan_package_name_prefix], name].join("-").gsub("::", "-") end end # def fix_name def httpfetch(url) uri = URI.parse(url) if ENV['http_proxy'] proxy = URI.parse(ENV['http_proxy']) http = Net::HTTP.Proxy(proxy.host,proxy.port,proxy.user,proxy.password).new(uri.host, uri.port) else http = Net::HTTP.new(uri.host, uri.port) end http.use_ssl = uri.scheme == 'https' response = http.request(Net::HTTP::Get.new(uri.request_uri)) case response when Net::HTTPSuccess; return response when Net::HTTPRedirection; return httpfetch(response["location"]) else; response.error! end end # def httpfetch def httppost(url, body) uri = URI.parse(url) if ENV['http_proxy'] proxy = URI.parse(ENV['http_proxy']) http = Net::HTTP.Proxy(proxy.host,proxy.port,proxy.user,proxy.password).new(uri.host, uri.port) else http = Net::HTTP.new(uri.host, uri.port) end http.use_ssl = uri.scheme == 'https' response = http.post(uri.request_uri, body) case response when Net::HTTPSuccess; return response when Net::HTTPRedirection; return httppost(response["location"]) else; response.error! end end # def httppost public(:input) end # class FPM::Package::CPAN ================================================ FILE: lib/fpm/package/deb.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "fpm/util" require "backports/latest" require "fileutils" require "digest" require "zlib" # For handling conversion require "fpm/package/cpan" require "fpm/package/gem" # Support for debian packages (.deb files) # # This class supports both input and output of packages. class FPM::Package::Deb < FPM::Package # Map of what scripts are named. SCRIPT_MAP = { :before_install => "preinst", :after_install => "postinst", :before_remove => "prerm", :after_remove => "postrm", :after_purge => "postrm", } unless defined?(SCRIPT_MAP) # The list of supported compression types. Default is gz (gzip) COMPRESSION_TYPES = [ "gz", "bzip2", "xz", "zst", "none" ] # https://www.debian.org/doc/debian-policy/ch-relationships.html#syntax-of-relationship-fields # Example value with version relationship: libc6 (>= 2.2.1) # Example value: libc6 # Package name docs here: https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-source # Package names (both source and binary, see Package) must consist only of lower case letters (a-z), # digits (0-9), plus (+) and minus (-) signs, and periods (.). # They must be at least two characters long and must start with an alphanumeric character. # Version string docs here: https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-version # The format is: [epoch:]upstream_version[-debian_revision]. # epoch - This is a single (generally small) unsigned integer # upstream_version - must contain only alphanumerics 6 and the characters . + - ~ # debian_revision - only alphanumerics and the characters + . ~ VERSION_FIELD_PATTERN = / (?:(?:[0-9]+):)? # The epoch, an unsigned int (?:[A-Za-z0-9+~.-]+) # upstream version, probably should not contain dashes? (?:-[A-Za-z0-9+~.]+)? # debian_revision /x # Version field pattern RELATIONSHIP_FIELD_PATTERN = /^ (?[A-z0-9][A-z0-9_.-]+) (?:\s*\((?[<>=]+)\s(?#{VERSION_FIELD_PATTERN})\))? $/x # Relationship field pattern option "--ignore-iteration-in-dependencies", :flag, "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" option "--build-depends", "DEPENDENCY", "Add DEPENDENCY as a Build-Depends" do |dep| @build_depends ||= [] @build_depends << dep end option "--pre-depends", "DEPENDENCY", "Add DEPENDENCY as a Pre-Depends" do |dep| @pre_depends ||= [] @pre_depends << dep end option "--compression", "COMPRESSION", "The compression type to use, must " \ "be one of #{COMPRESSION_TYPES.join(", ")}.", :default => "gz" do |value| if !COMPRESSION_TYPES.include?(value) raise FPM::Package::InvalidArgument, "deb compression value of '#{value}' is invalid. " \ "Must be one of #{COMPRESSION_TYPES.join(", ")}" end value end option "--compression-level", "[0-9]", "Select a compression level. 0 is none or minimal. 9 is max compression.", # Specify which compression level to use on the compressor backend, when building a package :default => nil do |value| valint = value.to_i # if self.attributes[:deb_compression].nil? # raise "Can't specify a compression level with compression disabled" # end unless value =~ /^\d$/ && valint >= 0 && valint <= 9 raise "Invalid compression level '#{value}'. Valid values are integers between 0 and 9 inclusive." end valint end option "--dist", "DIST-TAG", "Set the deb distribution.", :default => "unstable" # Take care about the case when we want custom control file but still use fpm ... option "--custom-control", "FILEPATH", "Custom version of the Debian control file." do |control| File.expand_path(control) end # Add custom debconf config file option "--config", "SCRIPTPATH", "Add SCRIPTPATH as debconf config file." do |config| File.expand_path(config) end # Add custom debconf templates file option "--templates", "FILEPATH", "Add FILEPATH as debconf templates file." do |templates| File.expand_path(templates) end option "--installed-size", "KILOBYTES", "The installed size, in kilobytes. If omitted, this will be calculated " \ "automatically" do |value| value.to_i end option "--priority", "PRIORITY", "The debian package 'priority' value.", :default => "optional" option "--use-file-permissions", :flag, "Use existing file permissions when defining ownership and modes" option "--user", "USER", "The owner of files in this package", :default => 'root' option "--group", "GROUP", "The group owner of files in this package", :default => 'root' option "--changelog", "FILEPATH", "Add FILEPATH as debian changelog" do |file| File.expand_path(file) end option "--generate-changes", :flag, "Generate PACKAGENAME.changes file.", :default => false option "--upstream-changelog", "FILEPATH", "Add FILEPATH as upstream changelog" do |file| File.expand_path(file) end option "--recommends", "PACKAGE", "Add PACKAGE to Recommends" do |pkg| @recommends ||= [] @recommends << pkg next @recommends end option "--suggests", "PACKAGE", "Add PACKAGE to Suggests" do |pkg| @suggests ||= [] @suggests << pkg next @suggests end option "--meta-file", "FILEPATH", "Add FILEPATH to DEBIAN directory" do |file| @meta_files ||= [] @meta_files << File.expand_path(file) next @meta_files end option "--interest", "EVENT", "Package is interested in EVENT trigger" do |event| @interested_triggers ||= [] @interested_triggers << event next @interested_triggers end option "--activate", "EVENT", "Package activates EVENT trigger" do |event| @activated_triggers ||= [] @activated_triggers << event next @activated_triggers end option "--interest-noawait", "EVENT", "Package is interested in EVENT trigger without awaiting" do |event| @interested_noawait_triggers ||= [] @interested_noawait_triggers << event next @interested_noawait_triggers end option "--activate-noawait", "EVENT", "Package activates EVENT trigger" do |event| @activated_noawait_triggers ||= [] @activated_noawait_triggers << event next @activated_noawait_triggers end option "--field", "'FIELD: VALUE'", "Add custom field to the control file" do |fv| @custom_fields ||= {} field, value = fv.split(/: */, 2) @custom_fields[field] = value next @custom_fields end option "--no-default-config-files", :flag, "Do not add all files in /etc as configuration files by default for Debian packages.", :default => false option "--auto-config-files", :flag, "Init script and default configuration files will be labeled as " \ "configuration files for Debian packages.", :default => true option "--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" option "--init", "FILEPATH", "Add FILEPATH as an init script", :multivalued => true do |file| next File.expand_path(file) end option "--default", "FILEPATH", "Add FILEPATH as /etc/default configuration", :multivalued => true do |file| next File.expand_path(file) end option "--upstart", "FILEPATH", "Add FILEPATH as an upstart script", :multivalued => true do |file| next File.expand_path(file) end option "--systemd", "FILEPATH", "Add FILEPATH as a systemd script", :multivalued => true do |file| next File.expand_path(file) end option "--systemd-path", "FILEPATH", "Relative path to the systemd service directory", :default => "lib/systemd/system" do |file| next file.gsub(/^\/*/, '') end option "--systemd-enable", :flag , "Enable service on install or upgrade", :default => false option "--systemd-auto-start", :flag , "Start service after install or upgrade", :default => false option "--systemd-restart-after-upgrade", :flag , "Restart service after upgrade", :default => true option "--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)" do |val| File.expand_path(val) # Get the full path to the script end # --after-purge option "--maintainerscripts-force-errorchecks", :flag , "Activate errexit shell option according to lintian. " \ "https://lintian.debian.org/tags/maintainer-script-ignores-errors.html", :default => false def initialize(*args) super(*args) attributes[:deb_priority] = "optional" end # def initialize private # Return the architecture. This will default to native if not yet set. # It will also try to use dpkg and 'uname -m' to figure out what the # native 'architecture' value should be. def architecture if @architecture.nil? or @architecture == "native" # Default architecture should be 'native' which we'll need to ask the # system about. if program_in_path?("dpkg") @architecture = %x{dpkg --print-architecture 2> /dev/null}.chomp if $?.exitstatus != 0 or @architecture.empty? # if dpkg fails or emits nothing, revert back to uname -m @architecture = %x{uname -m}.chomp end else @architecture = %x{uname -m}.chomp end end case @architecture when "x86_64" # Debian calls x86_64 "amd64" @architecture = "amd64" when "aarch64" # Debian calls aarch64 "arm64" @architecture = "arm64" when "noarch" # Debian calls noarch "all" @architecture = "all" when "ppc64le" # Debian calls ppc64le "ppc64el" @architecture = "ppc64el" end return @architecture end # def architecture # Get the name of this package. See also FPM::Package#name # # This accessor actually modifies the name if it has some invalid or unwise # characters. def name if @name =~ /[A-Z]/ logger.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 => @name, :fixedname => @name.downcase) @name = @name.downcase end if @name.include?("_") logger.info("Debian package names cannot include underscores; " \ "automatically converting to dashes", :name => @name) @name = @name.gsub(/[_]/, "-") end if @name.include?(" ") logger.info("Debian package names cannot include spaces; " \ "automatically converting to dashes", :name => @name) @name = @name.gsub(/[ ]/, "-") end return @name end # def name def prefix return (attributes[:prefix] or "/") end # def prefix def version if @version.kind_of?(String) if @version.start_with?("v") && @version.gsub(/^v/, "") =~ /^#{VERSION_FIELD_PATTERN}$/ logger.warn("Debian 'Version' field needs to start with a digit. I was provided '#{@version}' which seems like it just has a 'v' prefix to an otherwise-valid Debian version, I'll remove the 'v' for you.") @version = @version.gsub(/^v/, "") end if @version !~ /^#{VERSION_FIELD_PATTERN}$/ raise FPM::InvalidPackageConfiguration, "The version looks invalid for Debian packages. Debian version field must contain only alphanumerics and . (period), + (plus), - (hyphen) or ~ (tilde). I have '#{@version}' which which isn't valid." end end return @version end def input(input_path) extract_info(input_path) extract_files(input_path) end # def input def extract_info(package) compression = `#{ar_cmd[0]} t #{package}`.split("\n").grep(/control.tar/).first.split(".").last case compression when "gz" controltar = "control.tar.gz" compression = "-z" when "bzip2","bz2" controltar = "control.tar.bz2" compression = "-j" when "xz" controltar = "control.tar.xz" compression = "-J" when "zst" controltar = "control.tar.zst" compression = "--use-compress-program 'zstd -d'" when 'tar' controltar = "control.tar" compression = "" when nil raise FPM::InvalidPackageConfiguration, "Missing control.tar in deb source package #{package}" else raise FPM::InvalidPackageConfiguration, "Unknown compression type '#{compression}' for control.tar in deb source package #{package}" end build_path("control").tap do |path| FileUtils.mkdir(path) if !File.directory?(path) # unpack the control.tar.{,gz,bz2,xz,zst} from the deb package into staging_path # Unpack the control tarball safesystem(ar_cmd[0] + " p #{package} #{controltar} | tar #{compression} -xf - -C #{path}") control = File.read(File.join(path, "control")) parse = lambda do |field| value = control[/^#{field.capitalize}: .*/] if value.nil? return nil else logger.info("deb field", field => value.split(": ", 2).last) return value.split(": ",2).last end end # Parse 'epoch:version-iteration' in the version string version_re = /^(?:([0-9]+):)?(.+?)(?:-(.*))?$/ m = version_re.match(parse.call("Version")) if !m raise FPM::InvalidPackageConfiguration, "Unsupported version string '#{parse.call("Version")}'" end self.epoch, self.version, self.iteration = m.captures self.architecture = parse.call("Architecture") self.category = parse.call("Section") self.license = parse.call("License") || self.license self.maintainer = parse.call("Maintainer") self.name = parse.call("Package") self.url = parse.call("Homepage") self.vendor = parse.call("Vendor") || self.vendor parse.call("Provides").tap do |provides_str| next if provides_str.nil? self.provides = provides_str.split(/\s*,\s*/) end # The description field is a special flower, parse it that way. # The description is the first line as a normal Description field, but also continues # on future lines indented by one space, until the end of the file. Blank # lines are marked as ' .' description = control[/^Description: .*/m].split(": ", 2).last self.description = description.gsub(/^ /, "").gsub(/^\.$/, "") #self.config_files = config_files self.dependencies += parse_depends(parse.call("Depends")) if !attributes[:no_auto_depends?] if File.file?(File.join(path, "preinst")) self.scripts[:before_install] = File.read(File.join(path, "preinst")) end if File.file?(File.join(path, "postinst")) self.scripts[:after_install] = File.read(File.join(path, "postinst")) end if File.file?(File.join(path, "prerm")) self.scripts[:before_remove] = File.read(File.join(path, "prerm")) end if File.file?(File.join(path, "postrm")) self.scripts[:after_remove] = File.read(File.join(path, "postrm")) end if File.file?(File.join(path, "conffiles")) self.config_files = File.read(File.join(path, "conffiles")).split("\n") end end end # def extract_info # Parse a 'depends' line from a debian control file. # # The expected input 'data' should be everything after the 'Depends: ' string # # Example: # # parse_depends("foo (>= 3), bar (= 5), baz") def parse_depends(data) return [] if data.nil? or data.empty? # parse dependencies. Debian dependencies come in one of two forms: # * name # * name (op version) # They are all on one line, separated by ", " dep_re = /^([^ ]+)(?: \(([>=<]+) ([^)]+)\))?$/ return data.split(/, */).collect do |dep| m = dep_re.match(dep) if m name, op, version = m.captures # deb uses ">>" and "<<" for greater and less than respectively. # fpm wants just ">" and "<" op = "<" if op == "<<" op = ">" if op == ">>" # this is the proper form of dependency "#{name} #{op} #{version}" else # Assume normal form dependency, "name op version". dep end end end # def parse_depends def extract_files(package) # Find out the compression type compression = `#{ar_cmd[0]} t #{package}`.split("\n").grep(/data.tar/).first.split(".").last case compression when "gz" datatar = "data.tar.gz" compression = "-z" when "bzip2","bz2" datatar = "data.tar.bz2" compression = "-j" when "xz" datatar = "data.tar.xz" compression = "-J" when "zst" datatar = "data.tar.zst" compression = "--use-compress-program 'zstd -d'" when 'tar' datatar = "data.tar" compression = "" when nil raise FPM::InvalidPackageConfiguration, "Missing data.tar in deb source package #{package}" else raise FPM::InvalidPackageConfiguration, "Unknown compression type '#{compression}' for data.tar in deb source package #{package}" end # unpack the data.tar.{gz,bz2,xz} from the deb package into staging_path safesystem(ar_cmd[0] + " p #{package} #{datatar} | tar #{compression} -xf - -C #{staging_path}") end # def extract_files def output(output_path) self.provides = self.provides.collect { |p| fix_provides(p) } self.provides.each do |provide| if !valid_provides_field?(provide) raise FPM::InvalidPackageConfiguration, "Found invalid Provides field values (#{provide.inspect}). This is not valid in a Debian package." end end output_check(output_path) # Abort if the target path already exists. # create 'debian-binary' file, required to make a valid debian package File.write(build_path("debian-binary"), "2.0\n") # If we are given --deb-shlibs but no --after-install script, we # should implicitly create a before/after scripts that run ldconfig if attributes[:deb_shlibs] if !script?(:after_install) logger.info("You gave --deb-shlibs but no --after-install, so " \ "I am adding an after-install script that runs " \ "ldconfig to update the system library cache") scripts[:after_install] = template("deb/ldconfig.sh.erb").result(binding) end if !script?(:after_remove) logger.info("You gave --deb-shlibs but no --after-remove, so " \ "I am adding an after-remove script that runs " \ "ldconfig to update the system library cache") scripts[:after_remove] = template("deb/ldconfig.sh.erb").result(binding) end end if attributes[:source_date_epoch].nil? and not attributes[:source_date_epoch_default].nil? attributes[:source_date_epoch] = attributes[:source_date_epoch_default] end if attributes[:source_date_epoch] == "0" logger.error("Alas, ruby's Zlib::GzipWriter does not support setting an mtime of zero. Aborting.") raise FPM::InvalidPackageConfiguration, "#{name}: source_date_epoch of 0 not supported." end if not attributes[:source_date_epoch].nil? and not ar_cmd_deterministic? logger.error("Alas, could not find an ar that can handle -D option. Try installing recent gnu binutils. Aborting.") raise FPM::InvalidPackageConfiguration, "#{name}: ar is insufficient to support source_date_epoch." end if not attributes[:source_date_epoch].nil? and not tar_cmd_supports_sort_names_and_set_mtime? logger.error("Alas, could not find a tar that can set mtime and sort. Try installing recent gnu tar. Aborting.") raise FPM::InvalidPackageConfiguration, "#{name}: tar is insufficient to support source_date_epoch." end systemd_file_extensions = [ ".service", ".socket", ".device", ".mount", ".automount", ".swap", ".target", ".path", ".timer", ".slice", ".scope", ] attributes[:deb_systemd] = [] attributes.fetch(:deb_systemd_list, []).each do |systemd| name = File.basename(systemd) extname = File.extname(name) name_with_extension = if extname.empty? "#{name}.service" elsif systemd_file_extensions.include?(extname) name else # Mutating the array is fine as we raise directly after, and the array will be re-initialised next time # this method is called. If this branch is changed in the future so as not to diverge, care should be # taken to ensure that this mutated version of the array is only used for generating the error message. systemd_file_extensions[-1] = systemd_file_extensions[-1].prepend("or ") possible_extensions_str = systemd_file_extensions.join(", ") raise FPM::InvalidPackageConfiguration, "Invalid systemd unit file extension: #{extname}. Expected one of: #{possible_extensions_str}" end dest_systemd = staging_path(File.join(attributes[:deb_systemd_path], "#{name_with_extension}")) mkdir_p(File.dirname(dest_systemd)) FileUtils.cp(systemd, dest_systemd) File.chmod(0644, dest_systemd) attributes[:deb_systemd] << name_with_extension end if script?(:before_upgrade) or script?(:after_upgrade) or attributes[:deb_systemd].any? puts "Adding action files" if script?(:before_install) or script?(:before_upgrade) scripts[:before_install] = template("deb/preinst_upgrade.sh.erb").result(binding) end if script?(:before_remove) or not attributes[:deb_systemd].empty? scripts[:before_remove] = template("deb/prerm_upgrade.sh.erb").result(binding) end if script?(:after_install) or script?(:after_upgrade) or attributes[:deb_systemd].any? scripts[:after_install] = template("deb/postinst_upgrade.sh.erb").result(binding) end if script?(:after_remove) scripts[:after_remove] = template("deb/postrm_upgrade.sh.erb").result(binding) end if script?(:after_purge) scripts[:after_purge] = template("deb/postrm_upgrade.sh.erb").result(binding) end end # There are two changelogs that may appear: # - debian-specific changelog, which should be archived as changelog.Debian.gz # - upstream changelog, which should be archived as changelog.gz # see https://www.debian.org/doc/debian-policy/ch-docs.html#s-changelogs # Write the changelog.Debian.gz file dest_changelog = File.join(staging_path, "usr/share/doc/#{name}/changelog.Debian.gz") mkdir_p(File.dirname(dest_changelog)) File.new(dest_changelog, "wb", 0644).tap do |changelog| Zlib::GzipWriter.new(changelog, Zlib::BEST_COMPRESSION).tap do |changelog_gz| if not attributes[:source_date_epoch].nil? changelog_gz.mtime = attributes[:source_date_epoch].to_i end if attributes[:deb_changelog] logger.info("Writing user-specified changelog", :source => attributes[:deb_changelog]) File.new(attributes[:deb_changelog]).tap do |fd| chunk = nil # Ruby 1.8.7 doesn't have IO#copy_stream changelog_gz.write(chunk) while chunk = fd.read(16384) end.close else logger.info("Creating boilerplate changelog file") changelog_gz.write(template("deb/changelog.erb").result(binding)) end end.close end # No need to close, GzipWriter#close will close it. # Write the changelog.gz file (upstream changelog) dest_upstream_changelog = File.join(staging_path, "usr/share/doc/#{name}/changelog.gz") if attributes[:deb_upstream_changelog] File.new(dest_upstream_changelog, "wb", 0644).tap do |changelog| Zlib::GzipWriter.new(changelog, Zlib::BEST_COMPRESSION).tap do |changelog_gz| if not attributes[:source_date_epoch].nil? changelog_gz.mtime = attributes[:source_date_epoch].to_i end logger.info("Writing user-specified upstream changelog", :source => attributes[:deb_upstream_changelog]) File.new(attributes[:deb_upstream_changelog]).tap do |fd| chunk = nil # Ruby 1.8.7 doesn't have IO#copy_stream changelog_gz.write(chunk) while chunk = fd.read(16384) end.close end.close end # No need to close, GzipWriter#close will close it. end if File.exist?(dest_changelog) and not File.exist?(dest_upstream_changelog) # see https://www.debian.org/doc/debian-policy/ch-docs.html#s-changelogs File.rename(dest_changelog, dest_upstream_changelog) end attributes.fetch(:deb_init_list, []).each do |init| name = File.basename(init, ".init") dest_init = File.join(staging_path, "etc/init.d/#{name}") mkdir_p(File.dirname(dest_init)) FileUtils.cp init, dest_init File.chmod(0755, dest_init) end attributes.fetch(:deb_default_list, []).each do |default| name = File.basename(default, ".default") dest_default = File.join(staging_path, "etc/default/#{name}") mkdir_p(File.dirname(dest_default)) FileUtils.cp default, dest_default File.chmod(0644, dest_default) end attributes.fetch(:deb_upstart_list, []).each do |upstart| name = File.basename(upstart, ".upstart") dest_init = staging_path("etc/init.d/#{name}") name = "#{name}.conf" if !(name =~ /\.conf$/) dest_upstart = staging_path("etc/init/#{name}") mkdir_p(File.dirname(dest_upstart)) FileUtils.cp(upstart, dest_upstart) File.chmod(0644, dest_upstart) # Install an init.d shim that calls upstart mkdir_p(File.dirname(dest_init)) FileUtils.ln_s("/lib/init/upstart-job", dest_init) end attributes.fetch(:deb_systemd_list, []).each do |systemd| name = File.basename(systemd) extname = File.extname(systemd) name_with_extension = extname.empty? ? "#{name}.service" : name dest_systemd = staging_path(File.join(attributes[:deb_systemd_path], "#{name_with_extension}")) mkdir_p(File.dirname(dest_systemd)) FileUtils.cp(systemd, dest_systemd) File.chmod(0644, dest_systemd) end write_control_tarball # Tar up the staging_path into data.tar.{compression type} case self.attributes[:deb_compression] when "gz", nil datatar = build_path("data.tar.gz") controltar = build_path("control.tar.gz") compression_flags = ["-z"] # gnu tar obeys GZIP environment variable with options for gzip; -n = forget original filename and date compressor_options = {"GZIP" => "-#{self.attributes[:deb_compression_level] || 9}" + "#{'n' if tar_cmd_supports_sort_names_and_set_mtime? and not attributes[:source_date_epoch].nil?}"} when "bzip2" datatar = build_path("data.tar.bz2") controltar = build_path("control.tar.gz") compression_flags = ["-j"] compressor_options = {"BZIP" => "-#{self.attributes[:deb_compression_level] || 9}"} when "xz" datatar = build_path("data.tar.xz") controltar = build_path("control.tar.xz") compression_flags = ["-J"] compressor_options = {"XZ_OPT" => "-#{self.attributes[:deb_compression_level] || 3}"} when "zst" datatar = build_path("data.tar.zst") controltar = build_path("control.tar.zst") compression_flags = ["--use-compress-program", "zstd"] compressor_options = {"ZSTD_CLEVEL" => "-#{self.attributes[:deb_compression_level] || 3}"} when "none" datatar = build_path("data.tar") controltar = build_path("control.tar") compression_flags = [] compressor_options = {} else raise FPM::InvalidPackageConfiguration, "Unknown compression type '#{self.attributes[:deb_compression]}'" end args = [ tar_cmd, "-C", staging_path ] + compression_flags + data_tar_flags + [ "-cf", datatar, "." ] if tar_cmd_supports_sort_names_and_set_mtime? and not attributes[:source_date_epoch].nil? # Use gnu tar options to force deterministic file order and timestamp args += ["--sort=name", ("--mtime=@%s" % attributes[:source_date_epoch])] end args.unshift(compressor_options) safesystem(*args) # pack up the .deb, which is just an 'ar' archive with 3 files # the 'debian-binary' file has to be first File.expand_path(output_path).tap do |output_path| ::Dir.chdir(build_path) do safesystem(*ar_cmd, output_path, "debian-binary", controltar, datatar) end end # if a PACKAGENAME.changes file is to be created if self.attributes[:deb_generate_changes?] distribution = self.attributes[:deb_dist] # gather information about the files to distribute files = [ output_path ] changes_files = [] files.each do |path| changes_files.push({ :name => path, :size => File.size?(path), :md5sum => Digest::MD5.file(path).hexdigest, :sha1sum => Digest::SHA1.file(path).hexdigest, :sha256sum => Digest::SHA2.file(path).hexdigest, }) end # write change infos to .changes file changes_path = File.basename(output_path, '.deb') + '.changes' changes_data = template("deb/deb.changes.erb").result(binding) File.write(changes_path, changes_data) logger.log("Created changes", :path => changes_path) end # if deb_generate_changes end # def output def converted_from(origin) self.dependencies = self.dependencies.collect do |dep| fix_dependency(dep) end.flatten # If an invalid depends field was found i.e. /bin.sh then fix_depends will blank it # Make sure we remove this blank here self.dependencies = self.dependencies.reject { |p| p.empty? } self.provides = self.provides.collect do |provides| fix_provides(provides) end.flatten # If an invalid provides field was found i.e. mypackage(arch) then fix_provides will blank it # Make sure we remove this blank here self.provides = self.provides.reject { |p| p.empty? } if origin == FPM::Package::CPAN # By default, we'd prefer to name Debian-targeted Perl packages using the # same naming scheme that Debian itself uses, which is usually something # like "lib-perl", such as libregexp-common-perl # logger.info("Changing package name to match Debian's typical libmodule-name-perl style") self.name = "lib#{self.name.sub(/^perl-/, "")}-perl" # The fpm cpan code presents dependencies and provides fields as perl(ModuleName) # so we'll need to convert them to something debian supports. # Replace perl(Module::Name) > 1.0 with Debian-style libmodule-name-perl (> 1.0) # per: https://www.debian.org/doc/packaging-manuals/perl-policy/ch-module_packages.html perldepfix = lambda do |dep| m = dep.match(/perl\((?[A-Za-z0-9_:]+)\)\s*(?.*$)/) if m.nil? # 'dep' syntax didn't look like 'perl(Name) > 1.0' dep else # Also replace '::' in the perl module name with '-' modulename = m["name"].gsub("::", "-") # Fix any upper-casing or other naming concerns Debian has about packages name = "lib#{modulename}-perl" if m["op"].empty? name else # 'dep' syntax was like this (version constraint): perl(Module) > 1.0 "#{name} (#{m["op"]})" end end end rejects = attributes[:rejects].map do |skip| "perl(#{skip})" end self.dependencies = self.dependencies.reject do |dep| # Reject non-module Perl dependencies like 'vars' and 'warnings' dep, _ = dep.split(' ') # strip potential version component rejects.include?(dep) end.collect(&perldepfix).collect(&method(:fix_dependency)) # Also fix the Provides field 'perl(ModuleName) = version' to be 'perl-modulename (= version)' self.provides = self.provides.collect(&perldepfix).collect(&method(:fix_provides)) end # if origin == FPM::Packagin::CPAN if origin == FPM::Package::Deb changelog_path = staging_path("usr/share/doc/#{name}/changelog.Debian.gz") if File.exist?(changelog_path) logger.debug("Found a deb changelog file, using it.", :path => changelog_path) attributes[:deb_changelog] = build_path("deb_changelog") File.open(attributes[:deb_changelog], "w") do |deb_changelog| Zlib::GzipReader.open(changelog_path) do |gz| IO::copy_stream(gz, deb_changelog) end end File.unlink(changelog_path) end end if origin == FPM::Package::Deb changelog_path = staging_path("usr/share/doc/#{name}/changelog.gz") if File.exist?(changelog_path) logger.debug("Found an upstream changelog file, using it.", :path => changelog_path) attributes[:deb_upstream_changelog] = build_path("deb_upstream_changelog") File.open(attributes[:deb_upstream_changelog], "w") do |deb_upstream_changelog| Zlib::GzipReader.open(changelog_path) do |gz| IO::copy_stream(gz, deb_upstream_changelog) end end File.unlink(changelog_path) end end if origin == FPM::Package::Gem # fpm's gem input will have provides as "rubygem-name = version" # and we need to convert this to Debian-style "rubygem-name (= version)" self.provides = self.provides.collect do |provides| m = /^(#{attributes[:gem_package_name_prefix]})-([^\s]+)\s*=\s*(.*)$/.match(provides) if m "#{m[1]}-#{m[2]} (= #{m[3]})" else provides end end end end # def converted_from def debianize_op(op) # Operators in debian packaging are <<, <=, =, >= and >> # So any operator like < or > must be replaced {:< => "<<", :> => ">>"}[op.to_sym] or op end def fix_dependency(dep) # Deb dependencies are: NAME (OP VERSION), like "zsh (> 3.0)" # Convert anything that looks like 'NAME OP VERSION' to this format. if dep =~ /[\(,\|]/ # Don't "fix" ones that could appear well formed already. else # Convert ones that appear to be 'name op version' name, op, version = dep.split(/ +/) if !version.nil? # Convert strings 'foo >= bar' to 'foo (>= bar)' dep = "#{name} (#{debianize_op(op)} #{version})" end end if dep.start_with?("/") logger.warn("Blanking 'dependency' field '#{dep}' because it's invalid") dep = "" return dep end if dep.include?("rpmlib") logger.warn("Blanking 'dependency' field '#{dep}' because it's invalid") dep = "" return dep end name_re = /^[^ \(]+/ name = dep[name_re] if name =~ /[A-Z]/ logger.warn("Downcasing dependency '#{name}' because deb packages " \ " don't work so good with uppercase names") dep = dep.gsub(name_re) { |n| n.downcase } end if dep.include?("_") logger.warn("Replacing dependency underscores with dashes in '#{dep}' because " \ "debs don't like underscores") dep = dep.gsub("_", "-") end # Convert gem ~> X.Y.Z to '>= X.Y.Z' and << X.Y+1.0 if dep =~ /\(~>/ name, version = dep.gsub(/[()~>]/, "").split(/ +/)[0..1] nextversion = version.split(".").collect { |v| v.to_i } l = nextversion.length if l > 1 nextversion[l-2] += 1 nextversion[l-1] = 0 else # Single component versions ~> 1 nextversion[l-1] += 1 end nextversion = nextversion.join(".") return ["#{name} (>= #{version})", "#{name} (<< #{nextversion})"] elsif (m = dep.match(/(\S+)\s+\(!= (.+)\)/)) # Move '!=' dependency specifications into 'Breaks' self.attributes[:deb_breaks] ||= [] self.attributes[:deb_breaks] << dep.gsub(/!=/,"=") return [] elsif (m = dep.match(/(\S+)\s+\(= (.+)\)/)) and self.attributes[:deb_ignore_iteration_in_dependencies?] # Convert 'foo (= x)' to 'foo (>= x)' and 'foo (<< x+1)' # but only when flag --ignore-iteration-in-dependencies is passed. name, version = m[1..2] nextversion = version.split('.').collect { |v| v.to_i } nextversion[-1] += 1 nextversion = nextversion.join(".") return ["#{name} (>= #{version})", "#{name} (<< #{nextversion})"] elsif (m = dep.match(/(\S+)\s+\(> (.+)\)/)) # Convert 'foo (> x) to 'foo (>> x)' name, version = m[1..2] return ["#{name} (>> #{version})"] else # otherwise the dep is probably fine return dep.rstrip end end # def fix_dependency def valid_provides_field?(text) m = RELATIONSHIP_FIELD_PATTERN.match(text) if m.nil? logger.error("Invalid relationship field for debian package: #{text}") return false end # Per Debian Policy manual, https://www.debian.org/doc/debian-policy/ch-relationships.html#syntax-of-relationship-fields # >> The relations allowed are <<, <=, =, >= and >> for strictly earlier, earlier or equal, # >> exactly equal, later or equal and strictly later, respectively. The exception is the # >> Provides field, for which only = is allowed if m["relation"] == "=" || m["relation"] == nil return true end return false end def valid_relationship_field?(text) m = RELATIONSHIP_FIELD_PATTERN.match(text) if m.nil? logger.error("Invalid relationship field for debian package: #{text}") return false end return true end def fix_provides(provides) name_re = /^[^ \(]+/ name = provides[name_re] if name =~ /[A-Z]/ logger.warn("Downcasing provides '#{name}' because deb packages " \ " don't work so good with uppercase names") provides = provides.gsub(name_re) { |n| n.downcase } end if provides.include?("_") logger.warn("Replacing 'provides' underscores with dashes in '#{provides}' because " \ "debs don't like underscores") provides = provides.gsub("_", "-") end if provides.include?("(") and !provides.include?("(=") logger.warn("Blanking 'provides' field '#{provides}' because it's invalid") provides = "" end if m = provides.match(/^([A-Za-z0-9_-]+)\s*=\s*(\d+.*$)/) logger.warn("Replacing 'provides' entry #{provides} with syntax 'name (= version)'") provides = "#{m[1]} (= #{m[2]})" end return provides.rstrip end def control_path(path=nil) @control_path ||= build_path("control") FileUtils.mkdir(@control_path) if !File.directory?(@control_path) if path.nil? return @control_path else return File.join(@control_path, path) end end # def control_path def write_control_tarball # Use custom Debian control file when given ... write_control # write the control file write_shlibs # write optional shlibs file write_scripts # write the maintainer scripts write_conffiles # write the conffiles write_debconf # write the debconf files write_meta_files # write additional meta files write_triggers # write trigger config to 'triggers' file write_md5sums # write the md5sums file # Tar up the staging_path into control.tar.{compression type} case self.attributes[:deb_compression] when "gz", "bzip2", nil controltar = "control.tar.gz" compression_flags = ["-z"] # gnu tar obeys GZIP environment variable with options for gzip; -n = forget original filename and date compressor_options = {"GZIP" => "-#{self.attributes[:deb_compression_level] || 9}" + "#{'n' if tar_cmd_supports_sort_names_and_set_mtime? and not attributes[:source_date_epoch].nil?}"} when "xz" controltar = "control.tar.xz" compression_flags = ["-J"] compressor_options = {"XZ_OPT" => "-#{self.attributes[:deb_compression_level] || 3}"} when "zst" controltar = "control.tar.zst" compression_flags = ["--use-compress-program", "zstd"] compressor_options = {"ZSTD_CLEVEL" => "-#{self.attributes[:deb_compression_level] || 3}"} when "none" controltar = "control.tar" compression_flags = [] compressor_options = {} else raise FPM::InvalidPackageConfiguration, "Unknown compression type '#{self.attributes[:deb_compression]}'" end # Make the control.tar.gz build_path(controltar).tap do |controltar| logger.info("Creating", :path => controltar, :from => control_path) args = [ tar_cmd, "-C", control_path ] + compression_flags + [ "-cf", controltar, "--owner=0", "--group=0", "--numeric-owner", "." ] if tar_cmd_supports_sort_names_and_set_mtime? and not attributes[:source_date_epoch].nil? # Force deterministic file order and timestamp args += ["--sort=name", ("--mtime=@%s" % attributes[:source_date_epoch])] end args.unshift(compressor_options) safesystem(*args) end logger.debug("Removing no longer needed control dir", :path => control_path) ensure FileUtils.rm_r(control_path) end # def write_control_tarball def write_control # warn user if epoch is set logger.warn("epoch in Version is set", :epoch => self.epoch) if self.epoch # calculate installed-size if necessary: if attributes[:deb_installed_size].nil? logger.info("No deb_installed_size set, calculating now.") total = 0 Find.find(staging_path) do |path| stat = File.lstat(path) next if stat.directory? total += stat.size end # Per http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Installed-Size # "The disk space is given as the integer value of the estimated # installed size in bytes, divided by 1024 and rounded up." attributes[:deb_installed_size] = total / 1024 end # Write the control file control_path("control").tap do |control| if attributes[:deb_custom_control] logger.debug("Using '#{attributes[:deb_custom_control]}' template for the control file") control_data = File.read(attributes[:deb_custom_control]) else logger.debug("Using 'deb.erb' template for the control file") control_data = template("deb.erb").result(binding) end logger.debug("Writing control file", :path => control) File.write(control, control_data) File.chmod(0644, control) edit_file(control) if attributes[:edit?] end end # def write_control # Write out the maintainer scripts # # SCRIPT_MAP is a map from the package ':after_install' to debian # 'post_install' names def write_scripts SCRIPT_MAP.each do |scriptname, filename| next unless script?(scriptname) control_path(filename).tap do |controlscript| logger.debug("Writing control script", :source => filename, :target => controlscript) File.write(controlscript, script(scriptname)) # deb maintainer scripts are required to be executable File.chmod(0755, controlscript) end end end # def write_scripts def write_conffiles # expand recursively a given path to be put in allconfigs def add_path(path, allconfigs) # Strip leading / path = path[1..-1] if path[0,1] == "/" cfg_path = File.expand_path(path, staging_path) Find.find(cfg_path) do |p| if File.file?(p) allconfigs << p.gsub("#{staging_path}/", '') end end end # check for any init scripts or default files inits = attributes.fetch(:deb_init_list, []) defaults = attributes.fetch(:deb_default_list, []) upstarts = attributes.fetch(:deb_upstart_list, []) etcfiles = [] # Add everything in /etc begin if !attributes[:deb_no_default_config_files?] && File.exist?(staging_path("/etc")) logger.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") add_path("/etc", etcfiles) end rescue Errno::ENOENT end return unless (config_files.any? or inits.any? or defaults.any? or upstarts.any? or etcfiles.any?) allconfigs = etcfiles # scan all conf file paths for files and add them config_files.each do |path| logger.debug("Checking if #{path} exists") cfe = File.exist?("#{path}") logger.debug("Check result #{cfe}") begin add_path(path, allconfigs) rescue Errno::ENOENT if !cfe raise FPM::InvalidPackageConfiguration, "Error trying to use '#{path}' as a config file in the package. Does it exist?" else dcl = File.join(staging_path, path) if !File.exist?("#{dcl}") logger.debug("Adding config file #{path} to Staging area #{staging_path}") FileUtils.mkdir_p(File.dirname(dcl)) FileUtils.cp_r path, dcl add_path(path, allconfigs) else logger.debug("Config file aready exists in staging area.") end end end end if attributes[:deb_auto_config_files?] inits.each do |init| name = File.basename(init, ".init") initscript = "/etc/init.d/#{name}" logger.debug("Add conf file declaration for init script", :script => initscript) allconfigs << initscript[1..-1] end defaults.each do |default| name = File.basename(default, ".default") confdefaults = "/etc/default/#{name}" logger.debug("Add conf file declaration for defaults", :default => confdefaults) allconfigs << confdefaults[1..-1] end upstarts.each do |upstart| name = File.basename(upstart, ".upstart") upstartscript = "/etc/init/#{name}.conf" logger.debug("Add conf file declaration for upstart script", :script => upstartscript) allconfigs << upstartscript[1..-1] end end allconfigs.sort!.uniq! return unless allconfigs.any? control_path("conffiles").tap do |conffiles| File.open(conffiles, "w") do |out| allconfigs.each do |cf| # We need to put the leading / back. Stops lintian relative-conffile error. out.puts("/" + cf) end end File.chmod(0644, conffiles) end end # def write_conffiles def write_shlibs return unless attributes[:deb_shlibs] logger.info("Adding shlibs", :content => attributes[:deb_shlibs]) File.open(control_path("shlibs"), "w") do |out| out.write(attributes[:deb_shlibs]) end File.chmod(0644, control_path("shlibs")) end # def write_shlibs def write_debconf if attributes[:deb_config] FileUtils.cp(attributes[:deb_config], control_path("config")) File.chmod(0755, control_path("config")) end if attributes[:deb_templates] FileUtils.cp(attributes[:deb_templates], control_path("templates")) File.chmod(0644, control_path("templates")) end end # def write_debconf def write_meta_files files = attributes[:deb_meta_file] return unless files files.each do |fn| dest = control_path(File.basename(fn)) FileUtils.cp(fn, dest) File.chmod(0644, dest) end end def write_triggers lines = [['interest', :deb_interest], ['activate', :deb_activate], ['interest-noawait', :deb_interest_noawait], ['activate-noawait', :deb_activate_noawait], ].map { |label, attr| (attributes[attr] || []).map { |e| "#{label} #{e}\n" } }.flatten.join('') if lines.size > 0 File.open(control_path("triggers"), 'a') do |f| f.chmod 0644 f.write "\n" if f.size > 0 f.write lines end end end def write_md5sums md5_sums = {} Find.find(staging_path) do |path| if File.file?(path) && !File.symlink?(path) md5 = Digest::MD5.file(path).hexdigest md5_path = path.gsub("#{staging_path}/", "") md5_sums[md5_path] = md5 end end if not md5_sums.empty? File.open(control_path("md5sums"), "w") do |out| md5_sums.each do |path, md5| out.puts "#{md5} #{path}" end end File.chmod(0644, control_path("md5sums")) end end # def write_md5sums def mkdir_p(dir) FileUtils.mkdir_p(dir, :mode => 0755) end def to_s(format=nil) # Default format if nil # git_1.7.9.3-1_amd64.deb return super(format.nil? ? "NAME_FULLVERSION_ARCH.EXTENSION" : format) end # def to_s def data_tar_flags data_tar_flags = [] if attributes[:deb_use_file_permissions?].nil? if !attributes[:deb_user].nil? if attributes[:deb_user] == 'root' data_tar_flags += [ "--numeric-owner", "--owner", "0" ] else data_tar_flags += [ "--owner", attributes[:deb_user] ] end end if !attributes[:deb_group].nil? if attributes[:deb_group] == 'root' data_tar_flags += [ "--numeric-owner", "--group", "0" ] else data_tar_flags += [ "--group", attributes[:deb_group] ] end end end return data_tar_flags end # def data_tar_flags public(:input, :output, :architecture, :name, :prefix, :version, :converted_from, :to_s, :data_tar_flags) end # class FPM::Target::Deb ================================================ FILE: lib/fpm/package/dir.rb ================================================ require "fpm/package" require "fpm/util" require "backports/latest" require "fileutils" require "find" require "socket" # A directory package. # # This class supports both input and output. As a note, 'output' will # only emit the files, not any metadata. This is an effective way # to extract another package type. class FPM::Package::Dir < FPM::Package private # Add a new path to this package. # # A special handling of the path occurs if it includes a '=' symbol. # You can say "source=destination" and it will copy files from that source # to the given destination in the package. # # This lets you take a local directory and map it to the desired location at # packaging time. Such as: "./src/redis-server=/usr/local/bin" will make # the local file ./src/redis-server appear as /usr/local/bin/redis-server in # your package. # # If the path is a directory, it is copied recursively. The behavior # of the copying is modified by the :chdir and :prefix attributes. # # If :prefix is set, the destination path is prefixed with that value. # If :chdir is set, the current directory is changed to that value # during the copy. # # Example: Copy /etc/X11 into this package as /opt/xorg/X11: # # package.attributes[:prefix] = "/opt/xorg" # package.attributes[:chdir] = "/etc" # package.input("X11") def input(path) chdir = attributes[:chdir] || "." # Support mapping source=dest # This mapping should work the same way 'rsync -a' does # Meaning 'rsync -a source dest' # and 'source=dest' in fpm work the same as the above rsync if path =~ /.=./ && !File.exist?(chdir == '.' ? path : File.join(chdir, path)) origin, destination = path.split("=", 2) if File.directory?(origin) && origin[-1,1] == "/" chdir = chdir == '.' ? origin : File.join(chdir, origin) source = "." else origin_dir = File.dirname(origin) chdir = chdir == '.' ? origin_dir : File.join(chdir, origin_dir) source = File.basename(origin) end else source, destination = path, "/" end if attributes[:prefix] destination = File.join(attributes[:prefix], destination) end destination = File.join(staging_path, destination) logger["method"] = "input" begin ::Dir.chdir(chdir) do begin clone(source, destination) rescue Errno::ENOENT => e raise FPM::InvalidPackageConfiguration, "Cannot package the path '#{File.join(chdir, source)}', does it exist?" end end rescue Errno::ENOENT => e raise FPM::InvalidPackageConfiguration, "Cannot chdir to '#{chdir}'. Does it exist?" end # Set some defaults. This is useful because other package types # can include license data from themselves (rpms, gems, etc), # but to make sure a simple dir -> rpm works without having # to specify a license. self.license ||= "unknown" self.vendor ||= [ENV["USER"], Socket.gethostname].join("@") ensure # Clean up any logger context we added. logger.remove("method") end # def input # Output this package to the given directory. def output(output_path) output_check(output_path) output_path = File.expand_path(output_path) ::Dir.chdir(staging_path) do logger["method"] = "output" clone(".", output_path) end # Write the scripts, too. write_scripts ensure logger.remove("method") end # def output private # Copy a file or directory to a destination # # This is special because it respects the full path of the source. # Aditionally, hardlinks will be used instead of copies. # # Example: # # clone("/tmp/hello/world", "/tmp/example") # # The above will copy, recursively, /tmp/hello/world into # /tmp/example/hello/world def clone(source, destination) logger.debug("Cloning path", :source => source, :destination => destination) # Edge case check; abort if the temporary directory is the source. # If the temporary dir is the same path as the source, it causes # fpm to recursively (and forever) copy the staging directory by # accident (#542). if File.expand_path(source) == File.expand_path(::Dir.tmpdir) raise FPM::InvalidPackageConfiguration, "A source directory cannot be the root of your temporary " \ "directory (#{::Dir.tmpdir}). fpm uses the temporary directory " \ "to stage files during packaging, so this setting would have " \ "caused fpm to loop creating staging directories and copying " \ "them into your package! Oops! If you are confused, maybe you could " \ "check your TMPDIR, TMP, or TEMP environment variables?" end # For single file copies, permit file destinations fileinfo = File.lstat(source) destination_is_directory = File.directory?(destination) if fileinfo.file? && !destination_is_directory if destination[-1,1] == "/" copy(source, File.join(destination, source)) else copy(source, destination) end elsif fileinfo.symlink? # Treat them same as files if destination[-1,1] == "/" copy(source, File.join(destination, source)) else copy(source, destination) end else # Copy all files from 'path' into staging_path Find.find(source) do |path| target = File.join(destination, path) copy(path, target) end end end # def clone # Copy a path. # # Files will be hardlinked if possible, but copied otherwise. # Symlinks should be copied as symlinks. def copy(source, destination) logger.debug("Copying path", :source => source, :destination => destination) directory = File.dirname(destination) # lstat to follow symlinks dstat = File.stat(directory) rescue nil if dstat.nil? FileUtils.mkdir_p(directory, :mode => 0755) elsif dstat.directory? # do nothing, it's already a directory! else # It exists and is not a directory. This is probably a user error or a bug. readable_path = directory.gsub(staging_path, "") logger.error("You wanted to copy a file into a directory, but that's not a directory, it's a file!", :path => readable_path, :stat => dstat) raise FPM::InvalidPackageConfiguration, "Tried to treat #{readable_path} like a directory, but it's a file!" end if File.directory?(source) if !File.symlink?(source) # Create a directory if this path is a directory logger.debug("Creating", :directory => destination) if !File.directory?(destination) FileUtils.mkdir(destination) end else # Linking symlinked directories causes a hardlink to be created, which # results in the source directory being wiped out during cleanup, # so copy the symlink. logger.debug("Copying symlinked directory", :source => source, :destination => destination) FileUtils.copy_entry(source, destination) end else # Otherwise try copying the file. begin logger.debug("Copying", :source => source, :destination => destination) copy_entry(source, destination) rescue Errno::EEXIST sane_path = destination.gsub(staging_path, "") logger.error("Cannot copy file, the destination path is probably a directory and I attempted to write a file.", :path => sane_path, :staging => staging_path) end end copy_metadata(source, destination) end # def copy public(:input, :output) end # class FPM::Package::Dir ================================================ FILE: lib/fpm/package/empty.rb ================================================ require "fpm/package" require "backports/latest" # Empty Package type. For strict/meta/virtual package creation class FPM::Package::Empty < FPM::Package def initialize(*args) super(*args) # Override FPM::Package's default "native" architecture value # This feels like the right default because an empty package has no # architecture-specific files, and in most cases an empty package should be # installable anywhere. # # https://github.com/jordansissel/fpm/issues/1846 @architecture = "all" end def output(output_path) logger.warn("Your package has gone into the void.") end def to_s(fmt) return "" end end ================================================ FILE: lib/fpm/package/freebsd.rb ================================================ require "backports/latest" # gem backports/latest require "fpm/package" require "fpm/util" require "digest" require "fileutils" class FPM::Package::FreeBSD < FPM::Package SCRIPT_MAP = { :before_install => "pre-install", :after_install => "post-install", :before_remove => "pre-deinstall", :after_remove => "post-deinstall", } unless defined?(SCRIPT_MAP) option "--origin", "ABI", "Sets the FreeBSD 'origin' pkg field", :default => "fpm/" option "--osversion", "VERSION", "Sets the FreeBSD 'version' pkg field, ie 12 or 13, use '*' for all.", :default => "13" def output(output_path) output_check(output_path) # Build the packaging metadata files. checksums = {} self.files.each do |f| path = staging_path(f) if File.symlink?(path) checksums[f] = "-" elsif File.file?(path) checksums[f] = Digest::SHA256.file(path).hexdigest end end pkg_origin = attributes[:freebsd_origin] if pkg_origin == "fpm/" # fill in default pkg_origin = "fpm/#{name}" end # Follow similar rules to these used in ``to_s_fullversion`` method. # FIXME: maybe epoch should also be introduced somehow ("#{version},#{epoch})? # should it go to pkgdata["version"] or to another place? # https://www.freebsd.org/doc/en/books/porters-handbook/makefile-naming.html pkg_version = (iteration and (iteration.to_i > 0)) ? "#{version}-#{iteration}" : "#{version}" pkgdata = { "arch" => architecture, "name" => name, "version" => pkg_version, "comment" => description, "desc" => description, "origin" => pkg_origin, "maintainer" => maintainer, "www" => url, # prefix is required, but it doesn't seem to matter "prefix" => "/", } # Write +COMPACT_MANIFEST, without the "files" section. File.open(staging_path("+COMPACT_MANIFEST"), "w+") do |file| file.write(pkgdata.to_json + "\n") end # Populate files + checksums, then write +MANIFEST. pkgdata["files"] = {} checksums.each do |f, shasum| # pkg expands % URL-style escapes, so make sure to escape % as %25 pkgdata["files"]["/" + f.gsub("%", "%25")] = shasum end # Populate scripts pkgdata["scripts"] = {} scripts.each do |name, data| pkgdata["scripts"][SCRIPT_MAP[name]] = data end File.open(staging_path("+MANIFEST"), "w+") do |file| file.write(pkgdata.to_json + "\n") end file_list = File.new(build_path("file_list"), "w") files.each do |i| file_list.puts(i) end file_list.close # Create the .txz package archive from the files in staging_path. # We use --files-from here to keep the tar entries from having `./` as the prefix. # This is done as a best effor to mimic what FreeBSD packages do, having everything at the top-level as # file names, like "+MANIFEST" instead of "./+MANIFEST" safesystem("tar", "-Jcf", output_path, "-C", staging_path, "--files-from", build_path("file_list"), "--transform", 's|^\([^+]\)|/\1|') end # def output # Handle architecture naming conversion: # :: def architecture osname = 'FreeBSD' arch = case @architecture when nil, 'native' %x{getconf LONG_BIT}.chomp # 'native' is current arch when 'arm64' 'arm64' when 'aarch64' 'arm64' when 'amd64' 'amd64' when 'x86_64' 'amd64' when 'i386' 'i386' when 'i686' 'i386' when 'any' '*' when 'all' '*' when 'noarch' '*' else %x{getconf LONG_BIT}.chomp # default to native, the current arch end return [osname, attributes[:freebsd_osversion], arch].join(':') end def add_path(tar, tar_path, path) stat = File.lstat(path) if stat.directory? tar.mkdir(tar_path, stat.mode) elsif stat.symlink? tar.add_symlink(tar_path, File.readlink(path), stat.mode) else tar.add_file_simple(tar_path, stat.mode, stat.size) do |io| File.open(path) do |fd| chunk = nil size = 0 while chunk = fd.read(16384) do size += io.write(chunk) end if size != stat.size raise "Failed to add #{path} to the archive; expected to " + "write #{stat.size} bytes, only wrote #{size}" end end end # tar.tar.add_file_simple end end # def add_path def to_s_extension; "txz"; end def to_s_fullversion() # iteration (PORTREVISION on FreeBSD) shall be appended only(?) if non-zero. # https://www.freebsd.org/doc/en/books/porters-handbook/makefile-naming.html (iteration and (iteration.to_i > 0)) ? "#{version}_#{iteration}" : "#{version}" end def to_s(format=nil) return super(format.nil? ? "NAME-FULLVERSION.EXTENSION" : format) end # def to_s end # class FPM::Package::FreeBSD ================================================ FILE: lib/fpm/package/gem.rb ================================================ require "fpm/namespace" require "fpm/package" require "rubygems" require "fileutils" require "fpm/util" require "yaml" # A rubygems package. # # This does not currently support 'output' # # The following attributes are supported: # # * :gem_bin_path # * :gem_package_name_prefix # * :gem_gem class FPM::Package::Gem < FPM::Package # Flags '--foo' will be accessable as attributes[:gem_foo] option "--bin-path", "DIRECTORY", "The directory to install gem executables" option "--package-prefix", "NAMEPREFIX", "(DEPRECATED, use --package-name-prefix) Name to prefix the package " \ "name with." do |value| logger = Cabin::Channel.get logger.warn("Using deprecated flag: --package-prefix. Please use " \ "--package-name-prefix") value end option "--package-name-prefix", "PREFIX", "Name to prefix the package " \ "name with.", :default => "rubygem" option "--gem", "PATH_TO_GEM", "The path to the 'gem' tool (defaults to 'gem' and searches " \ "your $PATH)", :default => "gem" option "--shebang", "SHEBANG", "Replace the shebang in the executables in the bin path with a " \ "custom string", :default => nil option "--fix-name", :flag, "Should the target package name be prefixed?", :default => true option "--fix-dependencies", :flag, "Should the package dependencies be " \ "prefixed?", :default => true option "--env-shebang", :flag, "Should the target package have the " \ "shebang rewritten to use env?", :default => true option "--prerelease", :flag, "Allow prerelease versions of a gem", :default => false option "--disable-dependency", "gem_name", "The gem name to remove from dependency list", :multivalued => true, :attribute_name => :gem_disable_dependencies option "--embed-dependencies", :flag, "Should the gem dependencies " \ "be installed?", :default => false option "--version-bins", :flag, "Append the version to the bins", :default => false option "--stagingdir", "STAGINGDIR", "The directory where fpm installs the gem temporarily before conversion. " \ "Normally a random subdirectory of workdir." option "--git-repo", "GIT_REPO", "Use this git repo address as the source of the gem instead of " \ "rubygems.org.", :default => nil option "--git-branch", "GIT_BRANCH", "When using a git repo as the source of the gem instead of " \ "rubygems.org, use this git branch.", :default => nil # Override parent method def staging_path(path=nil) @gem_staging_path ||= attributes[:gem_stagingdir] || Stud::Temporary.directory("package-#{type}-staging") @staging_path = @gem_staging_path if path.nil? return @staging_path else return File.join(@staging_path, path) end end # def staging_path def input(gem) # 'arg' is the name of the rubygem we should unpack. path_to_gem = download_if_necessary(gem, version) # Got a good gem now (downloaded or otherwise) # # 1. unpack it into staging_path # 2. take the metadata from it and update our wonderful package with it. load_package_info(path_to_gem) install_to_staging(path_to_gem) end # def input def download_if_necessary(gem, gem_version) path = gem if !File.exist?(path) path = download(gem, gem_version) end logger.info("Using gem file", :path => path) return path end # def download_if_necessary def download(gem_name, gem_version=nil) logger.info("Trying to download", :gem => gem_name, :version => gem_version) download_dir = build_path(gem_name) FileUtils.mkdir(download_dir) unless File.directory?(download_dir) if attributes[:gem_git_repo] logger.debug("Git cloning in directory #{download_dir}") safesystem("git", "-C", download_dir, "clone", attributes[:gem_git_repo], ".") if attributes[:gem_git_branch] safesystem("git", "-C", download_dir, "checkout", attributes[:gem_git_branch]) end gem_build = [ "#{attributes[:gem_gem]}", "build", "#{download_dir}/#{gem_name}.gemspec"] ::Dir.chdir(download_dir) do |dir| logger.debug("Building in directory #{dir}") safesystem(*gem_build) end gem_files = ::Dir.glob(File.join(download_dir, "*.gem")) else gem_fetch = [ "#{attributes[:gem_gem]}", "fetch", gem_name] gem_fetch += ["--prerelease"] if attributes[:gem_prerelease?] gem_fetch += ["--version", gem_version] if gem_version ::Dir.chdir(download_dir) do |dir| logger.debug("Downloading in directory #{dir}") safesystem(*gem_fetch) end gem_files = ::Dir.glob(File.join(download_dir, "*.gem")) end if gem_files.length != 1 raise "Unexpected number of gem files in #{download_dir}, #{gem_files.length} should be 1" end return gem_files.first end # def download GEMSPEC_YAML_CLASSES = [ ::Gem::Specification, ::Gem::Version, Time, ::Gem::Dependency, ::Gem::Requirement, Symbol ] def load_package_info(gem_path) # TODO(sissel): Maybe we should check if `safe_load` method exists instead of this version check? if ::Gem::Version.new(RUBY_VERSION) >= ::Gem::Version.new("3.1.0") # Ruby 3.1.0 switched to a Psych/YAML version that defaults to "safe" loading # and unfortunately `gem specification --yaml` emits YAML that requires # class loaders to process correctly spec = YAML.load(%x{#{attributes[:gem_gem]} specification #{gem_path} --yaml}, :permitted_classes => GEMSPEC_YAML_CLASSES) else # Older versions of ruby call this method YAML.safe_load spec = YAML.safe_load(%x{#{attributes[:gem_gem]} specification #{gem_path} --yaml}, GEMSPEC_YAML_CLASSES) end if !attributes[:gem_package_prefix].nil? attributes[:gem_package_name_prefix] = attributes[:gem_package_prefix] end # name prefixing is optional, if enabled, a name 'foo' will become # 'rubygem-foo' (depending on what the gem_package_name_prefix is) self.name = spec.name if attributes[:gem_fix_name?] self.name = fix_name(spec.name) end #self.name = [attributes[:gem_package_name_prefix], spec.name].join("-") self.license = (spec.license or "no license listed in #{File.basename(gem_path)}") # expand spec's version to match RationalVersioningPolicy to prevent cases # where missing 'build' number prevents correct dependency resolution by target # package manager. Ie. for dpkg 1.1 != 1.1.0 m = spec.version.to_s.scan(/(\d+)\.?/) self.version = m.flatten.fill('0', m.length..2).join('.') self.vendor = spec.author self.url = spec.homepage self.category = "Languages/Development/Ruby" # if the gemspec has C extensions defined, then this should be a 'native' arch. if !spec.extensions.empty? self.architecture = "native" else self.architecture = "all" end # make sure we have a description description_options = [ spec.description, spec.summary, "#{spec.name} - no description given" ] self.description = description_options.find { |d| !(d.nil? or d.strip.empty?) } # Upstream rpms seem to do this, might as well share. # TODO(sissel): Figure out how to hint this only to rpm? # maybe something like attributes[:rpm_provides] for rpm specific stuff? # Or just ignore it all together. #self.provides << "rubygem(#{self.name})" # By default, we'll usually automatically provide this, but in the case that we are # composing multiple packages, it's best to explicitly include it in the provides list. self.provides << "#{self.name} = #{self.version}" if !attributes[:no_auto_depends?] && !attributes[:gem_embed_dependencies?] spec.runtime_dependencies.map do |dep| # rubygems 1.3.5 doesn't have 'Gem::Dependency#requirement' if dep.respond_to?(:requirement) reqs = dep.requirement.to_s else reqs = dep.version_requirements end # Some reqs can be ">= a, < b" versions, let's handle that. reqs.to_s.split(/, */).each do |req| if attributes[:gem_disable_dependencies] next if attributes[:gem_disable_dependencies].include?(dep.name) end if attributes[:gem_fix_dependencies?] name = fix_name(dep.name) else name = dep.name end self.dependencies << "#{name} #{req}" end end # runtime_dependencies end #no_auto_depends end # def load_package_info def install_to_staging(gem_path) if attributes.include?(:prefix) && ! attributes[:prefix].nil? installdir = "#{staging_path}/#{attributes[:prefix]}" else gemdir = safesystemout(*[attributes[:gem_gem], 'env', 'gemdir']).chomp installdir = File.join(staging_path, gemdir) end ::FileUtils.mkdir_p(installdir) # TODO(sissel): Allow setting gem tool path args = [attributes[:gem_gem], "install", "--quiet", "--no-user-install", "--install-dir", installdir] if ::Gem::VERSION =~ /^[012]\./ args += [ "--no-ri", "--no-rdoc" ] else # Rubygems 3.0.0 changed --no-ri to --no-document args += [ "--no-document" ] end if !attributes[:gem_embed_dependencies?] args += ["--ignore-dependencies"] end if attributes[:gem_env_shebang?] args += ["-E"] end if attributes.include?(:gem_bin_path) && ! attributes[:gem_bin_path].nil? bin_path = File.join(staging_path, attributes[:gem_bin_path]) else gem_env = safesystemout(*[attributes[:gem_gem], 'env']).split("\n") gem_bin = gem_env.select{ |line| line =~ /EXECUTABLE DIRECTORY/ }.first.split(': ').last bin_path = File.join(staging_path, gem_bin) end args += ["--bindir", bin_path] ::FileUtils.mkdir_p(bin_path) args << gem_path safesystem(*args) # Replace the shebangs in the executables if attributes[:gem_shebang] ::Dir.entries(bin_path).each do |file_name| # exclude . and .. next if ['.', '..'].include?(file_name) # exclude everything which is not a file file_path = File.join(bin_path, file_name) next unless File.ftype(file_path) == 'file' # replace shebang in files if there is one file = File.read(file_path) if file.gsub!(/\A#!.*$/, "#!#{attributes[:gem_shebang]}") File.open(file_path, 'w'){|f| f << file} end end end # Delete bin_path if it's empty, and any empty parents (#612) # Above, we mkdir_p bin_path because rubygems aborts if the parent # directory doesn't exist, for example: # ERROR: While executing gem ... (Errno::ENOENT) # No such file or directory - /tmp/something/weird/bin tmp = bin_path while ::Dir.entries(tmp).size == 2 || tmp == "/" # just [ "..", "." ] is an empty directory logger.info("Deleting empty bin_path", :path => tmp) ::Dir.rmdir(tmp) tmp = File.dirname(tmp) end if attributes[:gem_version_bins?] and File.directory?(bin_path) (::Dir.entries(bin_path) - ['.','..']).each do |bin| FileUtils.mv("#{bin_path}/#{bin}", "#{bin_path}/#{bin}-#{self.version}") end end if attributes[:source_date_epoch_from_changelog?] detect_source_date_from_changelog(installdir) end # Remove generated Makefile and gem_make.out files, if any; they # are not needed, and may contain generated paths that cause # different output on successive runs. Find.find(installdir) do |path| if path =~ /.*(gem_make.out|Makefile|mkmf.log)$/ logger.info("Removing no longer needed file %s to reduce nondeterminism" % path) File.unlink(path) end end end # def install_to_staging # Sanitize package name. # This prefixes the package name with 'rubygem' (but depends on the attribute # :gem_package_name_prefix def fix_name(name) return [attributes[:gem_package_name_prefix], name].join("-") end # def fix_name # Regular expression to accept a gem changelog line, and store date & version, if any, in named capture groups. # Supports formats suggested by http://keepachangelog.com and https://github.com/tech-angels/vandamme # as well as other similar formats that actually occur in the wild. # Build it in pieces for readability, and allow version and date in either order. # Whenever you change this, add a row to the test case in spec/fpm/package/gem_spec.rb. # Don't even try to handle dates that lack four-digit years. # Building blocks: P_RE_LEADIN = '^[#=]{0,3}\s?' P_RE_VERSION_ = '[\w\.-]+\.[\w\.-]+[a-zA-Z0-9]' P_RE_SEPARATOR = '\s[-=/(]?\s?' P_RE_DATE1 = '\d{4}-\d{2}-\d{2}' P_RE_DATE2 = '\w+ \d{1,2}(?:st|nd|rd|th)?,\s\d{4}' P_RE_DATE3 = '\w+\s+\w+\s+\d{1,2},\s\d{4}' P_RE_DATE = "(?#{P_RE_DATE1}|#{P_RE_DATE2}|#{P_RE_DATE3})" P_RE_URL = '\(https?:[-\w/.%]*\)' # In parens, per markdown P_RE_GTMAGIC = '\[\]' # github magic version diff, per chandler P_RE_VERSION = "\\[?(?:Version |v)?(?#{P_RE_VERSION_})\\]?(?:#{P_RE_URL}|#{P_RE_GTMAGIC})?" # The final RE's: P_RE_VERSION_DATE = "#{P_RE_LEADIN}#{P_RE_VERSION}#{P_RE_SEPARATOR}#{P_RE_DATE}" P_RE_DATE_VERSION = "#{P_RE_LEADIN}#{P_RE_DATE}#{P_RE_SEPARATOR}#{P_RE_VERSION}" # Detect release date, if found, store in attributes[:source_date_epoch] def detect_source_date_from_changelog(installdir) name = self.name.sub("rubygem-", "") + "-" + self.version changelog = nil datestr = nil r1 = Regexp.new(P_RE_VERSION_DATE) r2 = Regexp.new(P_RE_DATE_VERSION) # Changelog doesn't have a standard name, so check all common variations # Sort this list using LANG=C, i.e. caps first [ "CHANGELIST", "CHANGELOG", "CHANGELOG.asciidoc", "CHANGELOG.md", "CHANGELOG.rdoc", "CHANGELOG.rst", "CHANGELOG.txt", "CHANGES", "CHANGES.md", "CHANGES.txt", "ChangeLog", "ChangeLog.md", "ChangeLog.txt", "Changelog", "Changelog.md", "Changelog.txt", "changelog", "changelog.md", "changelog.txt", ].each do |changelogname| path = File.join(installdir, "gems", name, changelogname) if File.exist?(path) changelog = path File.open path do |file| file.each_line do |line| if line =~ /#{self.version}/ [r1, r2].each do |r| if r.match(line) datestr = $~[:date] break end end end end end end end if datestr date = Date.parse(datestr) sec = date.strftime("%s") attributes[:source_date_epoch] = sec logger.debug("Gem %s has changelog date %s, setting source_date_epoch to %s" % [name, datestr, sec]) elsif changelog logger.debug("Gem %s changelog %s did not have recognizable date for release %s" % [name, changelog, self.version]) else logger.debug("Gem %s did not have changelog with recognized name" % [name]) # FIXME: check rubygems.org? end end # def detect_source_date_from_changelog public(:input, :output) end # class FPM::Package::Gem ================================================ FILE: lib/fpm/package/npm.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/util" require "fileutils" class FPM::Package::NPM < FPM::Package class << self include FPM::Util end # Flags '--foo' will be accessable as attributes[:npm_foo] option "--bin", "NPM_EXECUTABLE", "The path to the npm executable you wish to run.", :default => "npm" option "--package-name-prefix", "PREFIX", "Name to prefix the package " \ "name with.", :default => "node" option "--registry", "NPM_REGISTRY", "The npm registry to use instead of the default." private def input(package) # Notes: # * npm respects PREFIX settings = { "cache" => build_path("npm_cache"), "loglevel" => "warn", "global" => "true" } settings["registry"] = attributes[:npm_registry] if attributes[:npm_registry_given?] set_default_prefix unless attributes[:prefix_given?] settings["prefix"] = staging_path(attributes[:prefix]) FileUtils.mkdir_p(settings["prefix"]) npm_flags = [] settings.each do |key, value| # npm lets you specify settings in a .npmrc but the same key=value settings # are valid as '--key value' command arguments to npm. Woo! logger.debug("Configuring npm", key => value) npm_flags += [ "--#{key}", value ] end install_args = [ attributes[:npm_bin], "install", # use 'package' or 'package@version' (version ? "#{package}@#{version}" : package) ] # The only way to get npm to respect the 'prefix' setting appears to # be to set the --global flag. #install_args << "--global" install_args += npm_flags safesystem(*install_args) # Query details about our now-installed package. # We do this by using 'npm ls' with json + long enabled to query details # about the installed package. npm_ls_out = safesystemout(attributes[:npm_bin], "ls", "--json", "--long", *npm_flags) npm_ls = JSON.parse(npm_ls_out) name, info = npm_ls["dependencies"].first self.name = [attributes[:npm_package_name_prefix], name].join("-") self.version = info.fetch("version", "0.0.0") if info.include?("repository") self.url = info["repository"]["url"] else self.url = "https://npmjs.org/package/#{self.name}" end self.description = info["description"] # Supposedly you can upload a package for npm with no author/author email # so I'm being safer with this. Author can also be a hash or a string self.vendor = "Unknown " if info.include?("author") author_info = info["author"] # If a hash, assemble into a string if author_info.respond_to? :fetch self.vendor = sprintf("%s <%s>", author_info.fetch("name", "unknown"), author_info.fetch("email", "unknown@unknown.unknown")) else # Probably will need a better check for validity here self.vendor = author_info unless author_info == "" end end # npm installs dependencies in the module itself, so if you do # 'npm install express' it installs dependencies (like 'connect') # to: node_modules/express/node_modules/connect/... # # To that end, I don't think we necessarily need to include # any automatic dependency information since every 'npm install' # is fully self-contained. That's why you don't see any bother, yet, # to include the package's dependencies in here. # # It's possible someone will want to decouple that in the future, # but I will wait for that feature request. end def set_default_prefix attributes[:prefix] = self.class.default_prefix attributes[:prefix_given?] = true end def self.default_prefix npm_prefix = safesystemout("npm", "prefix", "-g").chomp if npm_prefix.count("\n") > 0 raise FPM::InvalidPackageConfiguration, "`npm prefix -g` returned unexpected output." elsif !File.directory?(npm_prefix) raise FPM::InvalidPackageConfiguration, "`npm prefix -g` returned a non-existent directory" end logger.info("Setting default npm install prefix", :prefix => npm_prefix) npm_prefix end public(:input) end # class FPM::Package::NPM ================================================ FILE: lib/fpm/package/osxpkg.rb ================================================ require "fpm/package" require "fpm/util" require "fileutils" require "fpm/package/dir" require 'tempfile' # stdlib require 'pathname' # stdlib # Use an OS X pkg built with pkgbuild. # # Supports input and output. Requires pkgbuild and (for input) pkgutil, part of a # standard OS X install in 10.7 and higher. class FPM::Package::OSXpkg < FPM::Package # Map of what scripts are named. SCRIPT_MAP = { :before_install => "preinstall", :after_install => "postinstall", } unless defined?(SCRIPT_MAP) POSTINSTALL_ACTIONS = [ "logout", "restart", "shutdown" ] OWNERSHIP_OPTIONS = ["recommended", "preserve", "preserve-other"] option "--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." option "--payload-free", :flag, "Define no payload, assumes use of script options.", :default => false option "--ownership", "OWNERSHIP", "--ownership option passed to pkgbuild. Defaults to 'recommended'. " \ "See pkgbuild(1).", :default => 'recommended' do |value| if !OWNERSHIP_OPTIONS.include?(value) raise ArgumentError, "osxpkg-ownership value of '#{value}' is invalid. " \ "Must be one of #{OWNERSHIP_OPTIONS.join(", ")}" end value end option "--postinstall-action", "POSTINSTALL_ACTION", "Post-install action provided in package metadata. " \ "Optionally one of '#{POSTINSTALL_ACTIONS.join("', '")}'." do |value| if !POSTINSTALL_ACTIONS.include?(value) raise ArgumentError, "osxpkg-postinstall-action value of '#{value}' is invalid. " \ "Must be one of #{POSTINSTALL_ACTIONS.join(", ")}" end value end dont_obsolete_paths = [] option "--dont-obsolete", "DONT_OBSOLETE_PATH", "A file path for which to 'dont-obsolete' in the built PackageInfo. " \ "Can be specified multiple times." do |path| dont_obsolete_paths << path end private # return the identifier by prepending the reverse-domain prefix # to the package name, else return just the name def identifier identifier = name.dup if self.attributes[:osxpkg_identifier_prefix] identifier.insert(0, "#{self.attributes[:osxpkg_identifier_prefix]}.") end identifier end # def identifier # scripts_path and write_scripts cribbed from deb.rb def scripts_path(path=nil) @scripts_path ||= build_path("Scripts") FileUtils.mkdir(@scripts_path) if !File.directory?(@scripts_path) if path.nil? return @scripts_path else return File.join(@scripts_path, path) end end # def scripts_path def write_scripts SCRIPT_MAP.each do |scriptname, filename| next unless script?(scriptname) scripts_path(filename).tap do |pkgscript| logger.info("Writing pkg script", :source => filename, :target => pkgscript) File.write(pkgscript, script(scriptname)) # scripts are required to be executable File.chmod(0755, pkgscript) end end end # def write_scripts # Returns path of a processed template PackageInfo given to 'pkgbuild --info' # note: '--info' is undocumented: # http://managingosx.wordpress.com/2012/07/05/stupid-tricks-with-pkgbuild def pkginfo_template_path pkginfo_template = Tempfile.open("fpm-PackageInfo") pkginfo_data = template("osxpkg.erb").result(binding) pkginfo_template.write(pkginfo_data) pkginfo_template.close pkginfo_template.path end # def write_pkginfo_template # Extract name and version from PackageInfo XML def extract_info(package) require 'rexml/document' build_path("expand").tap do |path| doc = REXML::Document.new File.open(File.join(path, "PackageInfo")) pkginfo_elem = doc.elements["pkg-info"] identifier = pkginfo_elem.attribute("identifier").value self.version = pkginfo_elem.attribute("version").value # set name to the last dot element of the identifier self.name = identifier.split(".").last logger.info("inferring name #{self.name} from pkg-id #{identifier}") end end # def extract_info # Take a flat package as input def input(input_path) # TODO: Fail if it's a Distribution pkg or old-fashioned expand_dir = File.join(build_path, "expand") # expand_dir must not already exist for pkgutil --expand safesystem("pkgutil --expand #{input_path} #{expand_dir}") extract_info(input_path) # extract Payload safesystem("tar -xz -f #{expand_dir}/Payload -C #{staging_path}") end # def input # Output a pkgbuild pkg. def output(output_path) output_check(output_path) temp_info = pkginfo_template_path args = ["--identifier", identifier, "--info", temp_info, "--version", version.to_s, "--ownership", attributes[:osxpkg_ownership]] if self.attributes[:osxpkg_payload_free?] args << "--nopayload" else args += ["--root", staging_path] end if attributes[:before_install_given?] or attributes[:after_install_given?] write_scripts args += ["--scripts", scripts_path] end if attributes[:prefix] args += ["--install-location", attributes[:prefix]] end args << output_path safesystem("pkgbuild", *args) FileUtils.remove_file(temp_info) end # def output def to_s_extension; "pkg"; end def to_s(format=nil) return super(format.nil? ? "NAME-VERSION.EXTENSION" : format) end # def to_s public(:input, :output, :identifier, :to_s) end # class FPM::Package::OSXpkg ================================================ FILE: lib/fpm/package/p5p.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "fpm/util" class FPM::Package::P5P < FPM::Package option "--user", "USER", "Set the user to USER in the prototype files.", :default => 'root' option "--group", "GROUP", "Set the group to GROUP in the prototype file.", :default => 'root' option "--zonetype", "ZONETYPE", "Set the allowed zone types (global, nonglobal, both)", :default => 'value=global value=nonglobal' do |value| case @value when "both" value = "value=global value=nonglobal" else value = "value=#{value}" end end # value option "--publisher", "PUBLISHER", "Set the publisher name for the repository", :default => 'FPM' option "--lint" , :flag, "Check manifest with pkglint", :default => true option "--validate", :flag, "Validate with pkg install", :default => true def architecture case @architecture when nil, "native" @architecture = %x{uname -p}.chomp when "all" @architecture = 'i386 value=sparc' end return @architecture end # def architecture def output(output_path) # Fixup the category to an acceptable solaris category case @category when nil, "default" @category = 'Applications/System Utilities' end # Manifest Filename manifest_fn = build_path("#{name}.p5m") # Generate a package manifest. pkg_generate = safesystemout("pkgsend", "generate", "#{staging_path}") File.write(build_path("#{name}.p5m.1"), pkg_generate) # Add necessary metadata to the generated manifest. metadata_template = template("p5p_metadata.erb").result(binding) File.write(build_path("#{name}.mog"), metadata_template) # Combine template and filelist; allow user to edit before proceeding File.open(manifest_fn, "w") do |manifest| manifest.write metadata_template manifest.write pkg_generate end edit_file(manifest_fn) if attributes[:edit?] # Execute the transmogrification on the manifest pkg_mogrify = safesystemout("pkgmogrify", manifest_fn) File.write(build_path("#{name}.p5m.2"), pkg_mogrify) safesystem("cp", build_path("#{name}.p5m.2"), manifest_fn) # Evaluate dependencies. if !attributes[:no_auto_depends?] pkgdepend_gen = safesystemout("pkgdepend", "generate", "-md", "#{staging_path}", manifest_fn) File.write(build_path("#{name}.p5m.3"), pkgdepend_gen) # Allow user to review added dependencies edit_file(build_path("#{name}.p5m.3")) if attributes[:edit?] safesystem("pkgdepend", "resolve", "-m", build_path("#{name}.p5m.3")) safesystem("cp", build_path("#{name}.p5m.3.res"), manifest_fn) end # Final format of manifest safesystem("pkgfmt", manifest_fn) # Final edit for lint check and packaging edit_file(manifest_fn) if attributes[:edit?] # Add any facets or actuators that are needed. # TODO(jcraig): add manpage actuator to enable install wo/ man pages # Verify the package. if attributes[:p5p_lint] then safesystem("pkglint", manifest_fn) end # Publish the package. repo_path = build_path("#{name}_repo") safesystem("pkgrepo", "create", repo_path) safesystem("pkgrepo", "set", "-s", repo_path, "publisher/prefix=#{attributes[:p5p_publisher]}") safesystem("pkgsend", "-s", repo_path, "publish", "-d", "#{staging_path}", "#{build_path}/#{name}.p5m") safesystem("pkgrecv", "-s", repo_path, "-a", "-d", build_path("#{name}.p5p"), name) # Test the package if attributes[:p5p_validate] then safesystem("pkg", "install", "-nvg", build_path("#{name}.p5p"), name) end # Cleanup safesystem("mv", build_path("#{name}.p5p"), output_path) end # def output end # class FPM::Package::IPS ================================================ FILE: lib/fpm/package/pacman.rb ================================================ # -*- coding: utf-8 -*- require "fpm/package" require "fpm/util" require "backports/latest" require "fileutils" require "find" class FPM::Package::Pacman < FPM::Package option "--optional-depends", "PACKAGE", "Add an optional dependency to the pacman package.", :multivalued => true option "--use-file-permissions", :flag, "Use existing file permissions when defining ownership and modes" option "--user", "USER", "The owner of files in this package", :default => 'root' option "--group", "GROUP", "The group owner of files in this package", :default => 'root' # The list of supported compression types. Default is xz (LZMA2) COMPRESSION_TYPES = [ "gz", "bzip2", "xz", "zstd", "none" ] option "--compression", "COMPRESSION", "The compression type to use, must " \ "be one of #{COMPRESSION_TYPES.join(", ")}.", :default => "zstd" do |value| if !COMPRESSION_TYPES.include?(value) raise ArgumentError, "Pacman compression value of '#{value}' is invalid. " \ "Must be one of #{COMPRESSION_TYPES.join(", ")}" end value end def initialize(*args) super(*args) attributes[:pacman_optional_depends] = [] end # def initialize def architecture case @architecture when nil return %x{uname -m}.chomp # default to current arch when "amd64" # Debian uses amd64 return "x86_64" # Arch Linux uses x86_64 when "arm64" # Debian uses arm64 return "aarch64" # Arch Linux ARM uses aarch64 when "armhf" # Debian uses armhf return "arm7hf" # Arch Linux ARM uses arm7hf when "native" return %x{uname -m}.chomp # 'native' is the current arch when "all", "any", "noarch" return "any" else return @architecture end end # def architecture def iteration return @iteration || 1 end # def iteration def config_files return @config_files || [] end # def config_files def dependencies bogus_regex = /[^\sA-Za-z0-9><=+._@-]/ # Actually modifies depencies if they are not right bogus_dependencies = @dependencies.grep bogus_regex if bogus_dependencies.any? @dependencies.reject! { |a| a =~ bogus_regex } logger.warn("Some of the dependencies looked like they weren't package " \ "names. Such dependency entries only serve to confuse arch. " \ "I am removing them.", :removed_dependencies => bogus_dependencies, :fixed_dependencies => @dependencies) end return @dependencies end # This method is invoked on a package when it has been converted to a new # package format. The purpose of this method is to do any extra conversion # steps, like translating dependency conditions, etc. #def converted_from(origin) # nothing to do by default. Subclasses may implement this. # See the RPM package class for an example. #end # def converted_from # Add a new source to this package. # The exact behavior depends on the kind of package being managed. # # For instance: # # * for FPM::Package::Dir, << expects a path to a directory or files. # * for FPM::Package::RPM, << expects a path to an rpm. # # The idea is that you can keep pumping in new things to a package # for later conversion or output. # # Implementations are expected to put files relevant to the 'input' in the # staging_path def input(pacman_pkg_path) control = {} # Unpack the control tarball safesystem(tar_cmd, "-C", staging_path, "-xf", pacman_pkg_path) pkginfo = staging_path(".PKGINFO") mtree = staging_path(".MTREE") install = staging_path(".INSTALL") control_contents = File.read(pkginfo) FileUtils.rm(pkginfo) FileUtils.rm(mtree) control_lines = control_contents.split("\n") control_lines.each do |line| key, val = line.split(/ += +/, 2) if control.has_key? key control[key].push(val) else control[key] = [val] end end self.name = control["pkgname"][0] # Parse 'epoch:version-iteration' in the version string version_re = /^(?:([0-9]+):)?(.+?)(?:-(.*))?$/ m = version_re.match(control["pkgver"][0]) if !m raise "Unsupported version string '#{control["pkgver"][0]}'" end self.epoch, self.version, self.iteration = m.captures self.maintainer = control["packager"][0] # Arch has no notion of vendor, so... #self.vendor = self.url = control["url"][0] # Groups could include more than one. # Speaking of just taking the first entry of the field: # A crude thing to do, but I suppose it's better than nothing. # -- Daniel Haskin, 3/24/2015 self.category = control["group"] && control["group"][0] || self.category # Licenses could include more than one. # Speaking of just taking the first entry of the field: # A crude thing to do, but I suppose it's better than nothing. # -- Daniel Haskin, 3/24/2015 self.license = control["license"][0] || self.license self.architecture = control["arch"][0] self.dependencies = control["depend"] || self.dependencies self.provides = control["provides"] || self.provides self.conflicts = control["conflict"] || self.conflicts self.replaces = control["replaces"] || self.replaces self.description = control["pkgdesc"][0] if control.include? "backup" self.config_files = control["backup"].map{|file| "/" + file} else self.config_files = [] end self.dependencies = control["depend"] || self.dependencies if attributes[:no_auto_depends?] self.dependencies = [] end self.attributes[:pacman_optional_depends] = control["optdepend"] || [] # There are other available attributes, but I didn't include them because: # - makedepend: deps needed to make the arch package. But it's already # made. It just needs to be converted at this point # - checkdepend: See above # - makepkgopt: See above # - size: can be dynamically generated # - builddate: Should be changed to time of package conversion in the new # package, so this value should be thrown away. if File.exist?(install) functions = parse_install_script(install) if functions.include?("pre_install") self.scripts[:before_install] = functions["pre_install"].join("\n") end if functions.include?("post_install") self.scripts[:after_install] = functions["post_install"].join("\n") end if functions.include?("pre_upgrade") self.scripts[:before_upgrade] = functions["pre_upgrade"].join("\n") end if functions.include?("post_upgrade") self.scripts[:after_upgrade] = functions["post_upgrade"].join("\n") end if functions.include?("pre_remove") self.scripts[:before_remove] = functions["pre_remove"].join("\n") end if functions.include?("post_remove") self.scripts[:after_remove] = functions["post_remove"].join("\n") end FileUtils.rm(install) end # Note: didn't use `self.directories`. # Pacman doesn't really record that information, to my knowledge. end # def input def compression_option case self.attributes[:pacman_compression] when nil, "zstd" return "--zstd" when "none" return "" when "gz" return "-z" when "xz" return "--xz" when "bzip2" return "-j" when "zstd" return "--zstd" else return "--zstd" end end def compression_ending case self.attributes[:pacman_compression] when nil, "zstd" return ".zst" when "none" return "" when "gz" return ".gz" when "xz" return ".xz" when "bzip2" return ".bz2" when "zstd" return ".zst" else return ".zst" end end # Output this package to the given path. def output(output_path) output_check(output_path) # Copy all files from staging to BUILD dir Find.find(staging_path) do |path| src = path.gsub(/^#{staging_path}/, '') dst = build_path(src) begin copy_entry(path, dst, preserve=true, remove_destination=true) rescue copy_entry(path, dst, preserve=false, remove_destination=true) end copy_metadata(path, dst) end # This value is used later in the template for PKGINFO size = safesystemout("du", "-sk", build_path).split(/\s+/)[0].to_i * 1024 builddate = Time.new.to_i pkginfo = template("pacman.erb").result(binding) pkginfo_file = build_path(".PKGINFO") File.write(pkginfo_file, pkginfo) if script?(:before_install) or script?(:after_install) or \ script?(:before_upgrade) or script?(:after_upgrade) or \ script?(:before_remove) or script?(:after_remove) install_script = template("pacman/INSTALL.erb").result(binding) install_script_file = build_path(".INSTALL") File.write(install_script_file, install_script) end generate_mtree File.expand_path(output_path).tap do |path| ::Dir.chdir(build_path) do safesystem(*([tar_cmd, compression_option, "-cf", path] + data_tar_flags + \ ::Dir.entries(".").reject{|entry| entry =~ /^\.{1,2}$/ })) end end end # def output def data_tar_flags data_tar_flags = [] if attributes[:pacman_use_file_permissions?].nil? if !attributes[:pacman_user].nil? if attributes[:pacman_user] == 'root' data_tar_flags += [ "--numeric-owner", "--owner", "0" ] else data_tar_flags += [ "--owner", attributes[:deb_user] ] end end if !attributes[:pacman_group].nil? if attributes[:pacman_group] == 'root' data_tar_flags += [ "--numeric-owner", "--group", "0" ] else data_tar_flags += [ "--group", attributes[:deb_group] ] end end end return data_tar_flags end # def data_tar_flags def default_output v = version v = "#{epoch}:#{v}" if epoch if iteration "#{name}_#{v}-#{iteration}_#{architecture}.#{type}" else "#{name}_#{v}_#{architecture}.#{type}" end end # def default_output def to_s_extension; "pkg.tar#{compression_ending}"; end def to_s(format=nil) # Default format if nil # git_1.7.9.3-1-amd64.pkg.tar.xz return super(format.nil? ? "NAME-FULLVERSION-ARCH.EXTENSION" : format) end # def to_s private def generate_mtree ::Dir.chdir(build_path) do cmd = "LANG=C bsdtar " cmd += "-czf .MTREE " cmd += "--format=mtree " cmd += "--options='!all,use-set,type,uid,gid,mode,time,size,md5,sha256,link' " cmd += ::Dir.entries(".").reject{|entry| entry =~ /^\.{1,2}$/ }.join(" ") safesystem(cmd) end end # def generate_mtree # KNOWN ISSUE: # If an un-matched bracket is used in valid bash, as in # `echo "{"`, this function will choke. # However, to cover this case basically # requires writing almost half a bash parser, # and it is a very small corner case. # Otherwise, this approach is very robust. def gobble_function(cons,prod) level = 1 while level > 0 line = cons.next # Not the best, but pretty good # short of writing an *actual* sh # parser level += line.count "{" level -= line.count "}" if level > 0 prod.push(line.rstrip()) else fine = line.sub(/\s*[}]\s*$/, "") if !(fine =~ /^\s*$/) prod.push(fine.rstrip()) end end end end # def gobble_function FIND_SCRIPT_FUNCTION_LINE = /^\s*(\w+)\s*\(\s*\)\s*\{\s*([^}]+?)?\s*(\})?\s*$/ def parse_install_script(path) global_lines = [] look_for = Set.new(["pre_install", "post_install", "pre_upgrade", "post_upgrade", "pre_remove", "post_remove"]) functions = {} look_for.each do |fname| functions[fname] = [] end open(path, "r") do |iscript| lines = iscript.each begin while true line = lines.next # This regex picks up beginning names of posix shell # functions # Examples: # fname() { # fname() { echo hi } m = FIND_SCRIPT_FUNCTION_LINE.match(line) if not m.nil? and look_for.include? m[1] if not m[2].nil? functions[m[1]].push(m[2].rstrip()) end gobble_function(lines, functions[m[1]]) else global_lines.push(line.rstrip()) end end rescue StopIteration end end look_for.each do |name| # Add global lines to each function to preserve global variables, etc. functions[name] = global_lines + functions[name] end return functions end # def parse_install_script end # class FPM::Package::Pacman ================================================ FILE: lib/fpm/package/pear.rb ================================================ require "fpm/namespace" require "fpm/package" require "fileutils" require "fpm/util" # This provides PHP PEAR package support. # # This provides input support, but not output support. class FPM::Package::PEAR < FPM::Package option "--package-name-prefix", "PREFIX", "Name prefix for pear package", :default => "php-pear" option "--channel", "CHANNEL_URL", "The pear channel url to use instead of the default." option "--channel-update", :flag, "call 'pear channel-update' prior to installation" option "--bin-dir", "BIN_DIR", "Directory to put binaries in" option "--php-bin", "PHP_BIN", "Specify php executable path if differs from the os used for packaging" option "--php-dir", "PHP_DIR", "Specify php dir relative to prefix if differs from pear default (pear/php)" option "--data-dir", "DATA_DIR", "Specify php dir relative to prefix if differs from pear default (pear/data)" # Input a PEAR package. # # The parameter is a PHP PEAR package name. # # Attributes that affect behavior here: # * :prefix - changes the install root, default is /usr/share # * :pear_package_name_prefix - changes the def input(input_package) if !program_in_path?("pear") raise ExecutableNotFound.new("pear") end # Create a temporary config file logger.debug("Creating pear config file") config = File.expand_path(build_path("pear.config")) installroot = attributes[:prefix] || "/usr/share" safesystem("pear", "config-create", staging_path(installroot), config) if attributes[:pear_php_dir] logger.info("Setting php_dir", :php_dir => attributes[:pear_php_dir]) safesystem("pear", "-c", config, "config-set", "php_dir", "#{staging_path(installroot)}/#{attributes[:pear_php_dir]}") end if attributes[:pear_data_dir] logger.info("Setting data_dir", :data_dir => attributes[:pear_data_dir]) safesystem("pear", "-c", config, "config-set", "data_dir", "#{staging_path(installroot)}/#{attributes[:pear_data_dir]}") end bin_dir = attributes[:pear_bin_dir] || "usr/bin" logger.info("Setting bin_dir", :bin_dir => bin_dir) safesystem("pear", "-c", config, "config-set", "bin_dir", bin_dir) php_bin = attributes[:pear_php_bin] || "/usr/bin/php" logger.info("Setting php_bin", :php_bin => php_bin) safesystem("pear", "-c", config, "config-set", "php_bin", php_bin) # do channel-discover if required if !attributes[:pear_channel].nil? logger.info("Custom channel specified", :channel => attributes[:pear_channel]) channel_list = safesystemout("pear", "-c", config, "list-channels") if channel_list !~ /#{Regexp.quote(attributes[:pear_channel])}/ logger.info("Discovering new channel", :channel => attributes[:pear_channel]) safesystem("pear", "-c", config, "channel-discover", attributes[:pear_channel]) end input_package = "#{attributes[:pear_channel]}/#{input_package}" logger.info("Prefixing package name with channel", :package => input_package) end # do channel-update if requested if attributes[:pear_channel_update?] channel = attributes[:pear_channel] || "pear" logger.info("Updating the channel", :channel => channel) safesystem("pear", "-c", config, "channel-update", channel) end logger.info("Installing pear package", :package => input_package, :directory => staging_path) ::Dir.chdir(staging_path) do safesystem("pear", "-c", config, "install", "-n", "-f", input_package) end pear_cmd = "pear -c #{config} remote-info #{input_package}" logger.info("Fetching package information", :package => input_package, :command => pear_cmd) name = %x{#{pear_cmd} | sed -ne '/^Package\s*/s/^Package\s*//p'}.chomp self.name = "#{attributes[:pear_package_name_prefix]}-#{name}" self.version = %x{#{pear_cmd} | sed -ne '/^Installed\s*/s/^Installed\s*//p'}.chomp self.description = %x{#{pear_cmd} | sed -ne '/^Summary\s*/s/^Summary\s*//p'}.chomp logger.debug("Package info", :name => self.name, :version => self.version, :description => self.description) # Remove the stuff we don't want delete_these = [".depdb", ".depdblock", ".filemap", ".lock", ".channel", "cache", "temp", "download", ".channels", ".registry"] Find.find(staging_path) do |path| if File.file?(path) logger.info("replacing staging_path in file", :replace_in => path, :staging_path => staging_path) begin content = File.read(path).gsub(/#{Regexp.escape(staging_path)}/, "") File.write(path, content) rescue ArgumentError => e logger.warn("error replacing staging_path in file", :replace_in => path, :error => e) end end FileUtils.rm_r(path) if delete_these.include?(File.basename(path)) end end # def input end # class FPM::Package::PEAR ================================================ FILE: lib/fpm/package/pkgin.rb ================================================ class FPM::Package::Pkgin < FPM::Package def output(output_path) output_check(output_path) File.write(build_path("build-info"), `pkg_info -X pkg_install | egrep '^(MACHINE_ARCH|OPSYS|OS_VERSION|PKGTOOLS_VERSION)'`) cwd = ::Dir.pwd ::Dir.chdir(staging_path) files = [] Find.find(".") do |path| stat = File.lstat(path) next unless stat.symlink? or stat.file? files << path end ::Dir.chdir(cwd) File.write(build_path("packlist"), files.sort.join("\n")) File.write(build_path("comment"), self.description + "\n") File.write(build_path("description"), self.description + "\n") args = [ "-B", build_path("build-info"), "-c", build_path("comment"), "-d", build_path("description"), "-f", build_path("packlist"), "-I", "/opt/local", "-p", staging_path, "-U", "#{cwd}/#{name}-#{self.version}-#{iteration}.tgz" ] safesystem("pkg_create", *args) end def iteration return @iteration ? @iteration : 1 end end ================================================ FILE: lib/fpm/package/pleaserun.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/util" require "fileutils" require "pleaserun/cli" # A pleaserun package. # # This does not currently support 'output' class FPM::Package::PleaseRun < FPM::Package # TODO(sissel): Implement flags. require "pleaserun/platform/systemd" require "pleaserun/platform/upstart" require "pleaserun/platform/launchd" require "pleaserun/platform/sysv" option "--name", "SERVICE_NAME", "The name of the service you are creating" option "--chdir", "CHDIR", "The working directory used by the service" option "--user", "USER", "The user to use for executing this program." private def input(command) platforms = [ ::PleaseRun::Platform::Systemd.new("default"), # RHEL 7, Fedora 19+, Debian 8, Ubuntu 16.04 ::PleaseRun::Platform::Upstart.new("1.5"), # Recent Ubuntus ::PleaseRun::Platform::Upstart.new("0.6.5"), # CentOS 6 ::PleaseRun::Platform::Launchd.new("10.9"), # OS X ::PleaseRun::Platform::SYSV.new("lsb-3.1") # Ancient stuff ] pleaserun_attributes = [ "chdir", "user", "group", "umask", "chroot", "nice", "limit_coredump", "limit_cputime", "limit_data", "limit_file_size", "limit_locked_memory", "limit_open_files", "limit_user_processes", "limit_physical_memory", "limit_stack_size", "log_directory", "log_file_stderr", "log_file_stdout"] attributes[:pleaserun_name] ||= File.basename(command.first) attributes[:prefix] ||= "/usr/share/pleaserun/#{attributes[:pleaserun_name]}" platforms.each do |platform| logger.info("Generating service manifest.", :platform => platform.class.name) platform.program = command.first platform.name = attributes[:pleaserun_name] platform.args = command[1..-1] platform.description = if attributes[:description_given?] attributes[:description] else platform.name end pleaserun_attributes.each do |attribute_name| attribute = "pleaserun_#{attribute_name}".to_sym if attributes.has_key?(attribute) and not attributes[attribute].nil? platform.send("#{attribute_name}=", attributes[attribute]) end end base = staging_path(File.join(attributes[:prefix], "#{platform.platform}/#{platform.target_version || "default"}")) target = File.join(base, "files") actions_script = File.join(base, "install_actions.sh") ::PleaseRun::Installer.install_files(platform, target, false) ::PleaseRun::Installer.write_actions(platform, actions_script) end libs = [ "install.sh", "install-path.sh", "generate-cleanup.sh" ] libs.each do |file| base = staging_path(File.join(attributes[:prefix])) File.write(File.join(base, file), template(File.join("pleaserun", file)).result(binding)) File.chmod(0755, File.join(base, file)) end scripts[:after_install] = template(File.join("pleaserun", "scripts", "after-install.sh")).result(binding) scripts[:before_remove] = template(File.join("pleaserun", "scripts", "before-remove.sh")).result(binding) end # def input public(:input) end # class FPM::Package::PleaseRun ================================================ FILE: lib/fpm/package/puppet.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "etc" require "fileutils" class FPM::Package::Puppet < FPM::Package def architecture case @architecture when nil, "native" @architecture = %x{uname -m}.chomp end return @architecture end # def architecture # Default specfile generator just makes one specfile, whatever that is for # this package. def generate_specfile(builddir) paths = [] logger.info("PWD: #{File.join(builddir, unpack_data_to)}") fileroot = File.join(builddir, unpack_data_to) Dir.chdir(fileroot) do Find.find(".") do |p| next if p == "." paths << p end end logger.info(paths[-1]) manifests = %w{package.pp package/remove.pp} ::Dir.mkdir(File.join(builddir, "manifests")) manifests.each do |manifest| dir = File.join(builddir, "manifests", File.dirname(manifest)) logger.info("manifests targeting: #{dir}") ::Dir.mkdir(dir) if !File.directory?(dir) File.open(File.join(builddir, "manifests", manifest), "w") do |f| logger.info("manifest: #{f.path}") template = template(File.join("puppet", "#{manifest}.erb")) ::Dir.chdir(fileroot) do f.puts template.result(binding) end end end end # def generate_specfile def unpack_data_to "files" end def build!(params) # TODO(sissel): Support these somehow, perhaps with execs and files. self.scripts.each do |name, path| case name when "pre-install" when "post-install" when "pre-uninstall" when "post-uninstall" end # case name end # self.scripts.each if File.exist?(params[:output]) # TODO(sissel): Allow folks to choose output? logger.error("Puppet module directory '#{params[:output]}' already " \ "exists. Delete it or choose another output (-p flag)") end ::Dir.mkdir(params[:output]) builddir = ::Dir.pwd # Copy 'files' from builddir to :output/files Find.find("files", "manifests") do |path| logger.info("Copying path: #{path}") if File.directory?(path) ::Dir.mkdir(File.join(params[:output], path)) else FileUtils.cp(path, File.join(params[:output], path)) end end end # def build! # The directory we create should just be the name of the package as the # module name def default_output name end # def default_output # This method is used by the puppet manifest template def puppetsort(hash) # TODO(sissel): Implement sorting that follows the puppet style guide # Such as, 'ensure' goes first, etc. return hash.to_a end # def puppetsort # Helper for user lookup def uid2user(uid) begin pwent = Etc.getpwuid(uid) return pwent.name rescue ArgumentError => e # Invalid user id? No user? Return the uid. logger.warn("Failed to find username for uid #{uid}") return uid.to_s end end # def uid2user # Helper for group lookup def gid2group(gid) begin grent = Etc.getgrgid(gid) return grent.name rescue ArgumentError => e # Invalid user id? No user? Return the uid. logger.warn("Failed to find group for gid #{gid}") return gid.to_s end end # def uid2user end # class FPM::Target::Puppet ================================================ FILE: lib/fpm/package/pyfpm/__init__.py ================================================ __all__ = [ "get_metadata" ] ================================================ FILE: lib/fpm/package/pyfpm/parse_requires.py ================================================ #!/usr/bin/env python3 #import pkg_resources import packaging.requirements import packaging.markers import json import sys # Expect requirements lines via stdin. #requirements = pkg_resources.parse_requirements(sys.stdin) # Process environment markers, if any, and produce a list of requirements for the current environment. def evaluate_requirements(fd): all_requirements = [packaging.requirements.Requirement(line) for line in sys.stdin] default_env = packaging.markers.default_environment() for req in all_requirements: if req.marker is None or req.marker.evaluate(environment=default_env): if len(req.specifier) > 0: for spec in req.specifier: yield "%s%s" % (req.name, spec) else: yield str(req.name) print(json.dumps(list(evaluate_requirements(sys.stdin)))) ================================================ FILE: lib/fpm/package/python.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/util" require "rubygems/package" require "rubygems" require "fileutils" require "tmpdir" require "json" # Support for python packages. # # This supports input, but not output. # # Example: # # # Download the django python package: # pkg = FPM::Package::Python.new # pkg.input("Django") # class FPM::Package::Python < FPM::Package # Flags '--foo' will be accessable as attributes[:python_foo] option "--bin", "PYTHON_EXECUTABLE", "The path to the python executable you wish to run.", :default => "python" option "--easyinstall", "EASYINSTALL_EXECUTABLE", "The path to the easy_install executable tool", :default => "easy_install" option "--pip", "PIP_EXECUTABLE", "The path to the pip executable tool. If not specified, easy_install " \ "is used instead", :default => nil option "--pypi", "PYPI_URL", "PyPi Server uri for retrieving packages.", :default => "https://pypi.python.org/simple" option "--trusted-host", "PYPI_TRUSTED", "Mark this host or host:port pair as trusted for pip", :default => nil option "--package-prefix", "NAMEPREFIX", "(DEPRECATED, use --package-name-prefix) Name to prefix the package " \ "name with." do |value| logger.warn("Using deprecated flag: --package-prefix. Please use " \ "--package-name-prefix") value end option "--package-name-prefix", "PREFIX", "Name to prefix the package " \ "name with.", :default => "python" option "--fix-name", :flag, "Should the target package name be prefixed?", :default => true option "--fix-dependencies", :flag, "Should the package dependencies be " \ "prefixed?", :default => true option "--downcase-name", :flag, "Should the target package name be in " \ "lowercase?", :default => true option "--downcase-dependencies", :flag, "Should the package dependencies " \ "be in lowercase?", :default => true option "--install-bin", "BIN_PATH", "(DEPRECATED, does nothing) The path to where python scripts " \ "should be installed to." do logger.warn("Using deprecated flag --install-bin") end option "--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()'" do logger.warn("Using deprecated flag --install-bin") end option "--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" do logger.warn("Using deprecated flag --install-bin") end option "--dependencies", :flag, "Include requirements defined by the python package" \ " as dependencies.", :default => true option "--obey-requirements-txt", :flag, "Use a requirements.txt file " \ "in the top-level directory of the python package for dependency " \ "detection.", :default => false option "--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." do logger.warn("Using deprecated flag --install-bin") end option "--disable-dependency", "python_package_name", "The python package name to remove from dependency list", :multivalued => true, :attribute_name => :python_disable_dependency, :default => [] option "--setup-py-arguments", "setup_py_argument", "(DEPRECATED) Arbitrary argument(s) to be passed to setup.py", :multivalued => true, :attribute_name => :python_setup_py_arguments, :default => [] do logger.warn("Using deprecated flag --install-bin") end option "--internal-pip", :flag, "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", :attribute_name => :python_internal_pip, :default => true class PythonMetadata require "strscan" class MissingField < StandardError; end class UnexpectedContent < StandardError; end # According to https://packaging.python.org/en/latest/specifications/core-metadata/ # > Core Metadata v2.4 - August 2024 MULTIPLE_USE = %w(Dynamic Platform Supported-Platform License-File Classifier Requires-Dist Requires-External Project-URL Provides-Extra Provides-Dist Obsoletes-Dist) # METADATA files are described in Python Packaging "Core Metadata"[1] and appear to have roughly RFC822 syntax. # [1] https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata def self.parse(input) s = StringScanner.new(input) headers = {} # Default "Multiple use" fields to empty array instead of nil. MULTIPLE_USE.each do |field| headers[field] = [] end while !s.eos? and !s.scan(/\n/) do # Field is non-space up, but excluding the colon field = s.scan(/[^\s:]+/) # Skip colon and following whitespace s.scan(/:\s*/) # Value is text until newline, and any following lines if they have leading spaces. value = s.scan(/[^\n]+(?:\Z|\n(?:[ \t][^\n]+\n)*)/) if value.nil? raise "Failed parsing Python package metadata value at field #{field}, char offset #{s.pos}" end value = value.chomp if MULTIPLE_USE.include?(field) raise "Header field should be an array. This is a bug in fpm." if !headers[field].is_a?(Array) headers[field] << value else headers[field] = value end end # while reading headers # If there's more content beyond the last header, then it's a content body. # In Python Metadata >= 2.1, the descriptino can be written in the body. if !s.eos? if headers["Metadata-Version"].to_f >= 2.1 # Per Python core-metadata spec: # > Changed in version 2.1: This field may be specified in the message body instead. #return PythonMetadata.new(headers, s.string[s.pos ...]) return headers, s.string[s.pos .. -1] elsif headers["Metadata-Version"].to_f >= 2.0 # dnspython v1.15.0 has a description body and Metadata-Version 2.0 # this seems out of spec, but let's accept it anyway. return headers, s.string[s.pos .. -1] else raise "After reading METADATA headers, extra data is in the file but was not expected. This may be a bug in fpm." end end #return PythonMetadata.new(headers) return headers, nil # nil means no body in this metadata rescue => e puts "String scan failed: #{e}" puts "Position: #{s.pointer}" puts "---" puts input puts "===" puts input[s.pointer..-1] puts "---" raise e end # self.parse def self.from(input) return PythonMetadata.new(*parse(input)) end # Only focusing on terms fpm may care about attr_reader :name, :version, :summary, :description, :keywords, :maintainer, :license, :requires, :homepage FIELD_MAP = { :@name => "Name", :@version => "Version", :@summary => "Summary", :@description => "Description", :@keywords => "Keywords", :@maintainer => "Author-email", # Note: License can also come from the deprecated "License" field # This is processed later in this method. :@license => "License-Expression", :@requires => "Requires-Dist", } REQUIRED_FIELDS = [ "Metadata-Version", "Name", "Version" ] # headers - a Hash containing field-value pairs from headers as read from a python METADATA file. # body - optional, a string containing the body text of a METADATA file def initialize(headers, body=nil) REQUIRED_FIELDS.each do |field| if !headers.include?(field) raise MissingField, "Missing required Python metadata field, '#{field}'. This might be a bug in the package or in fpm." end end FIELD_MAP.each do |attr, field| if headers.include?(field) instance_variable_set(attr, headers.fetch(field)) end end # Do any extra processing on fields to turn them into their expected content. process_description(headers, body) process_license(headers) process_homepage(headers) process_maintainer(headers) end # def initialize private def process_description(headers, body) if @description # Per python core-metadata spec: # > To support empty lines and lines with indentation with respect to the # > RFC 822 format, any CRLF character has to be suffixed by 7 spaces # > followed by a pipe (“|”) char. As a result, the Description field is # > encoded into a folded field that can be interpreted by RFC822 parser [2]. @description = @description.gsub!(/^ |/, "") end if !body.nil? if headers["Metadata-Version"].to_f >= 2.1 # Per Python core-metadata spec: # > Changed in version 2.1: [Description] field may be specified in the message body instead. # # The description is simply the rest of the METADATA file after the headers. @description = body elsif headers["Metadata-Version"].to_f >= 2.0 # dnspython v1.15.0 has a description body and Metadata-Version 2.0 # this seems out of spec, but let's accept it anyway. @description = body else raise UnexpectedContent, "Found a content body in METADATA file, but Metadata-Version(#{headers["Metadata-Version"]}) is below 2.1 and doesn't support this. This may be a bug in fpm or a malformed python package." end # What to do if we find a description body but already have a Description field set in the headers? if headers.include?("Description") raise "Found a description in the body of the python package metadata, but the package already set the Description field. I don't know what to do. This is probably a bug in fpm." end end # XXX: The description field can be markdown, plain text, or reST. # Content type is noted in the "Description-Content-Type" field # Should we transform this to plain text? end # process_description def process_license(headers) # Ignore the "License" field if License-Expression is also present. return if headers["Metadata-Version"].to_f >= 2.4 && headers.include?("License-Expression") # Deprecated field, License, as described in python core-metadata: # > As of Metadata 2.4, License and License-Expression are mutually exclusive. # > If both are specified, tools which parse metadata will disregard License # > and PyPI will reject uploads. See PEP 639. if headers["License"] # Note: This license can be free form text, so it's unclear if it's a great choice. # however, the original python metadata License field is quite old/deprecated # so maybe nobody uses it anymore? @license = headers["License"] elsif license_classifier = headers["Classifier"].find { |value| value =~ /^License ::/ } # The license could also show up in the "Classifier" header with "License ::" as a prefix. @license = license_classifier.sub(/^License ::/, "") end # check for deprecated License field end # process_license def process_homepage(headers) return if headers["Project-URL"].empty? # Create a hash of Project-URL where the label is the key, url the value. urls = Hash[*headers["Project-URL"].map do |text| label, url = text.split(/, */, 2) # Normalize the label by removing punctuation and spaces # Reference: https://packaging.python.org/en/latest/specifications/well-known-project-urls/#label-normalization # > In plain language: a label is normalized by deleting all ASCII punctuation and whitespace, and then converting the result to lowercase. label = label.gsub(/[[:punct:][:space:]]/, "").downcase [label, url] end.flatten(1)] # Prioritize certain URL labels when choosing the homepage url. [ "homepage", "source", "documentation", "releasenotes" ].each do |label| if urls.include?(label) @homepage = urls[label] end end # Otherwise, default to the first URL @homepage = urls.values.first end def process_maintainer(headers) # Python metadata supports both "Author-email" and "Maintainer-email" # Of the "Maintainer" fields, python core-metadata says: # > Note that this field is intended for use when a project is being maintained by someone other than the original author # # So we should prefer Maintainer-email if it exists, but fall back to Author-email otherwise. @maintainer = headers["Maintainer-email"] unless headers["Maintainer-email"].nil? end end # class PythonMetadata # Input a package. # # The 'package' can be any of: # # * A name of a package on pypi (ie; easy_install some-package) # * The path to a directory containing setup.py or pyproject.toml # * The path to a setup.py or pyproject.toml # * The path to a python sdist file ending in .tar.gz # * The path to a python wheel file ending in .whl def input(package) explore_environment path_to_package = download_if_necessary(package, version) # Expect a setup.py or pyproject.toml if it's a directory. if File.directory?(path_to_package) if !(File.exist?(File.join(path_to_package, "setup.py")) or File.exist?(File.join(path_to_package, "pyproject.toml"))) raise FPM::InvalidPackageConfiguration, "The path ('#{path_to_package}') doesn't appear to be a python package directory. I expected either a pyproject.toml or setup.py but found neither." end end if File.file?(path_to_package) if ["setup.py", "pyproject.toml"].include?(File.basename(path_to_package)) path_to_package = File.dirname(path_to_package) end end if [".tar.gz", ".tgz"].any? { |suffix| path_to_package.end_with?(suffix) } # Have pip convert the .tar.gz (source dist?) into a wheel logger.debug("Found tarball and assuming it's a python source package.") safesystem(*attributes[:python_pip], "wheel", "--no-deps", "-w", build_path, path_to_package) path_to_package = ::Dir.glob(build_path("*.whl")).first if path_to_package.nil? raise FPM::InvalidPackageConfiguration, "Failed building python package format - fpm tried to build a python wheel, but didn't find the .whl file. This might be a bug in fpm." end elsif File.directory?(path_to_package) logger.debug("Found directory and assuming it's a python source package.") safesystem(*attributes[:python_pip], "wheel", "--no-deps", "-w", build_path, path_to_package) if attributes[:python_obey_requirements_txt?] reqtxt = File.join(path_to_package, "requirements.txt") @requirements_txt = File.read(reqtxt).split("\n") if File.file?(reqtxt) end path_to_package = ::Dir.glob(build_path("*.whl")).first if path_to_package.nil? raise FPM::InvalidPackageConfiguration, "Failed building python package format - fpm tried to build a python wheel, but didn't find the .whl file. This might be a bug in fpm." end end load_package_info(path_to_package) install_to_staging(path_to_package) end # def input def explore_environment if !attributes[:python_bin_given?] # If --python-bin isn't set, try to find a good default python executable path, because it might not be "python" pythons = [ "python", "python3", "python2" ] default_python = pythons.find { |py| program_exists?(py) } if default_python.nil? raise FPM::Util::ExecutableNotFound, "Could not find any python interpreter. Tried the following: #{pythons.join(", ")}" end logger.info("Setting default python executable", :name => default_python) attributes[:python_bin] = default_python if !attributes[:python_package_name_prefix_given?] attributes[:python_package_name_prefix] = default_python logger.info("Setting package name prefix", :name => default_python) end end if attributes[:python_internal_pip?] # XXX: Should we detect if internal pip is available? attributes[:python_pip] = [ attributes[:python_bin], "-m", "pip"] end end # explore_environment # Download the given package if necessary. If version is given, that version # will be downloaded, otherwise the latest is fetched. def download_if_necessary(package, version=nil) path = package # If it's a path, assume local build. if File.exist?(path) return path if File.directory?(path) basename = File.basename(path) return File.dirname(path) if basename == "pyproject.toml" return File.dirname(path) if basename == "setup.py" return path if path.end_with?(".tar.gz") return path if path.end_with?(".tgz") # amqplib v1.0.2 does this return path if path.end_with?(".whl") return path if path.end_with?(".zip") return path if File.exist?(File.join(path, "setup.py")) return path if File.exist?(File.join(path, "pyproject.toml")) raise [ "Local file doesn't appear to be a supported type for a python package. Expected one of:", " - A directory containing setup.py or pyproject.toml", " - A file ending in .tar.gz (a python source dist)", " - A file ending in .whl (a python wheel)", ].join("\n") end logger.info("Trying to download", :package => package) if version.nil? want_pkg = "#{package}" else want_pkg = "#{package}==#{version}" end target = build_path(package) FileUtils.mkdir(target) unless File.directory?(target) # attributes[:python_pip] -- expected to be a path if attributes[:python_pip] logger.debug("using pip", :pip => attributes[:python_pip]) pip = [attributes[:python_pip]] if pip.is_a?(String) setup_cmd = [ *attributes[:python_pip], "download", "--no-clean", "--no-deps", "-d", target, "-i", attributes[:python_pypi], ] if attributes[:python_trusted_host] setup_cmd += [ "--trusted-host", attributes[:python_trusted_host], ] end setup_cmd << want_pkg safesystem(*setup_cmd) files = ::Dir.entries(target).select { |entry| entry =~ /\.(whl|tgz|tar\.gz|zip)$/ } if files.length != 1 raise "Unexpected directory layout after `pip download ...`. This might be an fpm bug? The directory contains these files: #{files.inspect}" end return File.join(target, files.first) else # no pip, use easy_install logger.debug("no pip, defaulting to easy_install", :easy_install => attributes[:python_easyinstall]) safesystem(attributes[:python_easyinstall], "-i", attributes[:python_pypi], "--editable", "-U", "--build-directory", target, want_pkg) # easy_install will put stuff in @tmpdir/packagename/, so find that: # @tmpdir/somepackage/setup.py #dirs = ::Dir.glob(File.join(target, "*")) files = ::Dir.entries(target).filter { |entry| entry != "." && entry != ".." } if dirs.length != 1 raise "Unexpected directory layout after easy_install. Maybe file a bug? The directory is #{build_path}" end return dirs.first end end # def download # Load the package information like name, version, dependencies. def load_package_info(path) if path.end_with?(".whl") # XXX: Maybe use rubyzip to parse the .whl (zip) file instead? metadata = nil execmd(["unzip", "-p", path, "*.dist-info/METADATA"], :stdin => false, :stderr => false) do |stdout| metadata = PythonMetadata.from(stdout.read(64<<10)) end wheeldata = nil execmd(["unzip", "-p", path, "*.dist-info/WHEEL"], :stdin => false, :stderr => false) do |stdout| wheeldata, _ = PythonMetadata.parse(stdout.read(64<<10)) end else raise "Unexpected python package path. This might be an fpm bug? The path is #{path}" end self.architecture = wheeldata["Root-Is-Purelib"] == "true" ? "all" : "native" self.description = metadata.description unless metadata.description.nil? self.license = metadata.license unless metadata.license.nil? self.version = metadata.version self.url = metadata.homepage unless metadata.homepage.nil? self.name = metadata.name # name prefixing is optional, if enabled, a name 'foo' will become # 'python-foo' (depending on what the python_package_name_prefix is) self.name = fix_name(self.name) if attributes[:python_fix_name?] # convert python-Foo to python-foo if flag is set self.name = self.name.downcase if attributes[:python_downcase_name?] self.maintainer = metadata.maintainer if !attributes[:no_auto_depends?] and attributes[:python_dependencies?] # Python Dependency specifiers are a somewhat complex format described here: # https://packaging.python.org/en/latest/specifications/dependency-specifiers/#environment-markers # # We can ask python's packaging module to parse and evaluate these. # XXX: Allow users to override environnment values. # # Example: # Requires-Dist: tzdata; sys_platform = win32 # Requires-Dist: asgiref>=3.8.1 dep_re = /^([^<>!= ]+)\s*(?:([~<>!=]{1,2})\s*(.*))?$/ reqs = [] # --python-obey-requirements-txt should use requirements.txt # (if found in the python package) and replace the requirments listed from the metadata if attributes[:python_obey_requirements_txt?] && !@requirements_txt.nil? requires = @requirements_txt else requires = metadata.requires end # Evaluate python package requirements and only show ones matching the current environment # (Environment markers, etc) # Additionally, 'extra' features such as a requirement named `django[bcrypt]` isn't quite supported yet, # since the marker.evaluate() needs to be passed some environment like { "extra": "bcrypt" } execmd([attributes[:python_bin], File.expand_path(File.join("pyfpm", "parse_requires.py"), File.dirname(__FILE__))]) do |stdin, stdout, stderr| requires.each { |r| stdin.puts(r) } stdin.close data = stdout.read logger.pipe(stderr => :warn) reqs += JSON.parse(data) end reqs.each do |dep| match = dep_re.match(dep) if match.nil? logger.error("Unable to parse dependency", :dependency => dep) raise FPM::InvalidPackageConfiguration, "Invalid dependency '#{dep}'" end name, cmp, version = match.captures next if attributes[:python_disable_dependency].include?(name) # convert == to = if cmp == "==" or cmp == "~=" logger.info("Converting == dependency requirement to =", :dependency => dep ) cmp = "=" end # dependency name prefixing is optional, if enabled, a name 'foo' will # become 'python-foo' (depending on what the python_package_name_prefix # is) name = fix_name(name) if attributes[:python_fix_dependencies?] # convert dependencies from python-Foo to python-foo name = name.downcase if attributes[:python_downcase_dependencies?] if cmp.nil? && version.nil? self.dependencies << "#{name}" else self.dependencies << "#{name} #{cmp} #{version}" end end # parse Requires-Dist dependencies end # if attributes[:python_dependencies?] end # def load_package_info # Sanitize package name. # Some PyPI packages can be named 'python-foo', so we don't want to end up # with a package named 'python-python-foo'. # But we want packages named like 'pythonweb' to be suffixed # 'python-pythonweb'. def fix_name(name) if name.start_with?("python") # If the python package is called "python-foo" strip the "python-" part while # prepending the package name prefix. return [attributes[:python_package_name_prefix], name.gsub(/^python-/, "")].join("-") else return [attributes[:python_package_name_prefix], name].join("-") end end # def fix_name # Install this package to the staging directory def install_to_staging(path) prefix = "/" prefix = attributes[:prefix] unless attributes[:prefix].nil? # XXX: Note: pip doesn't seem to have any equivalent to `--install-lib` or similar flags. # XXX: Deprecate :python_install_data, :python_install_lib, :python_install_bin # XXX: Deprecate: :python_setup_py_arguments flags = [ "--root", staging_path ] flags += [ "--prefix", prefix ] if !attributes[:prefix].nil? safesystem(*attributes[:python_pip], "install", "--no-deps", "--ignore-installed", *flags, path) end # def install_to_staging public(:input) end # class FPM::Package::Python ================================================ FILE: lib/fpm/package/rpm.rb ================================================ require "fpm/package" require "backports/latest" require "fileutils" require "find" require "arr-pm/file" # gem 'arr-pm' # For conversion handling require "fpm/package/gem" # RPM Package type. # # Build RPMs without having to waste hours reading Maximum-RPM. # Well, in case you want to read it, here: http://www.rpm.org/max-rpm/ # # The following attributes are supported: # # * :rpm_rpmbuild_define - an array of definitions to give to rpmbuild. # These are used, verbatim, each as: --define ITEM class FPM::Package::RPM < FPM::Package DIGEST_ALGORITHM_MAP = { "md5" => 1, "sha1" => 2, "sha256" => 8, "sha384" => 9, "sha512" => 10 } unless defined?(DIGEST_ALGORITHM_MAP) COMPRESSION_MAP = { "none" => "w0.gzdio", "xz" => ".xzdio", "xzmt" => "T.xzdio", "gzip" => ".gzdio", "bzip2" => ".bzdio" } unless defined?(COMPRESSION_MAP) option "--use-file-permissions", :flag, "Use existing file permissions when defining ownership and modes." option "--user", "USER", "Set the user to USER in the %files section. Overrides the user when used with use-file-permissions setting." option "--group", "GROUP", "Set the group to GROUP in the %files section. Overrides the group when used with use-file-permissions setting." option "--defattrfile", "ATTR", "Set the default file mode (%defattr).", :default => '-' do |value| value end option "--defattrdir", "ATTR", "Set the default dir mode (%defattr).", :default => '-' do |value| value end rpmbuild_define = [] option "--rpmbuild-define", "DEFINITION", "Pass a --define argument to rpmbuild." do |define| rpmbuild_define << define next rpmbuild_define end option "--dist", "DIST-TAG", "Set the rpm distribution." option "--digest", DIGEST_ALGORITHM_MAP.keys.join("|"), "Select a digest algorithm. md5 works on the most platforms.", :default => "md5" do |value| if !DIGEST_ALGORITHM_MAP.include?(value.downcase) raise "Unknown digest algorithm '#{value}'. Valid options " \ "include: #{DIGEST_ALGORITHM_MAP.keys.join(", ")}" end value.downcase end option "--compression-level", "[0-9]", "Select a compression level. 0 is store-only. 9 is max compression.", :default => "9" do |value| valint = value.to_i unless value =~ /^\d$/ && valint >= 0 && valint <= 9 raise "Invalid compression level '#{value}'. Valid values are integers between 0 and 9 inclusive." end valint end option "--compression", COMPRESSION_MAP.keys.join("|"), "Select a compression method. gzip works on the most platforms.", :default => "gzip" do |value| if !COMPRESSION_MAP.include?(value.downcase) raise "Unknown compression type '#{value}'. Valid options " \ "include: #{COMPRESSION_MAP.keys.join(", ")}" end value.downcase end # TODO(sissel): Try to be smart about the default OS. # issue #309 option "--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" option "--changelog", "FILEPATH", "Add changelog from FILEPATH contents" do |file| File.read(File.expand_path(file)) end option "--summary", "SUMMARY", "Set the RPM summary. Overrides the first line on the description if set" option "--sign", :flag, "Pass --sign to rpmbuild" option "--auto-add-directories", :flag, "Auto add directories not part of filesystem" option "--auto-add-exclude-directories", "DIRECTORIES", "Additional directories ignored by '--rpm-auto-add-directories' flag", :multivalued => true, :attribute_name => :auto_add_exclude_directories option "--autoreqprov", :flag, "Enable RPM's AutoReqProv option" option "--autoreq", :flag, "Enable RPM's AutoReq option" option "--autoprov", :flag, "Enable RPM's AutoProv option" option "--attr", "ATTRFILE", "Set the attribute for a file (%attr), e.g. --rpm-attr 750,user1,group1:/some/file", :multivalued => true, :attribute_name => :attrs option "--init", "FILEPATH", "Add FILEPATH as an init script", :multivalued => true do |file| next File.expand_path(file) end rpmbuild_filter_from_provides = [] option "--filter-from-provides", "REGEX", "Set %filter_from_provides to the supplied REGEX." do |filter_from_provides| rpmbuild_filter_from_provides << filter_from_provides next rpmbuild_filter_from_provides end rpmbuild_filter_from_requires = [] option "--filter-from-requires", "REGEX", "Set %filter_from_requires to the supplied REGEX." do |filter_from_requires| rpmbuild_filter_from_requires << filter_from_requires next rpmbuild_filter_from_requires end rpm_tags = [] option "--tag", "TAG", "Adds a custom tag in the spec file as is. " \ "Example: --rpm-tag 'Requires(post): /usr/sbin/alternatives'" do |add_tag| rpm_tags << add_tag next rpm_tags end option "--ignore-iteration-in-dependencies", :flag, "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" option "--verbatim-gem-dependencies", :flag, "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).", :default => false option "--macro-expansion", :flag, "install-time macro expansion in %pre %post %preun %postun scripts " \ "(see: https://rpm-software-management.github.io/rpm/manual/scriptlet_expansion.html)", :default => false option "--verifyscript", "FILE", "a script to be run on verification" do |val| File.expand_path(val) # Get the full path to the script end # --verifyscript option "--pretrans", "FILE", "pretrans script" do |val| File.expand_path(val) # Get the full path to the script end # --pretrans option "--posttrans", "FILE", "posttrans script" do |val| File.expand_path(val) # Get the full path to the script end # --posttrans ["before-install","after-install","before-uninstall","after-target-uninstall"].each do |trigger_type| rpm_trigger = [] option "--trigger-#{trigger_type}", "'[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" do |trigger| match = trigger.match(/^(\[.*\]|)(.*): (.*)$/) @logger.fatal("Trigger '#{trigger_type}' definition can't be parsed ('#{trigger}')") unless match opt, pkg, file = match.captures @logger.fatal("File given for --trigger-#{trigger_type} does not exist (#{file})") unless File.exist?(file) rpm_trigger << [pkg, File.read(file), opt.tr('[]','')] next rpm_trigger end end option "--old-perl-dependency-name", :flag, "Use older 'perl' depdency name. Newer Red Hat (and derivatives) use a dependency named 'perl-interpreter'." private # Fix path name # Replace [ with [\[] to make rpm not use globs # Replace * with [*] to make rpm not use globs # Replace ? with [?] to make rpm not use globs # Replace % with [%] to make rpm not expand macros # Replace whitespace with ? to make rpm not split the filename # If and only if any of the above are done, then also replace ' with \', " with \", and \ with \\\\ # to accommodate escape and quote processing that rpm will perform in that case (but not otherwise) def rpm_fix_name(name) if name.match?(/[ \t*?%${}\[\]]/) name = name.gsub(/(\ |\t|\[|\]|\*|\?|\%|\$|'|"|\{|\}|\\)/, { ' ' => '?', "\t" => '?', '%' => '[%]', '$' => '[$]', '?' => '[?]', '*' => '[*]', '[' => '[\[]', ']' => '[\]]', #'{' => '[\{]', #'}' => '[\}]', '{' => '?', '}' => '?', '"' => '\\"', "'" => "\\'", '\\' => '\\\\\\\\', }) end name end def rpm_file_entry(file) original_file = file file = rpm_fix_name(file) if !attributes[:rpm_use_file_permissions?] if attrs[file].nil? return file else return sprintf("%%attr(%s) %s\n", attrs[file], file) end end return sprintf("%%attr(%s) %s\n", attrs[file], file) unless attrs[file].nil? # Stat the original filename in the relative staging path ::Dir.chdir(staging_path) do stat = File.lstat(original_file.gsub(/\"/, '').sub(/^\//,'')) # rpm_user and rpm_group attribute should override file ownership # otherwise use the current file user/group by name. user = attributes[:rpm_user] || Etc.getpwuid(stat.uid).name group = attributes[:rpm_group] || Etc.getgrgid(stat.gid).name mode = stat.mode return sprintf("%%attr(%o, %s, %s) %s\n", mode & 4095 , user, group, file) end end # Handle any architecture naming conversions. # For example, debian calls amd64 what redhat calls x86_64, this # method fixes those types of things. def architecture case @architecture when nil return %x{uname -m}.chomp # default to current arch when "amd64" # debian and redhat disagree on architecture names return "x86_64" when "arm64" # debian and redhat disagree on architecture names return "aarch64" when "native" return %x{uname -m}.chomp # 'native' is current arch when "all" # Translate fpm "all" arch to what it means in RPM. return "noarch" else return @architecture end end # def architecture # This method ensures a default value for iteration if none is provided. def iteration if @iteration.kind_of?(String) and @iteration.include?("-") logger.warn("Package iteration '#{@iteration}' includes dashes, converting" \ " to underscores. rpmbuild does not allow the dashes in the package iteration (called 'Release' in rpm)") @iteration = @iteration.gsub(/-/, "_") end return @iteration ? @iteration : 1 end # def iteration # Generate a generic changelog or return an existing definition def changelog if attributes[:rpm_changelog] return attributes[:rpm_changelog] end reldate = if attributes[:source_date_epoch].nil? Time.now() else Time.at(attributes[:source_date_epoch].to_i) end changed = reldate.strftime("%a %b %_e %Y") changev = "#{version}-#{iteration}" changev += "%{?dist}" if attributes[:rpm_dist] "* #{changed} #{maintainer} - #{changev}\n- Package created with FPM\n" end # See FPM::Package#converted_from def converted_from(origin) if origin == FPM::Package::CPAN if !attributes[:rpm_old_perl_dependency_name?] fixed_deps = [] self.dependencies.collect do |dep| # RPM package "perl" is a metapackage which install all the Perl bits and core modules, then gcc... # this must be replaced by perl-interpreter if name=/^perl([\s<>=].*)$/.match(dep) fixed_deps.push("perl-interpreter#{name[1]}") else fixed_deps.push(dep) end end self.dependencies = fixed_deps end elsif origin == FPM::Package::Gem fixed_deps = [] self.dependencies.collect do |dep| # Gem dependency operator "~>" is not compatible with rpm. Translate any found. fixed_deps = fixed_deps + expand_pessimistic_constraints(dep) end self.dependencies = fixed_deps # Convert 'rubygem-foo' provides values to 'rubygem(foo)' # since that's what most rpm packagers seem to do. self.provides = self.provides.collect do |provides| # Tries to match rubygem_prefix [1], gem_name [2] and version [3] if present # and return it in rubygem_prefix(gem_name) form if name=/^(#{attributes[:gem_package_name_prefix]})-([^\s]+)\s*(.*)$/.match(provides) "#{name[1]}(#{name[2]})#{name[3] ? " #{name[3]}" : ""}" else provides end end if !self.attributes[:rpm_verbatim_gem_dependencies?] self.dependencies = self.dependencies.collect do |dependency| # Tries to match rubygem_prefix [1], gem_name [2] and version [3] if present # and return it in rubygem_prefix(gem_name) form if name=/^(#{attributes[:gem_package_name_prefix]})-([^\s]+)\s*(.*)$/.match(dependency) "#{name[1]}(#{name[2]})#{name[3] ? " #{name[3]}" : ""}" else dependency end end end end # Convert != dependency as Conflict =, as rpm doesn't understand != self.dependencies = self.dependencies.select do |dep| name, op, version = dep.split(/\s+/) dep_ok = true if op == '!=' self.conflicts << "#{name} = #{version}" dep_ok = false end dep_ok end # if --ignore-iteration-in-dependencies is true convert foo = X, to # foo >= X , foo < X+1 if self.attributes[:rpm_ignore_iteration_in_dependencies?] self.dependencies = self.dependencies.collect do |dep| name, op, version = dep.split(/\s+/) if op == '=' nextversion = version.split('.').collect { |v| v.to_i } nextversion[-1] += 1 nextversion = nextversion.join(".") logger.warn("Converting dependency #{dep} to #{name} >= #{version}, #{name} < #{nextversion}") ["#{name} >= #{version}", "#{name} < #{nextversion}"] else dep end end.flatten end setscript = proc do |scriptname| script_path = self.attributes[scriptname] # Skip scripts not set next if script_path.nil? if !File.exist?(script_path) logger.error("No such file (for #{scriptname.to_s}): #{script_path.inspect}") script_errors << script_path end # Load the script into memory. scripts[scriptname] = File.read(script_path) end setscript.call(:rpm_verifyscript) setscript.call(:rpm_posttrans) setscript.call(:rpm_pretrans) end # def converted def rpm_get_trigger_type(flag) if (flag & (1 << 25)) == (1 << 25) # RPMSENSE_TRIGGERPREIN = (1 << 25), /*!< %triggerprein dependency. */ :rpm_trigger_before_install elsif (flag & (1 << 16)) == (1 << 16) # RPMSENSE_TRIGGERIN = (1 << 16), /*!< %triggerin dependency. */ :rpm_trigger_after_install elsif (flag & (1 << 17)) == (1 << 17) # RPMSENSE_TRIGGERUN = (1 << 17), /*!< %triggerun dependency. */ :rpm_trigger_before_uninstall elsif (flag & (1 << 18)) == (1 << 18) # RPMSENSE_TRIGGERPOSTUN = (1 << 18), /*!< %triggerpostun dependency. */ :rpm_trigger_after_target_uninstall else @logger.fatal("I don't know about this triggerflag ('#{flag}')") end end # def rpm_get_trigger def input(path) rpm = ::RPM::File.new(path) tags = {} rpm.header.tags.each do |tag| tags[tag.tag] = tag.value end self.architecture = tags[:arch] self.category = tags[:group] self.description = tags[:description] self.epoch = (tags[:epoch] || [nil]).first # for some reason epoch is an array self.iteration = tags[:release] self.license = tags[:license] self.maintainer = maintainer self.name = tags[:name] self.url = tags[:url] self.vendor = tags[:vendor] self.version = tags[:version] self.scripts[:before_install] = tags[:prein] self.scripts[:after_install] = tags[:postin] self.scripts[:before_remove] = tags[:preun] self.scripts[:after_remove] = tags[:postun] self.scripts[:rpm_verifyscript] = tags[:verifyscript] self.scripts[:rpm_posttrans] = tags[:posttrans] self.scripts[:rpm_pretrans] = tags[:pretrans] # TODO(sissel): prefix these scripts above with a shebang line if there isn't one? # Also taking into account the value of tags[preinprog] etc, something like: # #!#{tags[:preinprog]} # #{tags[prein]} if !tags[:triggerindex].nil? val = tags[:triggerindex].zip(tags[:triggername],tags[:triggerflags],tags[:triggerversion]).group_by{ |x| x[0]} val = val.collect do |order,data| new_data = data.collect { |x| [ x[1], rpm.operator(x[2]), x[3]].join(" ").strip}.join(", ") [order, rpm_get_trigger_type(data[0][2]), new_data] end val.each do |order, attr,data| self.attributes[attr] = [] if self.attributes[attr].nil? scriptprog = (tags[:triggerscriptprog][order] == '/bin/sh') ? "" : "-p #{tags[:triggerscriptprog][order]}" self.attributes[attr] << [data,tags[:triggerscripts][order],scriptprog] end end if !attributes[:no_auto_depends?] self.dependencies += rpm.requires.collect do |name, operator, version| [name, operator, version].join(" ") end end self.conflicts += rpm.conflicts.collect do |name, operator, version| [name, operator, version].join(" ") end self.provides += rpm.provides.collect do |name, operator, version| [name, operator, version].join(" ") end #input.replaces += replaces self.config_files += rpm.config_files # rpms support '%dir' things for specifying empty directories to package, # but the rpm header itself doesn't actually record this information. # so there's no 'directories' to copy, so don't try to merge in the # 'directories' feature. # TODO(sissel): If you want this feature, we'll have to find scan # the extracted rpm for empty directories. I'll wait until someone asks for # this feature #self.directories += rpm.directories # Extract to the staging directory rpm.extract(staging_path) end # def input def prefixed_path(path) Pathname.new(path).absolute?() ? path : File.join(self.prefix, path) end # def prefixed_path def output(output_path) output_check(output_path) %w(BUILD RPMS SRPMS SOURCES SPECS).each { |d| FileUtils.mkdir_p(build_path(d)) } args = ["rpmbuild", "-bb"] if %x{uname -m}.chomp != self.architecture rpm_target = self.architecture end # issue #309 if !attributes[:rpm_os].nil? rpm_target = "#{architecture}-unknown-#{attributes[:rpm_os]}" end # issue #707 if !rpm_target.nil? args += ["--target", rpm_target] end # set the rpm dist tag args += ["--define", "dist .#{attributes[:rpm_dist]}"] if attributes[:rpm_dist] args += [ "--buildroot", "#{build_path}/BUILD", "--define", "buildroot #{build_path}/BUILD", "--define", "_topdir #{build_path}", "--define", "_sourcedir #{build_path}", "--define", "_rpmdir #{build_path}/RPMS", "--define", "_tmppath #{attributes[:workdir]}" ] args += ["--sign"] if attributes[:rpm_sign?] if attributes[:rpm_auto_add_directories?] fs_dirs_list = File.join(template_dir, "rpm", "filesystem_list") fs_dirs = File.readlines(fs_dirs_list).reject { |x| x =~ /^\s*#/}.map { |x| x.chomp } fs_dirs.concat((attributes[:auto_add_exclude_directories] or [])) Find.find(staging_path) do |path| next if path == staging_path if File.directory? path and !File.symlink? path add_path = path.gsub(/^#{staging_path}/,'') self.directories << add_path if not fs_dirs.include? add_path end end else self.directories = self.directories.map { |x| self.prefixed_path(x) } alldirs = [] self.directories.each do |path| Find.find(File.join(staging_path, path)) do |subpath| if File.directory? subpath and !File.symlink? subpath alldirs << subpath.gsub(/^#{staging_path}/, '') end end end self.directories = alldirs end # include external config files (attributes[:config_files] or []).each do |conf| dest_conf = File.join(staging_path, conf) if File.exist?(dest_conf) logger.debug("Using --config-file from staging area", :path => conf) elsif File.exist?(conf) logger.info("Copying --config-file from local path", :path => conf) FileUtils.mkdir_p(File.dirname(dest_conf)) FileUtils.cp_r conf, dest_conf else logger.error("Failed to find given --config-file", :path => conf) raise "Could not find config file '#{conf}' in staging area or on host. This can happen if you specify `--config-file '#{conf}'` but this file does not exist in the source package and also does not exist in filesystem." end end # scan all conf file paths for files and add them allconfigs = [] self.config_files.each do |path| cfg_path = File.join(staging_path, path) raise "Config file path #{cfg_path} does not exist" unless File.exist?(cfg_path) Find.find(cfg_path) do |p| allconfigs << p.gsub("#{staging_path}/", '') if File.file? p end end allconfigs.sort!.uniq! self.config_files = allconfigs.map { |x| File.join("/", x) } # add init script if present (attributes[:rpm_init_list] or []).each do |init| name = File.basename(init, ".init") dest_init = File.join(staging_path, "etc/init.d/#{name}") FileUtils.mkdir_p(File.dirname(dest_init)) FileUtils.cp init, dest_init File.chmod(0755, dest_init) end (attributes[:rpm_rpmbuild_define] or []).each do |define| args += ["--define", define] end # copy all files from staging to BUILD dir # [#1538] Be sure to preserve the original timestamps. Find.find(staging_path) do |path| src = path.gsub(/^#{staging_path}/, '') dst = File.join(build_path, build_sub_dir, src) copy_entry(path, dst, preserve=true) end rpmspec = template("rpm.erb").result(binding) specfile = File.join(build_path("SPECS"), "#{name}.spec") File.write(specfile, rpmspec) edit_file(specfile) if attributes[:edit?] args << specfile logger.info("Running rpmbuild", :args => args) safesystem(*args) ::Dir["#{build_path}/RPMS/**/*.rpm"].each do |rpmpath| # This should only output one rpm, should we verify this? FileUtils.cp(rpmpath, output_path) end end # def output def prefix if attributes[:prefix] and attributes[:prefix] != '/' return attributes[:prefix].chomp('/') else return "/" end end # def prefix def build_sub_dir return "BUILD" #return File.join("BUILD", prefix) end # def build_sub_dir def summary if !attributes[:rpm_summary] return @description.split("\n").find { |line| !line.strip.empty? } || "_" end return attributes[:rpm_summary] end # def summary def version if @version.kind_of?(String) and @version.include?("-") logger.warn("Package version '#{@version}' includes dashes, converting" \ " to underscores") @version = @version.gsub(/-/, "_") end return @version end # The default epoch value must be nil, see #381 def epoch return @epoch if @epoch.is_a?(Numeric) if @epoch.nil? or @epoch.empty? return nil end return @epoch end # def epoch def to_s_dist; attributes[:rpm_dist] ? "#{attributes[:rpm_dist]}" : "DIST"; end def to_s(format=nil) if format.nil? format = if attributes[:rpm_dist] "NAME-VERSION-ITERATION.DIST.ARCH.EXTENSION" else "NAME-VERSION-ITERATION.ARCH.EXTENSION" end end return super(format.gsub("DIST", to_s_dist)) end # def to_s def payload_compression if attributes[:rpm_compression] == 'none' # when 'none' ignore any compression level and return w0.gzdio return COMPRESSION_MAP[attributes[:rpm_compression]] else return "w#{attributes[:rpm_compression_level]}" + COMPRESSION_MAP[attributes[:rpm_compression]] end end # def payload_compression def digest_algorithm return DIGEST_ALGORITHM_MAP[attributes[:rpm_digest]] end # def digest_algorithm public(:input, :output, :converted_from, :architecture, :to_s, :iteration, :payload_compression, :digest_algorithm, :prefix, :build_sub_dir, :summary, :epoch, :version, :prefixed_path) end # class FPM::Package::RPM ================================================ FILE: lib/fpm/package/sh.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "fpm/util" require "backports/latest" require "fileutils" require "digest" # Support for self extracting sh files (.sh files) # # This class only supports output of packages. # # The sh package is a single sh file with a tar payload concatenated to the end. # The script can unpack the tarball to install it and call optional post install scripts. class FPM::Package::Sh < FPM::Package def output(output_path) create_scripts # Make one file. The installscript can unpack itself. `cat #{install_script} #{payload} > #{output_path}` FileUtils.chmod("+x", output_path) end def create_scripts if script?(:after_install) File.write(File.join(fpm_meta_path, "after_install"), script(:after_install)) end end def install_script path = build_path("installer.sh") File.open(path, "w") do |file| file.write template("sh.erb").result(binding) end path end # Returns the path to the tar file containing the packed up staging directory def payload payload_tar = build_path("payload.tar") logger.info("Creating payload tar ", :path => payload_tar) args = [ tar_cmd, "-C", staging_path, "-cf", payload_tar, "--owner=0", "--group=0", "--numeric-owner", "." ] unless safesystem(*args) raise "Command failed while creating payload tar: #{args}" end payload_tar end # Where we keep metadata and post install scripts and such def fpm_meta_path @fpm_meta_path ||= begin path = File.join(staging_path, ".fpm") FileUtils.mkdir_p(path) path end end end ================================================ FILE: lib/fpm/package/snap.rb ================================================ require "yaml" require "fpm/package" require "fpm/util" require "fileutils" require "fpm/package/dir" # Support for snaps (.snap files). # # This supports the input and output of snaps. class FPM::Package::Snap < FPM::Package option "--yaml", "FILEPATH", "Custom version of the snap.yaml file." do | snap_yaml | File.expand_path(snap_yaml) end option "--confinement", "CONFINEMENT", "Type of confinement to use for this snap.", default: "devmode" do | confinement | if ['strict', 'devmode', 'classic'].include? confinement confinement else raise "Unsupported confinement type '#{confinement}'" end end option "--grade", "GRADE", "Grade of this snap.", default: "devel" do | grade | if ['stable', 'devel'].include? grade grade else raise "Unsupported grade type '#{grade}'" end end # Input a snap def input(input_snap) extract_snap_to_staging input_snap extract_snap_metadata_from_staging end # def input # Output a snap. def output(output_snap) output_check(output_snap) write_snap_yaml # Create the snap from the staging path safesystem("mksquashfs", staging_path, output_snap, "-noappend", "-comp", "xz", "-no-xattrs", "-no-fragments", "-all-root") end # def output def to_s(format=nil) # Default format if nil # name_version_arch.snap return super(format.nil? ? "NAME_FULLVERSION_ARCH.EXTENSION" : format) end # def to_s private def extract_snap_to_staging(snap_path) safesystem("unsquashfs", "-f", "-d", staging_path, snap_path) end def extract_snap_metadata_from_staging metadata = YAML.safe_load(File.read( staging_path(File.join("meta", "snap.yaml")))) self.name = metadata["name"] self.version = metadata["version"] self.description = metadata["summary"] + "\n" + metadata["description"] self.architecture = metadata["architectures"][0] self.attributes[:snap_confinement] = metadata["confinement"] self.attributes[:snap_grade] = metadata["grade"] if metadata["apps"].nil? attributes[:snap_apps] = [] else attributes[:snap_apps] = metadata["apps"] end if metadata["hooks"].nil? attributes[:snap_hooks] = [] else attributes[:snap_hooks] = metadata["hooks"] end end def write_snap_yaml # Write the snap.yaml if attributes[:snap_yaml] logger.debug("Using '#{attributes[:snap_yaml]}' as the snap.yaml") yaml_data = File.read(attributes[:snap_yaml]) else summary, *remainder = (self.description or "no summary given").split("\n") description = "no description given" if remainder.any? description = remainder.join("\n") end yaml_data = { "name" => self.name, "version" => self.version, "summary" => summary, "description" => description, "architectures" => [self.architecture], "confinement" => self.attributes[:snap_confinement], "grade" => self.attributes[:snap_grade], } unless attributes[:snap_apps].nil? or attributes[:snap_apps].empty? yaml_data["apps"] = attributes[:snap_apps] end unless attributes[:snap_hooks].nil? or attributes[:snap_hooks].empty? yaml_data["hooks"] = attributes[:snap_hooks] end yaml_data = yaml_data.to_yaml end FileUtils.mkdir_p(staging_path("meta")) snap_yaml_path = staging_path(File.join("meta", "snap.yaml")) logger.debug("Writing snap.yaml", :path => snap_yaml_path) File.write(snap_yaml_path, yaml_data) File.chmod(0644, snap_yaml_path) edit_file(snap_yaml_path) if attributes[:edit?] end # def write_snap_yaml end # class FPM::Package::Snap ================================================ FILE: lib/fpm/package/solaris.rb ================================================ require "erb" require "fpm/namespace" require "fpm/package" require "fpm/errors" require "fpm/util" # TODO(sissel): Add dependency checking support. # IIRC this has to be done as a 'checkinstall' step. class FPM::Package::Solaris < FPM::Package option "--user", "USER", "Set the user to USER in the prototype files.", :default => 'root' option "--group", "GROUP", "Set the group to GROUP in the prototype file.", :default => 'root' def architecture case @architecture when nil, "native" @architecture = %x{uname -p}.chomp end # "all" is a valid arch according to # http://www.bolthole.com/solaris/makeapackage.html return @architecture end # def architecture def specfile(builddir) "#{builddir}/pkginfo" end def output(output_path) self.scripts.each do |name, path| case name when "pre-install" safesystem("cp", path, "./preinstall") File.chmod(0755, "./preinstall") when "post-install" safesystem("cp", path, "./postinstall") File.chmod(0755, "./postinstall") when "pre-uninstall" raise FPM::InvalidPackageConfiguration.new( "pre-uninstall is not supported by Solaris packages" ) when "post-uninstall" raise FPM::InvalidPackageConfiguration.new( "post-uninstall is not supported by Solaris packages" ) end # case name end # self.scripts.each template = template("solaris.erb") File.open("#{build_path}/pkginfo", "w") do |pkginfo| pkginfo.puts template.result(binding) end # Generate the package 'Prototype' file File.open("#{build_path}/Prototype", "w") do |prototype| prototype.puts("i pkginfo") prototype.puts("i preinstall") if self.scripts["pre-install"] prototype.puts("i postinstall") if self.scripts["post-install"] # TODO(sissel): preinstall/postinstall # strip @prefix, since BASEDIR will set prefix via the pkginfo file IO.popen("pkgproto #{staging_path}/#{@prefix}=").each_line do |line| type, klass, path, mode, user, group = line.split prototype.puts([type, klass, path, mode, attributes[:solaris_user], attributes[:solaris_group]].join(" ")) end # popen "pkgproto ..." end # File prototype ::Dir.chdir staging_path do # Should create a package directory named by the package name. safesystem("pkgmk", "-o", "-f", "#{build_path}/Prototype", "-d", build_path) end # Convert the 'package directory' built above to a real solaris package. safesystem("pkgtrans", "-s", build_path, output_path, name) safesystem("cp", "#{build_path}/#{output_path}", output_path) end # def output def default_output v = version v = "#{epoch}:#{v}" if epoch if iteration "#{name}_#{v}-#{iteration}_#{architecture}.#{type}" else "#{name}_#{v}_#{architecture}.#{type}" end end # def default_output end # class FPM::Deb ================================================ FILE: lib/fpm/package/tar.rb ================================================ require "backports/latest" # gem backports/latest require "fpm/package" require "fpm/util" require "fileutils" require "fpm/package/dir" # Use a tarball as a package. # # This provides no metadata. Both input and output are supported. class FPM::Package::Tar < FPM::Package # Input a tarball. Compressed tarballs should be OK. def input(input_path) # use part of the filename as the package name self.name = File.basename(input_path).split(".").first # Unpack the tarball to the build path before ultimately moving it to # staging. args = ["-xf", input_path, "-C", build_path] # Add the tar compression flag if necessary tar_compression_flag(input_path).tap do |flag| args << flag unless flag.nil? end safesystem("tar", *args) # use dir to set stuff up properly, mainly so I don't have to reimplement # the chdir/prefix stuff special for tar. dir = convert(FPM::Package::Dir) if attributes[:chdir] dir.attributes[:chdir] = File.join(build_path, attributes[:chdir]) else dir.attributes[:chdir] = build_path end cleanup_staging # Tell 'dir' to input "." and chdir/prefix will help it figure out the # rest. dir.input(".") @staging_path = dir.staging_path dir.cleanup_build end # def input # Output a tarball. # # If the output path ends predictably (like in .tar.gz) it will try to obey # the compression type. def output(output_path) output_check(output_path) # Write the scripts, too. write_scripts # Unpack the tarball to the staging path args = ["-cf", output_path, "-C", staging_path] tar_compression_flag(output_path).tap do |flag| args << flag unless flag.nil? end args << "." safesystem("tar", *args) end # def output # Generate the proper tar flags based on the path name. def tar_compression_flag(path) case path when /\.tar\.bz2$/ return "-j" when /\.tar\.gz$|\.tgz$/ return "-z" when /\.tar\.xz$/ return "-J" else return nil end end # def tar_compression_flag end # class FPM::Package::Tar ================================================ FILE: lib/fpm/package/virtualenv.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/util" require "fpm/package/dir" # Support for python virtualenv packages. # # This supports input, but not output. # class FPM::Package::Virtualenv < FPM::Package # Flags '--foo' will be accessable as attributes[:virtualenv_foo] option "--pypi", "PYPI_URL", "PyPi Server uri for retrieving packages.", :default => "https://pypi.python.org/simple" option "--package-name-prefix", "PREFIX", "Name to prefix the package " \ "name with.", :default => "virtualenv" option "--install-location", "DIRECTORY", "DEPRECATED: Use --prefix instead." \ " Location to which to install the virtualenv by default.", :default => "/usr/share/python" do |path| logger.warn("Using deprecated flag: --install-location. Please use " \ "--prefix instead.") File.expand_path(path) end option "--fix-name", :flag, "Should the target package name be prefixed?", :default => true option "--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.", :default => nil option "--pypi-extra-url", "PYPI_EXTRA_URL", "PyPi extra-index-url for pointing to your priviate PyPi", :multivalued => true, :attribute_name => :virtualenv_pypi_extra_index_urls, :default => nil option "--setup-install", :flag, "After building virtualenv run setup.py install "\ "useful when building a virtualenv for packages and including their requirements from "\ "requirements.txt" option "--system-site-packages", :flag, "Give the virtual environment access to the "\ "global site-packages" option "--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.", :multivalued => true, :attribute_name => :virtualenv_find_links_urls, :default => nil private # Input a package. # # `package` can look like `psutil==2.2.1` or `psutil`. def input(package) installdir = attributes[:virtualenv_install_location] m = /^([^=]+)==([^=]+)$/.match(package) package_version = nil is_requirements_file = (File.basename(package) == "requirements.txt") if is_requirements_file if !File.file?(package) raise FPM::InvalidPackageConfiguration, "Path looks like a requirements.txt, but it doesn't exist: #{package}" end package = File.join(::Dir.pwd, package) if File.dirname(package) == "." package_name = File.basename(File.dirname(package)) logger.info("No name given. Using the directory's name", :name => package_name) package_version = nil elsif m package_name = m[1] package_version = m[2] self.version ||= package_version else package_name = package package_version = nil end virtualenv_name = package_name self.name ||= package_name if self.attributes[:virtualenv_fix_name?] self.name = [self.attributes[:virtualenv_package_name_prefix], self.name].join("-") end # prefix wins over previous virtual_install_location behaviour virtualenv_folder = if self.attributes[:prefix] self.attributes[:prefix] else File.join(installdir, virtualenv_name) end virtualenv_build_folder = build_path(virtualenv_folder) ::FileUtils.mkdir_p(virtualenv_build_folder) if self.attributes[:virtualenv_system_site_packages?] logger.info("Creating virtualenv with --system-site-packages") safesystem("virtualenv", "--system-site-packages", virtualenv_build_folder) else safesystem("virtualenv", virtualenv_build_folder) end pip_exe = File.join(virtualenv_build_folder, "bin", "pip") python_exe = File.join(virtualenv_build_folder, "bin", "python") # Why is this hack here? It looks important, so I'll keep it in. safesystem(python_exe, pip_exe, "install", "-U", "-i", attributes[:virtualenv_pypi], "pip") extra_index_url_args = [] if attributes[:virtualenv_pypi_extra_index_urls] attributes[:virtualenv_pypi_extra_index_urls].each do |extra_url| extra_index_url_args << "--extra-index-url" << extra_url end end find_links_url_args = [] if attributes[:virtualenv_find_links_urls] attributes[:virtualenv_find_links_urls].each do |links_url| find_links_url_args << "--find-links" << links_url end end target_args = [] if is_requirements_file target_args << "-r" << package else target_args << package end pip_args = [python_exe, pip_exe, "install", "-i", attributes[:virtualenv_pypi]] << extra_index_url_args << find_links_url_args << target_args safesystem(*pip_args.flatten) if attributes[:virtualenv_setup_install?] logger.info("Running PACKAGE setup.py") setup_args = [python_exe, "setup.py", "install"] safesystem(*setup_args.flatten) end if ! is_requirements_file && package_version.nil? frozen = safesystemout(python_exe, pip_exe, "freeze") frozen_version = frozen[/#{package}==[^=]+$/] package_version = frozen_version && frozen_version.split("==")[1].chomp! self.version ||= package_version end ::Dir[build_path + "/**/*"].each do |f| if ! File.readable? f File.lchmod(File.stat(f).mode | 444) end end # [2025-09-30] virtualenv-tools seems broken? # The --update-path will look for a VIRTUAL_ENV= line in bin/activate, # however, the version I tested looks for it with quotations, like VIRTUAL_ENV=' # And at time of writing, my `virtualenv` tool doesn't use quotations on this variable # # Maybe best case we can patch it here instead. The path update tool # looks for the original virtualenv path and I think updates any bin # files which point to it. patched = [] activate_bin = File.join(virtualenv_build_folder, "bin/activate") fd = File.open(activate_bin) fd.each_line do |line| re = /^VIRTUAL_ENV=([^'"].*)$/ match = line.match(re) if match # Quote the VIRTUAL_ENV var assignment to help virtualenv-tools work? patched << "VIRTUAL_ENV='#{match}'\n" else patched << line end end fd.close File.write(activate_bin, patched.join) # Rewrite the base path inside the virtualenv to prepare it to be packaged. ::Dir.chdir(virtualenv_build_folder) do safesystem("virtualenv-tools", "--update-path", virtualenv_folder) end if !attributes[:virtualenv_other_files_dir].nil? # Copy all files from other dir to build_path Find.find(attributes[:virtualenv_other_files_dir]) do |path| src = path.gsub(/^#{attributes[:virtualenv_other_files_dir]}/, '') dst = File.join(build_path, src) copy_entry(path, dst, preserve=true, remove_destination=true) copy_metadata(path, dst) end end remove_python_compiled_files virtualenv_build_folder # use dir to set stuff up properly, mainly so I don't have to reimplement # the chdir/prefix stuff special for tar. dir = convert(FPM::Package::Dir) # don't double prefix the files dir.attributes[:prefix] = nil if attributes[:chdir] dir.attributes[:chdir] = File.join(build_path, attributes[:chdir]) else dir.attributes[:chdir] = build_path end cleanup_staging # Tell 'dir' to input "." and chdir/prefix will help it figure out the # rest. dir.input(".") @staging_path = dir.staging_path dir.cleanup_build end # def input # Delete python precompiled files found in a given folder. def remove_python_compiled_files path logger.debug("Now removing python object and compiled files from the virtualenv") Find.find(path) do |path| if path.end_with? '.pyc' or path.end_with? '.pyo' FileUtils.rm path end end end public(:input) end # class FPM::Package::Virtualenv ================================================ FILE: lib/fpm/package/zip.rb ================================================ require "backports/latest" # gem backports/latest require "fpm/package" require "fpm/util" require "fileutils" require "fpm/package/dir" # Use a zip as a package. # # This provides no metadata. Both input and output are supported. class FPM::Package::Zip < FPM::Package # Input a zipfile. def input(input_path) # use part of the filename as the package name self.name = File.extname(input_path)[1..-1] realpath = Pathname.new(input_path).realpath.to_s ::Dir.chdir(build_path) do safesystem("unzip", realpath) end # use dir to set stuff up properly, mainly so I don't have to reimplement # the chdir/prefix stuff special for zip. dir = convert(FPM::Package::Dir) if attributes[:chdir] dir.attributes[:chdir] = File.join(build_path, attributes[:chdir]) else dir.attributes[:chdir] = build_path end cleanup_staging # Tell 'dir' to input "." and chdir/prefix will help it figure out the # rest. dir.input(".") @staging_path = dir.staging_path dir.cleanup_build end # def input # Output a zipfile. def output(output_path) output_check(output_path) realpath = Pathname.new(output_path).realdirpath.to_s ::Dir.chdir(staging_path) do safesystem("zip", "-9r", realpath, ".") end end # def output end # class FPM::Package::Tar ================================================ FILE: lib/fpm/package.rb ================================================ require "fpm/namespace" # local require "fpm/util" # local require "pathname" # stdlib require "find" require "tmpdir" # stdlib require "backports/latest" require "socket" # stdlib, for Socket.gethostname require "shellwords" # stdlib, for Shellwords.escape require "erb" # stdlib, for template processing require "cabin" # gem "cabin" require "stud/temporary" # This class is the parent of all packages. # If you want to implement an FPM package type, you'll inherit from this. class FPM::Package include FPM::Util include Cabin::Inspectable # This class is raised if there's something wrong with a setting in the package. class InvalidArgument < StandardError; end # This class is raised when a file already exists when trying to write. class FileAlreadyExists < StandardError # Get a human-readable error message def to_s return "File already exists, refusing to continue: #{super}" end # def to_s end # class FileAlreadyExists # This class is raised when you try to output a package to a path # whose containing directory does not exist. class ParentDirectoryMissing < StandardError def to_s return "Parent directory does not exist: #{File.dirname(super)} - cannot write to #{super}" end # def to_s end # class ParentDirectoryMissing # The name of this package attr_accessor :name # The version of this package (the upstream version) attr_accessor :version # The epoch version of this package # This is used most when an upstream package changes it's versioning # style so standard comparisions wouldn't work. attr_accessor :epoch # The iteration of this package. # Debian calls this 'release' and is the last '-NUMBER' in the version # RedHat has this as 'Release' in the .spec file # FreeBSD calls this 'PORTREVISION' # # Iteration can be nil. If nil, the fpm package implementation is expected # to handle any default value that should be instead. attr_accessor :iteration # Who maintains this package? This could be the upstream author # or the package maintainer. You pick. attr_accessor :maintainer # A identifier representing the vendor. Any string is fine. # This is usually who produced the software. attr_accessor :vendor # URL for this package. # Could be the homepage. Could be the download url. You pick. attr_accessor :url # The category of this package. # RedHat calls this 'Group' # Debian calls this 'Section' # FreeBSD would put this in /usr/ports//... attr_accessor :category # A identifier representing the license. Any string is fine. attr_accessor :license # What architecture is this package for? attr_accessor :architecture # Array of dependencies. attr_accessor :dependencies # Array of things this package provides. # (Not all packages support this) attr_accessor :provides # Array of things this package conflicts with. # (Not all packages support this) attr_accessor :conflicts # Array of things this package replaces. # (Not all packages support this) attr_accessor :replaces # a summary or description of the package attr_accessor :description # hash of scripts for maintainer/package scripts (postinstall, etc) # # The keys are :before_install, etc # The values are the text to use in the script. attr_accessor :scripts # Array of configuration files attr_accessor :config_files attr_accessor :directories # Any other attributes specific to this package. # This is where you'd put rpm, deb, or other specific attributes. attr_accessor :attributes attr_accessor :attrs private def initialize # Attributes for this specific package @attributes = { # Default work location :workdir => ::Dir.tmpdir } # Reference # http://www.debian.org/doc/manuals/maint-guide/first.en.html # http://wiki.debian.org/DeveloperConfiguration # https://github.com/jordansissel/fpm/issues/37 if ENV.include?("DEBEMAIL") and ENV.include?("DEBFULLNAME") # Use DEBEMAIL and DEBFULLNAME as the default maintainer if available. @maintainer = "#{ENV["DEBFULLNAME"]} <#{ENV["DEBEMAIL"]}>" else # TODO(sissel): Maybe support using 'git config' for a default as well? # git config --get user.name, etc can be useful. # # Otherwise default to user@currenthost @maintainer = "<#{ENV["USER"]}@#{Socket.gethostname}>" end # Set attribute defaults based on flags # This allows you to define command line options with default values # that also are obeyed if fpm is used programmatically. self.class.default_attributes do |attribute, value| attributes[attribute] = value end @name = nil @architecture = "native" @description = "no description given" @version = nil @epoch = nil @iteration = nil @url = nil @category = "default" @license = "unknown" @vendor = "none" # Iterate over all the options and set defaults if self.class.respond_to?(:declared_options) self.class.declared_options.each do |option| option.attribute_name.tap do |attr| # clamp makes option attributes available as accessor methods # do --foo-bar is available as 'foo_bar' # make these available as package attributes. attr = "#{attr}?" if !respond_to?(attr) input.attributes[attr.to_sym] = send(attr) if respond_to?(attr) end end end @provides = [] @conflicts = [] @replaces = [] @dependencies = [] @scripts = {} @config_files = [] @directories = [] @attrs = {} build_path # Dont' initialize staging_path just yet, do it lazily so subclass can get a word in. end # def initialize # Get the 'type' for this instance. # # For FPM::Package::ABC, this returns 'abc' def type self.class.type end # def type # Convert this package to a new package type def convert(klass) logger.info("Converting #{self.type} to #{klass.type}") exclude pkg = klass.new pkg.cleanup_staging # purge any directories that may have been created by klass.new # copy other bits ivars = [ :@architecture, :@category, :@config_files, :@conflicts, :@dependencies, :@description, :@epoch, :@iteration, :@license, :@maintainer, :@name, :@provides, :@replaces, :@scripts, :@url, :@vendor, :@version, :@directories, :@staging_path, :@attrs ] ivars.each do |ivar| #logger.debug("Copying ivar", :ivar => ivar, :value => instance_variable_get(ivar), #:from => self.type, :to => pkg.type) pkg.instance_variable_set(ivar, instance_variable_get(ivar)) end # Attributes are special! We do not want to remove the default values of # the destination package type unless their value is specified on the # source package object. pkg.attributes.merge!(self.attributes) pkg.converted_from(self.class) return pkg end # def convert # This method is invoked on a package when it has been converted to a new # package format. The purpose of this method is to do any extra conversion # steps, like translating dependency conditions, etc. def converted_from(origin) # nothing to do by default. Subclasses may implement this. # See the RPM package class for an example. end # def converted_from # Add a new source to this package. # The exact behavior depends on the kind of package being managed. # # For instance: # # * for FPM::Package::Dir, << expects a path to a directory or files. # * for FPM::Package::RPM, << expects a path to an rpm. # # The idea is that you can keep pumping in new things to a package # for later conversion or output. # # Implementations are expected to put files relevant to the 'input' in the # staging_path def input(thing_to_input) raise NotImplementedError.new("#{self.class.name} does not yet support " \ "reading #{self.type} packages") end # def input # Output this package to the given path. def output(path) raise NotImplementedError.new("#{self.class.name} does not yet support " \ "creating #{self.type} packages") end # def output def staging_path(path=nil) @staging_path ||= Stud::Temporary.directory("package-#{type}-staging") if path.nil? return @staging_path else return File.join(@staging_path, path) end end # def staging_path def build_path(path=nil) @build_path ||= Stud::Temporary.directory("package-#{type}-build") if path.nil? return @build_path else return File.join(@build_path, path) end end # def build_path # Clean up any temporary storage used by this class. def cleanup cleanup_staging cleanup_build end # def cleanup def cleanup_staging if File.directory?(staging_path) logger.debug("Cleaning up staging path", :path => staging_path) FileUtils.rm_r(staging_path) end end # def cleanup_staging def cleanup_build if File.directory?(build_path) logger.debug("Cleaning up build path", :path => build_path) FileUtils.rm_r(build_path) end end # def cleanup_build # List all files in the staging_path # # The paths will all be relative to staging_path and will not include that # path. # # This method will emit 'leaf' paths. Files, symlinks, and other file-like # things are emitted. Intermediate directories are ignored, but # empty directories are emitted. def files is_leaf = lambda do |path| # True if this is a file/symlink/etc, but not a plain directory return true if !(File.directory?(path) and !File.symlink?(path)) # Empty directories are leafs as well. return true if ::Dir.entries(path).sort == [".", ".."] # False otherwise (non-empty directory, etc) return false end # is_leaf # Find all leaf-like paths (files, symlink, empty directories, etc) # Also trim the leading path such that '#{staging_path}/' is removed from # the path before returning. # # Wrapping Find.find in an Enumerator is required for sane operation in ruby 1.8.7, # but requires the 'backports/latest' gem (which is used in other places in fpm) return Enumerator.new { |y| Find.find(staging_path) { |path| y << path } } \ .select { |path| path != staging_path } \ .select { |path| is_leaf.call(path) } \ .collect { |path| path[staging_path.length + 1.. -1] } end # def files def template_dir File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "templates")) end # def template_dir def template(path) template_path = File.join(template_dir, path) template_code = File.read(template_path) logger.info("Reading template", :path => template_path) erb = erbnew(template_code) erb.filename = template_path return erb end # def template ####################################### # The following methods are provided to # easily override particular substitut- # ions performed by to_s for subclasses ####################################### def to_s_arch; architecture.to_s; end def to_s_name; name.to_s; end def to_s_fullversion; iteration ? "#{version}-#{iteration}" : "#{version}"; end def to_s_version; version.to_s; end def to_s_iteration; iteration.to_s; end def to_s_epoch; epoch.to_s; end def to_s_type; type.to_s; end def to_s_extension; type.to_s; end ####################################### def to_s(fmt=nil) fmt = "NAME.EXTENSION" if fmt.nil? return fmt.gsub("ARCH", to_s_arch) \ .gsub("NAME", to_s_name) \ .gsub("FULLVERSION", to_s_fullversion) \ .gsub("VERSION", to_s_version) \ .gsub("ITERATION", to_s_iteration) \ .gsub("EPOCH", to_s_epoch) \ .gsub("TYPE", to_s_type) \ .gsub("EXTENSION", to_s_extension) end # def to_s def edit_file(path) editor = ENV['FPM_EDITOR'] || ENV['EDITOR'] || 'vi' logger.info("Launching editor", :file => path) command = "#{editor} #{Shellwords.escape(path)}" system("#{editor} #{Shellwords.escape(path)}") if !$?.success? raise ProcessFailed.new("'#{editor}' failed (exit code " \ "#{$?.exitstatus}) Full command was: " \ "#{command}"); end if File.size(path) == 0 raise "Empty file after editing: #{path.inspect}" end end # def edit_file # This method removes excluded files from the staging_path. Subclasses can # remove the files during the input phase rather than deleting them here def exclude return if attributes[:excludes].nil? if @attributes.include?(:prefix) installdir = staging_path(@attributes[:prefix]) else installdir = staging_path end Find.find(installdir) do |path| match_path = path.sub("#{installdir.chomp('/')}/", '') attributes[:excludes].each do |wildcard| logger.debug("Checking path against wildcard", :path => match_path, :wildcard => wildcard) if File.fnmatch(wildcard, match_path) logger.info("Removing excluded path", :path => match_path, :matches => wildcard) FileUtils.rm_r(path) Find.prune break end end end end # def exclude class << self # This method is invoked when subclass occurs. # # Lets us track all known FPM::Package subclasses def inherited(klass) @subclasses ||= {} @subclasses[klass.name.gsub(/.*:/, "").downcase] = klass end # def self.inherited # Get a list of all known package subclasses def types return @subclasses end # def self.types # This allows packages to define flags for the fpm command line def option(flag, param, help, options={}, &block) @options ||= [] if !flag.is_a?(Array) flag = [flag] end if param == :flag # Automatically make 'flag' (boolean) options tunable with '--[no-]...' flag = flag.collect { |f| "--[no-]#{type}-#{f.gsub(/^--/, "")}" } else flag = flag.collect { |f| "--#{type}-#{f.gsub(/^--/, "")}" } end help = "(#{type} only) #{help}" @options << [flag, param, help, options, block] end # def option # Apply the options for this package on the clamp command # # Package flags become attributes '{type}-flag' # # So if you have: # # class Foo < FPM::Package # option "--bar-baz" ... # end # # The attribute value for --foo-bar-baz will be :foo_bar_baz" def apply_options(clampcommand) @options ||= [] @options.each do |args| flag, param, help, options, block = args clampcommand.option(flag, param, help, options, &block) end end # def apply_options def default_attributes(&block) return if @options.nil? @options.each do |flag, param, help, options, _block| attr = flag.first.gsub(/^-+/, "").gsub(/-/, "_").gsub("[no_]", "") attr += "?" if param == :flag yield attr.to_sym, options[:default] end end # def default_attributes # Get the type of this package class. # # For "Foo::Bar::BAZ" this will return "baz" def type self.name.split(':').last.downcase end # def self.type end # class << self # Get the version of this package def version if instance_variable_defined?(:@version) && !@version.nil? return @version elsif attributes[:version_given?] # 'version_given?' will be true in cases where the # fpm command-line tool has been given '-v' or '--version' settings # We do this check because the default version is "1.0" # on the fpm command line. return attributes.fetch(:version) end # No version yet, nil. return nil end # def version # Does this package have the given script? def script?(name) return scripts.include?(name) end # def script? # write all scripts to .scripts (tar and dir) def write_scripts scripts_path = File.join(staging_path, ".scripts") target_scripts = [:before_install, :after_install, :before_remove, :after_remove] if target_scripts.any? {|name| script?(name)} ::Dir.mkdir(scripts_path) target_scripts.each do |name| next unless script?(name) out = File.join(scripts_path, name.to_s) logger.debug('Writing script', :source => name, :target => out) File.write(out, script(name)) File.chmod(0755, out) end end end # def write_scripts # Get the contents of the script by a given name. # # If template_scripts? is set in attributes (often by the --template-scripts # flag), then apply it as an ERB template. def script(script_name) if attributes[:template_scripts?] erb = erbnew(scripts[script_name]) # TODO(sissel): find the original file name for the file. erb.filename = "script(#{script_name})" return erb.result(binding) else return scripts[script_name] end end # def script def output_check(output_path) if !File.directory?(File.dirname(output_path)) raise ParentDirectoryMissing.new(output_path) end if File.file?(output_path) if attributes[:force?] logger.warn("Force flag given. Overwriting package at #{output_path}") File.delete(output_path) else raise FileAlreadyExists.new(output_path) end end end # def output_path def provides=(value) if !value.is_a?(Array) @provides = [value] else @provides = value end end # def provides= # General public API public(:type, :initialize, :convert, :input, :output, :to_s, :cleanup, :files, :version, :script, :provides=) # Package internal public api public(:cleanup_staging, :cleanup_build, :staging_path, :converted_from, :edit_file, :build_path) end # class FPM::Package ================================================ FILE: lib/fpm/rake_task.rb ================================================ require "fpm/namespace" require "rake" require "rake/tasklib" class FPM::RakeTask < Rake::TaskLib class Options attr_accessor :args def initialize(defaults=nil) if defaults.nil? @h = Hash.new else @h = defaults end end def method_missing(m, *args) if m.end_with?("=") raise ArgumentError, "#{self.class.name}##{m} ... Expected 1 arg, got #{args.length}" if args.length != 1 @h[m[0...-1]] = args[0] else raise ArgumentError, "Expected 0 arg, got #{args.length}" if args.length != 0 return @h[m] end end def to_h return @h end end # Options attr_reader :options def initialize(package_name, opts = {}, &block) #@options = OpenStruct.new(:name => package_name.to_s) @options = Options.new(:name => package_name.to_s) @source, @target = opts.values_at(:source, :target).map(&:to_s) @directory = File.expand_path(opts[:directory].to_s) (@source.empty? || @target.empty? || options.name.empty?) && abort("Must specify package name, source and output") desc "Package #{@name}" unless ::Rake.application.last_description task(options.name) do |_, task_args| block.call(*[options, task_args].first(block.arity)) if block_given? abort("Must specify args") if options.args.nil? @args = options.args run_cli end end private def parsed_options options.to_h.map do |option, value| opt = option.to_s.tr("_", "-") case when value.is_a?(String), value.is_a?(Symbol) %W(--#{opt} #{value}) when value.is_a?(Array) value.map { |v| %W(--#{opt} #{v}) } when value.is_a?(TrueClass) "--#{opt}" when value.is_a?(FalseClass) "--no-#{opt}" else fail TypeError, "Unexpected type: #{value.class}" end end end def run_cli require "fpm" require "fpm/command" args = %W(-t #{@target} -s #{@source} -C #{@directory}) args << parsed_options args << @args args.flatten!.compact! abort 'FPM failed!' unless FPM::Command.new("fpm").run(args) == 0 end end ================================================ FILE: lib/fpm/util/tar_writer.rb ================================================ require 'rubygems/package' require 'stringio' module FPM module Issues module TarWriter # See https://github.com/rubygems/rubygems/issues/1608 def self.has_issue_1608? name, prefix = nil,nil io = StringIO.new ::Gem::Package::TarWriter.new(io) do |tw| name, prefix = tw.split_name('/123456789'*9 + '/1234567890') # abs name 101 chars long end return prefix.empty? end def self.has_issues_with_split_name? return false unless ::Gem::Package::TarWriter.method_defined?(:split_name) return has_issue_1608? end def self.has_issues_with_add_symlink? return !::Gem::Package::TarWriter.public_instance_methods.include?(:add_symlink) end end # module TarWriter end # module Issues end # module FPM module FPM; module Util; end; end # Like the ::Gem::Package::TarWriter but contains some backports/latest and bug fixes class FPM::Util::TarWriter < ::Gem::Package::TarWriter if FPM::Issues::TarWriter.has_issues_with_split_name? def split_name(name) if name.bytesize > 256 then raise ::Gem::Package::TooLongFileName.new("File \"#{name}\" has a too long path (should be 256 or less)") end prefix = '' if name.bytesize > 100 then parts = name.split('/', -1) # parts are never empty here name = parts.pop # initially empty for names with a trailing slash ("foo/.../bar/") prefix = parts.join('/') # if empty, then it's impossible to split (parts is empty too) while !parts.empty? && (prefix.bytesize > 155 || name.empty?) name = parts.pop + '/' + name prefix = parts.join('/') end if name.bytesize > 100 or prefix.empty? then raise ::Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)") end if prefix.bytesize > 155 then raise ::Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long base path (should be 155 or less)") end end return name, prefix end end # if FPM::Issues::TarWriter.spit_name_has_issues? if FPM::Issues::TarWriter.has_issues_with_add_symlink? # Backport Symlink Support to TarWriter # https://github.com/rubygems/rubygems/blob/4a778c9c2489745e37bcc2d0a8f12c601a9c517f/lib/rubygems/package/tar_writer.rb#L239-L253 def add_symlink(name, target, mode) check_closed name, prefix = split_name name header = ::Gem::Package::TarHeader.new(:name => name, :mode => mode, :size => 0, :typeflag => "2", :linkname => target, :prefix => prefix, :mtime => Time.now).to_s @io.write header self end # def add_symlink end end ================================================ FILE: lib/fpm/util.rb ================================================ require "fpm/namespace" require "fileutils" require "stud/temporary" # Some utility functions module FPM::Util # Raised if safesystem cannot find the program to run. class ExecutableNotFound < StandardError; end # Raised if a safesystem program exits nonzero class ProcessFailed < StandardError; end # Raised when a named pipe cannot be copied due to missing functions in fpm and ruby. class NamedPipeCannotBeCopied < StandardError; end # Raised when an attempting to copy a special file such as a block device. class UnsupportedSpecialFile < StandardError; end # Is the given program in the system's PATH? def program_in_path?(program) # return false if path is not set return false unless ENV['PATH'] # Scan path to find the executable # Do this to help the user get a better error message. envpath = ENV["PATH"].split(":") return envpath.select { |p| File.executable?(File.join(p, program)) }.any? end # def program_in_path def program_exists?(program) # Scan path to find the executable # Do this to help the user get a better error message. return program_in_path?(program) if !program.include?("/") return File.executable?(program) end # def program_exists? def default_shell shell = ENV["SHELL"] return "/bin/sh" if shell.nil? || shell.empty? return shell end # def default_shell ############################################################################ # execmd([env,] cmd [,opts]) # # Execute a command as a child process. The function allows to: # # - pass environment variables to child process, # - communicate with stdin, stdout and stderr of the child process via pipes, # - retrieve execution's status code. # # ---- EXAMPLE 1 (simple execution) # # if execmd(['which', 'python']) == 0 # p "Python is installed" # end # # ---- EXAMPLE 2 (custom environment variables) # # execmd({:PYTHONPATH=>'/home/me/foo'}, [ 'python', '-m', 'bar']) # # ---- EXAMPLE 3 (communicating via stdin, stdout and stderr) # # script = <true, :stdin=>false, :stderr=>false) do |process,stdout| # p = stdout.read.chomp # process.wait # if (x = process.exit_code) == 0 # p "PYTHON: #{p}" # else # p "ERROR: #{x}" # end # end # # # OPTIONS: # # :process (default: false) -- pass process object as the first argument the to block, # :stdin (default: true) -- pass stdin object of the child process to the block for writting, # :stdout (default: true) -- pass stdout object of the child process to the block for reading, # :stderr (default: true) -- pass stderr object of the child process to the block for reading, # def execmd(*args) i = 0 if i < args.size if args[i].kind_of?(Hash) # args[0] may contain environment variables env = args[i] i += 1 else env = Hash[] end end if i < args.size if args[i].kind_of?(Array) args2 = args[i] else args2 = [ args[i] ] end program = args2[0] i += 1 else raise ArgumentError.new("missing argument: cmd") end if i < args.size if args[i].kind_of?(Hash) opts = Hash[args[i].map {|k,v| [k.to_sym, v]} ] i += 1 end else opts = Hash[] end opts[:process] = false unless opts.include?(:process) opts[:stdin] = true unless opts.include?(:stdin) opts[:stdout] = true unless opts.include?(:stdout) opts[:stderr] = true unless opts.include?(:stderr) if !program.include?("/") and !program_in_path?(program) raise ExecutableNotFound.new(program) end logger.info("Running command", :args => args2) stdout_r, stdout_w = IO.pipe stderr_r, stderr_w = IO.pipe stdin_r, stdin_w = IO.pipe pid = Process.spawn(env, *args2, :out => stdout_w, :err => stderr_w, :in => stdin_r) stdout_w.close; stderr_w.close logger.debug("Process is running", :pid => pid) if block_given? args3 = [] args3.push(process) if opts[:process] args3.push(stdin_w) if opts[:stdin] args3.push(stdout_r) if opts[:stdout] args3.push(stderr_r) if opts[:stderr] yield(*args3) stdin_w.close if opts[:stdin] and not stdin_w.closed? stdout_r.close unless stdout_r.closed? stderr_r.close unless stderr_r.closed? else # If no block given (not interactive) we should close stdin_w because we # won't be able to give input which may cause a hang. stdin_w.close # Log both stdout and stderr as 'info' because nobody uses stderr for # actually reporting errors and as a result 'stderr' is a misnomer. logger.pipe(stdout_r => :info, stderr_r => :info) end Process.waitpid(pid) status = $? return status.exitstatus end # def execmd # Run a command safely in a way that gets reports useful errors. def safesystem(*args) # ChildProcess isn't smart enough to run a $SHELL if there's # spaces in the first arg and there's only 1 arg. if args.size == 1 args = [ default_shell, "-c", args[0] ] end if args[0].kind_of?(Hash) env = args.shift() exit_code = execmd(env, args) else exit_code = execmd(args) end program = args[0] success = (exit_code == 0) if !success raise ProcessFailed.new("#{program} failed (exit code #{exit_code})" \ ". Full command was:#{args.inspect}") end return success end # def safesystem # Run a command safely in a way that captures output and status. def safesystemout(*args) if args.size == 1 args = [ ENV["SHELL"], "-c", args[0] ] end program = args[0] if !program.include?("/") and !program_in_path?(program) raise ExecutableNotFound.new(program) end stdout_r_str = nil exit_code = execmd(args, :stdin=>false, :stderr=>false) do |stdout| stdout_r_str = stdout.read end success = (exit_code == 0) if !success raise ProcessFailed.new("#{program} failed (exit code #{exit_code})" \ ". Full command was:#{args.inspect}") end return stdout_r_str end # def safesystemout # Get an array containing the recommended 'ar' command for this platform # and the recommended options to quickly create/append to an archive # without timestamps or uids (if possible). def ar_cmd return @@ar_cmd if defined? @@ar_cmd @@ar_cmd_deterministic = false # FIXME: don't assume current directory writeable emptyfile = Stud::Temporary.pathname testarchive = Stud::Temporary.pathname FileUtils.touch([emptyfile]) ["ar", "gar"].each do |ar| ["-qc", "-qcD"].each do |ar_create_opts| FileUtils.rm_f([testarchive]) # Return this combination if it creates archives without uids or timestamps. # Exitstatus will be nonzero if the archive can't be created, # or its table of contents doesn't match the regular expression. # Be extra-careful about locale and timezone when matching output. system("#{ar} #{ar_create_opts} #{testarchive} #{emptyfile} 2>/dev/null && env TZ=UTC LANG=C LC_TIME=C #{ar} -tv #{testarchive} | grep '0/0.*1970' > /dev/null 2>&1") if $?.exitstatus == 0 @@ar_cmd = [ar, ar_create_opts] @@ar_cmd_deterministic = true return @@ar_cmd end end end # If no combination of ar and options omits timestamps, fall back to default. @@ar_cmd = ["ar", "-qc"] FileUtils.rm_f([testarchive, emptyfile]) return @@ar_cmd end # def ar_cmd # Return whether the command returned by ar_cmd can create deterministic archives def ar_cmd_deterministic? ar_cmd if not defined? @@ar_cmd_deterministic return @@ar_cmd_deterministic end # def ar_cmd_deterministic? # Get the recommended 'tar' command for this platform. def tar_cmd return @@tar_cmd if defined? @@tar_cmd # FIXME: don't assume current directory writeable emptyfile = Stud::Temporary.pathname testarchive = Stud::Temporary.pathname FileUtils.touch([emptyfile]) # Prefer tar that supports more of the features we want, stop if we find tar of our dreams best="tar" bestscore=0 @@tar_cmd_deterministic = false # GNU Tar, if not the default, is usually on the path as gtar, but # Mac OS X 10.8 and earlier shipped it as /usr/bin/gnutar ["tar", "gtar", "gnutar"].each do |tar| opts=[] score=0 ["--sort=name", "--mtime=@0"].each do |opt| system("#{tar} #{opt} -cf #{testarchive} #{emptyfile} > /dev/null 2>&1") if $?.exitstatus == 0 opts << opt score += 1 end end if score > bestscore best=tar bestscore=score if score == 2 @@tar_cmd_deterministic = true break end end end @@tar_cmd = best FileUtils.rm_f([testarchive, emptyfile]) return @@tar_cmd end # def tar_cmd # Return whether the command returned by tar_cmd can create deterministic archives def tar_cmd_supports_sort_names_and_set_mtime? tar_cmd if not defined? @@tar_cmd_deterministic return @@tar_cmd_deterministic end # def tar_cmd_supports_sort_names_and_set_mtime? def copy_metadata(source, destination) source_stat = File::lstat(source) dest_stat = File::lstat(destination) # If this is a hard-link, there's no metadata to copy. # If this is a symlink, what it points to hasn't been copied yet. return if source_stat.ino == dest_stat.ino || dest_stat.symlink? File.utime(source_stat.atime, source_stat.mtime, destination) mode = source_stat.mode begin File.lchown(source_stat.uid, source_stat.gid, destination) rescue Errno::EPERM # clear setuid/setgid mode &= 01777 end unless source_stat.symlink? File.chmod(mode, destination) end end # def copy_metadata def copy_entry(src, dst, preserve=false, remove_destination=false) st = File.lstat(src) filetype = if st.ftype == "file" && st.nlink > 1 "hardlink" else st.ftype end case filetype when 'fifo' if File.respond_to?(:mkfifo) File.mkfifo(dst) elsif program_exists?("mkfifo") safesystem("mkfifo", dst) else raise NamedPipeCannotBeCopied("Unable to copy. Cannot find program 'mkfifo' and Ruby is missing the 'File.mkfifo' method: #{src}") end when 'socket' require "socket" # In 2019, Ruby's FileUtils added this as a way to "copy" a unix socket. # Reference: https://github.com/ruby/fileutils/pull/36/files UNIXServer.new(dst).close() when 'characterSpecial', 'blockSpecial' raise UnsupportedSpecialFile.new("File is device which fpm doesn't know how to copy (#{File.ftype(src)}): #{src}") when 'directory' FileUtils.mkdir(dst) unless File.exist? dst when 'hardlink' # Handle hardlinks # if the file with the same dev and inode has been copied already. # hard link it's copy to `dst`, otherwise make an actual copy known_entry = copied_entries[[st.dev, st.ino]] if known_entry FileUtils.ln(known_entry, dst) logger.debug("Copying hardlink", :src => src, :dst => dst, :link => known_entry) else FileUtils.copy_entry(src, dst, preserve, false, remove_destination) copied_entries[[st.dev, st.ino]] = dst end else # Normal file, just copy it. FileUtils.copy_entry(src, dst, preserve, false, remove_destination) end # else... end # def copy_entry def copied_entries # TODO(sissel): I wonder that this entry-copy knowledge needs to be put # into a separate class/module. As is, calling copy_entry the same way # in slightly different contexts will result in weird or bad behavior. # What I mean is if we do: # pkg = FPM::Package::Dir... # pkg.output()... # pkg.output()... # The 2nd output call will fail or behave weirdly because @copied_entries # is already populated. even though this is anew round of copying. return @copied_entries ||= {} end # def copied_entries def expand_pessimistic_constraints(constraint) name, op, version = constraint.split(/\s+/) if op == '~>' new_lower_constraint = "#{name} >= #{version}" version_components = version.split('.').collect { |v| v.to_i } version_prefix = version_components[0..-3].join('.') portion_to_work_with = version_components.last(2) prefix = '' unless version_prefix.empty? prefix = version_prefix + '.' end one_to_increment = portion_to_work_with[0].to_i incremented = one_to_increment + 1 new_version = ''+ incremented.to_s + '.0' upper_version = prefix + new_version new_upper_constraint = "#{name} < #{upper_version}" return [new_lower_constraint,new_upper_constraint] else return [constraint] end end #def expand_pesimistic_constraints def logger @logger ||= Cabin::Channel.get end # def logger def erbnew(template_code) # In Ruby 2.6(?), Ruby changed how ERB::new is invoked. # First, it added keyword args like `ERB.new(..., trim_mode: "-")` # Later, it deprecated then removed the safe_level feature. # As of Ruby 3.1, warnings are printed at runtime when ERB.new is called with the old syntax. # Ruby 2.5 and older does not support the ERB.new keyword args. # # My tests showed: # * Ruby 2.3.0 through 3.0 work correctly with the old syntax. # * Ruby 3.1.0 and newer (at time of writing, Ruby 3.2) require the new syntax # Therefore, in order to support the most versions of ruby, we need to do a version check # to invoke ERB.new correctly and without printed warnings. # References: https://github.com/jordansissel/fpm/issues/1894 # Honestly, I'm not sure if Gem::Version is correct to use in this situation, but it works. # on older versions of Ruby, RUBY_VERSION is a frozen string, and # Gem::Version.new calls String#strip! which throws an exception. # so we have to call String#dup to get an unfrozen copy. if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("3.1.0") # Ruby 3.0.x and older return ERB.new(template_code, nil, "-") else # Ruby 3.1.0 and newer return ERB.new(template_code, trim_mode: "-") end end # def erbnew end # module FPM::Util require 'fpm/util/tar_writer' ================================================ FILE: lib/fpm/version.rb ================================================ module FPM VERSION = "1.17.0" end ================================================ FILE: lib/fpm.rb ================================================ require "fpm/namespace" require "fpm/package" require "fpm/package/dir" require "fpm/package/gem" require "fpm/package/deb" require "fpm/package/npm" require "fpm/package/rpm" require "fpm/package/tar" require "fpm/package/cpan" require "fpm/package/pear" require "fpm/package/empty" require "fpm/package/puppet" require "fpm/package/python" require "fpm/package/osxpkg" require "fpm/package/solaris" require "fpm/package/p5p" require "fpm/package/pkgin" require "fpm/package/freebsd" require "fpm/package/apk" require "fpm/package/snap" ================================================ FILE: notify-failure.sh ================================================ #!/bin/sh "$@" status=$? if [ ! -z "$TMUX" ] ; then if [ "$status" -ne 0 ] ; then tmux display-message "Tests Fail" else tmux display-message "Tests OK" fi fi exit $status ================================================ FILE: requirements.txt ================================================ # Listing of fpm's Python package dependencies packaging ================================================ FILE: singularity.def ================================================ # Build command: # # singularity build fpm.simg singularity.def # # Execute instructions: # # singularity exec fpm.simg fpm --version # Bootstrap: docker From: alpine:3.7 %help Singularity container with Effing Package Management - FPM %post apk add --no-cache \ ruby \ ruby-dev \ gcc \ libffi-dev \ make \ libc-dev \ rpm gem install --no-ri --no-rdoc fpm ================================================ FILE: spec/acceptance/puppet/manifests/install.pp ================================================ node default { $package_provider = "$operatingsystem-$operatingsystemrelease" ? { /^(Fedora|RedHat|CentOS|OpenSuSE)/ => "rpm", /^(Debian|Ubuntu)/ => "dpkg", default => undef, } $package_source = "$operatingsystem-$operatingsystemrelease" ? { /^(Fedora|RedHat|CentOS|OpenSuSE)/ => "example-service-1.0-1.noarch.rpm", /^(Debian|Ubuntu)/ => "example-service_1.0_all.deb", default => undef, } $service_provider = "$operatingsystem-$operatingsystemrelease" ? { /^CentOS-6/ => "upstart", default => undef, } package { "example-service": provider => $package_provider, source => $package_source, ensure => present; } service { "example": provider => $service_provider, require => Package["example-service"], enable => true, ensure => running; } } ================================================ FILE: spec/acceptance/puppet/manifests/remove.pp ================================================ node default { $package_provider = "$operatingsystem-$operatingsystemrelease" ? { /^(Fedora|RedHat|CentOS)/ => "rpm", /^(Debian|Ubuntu)/ => "dpkg", default => undef, } $service_provider = "$operatingsystem-$operatingsystemrelease" ? { /^CentOS-6/ => "upstart", default => undef, } package { "example-service": require => Service["example"], provider => $package_provider, source => "example-service-1.0-1.noarch.rpm", ensure => absent; } service { "example": provider => $service_provider, enable => false, ensure => stopped; } } ================================================ FILE: spec/conversion/gem_to_deb.rb ================================================ require "spec_setup" require "fpm/command" # local require "fpm/package/deb" # local require "fpm/package/gem" # local require "stud/temporary" describe "-s gem -t deb" do # dpkg-deb lets us query deb package files. # Comes with debian and ubuntu systems. have_dpkg_deb = program_exists?("dpkg-deb") if !have_dpkg_deb Cabin::Channel.get("rspec") \ .warn("Skipping some deb tests because 'dpkg-deb' isn't in your PATH") end let(:fpm) { FPM::Command.new("fpm") } let(:target) { Stud::Temporary.pathname + ".deb" } after do File.unlink(target) if File.exist?(target) end before do insist { fpm.run(["-s", "gem", "-t", "deb", "-p", target, "rails"]) } == 0 end it "should have a correctly formatted Provides field" do deb = FPM::Package::Deb.new deb.input(target) # Converting gem->deb should format the deb Provides field as "rubygem-rails (= version)" insist { deb.provides.first } =~ /^rubygem-rails \(= \d+\.\d+\.\d+\)$/ end end # describe "-s gem -t deb" ================================================ FILE: spec/fixtures/deb/meta_test ================================================ asdf ================================================ FILE: spec/fixtures/deb/staging/etc/init.d/test ================================================ #! /bin/sh # Start/stop the test daemon. # ### BEGIN INIT INFO # Provides: test # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Test # Description: Test ### END INIT INFO . /lib/lsb/init-functions do_start() { : } do_stop() { : } do_restart() { : } do_reload() { : } case $1 in start) do_start ;; stop) do_stop ;; force-reload) do_reload ;; esac ================================================ FILE: spec/fixtures/deb/triggers ================================================ interest from-meta-file ================================================ FILE: spec/fixtures/gem/example/bin/example ================================================ #!/usr/bin/env ruby ================================================ FILE: spec/fixtures/gem/example/example.gemspec ================================================ Gem::Specification.new do |spec| spec.name = "example" spec.version = "1.0" spec.summary = "sample summary" spec.description = "sample description" spec.add_dependency("dependency1") # license: Ruby License spec.add_dependency("dependency2") #spec.files = ["hello.txt"] spec.files = [ "bin/example" ] spec.executables = "example" spec.bindir = "bin" #spec.require_paths << "lib" spec.author = "sample author" spec.email = "sample email" spec.homepage = "http://sample-url/" end ================================================ FILE: spec/fixtures/mockpackage.rb ================================================ require "fpm/namespace" require "fpm/package" class FPM::Package::Mock < FPM::Package def input(*args); end def output(*args); end end ================================================ FILE: spec/fixtures/python/METADATA ================================================ Metadata-Version: 2.4 Name: Django Version: 5.2.6 Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design. Author-email: Django Software Foundation License: BSD-3-Clause Project-URL: Homepage, https://www.djangoproject.com/ Project-URL: Documentation, https://docs.djangoproject.com/ Project-URL: Release notes, https://docs.djangoproject.com/en/stable/releases/ Project-URL: Funding, https://www.djangoproject.com/fundraising/ Project-URL: Source, https://github.com/django/django Project-URL: Tracker, https://code.djangoproject.com/ Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Framework :: Django Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Internet :: WWW/HTTP :: WSGI Classifier: Topic :: Software Development :: Libraries :: Application Frameworks Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=3.10 Description-Content-Type: text/x-rst License-File: LICENSE License-File: LICENSE.python License-File: AUTHORS Requires-Dist: asgiref>=3.8.1 Requires-Dist: sqlparse>=0.3.1 Requires-Dist: tzdata; sys_platform == "win32" Provides-Extra: argon2 Requires-Dist: argon2-cffi>=19.1.0; extra == "argon2" Provides-Extra: bcrypt Requires-Dist: bcrypt; extra == "bcrypt" Dynamic: license-file ====== Django ====== Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Thanks for checking it out. All documentation is in the "``docs``" directory and online at https://docs.djangoproject.com/en/stable/. If you're just getting started, here's how we recommend you read the docs: * First, read ``docs/intro/install.txt`` for instructions on installing Django. * Next, work through the tutorials in order (``docs/intro/tutorial01.txt``, ``docs/intro/tutorial02.txt``, etc.). * If you want to set up an actual deployment server, read ``docs/howto/deployment/index.txt`` for instructions. * You'll probably want to read through the topical guides (in ``docs/topics``) next; from there you can jump to the HOWTOs (in ``docs/howto``) for specific problems, and check out the reference (``docs/ref``) for gory details. * See ``docs/README`` for instructions on building an HTML version of the docs. Docs are updated rigorously. If you find any problems in the docs, or think they should be clarified in any way, please take 30 seconds to fill out a ticket here: https://code.djangoproject.com/newticket To get more help: * Join the ``#django`` channel on ``irc.libera.chat``. Lots of helpful people hang out there. `Webchat is available `_. * Join the `Django Discord community `_. * Join the community on the `Django Forum `_. To contribute to Django: * Check out https://docs.djangoproject.com/en/dev/internals/contributing/ for information about getting involved. To run Django's test suite: * Follow the instructions in the "Unit tests" section of ``docs/internals/contributing/writing-code/unit-tests.txt``, published online at https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/#running-the-unit-tests Supporting the Development of Django ==================================== Django's development depends on your contributions. If you depend on Django, remember to support the Django Software Foundation: https://www.djangoproject.com/fundraising/ ================================================ FILE: spec/fixtures/python/easy_install_default.py ================================================ # The following python code helps predicting easy_install's default behavior. # See: http://stackoverflow.com/a/9155056 from setuptools.command.easy_install import easy_install class _easy_install_default(easy_install): """ class easy_install had problems with the fist parameter not being an instance of Distribution, even though it was. This is due to some import-related mess. """ def __init__(self): from distutils.dist import Distribution dist = Distribution() self.distribution = dist self.initialize_options() self._dry_run = None self.verbose = dist.verbose self.force = None self.help = 0 self.finalized = 0 default_options = _easy_install_default() import distutils.errors try: default_options.finalize_options() except distutils.errors.DistutilsError: pass __all__=[default_options] ================================================ FILE: spec/fixtures/python/requirements.txt ================================================ rtxt-dep1 > 0.1 rtxt-dep2 == 0.1 rtxt-dep3; python_version == "2.0" rtxt-dep4; python_version > "2.0" ================================================ FILE: spec/fixtures/python/setup.py ================================================ from setuptools import setup setup(name="Example", version="1.0", description="sample description", author="sample author", author_email="sample email", url="sample url", packages=[], package_dir={}, install_requires=[ "Dependency1", "dependency2", 'rtxt-dep3; python_version == "2.0"', 'rtxt-dep4; python_version > "2.0"', ], ) ================================================ FILE: spec/fixtures/python-pyproject.toml/pyproject.toml ================================================ [project] name = "example" version = "1.2.3" authors = [ { name = "Captain Fancy", email = "foo@example.com" } ] ================================================ FILE: spec/fixtures/virtualenv/requirements.txt ================================================ pip==8.1.2 ================================================ FILE: spec/fpm/command_spec.rb ================================================ require "spec_setup" require "stud/temporary" require "fpm" # local require "fpm/command" # local require "fixtures/mockpackage" require "shellwords" describe FPM::Command do describe "--prefix" describe "-C / --chdir" describe "-p / --package" describe "-f" describe "-n" describe "-v" describe "--iteration" describe "--epoch" describe "--license" describe "--vendor" describe "--category" describe "-d / --depends" describe "--no-depends" describe "--provides" describe "--conflicts" describe "--replaces" describe "--config-files" describe "--directories" describe "-a | --architecture" describe "--workdir" do subject { FPM::Command.new("fpm") } context "with an nonexistent path" do it "should fail aka return nonzero exit" do args = ["--workdir", "/this/path/should/not/exist", "-s", "rpm", "-t", "empty", "-n", "example"] insist { subject.run(args) } != 0 end end context "with a path that is not a directory" do it "should fail aka return nonzero exit" do Stud::Temporary.file do |file| args = ["--workdir", file.path, "-s", "rpm", "-t", "empty", "-n", "example"] insist { subject.run(args) } != 0 end end end end describe "-v | --version" do subject { FPM::Command.new("fpm") } # Have output from `fpm` cli be nulled. let(:null) { File.open(File::NULL, "w") } let!(:stdout) { $stdout } before do $stdout = null end after do $stdout = stdout end context "when no rc file is present" do it "should not fail" do stub_const('ARGV', ["--version"]) insist { subject.run(["--version"]) } == 0 stub_const('ARGV', ["-v"]) insist { subject.run(["-v"]) } == 0 end end context "when rc file is present" do it "should not fail" do Stud::Temporary.directory do |path| File.open(File.join(path, ".fpm"), "w") { |file| file.puts("-- --rpm-sign") } stub_const('ARGV', [ "--version" ]) insist { subject.run(["--version"]) } == 0 stub_const('ARGV', [ "-v" ]) insist { subject.run(["-v"]) } == 0 end end end end describe "-p | --package" do context "when given a directory" do it "should write the package to the given directory." do Stud::Temporary.directory do |path| cmd = FPM::Command.new("fpm") cmd.run(["-s", "empty", "-t", "deb", "-n", "example", "-p", path]) files = Dir.new(path).to_a - [".", ".."] insist { files.size } == 1 insist { files[0] } =~ /^example_/ end end end context "when not set" do it "should write the package to the current directory." do Stud::Temporary.directory do |path| Dir.chdir(path) do cmd = FPM::Command.new("fpm") cmd.run(["-s", "empty", "-t", "deb", "-n", "example"]) end files = Dir.new(path).to_a - ['.', '..'] insist { files.size } == 1 insist { files[0] } =~ /example_/ end end end end describe "--log" do subject { FPM::Command.new("fpm") } let (:args) { [ "-s", "mock", "-t", "mock" ] } context "when not given" do it "should not raise an exception" do subject.parse(args) end end context "when given a valid log level" do it "should not raise an exception" do subject.parse(args + ["--log", "error"]) subject.parse(args + ["--log", "warn"]) subject.parse(args + ["--log", "info"]) subject.parse(args + ["--log", "debug"]) end end context "when given an invalid log level" do it "should raise an exception" do insist { subject.parse(args + ["--log", ""]) }.raises FPM::Package::InvalidArgument insist { subject.parse(args + ["--log", "whatever"]) }.raises FPM::Package::InvalidArgument insist { subject.parse(args + ["--log", "fatal"]) }.raises FPM::Package::InvalidArgument end end end describe "--fpm-options-file" do let(:path) { Stud::Temporary.pathname } subject = FPM::Command.new("fpm") after do File.unlink(path) if File.exist?(path) end context "when considering option order" do before do File.write(path, [ "--name file-value", ].join($/)) end it "should process options file content in-place" do cli = [ "--name", "cli-value" ] fileopt = [ "--fpm-options-file", path ] subject.parse(cli + fileopt) insist { subject.name } == "file-value" subject = FPM::Command.new("fpm") subject.parse(fileopt + cli) insist { subject.name } == "cli-value" end end context "with multiple flags on a single line" do before do File.write(path, [ "--version 123 --name fancy", ].join($/)) end it "should work" do subject.parse(["--fpm-options-file", path]) insist { subject.name } == "fancy" insist { subject.version } == "123" end end context "with multiple single-letter flags on a single line" do subject { FPM::Command.new("fpm") } context "separately" do before do File.write(path, [ "-f -f -f -f" ].join($/)) end it "should work" do subject.parse(["--fpm-options-file", path]) end end context "together" do before do File.write(path, [ "-ffff" ].join($/)) end it "should work" do subject.parse(["--fpm-options-file", path]) end end end context "when a file refers to itself" do subject { FPM::Command.new("fpm") } before do File.write(path, [ "--version 1.0", "--fpm-options-file #{Shellwords.shellescape(path)}", "--iteration 1", ].join($/)) end it "should raise an exception" do insist { subject.parse([ "--fpm-options-file", Shellwords.shellescape(path) ]) }.raises FPM::Package::InvalidArgument end end context "when using an nonexistent file" do it "should raise an exception" do # At this point, 'path' file hasn't been created, so we should be safe to assume it doesn't exist. insist { subject.parse([ "--fpm-options-file", path ]) }.raises Errno::ENOENT end end context "when using an unreadable file (no permission to read)" do it "should raise an exception" do File.write(path, "") File.chmod(000, path) # At this point, 'path' file hasn't been created, so we should be safe to assume it doesn't exist. insist { subject.parse([ "--fpm-options-file", path ]) }.raises Errno::EACCES end end context "when reading a large file" do let(:fd) { File.new(path, "w") } before do # Write more than 100kb max = 105 * 1024 data = "\n" * 4096 bytes = 0 bytes += fd.syswrite(data) while bytes < max fd.flush end after do fd.close end it "should raise an exception" do insist { subject.parse([ "--fpm-options-file", path ]) }.raises FPM::Package::InvalidArgument end end end end ================================================ FILE: spec/fpm/package/cpan_spec.rb ================================================ require "spec_setup" require "tmpdir" # for Dir.mktmpdir require "fpm" # local require "fpm/package/cpan" # local have_cpanm = program_exists?("cpanm") if !have_cpanm Cabin::Channel.get("rspec") \ .warn("Skipping CPAN tests because 'cpanm' isn't in your PATH") end describe FPM::Package::CPAN do before do skip("Missing cpanm program") unless have_cpanm end subject { FPM::Package::CPAN.new } after :each do subject.cleanup end it "should prepend package name prefix" do subject.attributes[:cpan_package_name_prefix] = "prefix" insist { subject.instance_eval { fix_name("Foo::Bar") } } == "prefix-Foo-Bar" end it "should wrap name in perl()" do insist { subject.instance_eval { cap_name("Foo::Bar") } } == "perl(Foo::Bar)" end it "should return successful HTTP resonse" do response = subject.instance_eval { httpfetch("https://fastapi.metacpan.org/v1/module/File::Temp") } insist { response.class } == Net::HTTPOK end it "should return successful HTTP resonse" do response = subject.instance_eval {httppost( "https://fastapi.metacpan.org/v1/release/_search?_source=download_url", "{\"query\":{\"term\":{\"name\":\"File-Temp-0.2310\"}}}" )} insist { response.class } == Net::HTTPOK end it "should return metadata hash" do metadata = subject.instance_eval { search_module("File::Temp") } insist { metadata.class } == Hash insist { metadata["name"] } == "Temp.pm" insist { metadata["distribution"] } == "File-Temp" end it "should download precise version" do metadata = subject.instance_eval { search_module("Set::Tiny") } insist { File.basename(subject.instance_eval { download(metadata, "0.01") }) } == "Set-Tiny-0.01.tar.gz" end it "should find distributions provided modules" do provided_modules = subject.instance_eval { search_provided_modules("Test-DB", "0.10") } insist { provided_modules } == ["perl(Test::DB) = 0.10", "perl(Test::DB::Mssql) = 0.10", "perl(Test::DB::Mysql) = 0.10", "perl(Test::DB::Postgres) = 0.10", "perl(Test::DB::Sqlite) = 0.10"] # The Set-Tiny-0.01 release provides a single module, Set::Tiny version 0.01 provided_modules = subject.instance_eval { search_provided_modules("Set-Tiny", "0.01") } insist { provided_modules } == ["perl(Set::Tiny) = 0.01"] # Class::DI has packages with no version provided_modules = subject.instance_eval { search_provided_modules("Class-DI", "0.03") } insist { provided_modules } == ["perl(Class::DI) = 0.03", "perl(Class::DI::Definition)", "perl(Class::DI::Factory)", "perl(Class::DI::Resource)", "perl(Class::DI::Resource::YAML)"] # File::Spec is a module provided by the PathTools distribution provided_modules = subject.instance_eval { search_provided_modules("File-Spec", "3.75") } insist { provided_modules } == [] end it "should package Digest::MD5" do # Set the version explicitly because we default to installing the newest # version, and a new version could be released that breaks the test. subject.instance_variable_set(:@version, "2.58"); # Disable testing because we don't really need to run the cpan tests. The # goal is to see the parsed result (name, module description, etc) # Additionally, it fails on my workstation when cpan_test? is enabled due # to not finding `Test.pm`, and it seems like a flakey test if we keep this # enabled. subject.attributes[:cpan_test?] = false subject.input("Digest::MD5") insist { subject.name } == "perl-Digest-MD5" insist { subject.description } == "Perl interface to the MD-5 algorithm" insist { subject.vendor } == "Gisle Aas " insist { subject.dependencies.sort } == ["perl >= 5.006", "perl(Digest::base) >= 1.00", "perl(XSLoader)"] insist { subject.provides } == ["perl(Digest::MD5) = 2.58"] end it "should package Regexp::Common" do # Set the version explicitly because we default to installing the newest # version, and a new version could be released that breaks the test. subject.instance_variable_set(:@version, "2024080801"); subject.attributes[:cpan_test?] = false subject.input("Regexp::Common") insist { subject.name } == "perl-Regexp-Common" insist { subject.dependencies.sort } == ["perl >= 5.010", "perl(Config)", "perl(strict)", "perl(vars)", "perl(warnings)"] end it "should unpack tarball containing ./ leading paths" do Dir.mktmpdir do |tmpdir| # Create tarball containing a file './foo/bar.txt' system("mkdir -p #{tmpdir}/z/foo") system("touch #{tmpdir}/z/foo/bar.txt") system("tar -C #{tmpdir} -cvzf #{tmpdir}/z.tar.gz .") # Invoke the unpack method directory = subject.instance_eval { unpack("#{tmpdir}/z.tar.gz") } insist { File.file?("#{directory}/foo/bar.txt") } == true end end it "should package File::Spec" do subject.instance_variable_set(:@version, "3.75"); subject.attributes[:cpan_test?] = false subject.input("File::Spec") # the File::Spec module comes from the PathTools CPAN distribution insist { subject.name } == "perl-PathTools" end it "should package Class::Data::Inheritable" do # Class::Data::Inheritable version 0.08 has a blank author field in its # META.yml file. subject.instance_variable_set(:@version, "0.08"); subject.attributes[:cpan_test?] = false subject.input("Class::Data::Inheritable") insist { subject.vendor } == "No Vendor Or Author Provided" end context "given a distribution without a META.* file" do it "should package IPC::Session" do subject.instance_variable_set(:@version, "0.05"); subject.attributes[:cpan_test?] = false # IPC::Session fails 'make test' subject.input("IPC::Session") end end end # describe FPM::Package::CPAN ================================================ FILE: spec/fpm/package/deb_spec.rb ================================================ require "spec_setup" require 'fileutils' require "fpm" # local require "fpm/package/deb" # local require "fpm/package/dir" # local require "fpm/package/cpan" # local require "stud/temporary" require "English" # for $CHILD_STATUS describe FPM::Package::Deb do # dpkg-deb lets us query deb package files. # Comes with debian and ubuntu systems. have_dpkg_deb = program_exists?("dpkg-deb") if !have_dpkg_deb Cabin::Channel.get("rspec") \ .warn("Skipping some deb tests because 'dpkg-deb' isn't in your PATH") end have_lintian = program_exists?("lintian") if !have_lintian Cabin::Channel.get("rspec") \ .warn("Skipping some deb tests because 'lintian' isn't in your PATH") end let(:target) { Stud::Temporary.pathname + ".deb" } after do subject.cleanup File.unlink(target) if File.exist?(target) end describe "#architecture" do it "should convert x86_64 to amd64" do subject.architecture = "x86_64" expect(subject.architecture).to(be == "amd64") end it "should convert aarch64 to arm64" do subject.architecture = "aarch64" expect(subject.architecture).to(be == "arm64") end it "should convert noarch to all" do subject.architecture = "noarch" expect(subject.architecture).to(be == "all") end let(:native) do if program_exists?("dpkg") `dpkg --print-architecture`.chomp else `uname -m`.chomp end end it "should default to native" do # Convert kernel name to debian name expected = if native == "x86_64" "amd64" elsif native == "aarch64" "arm64" else native end expect(subject.architecture).to(be == expected) end end describe "#iteration" do it "should default to nil" do expect(subject.iteration).to(be_nil) end end describe "#epoch" do it "should default to nil" do expect(subject.epoch).to(be_nil) end end describe "priority" do it "should default to 'optional'" do expect(subject.attributes[:deb_priority]).to(be == "optional") end end describe "use-file-permissions" do it "should be nil by default" do expect(subject.attributes[:deb_use_file_permissions?]).to(be_nil) end end describe "#to_s" do before do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" end it "should have a default output usable as a filename" do # This is the default filename I see commonly produced by debuild insist { subject.to_s } == "name_123-100_all.deb" end context "when iteration is nil" do before do subject.iteration = nil end it "should not include iteration if it is nil" do # This is the default filename I see commonly produced by debuild expect(subject.to_s).to(be == "name_123_all.deb") end end end context "supporting debian policy hacks" do before do subject.name = "Capitalized_Name_With_Underscores" end it "should lowercase the package name" do expect(subject.name).to(be == subject.name.downcase) end it "should replace underscores with dashes in the package name" do expect(subject.name).not_to(be_include("_")) end it "should replace spaces with dashes in the package name" do expect(subject.name).not_to(be_include(" ")) end end context "when validating the version field" do [ "_", "1_2", "abc def", "%", "1^a"].each do |v| it "should reject as invalid, '#{v}'" do subject.version = v insist { subject.version }.raises FPM::InvalidPackageConfiguration end end [ "1", "1.2", "1.2.3", "20200101", "1~beta", "1whatever"].each do |v| it "should accept '#{v}'" do subject.version = v # should not raise exception insist { subject.version } == v end it "should remove a leading 'v' from v#{v} and still accept it" do subject.version = "v#{v}" # should not raise exception insist { subject.version } == v end end end describe "#output" do let(:original) { FPM::Package::Deb.new } let(:input) { FPM::Package::Deb.new } before do # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. # The target file must not exist. original.name = "name" original.version = "123" original.iteration = "100" original.epoch = "5" original.architecture = "all" original.dependencies << "something > 10" original.dependencies << "hello >= 20" original.provides << "#{original.name} (= #{original.version})" # Test to cover PR#591 (fix provides names) original.provides << "Some-SILLY_name" original.conflicts = ["foo < 123"] original.replaces = ["package < 1.2.3"] original.attributes[:deb_breaks] = ["baz < 123"] original.attributes[:deb_build_depends_given?] = true original.attributes[:deb_build_depends] ||= [] original.attributes[:deb_build_depends] << 'something-else > 0.0.0' original.attributes[:deb_build_depends] << 'something-else < 1.0.0' original.attributes[:deb_priority] = "fizzle" original.attributes[:deb_field_given?] = true original.attributes[:deb_field] = { "foo" => "bar" } original.attributes[:deb_meta_file] = %w(meta_test triggers).map do |fn| File.expand_path("../../../fixtures/deb/#{fn}", __FILE__) end original.attributes[:deb_interest] = ['asdf', 'hjkl'] original.attributes[:deb_activate] = ['qwer', 'uiop'] original.attributes[:deb_interest_noawait] = ['aqwx', 'zsxc'] original.attributes[:deb_activate_noawait] = ['edcv', 'rfvb'] original.output(target) input.input(target) end after do original.cleanup input.cleanup end # after context "when the deb's control section is extracted" do let(:control_dir) { Stud::Temporary.directory } before do system(ar_cmd[0] + " p '#{target}' control.tar.gz | tar -zx -C '#{control_dir}' -f -") raise "couldn't extract test deb" unless $CHILD_STATUS.success? end it "should have the requested meta file in the control archive" do File.open(File.join(control_dir, 'meta_test')) do |f| insist { f.read.chomp } == "asdf" end end it "should have the requested triggers in the triggers file" do triggers = File.open(File.join(control_dir, 'triggers')) do |f| f.read end reject { triggers =~ /^interest from-meta-file$/ }.nil? reject { triggers =~ /^interest asdf$/ }.nil? reject { triggers =~ /^interest hjkl$/ }.nil? reject { triggers =~ /^activate qwer$/ }.nil? reject { triggers =~ /^activate uiop$/ }.nil? reject { triggers =~ /^interest-noawait aqwx$/ }.nil? reject { triggers =~ /^interest-noawait zsxc$/ }.nil? reject { triggers =~ /^activate-noawait edcv$/ }.nil? reject { triggers =~ /^activate-noawait rfvb$/ }.nil? insist { triggers[-1] } == "\n" end after do FileUtils.rm_rf(control_dir) end end context "package attributes" do it "should have the correct name" do insist { input.name } == original.name end it "should have the correct version" do insist { input.version } == original.version end it "should have the correct iteration" do insist { input.iteration } == original.iteration end it "should have the correct epoch" do insist { input.epoch } == original.epoch end it "should have the correct dependencies" do original.dependencies.each do |dep| insist { input.dependencies }.include?(dep) end end it "should fix capitalization and underscores-to-dashes (#591)" do insist { input.provides }.include?("some-silly-name") end end # package attributes # This section mainly just verifies that 'dpkg-deb' can parse the package. context "when read with dpkg" do before do skip("Missing dpkg-deb program") unless have_dpkg_deb end def dpkg_field(field) return `dpkg-deb -f #{target} #{field}`.chomp end # def dpkg_field it "should have the correct name" do insist { dpkg_field("Package") } == original.name end it "should have the correct 'epoch:version-iteration'" do insist { dpkg_field("Version") } == original.to_s("EPOCH:VERSION-ITERATION") end it "should have the correct priority" do insist { dpkg_field("Priority") } == original.attributes[:deb_priority] end it "should have the correct dependency list" do # 'something > 10' should convert to 'something (>> 10)', etc. insist { dpkg_field("Depends") } == "something (>> 10), hello (>= 20)" end it "should have the correct replaces list" do # 'package < 1.2.3' should convert to 'package (<< 1.2.3)' insist { dpkg_field("Replaces") } == "package (<< 1.2.3)" end it "should have the correct build dependency list" do insist { dpkg_field("Build-Depends") } == "something-else (>> 0.0.0), something-else (<< 1.0.0)" end it "should have a custom field 'foo: bar'" do insist { dpkg_field("foo") } == "bar" end it "should have the correct Conflicts" do insist { dpkg_field("Conflicts") } == "foo (<< 123)" end it "should have the correct Breaks" do insist { dpkg_field("Breaks") } == "baz (<< 123)" end end end # #output describe "#output with no depends" do let(:original) { FPM::Package::Deb.new } let(:input) { FPM::Package::Deb.new } before do # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. original.name = "name" original.version = "123" original.iteration = "100" original.epoch = "5" original.architecture = "all" original.dependencies << "something > 10" original.dependencies << "hello >= 20" original.attributes[:no_depends?] = true original.output(target) input.input(target) end after do original.cleanup input.cleanup end # after it "should have no dependencies" do insist { input.dependencies }.empty? end end # #output with no dependencies describe "#output converted from CPAN" do skip("Missing cpanm program") unless program_exists?("cpanm") let(:input) { FPM::Package::CPAN.new } let(:input_name) { "Digest::MD5" } before :each do input.instance_variable_set(:@version, "2.58"); input.attributes[:cpan_test?] = false input.attributes[:rejects] = ['vars','warnings','strict','Config'] end after :each do input.cleanup end it "should ignore dependencies in attributes[:rejects]" do input.attributes[:rejects] += ["Digest::base", "XSLoader"] input.input(input_name) package = input.convert(FPM::Package::Deb) insist { package.dependencies.sort } == ["perl (>= 5.006)"] end it "should name package and deps according to Debians Perl packaging standard" do input.input(input_name) package = input.convert(FPM::Package::Deb) insist { package.name } == "libdigest-md5-perl" insist { package.dependencies.sort.first } == "libdigest-base-perl (>= 1.00)" end end # #output converted from CPAN describe "#tar_flags" do let(:package) { FPM::Package::Deb.new } before :each do package.name = "name" end after :each do package.cleanup end # after it "should set the user for the package's data files" do package.attributes[:deb_user] = "nobody" # output a package so that @data_tar_flags is computed expect(package.data_tar_flags).to(be == ["--owner", "nobody", "--numeric-owner", "--group", "0"]) end it "should set the group for the package's data files" do package.attributes[:deb_group] = "nogroup" # output a package so that @data_tar_flags is computed expect(package.data_tar_flags).to(be == ["--numeric-owner", "--owner", "0", "--group", "nogroup"]) end it "should not set the user or group for the package's data files if :deb_use_file_permissions? is not nil" do package.attributes[:deb_use_file_permissions?] = true # output a package so that @data_tar_flags is computed package.output(target) expect(package.data_tar_flags).to(be == []) end end # #tar_flags describe "#output with lintian" do let(:staging_path) { Stud::Temporary.directory } before do # TODO(sissel): Refactor this to use factory pattern instead of fixture? FileUtils.cp_r(Dir['spec/fixtures/deb/staging/*'], staging_path) ['/etc', '/etc/init.d', '/etc/init.d/test'].each do |f| File.chmod(0755, File.join(staging_path, f)) # cp_r may mess-up with attributes end subject.name = "name" subject.version = "0.0.1" subject.maintainer = "Jordan Sissel " subject.description = "Test package\nExtended description." subject.attributes[:deb_user] = "root" subject.attributes[:deb_group] = "root" subject.category = "comm" subject.dependencies << "debconf" subject.instance_variable_set(:@staging_path, staging_path) subject.output(target) end after do FileUtils.rm_r staging_path if File.exist? staging_path end # after context "when run against lintian" do before do skip("Missing lintian program") unless have_lintian end lintian_errors_to_ignore = [ "no-copyright-file", "script-in-etc-init.d-not-registered-via-update-rc.d" ] it "should return no errors" do lintian_output = `lintian #{target} --suppress-tags '#{lintian_errors_to_ignore.join(",")}'` expect($CHILD_STATUS).to eq(0), lintian_output end end end describe "#output with Provides values" do let(:original) { FPM::Package::Deb.new } before do # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. original.name = "name" original.version = "123" end after do original.cleanup end # after invalid = [ "this is not valid", "hello = world", "hello ()", "hello (>)", "hello (1234)", "foo (<< 1.0.0-54)" ] valid = [ "libc", "libc (= 6)", "bar (= 1:1.0)", "bar (= 1:1.0-1)", "foo (= 1.0.0-54)" ] invalid.each do |i| it "should reject '#{i}'" do original.provides << i insist { original.output(target) }.raises FPM::InvalidPackageConfiguration end end valid.each do |i| it "should accept '#{i}'" do original.provides << i original.output(target) end end end describe "#reproducible" do let(:package) { # Turn on reproducible build behavior by setting SOURCE_DATE_EPOCH like user would val = FPM::Package::Deb.new val.attributes[:source_date_epoch] = '1' # one second into Jan 1 1970 UTC... '0' not supported by zlib binding :-( val } before :each do package.name = "name" File.unlink(target + '.orig') if File.exist?(target + '.orig') end after :each do package.cleanup File.unlink(target + '.orig') if File.exist?(target + '.orig') end # after it "it should output bit-for-bit identical packages" do cmds = [] cmds << "ar" if not ar_cmd_deterministic? cmds << "tar" if not tar_cmd_supports_sort_names_and_set_mtime? if not cmds.empty? skip("fpm searched for variants of [#{cmds.join(", ")}] that support(s) deterministic archives, but found none, so can't test reproducibility.") return end package.output(target) # FIXME: 2nd and later runs create changelog.Debian.gz?!, so throw away output of 1st run FileUtils.rm(target) package.output(target) FileUtils.mv(target, target + '.orig') # Output a second time with a different timestamp; tar format time resolution is 1 second sleep(1) package.output(target) # Show detailed differences, if diffoscope is on PATH; else do nothing tmp = ENV['TMP'] || "/tmp" log = File.join(tmp, "diffoscope.log.tmp") system('diffoscope %s %s > %s 2> /dev/null' % [target, target + '.orig', log]) diffoscope_diff_length = File.size(log) if (diffoscope_diff_length > 0) puts("\nDiffoscope reports:") puts(File.read(log)) end expect(diffoscope_diff_length).to(be == 0) File.unlink(log) expect(FileUtils.compare_file(target, target + '.orig')).to be true end end # #reproducible describe "compression" do { "bzip2" => "bz2", "xz" => "xz", "gz" => "gz", "zst" => "zst" }.each do |flag,suffix| context "when --deb-compression is #{flag}" do let(:target) { Stud::Temporary.pathname + ".deb" } after do subject.cleanup File.unlink(target) if File.exist?(target) end before do deb = FPM::Package::Deb.new deb.name = "name" deb.attributes[:deb_compression] = flag deb.output(target) end control_suffix = case flag when 'bzip2' 'gz' else suffix end it "should use #{suffix} for data file and #{control_suffix} for control file" do list = `ar t #{target}`.split("\n") insist { list }.include?("control.tar.#{control_suffix}") insist { list }.include?("data.tar.#{suffix}") end # For issue #1840, PR #1841 # fpm should generate deb packages that do not cause lintian to crash it "should not cause lintian to crash" do skip("Missing lintian program") unless have_lintian # Have lintian run with only one check. The goal here is to check if # lintian crashes or not. This 'symlinks' check would normaly check # for broken symlinks. Since this package has no files, this check # should always succeed. It would fail if fpm generated any invalid # packages, such as ones with a bzip2-compressed control.tar file (#1840) # # Note: At some point, Debian renamed the "symlinks" check to "files/symbolic-links/broken" # In order to support both newer and older Debian derivatives, the test suite will try both checks, # and if both fail, we should know something is wrong with the package. insist { system("lintian", "-C", "symlinks", target) || system("lintian", "-C", "files/symbolic-links/broken", target) } == true end end end end end # describe FPM::Package::Deb ================================================ FILE: spec/fpm/package/dir_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/dir" # local require "stud/temporary" require "insist/assert" if RUBY_VERSION =~ /^1\.8/ # The following method copied from ruby 1.9.3 module SecureRandom def self.uuid ary = self.random_bytes(16).unpack("NnnnnN") ary[2] = (ary[2] & 0x0fff) | 0x4000 ary[3] = (ary[3] & 0x3fff) | 0x8000 "%08x-%04x-%04x-%04x-%04x%08x" % ary end end end describe FPM::Package::Dir do let(:tmpdir) { Stud::Temporary.directory("tmpdir") } let(:output) { Stud::Temporary.directory("output") } #let(:tmpdir) { ::Dir.mkdir("/tmp/tmpdir"); "/tmp/tmpdir" } #let(:output) { ::Dir.mkdir("/tmp/output"); "/tmp/output" } after :each do subject.cleanup FileUtils.rm_r(tmpdir) FileUtils.rm_r(output) end # after it "single file: should copy single files to the root of the output" do hello_in = File.join(tmpdir, "hello") hello_out = File.join(output, tmpdir, "hello") file = File.write(hello_in, "Hello world") subject.input(tmpdir) subject.output(output) insist { File.read(hello_out) } == File.read(hello_in) end it "should copy the full path given (single file)" do dir = File.join(tmpdir, "a", "b", "c") FileUtils.mkdir_p(dir) hello_in = File.join(dir, "hello") hello_out = File.join(output, dir, "hello") File.write(hello_in, "Hello world") subject.input(tmpdir) subject.output(output) insist { File.read(hello_out) } == File.read(hello_in) end it "should copy entire directories given as input" do dir = File.join(tmpdir, "a", "b", "c") FileUtils.mkdir_p(dir) files = rand(50).times.collect do |i| file = File.join(dir, "hello-#{i}") File.write(file, rand(1000)) next file end subject.input(tmpdir) subject.output(output) files.each do |file| insist { File.read(File.join(output, file)) } == File.read(file) end end it "should obey the :prefix attribute" do prefix = subject.attributes[:prefix] = "/usr/local" file = File.join(tmpdir, "hello") File.write(file, "Hello world") subject.input(tmpdir) subject.output(output) expected_path = File.join(".", file) path = File.join(prefix, expected_path) insist { File.read(File.join(output, path)) } == File.read(file) end it "should obey :chdir and :prefix attributes together" do prefix = subject.attributes[:prefix] = "/usr/local" chdir = subject.attributes[:chdir] = tmpdir file = File.join(tmpdir, "hello") File.write(file, "Hello world") subject.input(".") # since we chdir, copy the entire root subject.output(output) # path relative to the @output directory. expected_path = File.join(".", prefix, File.basename(file)) insist { File.read(File.join(output, expected_path)) } == File.read(file) end context "path mapping" do # 'rsync -a' semantics mappings = { # this input => should produce this file "/a/b=/example" => "./example", "/a/b=/example/" => "./example/b", "/a=/example/" => "./example/a/b", "/a=/example" => "./example/a/b", "/a/=/example/" => "./example/b" } mappings.each do |input, expected_file| it "should take #{input} and produce #{expected_file}" do Dir.mkdir(File.join(tmpdir, "a")) File.write(File.join(tmpdir, "a", "b"), "hello world") subject.input(File.join(tmpdir, input)) subject.output(output) insist { File }.exist?(File.join(output, expected_file)) end end it "should not map existing paths with = in them" do File.write(File.join(tmpdir, "a=b"), "hello world") subject.input(File.join(tmpdir, "a=b")) subject.output(output) insist { File }.exist?(File.join(output, tmpdir, "a=b")) end it "should not map existing paths with = in them and obey :chdir and :prefix attributes" do Dir.mkdir(File.join(tmpdir, "a")) File.write(File.join(tmpdir,"a", "a=b"), "hello world") subject.attributes[:chdir] = tmpdir subject.attributes[:prefix] = "/foo" subject.input(File.join("a", "a=b")) subject.output(output) insist { File }.exist?(File.join(output, "foo", "a", "a=b")) end it "should create two normal files when one normal file is copied to two different locations" do # For issue #2102 # With the following: fpm -s dir ... pathA=/location1 pathA=location2 # The above command was copying pathA to both locations but hardlinking them instead of creating normal files. foo = File.join(tmpdir, "foo") File.write(foo, "hello world") paths = [ "/opt/example/foo", "/usr/share/example/foo" ] paths.each do |path| subject.input("#{foo}=#{path}") end subject.output(output) outfiles = paths.collect { |path| File.join(output, path) } expect(outfiles).to all(satisfy("have link count == 1") { |path| File.lstat(path).nlink == 1 }) end end context "hardlinks" do it "should create hardlinks when inputs are hardlinks (within the context of the target package)" do # For issue #2102 # With the following: fpm -s dir ... pathA=/location1 pathA=location2 # The above command was copying pathA to both locations but hardlinking them instead of creating normal files. foo = File.join(tmpdir, "foo") bar = File.join(tmpdir, "bar") File.write(foo, "hello world") File.link(foo, bar) subject.attributes[:chdir] = tmpdir subject.input(".") subject.output(output) outfiles = ["foo", "bar"].collect { |path| File.join(output, path) } expect(outfiles).to all(satisfy("have link count == 2") { |path| File.stat(path).nlink == 2 }) end end context "SYMLINKS." do let(:path) { Stud::Temporary.pathname } let(:broken_target) { File.join("no", "such", "path", "here", rand(1000).to_s, rand(1000).to_s) } before do File.symlink(broken_target, path) end after do File.unlink(path) end it "should copy a broken symlink because it shouldn't be following symlinks to begin with" do subject.input(path) end end context "symlink=dest_symlink." do it "Should not put the symlink into directory" do filepath = File.join(tmpdir, "target") File.write(filepath, "hello!"); symlinkpath = File.join(tmpdir, "properlink.so") File.symlink(filepath, symlinkpath); subject.input(symlinkpath + "=" + "/a/b/properlink.so") subject.output(output) insist { File.read(File.join(output, "/a/b/properlink.so")) } == "hello!" end end context "symlink=dest_directory/" do it "Should allow source=destination/ for symlinks" do filepath = File.join(tmpdir, "target") File.write(filepath, "hello!"); symlinkpath = File.join(tmpdir, "properlink.so") File.symlink(filepath, symlinkpath); subject.input(symlinkpath + "=" + "/a/b/") subject.output(output) insist { File.read(File.join(output, "/a/b/properlink.so")) } == "hello!" end end context "symlink=dest_dir/" do it "Should put the symlink into directory with link syntax" do filepath = File.join(tmpdir, "target") File.write(filepath, "hello!"); symlinkpath = File.join(tmpdir, "link.so") File.symlink(filepath, symlinkpath); subject.input(symlinkpath) subject.output(output) insist { File.read(File.join(output, symlinkpath)) } == "hello!" end end end # describe FPM::Package::Dir ================================================ FILE: spec/fpm/package/empty_spec.rb ================================================ require "spec_setup" require "fpm" # local describe FPM::Package::Empty do describe "#to_s" do before do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" end it "should always return the empty string" do expect(subject.to_s "NAME-VERSION-ITERATION.ARCH.TYPE").to(be == "") expect(subject.to_s "gobbledegook").to(be == "") expect(subject.to_s "").to(be == "") expect(subject.to_s nil).to(be == "") end end # describe to_s describe "#architecture" do it "should default to 'all'" do insist { subject.architecture } == "all" end it "should accept changing the architecture" do subject.architecture = "native" insist { subject.architecture } == "native" end end end # describe FPM::Package::Empty ================================================ FILE: spec/fpm/package/freebsd_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/freebsd" # local require "stud/temporary" describe FPM::Package::FreeBSD do context "#output" do subject { FPM::Package::FreeBSD.new } let(:package) { Stud::Temporary.pathname } let(:allfiles) { `tar -Jtf #{package} 2> /dev/null`.split("\n") } let(:files) { allfiles - [ "+COMPACT_MANIFEST", "+MANIFEST" ] } before do Dir.mkdir(subject.staging_path("/usr")) Dir.mkdir(subject.staging_path("/usr/bin")) File.write(subject.staging_path("/usr/bin/example"), "testing") File.write(subject.staging_path("/usr/bin/hello"), "world") subject.output(package) end after do subject.cleanup File.unlink(package) end context "tarball" do it "should have a +COMPACT_MANIFEST file" do insist { allfiles }.include?("+COMPACT_MANIFEST") end it "should have a +MANIFEST file" do insist { allfiles }.include?("+MANIFEST") end # Ensure files have a leading / - Issue #1811, #1844 it "should have files with a leading slash" do files.each do |path| insist { path }.start_with?("/") end end it "should contain expected files" do insist { files }.include?("/usr/bin/example") insist { files }.include?("/usr/bin/hello") end end context "+MANIFEST" do let(:manifest) { JSON.parse(`tar -Jxf #{package} -O +MANIFEST`) } it "should have a files list identical to the tar contents" do insist { files.sort } == manifest["files"].keys.sort end [ "arch", "name", "version", "comment", "desc", "origin", "maintainer", "www", "prefix", "files", "scripts" ].each do |field| it "should have a top-level '#{field}'" do insist { manifest.keys }.include?(field) end end end end end ================================================ FILE: spec/fpm/package/gem_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/gem" # local have_gem = program_exists?("gem") if !have_gem Cabin::Channel.get("rspec") \ .warn("Skipping Gem#input tests because 'gem' isn't in your PATH") end describe FPM::Package::Gem do before do skip("Missing program 'gem'") unless program_exists?("gem") end let (:example_gem) do File.expand_path("../../fixtures/gem/example/example-1.0.gem", File.dirname(__FILE__)) end after :each do subject.cleanup end context "when :gem_version_bins? is true" do before :each do subject.attributes[:gem_version_bins?] = true subject.attributes[:gem_bin_path] = '/usr/bin' end it "it should append the version to binaries" do subject.input(example_gem) insist { ::Dir.entries(File.join(subject.staging_path, "/usr/bin")) }.include?("example-1.0.0") end end context "when :gem_version_bins? is false" do before :each do subject.attributes[:gem_version_bins?] = false subject.attributes[:gem_bin_path] = '/usr/bin' end it "it should not append the version to binaries" do subject.input(example_gem) insist { ::Dir.entries(File.join(subject.staging_path, "/usr/bin")) }.include?("example") end end context "when :gem_fix_name? is true" do before :each do subject.attributes[:gem_fix_name?] = true end context "and :gem_package_name_prefix is nil/default" do it "should prefix the package with 'gem-'" do subject.input(example_gem) insist { subject.name } == "rubygem-example" end end context "and :gem_package_name_prefix is set" do it "should prefix the package name appropriately" do prefix = "whoa" subject.attributes[:gem_package_name_prefix] = prefix subject.input(example_gem) insist { subject.name } == "#{prefix}-example" end end end context "when :gem_fix_name? is false" do before :each do subject.attributes[:gem_fix_name?] = false end it "it should not prefix the name at all" do subject.input(example_gem) insist { subject.name } == "example" end end context "when :gem_shebang is nil/default" do before :each do subject.attributes[:gem_bin_path] = '/usr/bin' end it 'should not change the shebang' do subject.input(example_gem) file_path = File.join(subject.staging_path, '/usr/bin/example') insist { File.readlines(file_path).grep(/^#!\/usr\/bin\/env /).any? } == true end end context "when :gem_shebang is set" do before :each do subject.attributes[:gem_shebang] = '/opt/special/bin/ruby' subject.attributes[:gem_bin_path] = '/usr/bin' end it 'should change the shebang' do subject.input(example_gem) file_path = File.join(subject.staging_path, '/usr/bin/example') insist { File.readlines(file_path).grep("#!/opt/special/bin/ruby\n").any? } == true end end context "when confronted with a multiplicity of changelog formats" do # FIXME: don't expose RE's, provide a more stable interface it 'should recognize these formats' do r1 = Regexp.new(FPM::Package::Gem::P_RE_VERSION_DATE) r2 = Regexp.new(FPM::Package::Gem::P_RE_DATE_VERSION) [ [ "cabin", "v0.1.7 (2011-11-07)", "0.1.7", "2011-11-07", "1320624000" ], [ "chandler", "## [0.7.0][] (2016-12-23)", "0.7.0", "2016-12-23", "1482451200" ], [ "domain_name", "## [v0.5.20170404](https://github.com/knu/ruby-domain_name/tree/v0.5.20170404) (2017-04-04)", "0.5.20170404", "2017-04-04", "1491264000" ], [ "parseconfig", "Mon Jan 25, 2016 - v1.0.8", "1.0.8", "Mon Jan 25, 2016", "1453680000" ], [ "rack_csrf", "# v2.6.0 (2016-12-31)", "2.6.0", "2016-12-31", "1483142400" ], [ "sinatra", "= 1.4.7 / 2016-01-24", "1.4.7", "2016-01-24", "1453593600" ], ].each do |gem, line, version, date, unixdate| v = "" d = "" [r1, r2].each do |r| if r.match(line) d = $~[:date] v = $~[:version] break end end if (d == "") puts("RE failed to match for gem #{gem}, #{line}") end e = Date.parse(d) u = e.strftime("%s") insist { v } == version insist { d } == date insist { u } == unixdate end end end end # describe FPM::Package::Gem ================================================ FILE: spec/fpm/package/npm_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/npm" # local have_npm = program_exists?("npm") if !have_npm Cabin::Channel.get("rspec") \ .warn("Skipping NPM tests because 'npm' isn't in your PATH") end describe FPM::Package::NPM do after do subject.cleanup end describe "::default_prefix" do before do skip("Missing npm program") unless have_npm end it "should provide a valid default_prefix" do stat = File.stat(FPM::Package::NPM.default_prefix) insist { stat }.directory? end end end # describe FPM::Package::NPM ================================================ FILE: spec/fpm/package/osxpkg_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/osxpkg" # local platform_is_darwin = (%x{uname -s}.chomp == "Darwin") if !platform_is_darwin Cabin::Channel.get("rspec").warn("Skipping OS X pkg tests requiring 'pkgbuild', " \ "which requires a Darwin platform.") end describe FPM::Package::OSXpkg, :if => platform_is_darwin do describe "#identifier" do it "should be of the form reverse.domain.pkgname" do subject.name = "name" subject.attributes[:osxpkg_identifier_prefix] = "org.great" insist { subject.identifier } == \ "#{subject.attributes[:osxpkg_identifier_prefix]}.#{subject.name}" end it "should be the name only if a prefix was not given" do subject.name = "name" subject.attributes[:osxpkg_identifier_prefix] = nil insist { subject.identifier } == subject.name end end describe "#to_s" do it "should have a default output usable as a filename" do subject.name = "name" subject.version = "123" # We like the format 'name-version.pkg' insist { subject.to_s } == "name-123.pkg" end end describe "#output" do before do skip("Current platform is not darwin/osx") unless platform_is_darwin end before :all do skip("Current platform is not darwin/osx") unless platform_is_darwin # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. tmpfile = Tempfile.new("fpm-test-osxpkg") @target = tmpfile.path # The target file must not exist. tmpfile.unlink @original = FPM::Package::OSXpkg.new @original.name = "name" @original.version = "123" @original.attributes[:osxpkg_identifier_prefix] = "org.my" @original.output(@target) @input = FPM::Package::OSXpkg.new @input.input(@target) end after :all do @original.cleanup if @original @input.cleanup if @input end # after context "package attributes" do it "should have the correct name" do insist { @input.name } == @original.name end it "should have the correct version" do insist { @input.version } == @original.version end end # package attributes end # #output end # describe FPM::Package:OSXpkg ================================================ FILE: spec/fpm/package/pacman_spec.rb ================================================ require "spec_setup" require 'fileutils' require "fpm" # local require "fpm/package/pacman" # local require "stud/temporary" if !program_exists?("bsdtar") Cabin::Channel.get("rspec") \ .warn("Skipping Pacman tests because 'bsdtar' isn't in your PATH") end if !program_exists?("zstd") Cabin::Channel.get("rspec") \ .warn("Skipping Pacman tests because 'zstd' isn't in your PATH") end def skip? missing = [] missing << "bsdtar" unless program_exists?("bsdtar") missing << "zstd" unless program_exists?("zstd") return nil if missing.empty? return "Missing programs: #{missing.join(", ")}" end describe FPM::Package::Pacman do let(:target) { Stud::Temporary.pathname + ".pkg.tar.zst" } after do subject.cleanup File.unlink(target) if File.exist?(target) end describe "#architecture" do it "should convert amd64 to x86_64" do subject.architecture = "amd64" expect(subject.architecture).to(be == "x86_64") end it "should convert noarch to any" do subject.architecture = "noarch" expect(subject.architecture).to(be == "any") end let(:native) { `uname -m`.chomp } it "should default to native" do # Convert kernel name to debian name expect(subject.architecture).to(be == native) end end describe "#iteration" do it "should default to 1" do expect(subject.iteration).to(be == 1) end end describe "#epoch" do it "should default to nil" do expect(subject.epoch).to(be_nil) end end describe "#optional_depends" do it "should default to []" do expect(subject.attributes[:pacman_optional_depends]).to(be == []) end end describe "#to_s" do before do subject.name = "name" subject.version = "123" subject.architecture = "any" subject.iteration = "100" subject.epoch = "5" end it "should have a default output usable as a filename" do # This is the default filename I see commonly produced by debuild insist { subject.to_s } == "name-123-100-any.pkg.tar.zst" end context "when iteration is nil" do before do subject.iteration = nil end it "should have an iteration of `1`" do # This is the default filename I see commonly produced by debuild expect(subject.to_s).to(be == "name-123-1-any.pkg.tar.zst") end end end describe "#output" do let(:original) { FPM::Package::Pacman.new } let(:input) { FPM::Package::Pacman.new } context "Test that empty epoch is tested properly" do before do skip(skip?) if skip? original.name = "foo" original.version = "123" original.iteration = "100" # original.epoch conspicuously absent original.architecture = "all" original.output(target) input.input(target) end it "should have the correct name" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.name } == original.name end it "should have the correct version" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.version } == original.version end it "should have the correct iteration" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.iteration } == original.iteration end it "should have the correct epoch" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.epoch } == original.epoch end end context "normal tests" do before do skip(skip?) if skip? # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. # The target file must not exist. original.name = "foo" original.version = "123" original.iteration = "100" original.epoch = "5" original.architecture = "all" original.dependencies << "hello >= 20" original.dependencies << "something > 10" original.dependencies << "rpmlib(bogus)" original.dependencies << "/usr/bin/bad-dep" original.provides << "#{original.name} = #{original.version}" original.conflicts = ["foo < 123"] original.attributes[:pacman_opt_depends] = ["bamb > 10"] original.directories << '/var/lib/foo' ::Dir.chdir(original.staging_path) do FileUtils::mkdir_p 'usr/bin' File.open('usr/bin/foo', 'w') do |exe| exe.write("Frankly, I think the odds are slightly in your favor " \ "at hand fighting.") end File.chmod(0755, 'usr') File.chmod(0755, 'usr/bin') File.chmod(0755, 'usr/bin/foo') FileUtils::mkdir_p 'usr/share/doc' File.chmod(0755, 'usr/share') File.chmod(0755, 'usr/share/doc') File.open('usr/share/doc/foo.txt', 'w') do |doc| doc.write("It's not my fault I'm the biggest or the strongest.") end File.chmod(0644, 'usr/share/doc/foo.txt') FileUtils::mkdir_p 'usr/lib' # incorrectly permissioned path (but that's what these tests are for) File.chmod(0700, 'usr/lib') File.open('usr/lib/libfoo.so', 'w') do |lib| lib.write("I don't even excercise.") end File.chmod(0755, 'usr/lib/libfoo.so') FileUtils::mkdir_p 'etc' File.chmod(0755, 'etc') File.open('etc/foo.conf', 'w') do |conf| conf.write("You mean, you'll put down your rock and I'll put down " \ "my sword, and we'll try and kill each other like " \ "civilized people?") end File.chmod(0600, 'etc/foo.conf') FileUtils::mkdir_p 'var/lib/foo' File.chmod(0755, 'var') File.chmod(0755, 'var/lib') File.chmod(0755, 'var/lib/foo') end [:before_install, :after_install, :before_remove, :after_remove, :before_upgrade, :after_upgrade].each do |script| original.scripts[script] = "#!/bin/sh\n\necho #{script.to_s}" end original.output(target) input.input(target) end after do original.cleanup input.cleanup end # after context "script contents" do [:before_install, :after_install, :before_remove, :after_remove, :before_upgrade, :after_upgrade].each do |script| it "should be the same both with input as with original for #{script.to_s}" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") expect( \ (input.scripts[script] =~ \ /[\n :]+#{Regexp.quote(original.scripts[script])}/m \ ) ).to(be_truthy) end end end context "file permissions" do {"/usr" => 0755, "/usr/bin" => 0755, "/usr/bin/foo" => 0755, "/usr/lib" => 0700, "/usr/lib/libfoo.so" => 0755, "/usr/share" => 0755, "/usr/share/doc" => 0755, "/usr/share/doc/foo.txt" => 0644, "/etc" => 0755, "/etc/foo.conf" => 0600, "/var" => 0755, "/var/lib" => 0755, "/var/lib/foo" => 0755}.each do |dir, perm| it "should preserve file permissions for #{dir}" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { File.stat(File.join(input.staging_path, dir)).mode & 07777 } == perm end end end context "package attributes" do it "should have the correct name" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.name } == original.name end it "should have the correct version" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.version } == original.version end it "should have the correct iteration" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.iteration } == original.iteration end it "should have the correct epoch" do skip("Missing bsdtar") unless program_exists?("bsdtar") skip("Missing zstd") unless program_exists?("zstd") insist { input.epoch } == original.epoch end it "should not have bogus dependencies, just correct dependencies" do expect(input.dependencies).to(be == ["hello >= 20", "something > 10"]) end end # package attributes end # #output end # TODO: output sometimes make fu-:1.2.3.out.rpm or something. Make sure the # version isn't screwed up in transit. end # describe FPM::Package::Pacman ================================================ FILE: spec/fpm/package/python_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/python" # local require "find" # stdlib def find_python [ "python", "python3", "python2" ].each do |i| return i if program_exists?(i) end return nil end def python_usable? return find_python end if !python_usable? Cabin::Channel.get("rspec").warn("Skipping Python#input tests because 'python' wasn't found in $PATH") end is_travis = ENV["TRAVIS_OS_NAME"] && !ENV["TRAVIS_OS_NAME"].empty? # Determine default value of a given easy_install's option def easy_install_default(python_bin, option) result = nil execmd({:PYTHONPATH=>"#{example_dir}"}, python_bin, :stderr=>false) do |stdin,stdout| stdin.write("from easy_install_default import default_options\n" \ "print default_options.#{option}\n") stdin.close result = stdout.read.chomp end return result end describe FPM::Package::Python do before do skip("Python program not found") unless python_usable? #subject.attributes[:python_bin] = find_python end let (:example_dir) do File.expand_path("../../fixtures/python/", File.dirname(__FILE__)) end after :each do subject.cleanup end context "when :python_downcase_name? is false" do before :each do subject.attributes[:python_downcase_name?] = false end context "when :python_fix_name? is true" do before :each do subject.attributes[:python_fix_name?] = true end context "and :python_package_name_prefix is nil/default" do it "should prefix the package name based on detected python-bin name" do subject.input(example_dir) insist { subject.name } == "#{subject.attributes[:python_bin]}-Example" end end context "and :python_package_name_prefix is set" do it "should prefix the package name appropriately" do prefix = "whoa" subject.attributes[:python_package_name_prefix] = prefix subject.attributes[:python_package_name_prefix_given?] = true subject.input(example_dir) insist { subject.name } == "#{prefix}-Example" end end end context "when :python_fix_name? is false" do before :each do subject.attributes[:python_fix_name?] = false end it "should leave the package name as is" do subject.input(example_dir) insist { subject.name } == "Example" end end end context "when :python_downcase_name? is true" do before :each do subject.attributes[:python_downcase_name?] = true end context "when :python_fix_name? is true" do before :each do subject.attributes[:python_fix_name?] = true end context "and :python_package_name_prefix is nil/default" do it "should prefix the package based on the version of python" do subject.input(example_dir) insist { subject.attributes[:python_package_name_prefix_given?] }.nil? insist { subject.name } == "#{subject.attributes[:python_bin]}-example" end end context "and :python_package_name_prefix is set" do it "should prefix the package name appropriately" do prefix = "whoa" subject.attributes[:python_package_name_prefix] = prefix subject.attributes[:python_package_name_prefix_given?] = true subject.input(example_dir) insist { subject.name } == "#{prefix}-example" end end end context "when :python_fix_name? is false" do before :each do subject.attributes[:python_fix_name?] = false end it "it should not prefix the name at all" do subject.input(example_dir) insist { subject.name } == "example" end end end context "when :python_dependencies is set" do before :each do subject.attributes[:python_dependencies] = true end it "it should include the dependencies from setup.py" do # Insist on using the defaults for this test, prefix not given and # prefix should automatically be based on the python major version insist { subject.attributes[:python_package_name_prefix_given?] }.nil? subject.input(example_dir) prefix = subject.attributes[:python_package_name_prefix] # The package name prefix attribute should be set to _something_ by default reject { prefix }.nil? # XXX: Why is there extra whitespace in these strings? # # Note: The dependency list should only include entries which are supported by fpm. # python dependencies can have 'environment markers' and most of those markers are # not supported by fpm. # In this test, there are (at time of writing) some python_version markers and fpm doesn't # support those. insist { subject.dependencies.sort } == ["#{prefix}-dependency1","#{prefix}-dependency2", "#{prefix}-rtxt-dep4"] end context "and :python_disable_dependency is set" do before :each do subject.attributes[:python_disable_dependency] = "Dependency1" end it "it should exclude the dependency" do subject.input(example_dir) prefix = subject.attributes[:python_package_name_prefix] insist { subject.dependencies.sort } == ["#{prefix}-dependency2", "#{prefix}-rtxt-dep4"] end end end context "when python_obey_requirements_txt? is true" do before :each do subject.attributes[:python_obey_requirements_txt?] = true subject.attributes[:python_dependencies?] = true end context "and :python_fix_dependencies? is true" do before :each do subject.attributes[:python_fix_dependencies?] = true end it "it should prefix requirements.txt" do subject.input(example_dir) prefix = subject.attributes[:python_package_name_prefix] insist { subject.dependencies.sort } == ["#{prefix}-rtxt-dep1 > 0.1", "#{prefix}-rtxt-dep2 = 0.1", "#{prefix}-rtxt-dep4"] end it "it should exclude the dependency" do subject.attributes[:python_disable_dependency] = "rtxt-dep1" subject.input(example_dir) prefix = subject.attributes[:python_package_name_prefix] insist { subject.dependencies.sort } == ["#{prefix}-rtxt-dep2 = 0.1", "#{prefix}-rtxt-dep4"] end end context "and :python_fix_dependencies? is false" do before :each do subject.attributes[:python_fix_dependencies?] = false end it "it should load requirements.txt" do subject.input(example_dir) insist { subject.dependencies.sort } == ["rtxt-dep1 > 0.1", "rtxt-dep2 = 0.1", "rtxt-dep4"] end it "it should exclude the dependency" do subject.attributes[:python_disable_dependency] = "rtxt-dep1" subject.input(example_dir) insist { subject.dependencies.sort } == ["rtxt-dep2 = 0.1", "rtxt-dep4"] end end end context "when input is a name" do it "should download from pypi" do subject.input("click==8.3.0") prefix = subject.attributes[:python_package_name_prefix] insist { subject.name } == "#{prefix}-click" insist { subject.version } == "8.3.0" insist { subject.maintainer } == "Pallets " insist { subject.architecture } == "all" insist { subject.dependencies } == [ ] end end context "when given a project containing a pyproject.toml" do let (:project) do File.expand_path("../../fixtures/python-pyproject.toml/", File.dirname(__FILE__)) end it "should package it correctly" do subject.input(project) prefix = subject.attributes[:python_package_name_prefix] insist { subject.name } == "#{prefix}-example" insist { subject.version } == "1.2.3" insist { subject.maintainer } == "Captain Fancy " end it "should package it correctly even if the path given is directly to the pyproject.toml" do subject.input(File.join(project, "pyproject.toml")) prefix = subject.attributes[:python_package_name_prefix] insist { subject.name } == "#{prefix}-example" insist { subject.version } == "1.2.3" insist { subject.maintainer } == "Captain Fancy " end end end # describe FPM::Package::Python describe FPM::Package::Python::PythonMetadata do context "processing simple examples" do let(:text) { [ "Metadata-Version: 2.4", "Name: hello", "Version: 1.0", ].join("\n") + "\n" } subject { described_class.from(text) } it "should" do insist { subject.name } == "hello" insist { subject.version } == "1.0" end end # Use a known METADATA file from a real Python package context "when parsing Django 5.2.6's METADATA" do let(:text) do File.read(File.expand_path("../../fixtures/python/METADATA", File.dirname(__FILE__))) end expectations = { "Metadata-Version" => "2.4", "Name" => "Django", "Version" => "5.2.6", "Summary" => "A high-level Python web framework that encourages rapid development and clean, pragmatic design.", "Author-email" => "Django Software Foundation ", "License" => "BSD-3-Clause", } let(:parsed) { described_class.parse(text) } let(:headers) { parsed[0] } let(:body) { parsed[1] } let(:metadata) { described_class.from(text) } expectations.each do |field, value| it "the #{field} field should be #{value.inspect}" do insist { headers[field] } == value end end it "should parse multivalue fields into an array value" do insist { headers["Classifier"] }.is_a?(Enumerable) insist { headers["Project-URL"] }.is_a?(Enumerable) insist { headers["Requires-Dist"] }.is_a?(Enumerable) insist { headers["Requires-Dist"] }.include?('asgiref>=3.8.1') insist { headers["Requires-Dist"] }.include?('sqlparse>=0.3.1') insist { headers["Requires-Dist"] }.include?('tzdata; sys_platform == "win32"') insist { headers["Requires-Dist"] }.include?('argon2-cffi>=19.1.0; extra == "argon2"') insist { headers["Requires-Dist"] }.include?('bcrypt; extra == "bcrypt"') end it "should provide correctly parsed values" do insist { metadata.name } == "Django" insist { metadata.version } == "5.2.6" insist { metadata.summary } == "A high-level Python web framework that encourages rapid development and clean, pragmatic design." insist { metadata.license } == "BSD-3-Clause" insist { metadata.homepage } == "https://www.djangoproject.com/" end end # parsing Django METADATA end ================================================ FILE: spec/fpm/package/rpm_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/rpm" # local require "fpm/package/dir" # local require "arr-pm/file" # gem 'arr-pm' require "stud/temporary" # gem 'stud' if !program_exists?("rpmbuild") Cabin::Channel.get("rspec") \ .warn("Skipping RPM#output tests because 'rpmbuild' isn't in your PATH") end describe FPM::Package::RPM do after :each do subject.cleanup end describe "#architecture" do it "should convert amd64 to x86_64" do subject.architecture = "amd64" insist { subject.architecture } == "x86_64" end it "should convert arm64 to aarch64" do subject.architecture = "arm64" expect(subject.architecture).to(be == "aarch64") end it "should convert 'all' to 'noarch'" do subject.architecture = "all" insist { subject.architecture } == "noarch" end it "should default to native" do expected = %x{uname -m}.chomp insist { subject.instance_eval { @architecture } } == "native" insist { subject.architecture } == expected end end describe "#iteration" do it "should default to 1" do insist { subject.iteration } == 1 end end describe "#summary" do it "should default to description" do expected = subject.description insist { subject.summary } == expected end it "should return description override" do subject.attributes[:rpm_summary] = "a summary" expected = subject.description insist { subject.summary } != expected end end describe "#epoch" do it "should default to empty" do insist { subject.epoch.to_s } == "" end it "should cope with it being zero" do subject.epoch = 0 insist { subject.epoch.to_s } == "0" end end describe "#to_s" do it "should have a default output usable as a filename" do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" # This is the default filename I see commonly output by rpmbuild insist { subject.to_s } == "name-123-100.noarch.rpm" end it "should include the dist when specified" do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" insist { subject.to_s } == "name-123-100.noarch.rpm" subject.attributes[:rpm_dist] = "el6" insist { subject.to_s } == "name-123-100.el6.noarch.rpm" end end describe "#templating" do context "default user and group" do before :each do FileUtils.mkdir_p(subject.staging_path(File.dirname(__FILE__))) FileUtils.cp(__FILE__, subject.staging_path(__FILE__)) # set the list of files for this RPM def subject.files; [__FILE__]; end def subject.rpmspec; @rpmspec; end def subject.render_template; @rpmspec = template("rpm.erb").result(binding); end subject.render_template end after :each do subject.cleanup end it "should set the user and group of each file in the RPM" do expect(subject.rpmspec).to include('%defattr(-,root,root,-') end end # context context "non-default user and group" do before :each do subject.attributes[:rpm_user] = "some_user" subject.attributes[:rpm_group] = "some_group" FileUtils.mkdir_p(subject.staging_path(File.dirname(__FILE__))) FileUtils.cp(__FILE__, subject.staging_path(__FILE__)) # set the list of files for this RPM def subject.files; [__FILE__]; end def subject.rpmspec; @rpmspec; end def subject.render_template; @rpmspec = template("rpm.erb").result(binding); end subject.render_template end after :each do subject.cleanup end it "should set the user and group of each file in the RPM" do expect(subject.rpmspec).to include('%defattr(-,some_user,some_group,-') end end # context end describe "#output" do before do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") end context "architecture" do it "can be basically anything" do subject.name = "example" subject.architecture = "fancypants" subject.version = "1.0" target = Stud::Temporary.pathname # Should not fail. subject.output(target) # Verify the arch tag. rpm = ::RPM::File.new(target) insist { rpm.tags[:arch] } == subject.architecture File.unlink(target) end end context "with slight corrections" do context "on the version attribute" do it "should replace dash(-) with underscore(_)" do subject.version = "123-456" insist { subject.version } == "123_456" end end context "on the iteration attribute" do # Found in https://github.com/electron-userland/electron-builder/issues/5976 it "should replace dash(-) with underscore(_)" do subject.iteration = "123-456" insist { subject.iteration } == "123_456" end end end context "package attributes" do before :each do @target = Stud::Temporary.pathname subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" subject.dependencies << "something > 10" subject.dependencies << "hello >= 20" subject.conflicts << "bad < 2" subject.attributes[:rpm_os] = "fancypants" subject.attributes[:rpm_summary] = "fancypants" # Make sure multi-line licenses are hacked to work in rpm (#252) subject.license = "this\nis\nan\example" subject.provides << "bacon = 1.0" # TODO(sissel): This api sucks, yo. subject.scripts[:before_install] = "example before_install" subject.scripts[:after_install] = "example after_install" subject.scripts[:before_remove] = "example before_remove" subject.scripts[:after_remove] = "example after_remove" subject.scripts[:rpm_verifyscript] = "example rpm_verifyscript" subject.scripts[:rpm_posttrans] = "example rpm_posttrans" subject.scripts[:rpm_pretrans] = "example rpm_pretrans" # Test for triggers #626 subject.attributes[:rpm_trigger_before_install] = [["test","#!/bin/sh\necho before_install trigger executed\n"]] subject.attributes[:rpm_trigger_after_install] = [["test","#!/bin/sh\necho after_install trigger executed\n"]] subject.attributes[:rpm_trigger_before_uninstall] = [["test","#!/bin/sh\necho before_uninstall trigger executed\n"]] subject.attributes[:rpm_trigger_after_target_uninstall] = [["test","#!/bin/sh\necho after_target_uninstall trigger executed\n"]] # Write the rpm out subject.output(@target) # Read the rpm @rpm = ::RPM::File.new(@target) @rpmtags = {} @rpm.header.tags.each do |tag| @rpmtags[tag.tag] = tag.value end end # before :each after :each do subject.cleanup File.delete(@target) end # after :each it "should have the correct name" do insist { @rpmtags[:name] } == subject.name end it "should obey the os attribute" do insist { @rpmtags[:os] } == subject.attributes[:rpm_os] end it "should have a different summary and description" do insist { @rpmtags[:summary] } == subject.summary insist { @rpmtags[:summary] } != subject.description end it "should have the correct version" do insist { @rpmtags[:version] } == subject.version end it "should have the correct iteration" do insist { @rpmtags[:release] } == subject.iteration end it "should have the correct epoch" do insist { @rpmtags[:epoch].first.to_s } == subject.epoch end it "should output a package with the correct dependencies" do # @rpm.requires is an array of [name, op, requires] elements # fpm uses strings here, so convert. requires = @rpm.requires.collect { |a| a.join(" ") } subject.dependencies.each do |dep| insist { requires }.include?(dep) end end it "should output a package with the correct conflicts" do # @rpm.requires is an array of [name, op, requires] elements # fpm uses strings here, so convert. conflicts = @rpm.conflicts.collect { |a| a.join(" ") } subject.conflicts.each do |dep| insist { conflicts }.include?(dep) end end it "should output a package with the correct provides" do # @rpm.requires is an array of [name, op, requires] elements # fpm uses strings here, so convert. provides = @rpm.provides.collect { |a| a.join(" ") } subject.provides.each do |dep| insist { provides }.include?(dep) end end it "should replace newlines with spaces in the license field (issue#252)" do insist { @rpm.tags[:license] } == subject.license.split("\n").join(" ") end it "should have the correct 'preun' script" do insist { @rpm.tags[:preun] } == "example before_remove" insist { @rpm.tags[:preunprog] } == "/bin/sh" end it "should have the correct 'postun' script" do insist { @rpm.tags[:postun] } == "example after_remove" insist { @rpm.tags[:postunprog] } == "/bin/sh" end it "should have the correct 'verify' script" do insist { @rpm.tags[:verifyscript] } == "example rpm_verifyscript" insist { @rpm.tags[:verifyscriptprog] } == "/bin/sh" end it "should have the correct 'pretrans' script" do insist { @rpm.tags[:pretrans] } == "example rpm_pretrans" insist { @rpm.tags[:pretransprog] } == "/bin/sh" end it "should have the correct 'posttrans' script" do insist { @rpm.tags[:posttrans] } == "example rpm_posttrans" insist { @rpm.tags[:posttransprog] } == "/bin/sh" end it "should have the correct 'prein' script" do insist { @rpm.tags[:prein] } == "example before_install" insist { @rpm.tags[:preinprog] } == "/bin/sh" end it "should have the correct 'postin' script" do insist { @rpm.tags[:postin] } == "example after_install" insist { @rpm.tags[:postinprog] } == "/bin/sh" end it "should have the correct 'before_install' trigger script" do insist { @rpm.tags[:triggername][0] } == "test" insist { @rpm.tags[:triggerversion][0] } == "" # This specific check is broken in newer versions of rpm/rpmbuild? -Jordan #insist { @rpm.tags[:triggerflags][0] & (1 << 25)} == ( 1 << 25) # See FPM::Package::RPM#rpm_get_trigger_type #insist { @rpm.tags[:triggerindex][0] } == 0 insist { @rpm.tags[:triggerscriptprog][0] } == "/bin/sh" insist { @rpm.tags[:triggerscripts][0] } == "#!/bin/sh\necho before_install trigger executed" end it "should have the correct 'after_install' trigger script" do insist { @rpm.tags[:triggername][1] } == "test" insist { @rpm.tags[:triggerversion][1] } == "" # This specific check is broken in newer versions of rpm/rpmbuild? -Jordan #insist { @rpm.tags[:triggerflags][1] & (1 << 16)} == ( 1 << 16) # See FPM::Package::RPM#rpm_get_trigger_type #insist { @rpm.tags[:triggerindex][1] } == 1 insist { @rpm.tags[:triggerscriptprog][1] } == "/bin/sh" insist { @rpm.tags[:triggerscripts][1] } == "#!/bin/sh\necho after_install trigger executed" end it "should have the correct 'before_uninstall' trigger script" do insist { @rpm.tags[:triggername][2] } == "test" insist { @rpm.tags[:triggerversion][2] } == "" # This specific check is broken in newer versions of rpm/rpmbuild? -Jordan #insist { @rpm.tags[:triggerflags][2] & (1 << 17)} == ( 1 << 17) # See FPM::Package::RPM#rpm_get_trigger_type #insist { @rpm.tags[:triggerindex][2] } == 2 insist { @rpm.tags[:triggerscriptprog][2] } == "/bin/sh" insist { @rpm.tags[:triggerscripts][2] } == "#!/bin/sh\necho before_uninstall trigger executed" end it "should have the correct 'after_target_uninstall' trigger script" do insist { @rpm.tags[:triggername][3] } == "test" insist { @rpm.tags[:triggerversion][3] } == "" # This specific check is broken in newer versions of rpm/rpmbuild? -Jordan #insist { @rpm.tags[:triggerflags][3] & (1 << 18)} == ( 1 << 18) # See FPM::Package::RPM#rpm_get_trigger_type #insist { @rpm.tags[:triggerindex][3] } == 3 insist { @rpm.tags[:triggerscriptprog][3] } == "/bin/sh" insist { @rpm.tags[:triggerscripts][3] } == "#!/bin/sh\necho after_target_uninstall trigger executed" end it "should use md5/gzip by default" do insist { @rpmtags[:payloadcompressor] } == "gzip" # For whatever reason, the 'filedigestalgo' tag is an array of numbers. # I only ever see one element in this array, so just do value.first # # Even though you can specify a file digest algorithm of md5, not # specifying one at all is also valid in the RPM file itself, # and not having one at all means md5. So accept 'nil' or the digest # identifier for md5 (1). insist { [nil, FPM::Package::RPM::DIGEST_ALGORITHM_MAP["md5"]] } \ .include?((@rpmtags[:filedigestalgo].first rescue nil)) end end # package attributes context "package default attributes" do before :each do @target = Stud::Temporary.pathname subject.name = "name" subject.version = "123" # Write the rpm out subject.output(@target) # Read the rpm @rpm = ::RPM::File.new(@target) @rpmtags = {} @rpm.header.tags.each do |tag| @rpmtags[tag.tag] = tag.value end end # before :each after :each do subject.cleanup File.delete(@target) end # after :each it "should have the correct name" do insist { @rpmtags[:name] } == subject.name end # I don't know the 'os' values for any other OS. it "should have a default OS value" do os = `uname -s`.chomp.downcase # The 'os' tag will be set to \x01 if the package 'target' # was set incorrectly. reject { @rpmtags[:os] } == "\x01" insist { @rpmtags[:os] } == os insist { `rpm -q --qf '%{OS}' -p #{@target}`.chomp } == os end it "should have the correct version" do insist { @rpmtags[:version] } == subject.version end it "should have the default iteration" do insist { @rpmtags[:release].to_s } == "1" end #it "should have the correct epoch" do #insist { @rpmtags[:epoch].first.to_s } == "" #end it "should have the default summary as first line of description" do insist { @rpmtags[:summary] } == @rpmtags[:description].split("\n").first end it "should output a package with the no conflicts" do # @rpm.requires is an array of [name, op, requires] elements # fpm uses strings here, so convert. conflicts = @rpm.conflicts.collect { |a| a.join(" ") } subject.conflicts.each do |dep| insist { conflicts }.include?(dep) end end it "should output a package with no provides" do # @rpm.requires is an array of [name, op, requires] elements # fpm uses strings here, so convert. provides = @rpm.provides.collect { |a| a.join(" ") } subject.provides.each do |dep| insist { provides }.include?(dep) end end end # package attributes context "dist" do it "should have the dist in the release" do subject.name = "example" subject.attributes[:rpm_dist] = "el6" subject.version = "1.0" @target = Stud::Temporary.pathname # Write RPM subject.output(@target) @rpm = ::RPM::File.new(@target) insist { @rpm.tags[:release] } == "#{subject.iteration}.el6" File.unlink(@target) end it "should accept the dist in the iteration" do subject.name = "example" subject.iteration = "1.el6" subject.version = "1.0" @target = Stud::Temporary.pathname # Write RPM subject.output(@target) @rpm = ::RPM::File.new(@target) insist { @rpm.tags[:release] } == "#{subject.iteration}" File.unlink(@target) end end # dist context "changelog" do it "should generate a changelog in the release" do subject.name = "example" subject.attributes[:rpm_dist] = 'rhel' subject.version = "1.2.3" subject.maintainer = "Spec Test " @target = Stud::Temporary.pathname # Write RPM subject.output(@target) @rpm = ::RPM::File.new(@target) insist { @rpm.tags[:changelogname] } == [ "Spec Test - 1.2.3-1.rhel" ] insist { @rpm.tags[:changelogtext] } == [ "- Package created with FPM" ] File.unlink(@target) end it "should have the changelog in the release" do subject.name = "example" subject.attributes[:rpm_changelog] = < - 1.0-1 - First example package CHANGELOG subject.version = "1.0" @target = Stud::Temporary.pathname # Write RPM subject.output(@target) @rpm = ::RPM::File.new(@target) insist { @rpm.tags[:changelogtime] } == [ 1464696000 ] insist { @rpm.tags[:changelogname] } == [ "Example Maintainers - 1.0-1" ] insist { @rpm.tags[:changelogtext] } == [ "- First example package" ] File.unlink(@target) end end # changelog end # #output describe "prefix attribute" do it "should default to slash" do insist { subject.prefix } == "/" end it "should leave a single slash as it is" do subject.attributes[:prefix] = "/" insist { subject.prefix } == "/" end it "should leave a path without trailing slash it is" do subject.attributes[:prefix] = "/foo/bar" insist { subject.prefix } == "/foo/bar" end it "should remove trailing slashes" do subject.attributes[:prefix] = "/foo/bar/" insist { subject.prefix } == "/foo/bar" end end describe "regressions should not occur" do before do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") end before :each do @tempfile_handle = @target = Stud::Temporary.pathname subject.name = "name" subject.version = "1.23" end after :each do subject.cleanup File.delete(@target) rescue nil end # after it "should escape '%' characters in filenames" do Dir.mkdir(subject.staging_path("/example")) File.write(subject.staging_path("/example/%name%"), "Hello") subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/example/%name%" ] end it "should escape '{' and '}' characters in filenames" do Dir.mkdir(subject.staging_path("/example")) File.write(subject.staging_path("/example/{{ test }}"), "Hello") subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/example/{{ test }}" ] end it "should correctly include files with spaces and quotation marks" do names = [ "/It's time to go.txt", "/It's \"time\" to go.txt" ] names.each do |n| File.write(subject.staging_path("#{n}"), "Hello") end subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files.sort } == names.sort end it "should escape '%' characters in filenames while preserving permissions" do Dir.mkdir(subject.staging_path("/example")) File.write(subject.staging_path("/example/%name%"), "Hello") File.chmod(01777,subject.staging_path("/example/%name%")) subject.attributes[:rpm_use_file_permissions?] = true subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/example/%name%" ] insist { `rpm -qlv -p #{@target}`.chomp.split.first } == "-rwxrwxrwt" end it "should permit spaces in filenames (issue #164)" do File.write(subject.staging_path("file with space"), "Hello") # This will raise an exception if rpmbuild fails. subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/file with space" ] end it "should permit brackets in filenames (issue #202)" do File.write(subject.staging_path("file[with]bracket"), "Hello") # This will raise an exception if rpmbuild fails. subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/file[with]bracket" ] end it "should permit asterisks in filenames (issue #202)" do File.write(subject.staging_path("file*asterisk"), "Hello") # This will raise an exception if rpmbuild fails. subject.output(@target) rpm = ::RPM::File.new(@target) insist { rpm.files } == [ "/file*asterisk" ] end it "should have some reasonable defaults that never change" do subject.output(@target) # Read the rpm rpm = ::RPM::File.new(@target) rpmtags = {} rpm.header.tags.each do |tag| rpmtags[tag.tag] = tag.value end # Default epoch must be empty, see #381 # For some reason, epoch is an array of numbers in rpm? insist { rpmtags[:epoch] } == nil # Default release must be '1' insist { rpmtags[:release] } == "1" end context "with an empty description" do it "should build a package" do subject.description = "" expect do subject.output(@target) end.not_to raise_error end end context "with an one-line description" do it "should build a package" do subject.description = "hello world" expect do subject.output(@target) end.not_to raise_error end end end # regression stuff describe "input validation stuff" do before do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") end before :each do @tempfile_handle = @target = Stud::Temporary.pathname @generator = FPM::Package::RPM.new @generator.name = "name" @generator.version = "1.23" end after :each do subject.cleanup @generator.cleanup #File.delete(@target) rescue nil end # after it "should not cause errors when reading basic rpm in input (#802)" do # Write the rpm out @generator.output(@target) # Load generated rpm subject.input(@target) # Value sanity check insist { subject.name } == "name" insist { subject.version } == "1.23" end it "should not cause errors when reading more complete rpm in input (#802)" do @generator.architecture = "all" @generator.iteration = "100" @generator.epoch = "5" @generator.dependencies << "something > 10" @generator.dependencies << "hello >= 20" @generator.conflicts << "bad < 2" @generator.license = "this\nis\nan\example" @generator.provides << "bacon = 1.0" # Write the rpm out @generator.output(@target) # Load generated rpm subject.input(@target) # Value sanity check insist { subject.name } == "name" insist { subject.version } == "1.23" insist { subject.architecture } == "noarch" # see #architecture insist { subject.iteration } == "100" insist { subject.epoch } == 5 insist { subject.dependencies }.include?("something > 10") insist { subject.dependencies }.include?("hello >= 20") insist { subject.conflicts[0] } == "bad < 2" insist { subject.license } == @generator.license.split("\n").join(" ") # See issue #252 insist { subject.provides[0] } == "bacon = 1.0" end it "should not cause errors when reading rpm with script in input (#802)" do @generator.scripts[:before_install] = "example before_install" @generator.scripts[:after_install] = "example after_install" @generator.scripts[:before_remove] = "example before_remove" @generator.scripts[:after_remove] = "example after_remove" @generator.scripts[:rpm_verifyscript] = "example rpm_verifyscript" @generator.scripts[:rpm_posttrans] = "example rpm_posttrans" @generator.scripts[:rpm_pretrans] = "example rpm_pretrans" # Write the rpm out @generator.output(@target) # Load generated rpm subject.input(@target) # Value sanity check insist { subject.name } == "name" insist { subject.version } == "1.23" insist { subject.scripts[:before_install] } == "example before_install" insist { subject.scripts[:after_install] } == "example after_install" insist { subject.scripts[:before_remove] } == "example before_remove" insist { subject.scripts[:after_remove] } == "example after_remove" insist { subject.scripts[:rpm_verifyscript] } == "example rpm_verifyscript" insist { subject.scripts[:rpm_posttrans] } == "example rpm_posttrans" insist { subject.scripts[:rpm_pretrans] } == "example rpm_pretrans" end it "should not cause errors when reading rpm with triggers in input (#802)" do @generator.attributes[:rpm_trigger_before_install] = [["test","#!/bin/sh\necho before_install trigger executed\n"]] @generator.attributes[:rpm_trigger_after_install] = [["test","#!/bin/sh\necho after_install trigger executed\n"]] @generator.attributes[:rpm_trigger_before_uninstall] = [["test","#!/bin/sh\necho before_uninstall trigger executed\n"]] @generator.attributes[:rpm_trigger_after_target_uninstall] = [["test","#!/bin/sh\necho after_target_uninstall trigger executed\n"]] # Write the rpm out @generator.output(@target) # Load generated rpm subject.input(@target) # Value sanity check insist { subject.name } == "name" insist { subject.version } == "1.23" insist { subject.attributes[:rpm_trigger_before_install] } == [["test","#!/bin/sh\necho before_install trigger executed", ""]] insist { subject.attributes[:rpm_trigger_after_install] } == [["test","#!/bin/sh\necho after_install trigger executed", ""]] insist { subject.attributes[:rpm_trigger_before_uninstall] } == [["test","#!/bin/sh\necho before_uninstall trigger executed", ""]] insist { subject.attributes[:rpm_trigger_after_target_uninstall] } == [["test","#!/bin/sh\necho after_target_uninstall trigger executed", ""]] end end # input validation stuff describe "rpm_use_file_permissions" do let(:target) { Stud::Temporary.pathname } let(:rpm) { ::RPM::File.new(target) } let(:path) { "hello.txt" } let(:path_stat) { File.lstat(subject.staging_path(path)) } before :each do File.write(subject.staging_path(path), "Hello world") subject.name = "example" subject.version = "1.0" end after :each do subject.cleanup File.delete(target) rescue nil end it "should respect file user and group ownership" do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") subject.attributes[:rpm_use_file_permissions?] = true subject.output(target) insist { rpm.tags[:fileusername].first } == Etc.getpwuid(path_stat.uid).name insist { rpm.tags[:filegroupname].first } == Etc.getgrgid(path_stat.gid).name end it "rpm_group should override rpm_use_file_permissions-derived owner" do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") subject.attributes[:rpm_use_file_permissions?] = true subject.attributes[:rpm_user] = "hello" subject.attributes[:rpm_group] = "world" subject.output(target) insist { rpm.tags[:fileusername].first } == subject.attributes[:rpm_user] insist { rpm.tags[:filegroupname].first } == subject.attributes[:rpm_group] end end describe "#output with digest and compression settings" do before do skip("Missing rpmbuild program") unless program_exists?("rpmbuild") end context "bzip2/sha1" do before :each do @target = Stud::Temporary.pathname subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" subject.attributes[:rpm_compression] = "bzip2" subject.attributes[:rpm_digest] = "sha1" # Write the rpm out subject.output(@target) # Read the rpm @rpm = ::RPM::File.new(@target) @rpmtags = {} @rpm.header.tags.each do |tag| @rpmtags[tag.tag] = tag.value end end after :each do subject.cleanup File.delete(@target) end # after it "should have the compressor and digest algorithm listed" do insist { @rpmtags[:payloadcompressor] } == "bzip2" # For whatever reason, the 'filedigestalgo' tag is an array of numbers. # I only ever see one element in this array, so just do value.first insist { @rpmtags[:filedigestalgo].first } \ == FPM::Package::RPM::DIGEST_ALGORITHM_MAP["sha1"] end end # bzip2/sha1 end # #output with digest/compression settings end # describe FPM::Package::RPM ================================================ FILE: spec/fpm/package/sh_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/sh" # local require "tmpdir" shell_is_bash = (%r{/bash} =~ ENV['SHELL']) if !shell_is_bash Cabin::Channel.get("rspec").warn("Skipping SH pkg tests which require a BASH shell.") end describe FPM::Package::Sh do describe "#output" do before do skip("Shell (SHELL env) is not bash") unless shell_is_bash end def make_sh_package # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. tmpfile = Tempfile.new("fpm-test-sh") target = tmpfile.path # The target file must not exist. tmpfile.unlink original = FPM::Package::Sh.new yield original if block_given? original.output(target) return target, original end context "pre_install script" do before :all do @temptarget = Dir.mktmpdir() @target, @original = make_sh_package do |pkg| pkg.scripts[:before_install] = "#!/bin/sh\n\necho before_install" end end it "should execute a pre_install script" do output = `#{@target} -i #{@temptarget}`.split($/) insist { output.any? {|l| l.chomp == "before_install" }} == true insist { $?.success? } == true end end context "empty pre_install script" do before :all do @temptarget = Dir.mktmpdir() @target, @original = make_sh_package do |pkg| pkg.scripts[:before_install] = "" end end it "shouldn't choke even if the pre-install script is empty" do output = %x(#{@target} -i #{@temptarget}) status = $?.success? insist { status } == true end end context "Contain segments" do before :all do @target, @original = make_sh_package end after :all do @original.cleanup end # after context "package contents" do it "should contain a ARCHIVE segment" do insist { File.readlines(@target).any? {|l| l.chomp == '__ARCHIVE__' } } == true end it "should contain a METADATA segment" do insist { File.readlines(@target).any? {|l| l.chomp == '__METADATA__' } } == true end end # package attributes end end # #output end # describe FPM::Package::Sh ================================================ FILE: spec/fpm/package/snap_spec.rb ================================================ require "spec_setup" require "fpm" # local require "English" # for $CHILD_STATUS IS_OLD_RUBY = (RUBY_VERSION =~ /^((1\.)|(2\.0))/) describe FPM::Package::Snap do let(:target) { Stud::Temporary.pathname + ".snap" } before do skip("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY skip("Missing program 'mksquashfs'") unless program_exists?("mksquashfs") end after do subject.cleanup File.unlink(target) if File.exist?(target) end describe "#to_s" do before do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" subject.epoch = "5" end it "should have a default output usable as a filename" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY # This is the default filename commonly produced by snapcraft insist { subject.to_s } == "name_123-100_all.snap" end context "when iteration is nil" do before do subject.iteration = nil end it "should not include iteration if it is nil" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY # This is the default filename commonly produced by snapcraft expect(subject.to_s).to(be == "name_123_all.snap") end end end describe "#output" do let(:original) { FPM::Package::Snap.new } let(:input) { FPM::Package::Snap.new } before do # output a package, use it as the input, set the subject to that input # package. This helps ensure that we can write and read packages # properly. # The target file must not exist. original.name = "name" original.version = "123" original.description = "summary\ndescription" original.architecture = "all" original.attributes[:snap_apps] = { "app1" => { "command" => "command1", }, "app2" => { "command" => "command2", "daemon" => "simple", }, "app3" => { "command" => "command3", "daemon" => "simple", "plugs" => ["test-plug"] }, } original.attributes[:snap_hooks] = { "hook1" => nil, "hook2" => { "plugs" => ["test-plug"] }, } end after do original.cleanup input.cleanup end context "package attributes" do before do original.output(target) input.input(target) end it "should have the correct name" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.name } == original.name end it "should have the correct version" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.version } == original.version end it "should have the correct description" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.description } == original.description end it "should have the correct architecture" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.architecture } == original.architecture end it "should have the correct apps" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.attributes[:snap_apps] } == original.attributes[:snap_apps] end it "should have the correct hooks" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.attributes[:snap_hooks] } == original.attributes[:snap_hooks] end end context "with custom snap.yaml" do let(:snap_yaml) { Stud::Temporary.pathname + ".yaml" } before do File.write(snap_yaml, { "name" => "custom-name", "version" => "custom-version", "summary" => "custom-summary", "description" => "custom-description", "architectures" => ["custom-architecture"], }.to_yaml) original.attributes[:snap_yaml] = snap_yaml original.output(target) input.input(target) end after do subject.cleanup File.unlink(snap_yaml) if File.exist?(snap_yaml) end it "should have the custom name" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.name } == "custom-name" end it "should have the custom version" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.version } == "custom-version" end it "should have the custom description" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.description } == "custom-summary\ncustom-description" end it "should have the custom architecture" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.architecture } == "custom-architecture" end it "should have the custom apps" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.attributes[:snap_apps] } == [] end it "should have the custom hooks" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY insist { input.attributes[:snap_hooks] } == [] end end it "should support specifying confinement" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY original.attributes[:snap_confinement] = "test-confinement" original.output(target) input.input(target) insist { input.attributes[:snap_confinement] } == "test-confinement" end it "should support specifying grade" do pending("Ruby 1.x and 2.0.x are unsupported for Snap because it lacks Psych::safe_load") if IS_OLD_RUBY original.attributes[:snap_grade] = "test-grade" original.output(target) input.input(target) insist { input.attributes[:snap_grade] } == "test-grade" end end end ================================================ FILE: spec/fpm/package/tar_spec.rb ================================================ require "spec_setup" require "fpm" # local require "English" # for $CHILD_STATUS describe FPM::Package::Tar do before do subject.name = "name" subject.version = "123" subject.architecture = "all" subject.iteration = "100" end describe "#to_s" do it "should have a default output filename" do insist { subject.to_s "NAME-VERSION-ITERATION.ARCH.TYPE"} == "name-123-100.all.tar" end end # describe to_s context 'when extracted' do let(:target) { Stud::Temporary.pathname + ".tar" } let(:output_dir) { Stud::Temporary.directory } before do subject.output( target) system("tar x -C '#{output_dir}' -f #{target}") raise "couldn't extract test tar" unless $CHILD_STATUS.success? end it "doesn't include a .scripts folder" do insist { Dir.exist?(File.join(output_dir, '.scripts')) } == false end after do FileUtils.rm_rf(output_dir) FileUtils.rm_rf(target) end end end # describe FPM::Package::Tar ================================================ FILE: spec/fpm/package/virtualenv_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/package/virtualenv" # local require "find" # stdlib def virtualenv_usable? return program_exists?("virtualenv") && program_exists?("virtualenv-tools") end if !virtualenv_usable? Cabin::Channel.get("rspec").warn("Skipping python virtualenv tests because " \ "no virtualenv/tools bin on your path") end describe FPM::Package::Virtualenv, :if => virtualenv_usable? do before do skip("virtualenv and/or virtualenv-tools programs not found") unless virtualenv_usable? end after :each do subject.cleanup end context "without a version on the input" do it "requires that the version be passed separately" do # this failed before I got here subject.version = "8.1.2" subject.input("pip") end end context "with a version on the input" do it "requires that the version be passed separately" do subject.input("pip==8.1.2") insist { subject.version } == "8.1.2" insist { subject.name } == "virtualenv-pip" activate_path = File.join(subject.build_path, '/usr/share/python/pip/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) end it "can override the version specified on the input" do subject.version = "1.2.3" subject.input("pip==8.1.2") insist { subject.version } == "1.2.3" insist { subject.name } == "virtualenv-pip" end context "with a package name supplied" do before do subject.name = "foo" end it "will prepend the default prefix" do subject.input("pip==8.1.2") insist { subject.name } == "virtualenv-foo" end it "will prepend a non default prefix" do subject.attributes[:virtualenv_package_name_prefix] = 'bar' subject.input("pip==8.1.2") insist { subject.name } == "bar-foo" end it "will not prepend a prefix if --fix-name is false" do subject.attributes[:virtualenv_fix_name?] = false subject.input("pip==8.1.2") insist { subject.name } == "foo" end end end context "with an alternate install path" do it "installs in to the alternate directory" do # it seems odd that you can't control the name of the directory under here... subject.attributes[:virtualenv_install_location] = '/opt/foo' subject.input("pip==8.1.2") activate_path = File.join(subject.build_path, '/opt/foo/pip/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) end end context "with other files dir" do it "includes the other files in the package" do subject.attributes[:virtualenv_other_files_dir] = File.expand_path("../../fixtures/python/", File.dirname(__FILE__)) subject.input("pip==8.1.2") activate_path = File.join(subject.build_path, '/usr/share/python/pip/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) egg_path = File.join(subject.build_path, '/setup.py') expect(File.exist?(egg_path)).to(be_truthy) end end context "input is a requirements.txt file" do before :each do subject.attributes[:virtualenv_requirements?] = true end let :fixtures_dir do File.expand_path("../../fixtures/virtualenv/", File.dirname(__FILE__)) end context "default use" do it "creates the virtualenv, using the parent dir as the package name" do subject.input(File.join(fixtures_dir, 'requirements.txt')) activate_path = File.join(subject.build_path, '/usr/share/python/virtualenv/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) expect(subject.name).to eq("virtualenv-virtualenv") end end context "with --name" do it "uses the supplied argument over the parent dir " do subject.name = 'foo' subject.input(File.join(fixtures_dir, 'requirements.txt')) activate_path = File.join(subject.build_path, '/usr/share/python/virtualenv/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) expect(subject.name).to eq("virtualenv-foo") end end end context "new --prefix behaviour" do it "--prefix puts virtualenv under the prefix" do subject.attributes[:prefix] = '/opt/foo' subject.input('absolute') activate_path = File.join(subject.staging_path, '/opt/foo/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) end it "takes precedence over other folder options" do subject.attributes[:prefix] = '/opt/foo' subject.attributes[:install_location] = '/usr/local/foo' subject.input('absolute') activate_path = File.join(subject.staging_path, '/opt/foo/bin/activate') expect(File.exist?(activate_path)).to(be_truthy) end end end ================================================ FILE: spec/fpm/package_convert_spec.rb ================================================ require "spec_setup" require "fpm" # local describe "FPM::Package#convert" do let(:gem_package_name_prefix) { 'rubygem19' } let(:default_rpm_compression) { 'gzip' } subject do source = FPM::Package::Gem.new prefix = source.attributes[:gem_package_name_prefix ] = 'rubygem19' name = source.name = "whatever" version = source.version = "1.0" source.provides << "#{prefix}-#{name} = #{version}" source.convert(FPM::Package::RPM) end it "applies the default attributes for target format" do insist { subject.attributes[:rpm_compression] } == default_rpm_compression end it "remembers attributes applied to source" do insist { subject.attributes[:gem_package_name_prefix] } == gem_package_name_prefix end it "should list provides matching the gem_package_name_prefix (#585)" do insist { subject.provides }.include?("rubygem19(whatever) = 1.0") end end ================================================ FILE: spec/fpm/package_spec.rb ================================================ require "spec_setup" require "fpm" # local describe FPM::Package do after do subject.cleanup end # after shared_examples_for :Default do |item, default| context "default value" do it "should be #{default}" do if default.nil? expect(subject.send(item)).to(be_nil) else expect(subject.send(item)).to(be == default) end end end end shared_examples_for :Mutator do |item| context "when set" do let(:value) { "whatever" } it "should return the set value" do expect(subject.send("#{item}=", value)).to(be == value) end context "the getter" do before do subject.send("#{item}=", value) end it "returns the value set previously" do expect(subject.send(item)).to(be == value) end end end end describe "#name" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, nil it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#version" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, nil it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#architecture" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, "native" it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#attributes" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, { :workdir => ::Dir.tmpdir } it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#category" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, "default" it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#config_files" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, [] it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#conflicts" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, [] it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#dependencies" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, [] it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#description" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, "no description given" it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#epoch" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, nil it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#iteration" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, nil it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#license" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, "unknown" it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#maintainer" do require "socket" default_maintainer = "<#{ENV["USER"]}@#{Socket.gethostname}>" it_behaves_like :Default, description.gsub(/^#/, "").to_sym, default_maintainer it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#provides" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, [] end describe "#replaces" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, [] it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#scripts" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, {} end describe "#url" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, nil it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#vendor" do it_behaves_like :Default, description.gsub(/^#/, "").to_sym, "none" it_behaves_like :Mutator, description.gsub(/^#/, "").to_sym end describe "#exclude (internal method)" do it "should obey attributes[:excludes]" do File.write(subject.staging_path("hello"), "hello") File.write(subject.staging_path("world"), "world") subject.attributes[:excludes] = ["*world*"] subject.instance_eval { exclude } insist { subject.files } == ["hello"] end it "should obey attributes[:excludes] for directories" do Dir.mkdir(subject.staging_path("example")) Dir.mkdir(subject.staging_path("example/foo")) File.write(subject.staging_path("example/foo/delete_me"), "Hello!") File.write(subject.staging_path("keeper"), "Hello!") subject.attributes[:excludes] = ["example"] subject.instance_eval { exclude } insist { subject.files } == ["keeper"] end it "should obey attributes[:excludes] for child directories" do Dir.mkdir(subject.staging_path("example")) Dir.mkdir(subject.staging_path("example/foo")) File.write(subject.staging_path("example/foo/delete_me"), "Hello!") File.write(subject.staging_path("keeper"), "Hello!") subject.attributes[:excludes] = ["example/foo"] subject.instance_eval { exclude } insist { subject.files.sort } == ["example", "keeper"] end end describe "#script (internal method)" do scripts = [:after_install, :before_install, :after_remove, :before_remove] before do scripts.each do |script| subject.scripts[script] = "<%= name %>" end subject.name = "Example" end context "when :template_scripts? is true" do before do subject.attributes[:template_scripts?] = true end scripts.each do |script| it "should evaluate #{script} as a template" do expect(subject.script(script)).to(be == subject.name) end end end context "when :template_scripts? is false" do before do subject.attributes[:template_scripts?] = false end scripts.each do |script| it "should not process #{script} as a template" do expect(subject.script(script)).to(be == subject.scripts[script]) end end end it "should not template by default" do expect(subject.attributes[:template_scripts?]).to(be_falsey) end end describe "#staging_path and #staging_path" do before() do @oldtmp = ENV["TMP"] ENV["TMP"] = '/var/tmp' end after() do ENV["TMP"] = @oldtmp end it "should be a subdirectory of workdir (#1124)" do expect(subject.build_path("hello1")).to(start_with("/var/tmp")) expect(subject.build_path("hello1")).to(end_with("hello1")) expect(subject.build_path("hello1")).to(include("build")) end it "should be a subdirectory of workdir (#1124)" do expect(subject.staging_path("hello2")).to(start_with("/var/tmp")) expect(subject.staging_path("hello2")).to(end_with("hello2")) expect(subject.staging_path("hello2")).to(include("staging")) end end end # describe FPM::Package ================================================ FILE: spec/fpm/rake_task_spec.rb ================================================ require "rspec" # Avoid setup_spec due to overrides require "fpm/command" require "fpm/rake_task" require "tmpdir" describe FPM::RakeTask do around do |example| old_stderr = $stderr.dup $stderr.reopen("/dev/null") example.run $stderr = old_stderr Rake::Task.clear end describe "#new" do it "requires a package name" do expect { described_class.new(nil, :source => :dir, :target => :tar) }. to raise_error(SystemExit, "Must specify package name, source and output") end it "requires a source" do expect { described_class.new(:awesome, :source => nil, :target => :tar) }. to raise_error(SystemExit, "Must specify package name, source and output") end it "requires a target" do expect { described_class.new(:awesome, :source => :dir, :target => nil) }. to raise_error(SystemExit, "Must specify package name, source and output") end it "requires package args" do described_class.new(:awesome, :source => :dir, :target => :tar) expect { Rake::Task["awesome"].execute }. to raise_error(SystemExit, "Must specify args") end it "executes FPM::Command with the appropriate arguments" do command = instance_double(FPM::Command) expected = %W(-t tar -s dir -C #{Dir.tmpdir} --cpan-mirror-only --no-cpan-test --config-files foo --config-files bar --name awesome --cpan-mirror-only --url http://example.com bin/) allow(FPM::Command).to receive(:new).and_return(command) expect(command).to receive(:run).with(array_including(*expected)) args = [:awesome, { :source => :dir, :target => :tar, :directory => Dir.tmpdir }] described_class.new(*args) do |pkg| pkg.args = %w(bin/) pkg.cpan_mirror_only = true pkg.cpan_test = false pkg.url = "http://example.com" pkg.config_files = %w(foo bar) end expect { Rake::Task["awesome"].execute }.to raise_error(SystemExit, nil) end end end ================================================ FILE: spec/fpm/util_spec.rb ================================================ require "spec_setup" require "fpm" # local require "fpm/util" # local require "stud/temporary" require "timeout" describe FPM::Util do subject do Class.new do include FPM::Util end.new end context "#copy_entry" do context "when given files that are symlinks" do it "should keep those files as symlinks" do Stud::Temporary.directory do |path| a = File.join(path, "a") b = File.join(path, "b") File.write(a, "hello") File.symlink(a, b) Stud::Temporary.directory do |target| ta = File.join(target, "a") tb = File.join(target, "b") subject.copy_entry(a, ta) subject.copy_entry(b, tb, false, true) # This seems to work to compare file stat calls. # target 'a' and 'b' should have the same stat result because # they are linked to the same file. insist { File.lstat(ta).ftype } == "file" insist { File.lstat(tb).ftype } == "link" end end end end context "when given files that are hardlinks" do it "should keep those files as hardlinks" do Stud::Temporary.directory do |path| a = File.join(path, "a") b = File.join(path, "b") File.write(a, "hello") File.link(a, b) Stud::Temporary.directory do |target| ta = File.join(target, "a") tb = File.join(target, "b") subject.copy_entry(a, ta) subject.copy_entry(b, tb) # This seems to work to compare file stat calls. # target 'a' and 'b' should have the same stat result because # they are linked to the same file. insist { File.lstat(ta) } == File.lstat(tb) end end end end end # #copy_entry describe "#safesystem" do context "with a missing $SHELL" do before do @orig_shell = ENV["SHELL"] ENV.delete("SHELL") end after do ENV["SHELL"] = @orig_shell unless @orig_shell.nil? end it "should assume /bin/sh" do insist { subject.default_shell } == "/bin/sh" end it "should still run commands correctly" do # This will raise an exception if we can't run it at all. subject.safesystem("true") end end context "with $SHELL set to an empty string" do before do @orig_shell = ENV["SHELL"] ENV["SHELL"] = "" end after do ENV["SHELL"] = @orig_shell unless @orig_shell.nil? end it "should assume /bin/sh" do insist { subject.default_shell } == "/bin/sh" end it "should still run commands correctly" do # This will raise an exception if we can't run it at all. subject.safesystem("true") end end it "should not prompt for input" do expect { Timeout::timeout(3) do subject.safesystem("sh", "-c", "read foo || true") end }.not_to raise_error end it "should pipe command output to logger" do logger = Cabin::Channel.get expect(logger).to receive(:pipe) subject.safesystem("true") end end describe "#expand_pessimistic_constraints" do it 'convert 2 piece versions' do constraint = 'bundle ~> 1.2' expected_lower = 'bundle >= 1.2' expected_upper = 'bundle < 2.0' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include expected_lower expect(derived_constraint).to include expected_upper end it 'convert 3 piece versions' do constraint = 'zippy ~> 1.2.3' expected_lower = 'zippy >= 1.2.3' expected_upper = 'zippy < 1.3.0' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include expected_lower expect(derived_constraint).to include expected_upper end it 'does not convert where not needed when the operator is > ' do constraint = 'zippy > 1.2.3' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include constraint end it 'does not convert where not needed when when the operator is < ' do constraint = 'zippy < 1.2.3' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include constraint end it 'does not convert where not needed when when the operator is <= ' do constraint = 'zippy <= 1.2.3' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include constraint end it 'does not convert where not needed when when the operator is >= ' do constraint = 'zippy >= 1.2.3' derived_constraint = subject.expand_pessimistic_constraints(constraint) expect(derived_constraint).to include constraint end end end ================================================ FILE: spec/requirements.txt ================================================ # Listing of fpm test-suite's Python package dependencies setuptools ================================================ FILE: spec/spec_setup.rb ================================================ require "rubygems" # for ruby 1.8 require "insist" # gem "insist" require "cabin" # gem "cabin" require "tmpdir" # stdlib require "tempfile" # stdlib require "fileutils" # stdlib require "date" # stdlib require "net/http" # stdlib require "json" # stdlib require "yaml" # stdlib # put "lib" in RUBYLIB $: << File.join(File.dirname(File.dirname(__FILE__)), "lib") # for method "program_exists?" etc require "fpm/util" include FPM::Util Cabin::Channel.get.level = :error spec_logger = Cabin::Channel.get("rspec") spec_logger.subscribe(STDOUT) spec_logger.level = :error # Enable debug logs if requested. if $DEBUG or ENV["DEBUG"] Cabin::Channel.get.level = :debug Cabin::Channel.get.subscribe(STDOUT) else class << Cabin::Channel.get alias_method :subscribe_, :subscribe def subscribe(io) return if io == STDOUT subscribe_(io) #puts caller.join("\n") end end end # Quiet the output of all system() calls module Kernel alias_method :orig_system, :system def system(*args) old_stdout = $stdout.clone old_stderr = $stderr.clone null = File.new("/dev/null", "w") $stdout.reopen(null) $stderr.reopen(null) value = orig_system(*args) $stdout.reopen(old_stdout) $stderr.reopen(old_stderr) null.close return value end end ================================================ FILE: templates/deb/changelog.erb ================================================ <%= name %> (<%= "#{epoch}:" if epoch %><%= version %><%= "-" + iteration.to_s if iteration %>) <%= distribution %>; urgency=medium * Package created with FPM. -- <%= maintainer %> <%= (if attributes[:source_date_epoch].nil? then Time.now() else Time.at(attributes[:source_date_epoch].to_i) end).strftime("%a, %d %b %Y %T %z") %> ================================================ FILE: templates/deb/deb.changes.erb ================================================ Format: 1.8 Date: <%= (if attributes[:source_date_epoch].nil? then Time.now() else Time.at(attributes[:source_date_epoch].to_i) end).strftime("%a, %d %b %Y %T %z") %> Source: <%= name %> Binary: <%= name %> Architecture: <%= architecture %> Version: <%= "#{epoch}:" if epoch %><%= version %><%= "-" + iteration.to_s if iteration %> Distribution: <%= distribution %> Urgency: medium Maintainer: <%= maintainer %> <% lines = (description or "no description given").split("\n") -%> <% firstline, *remainder = lines -%> Description: <%= firstline %> <% if remainder.any? -%> <%= remainder.collect { |l| l =~ /^ *$/ ? " ." : " #{l}" }.join("\n") %> <% end -%> Changes: <%= name %> (<%= "#{epoch}:" if epoch %><%= version %><%= "-" + iteration.to_s if iteration %>) <%= distribution %>; urgency=medium * Package created with FPM. Checksums-Sha1: <% changes_files.each do |file| -%> <%= file[:sha1sum] %> <%= file[:size] %> <%= file[:name] %> <% end -%> Checksums-Sha256: <% changes_files.each do |file| -%> <%= file[:sha256sum] %> <%= file[:size] %> <%= file[:name] %> <% end -%> Files: <% changes_files.each do |file| -%> <%= file[:md5sum] %> <%= file[:size] %> default <%= attributes[:deb_priority] %> <%= file[:name] %> <% end -%> ================================================ FILE: templates/deb/ldconfig.sh.erb ================================================ #!/bin/sh # This script is automatically added by fpm when you specify # conditions that usually require running ldconfig upon # package installation and removal. # # For example, if you set '--deb-shlibs' in creating your package, # fpm will use this script if you don't provide your own --after-install or # --after-remove set -e case $1 in configure|remove) ldconfig ;; esac ================================================ FILE: templates/deb/postinst_upgrade.sh.erb ================================================ #!/bin/sh <% if attributes[:deb_maintainerscripts_force_errorchecks?] -%> set -e <% end -%> after_upgrade() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_upgrade) -%> <%= script(:after_upgrade) %> <% end -%> <%# if any systemd services specified, loop through and start them -%> <% if attributes[:deb_systemd].any? -%> systemctl --system daemon-reload >/dev/null || true debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) <% attributes[:deb_systemd].each do |service| -%> if ! systemctl is-enabled <%= service %> >/dev/null then : # Ensure this if-clause is not empty. If it were empty, and we had an 'else', then it is an error in shell syntax <% if attributes[:deb_systemd_enable?]-%> systemctl enable <%= service %> >/dev/null || true <% end -%> <% if attributes[:deb_systemd_auto_start?]-%> $debsystemctl start <%= service %> >/dev/null || true <% end -%> <% if attributes[:deb_systemd_restart_after_upgrade?] -%> else $debsystemctl restart <%= service %> >/dev/null || true <% end -%> fi <% end -%> <% end -%> } after_install() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_install) -%> <%= script(:after_install) %> <% end -%> <%# if any systemd services specified, loop through and start them -%> <% if attributes[:deb_systemd].any? -%> systemctl --system daemon-reload >/dev/null || true debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) <% attributes[:deb_systemd].each do |service| -%> <% if attributes[:deb_systemd_enable?]-%> systemctl enable <%= service %> >/dev/null || true <% end -%> <% if attributes[:deb_systemd_auto_start?]-%> $debsystemctl start <%= service %> >/dev/null || true <% end -%> <% end -%> <% end -%> } if [ "${1}" = "configure" -a -z "${2}" ] || \ [ "${1}" = "abort-remove" ] then # "after install" here # "abort-remove" happens when the pre-removal script failed. # In that case, this script, which should be idemptoent, is run # to ensure a clean roll-back of the removal. after_install elif [ "${1}" = "configure" -a -n "${2}" ] then upgradeFromVersion="${2}" # "after upgrade" here # NOTE: This slot is also used when deb packages are removed, # but their config files aren't, but a newer version of the # package is installed later, called "Config-Files" state. # basically, that still looks a _lot_ like an upgrade to me. after_upgrade "${2}" elif echo "${1}" | grep -E -q "(abort|fail)" then echo "Failed to install before the post-installation script was run." >&2 exit 1 fi ================================================ FILE: templates/deb/postrm_upgrade.sh.erb ================================================ #!/bin/sh <% if attributes[:deb_maintainerscripts_force_errorchecks?] -%> set -e <% end -%> after_remove() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_remove) -%> <%= script(:after_remove) %> <% end -%> } after_purge() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_purge) -%> <%= script(:after_purge) %> <% end -%> } dummy() { : } if [ "${1}" = "remove" -o "${1}" = "abort-install" ] then # "after remove" goes here # "abort-install" happens when the pre-installation script failed. # In that case, this script, which should be idemptoent, is run # to ensure a clean roll-back of the installation. after_remove elif [ "${1}" = "purge" -a -z "${2}" ] then # like "on remove", but executes after dpkg deletes config files # 'apt-get purge' runs 'on remove' section, then this section. # There is no equivalent in RPM or ARCH. after_purge elif [ "${1}" = "upgrade" ] then # This represents the case where the old package's postrm is called after # the 'preinst' script is called. # We should ignore this and just use 'preinst upgrade' and # 'postinst configure'. The newly installed package should do the # upgrade, not the uninstalled one, since it can't anticipate what new # things it will have to do to upgrade for the new version. dummy elif echo "${1}" | grep -E -q '(fail|abort)' then echo "Failed to install before the post-removal script was run." >&2 exit 1 fi ================================================ FILE: templates/deb/preinst_upgrade.sh.erb ================================================ #!/bin/sh <% if attributes[:deb_maintainerscripts_force_errorchecks?] -%> set -e <% end -%> before_upgrade() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:before_upgrade) -%> <%= script(:before_upgrade) %> <% end -%> } before_install() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:before_install) -%> <%= script(:before_install) %> <% end -%> } if [ "${1}" = "install" -a -z "${2}" ] then before_install elif [ "${1}" = "upgrade" -a -n "${2}" ] then upgradeFromVersion="${2}" before_upgrade "${upgradeFromVersion}" elif [ "${1}" = "install" -a -n "${2}" ] then upgradeFromVersion="${2}" # Executed when a package is removed but its config files aren't, # and a new version is installed. # Looks a _lot_ like an upgrade case, I say we just execute the # same "before upgrade" script as in the previous case before_upgrade "${upgradeFromVersion}" elif echo "${1}" | grep -E -q '(fail|abort)' then echo "Failed to install before the pre-installation script was run." >&2 exit 1 fi ================================================ FILE: templates/deb/prerm_upgrade.sh.erb ================================================ #!/bin/sh <% if attributes[:deb_maintainerscripts_force_errorchecks?] -%> set -e <% end -%> before_remove() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:before_remove) -%> <%= script(:before_remove) %> <% end -%> <%# Stop and remove any systemd services that were installed-%> <% if attributes[:deb_systemd].any? -%> debsystemctl=$(command -v deb-systemd-invoke || echo systemctl) <% attributes[:deb_systemd].each do |service| -%> $debsystemctl stop <%= service %> >/dev/null || true systemctl disable <%= service %> >/dev/null || true <% end -%> systemctl --system daemon-reload >/dev/null || true <% end -%> } dummy() { : } if [ "${1}" = "remove" -a -z "${2}" ] then # "before remove" goes here before_remove elif [ "${1}" = "upgrade" ] then # Executed before the old version is removed # upon upgrade. # We should generally not do anything here. The newly installed package # should do the upgrade, not the uninstalled one, since it can't anticipate # what new things it will have to do to upgrade for the new version. dummy elif echo "${1}" | grep -E -q "(fail|abort)" then echo "Failed to install before the pre-removal script was run." >&2 exit 1 fi ================================================ FILE: templates/deb.erb ================================================ Package: <%= name %> Version: <%= "#{epoch}:" if epoch %><%= version %><%= "-" + iteration.to_s if iteration %> License: <%= license %> <% if !vendor.nil? and !vendor.empty? -%> Vendor: <%= vendor %> <% end -%> Architecture: <%= architecture %> Maintainer: <%= maintainer %> Installed-Size: <%= attributes[:deb_installed_size] %> <% if !dependencies.empty? and !attributes[:no_depends?] -%> Depends: <%= dependencies.collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if !conflicts.empty? -%> Conflicts: <%= conflicts.collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if attributes[:deb_breaks] and !attributes[:deb_breaks].empty? -%> Breaks: <%= attributes[:deb_breaks].collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if attributes[:deb_pre_depends] and !attributes[:deb_pre_depends].empty? -%> Pre-Depends: <%= attributes[:deb_pre_depends].collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if attributes[:deb_build_depends] and !attributes[:deb_build_depends].empty? -%> Build-Depends: <%= attributes[:deb_build_depends].collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if !provides.empty? -%> <%# Turn each provides from 'foo = 123' to simply 'foo' because Debian :\ -%> <%# http://www.debian.org/doc/debian-policy/ch-relationships.html -%> Provides: <%= provides.join ", " %> <% end -%> <% if !replaces.empty? -%> Replaces: <%= replaces.collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if attributes[:deb_recommends] and !attributes[:deb_recommends].empty? -%> Recommends: <%= attributes[:deb_recommends].collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> <% if attributes[:deb_suggests] and !attributes[:deb_suggests].empty? -%> Suggests: <%= attributes[:deb_suggests].collect { |d| fix_dependency(d) }.flatten.join(", ") %> <% end -%> Section: <%= category %> Priority: <%= attributes[:deb_priority] %> Homepage: <%= url or "http://nourlgiven.example.com/" %> <% lines = (description or "no description given").split("\n") -%> <% firstline, *remainder = lines -%> Description: <%= firstline %> <% if remainder.any? -%> <%= remainder.collect { |l| l =~ /^ *$/ ? " ." : " #{l}" }.join("\n") %> <% end -%> <% if attributes[:deb_field_given?] -%> <% attributes[:deb_field].each do |field, value| -%> <%= field %>: <%= value %> <% end -%> <% end -%> ================================================ FILE: templates/osxpkg.erb ================================================ postinstall-action="<%= attributes[:osxpkg_postinstall_action] %>"<% end -%> > <% if !attributes[:osxpkg_dont_obsolete].nil? -%> <% attributes[:osxpkg_dont_obsolete].each do |filepath| -%> <% end -%> <% end -%> ================================================ FILE: templates/p5p_metadata.erb ================================================ set name=pkg.fmri value="<%=@name%>@<%=@version%>" set name=pkg.summary value="<%=@description%>" set name=pkg.human-version value="<%=@version%>" set name=pkg.description value="<%=@description%>" set name=info.classification value="org.opensolaris.category.2008:<%=@category%>" set name=variant.opensolaris.zone <%= attributes[:p5p_zonetype] %> set name=variant.arch value=<%=@architecture%> set owner <%= attributes[:p5p_user] %>> set group <%= attributes[:p5p_group] %>> drop> drop> drop> ================================================ FILE: templates/pacman/INSTALL.erb ================================================ <%# In each function, a `:` is the first command. -%> <%# This makes sure that at least one command is in the function -%> <%# This avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> <%# see issue #875 for more details -%> <% if script?(:before_install) -%> pre_install() { : <%= script(:before_install) %> } <% end -%> <% if script?(:after_install) -%> post_install() { : <%= script(:after_install) %> } <% end -%> <% if script?(:before_upgrade) -%> pre_upgrade() { : <%= script(:before_upgrade) %> } <% end -%> <% if script?(:after_upgrade) -%> post_upgrade() { : <%= script(:after_upgrade) %> } <% end -%> <% if script?(:before_remove) -%> pre_remove() { : <%= script(:before_remove) %> } <% end -%> <% if script?(:after_remove) -%> post_remove() { : <%= script(:after_remove) %> } <% end -%> ================================================ FILE: templates/pacman.erb ================================================ # Generated by fpm # Hello packaging friend! # # If you find yourself using this 'fpm --edit' feature frequently, it is # a sign that fpm is missing a feature! I welcome your feature requests! # Please visit the following URL and ask for a feature that helps you never # need to edit this file again! :) # https://github.com/jordansissel/fpm/issues # ------------------------------------------------------------------------ # pkgname = <%= name %> <% if !epoch.nil? -%> pkgver = <%= epoch %>:<%= version %>-<%= iteration %> <% else -%> pkgver = <%= version %>-<%= iteration %> <% end -%> pkgdesc = <%= description %> <% if !url.nil? and !url.empty? -%> url = <%= url %> <% else -%> url = http://nourlgiven.example.com/ <% end -%> builddate = <%= builddate %> packager = <%= maintainer %> size = <%= size %> arch = <%= architecture %> license = <%= license %> <% replaces.each do |repl| -%> replaces = <%= repl %> <% end -%> group = <%= category %> <% conflicts.each do |confl| -%> conflict = <%= confl %> <% end -%> <% provides.each do |prov| -%> provides = <%= prov %> <% end -%> <% config_files.each do |conf| -%> <% conf.gsub(/^\/+/, "") -%> backup = <%= conf %> <% end -%> <% dependencies.each do |req| -%> depend = <%= req %> <% end -%> <% attributes.fetch(:pacman_opt_depends, []).each do |opt| -%> optdepend = <%= opt %> <% end -%> ================================================ FILE: templates/pleaserun/generate-cleanup.sh ================================================ #!/bin/sh show_cleanup_step() { d="${1##.}" if [ ! -z "$d" ] ; then if [ -d "$1" -a ! -d "$d" ] ; then echo "rmdir \"$d\"" fi if [ -f "$1" ] ; then echo "rm \"$d\"" fi fi } for i in "$@" ; do show_cleanup_step "$i" done ================================================ FILE: templates/pleaserun/install-path.sh ================================================ #!/bin/sh install_path() { d="${1##.}" if [ ! -z "$d" ] ; then if [ -d "$1" -a ! -d "$d" ] ; then mkdir "$d" fi if [ -f "$1" ] ; then cp -p "$1" "$d" fi fi } for i in "$@" ; do install_path "$i" done ================================================ FILE: templates/pleaserun/install.sh ================================================ #!/bin/sh source="<%= attributes[:prefix] %>" cleanup_script="$source/cleanup.sh" silent() { "$@" > /dev/null 2>&1 } install_files() { # TODO(sissel): Need to know what prefix the files exist at platform="$1" version="$(version_${platform})" ( # TODO(sissel): Should I just rely on rsync for this stuff? cd "${source}/${platform}/${version}/files/" || exit 1 # Write a cleanup script find . -print0 | xargs -r0 -n1 "$source/generate-cleanup.sh" > "$cleanup_script" # Actually do the installation find . -print0 | xargs -r0 -n1 "$source/install-path.sh" ) } install_actions() { # TODO(sissel): Need to know what prefix the files exist at platform="$1" version="$(version_${platform})" actions="${source}/${platform}/${version}/install_actions.sh" if [ -f "$actions" ] ; then . "$actions" fi } version_systemd() { # Treat all systemd versions the same echo default } version_launchd() { # Treat all launchd versions the same echo 10.9 } version_upstart() { # Treat all upstart versions the same # TODO(sissel): Upstart 0.6.5 needs to be handled specially. version="$(initctl --version | head -1 | tr -d '()' | awk '{print $NF}')" case $version in 0.6.5) echo $version ;; *) echo "1.5" ;; # default modern assumption esac } version_sysv() { # TODO(sissel): Once pleaserun supports multiple sysv implementations, maybe # we inspect the OS to find out what we should target. echo lsb-3.1 } has_systemd() { # Some OS vendors put systemd in ... different places ... [ -d "/lib/systemd/system/" -o -d "/usr/lib/systemd/system" ] && silent which systemctl } has_upstart() { [ -d "/etc/init" ] && silent which initctl } has_sysv() { [ -d "/etc/init.d" ] } #has_freebsd_rcng() { #[ -d "/etc/rc.d" ] && silent which rcorder #} has_daemontools() { [ -d "/service" ] && silent which sv } has_launchd() { [ -d "/Library/LaunchDaemons" ] && silent which launchtl } install_help() { case $platform in systemd) echo "To start this service, use: systemctl start <%= attributes[:pleaserun_name] %>" ;; upstart) echo "To start this service, use: initctl start <%= attributes[:pleaserun_name] %>" ;; launchd) echo "To start this service, use: launchctl start <%= attributes[:pleaserun_name] %>" ;; sysv) echo "To start this service, use: /etc/init.d/<%= attributes[:pleaserun_name] %> start" ;; esac } platforms="systemd upstart launchd sysv" installed=0 for platform in $platforms ; do if has_$platform ; then version="$(version_$platform)" echo "Platform $platform ($version) detected. Installing service." install_files $platform install_actions $platform install_help $platform installed=1 break fi done if [ "$installed" -eq 0 ] ; then echo "Failed to detect any service platform, so no service was installed. Files are available in ${source} if you need them." fi ================================================ FILE: templates/pleaserun/scripts/after-install.sh ================================================ #!/bin/sh source="<%= attributes[:prefix] %>" exec sh "$source/install.sh" ================================================ FILE: templates/pleaserun/scripts/before-remove.sh ================================================ #!/bin/sh source="<%= attributes[:prefix] %>" if [ -f "$source/cleanup.sh" ] ; then echo "Running cleanup to remove service for package <%= attributes[:name] %>" set -e sh "$source/cleanup.sh" # Remove the script also since the package installation generated it. rm "$source/cleanup.sh" fi ================================================ FILE: templates/puppet/package/remove.pp.erb ================================================ class <%= name %>::package::remove { $version = "<%= version %>" $iteration = "<%= iteration %>" fail("DO NOT USE THIS. IT IS NOT WELL DEFINED YET.") file { <% paths.each do |path| -%> "<%= fixpath(path) %>": ensure => absent; <% end # paths.each -%> } } ================================================ FILE: templates/puppet/package.pp.erb ================================================ # TODO(sissel): implement 'anti' class for this package. class <%= name %>::package { $version = "<%= version %>" $iteration = "<%= iteration %>" file { <% paths.each do |path| stat = File.lstat(path) params = {} if stat.directory? params[:ensure] = "directory" elsif stat.symlink? params[:ensure] = "link" params[:target] = File.readlink(path) stat = File.stat(path) else params[:ensure] = "file" params[:source] = "puppet:///modules/#{name}/#{path}" end if params[:ensure] != "link" params[:owner] = uid2user(stat.uid) params[:group] = gid2group(stat.gid) params[:mode] = sprintf("%04o", stat.mode & 0777) end settings = puppetsort(params).collect { |k,v| "#{k} => \"#{v}\"" }.join(",\n ") -%> # <%= stat.inspect %> "<%= fixpath(path) %>": <%= settings %>; <% end # paths.each -%> } } ================================================ FILE: templates/rpm/filesystem_list ================================================ # List of directories from filesystem package # $ rpm -ql filesystem-2.4.30-3.el6.x86_64 / /bin /boot /dev /etc /etc/opt /etc/pki /etc/pm /etc/pm/config.d /etc/pm/power.d /etc/pm/sleep.d /etc/skel /etc/sysconfig /etc/X11 /etc/X11/applnk /etc/X11/fontpath.d /etc/xdg /etc/xdg/autostart /etc/xinetd.d /home /lib /lib64 /lib64/tls /lib/modules /media /mnt /mnt/cdrom /mnt/floppy /opt /proc /root /sbin /selinux /srv /sys /tmp /usr /usr/bin /usr/etc /usr/games /usr/include /usr/lib /usr/lib64 /usr/lib64/games /usr/lib64/pm-utils /usr/lib64/pm-utils/module.d /usr/lib64/pm-utils/power.d /usr/lib64/pm-utils/sleep.d /usr/lib64/sse2 /usr/lib64/tls /usr/lib64/X11 /usr/libexec /usr/lib/games /usr/lib/locale /usr/local /usr/local/bin /usr/local/etc /usr/local/games /usr/local/include /usr/local/lib /usr/local/lib64 /usr/local/libexec /usr/local/sbin /usr/local/share /usr/local/share/applications /usr/local/share/info /usr/local/share/man /usr/local/share/man/man1 /usr/local/share/man/man1x /usr/local/share/man/man2 /usr/local/share/man/man2x /usr/local/share/man/man3 /usr/local/share/man/man3x /usr/local/share/man/man4 /usr/local/share/man/man4x /usr/local/share/man/man5 /usr/local/share/man/man5x /usr/local/share/man/man6 /usr/local/share/man/man6x /usr/local/share/man/man7 /usr/local/share/man/man7x /usr/local/share/man/man8 /usr/local/share/man/man8x /usr/local/share/man/man9 /usr/local/share/man/man9x /usr/local/share/man/mann /usr/local/src /usr/sbin /usr/share /usr/share/applications /usr/share/augeas /usr/share/augeas/lenses /usr/share/backgrounds /usr/share/desktop-directories /usr/share/dict /usr/share/doc /usr/share/empty /usr/share/games /usr/share/ghostscript /usr/share/ghostscript/conf.d /usr/share/gnome /usr/share/icons /usr/share/idl /usr/share/info /usr/share/locale /usr/share/locale/aa /usr/share/locale/aa/LC_MESSAGES /usr/share/locale/ab /usr/share/locale/ab/LC_MESSAGES /usr/share/locale/ace /usr/share/locale/ace/LC_MESSAGES /usr/share/locale/ach /usr/share/locale/ach/LC_MESSAGES /usr/share/locale/ada /usr/share/locale/ada/LC_MESSAGES /usr/share/locale/ady /usr/share/locale/ady/LC_MESSAGES /usr/share/locale/ae /usr/share/locale/ae/LC_MESSAGES /usr/share/locale/af /usr/share/locale/afa /usr/share/locale/afa/LC_MESSAGES /usr/share/locale/afh /usr/share/locale/afh/LC_MESSAGES /usr/share/locale/af/LC_MESSAGES /usr/share/locale/af_ZA /usr/share/locale/af_ZA/LC_MESSAGES /usr/share/locale/ain /usr/share/locale/ain/LC_MESSAGES /usr/share/locale/ak /usr/share/locale/akk /usr/share/locale/akk/LC_MESSAGES /usr/share/locale/ak/LC_MESSAGES /usr/share/locale/ale /usr/share/locale/ale/LC_MESSAGES /usr/share/locale/alg /usr/share/locale/alg/LC_MESSAGES /usr/share/locale/alt /usr/share/locale/alt/LC_MESSAGES /usr/share/locale/am /usr/share/locale/am_ET /usr/share/locale/am_ET/LC_MESSAGES /usr/share/locale/am/LC_MESSAGES /usr/share/locale/an /usr/share/locale/ang /usr/share/locale/ang/LC_MESSAGES /usr/share/locale/an/LC_MESSAGES /usr/share/locale/anp /usr/share/locale/anp/LC_MESSAGES /usr/share/locale/apa /usr/share/locale/apa/LC_MESSAGES /usr/share/locale/ar /usr/share/locale/arc /usr/share/locale/arc/LC_MESSAGES /usr/share/locale/ar/LC_MESSAGES /usr/share/locale/arn /usr/share/locale/arn/LC_MESSAGES /usr/share/locale/arp /usr/share/locale/arp/LC_MESSAGES /usr/share/locale/art /usr/share/locale/art/LC_MESSAGES /usr/share/locale/arw /usr/share/locale/arw/LC_MESSAGES /usr/share/locale/as /usr/share/locale/as/LC_MESSAGES /usr/share/locale/ast /usr/share/locale/ast_ES /usr/share/locale/ast_ES/LC_MESSAGES /usr/share/locale/ast/LC_MESSAGES /usr/share/locale/ath /usr/share/locale/ath/LC_MESSAGES /usr/share/locale/aus /usr/share/locale/aus/LC_MESSAGES /usr/share/locale/av /usr/share/locale/av/LC_MESSAGES /usr/share/locale/awa /usr/share/locale/awa/LC_MESSAGES /usr/share/locale/ay /usr/share/locale/ay/LC_MESSAGES /usr/share/locale/az /usr/share/locale/az_IR /usr/share/locale/az_IR/LC_MESSAGES /usr/share/locale/az/LC_MESSAGES /usr/share/locale/ba /usr/share/locale/bad /usr/share/locale/bad/LC_MESSAGES /usr/share/locale/bai /usr/share/locale/bai/LC_MESSAGES /usr/share/locale/bal /usr/share/locale/ba/LC_MESSAGES /usr/share/locale/bal/LC_MESSAGES /usr/share/locale/ban /usr/share/locale/ban/LC_MESSAGES /usr/share/locale/bas /usr/share/locale/bas/LC_MESSAGES /usr/share/locale/bat /usr/share/locale/bat/LC_MESSAGES /usr/share/locale/be /usr/share/locale/bej /usr/share/locale/bej/LC_MESSAGES /usr/share/locale/be@latin /usr/share/locale/be@latin/LC_MESSAGES /usr/share/locale/be/LC_MESSAGES /usr/share/locale/bem /usr/share/locale/bem/LC_MESSAGES /usr/share/locale/ber /usr/share/locale/ber/LC_MESSAGES /usr/share/locale/bg /usr/share/locale/bg_BG /usr/share/locale/bg_BG/LC_MESSAGES /usr/share/locale/bg/LC_MESSAGES /usr/share/locale/bh /usr/share/locale/bh/LC_MESSAGES /usr/share/locale/bho /usr/share/locale/bho/LC_MESSAGES /usr/share/locale/bi /usr/share/locale/bik /usr/share/locale/bik/LC_MESSAGES /usr/share/locale/bi/LC_MESSAGES /usr/share/locale/bin /usr/share/locale/bin/LC_MESSAGES /usr/share/locale/bla /usr/share/locale/bla/LC_MESSAGES /usr/share/locale/bm /usr/share/locale/bm/LC_MESSAGES /usr/share/locale/bn /usr/share/locale/bn_IN /usr/share/locale/bn_IN/LC_MESSAGES /usr/share/locale/bn/LC_MESSAGES /usr/share/locale/bnt /usr/share/locale/bnt/LC_MESSAGES /usr/share/locale/bo /usr/share/locale/bo/LC_MESSAGES /usr/share/locale/br /usr/share/locale/bra /usr/share/locale/bra/LC_MESSAGES /usr/share/locale/br/LC_MESSAGES /usr/share/locale/bs /usr/share/locale/bs/LC_MESSAGES /usr/share/locale/btk /usr/share/locale/btk/LC_MESSAGES /usr/share/locale/bua /usr/share/locale/bua/LC_MESSAGES /usr/share/locale/bug /usr/share/locale/bug/LC_MESSAGES /usr/share/locale/byn /usr/share/locale/byn/LC_MESSAGES /usr/share/locale/ca /usr/share/locale/cad /usr/share/locale/cad/LC_MESSAGES /usr/share/locale/ca_ES /usr/share/locale/ca_ES/LC_MESSAGES /usr/share/locale/ca_ES@valencian /usr/share/locale/ca_ES@valencian/LC_MESSAGES /usr/share/locale/cai /usr/share/locale/cai/LC_MESSAGES /usr/share/locale/ca/LC_MESSAGES /usr/share/locale/car /usr/share/locale/car/LC_MESSAGES /usr/share/locale/cau /usr/share/locale/cau/LC_MESSAGES /usr/share/locale/ca@valencia /usr/share/locale/ca@valencia/LC_MESSAGES /usr/share/locale/ce /usr/share/locale/ceb /usr/share/locale/ceb/LC_MESSAGES /usr/share/locale/cel /usr/share/locale/ce/LC_MESSAGES /usr/share/locale/cel/LC_MESSAGES /usr/share/locale/ch /usr/share/locale/chb /usr/share/locale/chb/LC_MESSAGES /usr/share/locale/chg /usr/share/locale/chg/LC_MESSAGES /usr/share/locale/chk /usr/share/locale/chk/LC_MESSAGES /usr/share/locale/ch/LC_MESSAGES /usr/share/locale/chm /usr/share/locale/chm/LC_MESSAGES /usr/share/locale/chn /usr/share/locale/chn/LC_MESSAGES /usr/share/locale/cho /usr/share/locale/cho/LC_MESSAGES /usr/share/locale/chp /usr/share/locale/chp/LC_MESSAGES /usr/share/locale/chr /usr/share/locale/chr/LC_MESSAGES /usr/share/locale/chy /usr/share/locale/chy/LC_MESSAGES /usr/share/locale/cmc /usr/share/locale/cmc/LC_MESSAGES /usr/share/locale/co /usr/share/locale/co/LC_MESSAGES /usr/share/locale/cop /usr/share/locale/cop/LC_MESSAGES /usr/share/locale/cpe /usr/share/locale/cpe/LC_MESSAGES /usr/share/locale/cpf /usr/share/locale/cpf/LC_MESSAGES /usr/share/locale/cpp /usr/share/locale/cpp/LC_MESSAGES /usr/share/locale/cr /usr/share/locale/crh /usr/share/locale/crh/LC_MESSAGES /usr/share/locale/cr/LC_MESSAGES /usr/share/locale/crp /usr/share/locale/crp/LC_MESSAGES /usr/share/locale/cs /usr/share/locale/csb /usr/share/locale/csb/LC_MESSAGES /usr/share/locale/cs_CZ /usr/share/locale/cs_CZ/LC_MESSAGES /usr/share/locale/cs/LC_MESSAGES /usr/share/locale/cu /usr/share/locale/cu/LC_MESSAGES /usr/share/locale/cus /usr/share/locale/cus/LC_MESSAGES /usr/share/locale/cv /usr/share/locale/cv/LC_MESSAGES /usr/share/locale/cy /usr/share/locale/cy/LC_MESSAGES /usr/share/locale/da /usr/share/locale/dak /usr/share/locale/dak/LC_MESSAGES /usr/share/locale/da/LC_MESSAGES /usr/share/locale/dar /usr/share/locale/dar/LC_MESSAGES /usr/share/locale/day /usr/share/locale/day/LC_MESSAGES /usr/share/locale/de /usr/share/locale/de_AT /usr/share/locale/de_AT/LC_MESSAGES /usr/share/locale/de_CH /usr/share/locale/de_CH/LC_MESSAGES /usr/share/locale/de_DE /usr/share/locale/de_DE/LC_MESSAGES /usr/share/locale/default /usr/share/locale/default/LC_MESSAGES /usr/share/locale/del /usr/share/locale/de/LC_MESSAGES /usr/share/locale/del/LC_MESSAGES /usr/share/locale/den /usr/share/locale/den/LC_MESSAGES /usr/share/locale/dgr /usr/share/locale/dgr/LC_MESSAGES /usr/share/locale/din /usr/share/locale/din/LC_MESSAGES /usr/share/locale/doi /usr/share/locale/doi/LC_MESSAGES /usr/share/locale/dra /usr/share/locale/dra/LC_MESSAGES /usr/share/locale/dsb /usr/share/locale/dsb/LC_MESSAGES /usr/share/locale/dua /usr/share/locale/dua/LC_MESSAGES /usr/share/locale/dum /usr/share/locale/dum/LC_MESSAGES /usr/share/locale/dv /usr/share/locale/dv/LC_MESSAGES /usr/share/locale/dyu /usr/share/locale/dyu/LC_MESSAGES /usr/share/locale/dz /usr/share/locale/dz/LC_MESSAGES /usr/share/locale/ee /usr/share/locale/ee/LC_MESSAGES /usr/share/locale/efi /usr/share/locale/efi/LC_MESSAGES /usr/share/locale/egy /usr/share/locale/egy/LC_MESSAGES /usr/share/locale/eka /usr/share/locale/eka/LC_MESSAGES /usr/share/locale/el /usr/share/locale/el_GR /usr/share/locale/el_GR/LC_MESSAGES /usr/share/locale/el/LC_MESSAGES /usr/share/locale/elx /usr/share/locale/elx/LC_MESSAGES /usr/share/locale/en /usr/share/locale/en_AU /usr/share/locale/en_AU/LC_MESSAGES /usr/share/locale/en@boldquot /usr/share/locale/en@boldquot/LC_MESSAGES /usr/share/locale/en_CA /usr/share/locale/en_CA/LC_MESSAGES /usr/share/locale/en_GB /usr/share/locale/en_GB/LC_MESSAGES /usr/share/locale/en/LC_MESSAGES /usr/share/locale/enm /usr/share/locale/enm/LC_MESSAGES /usr/share/locale/en_NZ /usr/share/locale/en_NZ/LC_MESSAGES /usr/share/locale/en@quot /usr/share/locale/en@quot/LC_MESSAGES /usr/share/locale/en@shaw /usr/share/locale/en@shaw/LC_MESSAGES /usr/share/locale/en_US /usr/share/locale/en_US/LC_MESSAGES /usr/share/locale/eo /usr/share/locale/eo/LC_MESSAGES /usr/share/locale/es /usr/share/locale/es_AR /usr/share/locale/es_AR/LC_MESSAGES /usr/share/locale/es_CL /usr/share/locale/es_CL/LC_MESSAGES /usr/share/locale/es_CO /usr/share/locale/es_CO/LC_MESSAGES /usr/share/locale/es_CR /usr/share/locale/es_CR/LC_MESSAGES /usr/share/locale/es_DO /usr/share/locale/es_DO/LC_MESSAGES /usr/share/locale/es_EC /usr/share/locale/es_EC/LC_MESSAGES /usr/share/locale/es_ES /usr/share/locale/es_ES/LC_MESSAGES /usr/share/locale/es_GT /usr/share/locale/es_GT/LC_MESSAGES /usr/share/locale/es_HN /usr/share/locale/es_HN/LC_MESSAGES /usr/share/locale/es/LC_MESSAGES /usr/share/locale/es_MX /usr/share/locale/es_MX/LC_MESSAGES /usr/share/locale/es_NI /usr/share/locale/es_NI/LC_MESSAGES /usr/share/locale/es_PA /usr/share/locale/es_PA/LC_MESSAGES /usr/share/locale/es_PE /usr/share/locale/es_PE/LC_MESSAGES /usr/share/locale/es_PR /usr/share/locale/es_PR/LC_MESSAGES /usr/share/locale/es_SV /usr/share/locale/es_SV/LC_MESSAGES /usr/share/locale/es_UY /usr/share/locale/es_UY/LC_MESSAGES /usr/share/locale/es_VE /usr/share/locale/es_VE/LC_MESSAGES /usr/share/locale/et /usr/share/locale/et_EE /usr/share/locale/et_EE/LC_MESSAGES /usr/share/locale/et/LC_MESSAGES /usr/share/locale/eu /usr/share/locale/eu_ES /usr/share/locale/eu_ES/LC_MESSAGES /usr/share/locale/eu/LC_MESSAGES /usr/share/locale/ewo /usr/share/locale/ewo/LC_MESSAGES /usr/share/locale/fa /usr/share/locale/fa_IR /usr/share/locale/fa_IR/LC_MESSAGES /usr/share/locale/fa/LC_MESSAGES /usr/share/locale/fan /usr/share/locale/fan/LC_MESSAGES /usr/share/locale/fat /usr/share/locale/fat/LC_MESSAGES /usr/share/locale/ff /usr/share/locale/ff/LC_MESSAGES /usr/share/locale/fi /usr/share/locale/fi_FI /usr/share/locale/fi_FI/LC_MESSAGES /usr/share/locale/fil /usr/share/locale/fi/LC_MESSAGES /usr/share/locale/fil/LC_MESSAGES /usr/share/locale/fiu /usr/share/locale/fiu/LC_MESSAGES /usr/share/locale/fj /usr/share/locale/fj/LC_MESSAGES /usr/share/locale/fo /usr/share/locale/fo/LC_MESSAGES /usr/share/locale/fon /usr/share/locale/fon/LC_MESSAGES /usr/share/locale/fr /usr/share/locale/fr_BE /usr/share/locale/fr_BE/LC_MESSAGES /usr/share/locale/fr_CA /usr/share/locale/fr_CA/LC_MESSAGES /usr/share/locale/fr_CH /usr/share/locale/fr_CH/LC_MESSAGES /usr/share/locale/fr_FR /usr/share/locale/fr_FR/LC_MESSAGES /usr/share/locale/fr/LC_MESSAGES /usr/share/locale/frm /usr/share/locale/frm/LC_MESSAGES /usr/share/locale/fro /usr/share/locale/fro/LC_MESSAGES /usr/share/locale/frr /usr/share/locale/frr/LC_MESSAGES /usr/share/locale/frs /usr/share/locale/frs/LC_MESSAGES /usr/share/locale/fur /usr/share/locale/fur/LC_MESSAGES /usr/share/locale/fy /usr/share/locale/fy/LC_MESSAGES /usr/share/locale/ga /usr/share/locale/gaa /usr/share/locale/gaa/LC_MESSAGES /usr/share/locale/ga/LC_MESSAGES /usr/share/locale/gay /usr/share/locale/gay/LC_MESSAGES /usr/share/locale/gba /usr/share/locale/gba/LC_MESSAGES /usr/share/locale/gd /usr/share/locale/gd/LC_MESSAGES /usr/share/locale/gem /usr/share/locale/gem/LC_MESSAGES /usr/share/locale/gez /usr/share/locale/gez/LC_MESSAGES /usr/share/locale/gil /usr/share/locale/gil/LC_MESSAGES /usr/share/locale/gl /usr/share/locale/gl_ES /usr/share/locale/gl_ES/LC_MESSAGES /usr/share/locale/gl/LC_MESSAGES /usr/share/locale/gmh /usr/share/locale/gmh/LC_MESSAGES /usr/share/locale/gn /usr/share/locale/gn/LC_MESSAGES /usr/share/locale/goh /usr/share/locale/goh/LC_MESSAGES /usr/share/locale/gon /usr/share/locale/gon/LC_MESSAGES /usr/share/locale/gor /usr/share/locale/gor/LC_MESSAGES /usr/share/locale/got /usr/share/locale/got/LC_MESSAGES /usr/share/locale/grb /usr/share/locale/grb/LC_MESSAGES /usr/share/locale/grc /usr/share/locale/grc/LC_MESSAGES /usr/share/locale/gsw /usr/share/locale/gsw/LC_MESSAGES /usr/share/locale/gu /usr/share/locale/gu/LC_MESSAGES /usr/share/locale/gv /usr/share/locale/gv/LC_MESSAGES /usr/share/locale/gwi /usr/share/locale/gwi/LC_MESSAGES /usr/share/locale/ha /usr/share/locale/hai /usr/share/locale/hai/LC_MESSAGES /usr/share/locale/ha/LC_MESSAGES /usr/share/locale/haw /usr/share/locale/haw/LC_MESSAGES /usr/share/locale/he /usr/share/locale/he_IL /usr/share/locale/he_IL/LC_MESSAGES /usr/share/locale/he/LC_MESSAGES /usr/share/locale/hi /usr/share/locale/hil /usr/share/locale/hi/LC_MESSAGES /usr/share/locale/hil/LC_MESSAGES /usr/share/locale/him /usr/share/locale/him/LC_MESSAGES /usr/share/locale/hit /usr/share/locale/hit/LC_MESSAGES /usr/share/locale/hmn /usr/share/locale/hmn/LC_MESSAGES /usr/share/locale/ho /usr/share/locale/ho/LC_MESSAGES /usr/share/locale/hr /usr/share/locale/hr_HR /usr/share/locale/hr_HR/LC_MESSAGES /usr/share/locale/hr/LC_MESSAGES /usr/share/locale/hsb /usr/share/locale/hsb/LC_MESSAGES /usr/share/locale/ht /usr/share/locale/ht/LC_MESSAGES /usr/share/locale/hu /usr/share/locale/hu_HU /usr/share/locale/hu_HU/LC_MESSAGES /usr/share/locale/hu/LC_MESSAGES /usr/share/locale/hup /usr/share/locale/hup/LC_MESSAGES /usr/share/locale/hy /usr/share/locale/hy/LC_MESSAGES /usr/share/locale/hz /usr/share/locale/hz/LC_MESSAGES /usr/share/locale/ia /usr/share/locale/ia/LC_MESSAGES /usr/share/locale/iba /usr/share/locale/iba/LC_MESSAGES /usr/share/locale/id /usr/share/locale/id/LC_MESSAGES /usr/share/locale/ie /usr/share/locale/ie/LC_MESSAGES /usr/share/locale/ig /usr/share/locale/ig/LC_MESSAGES /usr/share/locale/ii /usr/share/locale/ii/LC_MESSAGES /usr/share/locale/ijo /usr/share/locale/ijo/LC_MESSAGES /usr/share/locale/ik /usr/share/locale/ik/LC_MESSAGES /usr/share/locale/ilo /usr/share/locale/ilo/LC_MESSAGES /usr/share/locale/inc /usr/share/locale/inc/LC_MESSAGES /usr/share/locale/ine /usr/share/locale/ine/LC_MESSAGES /usr/share/locale/inh /usr/share/locale/inh/LC_MESSAGES /usr/share/locale/io /usr/share/locale/io/LC_MESSAGES /usr/share/locale/ira /usr/share/locale/ira/LC_MESSAGES /usr/share/locale/iro /usr/share/locale/iro/LC_MESSAGES /usr/share/locale/is /usr/share/locale/is/LC_MESSAGES /usr/share/locale/it /usr/share/locale/it_CH /usr/share/locale/it_CH/LC_MESSAGES /usr/share/locale/it_IT /usr/share/locale/it_IT/LC_MESSAGES /usr/share/locale/it/LC_MESSAGES /usr/share/locale/iu /usr/share/locale/iu/LC_MESSAGES /usr/share/locale/ja /usr/share/locale/ja_JP /usr/share/locale/ja_JP/LC_MESSAGES /usr/share/locale/ja/LC_MESSAGES /usr/share/locale/jbo /usr/share/locale/jbo/LC_MESSAGES /usr/share/locale/jpr /usr/share/locale/jpr/LC_MESSAGES /usr/share/locale/jrb /usr/share/locale/jrb/LC_MESSAGES /usr/share/locale/jv /usr/share/locale/jv/LC_MESSAGES /usr/share/locale/ka /usr/share/locale/kaa /usr/share/locale/kaa/LC_MESSAGES /usr/share/locale/kab /usr/share/locale/kab/LC_MESSAGES /usr/share/locale/kac /usr/share/locale/kac/LC_MESSAGES /usr/share/locale/ka/LC_MESSAGES /usr/share/locale/kam /usr/share/locale/kam/LC_MESSAGES /usr/share/locale/kar /usr/share/locale/kar/LC_MESSAGES /usr/share/locale/kaw /usr/share/locale/kaw/LC_MESSAGES /usr/share/locale/kbd /usr/share/locale/kbd/LC_MESSAGES /usr/share/locale/kg /usr/share/locale/kg/LC_MESSAGES /usr/share/locale/kha /usr/share/locale/kha/LC_MESSAGES /usr/share/locale/khi /usr/share/locale/khi/LC_MESSAGES /usr/share/locale/kho /usr/share/locale/kho/LC_MESSAGES /usr/share/locale/ki /usr/share/locale/ki/LC_MESSAGES /usr/share/locale/kj /usr/share/locale/kj/LC_MESSAGES /usr/share/locale/kk /usr/share/locale/kk/LC_MESSAGES /usr/share/locale/kl /usr/share/locale/kl/LC_MESSAGES /usr/share/locale/km /usr/share/locale/kmb /usr/share/locale/kmb/LC_MESSAGES /usr/share/locale/km/LC_MESSAGES /usr/share/locale/kn /usr/share/locale/kn/LC_MESSAGES /usr/share/locale/ko /usr/share/locale/kok /usr/share/locale/kok/LC_MESSAGES /usr/share/locale/ko_KR /usr/share/locale/ko_KR/LC_MESSAGES /usr/share/locale/ko/LC_MESSAGES /usr/share/locale/kos /usr/share/locale/kos/LC_MESSAGES /usr/share/locale/kpe /usr/share/locale/kpe/LC_MESSAGES /usr/share/locale/kr /usr/share/locale/krc /usr/share/locale/krc/LC_MESSAGES /usr/share/locale/krl /usr/share/locale/kr/LC_MESSAGES /usr/share/locale/krl/LC_MESSAGES /usr/share/locale/kro /usr/share/locale/kro/LC_MESSAGES /usr/share/locale/kru /usr/share/locale/kru/LC_MESSAGES /usr/share/locale/ks /usr/share/locale/ks@devanagari /usr/share/locale/ks@devanagari/LC_MESSAGES /usr/share/locale/ks/LC_MESSAGES /usr/share/locale/ku /usr/share/locale/ku/LC_MESSAGES /usr/share/locale/kum /usr/share/locale/kum/LC_MESSAGES /usr/share/locale/kut /usr/share/locale/kut/LC_MESSAGES /usr/share/locale/kv /usr/share/locale/kv/LC_MESSAGES /usr/share/locale/kw /usr/share/locale/kw/LC_MESSAGES /usr/share/locale/ky /usr/share/locale/ky/LC_MESSAGES /usr/share/locale/la /usr/share/locale/lad /usr/share/locale/lad/LC_MESSAGES /usr/share/locale/lah /usr/share/locale/lah/LC_MESSAGES /usr/share/locale/la/LC_MESSAGES /usr/share/locale/lam /usr/share/locale/lam/LC_MESSAGES /usr/share/locale/lb /usr/share/locale/lb/LC_MESSAGES /usr/share/locale/lez /usr/share/locale/lez/LC_MESSAGES /usr/share/locale/lg /usr/share/locale/lg/LC_MESSAGES /usr/share/locale/li /usr/share/locale/li/LC_MESSAGES /usr/share/locale/ln /usr/share/locale/ln/LC_MESSAGES /usr/share/locale/lo /usr/share/locale/lol /usr/share/locale/lo/LC_MESSAGES /usr/share/locale/lol/LC_MESSAGES /usr/share/locale/loz /usr/share/locale/loz/LC_MESSAGES /usr/share/locale/lt /usr/share/locale/lt/LC_MESSAGES /usr/share/locale/lu /usr/share/locale/lua /usr/share/locale/lua/LC_MESSAGES /usr/share/locale/lui /usr/share/locale/lui/LC_MESSAGES /usr/share/locale/lu/LC_MESSAGES /usr/share/locale/lun /usr/share/locale/lun/LC_MESSAGES /usr/share/locale/luo /usr/share/locale/luo/LC_MESSAGES /usr/share/locale/lus /usr/share/locale/lus/LC_MESSAGES /usr/share/locale/lv /usr/share/locale/lv/LC_MESSAGES /usr/share/locale/lv_LV /usr/share/locale/lv_LV/LC_MESSAGES /usr/share/locale/mad /usr/share/locale/mad/LC_MESSAGES /usr/share/locale/mag /usr/share/locale/mag/LC_MESSAGES /usr/share/locale/mai /usr/share/locale/mai/LC_MESSAGES /usr/share/locale/mak /usr/share/locale/mak/LC_MESSAGES /usr/share/locale/man /usr/share/locale/man/LC_MESSAGES /usr/share/locale/map /usr/share/locale/map/LC_MESSAGES /usr/share/locale/mas /usr/share/locale/mas/LC_MESSAGES /usr/share/locale/mdf /usr/share/locale/mdf/LC_MESSAGES /usr/share/locale/mdr /usr/share/locale/mdr/LC_MESSAGES /usr/share/locale/men /usr/share/locale/men/LC_MESSAGES /usr/share/locale/mg /usr/share/locale/mga /usr/share/locale/mga/LC_MESSAGES /usr/share/locale/mg/LC_MESSAGES /usr/share/locale/mh /usr/share/locale/mh/LC_MESSAGES /usr/share/locale/mi /usr/share/locale/mic /usr/share/locale/mic/LC_MESSAGES /usr/share/locale/mi/LC_MESSAGES /usr/share/locale/min /usr/share/locale/min/LC_MESSAGES /usr/share/locale/mis /usr/share/locale/mis/LC_MESSAGES /usr/share/locale/mk /usr/share/locale/mkh /usr/share/locale/mkh/LC_MESSAGES /usr/share/locale/mk/LC_MESSAGES /usr/share/locale/ml /usr/share/locale/ml/LC_MESSAGES /usr/share/locale/mn /usr/share/locale/mnc /usr/share/locale/mnc/LC_MESSAGES /usr/share/locale/mni /usr/share/locale/mni/LC_MESSAGES /usr/share/locale/mn/LC_MESSAGES /usr/share/locale/mno /usr/share/locale/mno/LC_MESSAGES /usr/share/locale/mo /usr/share/locale/moh /usr/share/locale/moh/LC_MESSAGES /usr/share/locale/mo/LC_MESSAGES /usr/share/locale/mos /usr/share/locale/mos/LC_MESSAGES /usr/share/locale/mr /usr/share/locale/mr/LC_MESSAGES /usr/share/locale/ms /usr/share/locale/ms/LC_MESSAGES /usr/share/locale/ms_MY /usr/share/locale/ms_MY/LC_MESSAGES /usr/share/locale/mt /usr/share/locale/mt/LC_MESSAGES /usr/share/locale/mul /usr/share/locale/mul/LC_MESSAGES /usr/share/locale/mun /usr/share/locale/mun/LC_MESSAGES /usr/share/locale/mus /usr/share/locale/mus/LC_MESSAGES /usr/share/locale/mwl /usr/share/locale/mwl/LC_MESSAGES /usr/share/locale/mwr /usr/share/locale/mwr/LC_MESSAGES /usr/share/locale/my /usr/share/locale/my/LC_MESSAGES /usr/share/locale/my_MM /usr/share/locale/my_MM/LC_MESSAGES /usr/share/locale/myn /usr/share/locale/myn/LC_MESSAGES /usr/share/locale/myv /usr/share/locale/myv/LC_MESSAGES /usr/share/locale/na /usr/share/locale/nah /usr/share/locale/nah/LC_MESSAGES /usr/share/locale/nai /usr/share/locale/nai/LC_MESSAGES /usr/share/locale/na/LC_MESSAGES /usr/share/locale/nap /usr/share/locale/nap/LC_MESSAGES /usr/share/locale/nb /usr/share/locale/nb/LC_MESSAGES /usr/share/locale/nb_NO /usr/share/locale/nb_NO/LC_MESSAGES /usr/share/locale/nd /usr/share/locale/nd/LC_MESSAGES /usr/share/locale/nds /usr/share/locale/nds_DE /usr/share/locale/nds_DE/LC_MESSAGES /usr/share/locale/nds/LC_MESSAGES /usr/share/locale/nds@NFE /usr/share/locale/nds@NFE/LC_MESSAGES /usr/share/locale/ne /usr/share/locale/ne/LC_MESSAGES /usr/share/locale/new /usr/share/locale/new/LC_MESSAGES /usr/share/locale/ng /usr/share/locale/ng/LC_MESSAGES /usr/share/locale/nia /usr/share/locale/nia/LC_MESSAGES /usr/share/locale/nic /usr/share/locale/nic/LC_MESSAGES /usr/share/locale/niu /usr/share/locale/niu/LC_MESSAGES /usr/share/locale/nl /usr/share/locale/nl_BE /usr/share/locale/nl_BE/LC_MESSAGES /usr/share/locale/nl/LC_MESSAGES /usr/share/locale/nl_NL /usr/share/locale/nl_NL/LC_MESSAGES /usr/share/locale/nn /usr/share/locale/nn/LC_MESSAGES /usr/share/locale/no /usr/share/locale/nog /usr/share/locale/nog/LC_MESSAGES /usr/share/locale/no/LC_MESSAGES /usr/share/locale/non /usr/share/locale/non/LC_MESSAGES /usr/share/locale/nqo /usr/share/locale/nqo/LC_MESSAGES /usr/share/locale/nr /usr/share/locale/nr/LC_MESSAGES /usr/share/locale/nso /usr/share/locale/nso/LC_MESSAGES /usr/share/locale/nub /usr/share/locale/nub/LC_MESSAGES /usr/share/locale/nv /usr/share/locale/nv/LC_MESSAGES /usr/share/locale/nwc /usr/share/locale/nwc/LC_MESSAGES /usr/share/locale/ny /usr/share/locale/ny/LC_MESSAGES /usr/share/locale/nym /usr/share/locale/nym/LC_MESSAGES /usr/share/locale/nyn /usr/share/locale/nyn/LC_MESSAGES /usr/share/locale/nyo /usr/share/locale/nyo/LC_MESSAGES /usr/share/locale/nzi /usr/share/locale/nzi/LC_MESSAGES /usr/share/locale/oc /usr/share/locale/oc/LC_MESSAGES /usr/share/locale/oj /usr/share/locale/oj/LC_MESSAGES /usr/share/locale/om /usr/share/locale/om/LC_MESSAGES /usr/share/locale/or /usr/share/locale/or/LC_MESSAGES /usr/share/locale/os /usr/share/locale/osa /usr/share/locale/osa/LC_MESSAGES /usr/share/locale/os/LC_MESSAGES /usr/share/locale/ota /usr/share/locale/ota/LC_MESSAGES /usr/share/locale/oto /usr/share/locale/oto/LC_MESSAGES /usr/share/locale/pa /usr/share/locale/paa /usr/share/locale/paa/LC_MESSAGES /usr/share/locale/pag /usr/share/locale/pag/LC_MESSAGES /usr/share/locale/pal /usr/share/locale/pa/LC_MESSAGES /usr/share/locale/pal/LC_MESSAGES /usr/share/locale/pam /usr/share/locale/pam/LC_MESSAGES /usr/share/locale/pap /usr/share/locale/pap/LC_MESSAGES /usr/share/locale/pau /usr/share/locale/pau/LC_MESSAGES /usr/share/locale/peo /usr/share/locale/peo/LC_MESSAGES /usr/share/locale/phi /usr/share/locale/phi/LC_MESSAGES /usr/share/locale/phn /usr/share/locale/phn/LC_MESSAGES /usr/share/locale/pi /usr/share/locale/pi/LC_MESSAGES /usr/share/locale/pl /usr/share/locale/pl/LC_MESSAGES /usr/share/locale/pl_PL /usr/share/locale/pl_PL/LC_MESSAGES /usr/share/locale/pon /usr/share/locale/pon/LC_MESSAGES /usr/share/locale/pra /usr/share/locale/pra/LC_MESSAGES /usr/share/locale/pro /usr/share/locale/pro/LC_MESSAGES /usr/share/locale/ps /usr/share/locale/ps/LC_MESSAGES /usr/share/locale/pt /usr/share/locale/pt_BR /usr/share/locale/pt_BR/LC_MESSAGES /usr/share/locale/pt/LC_MESSAGES /usr/share/locale/pt_PT /usr/share/locale/pt_PT/LC_MESSAGES /usr/share/locale/qaa-qtz /usr/share/locale/qaa-qtz/LC_MESSAGES /usr/share/locale/qu /usr/share/locale/qu/LC_MESSAGES /usr/share/locale/raj /usr/share/locale/raj/LC_MESSAGES /usr/share/locale/rap /usr/share/locale/rap/LC_MESSAGES /usr/share/locale/rar /usr/share/locale/rar/LC_MESSAGES /usr/share/locale/rm /usr/share/locale/rm/LC_MESSAGES /usr/share/locale/rn /usr/share/locale/rn/LC_MESSAGES /usr/share/locale/ro /usr/share/locale/roa /usr/share/locale/roa/LC_MESSAGES /usr/share/locale/ro/LC_MESSAGES /usr/share/locale/rom /usr/share/locale/rom/LC_MESSAGES /usr/share/locale/ru /usr/share/locale/ru/LC_MESSAGES /usr/share/locale/rup /usr/share/locale/rup/LC_MESSAGES /usr/share/locale/ru_RU /usr/share/locale/ru_RU/LC_MESSAGES /usr/share/locale/rw /usr/share/locale/rw/LC_MESSAGES /usr/share/locale/sa /usr/share/locale/sad /usr/share/locale/sad/LC_MESSAGES /usr/share/locale/sah /usr/share/locale/sah/LC_MESSAGES /usr/share/locale/sai /usr/share/locale/sai/LC_MESSAGES /usr/share/locale/sal /usr/share/locale/sa/LC_MESSAGES /usr/share/locale/sal/LC_MESSAGES /usr/share/locale/sam /usr/share/locale/sam/LC_MESSAGES /usr/share/locale/sas /usr/share/locale/sas/LC_MESSAGES /usr/share/locale/sat /usr/share/locale/sat/LC_MESSAGES /usr/share/locale/sc /usr/share/locale/sc/LC_MESSAGES /usr/share/locale/scn /usr/share/locale/scn/LC_MESSAGES /usr/share/locale/sco /usr/share/locale/sco/LC_MESSAGES /usr/share/locale/sd /usr/share/locale/sd/LC_MESSAGES /usr/share/locale/se /usr/share/locale/sel /usr/share/locale/se/LC_MESSAGES /usr/share/locale/sel/LC_MESSAGES /usr/share/locale/sem /usr/share/locale/sem/LC_MESSAGES /usr/share/locale/sg /usr/share/locale/sga /usr/share/locale/sga/LC_MESSAGES /usr/share/locale/sg/LC_MESSAGES /usr/share/locale/sgn /usr/share/locale/sgn/LC_MESSAGES /usr/share/locale/shn /usr/share/locale/shn/LC_MESSAGES /usr/share/locale/si /usr/share/locale/sid /usr/share/locale/sid/LC_MESSAGES /usr/share/locale/si/LC_MESSAGES /usr/share/locale/sio /usr/share/locale/sio/LC_MESSAGES /usr/share/locale/sit /usr/share/locale/sit/LC_MESSAGES /usr/share/locale/sk /usr/share/locale/sk/LC_MESSAGES /usr/share/locale/sl /usr/share/locale/sla /usr/share/locale/sla/LC_MESSAGES /usr/share/locale/sl/LC_MESSAGES /usr/share/locale/sl_SI /usr/share/locale/sl_SI/LC_MESSAGES /usr/share/locale/sm /usr/share/locale/sma /usr/share/locale/sma/LC_MESSAGES /usr/share/locale/smi /usr/share/locale/smi/LC_MESSAGES /usr/share/locale/smj /usr/share/locale/smj/LC_MESSAGES /usr/share/locale/sm/LC_MESSAGES /usr/share/locale/smn /usr/share/locale/smn/LC_MESSAGES /usr/share/locale/sms /usr/share/locale/sms/LC_MESSAGES /usr/share/locale/sn /usr/share/locale/snk /usr/share/locale/snk/LC_MESSAGES /usr/share/locale/sn/LC_MESSAGES /usr/share/locale/so /usr/share/locale/sog /usr/share/locale/sog/LC_MESSAGES /usr/share/locale/so/LC_MESSAGES /usr/share/locale/son /usr/share/locale/son/LC_MESSAGES /usr/share/locale/sq /usr/share/locale/sq_AL /usr/share/locale/sq_AL/LC_MESSAGES /usr/share/locale/sq/LC_MESSAGES /usr/share/locale/sr /usr/share/locale/sr@ije /usr/share/locale/sr@ijekavian /usr/share/locale/sr@ijekavianlatin /usr/share/locale/sr@ijekavianlatin/LC_MESSAGES /usr/share/locale/sr@ijekavian/LC_MESSAGES /usr/share/locale/sr@ije/LC_MESSAGES /usr/share/locale/sr@latin /usr/share/locale/sr@latin/LC_MESSAGES /usr/share/locale/sr@Latn /usr/share/locale/sr@Latn/LC_MESSAGES /usr/share/locale/sr/LC_MESSAGES /usr/share/locale/srn /usr/share/locale/srn/LC_MESSAGES /usr/share/locale/srr /usr/share/locale/srr/LC_MESSAGES /usr/share/locale/sr_RS /usr/share/locale/sr_RS/LC_MESSAGES /usr/share/locale/ss /usr/share/locale/ssa /usr/share/locale/ssa/LC_MESSAGES /usr/share/locale/ss/LC_MESSAGES /usr/share/locale/st /usr/share/locale/st/LC_MESSAGES /usr/share/locale/su /usr/share/locale/suk /usr/share/locale/suk/LC_MESSAGES /usr/share/locale/su/LC_MESSAGES /usr/share/locale/sus /usr/share/locale/sus/LC_MESSAGES /usr/share/locale/sux /usr/share/locale/sux/LC_MESSAGES /usr/share/locale/sv /usr/share/locale/sv/LC_MESSAGES /usr/share/locale/sv_SE /usr/share/locale/sv_SE/LC_MESSAGES /usr/share/locale/sw /usr/share/locale/sw/LC_MESSAGES /usr/share/locale/syc /usr/share/locale/syc/LC_MESSAGES /usr/share/locale/syr /usr/share/locale/syr/LC_MESSAGES /usr/share/locale/ta /usr/share/locale/tai /usr/share/locale/tai/LC_MESSAGES /usr/share/locale/ta/LC_MESSAGES /usr/share/locale/te /usr/share/locale/te/LC_MESSAGES /usr/share/locale/tem /usr/share/locale/tem/LC_MESSAGES /usr/share/locale/ter /usr/share/locale/ter/LC_MESSAGES /usr/share/locale/tet /usr/share/locale/tet/LC_MESSAGES /usr/share/locale/tg /usr/share/locale/tg/LC_MESSAGES /usr/share/locale/th /usr/share/locale/th/LC_MESSAGES /usr/share/locale/ti /usr/share/locale/tig /usr/share/locale/tig/LC_MESSAGES /usr/share/locale/ti/LC_MESSAGES /usr/share/locale/tiv /usr/share/locale/tiv/LC_MESSAGES /usr/share/locale/tk /usr/share/locale/tkl /usr/share/locale/tk/LC_MESSAGES /usr/share/locale/tkl/LC_MESSAGES /usr/share/locale/tl /usr/share/locale/tlh /usr/share/locale/tlh/LC_MESSAGES /usr/share/locale/tli /usr/share/locale/tli/LC_MESSAGES /usr/share/locale/tl/LC_MESSAGES /usr/share/locale/tmh /usr/share/locale/tmh/LC_MESSAGES /usr/share/locale/tn /usr/share/locale/tn/LC_MESSAGES /usr/share/locale/to /usr/share/locale/tog /usr/share/locale/tog/LC_MESSAGES /usr/share/locale/to/LC_MESSAGES /usr/share/locale/tpi /usr/share/locale/tpi/LC_MESSAGES /usr/share/locale/tr /usr/share/locale/tr/LC_MESSAGES /usr/share/locale/ts /usr/share/locale/tsi /usr/share/locale/tsi/LC_MESSAGES /usr/share/locale/ts/LC_MESSAGES /usr/share/locale/tt /usr/share/locale/tt/LC_MESSAGES /usr/share/locale/tum /usr/share/locale/tum/LC_MESSAGES /usr/share/locale/tup /usr/share/locale/tup/LC_MESSAGES /usr/share/locale/tut /usr/share/locale/tut/LC_MESSAGES /usr/share/locale/tvl /usr/share/locale/tvl/LC_MESSAGES /usr/share/locale/tw /usr/share/locale/tw/LC_MESSAGES /usr/share/locale/ty /usr/share/locale/ty/LC_MESSAGES /usr/share/locale/tyv /usr/share/locale/tyv/LC_MESSAGES /usr/share/locale/udm /usr/share/locale/udm/LC_MESSAGES /usr/share/locale/ug /usr/share/locale/uga /usr/share/locale/uga/LC_MESSAGES /usr/share/locale/ug/LC_MESSAGES /usr/share/locale/uk /usr/share/locale/uk/LC_MESSAGES /usr/share/locale/uk_UA /usr/share/locale/uk_UA/LC_MESSAGES /usr/share/locale/umb /usr/share/locale/umb/LC_MESSAGES /usr/share/locale/und /usr/share/locale/und/LC_MESSAGES /usr/share/locale/ur /usr/share/locale/ur/LC_MESSAGES /usr/share/locale/ur_PK /usr/share/locale/ur_PK/LC_MESSAGES /usr/share/locale/uz /usr/share/locale/uz@cyrillic /usr/share/locale/uz@cyrillic/LC_MESSAGES /usr/share/locale/uz@Latn /usr/share/locale/uz@Latn/LC_MESSAGES /usr/share/locale/uz/LC_MESSAGES /usr/share/locale/vai /usr/share/locale/vai/LC_MESSAGES /usr/share/locale/ve /usr/share/locale/ve/LC_MESSAGES /usr/share/locale/vi /usr/share/locale/vi/LC_MESSAGES /usr/share/locale/vo /usr/share/locale/vo/LC_MESSAGES /usr/share/locale/vot /usr/share/locale/vot/LC_MESSAGES /usr/share/locale/wa /usr/share/locale/wak /usr/share/locale/wak/LC_MESSAGES /usr/share/locale/wal /usr/share/locale/wa/LC_MESSAGES /usr/share/locale/wal/LC_MESSAGES /usr/share/locale/war /usr/share/locale/war/LC_MESSAGES /usr/share/locale/was /usr/share/locale/was/LC_MESSAGES /usr/share/locale/wen /usr/share/locale/wen/LC_MESSAGES /usr/share/locale/wo /usr/share/locale/wo/LC_MESSAGES /usr/share/locale/xal /usr/share/locale/xal/LC_MESSAGES /usr/share/locale/xh /usr/share/locale/xh/LC_MESSAGES /usr/share/locale/yao /usr/share/locale/yao/LC_MESSAGES /usr/share/locale/yap /usr/share/locale/yap/LC_MESSAGES /usr/share/locale/yi /usr/share/locale/yi/LC_MESSAGES /usr/share/locale/yo /usr/share/locale/yo/LC_MESSAGES /usr/share/locale/ypk /usr/share/locale/ypk/LC_MESSAGES /usr/share/locale/za /usr/share/locale/za/LC_MESSAGES /usr/share/locale/zap /usr/share/locale/zap/LC_MESSAGES /usr/share/locale/zbl /usr/share/locale/zbl/LC_MESSAGES /usr/share/locale/zen /usr/share/locale/zen/LC_MESSAGES /usr/share/locale/zh /usr/share/locale/zh_CN /usr/share/locale/zh_CN.GB2312 /usr/share/locale/zh_CN.GB2312/LC_MESSAGES /usr/share/locale/zh_CN/LC_MESSAGES /usr/share/locale/zh_HK /usr/share/locale/zh_HK/LC_MESSAGES /usr/share/locale/zh/LC_MESSAGES /usr/share/locale/zh_TW /usr/share/locale/zh_TW.Big5 /usr/share/locale/zh_TW.Big5/LC_MESSAGES /usr/share/locale/zh_TW/LC_MESSAGES /usr/share/locale/znd /usr/share/locale/znd/LC_MESSAGES /usr/share/locale/zu /usr/share/locale/zu/LC_MESSAGES /usr/share/locale/zun /usr/share/locale/zun/LC_MESSAGES /usr/share/locale/zxx /usr/share/locale/zxx/LC_MESSAGES /usr/share/locale/zza /usr/share/locale/zza/LC_MESSAGES /usr/share/man /usr/share/man/aa /usr/share/man/aa/man0p /usr/share/man/aa/man1 /usr/share/man/aa/man1p /usr/share/man/aa/man1x /usr/share/man/aa/man2 /usr/share/man/aa/man2x /usr/share/man/aa/man3 /usr/share/man/aa/man3p /usr/share/man/aa/man3x /usr/share/man/aa/man4 /usr/share/man/aa/man4x /usr/share/man/aa/man5 /usr/share/man/aa/man5x /usr/share/man/aa/man6 /usr/share/man/aa/man6x /usr/share/man/aa/man7 /usr/share/man/aa/man7x /usr/share/man/aa/man8 /usr/share/man/aa/man8x /usr/share/man/aa/man9 /usr/share/man/aa/man9x /usr/share/man/aa/mann /usr/share/man/ab /usr/share/man/ab/man0p /usr/share/man/ab/man1 /usr/share/man/ab/man1p /usr/share/man/ab/man1x /usr/share/man/ab/man2 /usr/share/man/ab/man2x /usr/share/man/ab/man3 /usr/share/man/ab/man3p /usr/share/man/ab/man3x /usr/share/man/ab/man4 /usr/share/man/ab/man4x /usr/share/man/ab/man5 /usr/share/man/ab/man5x /usr/share/man/ab/man6 /usr/share/man/ab/man6x /usr/share/man/ab/man7 /usr/share/man/ab/man7x /usr/share/man/ab/man8 /usr/share/man/ab/man8x /usr/share/man/ab/man9 /usr/share/man/ab/man9x /usr/share/man/ab/mann /usr/share/man/ace /usr/share/man/ace/man0p /usr/share/man/ace/man1 /usr/share/man/ace/man1p /usr/share/man/ace/man1x /usr/share/man/ace/man2 /usr/share/man/ace/man2x /usr/share/man/ace/man3 /usr/share/man/ace/man3p /usr/share/man/ace/man3x /usr/share/man/ace/man4 /usr/share/man/ace/man4x /usr/share/man/ace/man5 /usr/share/man/ace/man5x /usr/share/man/ace/man6 /usr/share/man/ace/man6x /usr/share/man/ace/man7 /usr/share/man/ace/man7x /usr/share/man/ace/man8 /usr/share/man/ace/man8x /usr/share/man/ace/man9 /usr/share/man/ace/man9x /usr/share/man/ace/mann /usr/share/man/ach /usr/share/man/ach/man0p /usr/share/man/ach/man1 /usr/share/man/ach/man1p /usr/share/man/ach/man1x /usr/share/man/ach/man2 /usr/share/man/ach/man2x /usr/share/man/ach/man3 /usr/share/man/ach/man3p /usr/share/man/ach/man3x /usr/share/man/ach/man4 /usr/share/man/ach/man4x /usr/share/man/ach/man5 /usr/share/man/ach/man5x /usr/share/man/ach/man6 /usr/share/man/ach/man6x /usr/share/man/ach/man7 /usr/share/man/ach/man7x /usr/share/man/ach/man8 /usr/share/man/ach/man8x /usr/share/man/ach/man9 /usr/share/man/ach/man9x /usr/share/man/ach/mann /usr/share/man/ada /usr/share/man/ada/man0p /usr/share/man/ada/man1 /usr/share/man/ada/man1p /usr/share/man/ada/man1x /usr/share/man/ada/man2 /usr/share/man/ada/man2x /usr/share/man/ada/man3 /usr/share/man/ada/man3p /usr/share/man/ada/man3x /usr/share/man/ada/man4 /usr/share/man/ada/man4x /usr/share/man/ada/man5 /usr/share/man/ada/man5x /usr/share/man/ada/man6 /usr/share/man/ada/man6x /usr/share/man/ada/man7 /usr/share/man/ada/man7x /usr/share/man/ada/man8 /usr/share/man/ada/man8x /usr/share/man/ada/man9 /usr/share/man/ada/man9x /usr/share/man/ada/mann /usr/share/man/ady /usr/share/man/ady/man0p /usr/share/man/ady/man1 /usr/share/man/ady/man1p /usr/share/man/ady/man1x /usr/share/man/ady/man2 /usr/share/man/ady/man2x /usr/share/man/ady/man3 /usr/share/man/ady/man3p /usr/share/man/ady/man3x /usr/share/man/ady/man4 /usr/share/man/ady/man4x /usr/share/man/ady/man5 /usr/share/man/ady/man5x /usr/share/man/ady/man6 /usr/share/man/ady/man6x /usr/share/man/ady/man7 /usr/share/man/ady/man7x /usr/share/man/ady/man8 /usr/share/man/ady/man8x /usr/share/man/ady/man9 /usr/share/man/ady/man9x /usr/share/man/ady/mann /usr/share/man/ae /usr/share/man/ae/man0p /usr/share/man/ae/man1 /usr/share/man/ae/man1p /usr/share/man/ae/man1x /usr/share/man/ae/man2 /usr/share/man/ae/man2x /usr/share/man/ae/man3 /usr/share/man/ae/man3p /usr/share/man/ae/man3x /usr/share/man/ae/man4 /usr/share/man/ae/man4x /usr/share/man/ae/man5 /usr/share/man/ae/man5x /usr/share/man/ae/man6 /usr/share/man/ae/man6x /usr/share/man/ae/man7 /usr/share/man/ae/man7x /usr/share/man/ae/man8 /usr/share/man/ae/man8x /usr/share/man/ae/man9 /usr/share/man/ae/man9x /usr/share/man/ae/mann /usr/share/man/af /usr/share/man/afa /usr/share/man/afa/man0p /usr/share/man/afa/man1 /usr/share/man/afa/man1p /usr/share/man/afa/man1x /usr/share/man/afa/man2 /usr/share/man/afa/man2x /usr/share/man/afa/man3 /usr/share/man/afa/man3p /usr/share/man/afa/man3x /usr/share/man/afa/man4 /usr/share/man/afa/man4x /usr/share/man/afa/man5 /usr/share/man/afa/man5x /usr/share/man/afa/man6 /usr/share/man/afa/man6x /usr/share/man/afa/man7 /usr/share/man/afa/man7x /usr/share/man/afa/man8 /usr/share/man/afa/man8x /usr/share/man/afa/man9 /usr/share/man/afa/man9x /usr/share/man/afa/mann /usr/share/man/afh /usr/share/man/afh/man0p /usr/share/man/afh/man1 /usr/share/man/afh/man1p /usr/share/man/afh/man1x /usr/share/man/afh/man2 /usr/share/man/afh/man2x /usr/share/man/afh/man3 /usr/share/man/afh/man3p /usr/share/man/afh/man3x /usr/share/man/afh/man4 /usr/share/man/afh/man4x /usr/share/man/afh/man5 /usr/share/man/afh/man5x /usr/share/man/afh/man6 /usr/share/man/afh/man6x /usr/share/man/afh/man7 /usr/share/man/afh/man7x /usr/share/man/afh/man8 /usr/share/man/afh/man8x /usr/share/man/afh/man9 /usr/share/man/afh/man9x /usr/share/man/afh/mann /usr/share/man/af/man0p /usr/share/man/af/man1 /usr/share/man/af/man1p /usr/share/man/af/man1x /usr/share/man/af/man2 /usr/share/man/af/man2x /usr/share/man/af/man3 /usr/share/man/af/man3p /usr/share/man/af/man3x /usr/share/man/af/man4 /usr/share/man/af/man4x /usr/share/man/af/man5 /usr/share/man/af/man5x /usr/share/man/af/man6 /usr/share/man/af/man6x /usr/share/man/af/man7 /usr/share/man/af/man7x /usr/share/man/af/man8 /usr/share/man/af/man8x /usr/share/man/af/man9 /usr/share/man/af/man9x /usr/share/man/af/mann /usr/share/man/af_ZA /usr/share/man/af_ZA/man0p /usr/share/man/af_ZA/man1 /usr/share/man/af_ZA/man1p /usr/share/man/af_ZA/man1x /usr/share/man/af_ZA/man2 /usr/share/man/af_ZA/man2x /usr/share/man/af_ZA/man3 /usr/share/man/af_ZA/man3p /usr/share/man/af_ZA/man3x /usr/share/man/af_ZA/man4 /usr/share/man/af_ZA/man4x /usr/share/man/af_ZA/man5 /usr/share/man/af_ZA/man5x /usr/share/man/af_ZA/man6 /usr/share/man/af_ZA/man6x /usr/share/man/af_ZA/man7 /usr/share/man/af_ZA/man7x /usr/share/man/af_ZA/man8 /usr/share/man/af_ZA/man8x /usr/share/man/af_ZA/man9 /usr/share/man/af_ZA/man9x /usr/share/man/af_ZA/mann /usr/share/man/ain /usr/share/man/ain/man0p /usr/share/man/ain/man1 /usr/share/man/ain/man1p /usr/share/man/ain/man1x /usr/share/man/ain/man2 /usr/share/man/ain/man2x /usr/share/man/ain/man3 /usr/share/man/ain/man3p /usr/share/man/ain/man3x /usr/share/man/ain/man4 /usr/share/man/ain/man4x /usr/share/man/ain/man5 /usr/share/man/ain/man5x /usr/share/man/ain/man6 /usr/share/man/ain/man6x /usr/share/man/ain/man7 /usr/share/man/ain/man7x /usr/share/man/ain/man8 /usr/share/man/ain/man8x /usr/share/man/ain/man9 /usr/share/man/ain/man9x /usr/share/man/ain/mann /usr/share/man/ak /usr/share/man/akk /usr/share/man/akk/man0p /usr/share/man/akk/man1 /usr/share/man/akk/man1p /usr/share/man/akk/man1x /usr/share/man/akk/man2 /usr/share/man/akk/man2x /usr/share/man/akk/man3 /usr/share/man/akk/man3p /usr/share/man/akk/man3x /usr/share/man/akk/man4 /usr/share/man/akk/man4x /usr/share/man/akk/man5 /usr/share/man/akk/man5x /usr/share/man/akk/man6 /usr/share/man/akk/man6x /usr/share/man/akk/man7 /usr/share/man/akk/man7x /usr/share/man/akk/man8 /usr/share/man/akk/man8x /usr/share/man/akk/man9 /usr/share/man/akk/man9x /usr/share/man/akk/mann /usr/share/man/ak/man0p /usr/share/man/ak/man1 /usr/share/man/ak/man1p /usr/share/man/ak/man1x /usr/share/man/ak/man2 /usr/share/man/ak/man2x /usr/share/man/ak/man3 /usr/share/man/ak/man3p /usr/share/man/ak/man3x /usr/share/man/ak/man4 /usr/share/man/ak/man4x /usr/share/man/ak/man5 /usr/share/man/ak/man5x /usr/share/man/ak/man6 /usr/share/man/ak/man6x /usr/share/man/ak/man7 /usr/share/man/ak/man7x /usr/share/man/ak/man8 /usr/share/man/ak/man8x /usr/share/man/ak/man9 /usr/share/man/ak/man9x /usr/share/man/ak/mann /usr/share/man/ale /usr/share/man/ale/man0p /usr/share/man/ale/man1 /usr/share/man/ale/man1p /usr/share/man/ale/man1x /usr/share/man/ale/man2 /usr/share/man/ale/man2x /usr/share/man/ale/man3 /usr/share/man/ale/man3p /usr/share/man/ale/man3x /usr/share/man/ale/man4 /usr/share/man/ale/man4x /usr/share/man/ale/man5 /usr/share/man/ale/man5x /usr/share/man/ale/man6 /usr/share/man/ale/man6x /usr/share/man/ale/man7 /usr/share/man/ale/man7x /usr/share/man/ale/man8 /usr/share/man/ale/man8x /usr/share/man/ale/man9 /usr/share/man/ale/man9x /usr/share/man/ale/mann /usr/share/man/alg /usr/share/man/alg/man0p /usr/share/man/alg/man1 /usr/share/man/alg/man1p /usr/share/man/alg/man1x /usr/share/man/alg/man2 /usr/share/man/alg/man2x /usr/share/man/alg/man3 /usr/share/man/alg/man3p /usr/share/man/alg/man3x /usr/share/man/alg/man4 /usr/share/man/alg/man4x /usr/share/man/alg/man5 /usr/share/man/alg/man5x /usr/share/man/alg/man6 /usr/share/man/alg/man6x /usr/share/man/alg/man7 /usr/share/man/alg/man7x /usr/share/man/alg/man8 /usr/share/man/alg/man8x /usr/share/man/alg/man9 /usr/share/man/alg/man9x /usr/share/man/alg/mann /usr/share/man/alt /usr/share/man/alt/man0p /usr/share/man/alt/man1 /usr/share/man/alt/man1p /usr/share/man/alt/man1x /usr/share/man/alt/man2 /usr/share/man/alt/man2x /usr/share/man/alt/man3 /usr/share/man/alt/man3p /usr/share/man/alt/man3x /usr/share/man/alt/man4 /usr/share/man/alt/man4x /usr/share/man/alt/man5 /usr/share/man/alt/man5x /usr/share/man/alt/man6 /usr/share/man/alt/man6x /usr/share/man/alt/man7 /usr/share/man/alt/man7x /usr/share/man/alt/man8 /usr/share/man/alt/man8x /usr/share/man/alt/man9 /usr/share/man/alt/man9x /usr/share/man/alt/mann /usr/share/man/am /usr/share/man/am_ET /usr/share/man/am_ET/man0p /usr/share/man/am_ET/man1 /usr/share/man/am_ET/man1p /usr/share/man/am_ET/man1x /usr/share/man/am_ET/man2 /usr/share/man/am_ET/man2x /usr/share/man/am_ET/man3 /usr/share/man/am_ET/man3p /usr/share/man/am_ET/man3x /usr/share/man/am_ET/man4 /usr/share/man/am_ET/man4x /usr/share/man/am_ET/man5 /usr/share/man/am_ET/man5x /usr/share/man/am_ET/man6 /usr/share/man/am_ET/man6x /usr/share/man/am_ET/man7 /usr/share/man/am_ET/man7x /usr/share/man/am_ET/man8 /usr/share/man/am_ET/man8x /usr/share/man/am_ET/man9 /usr/share/man/am_ET/man9x /usr/share/man/am_ET/mann /usr/share/man/am/man0p /usr/share/man/am/man1 /usr/share/man/am/man1p /usr/share/man/am/man1x /usr/share/man/am/man2 /usr/share/man/am/man2x /usr/share/man/am/man3 /usr/share/man/am/man3p /usr/share/man/am/man3x /usr/share/man/am/man4 /usr/share/man/am/man4x /usr/share/man/am/man5 /usr/share/man/am/man5x /usr/share/man/am/man6 /usr/share/man/am/man6x /usr/share/man/am/man7 /usr/share/man/am/man7x /usr/share/man/am/man8 /usr/share/man/am/man8x /usr/share/man/am/man9 /usr/share/man/am/man9x /usr/share/man/am/mann /usr/share/man/an /usr/share/man/ang /usr/share/man/ang/man0p /usr/share/man/ang/man1 /usr/share/man/ang/man1p /usr/share/man/ang/man1x /usr/share/man/ang/man2 /usr/share/man/ang/man2x /usr/share/man/ang/man3 /usr/share/man/ang/man3p /usr/share/man/ang/man3x /usr/share/man/ang/man4 /usr/share/man/ang/man4x /usr/share/man/ang/man5 /usr/share/man/ang/man5x /usr/share/man/ang/man6 /usr/share/man/ang/man6x /usr/share/man/ang/man7 /usr/share/man/ang/man7x /usr/share/man/ang/man8 /usr/share/man/ang/man8x /usr/share/man/ang/man9 /usr/share/man/ang/man9x /usr/share/man/ang/mann /usr/share/man/an/man0p /usr/share/man/an/man1 /usr/share/man/an/man1p /usr/share/man/an/man1x /usr/share/man/an/man2 /usr/share/man/an/man2x /usr/share/man/an/man3 /usr/share/man/an/man3p /usr/share/man/an/man3x /usr/share/man/an/man4 /usr/share/man/an/man4x /usr/share/man/an/man5 /usr/share/man/an/man5x /usr/share/man/an/man6 /usr/share/man/an/man6x /usr/share/man/an/man7 /usr/share/man/an/man7x /usr/share/man/an/man8 /usr/share/man/an/man8x /usr/share/man/an/man9 /usr/share/man/an/man9x /usr/share/man/an/mann /usr/share/man/anp /usr/share/man/anp/man0p /usr/share/man/anp/man1 /usr/share/man/anp/man1p /usr/share/man/anp/man1x /usr/share/man/anp/man2 /usr/share/man/anp/man2x /usr/share/man/anp/man3 /usr/share/man/anp/man3p /usr/share/man/anp/man3x /usr/share/man/anp/man4 /usr/share/man/anp/man4x /usr/share/man/anp/man5 /usr/share/man/anp/man5x /usr/share/man/anp/man6 /usr/share/man/anp/man6x /usr/share/man/anp/man7 /usr/share/man/anp/man7x /usr/share/man/anp/man8 /usr/share/man/anp/man8x /usr/share/man/anp/man9 /usr/share/man/anp/man9x /usr/share/man/anp/mann /usr/share/man/apa /usr/share/man/apa/man0p /usr/share/man/apa/man1 /usr/share/man/apa/man1p /usr/share/man/apa/man1x /usr/share/man/apa/man2 /usr/share/man/apa/man2x /usr/share/man/apa/man3 /usr/share/man/apa/man3p /usr/share/man/apa/man3x /usr/share/man/apa/man4 /usr/share/man/apa/man4x /usr/share/man/apa/man5 /usr/share/man/apa/man5x /usr/share/man/apa/man6 /usr/share/man/apa/man6x /usr/share/man/apa/man7 /usr/share/man/apa/man7x /usr/share/man/apa/man8 /usr/share/man/apa/man8x /usr/share/man/apa/man9 /usr/share/man/apa/man9x /usr/share/man/apa/mann /usr/share/man/ar /usr/share/man/arc /usr/share/man/arc/man0p /usr/share/man/arc/man1 /usr/share/man/arc/man1p /usr/share/man/arc/man1x /usr/share/man/arc/man2 /usr/share/man/arc/man2x /usr/share/man/arc/man3 /usr/share/man/arc/man3p /usr/share/man/arc/man3x /usr/share/man/arc/man4 /usr/share/man/arc/man4x /usr/share/man/arc/man5 /usr/share/man/arc/man5x /usr/share/man/arc/man6 /usr/share/man/arc/man6x /usr/share/man/arc/man7 /usr/share/man/arc/man7x /usr/share/man/arc/man8 /usr/share/man/arc/man8x /usr/share/man/arc/man9 /usr/share/man/arc/man9x /usr/share/man/arc/mann /usr/share/man/ar/man0p /usr/share/man/ar/man1 /usr/share/man/ar/man1p /usr/share/man/ar/man1x /usr/share/man/ar/man2 /usr/share/man/ar/man2x /usr/share/man/ar/man3 /usr/share/man/ar/man3p /usr/share/man/ar/man3x /usr/share/man/ar/man4 /usr/share/man/ar/man4x /usr/share/man/ar/man5 /usr/share/man/ar/man5x /usr/share/man/ar/man6 /usr/share/man/ar/man6x /usr/share/man/ar/man7 /usr/share/man/ar/man7x /usr/share/man/ar/man8 /usr/share/man/ar/man8x /usr/share/man/ar/man9 /usr/share/man/ar/man9x /usr/share/man/ar/mann /usr/share/man/arn /usr/share/man/arn/man0p /usr/share/man/arn/man1 /usr/share/man/arn/man1p /usr/share/man/arn/man1x /usr/share/man/arn/man2 /usr/share/man/arn/man2x /usr/share/man/arn/man3 /usr/share/man/arn/man3p /usr/share/man/arn/man3x /usr/share/man/arn/man4 /usr/share/man/arn/man4x /usr/share/man/arn/man5 /usr/share/man/arn/man5x /usr/share/man/arn/man6 /usr/share/man/arn/man6x /usr/share/man/arn/man7 /usr/share/man/arn/man7x /usr/share/man/arn/man8 /usr/share/man/arn/man8x /usr/share/man/arn/man9 /usr/share/man/arn/man9x /usr/share/man/arn/mann /usr/share/man/arp /usr/share/man/arp/man0p /usr/share/man/arp/man1 /usr/share/man/arp/man1p /usr/share/man/arp/man1x /usr/share/man/arp/man2 /usr/share/man/arp/man2x /usr/share/man/arp/man3 /usr/share/man/arp/man3p /usr/share/man/arp/man3x /usr/share/man/arp/man4 /usr/share/man/arp/man4x /usr/share/man/arp/man5 /usr/share/man/arp/man5x /usr/share/man/arp/man6 /usr/share/man/arp/man6x /usr/share/man/arp/man7 /usr/share/man/arp/man7x /usr/share/man/arp/man8 /usr/share/man/arp/man8x /usr/share/man/arp/man9 /usr/share/man/arp/man9x /usr/share/man/arp/mann /usr/share/man/art /usr/share/man/art/man0p /usr/share/man/art/man1 /usr/share/man/art/man1p /usr/share/man/art/man1x /usr/share/man/art/man2 /usr/share/man/art/man2x /usr/share/man/art/man3 /usr/share/man/art/man3p /usr/share/man/art/man3x /usr/share/man/art/man4 /usr/share/man/art/man4x /usr/share/man/art/man5 /usr/share/man/art/man5x /usr/share/man/art/man6 /usr/share/man/art/man6x /usr/share/man/art/man7 /usr/share/man/art/man7x /usr/share/man/art/man8 /usr/share/man/art/man8x /usr/share/man/art/man9 /usr/share/man/art/man9x /usr/share/man/art/mann /usr/share/man/arw /usr/share/man/arw/man0p /usr/share/man/arw/man1 /usr/share/man/arw/man1p /usr/share/man/arw/man1x /usr/share/man/arw/man2 /usr/share/man/arw/man2x /usr/share/man/arw/man3 /usr/share/man/arw/man3p /usr/share/man/arw/man3x /usr/share/man/arw/man4 /usr/share/man/arw/man4x /usr/share/man/arw/man5 /usr/share/man/arw/man5x /usr/share/man/arw/man6 /usr/share/man/arw/man6x /usr/share/man/arw/man7 /usr/share/man/arw/man7x /usr/share/man/arw/man8 /usr/share/man/arw/man8x /usr/share/man/arw/man9 /usr/share/man/arw/man9x /usr/share/man/arw/mann /usr/share/man/as /usr/share/man/as/man0p /usr/share/man/as/man1 /usr/share/man/as/man1p /usr/share/man/as/man1x /usr/share/man/as/man2 /usr/share/man/as/man2x /usr/share/man/as/man3 /usr/share/man/as/man3p /usr/share/man/as/man3x /usr/share/man/as/man4 /usr/share/man/as/man4x /usr/share/man/as/man5 /usr/share/man/as/man5x /usr/share/man/as/man6 /usr/share/man/as/man6x /usr/share/man/as/man7 /usr/share/man/as/man7x /usr/share/man/as/man8 /usr/share/man/as/man8x /usr/share/man/as/man9 /usr/share/man/as/man9x /usr/share/man/as/mann /usr/share/man/ast /usr/share/man/ast_ES /usr/share/man/ast_ES/man0p /usr/share/man/ast_ES/man1 /usr/share/man/ast_ES/man1p /usr/share/man/ast_ES/man1x /usr/share/man/ast_ES/man2 /usr/share/man/ast_ES/man2x /usr/share/man/ast_ES/man3 /usr/share/man/ast_ES/man3p /usr/share/man/ast_ES/man3x /usr/share/man/ast_ES/man4 /usr/share/man/ast_ES/man4x /usr/share/man/ast_ES/man5 /usr/share/man/ast_ES/man5x /usr/share/man/ast_ES/man6 /usr/share/man/ast_ES/man6x /usr/share/man/ast_ES/man7 /usr/share/man/ast_ES/man7x /usr/share/man/ast_ES/man8 /usr/share/man/ast_ES/man8x /usr/share/man/ast_ES/man9 /usr/share/man/ast_ES/man9x /usr/share/man/ast_ES/mann /usr/share/man/ast/man0p /usr/share/man/ast/man1 /usr/share/man/ast/man1p /usr/share/man/ast/man1x /usr/share/man/ast/man2 /usr/share/man/ast/man2x /usr/share/man/ast/man3 /usr/share/man/ast/man3p /usr/share/man/ast/man3x /usr/share/man/ast/man4 /usr/share/man/ast/man4x /usr/share/man/ast/man5 /usr/share/man/ast/man5x /usr/share/man/ast/man6 /usr/share/man/ast/man6x /usr/share/man/ast/man7 /usr/share/man/ast/man7x /usr/share/man/ast/man8 /usr/share/man/ast/man8x /usr/share/man/ast/man9 /usr/share/man/ast/man9x /usr/share/man/ast/mann /usr/share/man/ath /usr/share/man/ath/man0p /usr/share/man/ath/man1 /usr/share/man/ath/man1p /usr/share/man/ath/man1x /usr/share/man/ath/man2 /usr/share/man/ath/man2x /usr/share/man/ath/man3 /usr/share/man/ath/man3p /usr/share/man/ath/man3x /usr/share/man/ath/man4 /usr/share/man/ath/man4x /usr/share/man/ath/man5 /usr/share/man/ath/man5x /usr/share/man/ath/man6 /usr/share/man/ath/man6x /usr/share/man/ath/man7 /usr/share/man/ath/man7x /usr/share/man/ath/man8 /usr/share/man/ath/man8x /usr/share/man/ath/man9 /usr/share/man/ath/man9x /usr/share/man/ath/mann /usr/share/man/aus /usr/share/man/aus/man0p /usr/share/man/aus/man1 /usr/share/man/aus/man1p /usr/share/man/aus/man1x /usr/share/man/aus/man2 /usr/share/man/aus/man2x /usr/share/man/aus/man3 /usr/share/man/aus/man3p /usr/share/man/aus/man3x /usr/share/man/aus/man4 /usr/share/man/aus/man4x /usr/share/man/aus/man5 /usr/share/man/aus/man5x /usr/share/man/aus/man6 /usr/share/man/aus/man6x /usr/share/man/aus/man7 /usr/share/man/aus/man7x /usr/share/man/aus/man8 /usr/share/man/aus/man8x /usr/share/man/aus/man9 /usr/share/man/aus/man9x /usr/share/man/aus/mann /usr/share/man/av /usr/share/man/av/man0p /usr/share/man/av/man1 /usr/share/man/av/man1p /usr/share/man/av/man1x /usr/share/man/av/man2 /usr/share/man/av/man2x /usr/share/man/av/man3 /usr/share/man/av/man3p /usr/share/man/av/man3x /usr/share/man/av/man4 /usr/share/man/av/man4x /usr/share/man/av/man5 /usr/share/man/av/man5x /usr/share/man/av/man6 /usr/share/man/av/man6x /usr/share/man/av/man7 /usr/share/man/av/man7x /usr/share/man/av/man8 /usr/share/man/av/man8x /usr/share/man/av/man9 /usr/share/man/av/man9x /usr/share/man/av/mann /usr/share/man/awa /usr/share/man/awa/man0p /usr/share/man/awa/man1 /usr/share/man/awa/man1p /usr/share/man/awa/man1x /usr/share/man/awa/man2 /usr/share/man/awa/man2x /usr/share/man/awa/man3 /usr/share/man/awa/man3p /usr/share/man/awa/man3x /usr/share/man/awa/man4 /usr/share/man/awa/man4x /usr/share/man/awa/man5 /usr/share/man/awa/man5x /usr/share/man/awa/man6 /usr/share/man/awa/man6x /usr/share/man/awa/man7 /usr/share/man/awa/man7x /usr/share/man/awa/man8 /usr/share/man/awa/man8x /usr/share/man/awa/man9 /usr/share/man/awa/man9x /usr/share/man/awa/mann /usr/share/man/ay /usr/share/man/ay/man0p /usr/share/man/ay/man1 /usr/share/man/ay/man1p /usr/share/man/ay/man1x /usr/share/man/ay/man2 /usr/share/man/ay/man2x /usr/share/man/ay/man3 /usr/share/man/ay/man3p /usr/share/man/ay/man3x /usr/share/man/ay/man4 /usr/share/man/ay/man4x /usr/share/man/ay/man5 /usr/share/man/ay/man5x /usr/share/man/ay/man6 /usr/share/man/ay/man6x /usr/share/man/ay/man7 /usr/share/man/ay/man7x /usr/share/man/ay/man8 /usr/share/man/ay/man8x /usr/share/man/ay/man9 /usr/share/man/ay/man9x /usr/share/man/ay/mann /usr/share/man/az /usr/share/man/az_IR /usr/share/man/az_IR/man0p /usr/share/man/az_IR/man1 /usr/share/man/az_IR/man1p /usr/share/man/az_IR/man1x /usr/share/man/az_IR/man2 /usr/share/man/az_IR/man2x /usr/share/man/az_IR/man3 /usr/share/man/az_IR/man3p /usr/share/man/az_IR/man3x /usr/share/man/az_IR/man4 /usr/share/man/az_IR/man4x /usr/share/man/az_IR/man5 /usr/share/man/az_IR/man5x /usr/share/man/az_IR/man6 /usr/share/man/az_IR/man6x /usr/share/man/az_IR/man7 /usr/share/man/az_IR/man7x /usr/share/man/az_IR/man8 /usr/share/man/az_IR/man8x /usr/share/man/az_IR/man9 /usr/share/man/az_IR/man9x /usr/share/man/az_IR/mann /usr/share/man/az/man0p /usr/share/man/az/man1 /usr/share/man/az/man1p /usr/share/man/az/man1x /usr/share/man/az/man2 /usr/share/man/az/man2x /usr/share/man/az/man3 /usr/share/man/az/man3p /usr/share/man/az/man3x /usr/share/man/az/man4 /usr/share/man/az/man4x /usr/share/man/az/man5 /usr/share/man/az/man5x /usr/share/man/az/man6 /usr/share/man/az/man6x /usr/share/man/az/man7 /usr/share/man/az/man7x /usr/share/man/az/man8 /usr/share/man/az/man8x /usr/share/man/az/man9 /usr/share/man/az/man9x /usr/share/man/az/mann /usr/share/man/ba /usr/share/man/bad /usr/share/man/bad/man0p /usr/share/man/bad/man1 /usr/share/man/bad/man1p /usr/share/man/bad/man1x /usr/share/man/bad/man2 /usr/share/man/bad/man2x /usr/share/man/bad/man3 /usr/share/man/bad/man3p /usr/share/man/bad/man3x /usr/share/man/bad/man4 /usr/share/man/bad/man4x /usr/share/man/bad/man5 /usr/share/man/bad/man5x /usr/share/man/bad/man6 /usr/share/man/bad/man6x /usr/share/man/bad/man7 /usr/share/man/bad/man7x /usr/share/man/bad/man8 /usr/share/man/bad/man8x /usr/share/man/bad/man9 /usr/share/man/bad/man9x /usr/share/man/bad/mann /usr/share/man/bai /usr/share/man/bai/man0p /usr/share/man/bai/man1 /usr/share/man/bai/man1p /usr/share/man/bai/man1x /usr/share/man/bai/man2 /usr/share/man/bai/man2x /usr/share/man/bai/man3 /usr/share/man/bai/man3p /usr/share/man/bai/man3x /usr/share/man/bai/man4 /usr/share/man/bai/man4x /usr/share/man/bai/man5 /usr/share/man/bai/man5x /usr/share/man/bai/man6 /usr/share/man/bai/man6x /usr/share/man/bai/man7 /usr/share/man/bai/man7x /usr/share/man/bai/man8 /usr/share/man/bai/man8x /usr/share/man/bai/man9 /usr/share/man/bai/man9x /usr/share/man/bai/mann /usr/share/man/bal /usr/share/man/bal/man0p /usr/share/man/bal/man1 /usr/share/man/bal/man1p /usr/share/man/bal/man1x /usr/share/man/bal/man2 /usr/share/man/bal/man2x /usr/share/man/bal/man3 /usr/share/man/bal/man3p /usr/share/man/bal/man3x /usr/share/man/bal/man4 /usr/share/man/bal/man4x /usr/share/man/bal/man5 /usr/share/man/bal/man5x /usr/share/man/bal/man6 /usr/share/man/bal/man6x /usr/share/man/bal/man7 /usr/share/man/bal/man7x /usr/share/man/bal/man8 /usr/share/man/bal/man8x /usr/share/man/bal/man9 /usr/share/man/bal/man9x /usr/share/man/bal/mann /usr/share/man/ba/man0p /usr/share/man/ba/man1 /usr/share/man/ba/man1p /usr/share/man/ba/man1x /usr/share/man/ba/man2 /usr/share/man/ba/man2x /usr/share/man/ba/man3 /usr/share/man/ba/man3p /usr/share/man/ba/man3x /usr/share/man/ba/man4 /usr/share/man/ba/man4x /usr/share/man/ba/man5 /usr/share/man/ba/man5x /usr/share/man/ba/man6 /usr/share/man/ba/man6x /usr/share/man/ba/man7 /usr/share/man/ba/man7x /usr/share/man/ba/man8 /usr/share/man/ba/man8x /usr/share/man/ba/man9 /usr/share/man/ba/man9x /usr/share/man/ba/mann /usr/share/man/ban /usr/share/man/ban/man0p /usr/share/man/ban/man1 /usr/share/man/ban/man1p /usr/share/man/ban/man1x /usr/share/man/ban/man2 /usr/share/man/ban/man2x /usr/share/man/ban/man3 /usr/share/man/ban/man3p /usr/share/man/ban/man3x /usr/share/man/ban/man4 /usr/share/man/ban/man4x /usr/share/man/ban/man5 /usr/share/man/ban/man5x /usr/share/man/ban/man6 /usr/share/man/ban/man6x /usr/share/man/ban/man7 /usr/share/man/ban/man7x /usr/share/man/ban/man8 /usr/share/man/ban/man8x /usr/share/man/ban/man9 /usr/share/man/ban/man9x /usr/share/man/ban/mann /usr/share/man/bas /usr/share/man/bas/man0p /usr/share/man/bas/man1 /usr/share/man/bas/man1p /usr/share/man/bas/man1x /usr/share/man/bas/man2 /usr/share/man/bas/man2x /usr/share/man/bas/man3 /usr/share/man/bas/man3p /usr/share/man/bas/man3x /usr/share/man/bas/man4 /usr/share/man/bas/man4x /usr/share/man/bas/man5 /usr/share/man/bas/man5x /usr/share/man/bas/man6 /usr/share/man/bas/man6x /usr/share/man/bas/man7 /usr/share/man/bas/man7x /usr/share/man/bas/man8 /usr/share/man/bas/man8x /usr/share/man/bas/man9 /usr/share/man/bas/man9x /usr/share/man/bas/mann /usr/share/man/bat /usr/share/man/bat/man0p /usr/share/man/bat/man1 /usr/share/man/bat/man1p /usr/share/man/bat/man1x /usr/share/man/bat/man2 /usr/share/man/bat/man2x /usr/share/man/bat/man3 /usr/share/man/bat/man3p /usr/share/man/bat/man3x /usr/share/man/bat/man4 /usr/share/man/bat/man4x /usr/share/man/bat/man5 /usr/share/man/bat/man5x /usr/share/man/bat/man6 /usr/share/man/bat/man6x /usr/share/man/bat/man7 /usr/share/man/bat/man7x /usr/share/man/bat/man8 /usr/share/man/bat/man8x /usr/share/man/bat/man9 /usr/share/man/bat/man9x /usr/share/man/bat/mann /usr/share/man/be /usr/share/man/bej /usr/share/man/bej/man0p /usr/share/man/bej/man1 /usr/share/man/bej/man1p /usr/share/man/bej/man1x /usr/share/man/bej/man2 /usr/share/man/bej/man2x /usr/share/man/bej/man3 /usr/share/man/bej/man3p /usr/share/man/bej/man3x /usr/share/man/bej/man4 /usr/share/man/bej/man4x /usr/share/man/bej/man5 /usr/share/man/bej/man5x /usr/share/man/bej/man6 /usr/share/man/bej/man6x /usr/share/man/bej/man7 /usr/share/man/bej/man7x /usr/share/man/bej/man8 /usr/share/man/bej/man8x /usr/share/man/bej/man9 /usr/share/man/bej/man9x /usr/share/man/bej/mann /usr/share/man/be@latin /usr/share/man/be@latin/man0p /usr/share/man/be@latin/man1 /usr/share/man/be@latin/man1p /usr/share/man/be@latin/man1x /usr/share/man/be@latin/man2 /usr/share/man/be@latin/man2x /usr/share/man/be@latin/man3 /usr/share/man/be@latin/man3p /usr/share/man/be@latin/man3x /usr/share/man/be@latin/man4 /usr/share/man/be@latin/man4x /usr/share/man/be@latin/man5 /usr/share/man/be@latin/man5x /usr/share/man/be@latin/man6 /usr/share/man/be@latin/man6x /usr/share/man/be@latin/man7 /usr/share/man/be@latin/man7x /usr/share/man/be@latin/man8 /usr/share/man/be@latin/man8x /usr/share/man/be@latin/man9 /usr/share/man/be@latin/man9x /usr/share/man/be@latin/mann /usr/share/man/bem /usr/share/man/be/man0p /usr/share/man/be/man1 /usr/share/man/be/man1p /usr/share/man/be/man1x /usr/share/man/be/man2 /usr/share/man/be/man2x /usr/share/man/be/man3 /usr/share/man/be/man3p /usr/share/man/be/man3x /usr/share/man/be/man4 /usr/share/man/be/man4x /usr/share/man/be/man5 /usr/share/man/be/man5x /usr/share/man/be/man6 /usr/share/man/be/man6x /usr/share/man/be/man7 /usr/share/man/be/man7x /usr/share/man/be/man8 /usr/share/man/be/man8x /usr/share/man/be/man9 /usr/share/man/be/man9x /usr/share/man/be/mann /usr/share/man/bem/man0p /usr/share/man/bem/man1 /usr/share/man/bem/man1p /usr/share/man/bem/man1x /usr/share/man/bem/man2 /usr/share/man/bem/man2x /usr/share/man/bem/man3 /usr/share/man/bem/man3p /usr/share/man/bem/man3x /usr/share/man/bem/man4 /usr/share/man/bem/man4x /usr/share/man/bem/man5 /usr/share/man/bem/man5x /usr/share/man/bem/man6 /usr/share/man/bem/man6x /usr/share/man/bem/man7 /usr/share/man/bem/man7x /usr/share/man/bem/man8 /usr/share/man/bem/man8x /usr/share/man/bem/man9 /usr/share/man/bem/man9x /usr/share/man/bem/mann /usr/share/man/ber /usr/share/man/ber/man0p /usr/share/man/ber/man1 /usr/share/man/ber/man1p /usr/share/man/ber/man1x /usr/share/man/ber/man2 /usr/share/man/ber/man2x /usr/share/man/ber/man3 /usr/share/man/ber/man3p /usr/share/man/ber/man3x /usr/share/man/ber/man4 /usr/share/man/ber/man4x /usr/share/man/ber/man5 /usr/share/man/ber/man5x /usr/share/man/ber/man6 /usr/share/man/ber/man6x /usr/share/man/ber/man7 /usr/share/man/ber/man7x /usr/share/man/ber/man8 /usr/share/man/ber/man8x /usr/share/man/ber/man9 /usr/share/man/ber/man9x /usr/share/man/ber/mann /usr/share/man/bg /usr/share/man/bg_BG /usr/share/man/bg_BG/man0p /usr/share/man/bg_BG/man1 /usr/share/man/bg_BG/man1p /usr/share/man/bg_BG/man1x /usr/share/man/bg_BG/man2 /usr/share/man/bg_BG/man2x /usr/share/man/bg_BG/man3 /usr/share/man/bg_BG/man3p /usr/share/man/bg_BG/man3x /usr/share/man/bg_BG/man4 /usr/share/man/bg_BG/man4x /usr/share/man/bg_BG/man5 /usr/share/man/bg_BG/man5x /usr/share/man/bg_BG/man6 /usr/share/man/bg_BG/man6x /usr/share/man/bg_BG/man7 /usr/share/man/bg_BG/man7x /usr/share/man/bg_BG/man8 /usr/share/man/bg_BG/man8x /usr/share/man/bg_BG/man9 /usr/share/man/bg_BG/man9x /usr/share/man/bg_BG/mann /usr/share/man/bg/man0p /usr/share/man/bg/man1 /usr/share/man/bg/man1p /usr/share/man/bg/man1x /usr/share/man/bg/man2 /usr/share/man/bg/man2x /usr/share/man/bg/man3 /usr/share/man/bg/man3p /usr/share/man/bg/man3x /usr/share/man/bg/man4 /usr/share/man/bg/man4x /usr/share/man/bg/man5 /usr/share/man/bg/man5x /usr/share/man/bg/man6 /usr/share/man/bg/man6x /usr/share/man/bg/man7 /usr/share/man/bg/man7x /usr/share/man/bg/man8 /usr/share/man/bg/man8x /usr/share/man/bg/man9 /usr/share/man/bg/man9x /usr/share/man/bg/mann /usr/share/man/bh /usr/share/man/bh/man0p /usr/share/man/bh/man1 /usr/share/man/bh/man1p /usr/share/man/bh/man1x /usr/share/man/bh/man2 /usr/share/man/bh/man2x /usr/share/man/bh/man3 /usr/share/man/bh/man3p /usr/share/man/bh/man3x /usr/share/man/bh/man4 /usr/share/man/bh/man4x /usr/share/man/bh/man5 /usr/share/man/bh/man5x /usr/share/man/bh/man6 /usr/share/man/bh/man6x /usr/share/man/bh/man7 /usr/share/man/bh/man7x /usr/share/man/bh/man8 /usr/share/man/bh/man8x /usr/share/man/bh/man9 /usr/share/man/bh/man9x /usr/share/man/bh/mann /usr/share/man/bho /usr/share/man/bho/man0p /usr/share/man/bho/man1 /usr/share/man/bho/man1p /usr/share/man/bho/man1x /usr/share/man/bho/man2 /usr/share/man/bho/man2x /usr/share/man/bho/man3 /usr/share/man/bho/man3p /usr/share/man/bho/man3x /usr/share/man/bho/man4 /usr/share/man/bho/man4x /usr/share/man/bho/man5 /usr/share/man/bho/man5x /usr/share/man/bho/man6 /usr/share/man/bho/man6x /usr/share/man/bho/man7 /usr/share/man/bho/man7x /usr/share/man/bho/man8 /usr/share/man/bho/man8x /usr/share/man/bho/man9 /usr/share/man/bho/man9x /usr/share/man/bho/mann /usr/share/man/bi /usr/share/man/bik /usr/share/man/bik/man0p /usr/share/man/bik/man1 /usr/share/man/bik/man1p /usr/share/man/bik/man1x /usr/share/man/bik/man2 /usr/share/man/bik/man2x /usr/share/man/bik/man3 /usr/share/man/bik/man3p /usr/share/man/bik/man3x /usr/share/man/bik/man4 /usr/share/man/bik/man4x /usr/share/man/bik/man5 /usr/share/man/bik/man5x /usr/share/man/bik/man6 /usr/share/man/bik/man6x /usr/share/man/bik/man7 /usr/share/man/bik/man7x /usr/share/man/bik/man8 /usr/share/man/bik/man8x /usr/share/man/bik/man9 /usr/share/man/bik/man9x /usr/share/man/bik/mann /usr/share/man/bi/man0p /usr/share/man/bi/man1 /usr/share/man/bi/man1p /usr/share/man/bi/man1x /usr/share/man/bi/man2 /usr/share/man/bi/man2x /usr/share/man/bi/man3 /usr/share/man/bi/man3p /usr/share/man/bi/man3x /usr/share/man/bi/man4 /usr/share/man/bi/man4x /usr/share/man/bi/man5 /usr/share/man/bi/man5x /usr/share/man/bi/man6 /usr/share/man/bi/man6x /usr/share/man/bi/man7 /usr/share/man/bi/man7x /usr/share/man/bi/man8 /usr/share/man/bi/man8x /usr/share/man/bi/man9 /usr/share/man/bi/man9x /usr/share/man/bi/mann /usr/share/man/bin /usr/share/man/bin/man0p /usr/share/man/bin/man1 /usr/share/man/bin/man1p /usr/share/man/bin/man1x /usr/share/man/bin/man2 /usr/share/man/bin/man2x /usr/share/man/bin/man3 /usr/share/man/bin/man3p /usr/share/man/bin/man3x /usr/share/man/bin/man4 /usr/share/man/bin/man4x /usr/share/man/bin/man5 /usr/share/man/bin/man5x /usr/share/man/bin/man6 /usr/share/man/bin/man6x /usr/share/man/bin/man7 /usr/share/man/bin/man7x /usr/share/man/bin/man8 /usr/share/man/bin/man8x /usr/share/man/bin/man9 /usr/share/man/bin/man9x /usr/share/man/bin/mann /usr/share/man/bla /usr/share/man/bla/man0p /usr/share/man/bla/man1 /usr/share/man/bla/man1p /usr/share/man/bla/man1x /usr/share/man/bla/man2 /usr/share/man/bla/man2x /usr/share/man/bla/man3 /usr/share/man/bla/man3p /usr/share/man/bla/man3x /usr/share/man/bla/man4 /usr/share/man/bla/man4x /usr/share/man/bla/man5 /usr/share/man/bla/man5x /usr/share/man/bla/man6 /usr/share/man/bla/man6x /usr/share/man/bla/man7 /usr/share/man/bla/man7x /usr/share/man/bla/man8 /usr/share/man/bla/man8x /usr/share/man/bla/man9 /usr/share/man/bla/man9x /usr/share/man/bla/mann /usr/share/man/bm /usr/share/man/bm/man0p /usr/share/man/bm/man1 /usr/share/man/bm/man1p /usr/share/man/bm/man1x /usr/share/man/bm/man2 /usr/share/man/bm/man2x /usr/share/man/bm/man3 /usr/share/man/bm/man3p /usr/share/man/bm/man3x /usr/share/man/bm/man4 /usr/share/man/bm/man4x /usr/share/man/bm/man5 /usr/share/man/bm/man5x /usr/share/man/bm/man6 /usr/share/man/bm/man6x /usr/share/man/bm/man7 /usr/share/man/bm/man7x /usr/share/man/bm/man8 /usr/share/man/bm/man8x /usr/share/man/bm/man9 /usr/share/man/bm/man9x /usr/share/man/bm/mann /usr/share/man/bn /usr/share/man/bn_IN /usr/share/man/bn_IN/man0p /usr/share/man/bn_IN/man1 /usr/share/man/bn_IN/man1p /usr/share/man/bn_IN/man1x /usr/share/man/bn_IN/man2 /usr/share/man/bn_IN/man2x /usr/share/man/bn_IN/man3 /usr/share/man/bn_IN/man3p /usr/share/man/bn_IN/man3x /usr/share/man/bn_IN/man4 /usr/share/man/bn_IN/man4x /usr/share/man/bn_IN/man5 /usr/share/man/bn_IN/man5x /usr/share/man/bn_IN/man6 /usr/share/man/bn_IN/man6x /usr/share/man/bn_IN/man7 /usr/share/man/bn_IN/man7x /usr/share/man/bn_IN/man8 /usr/share/man/bn_IN/man8x /usr/share/man/bn_IN/man9 /usr/share/man/bn_IN/man9x /usr/share/man/bn_IN/mann /usr/share/man/bn/man0p /usr/share/man/bn/man1 /usr/share/man/bn/man1p /usr/share/man/bn/man1x /usr/share/man/bn/man2 /usr/share/man/bn/man2x /usr/share/man/bn/man3 /usr/share/man/bn/man3p /usr/share/man/bn/man3x /usr/share/man/bn/man4 /usr/share/man/bn/man4x /usr/share/man/bn/man5 /usr/share/man/bn/man5x /usr/share/man/bn/man6 /usr/share/man/bn/man6x /usr/share/man/bn/man7 /usr/share/man/bn/man7x /usr/share/man/bn/man8 /usr/share/man/bn/man8x /usr/share/man/bn/man9 /usr/share/man/bn/man9x /usr/share/man/bn/mann /usr/share/man/bnt /usr/share/man/bnt/man0p /usr/share/man/bnt/man1 /usr/share/man/bnt/man1p /usr/share/man/bnt/man1x /usr/share/man/bnt/man2 /usr/share/man/bnt/man2x /usr/share/man/bnt/man3 /usr/share/man/bnt/man3p /usr/share/man/bnt/man3x /usr/share/man/bnt/man4 /usr/share/man/bnt/man4x /usr/share/man/bnt/man5 /usr/share/man/bnt/man5x /usr/share/man/bnt/man6 /usr/share/man/bnt/man6x /usr/share/man/bnt/man7 /usr/share/man/bnt/man7x /usr/share/man/bnt/man8 /usr/share/man/bnt/man8x /usr/share/man/bnt/man9 /usr/share/man/bnt/man9x /usr/share/man/bnt/mann /usr/share/man/bo /usr/share/man/bo/man0p /usr/share/man/bo/man1 /usr/share/man/bo/man1p /usr/share/man/bo/man1x /usr/share/man/bo/man2 /usr/share/man/bo/man2x /usr/share/man/bo/man3 /usr/share/man/bo/man3p /usr/share/man/bo/man3x /usr/share/man/bo/man4 /usr/share/man/bo/man4x /usr/share/man/bo/man5 /usr/share/man/bo/man5x /usr/share/man/bo/man6 /usr/share/man/bo/man6x /usr/share/man/bo/man7 /usr/share/man/bo/man7x /usr/share/man/bo/man8 /usr/share/man/bo/man8x /usr/share/man/bo/man9 /usr/share/man/bo/man9x /usr/share/man/bo/mann /usr/share/man/br /usr/share/man/bra /usr/share/man/bra/man0p /usr/share/man/bra/man1 /usr/share/man/bra/man1p /usr/share/man/bra/man1x /usr/share/man/bra/man2 /usr/share/man/bra/man2x /usr/share/man/bra/man3 /usr/share/man/bra/man3p /usr/share/man/bra/man3x /usr/share/man/bra/man4 /usr/share/man/bra/man4x /usr/share/man/bra/man5 /usr/share/man/bra/man5x /usr/share/man/bra/man6 /usr/share/man/bra/man6x /usr/share/man/bra/man7 /usr/share/man/bra/man7x /usr/share/man/bra/man8 /usr/share/man/bra/man8x /usr/share/man/bra/man9 /usr/share/man/bra/man9x /usr/share/man/bra/mann /usr/share/man/br/man0p /usr/share/man/br/man1 /usr/share/man/br/man1p /usr/share/man/br/man1x /usr/share/man/br/man2 /usr/share/man/br/man2x /usr/share/man/br/man3 /usr/share/man/br/man3p /usr/share/man/br/man3x /usr/share/man/br/man4 /usr/share/man/br/man4x /usr/share/man/br/man5 /usr/share/man/br/man5x /usr/share/man/br/man6 /usr/share/man/br/man6x /usr/share/man/br/man7 /usr/share/man/br/man7x /usr/share/man/br/man8 /usr/share/man/br/man8x /usr/share/man/br/man9 /usr/share/man/br/man9x /usr/share/man/br/mann /usr/share/man/bs /usr/share/man/bs/man0p /usr/share/man/bs/man1 /usr/share/man/bs/man1p /usr/share/man/bs/man1x /usr/share/man/bs/man2 /usr/share/man/bs/man2x /usr/share/man/bs/man3 /usr/share/man/bs/man3p /usr/share/man/bs/man3x /usr/share/man/bs/man4 /usr/share/man/bs/man4x /usr/share/man/bs/man5 /usr/share/man/bs/man5x /usr/share/man/bs/man6 /usr/share/man/bs/man6x /usr/share/man/bs/man7 /usr/share/man/bs/man7x /usr/share/man/bs/man8 /usr/share/man/bs/man8x /usr/share/man/bs/man9 /usr/share/man/bs/man9x /usr/share/man/bs/mann /usr/share/man/btk /usr/share/man/btk/man0p /usr/share/man/btk/man1 /usr/share/man/btk/man1p /usr/share/man/btk/man1x /usr/share/man/btk/man2 /usr/share/man/btk/man2x /usr/share/man/btk/man3 /usr/share/man/btk/man3p /usr/share/man/btk/man3x /usr/share/man/btk/man4 /usr/share/man/btk/man4x /usr/share/man/btk/man5 /usr/share/man/btk/man5x /usr/share/man/btk/man6 /usr/share/man/btk/man6x /usr/share/man/btk/man7 /usr/share/man/btk/man7x /usr/share/man/btk/man8 /usr/share/man/btk/man8x /usr/share/man/btk/man9 /usr/share/man/btk/man9x /usr/share/man/btk/mann /usr/share/man/bua /usr/share/man/bua/man0p /usr/share/man/bua/man1 /usr/share/man/bua/man1p /usr/share/man/bua/man1x /usr/share/man/bua/man2 /usr/share/man/bua/man2x /usr/share/man/bua/man3 /usr/share/man/bua/man3p /usr/share/man/bua/man3x /usr/share/man/bua/man4 /usr/share/man/bua/man4x /usr/share/man/bua/man5 /usr/share/man/bua/man5x /usr/share/man/bua/man6 /usr/share/man/bua/man6x /usr/share/man/bua/man7 /usr/share/man/bua/man7x /usr/share/man/bua/man8 /usr/share/man/bua/man8x /usr/share/man/bua/man9 /usr/share/man/bua/man9x /usr/share/man/bua/mann /usr/share/man/bug /usr/share/man/bug/man0p /usr/share/man/bug/man1 /usr/share/man/bug/man1p /usr/share/man/bug/man1x /usr/share/man/bug/man2 /usr/share/man/bug/man2x /usr/share/man/bug/man3 /usr/share/man/bug/man3p /usr/share/man/bug/man3x /usr/share/man/bug/man4 /usr/share/man/bug/man4x /usr/share/man/bug/man5 /usr/share/man/bug/man5x /usr/share/man/bug/man6 /usr/share/man/bug/man6x /usr/share/man/bug/man7 /usr/share/man/bug/man7x /usr/share/man/bug/man8 /usr/share/man/bug/man8x /usr/share/man/bug/man9 /usr/share/man/bug/man9x /usr/share/man/bug/mann /usr/share/man/byn /usr/share/man/byn/man0p /usr/share/man/byn/man1 /usr/share/man/byn/man1p /usr/share/man/byn/man1x /usr/share/man/byn/man2 /usr/share/man/byn/man2x /usr/share/man/byn/man3 /usr/share/man/byn/man3p /usr/share/man/byn/man3x /usr/share/man/byn/man4 /usr/share/man/byn/man4x /usr/share/man/byn/man5 /usr/share/man/byn/man5x /usr/share/man/byn/man6 /usr/share/man/byn/man6x /usr/share/man/byn/man7 /usr/share/man/byn/man7x /usr/share/man/byn/man8 /usr/share/man/byn/man8x /usr/share/man/byn/man9 /usr/share/man/byn/man9x /usr/share/man/byn/mann /usr/share/man/ca /usr/share/man/cad /usr/share/man/cad/man0p /usr/share/man/cad/man1 /usr/share/man/cad/man1p /usr/share/man/cad/man1x /usr/share/man/cad/man2 /usr/share/man/cad/man2x /usr/share/man/cad/man3 /usr/share/man/cad/man3p /usr/share/man/cad/man3x /usr/share/man/cad/man4 /usr/share/man/cad/man4x /usr/share/man/cad/man5 /usr/share/man/cad/man5x /usr/share/man/cad/man6 /usr/share/man/cad/man6x /usr/share/man/cad/man7 /usr/share/man/cad/man7x /usr/share/man/cad/man8 /usr/share/man/cad/man8x /usr/share/man/cad/man9 /usr/share/man/cad/man9x /usr/share/man/cad/mann /usr/share/man/ca_ES /usr/share/man/ca_ES/man0p /usr/share/man/ca_ES/man1 /usr/share/man/ca_ES/man1p /usr/share/man/ca_ES/man1x /usr/share/man/ca_ES/man2 /usr/share/man/ca_ES/man2x /usr/share/man/ca_ES/man3 /usr/share/man/ca_ES/man3p /usr/share/man/ca_ES/man3x /usr/share/man/ca_ES/man4 /usr/share/man/ca_ES/man4x /usr/share/man/ca_ES/man5 /usr/share/man/ca_ES/man5x /usr/share/man/ca_ES/man6 /usr/share/man/ca_ES/man6x /usr/share/man/ca_ES/man7 /usr/share/man/ca_ES/man7x /usr/share/man/ca_ES/man8 /usr/share/man/ca_ES/man8x /usr/share/man/ca_ES/man9 /usr/share/man/ca_ES/man9x /usr/share/man/ca_ES/mann /usr/share/man/ca_ES@valencian /usr/share/man/ca_ES@valencian/man0p /usr/share/man/ca_ES@valencian/man1 /usr/share/man/ca_ES@valencian/man1p /usr/share/man/ca_ES@valencian/man1x /usr/share/man/ca_ES@valencian/man2 /usr/share/man/ca_ES@valencian/man2x /usr/share/man/ca_ES@valencian/man3 /usr/share/man/ca_ES@valencian/man3p /usr/share/man/ca_ES@valencian/man3x /usr/share/man/ca_ES@valencian/man4 /usr/share/man/ca_ES@valencian/man4x /usr/share/man/ca_ES@valencian/man5 /usr/share/man/ca_ES@valencian/man5x /usr/share/man/ca_ES@valencian/man6 /usr/share/man/ca_ES@valencian/man6x /usr/share/man/ca_ES@valencian/man7 /usr/share/man/ca_ES@valencian/man7x /usr/share/man/ca_ES@valencian/man8 /usr/share/man/ca_ES@valencian/man8x /usr/share/man/ca_ES@valencian/man9 /usr/share/man/ca_ES@valencian/man9x /usr/share/man/ca_ES@valencian/mann /usr/share/man/cai /usr/share/man/cai/man0p /usr/share/man/cai/man1 /usr/share/man/cai/man1p /usr/share/man/cai/man1x /usr/share/man/cai/man2 /usr/share/man/cai/man2x /usr/share/man/cai/man3 /usr/share/man/cai/man3p /usr/share/man/cai/man3x /usr/share/man/cai/man4 /usr/share/man/cai/man4x /usr/share/man/cai/man5 /usr/share/man/cai/man5x /usr/share/man/cai/man6 /usr/share/man/cai/man6x /usr/share/man/cai/man7 /usr/share/man/cai/man7x /usr/share/man/cai/man8 /usr/share/man/cai/man8x /usr/share/man/cai/man9 /usr/share/man/cai/man9x /usr/share/man/cai/mann /usr/share/man/ca/man0p /usr/share/man/ca/man1 /usr/share/man/ca/man1p /usr/share/man/ca/man1x /usr/share/man/ca/man2 /usr/share/man/ca/man2x /usr/share/man/ca/man3 /usr/share/man/ca/man3p /usr/share/man/ca/man3x /usr/share/man/ca/man4 /usr/share/man/ca/man4x /usr/share/man/ca/man5 /usr/share/man/ca/man5x /usr/share/man/ca/man6 /usr/share/man/ca/man6x /usr/share/man/ca/man7 /usr/share/man/ca/man7x /usr/share/man/ca/man8 /usr/share/man/ca/man8x /usr/share/man/ca/man9 /usr/share/man/ca/man9x /usr/share/man/ca/mann /usr/share/man/car /usr/share/man/car/man0p /usr/share/man/car/man1 /usr/share/man/car/man1p /usr/share/man/car/man1x /usr/share/man/car/man2 /usr/share/man/car/man2x /usr/share/man/car/man3 /usr/share/man/car/man3p /usr/share/man/car/man3x /usr/share/man/car/man4 /usr/share/man/car/man4x /usr/share/man/car/man5 /usr/share/man/car/man5x /usr/share/man/car/man6 /usr/share/man/car/man6x /usr/share/man/car/man7 /usr/share/man/car/man7x /usr/share/man/car/man8 /usr/share/man/car/man8x /usr/share/man/car/man9 /usr/share/man/car/man9x /usr/share/man/car/mann /usr/share/man/cau /usr/share/man/cau/man0p /usr/share/man/cau/man1 /usr/share/man/cau/man1p /usr/share/man/cau/man1x /usr/share/man/cau/man2 /usr/share/man/cau/man2x /usr/share/man/cau/man3 /usr/share/man/cau/man3p /usr/share/man/cau/man3x /usr/share/man/cau/man4 /usr/share/man/cau/man4x /usr/share/man/cau/man5 /usr/share/man/cau/man5x /usr/share/man/cau/man6 /usr/share/man/cau/man6x /usr/share/man/cau/man7 /usr/share/man/cau/man7x /usr/share/man/cau/man8 /usr/share/man/cau/man8x /usr/share/man/cau/man9 /usr/share/man/cau/man9x /usr/share/man/cau/mann /usr/share/man/ca@valencia /usr/share/man/ca@valencia/man0p /usr/share/man/ca@valencia/man1 /usr/share/man/ca@valencia/man1p /usr/share/man/ca@valencia/man1x /usr/share/man/ca@valencia/man2 /usr/share/man/ca@valencia/man2x /usr/share/man/ca@valencia/man3 /usr/share/man/ca@valencia/man3p /usr/share/man/ca@valencia/man3x /usr/share/man/ca@valencia/man4 /usr/share/man/ca@valencia/man4x /usr/share/man/ca@valencia/man5 /usr/share/man/ca@valencia/man5x /usr/share/man/ca@valencia/man6 /usr/share/man/ca@valencia/man6x /usr/share/man/ca@valencia/man7 /usr/share/man/ca@valencia/man7x /usr/share/man/ca@valencia/man8 /usr/share/man/ca@valencia/man8x /usr/share/man/ca@valencia/man9 /usr/share/man/ca@valencia/man9x /usr/share/man/ca@valencia/mann /usr/share/man/ce /usr/share/man/ceb /usr/share/man/ceb/man0p /usr/share/man/ceb/man1 /usr/share/man/ceb/man1p /usr/share/man/ceb/man1x /usr/share/man/ceb/man2 /usr/share/man/ceb/man2x /usr/share/man/ceb/man3 /usr/share/man/ceb/man3p /usr/share/man/ceb/man3x /usr/share/man/ceb/man4 /usr/share/man/ceb/man4x /usr/share/man/ceb/man5 /usr/share/man/ceb/man5x /usr/share/man/ceb/man6 /usr/share/man/ceb/man6x /usr/share/man/ceb/man7 /usr/share/man/ceb/man7x /usr/share/man/ceb/man8 /usr/share/man/ceb/man8x /usr/share/man/ceb/man9 /usr/share/man/ceb/man9x /usr/share/man/ceb/mann /usr/share/man/cel /usr/share/man/cel/man0p /usr/share/man/cel/man1 /usr/share/man/cel/man1p /usr/share/man/cel/man1x /usr/share/man/cel/man2 /usr/share/man/cel/man2x /usr/share/man/cel/man3 /usr/share/man/cel/man3p /usr/share/man/cel/man3x /usr/share/man/cel/man4 /usr/share/man/cel/man4x /usr/share/man/cel/man5 /usr/share/man/cel/man5x /usr/share/man/cel/man6 /usr/share/man/cel/man6x /usr/share/man/cel/man7 /usr/share/man/cel/man7x /usr/share/man/cel/man8 /usr/share/man/cel/man8x /usr/share/man/cel/man9 /usr/share/man/cel/man9x /usr/share/man/cel/mann /usr/share/man/ce/man0p /usr/share/man/ce/man1 /usr/share/man/ce/man1p /usr/share/man/ce/man1x /usr/share/man/ce/man2 /usr/share/man/ce/man2x /usr/share/man/ce/man3 /usr/share/man/ce/man3p /usr/share/man/ce/man3x /usr/share/man/ce/man4 /usr/share/man/ce/man4x /usr/share/man/ce/man5 /usr/share/man/ce/man5x /usr/share/man/ce/man6 /usr/share/man/ce/man6x /usr/share/man/ce/man7 /usr/share/man/ce/man7x /usr/share/man/ce/man8 /usr/share/man/ce/man8x /usr/share/man/ce/man9 /usr/share/man/ce/man9x /usr/share/man/ce/mann /usr/share/man/ch /usr/share/man/chb /usr/share/man/chb/man0p /usr/share/man/chb/man1 /usr/share/man/chb/man1p /usr/share/man/chb/man1x /usr/share/man/chb/man2 /usr/share/man/chb/man2x /usr/share/man/chb/man3 /usr/share/man/chb/man3p /usr/share/man/chb/man3x /usr/share/man/chb/man4 /usr/share/man/chb/man4x /usr/share/man/chb/man5 /usr/share/man/chb/man5x /usr/share/man/chb/man6 /usr/share/man/chb/man6x /usr/share/man/chb/man7 /usr/share/man/chb/man7x /usr/share/man/chb/man8 /usr/share/man/chb/man8x /usr/share/man/chb/man9 /usr/share/man/chb/man9x /usr/share/man/chb/mann /usr/share/man/chg /usr/share/man/chg/man0p /usr/share/man/chg/man1 /usr/share/man/chg/man1p /usr/share/man/chg/man1x /usr/share/man/chg/man2 /usr/share/man/chg/man2x /usr/share/man/chg/man3 /usr/share/man/chg/man3p /usr/share/man/chg/man3x /usr/share/man/chg/man4 /usr/share/man/chg/man4x /usr/share/man/chg/man5 /usr/share/man/chg/man5x /usr/share/man/chg/man6 /usr/share/man/chg/man6x /usr/share/man/chg/man7 /usr/share/man/chg/man7x /usr/share/man/chg/man8 /usr/share/man/chg/man8x /usr/share/man/chg/man9 /usr/share/man/chg/man9x /usr/share/man/chg/mann /usr/share/man/chk /usr/share/man/chk/man0p /usr/share/man/chk/man1 /usr/share/man/chk/man1p /usr/share/man/chk/man1x /usr/share/man/chk/man2 /usr/share/man/chk/man2x /usr/share/man/chk/man3 /usr/share/man/chk/man3p /usr/share/man/chk/man3x /usr/share/man/chk/man4 /usr/share/man/chk/man4x /usr/share/man/chk/man5 /usr/share/man/chk/man5x /usr/share/man/chk/man6 /usr/share/man/chk/man6x /usr/share/man/chk/man7 /usr/share/man/chk/man7x /usr/share/man/chk/man8 /usr/share/man/chk/man8x /usr/share/man/chk/man9 /usr/share/man/chk/man9x /usr/share/man/chk/mann /usr/share/man/chm /usr/share/man/ch/man0p /usr/share/man/ch/man1 /usr/share/man/ch/man1p /usr/share/man/ch/man1x /usr/share/man/ch/man2 /usr/share/man/ch/man2x /usr/share/man/ch/man3 /usr/share/man/ch/man3p /usr/share/man/ch/man3x /usr/share/man/ch/man4 /usr/share/man/ch/man4x /usr/share/man/ch/man5 /usr/share/man/ch/man5x /usr/share/man/ch/man6 /usr/share/man/ch/man6x /usr/share/man/ch/man7 /usr/share/man/ch/man7x /usr/share/man/ch/man8 /usr/share/man/ch/man8x /usr/share/man/ch/man9 /usr/share/man/ch/man9x /usr/share/man/ch/mann /usr/share/man/chm/man0p /usr/share/man/chm/man1 /usr/share/man/chm/man1p /usr/share/man/chm/man1x /usr/share/man/chm/man2 /usr/share/man/chm/man2x /usr/share/man/chm/man3 /usr/share/man/chm/man3p /usr/share/man/chm/man3x /usr/share/man/chm/man4 /usr/share/man/chm/man4x /usr/share/man/chm/man5 /usr/share/man/chm/man5x /usr/share/man/chm/man6 /usr/share/man/chm/man6x /usr/share/man/chm/man7 /usr/share/man/chm/man7x /usr/share/man/chm/man8 /usr/share/man/chm/man8x /usr/share/man/chm/man9 /usr/share/man/chm/man9x /usr/share/man/chm/mann /usr/share/man/chn /usr/share/man/chn/man0p /usr/share/man/chn/man1 /usr/share/man/chn/man1p /usr/share/man/chn/man1x /usr/share/man/chn/man2 /usr/share/man/chn/man2x /usr/share/man/chn/man3 /usr/share/man/chn/man3p /usr/share/man/chn/man3x /usr/share/man/chn/man4 /usr/share/man/chn/man4x /usr/share/man/chn/man5 /usr/share/man/chn/man5x /usr/share/man/chn/man6 /usr/share/man/chn/man6x /usr/share/man/chn/man7 /usr/share/man/chn/man7x /usr/share/man/chn/man8 /usr/share/man/chn/man8x /usr/share/man/chn/man9 /usr/share/man/chn/man9x /usr/share/man/chn/mann /usr/share/man/cho /usr/share/man/cho/man0p /usr/share/man/cho/man1 /usr/share/man/cho/man1p /usr/share/man/cho/man1x /usr/share/man/cho/man2 /usr/share/man/cho/man2x /usr/share/man/cho/man3 /usr/share/man/cho/man3p /usr/share/man/cho/man3x /usr/share/man/cho/man4 /usr/share/man/cho/man4x /usr/share/man/cho/man5 /usr/share/man/cho/man5x /usr/share/man/cho/man6 /usr/share/man/cho/man6x /usr/share/man/cho/man7 /usr/share/man/cho/man7x /usr/share/man/cho/man8 /usr/share/man/cho/man8x /usr/share/man/cho/man9 /usr/share/man/cho/man9x /usr/share/man/cho/mann /usr/share/man/chp /usr/share/man/chp/man0p /usr/share/man/chp/man1 /usr/share/man/chp/man1p /usr/share/man/chp/man1x /usr/share/man/chp/man2 /usr/share/man/chp/man2x /usr/share/man/chp/man3 /usr/share/man/chp/man3p /usr/share/man/chp/man3x /usr/share/man/chp/man4 /usr/share/man/chp/man4x /usr/share/man/chp/man5 /usr/share/man/chp/man5x /usr/share/man/chp/man6 /usr/share/man/chp/man6x /usr/share/man/chp/man7 /usr/share/man/chp/man7x /usr/share/man/chp/man8 /usr/share/man/chp/man8x /usr/share/man/chp/man9 /usr/share/man/chp/man9x /usr/share/man/chp/mann /usr/share/man/chr /usr/share/man/chr/man0p /usr/share/man/chr/man1 /usr/share/man/chr/man1p /usr/share/man/chr/man1x /usr/share/man/chr/man2 /usr/share/man/chr/man2x /usr/share/man/chr/man3 /usr/share/man/chr/man3p /usr/share/man/chr/man3x /usr/share/man/chr/man4 /usr/share/man/chr/man4x /usr/share/man/chr/man5 /usr/share/man/chr/man5x /usr/share/man/chr/man6 /usr/share/man/chr/man6x /usr/share/man/chr/man7 /usr/share/man/chr/man7x /usr/share/man/chr/man8 /usr/share/man/chr/man8x /usr/share/man/chr/man9 /usr/share/man/chr/man9x /usr/share/man/chr/mann /usr/share/man/chy /usr/share/man/chy/man0p /usr/share/man/chy/man1 /usr/share/man/chy/man1p /usr/share/man/chy/man1x /usr/share/man/chy/man2 /usr/share/man/chy/man2x /usr/share/man/chy/man3 /usr/share/man/chy/man3p /usr/share/man/chy/man3x /usr/share/man/chy/man4 /usr/share/man/chy/man4x /usr/share/man/chy/man5 /usr/share/man/chy/man5x /usr/share/man/chy/man6 /usr/share/man/chy/man6x /usr/share/man/chy/man7 /usr/share/man/chy/man7x /usr/share/man/chy/man8 /usr/share/man/chy/man8x /usr/share/man/chy/man9 /usr/share/man/chy/man9x /usr/share/man/chy/mann /usr/share/man/cmc /usr/share/man/cmc/man0p /usr/share/man/cmc/man1 /usr/share/man/cmc/man1p /usr/share/man/cmc/man1x /usr/share/man/cmc/man2 /usr/share/man/cmc/man2x /usr/share/man/cmc/man3 /usr/share/man/cmc/man3p /usr/share/man/cmc/man3x /usr/share/man/cmc/man4 /usr/share/man/cmc/man4x /usr/share/man/cmc/man5 /usr/share/man/cmc/man5x /usr/share/man/cmc/man6 /usr/share/man/cmc/man6x /usr/share/man/cmc/man7 /usr/share/man/cmc/man7x /usr/share/man/cmc/man8 /usr/share/man/cmc/man8x /usr/share/man/cmc/man9 /usr/share/man/cmc/man9x /usr/share/man/cmc/mann /usr/share/man/co /usr/share/man/co/man0p /usr/share/man/co/man1 /usr/share/man/co/man1p /usr/share/man/co/man1x /usr/share/man/co/man2 /usr/share/man/co/man2x /usr/share/man/co/man3 /usr/share/man/co/man3p /usr/share/man/co/man3x /usr/share/man/co/man4 /usr/share/man/co/man4x /usr/share/man/co/man5 /usr/share/man/co/man5x /usr/share/man/co/man6 /usr/share/man/co/man6x /usr/share/man/co/man7 /usr/share/man/co/man7x /usr/share/man/co/man8 /usr/share/man/co/man8x /usr/share/man/co/man9 /usr/share/man/co/man9x /usr/share/man/co/mann /usr/share/man/cop /usr/share/man/cop/man0p /usr/share/man/cop/man1 /usr/share/man/cop/man1p /usr/share/man/cop/man1x /usr/share/man/cop/man2 /usr/share/man/cop/man2x /usr/share/man/cop/man3 /usr/share/man/cop/man3p /usr/share/man/cop/man3x /usr/share/man/cop/man4 /usr/share/man/cop/man4x /usr/share/man/cop/man5 /usr/share/man/cop/man5x /usr/share/man/cop/man6 /usr/share/man/cop/man6x /usr/share/man/cop/man7 /usr/share/man/cop/man7x /usr/share/man/cop/man8 /usr/share/man/cop/man8x /usr/share/man/cop/man9 /usr/share/man/cop/man9x /usr/share/man/cop/mann /usr/share/man/cpe /usr/share/man/cpe/man0p /usr/share/man/cpe/man1 /usr/share/man/cpe/man1p /usr/share/man/cpe/man1x /usr/share/man/cpe/man2 /usr/share/man/cpe/man2x /usr/share/man/cpe/man3 /usr/share/man/cpe/man3p /usr/share/man/cpe/man3x /usr/share/man/cpe/man4 /usr/share/man/cpe/man4x /usr/share/man/cpe/man5 /usr/share/man/cpe/man5x /usr/share/man/cpe/man6 /usr/share/man/cpe/man6x /usr/share/man/cpe/man7 /usr/share/man/cpe/man7x /usr/share/man/cpe/man8 /usr/share/man/cpe/man8x /usr/share/man/cpe/man9 /usr/share/man/cpe/man9x /usr/share/man/cpe/mann /usr/share/man/cpf /usr/share/man/cpf/man0p /usr/share/man/cpf/man1 /usr/share/man/cpf/man1p /usr/share/man/cpf/man1x /usr/share/man/cpf/man2 /usr/share/man/cpf/man2x /usr/share/man/cpf/man3 /usr/share/man/cpf/man3p /usr/share/man/cpf/man3x /usr/share/man/cpf/man4 /usr/share/man/cpf/man4x /usr/share/man/cpf/man5 /usr/share/man/cpf/man5x /usr/share/man/cpf/man6 /usr/share/man/cpf/man6x /usr/share/man/cpf/man7 /usr/share/man/cpf/man7x /usr/share/man/cpf/man8 /usr/share/man/cpf/man8x /usr/share/man/cpf/man9 /usr/share/man/cpf/man9x /usr/share/man/cpf/mann /usr/share/man/cpp /usr/share/man/cpp/man0p /usr/share/man/cpp/man1 /usr/share/man/cpp/man1p /usr/share/man/cpp/man1x /usr/share/man/cpp/man2 /usr/share/man/cpp/man2x /usr/share/man/cpp/man3 /usr/share/man/cpp/man3p /usr/share/man/cpp/man3x /usr/share/man/cpp/man4 /usr/share/man/cpp/man4x /usr/share/man/cpp/man5 /usr/share/man/cpp/man5x /usr/share/man/cpp/man6 /usr/share/man/cpp/man6x /usr/share/man/cpp/man7 /usr/share/man/cpp/man7x /usr/share/man/cpp/man8 /usr/share/man/cpp/man8x /usr/share/man/cpp/man9 /usr/share/man/cpp/man9x /usr/share/man/cpp/mann /usr/share/man/cr /usr/share/man/crh /usr/share/man/crh/man0p /usr/share/man/crh/man1 /usr/share/man/crh/man1p /usr/share/man/crh/man1x /usr/share/man/crh/man2 /usr/share/man/crh/man2x /usr/share/man/crh/man3 /usr/share/man/crh/man3p /usr/share/man/crh/man3x /usr/share/man/crh/man4 /usr/share/man/crh/man4x /usr/share/man/crh/man5 /usr/share/man/crh/man5x /usr/share/man/crh/man6 /usr/share/man/crh/man6x /usr/share/man/crh/man7 /usr/share/man/crh/man7x /usr/share/man/crh/man8 /usr/share/man/crh/man8x /usr/share/man/crh/man9 /usr/share/man/crh/man9x /usr/share/man/crh/mann /usr/share/man/cr/man0p /usr/share/man/cr/man1 /usr/share/man/cr/man1p /usr/share/man/cr/man1x /usr/share/man/cr/man2 /usr/share/man/cr/man2x /usr/share/man/cr/man3 /usr/share/man/cr/man3p /usr/share/man/cr/man3x /usr/share/man/cr/man4 /usr/share/man/cr/man4x /usr/share/man/cr/man5 /usr/share/man/cr/man5x /usr/share/man/cr/man6 /usr/share/man/cr/man6x /usr/share/man/cr/man7 /usr/share/man/cr/man7x /usr/share/man/cr/man8 /usr/share/man/cr/man8x /usr/share/man/cr/man9 /usr/share/man/cr/man9x /usr/share/man/cr/mann /usr/share/man/crp /usr/share/man/crp/man0p /usr/share/man/crp/man1 /usr/share/man/crp/man1p /usr/share/man/crp/man1x /usr/share/man/crp/man2 /usr/share/man/crp/man2x /usr/share/man/crp/man3 /usr/share/man/crp/man3p /usr/share/man/crp/man3x /usr/share/man/crp/man4 /usr/share/man/crp/man4x /usr/share/man/crp/man5 /usr/share/man/crp/man5x /usr/share/man/crp/man6 /usr/share/man/crp/man6x /usr/share/man/crp/man7 /usr/share/man/crp/man7x /usr/share/man/crp/man8 /usr/share/man/crp/man8x /usr/share/man/crp/man9 /usr/share/man/crp/man9x /usr/share/man/crp/mann /usr/share/man/cs /usr/share/man/csb /usr/share/man/csb/man0p /usr/share/man/csb/man1 /usr/share/man/csb/man1p /usr/share/man/csb/man1x /usr/share/man/csb/man2 /usr/share/man/csb/man2x /usr/share/man/csb/man3 /usr/share/man/csb/man3p /usr/share/man/csb/man3x /usr/share/man/csb/man4 /usr/share/man/csb/man4x /usr/share/man/csb/man5 /usr/share/man/csb/man5x /usr/share/man/csb/man6 /usr/share/man/csb/man6x /usr/share/man/csb/man7 /usr/share/man/csb/man7x /usr/share/man/csb/man8 /usr/share/man/csb/man8x /usr/share/man/csb/man9 /usr/share/man/csb/man9x /usr/share/man/csb/mann /usr/share/man/cs_CZ /usr/share/man/cs_CZ/man0p /usr/share/man/cs_CZ/man1 /usr/share/man/cs_CZ/man1p /usr/share/man/cs_CZ/man1x /usr/share/man/cs_CZ/man2 /usr/share/man/cs_CZ/man2x /usr/share/man/cs_CZ/man3 /usr/share/man/cs_CZ/man3p /usr/share/man/cs_CZ/man3x /usr/share/man/cs_CZ/man4 /usr/share/man/cs_CZ/man4x /usr/share/man/cs_CZ/man5 /usr/share/man/cs_CZ/man5x /usr/share/man/cs_CZ/man6 /usr/share/man/cs_CZ/man6x /usr/share/man/cs_CZ/man7 /usr/share/man/cs_CZ/man7x /usr/share/man/cs_CZ/man8 /usr/share/man/cs_CZ/man8x /usr/share/man/cs_CZ/man9 /usr/share/man/cs_CZ/man9x /usr/share/man/cs_CZ/mann /usr/share/man/cs/man0p /usr/share/man/cs/man1 /usr/share/man/cs/man1p /usr/share/man/cs/man1x /usr/share/man/cs/man2 /usr/share/man/cs/man2x /usr/share/man/cs/man3 /usr/share/man/cs/man3p /usr/share/man/cs/man3x /usr/share/man/cs/man4 /usr/share/man/cs/man4x /usr/share/man/cs/man5 /usr/share/man/cs/man5x /usr/share/man/cs/man6 /usr/share/man/cs/man6x /usr/share/man/cs/man7 /usr/share/man/cs/man7x /usr/share/man/cs/man8 /usr/share/man/cs/man8x /usr/share/man/cs/man9 /usr/share/man/cs/man9x /usr/share/man/cs/mann /usr/share/man/cu /usr/share/man/cu/man0p /usr/share/man/cu/man1 /usr/share/man/cu/man1p /usr/share/man/cu/man1x /usr/share/man/cu/man2 /usr/share/man/cu/man2x /usr/share/man/cu/man3 /usr/share/man/cu/man3p /usr/share/man/cu/man3x /usr/share/man/cu/man4 /usr/share/man/cu/man4x /usr/share/man/cu/man5 /usr/share/man/cu/man5x /usr/share/man/cu/man6 /usr/share/man/cu/man6x /usr/share/man/cu/man7 /usr/share/man/cu/man7x /usr/share/man/cu/man8 /usr/share/man/cu/man8x /usr/share/man/cu/man9 /usr/share/man/cu/man9x /usr/share/man/cu/mann /usr/share/man/cus /usr/share/man/cus/man0p /usr/share/man/cus/man1 /usr/share/man/cus/man1p /usr/share/man/cus/man1x /usr/share/man/cus/man2 /usr/share/man/cus/man2x /usr/share/man/cus/man3 /usr/share/man/cus/man3p /usr/share/man/cus/man3x /usr/share/man/cus/man4 /usr/share/man/cus/man4x /usr/share/man/cus/man5 /usr/share/man/cus/man5x /usr/share/man/cus/man6 /usr/share/man/cus/man6x /usr/share/man/cus/man7 /usr/share/man/cus/man7x /usr/share/man/cus/man8 /usr/share/man/cus/man8x /usr/share/man/cus/man9 /usr/share/man/cus/man9x /usr/share/man/cus/mann /usr/share/man/cv /usr/share/man/cv/man0p /usr/share/man/cv/man1 /usr/share/man/cv/man1p /usr/share/man/cv/man1x /usr/share/man/cv/man2 /usr/share/man/cv/man2x /usr/share/man/cv/man3 /usr/share/man/cv/man3p /usr/share/man/cv/man3x /usr/share/man/cv/man4 /usr/share/man/cv/man4x /usr/share/man/cv/man5 /usr/share/man/cv/man5x /usr/share/man/cv/man6 /usr/share/man/cv/man6x /usr/share/man/cv/man7 /usr/share/man/cv/man7x /usr/share/man/cv/man8 /usr/share/man/cv/man8x /usr/share/man/cv/man9 /usr/share/man/cv/man9x /usr/share/man/cv/mann /usr/share/man/cy /usr/share/man/cy/man0p /usr/share/man/cy/man1 /usr/share/man/cy/man1p /usr/share/man/cy/man1x /usr/share/man/cy/man2 /usr/share/man/cy/man2x /usr/share/man/cy/man3 /usr/share/man/cy/man3p /usr/share/man/cy/man3x /usr/share/man/cy/man4 /usr/share/man/cy/man4x /usr/share/man/cy/man5 /usr/share/man/cy/man5x /usr/share/man/cy/man6 /usr/share/man/cy/man6x /usr/share/man/cy/man7 /usr/share/man/cy/man7x /usr/share/man/cy/man8 /usr/share/man/cy/man8x /usr/share/man/cy/man9 /usr/share/man/cy/man9x /usr/share/man/cy/mann /usr/share/man/da /usr/share/man/dak /usr/share/man/dak/man0p /usr/share/man/dak/man1 /usr/share/man/dak/man1p /usr/share/man/dak/man1x /usr/share/man/dak/man2 /usr/share/man/dak/man2x /usr/share/man/dak/man3 /usr/share/man/dak/man3p /usr/share/man/dak/man3x /usr/share/man/dak/man4 /usr/share/man/dak/man4x /usr/share/man/dak/man5 /usr/share/man/dak/man5x /usr/share/man/dak/man6 /usr/share/man/dak/man6x /usr/share/man/dak/man7 /usr/share/man/dak/man7x /usr/share/man/dak/man8 /usr/share/man/dak/man8x /usr/share/man/dak/man9 /usr/share/man/dak/man9x /usr/share/man/dak/mann /usr/share/man/da/man0p /usr/share/man/da/man1 /usr/share/man/da/man1p /usr/share/man/da/man1x /usr/share/man/da/man2 /usr/share/man/da/man2x /usr/share/man/da/man3 /usr/share/man/da/man3p /usr/share/man/da/man3x /usr/share/man/da/man4 /usr/share/man/da/man4x /usr/share/man/da/man5 /usr/share/man/da/man5x /usr/share/man/da/man6 /usr/share/man/da/man6x /usr/share/man/da/man7 /usr/share/man/da/man7x /usr/share/man/da/man8 /usr/share/man/da/man8x /usr/share/man/da/man9 /usr/share/man/da/man9x /usr/share/man/da/mann /usr/share/man/dar /usr/share/man/dar/man0p /usr/share/man/dar/man1 /usr/share/man/dar/man1p /usr/share/man/dar/man1x /usr/share/man/dar/man2 /usr/share/man/dar/man2x /usr/share/man/dar/man3 /usr/share/man/dar/man3p /usr/share/man/dar/man3x /usr/share/man/dar/man4 /usr/share/man/dar/man4x /usr/share/man/dar/man5 /usr/share/man/dar/man5x /usr/share/man/dar/man6 /usr/share/man/dar/man6x /usr/share/man/dar/man7 /usr/share/man/dar/man7x /usr/share/man/dar/man8 /usr/share/man/dar/man8x /usr/share/man/dar/man9 /usr/share/man/dar/man9x /usr/share/man/dar/mann /usr/share/man/day /usr/share/man/day/man0p /usr/share/man/day/man1 /usr/share/man/day/man1p /usr/share/man/day/man1x /usr/share/man/day/man2 /usr/share/man/day/man2x /usr/share/man/day/man3 /usr/share/man/day/man3p /usr/share/man/day/man3x /usr/share/man/day/man4 /usr/share/man/day/man4x /usr/share/man/day/man5 /usr/share/man/day/man5x /usr/share/man/day/man6 /usr/share/man/day/man6x /usr/share/man/day/man7 /usr/share/man/day/man7x /usr/share/man/day/man8 /usr/share/man/day/man8x /usr/share/man/day/man9 /usr/share/man/day/man9x /usr/share/man/day/mann /usr/share/man/de /usr/share/man/de_AT /usr/share/man/de_AT/man0p /usr/share/man/de_AT/man1 /usr/share/man/de_AT/man1p /usr/share/man/de_AT/man1x /usr/share/man/de_AT/man2 /usr/share/man/de_AT/man2x /usr/share/man/de_AT/man3 /usr/share/man/de_AT/man3p /usr/share/man/de_AT/man3x /usr/share/man/de_AT/man4 /usr/share/man/de_AT/man4x /usr/share/man/de_AT/man5 /usr/share/man/de_AT/man5x /usr/share/man/de_AT/man6 /usr/share/man/de_AT/man6x /usr/share/man/de_AT/man7 /usr/share/man/de_AT/man7x /usr/share/man/de_AT/man8 /usr/share/man/de_AT/man8x /usr/share/man/de_AT/man9 /usr/share/man/de_AT/man9x /usr/share/man/de_AT/mann /usr/share/man/de_CH /usr/share/man/de_CH/man0p /usr/share/man/de_CH/man1 /usr/share/man/de_CH/man1p /usr/share/man/de_CH/man1x /usr/share/man/de_CH/man2 /usr/share/man/de_CH/man2x /usr/share/man/de_CH/man3 /usr/share/man/de_CH/man3p /usr/share/man/de_CH/man3x /usr/share/man/de_CH/man4 /usr/share/man/de_CH/man4x /usr/share/man/de_CH/man5 /usr/share/man/de_CH/man5x /usr/share/man/de_CH/man6 /usr/share/man/de_CH/man6x /usr/share/man/de_CH/man7 /usr/share/man/de_CH/man7x /usr/share/man/de_CH/man8 /usr/share/man/de_CH/man8x /usr/share/man/de_CH/man9 /usr/share/man/de_CH/man9x /usr/share/man/de_CH/mann /usr/share/man/de_DE /usr/share/man/de_DE/man0p /usr/share/man/de_DE/man1 /usr/share/man/de_DE/man1p /usr/share/man/de_DE/man1x /usr/share/man/de_DE/man2 /usr/share/man/de_DE/man2x /usr/share/man/de_DE/man3 /usr/share/man/de_DE/man3p /usr/share/man/de_DE/man3x /usr/share/man/de_DE/man4 /usr/share/man/de_DE/man4x /usr/share/man/de_DE/man5 /usr/share/man/de_DE/man5x /usr/share/man/de_DE/man6 /usr/share/man/de_DE/man6x /usr/share/man/de_DE/man7 /usr/share/man/de_DE/man7x /usr/share/man/de_DE/man8 /usr/share/man/de_DE/man8x /usr/share/man/de_DE/man9 /usr/share/man/de_DE/man9x /usr/share/man/de_DE/mann /usr/share/man/default /usr/share/man/default/man0p /usr/share/man/default/man1 /usr/share/man/default/man1p /usr/share/man/default/man1x /usr/share/man/default/man2 /usr/share/man/default/man2x /usr/share/man/default/man3 /usr/share/man/default/man3p /usr/share/man/default/man3x /usr/share/man/default/man4 /usr/share/man/default/man4x /usr/share/man/default/man5 /usr/share/man/default/man5x /usr/share/man/default/man6 /usr/share/man/default/man6x /usr/share/man/default/man7 /usr/share/man/default/man7x /usr/share/man/default/man8 /usr/share/man/default/man8x /usr/share/man/default/man9 /usr/share/man/default/man9x /usr/share/man/default/mann /usr/share/man/del /usr/share/man/del/man0p /usr/share/man/del/man1 /usr/share/man/del/man1p /usr/share/man/del/man1x /usr/share/man/del/man2 /usr/share/man/del/man2x /usr/share/man/del/man3 /usr/share/man/del/man3p /usr/share/man/del/man3x /usr/share/man/del/man4 /usr/share/man/del/man4x /usr/share/man/del/man5 /usr/share/man/del/man5x /usr/share/man/del/man6 /usr/share/man/del/man6x /usr/share/man/del/man7 /usr/share/man/del/man7x /usr/share/man/del/man8 /usr/share/man/del/man8x /usr/share/man/del/man9 /usr/share/man/del/man9x /usr/share/man/del/mann /usr/share/man/de/man0p /usr/share/man/de/man1 /usr/share/man/de/man1p /usr/share/man/de/man1x /usr/share/man/de/man2 /usr/share/man/de/man2x /usr/share/man/de/man3 /usr/share/man/de/man3p /usr/share/man/de/man3x /usr/share/man/de/man4 /usr/share/man/de/man4x /usr/share/man/de/man5 /usr/share/man/de/man5x /usr/share/man/de/man6 /usr/share/man/de/man6x /usr/share/man/de/man7 /usr/share/man/de/man7x /usr/share/man/de/man8 /usr/share/man/de/man8x /usr/share/man/de/man9 /usr/share/man/de/man9x /usr/share/man/de/mann /usr/share/man/den /usr/share/man/den/man0p /usr/share/man/den/man1 /usr/share/man/den/man1p /usr/share/man/den/man1x /usr/share/man/den/man2 /usr/share/man/den/man2x /usr/share/man/den/man3 /usr/share/man/den/man3p /usr/share/man/den/man3x /usr/share/man/den/man4 /usr/share/man/den/man4x /usr/share/man/den/man5 /usr/share/man/den/man5x /usr/share/man/den/man6 /usr/share/man/den/man6x /usr/share/man/den/man7 /usr/share/man/den/man7x /usr/share/man/den/man8 /usr/share/man/den/man8x /usr/share/man/den/man9 /usr/share/man/den/man9x /usr/share/man/den/mann /usr/share/man/dgr /usr/share/man/dgr/man0p /usr/share/man/dgr/man1 /usr/share/man/dgr/man1p /usr/share/man/dgr/man1x /usr/share/man/dgr/man2 /usr/share/man/dgr/man2x /usr/share/man/dgr/man3 /usr/share/man/dgr/man3p /usr/share/man/dgr/man3x /usr/share/man/dgr/man4 /usr/share/man/dgr/man4x /usr/share/man/dgr/man5 /usr/share/man/dgr/man5x /usr/share/man/dgr/man6 /usr/share/man/dgr/man6x /usr/share/man/dgr/man7 /usr/share/man/dgr/man7x /usr/share/man/dgr/man8 /usr/share/man/dgr/man8x /usr/share/man/dgr/man9 /usr/share/man/dgr/man9x /usr/share/man/dgr/mann /usr/share/man/din /usr/share/man/din/man0p /usr/share/man/din/man1 /usr/share/man/din/man1p /usr/share/man/din/man1x /usr/share/man/din/man2 /usr/share/man/din/man2x /usr/share/man/din/man3 /usr/share/man/din/man3p /usr/share/man/din/man3x /usr/share/man/din/man4 /usr/share/man/din/man4x /usr/share/man/din/man5 /usr/share/man/din/man5x /usr/share/man/din/man6 /usr/share/man/din/man6x /usr/share/man/din/man7 /usr/share/man/din/man7x /usr/share/man/din/man8 /usr/share/man/din/man8x /usr/share/man/din/man9 /usr/share/man/din/man9x /usr/share/man/din/mann /usr/share/man/doi /usr/share/man/doi/man0p /usr/share/man/doi/man1 /usr/share/man/doi/man1p /usr/share/man/doi/man1x /usr/share/man/doi/man2 /usr/share/man/doi/man2x /usr/share/man/doi/man3 /usr/share/man/doi/man3p /usr/share/man/doi/man3x /usr/share/man/doi/man4 /usr/share/man/doi/man4x /usr/share/man/doi/man5 /usr/share/man/doi/man5x /usr/share/man/doi/man6 /usr/share/man/doi/man6x /usr/share/man/doi/man7 /usr/share/man/doi/man7x /usr/share/man/doi/man8 /usr/share/man/doi/man8x /usr/share/man/doi/man9 /usr/share/man/doi/man9x /usr/share/man/doi/mann /usr/share/man/dra /usr/share/man/dra/man0p /usr/share/man/dra/man1 /usr/share/man/dra/man1p /usr/share/man/dra/man1x /usr/share/man/dra/man2 /usr/share/man/dra/man2x /usr/share/man/dra/man3 /usr/share/man/dra/man3p /usr/share/man/dra/man3x /usr/share/man/dra/man4 /usr/share/man/dra/man4x /usr/share/man/dra/man5 /usr/share/man/dra/man5x /usr/share/man/dra/man6 /usr/share/man/dra/man6x /usr/share/man/dra/man7 /usr/share/man/dra/man7x /usr/share/man/dra/man8 /usr/share/man/dra/man8x /usr/share/man/dra/man9 /usr/share/man/dra/man9x /usr/share/man/dra/mann /usr/share/man/dsb /usr/share/man/dsb/man0p /usr/share/man/dsb/man1 /usr/share/man/dsb/man1p /usr/share/man/dsb/man1x /usr/share/man/dsb/man2 /usr/share/man/dsb/man2x /usr/share/man/dsb/man3 /usr/share/man/dsb/man3p /usr/share/man/dsb/man3x /usr/share/man/dsb/man4 /usr/share/man/dsb/man4x /usr/share/man/dsb/man5 /usr/share/man/dsb/man5x /usr/share/man/dsb/man6 /usr/share/man/dsb/man6x /usr/share/man/dsb/man7 /usr/share/man/dsb/man7x /usr/share/man/dsb/man8 /usr/share/man/dsb/man8x /usr/share/man/dsb/man9 /usr/share/man/dsb/man9x /usr/share/man/dsb/mann /usr/share/man/dua /usr/share/man/dua/man0p /usr/share/man/dua/man1 /usr/share/man/dua/man1p /usr/share/man/dua/man1x /usr/share/man/dua/man2 /usr/share/man/dua/man2x /usr/share/man/dua/man3 /usr/share/man/dua/man3p /usr/share/man/dua/man3x /usr/share/man/dua/man4 /usr/share/man/dua/man4x /usr/share/man/dua/man5 /usr/share/man/dua/man5x /usr/share/man/dua/man6 /usr/share/man/dua/man6x /usr/share/man/dua/man7 /usr/share/man/dua/man7x /usr/share/man/dua/man8 /usr/share/man/dua/man8x /usr/share/man/dua/man9 /usr/share/man/dua/man9x /usr/share/man/dua/mann /usr/share/man/dum /usr/share/man/dum/man0p /usr/share/man/dum/man1 /usr/share/man/dum/man1p /usr/share/man/dum/man1x /usr/share/man/dum/man2 /usr/share/man/dum/man2x /usr/share/man/dum/man3 /usr/share/man/dum/man3p /usr/share/man/dum/man3x /usr/share/man/dum/man4 /usr/share/man/dum/man4x /usr/share/man/dum/man5 /usr/share/man/dum/man5x /usr/share/man/dum/man6 /usr/share/man/dum/man6x /usr/share/man/dum/man7 /usr/share/man/dum/man7x /usr/share/man/dum/man8 /usr/share/man/dum/man8x /usr/share/man/dum/man9 /usr/share/man/dum/man9x /usr/share/man/dum/mann /usr/share/man/dv /usr/share/man/dv/man0p /usr/share/man/dv/man1 /usr/share/man/dv/man1p /usr/share/man/dv/man1x /usr/share/man/dv/man2 /usr/share/man/dv/man2x /usr/share/man/dv/man3 /usr/share/man/dv/man3p /usr/share/man/dv/man3x /usr/share/man/dv/man4 /usr/share/man/dv/man4x /usr/share/man/dv/man5 /usr/share/man/dv/man5x /usr/share/man/dv/man6 /usr/share/man/dv/man6x /usr/share/man/dv/man7 /usr/share/man/dv/man7x /usr/share/man/dv/man8 /usr/share/man/dv/man8x /usr/share/man/dv/man9 /usr/share/man/dv/man9x /usr/share/man/dv/mann /usr/share/man/dyu /usr/share/man/dyu/man0p /usr/share/man/dyu/man1 /usr/share/man/dyu/man1p /usr/share/man/dyu/man1x /usr/share/man/dyu/man2 /usr/share/man/dyu/man2x /usr/share/man/dyu/man3 /usr/share/man/dyu/man3p /usr/share/man/dyu/man3x /usr/share/man/dyu/man4 /usr/share/man/dyu/man4x /usr/share/man/dyu/man5 /usr/share/man/dyu/man5x /usr/share/man/dyu/man6 /usr/share/man/dyu/man6x /usr/share/man/dyu/man7 /usr/share/man/dyu/man7x /usr/share/man/dyu/man8 /usr/share/man/dyu/man8x /usr/share/man/dyu/man9 /usr/share/man/dyu/man9x /usr/share/man/dyu/mann /usr/share/man/dz /usr/share/man/dz/man0p /usr/share/man/dz/man1 /usr/share/man/dz/man1p /usr/share/man/dz/man1x /usr/share/man/dz/man2 /usr/share/man/dz/man2x /usr/share/man/dz/man3 /usr/share/man/dz/man3p /usr/share/man/dz/man3x /usr/share/man/dz/man4 /usr/share/man/dz/man4x /usr/share/man/dz/man5 /usr/share/man/dz/man5x /usr/share/man/dz/man6 /usr/share/man/dz/man6x /usr/share/man/dz/man7 /usr/share/man/dz/man7x /usr/share/man/dz/man8 /usr/share/man/dz/man8x /usr/share/man/dz/man9 /usr/share/man/dz/man9x /usr/share/man/dz/mann /usr/share/man/ee /usr/share/man/ee/man0p /usr/share/man/ee/man1 /usr/share/man/ee/man1p /usr/share/man/ee/man1x /usr/share/man/ee/man2 /usr/share/man/ee/man2x /usr/share/man/ee/man3 /usr/share/man/ee/man3p /usr/share/man/ee/man3x /usr/share/man/ee/man4 /usr/share/man/ee/man4x /usr/share/man/ee/man5 /usr/share/man/ee/man5x /usr/share/man/ee/man6 /usr/share/man/ee/man6x /usr/share/man/ee/man7 /usr/share/man/ee/man7x /usr/share/man/ee/man8 /usr/share/man/ee/man8x /usr/share/man/ee/man9 /usr/share/man/ee/man9x /usr/share/man/ee/mann /usr/share/man/efi /usr/share/man/efi/man0p /usr/share/man/efi/man1 /usr/share/man/efi/man1p /usr/share/man/efi/man1x /usr/share/man/efi/man2 /usr/share/man/efi/man2x /usr/share/man/efi/man3 /usr/share/man/efi/man3p /usr/share/man/efi/man3x /usr/share/man/efi/man4 /usr/share/man/efi/man4x /usr/share/man/efi/man5 /usr/share/man/efi/man5x /usr/share/man/efi/man6 /usr/share/man/efi/man6x /usr/share/man/efi/man7 /usr/share/man/efi/man7x /usr/share/man/efi/man8 /usr/share/man/efi/man8x /usr/share/man/efi/man9 /usr/share/man/efi/man9x /usr/share/man/efi/mann /usr/share/man/egy /usr/share/man/egy/man0p /usr/share/man/egy/man1 /usr/share/man/egy/man1p /usr/share/man/egy/man1x /usr/share/man/egy/man2 /usr/share/man/egy/man2x /usr/share/man/egy/man3 /usr/share/man/egy/man3p /usr/share/man/egy/man3x /usr/share/man/egy/man4 /usr/share/man/egy/man4x /usr/share/man/egy/man5 /usr/share/man/egy/man5x /usr/share/man/egy/man6 /usr/share/man/egy/man6x /usr/share/man/egy/man7 /usr/share/man/egy/man7x /usr/share/man/egy/man8 /usr/share/man/egy/man8x /usr/share/man/egy/man9 /usr/share/man/egy/man9x /usr/share/man/egy/mann /usr/share/man/eka /usr/share/man/eka/man0p /usr/share/man/eka/man1 /usr/share/man/eka/man1p /usr/share/man/eka/man1x /usr/share/man/eka/man2 /usr/share/man/eka/man2x /usr/share/man/eka/man3 /usr/share/man/eka/man3p /usr/share/man/eka/man3x /usr/share/man/eka/man4 /usr/share/man/eka/man4x /usr/share/man/eka/man5 /usr/share/man/eka/man5x /usr/share/man/eka/man6 /usr/share/man/eka/man6x /usr/share/man/eka/man7 /usr/share/man/eka/man7x /usr/share/man/eka/man8 /usr/share/man/eka/man8x /usr/share/man/eka/man9 /usr/share/man/eka/man9x /usr/share/man/eka/mann /usr/share/man/el /usr/share/man/el_GR /usr/share/man/el_GR/man0p /usr/share/man/el_GR/man1 /usr/share/man/el_GR/man1p /usr/share/man/el_GR/man1x /usr/share/man/el_GR/man2 /usr/share/man/el_GR/man2x /usr/share/man/el_GR/man3 /usr/share/man/el_GR/man3p /usr/share/man/el_GR/man3x /usr/share/man/el_GR/man4 /usr/share/man/el_GR/man4x /usr/share/man/el_GR/man5 /usr/share/man/el_GR/man5x /usr/share/man/el_GR/man6 /usr/share/man/el_GR/man6x /usr/share/man/el_GR/man7 /usr/share/man/el_GR/man7x /usr/share/man/el_GR/man8 /usr/share/man/el_GR/man8x /usr/share/man/el_GR/man9 /usr/share/man/el_GR/man9x /usr/share/man/el_GR/mann /usr/share/man/el/man0p /usr/share/man/el/man1 /usr/share/man/el/man1p /usr/share/man/el/man1x /usr/share/man/el/man2 /usr/share/man/el/man2x /usr/share/man/el/man3 /usr/share/man/el/man3p /usr/share/man/el/man3x /usr/share/man/el/man4 /usr/share/man/el/man4x /usr/share/man/el/man5 /usr/share/man/el/man5x /usr/share/man/el/man6 /usr/share/man/el/man6x /usr/share/man/el/man7 /usr/share/man/el/man7x /usr/share/man/el/man8 /usr/share/man/el/man8x /usr/share/man/el/man9 /usr/share/man/el/man9x /usr/share/man/el/mann /usr/share/man/elx /usr/share/man/elx/man0p /usr/share/man/elx/man1 /usr/share/man/elx/man1p /usr/share/man/elx/man1x /usr/share/man/elx/man2 /usr/share/man/elx/man2x /usr/share/man/elx/man3 /usr/share/man/elx/man3p /usr/share/man/elx/man3x /usr/share/man/elx/man4 /usr/share/man/elx/man4x /usr/share/man/elx/man5 /usr/share/man/elx/man5x /usr/share/man/elx/man6 /usr/share/man/elx/man6x /usr/share/man/elx/man7 /usr/share/man/elx/man7x /usr/share/man/elx/man8 /usr/share/man/elx/man8x /usr/share/man/elx/man9 /usr/share/man/elx/man9x /usr/share/man/elx/mann /usr/share/man/en /usr/share/man/en_AU /usr/share/man/en_AU/man0p /usr/share/man/en_AU/man1 /usr/share/man/en_AU/man1p /usr/share/man/en_AU/man1x /usr/share/man/en_AU/man2 /usr/share/man/en_AU/man2x /usr/share/man/en_AU/man3 /usr/share/man/en_AU/man3p /usr/share/man/en_AU/man3x /usr/share/man/en_AU/man4 /usr/share/man/en_AU/man4x /usr/share/man/en_AU/man5 /usr/share/man/en_AU/man5x /usr/share/man/en_AU/man6 /usr/share/man/en_AU/man6x /usr/share/man/en_AU/man7 /usr/share/man/en_AU/man7x /usr/share/man/en_AU/man8 /usr/share/man/en_AU/man8x /usr/share/man/en_AU/man9 /usr/share/man/en_AU/man9x /usr/share/man/en_AU/mann /usr/share/man/en@boldquot /usr/share/man/en@boldquot/man0p /usr/share/man/en@boldquot/man1 /usr/share/man/en@boldquot/man1p /usr/share/man/en@boldquot/man1x /usr/share/man/en@boldquot/man2 /usr/share/man/en@boldquot/man2x /usr/share/man/en@boldquot/man3 /usr/share/man/en@boldquot/man3p /usr/share/man/en@boldquot/man3x /usr/share/man/en@boldquot/man4 /usr/share/man/en@boldquot/man4x /usr/share/man/en@boldquot/man5 /usr/share/man/en@boldquot/man5x /usr/share/man/en@boldquot/man6 /usr/share/man/en@boldquot/man6x /usr/share/man/en@boldquot/man7 /usr/share/man/en@boldquot/man7x /usr/share/man/en@boldquot/man8 /usr/share/man/en@boldquot/man8x /usr/share/man/en@boldquot/man9 /usr/share/man/en@boldquot/man9x /usr/share/man/en@boldquot/mann /usr/share/man/en_CA /usr/share/man/en_CA/man0p /usr/share/man/en_CA/man1 /usr/share/man/en_CA/man1p /usr/share/man/en_CA/man1x /usr/share/man/en_CA/man2 /usr/share/man/en_CA/man2x /usr/share/man/en_CA/man3 /usr/share/man/en_CA/man3p /usr/share/man/en_CA/man3x /usr/share/man/en_CA/man4 /usr/share/man/en_CA/man4x /usr/share/man/en_CA/man5 /usr/share/man/en_CA/man5x /usr/share/man/en_CA/man6 /usr/share/man/en_CA/man6x /usr/share/man/en_CA/man7 /usr/share/man/en_CA/man7x /usr/share/man/en_CA/man8 /usr/share/man/en_CA/man8x /usr/share/man/en_CA/man9 /usr/share/man/en_CA/man9x /usr/share/man/en_CA/mann /usr/share/man/en_GB /usr/share/man/en_GB/man0p /usr/share/man/en_GB/man1 /usr/share/man/en_GB/man1p /usr/share/man/en_GB/man1x /usr/share/man/en_GB/man2 /usr/share/man/en_GB/man2x /usr/share/man/en_GB/man3 /usr/share/man/en_GB/man3p /usr/share/man/en_GB/man3x /usr/share/man/en_GB/man4 /usr/share/man/en_GB/man4x /usr/share/man/en_GB/man5 /usr/share/man/en_GB/man5x /usr/share/man/en_GB/man6 /usr/share/man/en_GB/man6x /usr/share/man/en_GB/man7 /usr/share/man/en_GB/man7x /usr/share/man/en_GB/man8 /usr/share/man/en_GB/man8x /usr/share/man/en_GB/man9 /usr/share/man/en_GB/man9x /usr/share/man/en_GB/mann /usr/share/man/enm /usr/share/man/en/man0p /usr/share/man/en/man1 /usr/share/man/en/man1p /usr/share/man/en/man1x /usr/share/man/en/man2 /usr/share/man/en/man2x /usr/share/man/en/man3 /usr/share/man/en/man3p /usr/share/man/en/man3x /usr/share/man/en/man4 /usr/share/man/en/man4x /usr/share/man/en/man5 /usr/share/man/en/man5x /usr/share/man/en/man6 /usr/share/man/en/man6x /usr/share/man/en/man7 /usr/share/man/en/man7x /usr/share/man/en/man8 /usr/share/man/en/man8x /usr/share/man/en/man9 /usr/share/man/en/man9x /usr/share/man/en/mann /usr/share/man/enm/man0p /usr/share/man/enm/man1 /usr/share/man/enm/man1p /usr/share/man/enm/man1x /usr/share/man/enm/man2 /usr/share/man/enm/man2x /usr/share/man/enm/man3 /usr/share/man/enm/man3p /usr/share/man/enm/man3x /usr/share/man/enm/man4 /usr/share/man/enm/man4x /usr/share/man/enm/man5 /usr/share/man/enm/man5x /usr/share/man/enm/man6 /usr/share/man/enm/man6x /usr/share/man/enm/man7 /usr/share/man/enm/man7x /usr/share/man/enm/man8 /usr/share/man/enm/man8x /usr/share/man/enm/man9 /usr/share/man/enm/man9x /usr/share/man/enm/mann /usr/share/man/en_NZ /usr/share/man/en_NZ/man0p /usr/share/man/en_NZ/man1 /usr/share/man/en_NZ/man1p /usr/share/man/en_NZ/man1x /usr/share/man/en_NZ/man2 /usr/share/man/en_NZ/man2x /usr/share/man/en_NZ/man3 /usr/share/man/en_NZ/man3p /usr/share/man/en_NZ/man3x /usr/share/man/en_NZ/man4 /usr/share/man/en_NZ/man4x /usr/share/man/en_NZ/man5 /usr/share/man/en_NZ/man5x /usr/share/man/en_NZ/man6 /usr/share/man/en_NZ/man6x /usr/share/man/en_NZ/man7 /usr/share/man/en_NZ/man7x /usr/share/man/en_NZ/man8 /usr/share/man/en_NZ/man8x /usr/share/man/en_NZ/man9 /usr/share/man/en_NZ/man9x /usr/share/man/en_NZ/mann /usr/share/man/en@quot /usr/share/man/en@quot/man0p /usr/share/man/en@quot/man1 /usr/share/man/en@quot/man1p /usr/share/man/en@quot/man1x /usr/share/man/en@quot/man2 /usr/share/man/en@quot/man2x /usr/share/man/en@quot/man3 /usr/share/man/en@quot/man3p /usr/share/man/en@quot/man3x /usr/share/man/en@quot/man4 /usr/share/man/en@quot/man4x /usr/share/man/en@quot/man5 /usr/share/man/en@quot/man5x /usr/share/man/en@quot/man6 /usr/share/man/en@quot/man6x /usr/share/man/en@quot/man7 /usr/share/man/en@quot/man7x /usr/share/man/en@quot/man8 /usr/share/man/en@quot/man8x /usr/share/man/en@quot/man9 /usr/share/man/en@quot/man9x /usr/share/man/en@quot/mann /usr/share/man/en@shaw /usr/share/man/en@shaw/man0p /usr/share/man/en@shaw/man1 /usr/share/man/en@shaw/man1p /usr/share/man/en@shaw/man1x /usr/share/man/en@shaw/man2 /usr/share/man/en@shaw/man2x /usr/share/man/en@shaw/man3 /usr/share/man/en@shaw/man3p /usr/share/man/en@shaw/man3x /usr/share/man/en@shaw/man4 /usr/share/man/en@shaw/man4x /usr/share/man/en@shaw/man5 /usr/share/man/en@shaw/man5x /usr/share/man/en@shaw/man6 /usr/share/man/en@shaw/man6x /usr/share/man/en@shaw/man7 /usr/share/man/en@shaw/man7x /usr/share/man/en@shaw/man8 /usr/share/man/en@shaw/man8x /usr/share/man/en@shaw/man9 /usr/share/man/en@shaw/man9x /usr/share/man/en@shaw/mann /usr/share/man/en_US /usr/share/man/en_US/man0p /usr/share/man/en_US/man1 /usr/share/man/en_US/man1p /usr/share/man/en_US/man1x /usr/share/man/en_US/man2 /usr/share/man/en_US/man2x /usr/share/man/en_US/man3 /usr/share/man/en_US/man3p /usr/share/man/en_US/man3x /usr/share/man/en_US/man4 /usr/share/man/en_US/man4x /usr/share/man/en_US/man5 /usr/share/man/en_US/man5x /usr/share/man/en_US/man6 /usr/share/man/en_US/man6x /usr/share/man/en_US/man7 /usr/share/man/en_US/man7x /usr/share/man/en_US/man8 /usr/share/man/en_US/man8x /usr/share/man/en_US/man9 /usr/share/man/en_US/man9x /usr/share/man/en_US/mann /usr/share/man/eo /usr/share/man/eo/man0p /usr/share/man/eo/man1 /usr/share/man/eo/man1p /usr/share/man/eo/man1x /usr/share/man/eo/man2 /usr/share/man/eo/man2x /usr/share/man/eo/man3 /usr/share/man/eo/man3p /usr/share/man/eo/man3x /usr/share/man/eo/man4 /usr/share/man/eo/man4x /usr/share/man/eo/man5 /usr/share/man/eo/man5x /usr/share/man/eo/man6 /usr/share/man/eo/man6x /usr/share/man/eo/man7 /usr/share/man/eo/man7x /usr/share/man/eo/man8 /usr/share/man/eo/man8x /usr/share/man/eo/man9 /usr/share/man/eo/man9x /usr/share/man/eo/mann /usr/share/man/es /usr/share/man/es_AR /usr/share/man/es_AR/man0p /usr/share/man/es_AR/man1 /usr/share/man/es_AR/man1p /usr/share/man/es_AR/man1x /usr/share/man/es_AR/man2 /usr/share/man/es_AR/man2x /usr/share/man/es_AR/man3 /usr/share/man/es_AR/man3p /usr/share/man/es_AR/man3x /usr/share/man/es_AR/man4 /usr/share/man/es_AR/man4x /usr/share/man/es_AR/man5 /usr/share/man/es_AR/man5x /usr/share/man/es_AR/man6 /usr/share/man/es_AR/man6x /usr/share/man/es_AR/man7 /usr/share/man/es_AR/man7x /usr/share/man/es_AR/man8 /usr/share/man/es_AR/man8x /usr/share/man/es_AR/man9 /usr/share/man/es_AR/man9x /usr/share/man/es_AR/mann /usr/share/man/es_CL /usr/share/man/es_CL/man0p /usr/share/man/es_CL/man1 /usr/share/man/es_CL/man1p /usr/share/man/es_CL/man1x /usr/share/man/es_CL/man2 /usr/share/man/es_CL/man2x /usr/share/man/es_CL/man3 /usr/share/man/es_CL/man3p /usr/share/man/es_CL/man3x /usr/share/man/es_CL/man4 /usr/share/man/es_CL/man4x /usr/share/man/es_CL/man5 /usr/share/man/es_CL/man5x /usr/share/man/es_CL/man6 /usr/share/man/es_CL/man6x /usr/share/man/es_CL/man7 /usr/share/man/es_CL/man7x /usr/share/man/es_CL/man8 /usr/share/man/es_CL/man8x /usr/share/man/es_CL/man9 /usr/share/man/es_CL/man9x /usr/share/man/es_CL/mann /usr/share/man/es_CO /usr/share/man/es_CO/man0p /usr/share/man/es_CO/man1 /usr/share/man/es_CO/man1p /usr/share/man/es_CO/man1x /usr/share/man/es_CO/man2 /usr/share/man/es_CO/man2x /usr/share/man/es_CO/man3 /usr/share/man/es_CO/man3p /usr/share/man/es_CO/man3x /usr/share/man/es_CO/man4 /usr/share/man/es_CO/man4x /usr/share/man/es_CO/man5 /usr/share/man/es_CO/man5x /usr/share/man/es_CO/man6 /usr/share/man/es_CO/man6x /usr/share/man/es_CO/man7 /usr/share/man/es_CO/man7x /usr/share/man/es_CO/man8 /usr/share/man/es_CO/man8x /usr/share/man/es_CO/man9 /usr/share/man/es_CO/man9x /usr/share/man/es_CO/mann /usr/share/man/es_CR /usr/share/man/es_CR/man0p /usr/share/man/es_CR/man1 /usr/share/man/es_CR/man1p /usr/share/man/es_CR/man1x /usr/share/man/es_CR/man2 /usr/share/man/es_CR/man2x /usr/share/man/es_CR/man3 /usr/share/man/es_CR/man3p /usr/share/man/es_CR/man3x /usr/share/man/es_CR/man4 /usr/share/man/es_CR/man4x /usr/share/man/es_CR/man5 /usr/share/man/es_CR/man5x /usr/share/man/es_CR/man6 /usr/share/man/es_CR/man6x /usr/share/man/es_CR/man7 /usr/share/man/es_CR/man7x /usr/share/man/es_CR/man8 /usr/share/man/es_CR/man8x /usr/share/man/es_CR/man9 /usr/share/man/es_CR/man9x /usr/share/man/es_CR/mann /usr/share/man/es_DO /usr/share/man/es_DO/man0p /usr/share/man/es_DO/man1 /usr/share/man/es_DO/man1p /usr/share/man/es_DO/man1x /usr/share/man/es_DO/man2 /usr/share/man/es_DO/man2x /usr/share/man/es_DO/man3 /usr/share/man/es_DO/man3p /usr/share/man/es_DO/man3x /usr/share/man/es_DO/man4 /usr/share/man/es_DO/man4x /usr/share/man/es_DO/man5 /usr/share/man/es_DO/man5x /usr/share/man/es_DO/man6 /usr/share/man/es_DO/man6x /usr/share/man/es_DO/man7 /usr/share/man/es_DO/man7x /usr/share/man/es_DO/man8 /usr/share/man/es_DO/man8x /usr/share/man/es_DO/man9 /usr/share/man/es_DO/man9x /usr/share/man/es_DO/mann /usr/share/man/es_EC /usr/share/man/es_EC/man0p /usr/share/man/es_EC/man1 /usr/share/man/es_EC/man1p /usr/share/man/es_EC/man1x /usr/share/man/es_EC/man2 /usr/share/man/es_EC/man2x /usr/share/man/es_EC/man3 /usr/share/man/es_EC/man3p /usr/share/man/es_EC/man3x /usr/share/man/es_EC/man4 /usr/share/man/es_EC/man4x /usr/share/man/es_EC/man5 /usr/share/man/es_EC/man5x /usr/share/man/es_EC/man6 /usr/share/man/es_EC/man6x /usr/share/man/es_EC/man7 /usr/share/man/es_EC/man7x /usr/share/man/es_EC/man8 /usr/share/man/es_EC/man8x /usr/share/man/es_EC/man9 /usr/share/man/es_EC/man9x /usr/share/man/es_EC/mann /usr/share/man/es_ES /usr/share/man/es_ES/man0p /usr/share/man/es_ES/man1 /usr/share/man/es_ES/man1p /usr/share/man/es_ES/man1x /usr/share/man/es_ES/man2 /usr/share/man/es_ES/man2x /usr/share/man/es_ES/man3 /usr/share/man/es_ES/man3p /usr/share/man/es_ES/man3x /usr/share/man/es_ES/man4 /usr/share/man/es_ES/man4x /usr/share/man/es_ES/man5 /usr/share/man/es_ES/man5x /usr/share/man/es_ES/man6 /usr/share/man/es_ES/man6x /usr/share/man/es_ES/man7 /usr/share/man/es_ES/man7x /usr/share/man/es_ES/man8 /usr/share/man/es_ES/man8x /usr/share/man/es_ES/man9 /usr/share/man/es_ES/man9x /usr/share/man/es_ES/mann /usr/share/man/es_GT /usr/share/man/es_GT/man0p /usr/share/man/es_GT/man1 /usr/share/man/es_GT/man1p /usr/share/man/es_GT/man1x /usr/share/man/es_GT/man2 /usr/share/man/es_GT/man2x /usr/share/man/es_GT/man3 /usr/share/man/es_GT/man3p /usr/share/man/es_GT/man3x /usr/share/man/es_GT/man4 /usr/share/man/es_GT/man4x /usr/share/man/es_GT/man5 /usr/share/man/es_GT/man5x /usr/share/man/es_GT/man6 /usr/share/man/es_GT/man6x /usr/share/man/es_GT/man7 /usr/share/man/es_GT/man7x /usr/share/man/es_GT/man8 /usr/share/man/es_GT/man8x /usr/share/man/es_GT/man9 /usr/share/man/es_GT/man9x /usr/share/man/es_GT/mann /usr/share/man/es_HN /usr/share/man/es_HN/man0p /usr/share/man/es_HN/man1 /usr/share/man/es_HN/man1p /usr/share/man/es_HN/man1x /usr/share/man/es_HN/man2 /usr/share/man/es_HN/man2x /usr/share/man/es_HN/man3 /usr/share/man/es_HN/man3p /usr/share/man/es_HN/man3x /usr/share/man/es_HN/man4 /usr/share/man/es_HN/man4x /usr/share/man/es_HN/man5 /usr/share/man/es_HN/man5x /usr/share/man/es_HN/man6 /usr/share/man/es_HN/man6x /usr/share/man/es_HN/man7 /usr/share/man/es_HN/man7x /usr/share/man/es_HN/man8 /usr/share/man/es_HN/man8x /usr/share/man/es_HN/man9 /usr/share/man/es_HN/man9x /usr/share/man/es_HN/mann /usr/share/man/es/man0p /usr/share/man/es/man1 /usr/share/man/es/man1p /usr/share/man/es/man1x /usr/share/man/es/man2 /usr/share/man/es/man2x /usr/share/man/es/man3 /usr/share/man/es/man3p /usr/share/man/es/man3x /usr/share/man/es/man4 /usr/share/man/es/man4x /usr/share/man/es/man5 /usr/share/man/es/man5x /usr/share/man/es/man6 /usr/share/man/es/man6x /usr/share/man/es/man7 /usr/share/man/es/man7x /usr/share/man/es/man8 /usr/share/man/es/man8x /usr/share/man/es/man9 /usr/share/man/es/man9x /usr/share/man/es/mann /usr/share/man/es_MX /usr/share/man/es_MX/man0p /usr/share/man/es_MX/man1 /usr/share/man/es_MX/man1p /usr/share/man/es_MX/man1x /usr/share/man/es_MX/man2 /usr/share/man/es_MX/man2x /usr/share/man/es_MX/man3 /usr/share/man/es_MX/man3p /usr/share/man/es_MX/man3x /usr/share/man/es_MX/man4 /usr/share/man/es_MX/man4x /usr/share/man/es_MX/man5 /usr/share/man/es_MX/man5x /usr/share/man/es_MX/man6 /usr/share/man/es_MX/man6x /usr/share/man/es_MX/man7 /usr/share/man/es_MX/man7x /usr/share/man/es_MX/man8 /usr/share/man/es_MX/man8x /usr/share/man/es_MX/man9 /usr/share/man/es_MX/man9x /usr/share/man/es_MX/mann /usr/share/man/es_NI /usr/share/man/es_NI/man0p /usr/share/man/es_NI/man1 /usr/share/man/es_NI/man1p /usr/share/man/es_NI/man1x /usr/share/man/es_NI/man2 /usr/share/man/es_NI/man2x /usr/share/man/es_NI/man3 /usr/share/man/es_NI/man3p /usr/share/man/es_NI/man3x /usr/share/man/es_NI/man4 /usr/share/man/es_NI/man4x /usr/share/man/es_NI/man5 /usr/share/man/es_NI/man5x /usr/share/man/es_NI/man6 /usr/share/man/es_NI/man6x /usr/share/man/es_NI/man7 /usr/share/man/es_NI/man7x /usr/share/man/es_NI/man8 /usr/share/man/es_NI/man8x /usr/share/man/es_NI/man9 /usr/share/man/es_NI/man9x /usr/share/man/es_NI/mann /usr/share/man/es_PA /usr/share/man/es_PA/man0p /usr/share/man/es_PA/man1 /usr/share/man/es_PA/man1p /usr/share/man/es_PA/man1x /usr/share/man/es_PA/man2 /usr/share/man/es_PA/man2x /usr/share/man/es_PA/man3 /usr/share/man/es_PA/man3p /usr/share/man/es_PA/man3x /usr/share/man/es_PA/man4 /usr/share/man/es_PA/man4x /usr/share/man/es_PA/man5 /usr/share/man/es_PA/man5x /usr/share/man/es_PA/man6 /usr/share/man/es_PA/man6x /usr/share/man/es_PA/man7 /usr/share/man/es_PA/man7x /usr/share/man/es_PA/man8 /usr/share/man/es_PA/man8x /usr/share/man/es_PA/man9 /usr/share/man/es_PA/man9x /usr/share/man/es_PA/mann /usr/share/man/es_PE /usr/share/man/es_PE/man0p /usr/share/man/es_PE/man1 /usr/share/man/es_PE/man1p /usr/share/man/es_PE/man1x /usr/share/man/es_PE/man2 /usr/share/man/es_PE/man2x /usr/share/man/es_PE/man3 /usr/share/man/es_PE/man3p /usr/share/man/es_PE/man3x /usr/share/man/es_PE/man4 /usr/share/man/es_PE/man4x /usr/share/man/es_PE/man5 /usr/share/man/es_PE/man5x /usr/share/man/es_PE/man6 /usr/share/man/es_PE/man6x /usr/share/man/es_PE/man7 /usr/share/man/es_PE/man7x /usr/share/man/es_PE/man8 /usr/share/man/es_PE/man8x /usr/share/man/es_PE/man9 /usr/share/man/es_PE/man9x /usr/share/man/es_PE/mann /usr/share/man/es_PR /usr/share/man/es_PR/man0p /usr/share/man/es_PR/man1 /usr/share/man/es_PR/man1p /usr/share/man/es_PR/man1x /usr/share/man/es_PR/man2 /usr/share/man/es_PR/man2x /usr/share/man/es_PR/man3 /usr/share/man/es_PR/man3p /usr/share/man/es_PR/man3x /usr/share/man/es_PR/man4 /usr/share/man/es_PR/man4x /usr/share/man/es_PR/man5 /usr/share/man/es_PR/man5x /usr/share/man/es_PR/man6 /usr/share/man/es_PR/man6x /usr/share/man/es_PR/man7 /usr/share/man/es_PR/man7x /usr/share/man/es_PR/man8 /usr/share/man/es_PR/man8x /usr/share/man/es_PR/man9 /usr/share/man/es_PR/man9x /usr/share/man/es_PR/mann /usr/share/man/es_SV /usr/share/man/es_SV/man0p /usr/share/man/es_SV/man1 /usr/share/man/es_SV/man1p /usr/share/man/es_SV/man1x /usr/share/man/es_SV/man2 /usr/share/man/es_SV/man2x /usr/share/man/es_SV/man3 /usr/share/man/es_SV/man3p /usr/share/man/es_SV/man3x /usr/share/man/es_SV/man4 /usr/share/man/es_SV/man4x /usr/share/man/es_SV/man5 /usr/share/man/es_SV/man5x /usr/share/man/es_SV/man6 /usr/share/man/es_SV/man6x /usr/share/man/es_SV/man7 /usr/share/man/es_SV/man7x /usr/share/man/es_SV/man8 /usr/share/man/es_SV/man8x /usr/share/man/es_SV/man9 /usr/share/man/es_SV/man9x /usr/share/man/es_SV/mann /usr/share/man/es_UY /usr/share/man/es_UY/man0p /usr/share/man/es_UY/man1 /usr/share/man/es_UY/man1p /usr/share/man/es_UY/man1x /usr/share/man/es_UY/man2 /usr/share/man/es_UY/man2x /usr/share/man/es_UY/man3 /usr/share/man/es_UY/man3p /usr/share/man/es_UY/man3x /usr/share/man/es_UY/man4 /usr/share/man/es_UY/man4x /usr/share/man/es_UY/man5 /usr/share/man/es_UY/man5x /usr/share/man/es_UY/man6 /usr/share/man/es_UY/man6x /usr/share/man/es_UY/man7 /usr/share/man/es_UY/man7x /usr/share/man/es_UY/man8 /usr/share/man/es_UY/man8x /usr/share/man/es_UY/man9 /usr/share/man/es_UY/man9x /usr/share/man/es_UY/mann /usr/share/man/es_VE /usr/share/man/es_VE/man0p /usr/share/man/es_VE/man1 /usr/share/man/es_VE/man1p /usr/share/man/es_VE/man1x /usr/share/man/es_VE/man2 /usr/share/man/es_VE/man2x /usr/share/man/es_VE/man3 /usr/share/man/es_VE/man3p /usr/share/man/es_VE/man3x /usr/share/man/es_VE/man4 /usr/share/man/es_VE/man4x /usr/share/man/es_VE/man5 /usr/share/man/es_VE/man5x /usr/share/man/es_VE/man6 /usr/share/man/es_VE/man6x /usr/share/man/es_VE/man7 /usr/share/man/es_VE/man7x /usr/share/man/es_VE/man8 /usr/share/man/es_VE/man8x /usr/share/man/es_VE/man9 /usr/share/man/es_VE/man9x /usr/share/man/es_VE/mann /usr/share/man/et /usr/share/man/et_EE /usr/share/man/et_EE/man0p /usr/share/man/et_EE/man1 /usr/share/man/et_EE/man1p /usr/share/man/et_EE/man1x /usr/share/man/et_EE/man2 /usr/share/man/et_EE/man2x /usr/share/man/et_EE/man3 /usr/share/man/et_EE/man3p /usr/share/man/et_EE/man3x /usr/share/man/et_EE/man4 /usr/share/man/et_EE/man4x /usr/share/man/et_EE/man5 /usr/share/man/et_EE/man5x /usr/share/man/et_EE/man6 /usr/share/man/et_EE/man6x /usr/share/man/et_EE/man7 /usr/share/man/et_EE/man7x /usr/share/man/et_EE/man8 /usr/share/man/et_EE/man8x /usr/share/man/et_EE/man9 /usr/share/man/et_EE/man9x /usr/share/man/et_EE/mann /usr/share/man/et/man0p /usr/share/man/et/man1 /usr/share/man/et/man1p /usr/share/man/et/man1x /usr/share/man/et/man2 /usr/share/man/et/man2x /usr/share/man/et/man3 /usr/share/man/et/man3p /usr/share/man/et/man3x /usr/share/man/et/man4 /usr/share/man/et/man4x /usr/share/man/et/man5 /usr/share/man/et/man5x /usr/share/man/et/man6 /usr/share/man/et/man6x /usr/share/man/et/man7 /usr/share/man/et/man7x /usr/share/man/et/man8 /usr/share/man/et/man8x /usr/share/man/et/man9 /usr/share/man/et/man9x /usr/share/man/et/mann /usr/share/man/eu /usr/share/man/eu_ES /usr/share/man/eu_ES/man0p /usr/share/man/eu_ES/man1 /usr/share/man/eu_ES/man1p /usr/share/man/eu_ES/man1x /usr/share/man/eu_ES/man2 /usr/share/man/eu_ES/man2x /usr/share/man/eu_ES/man3 /usr/share/man/eu_ES/man3p /usr/share/man/eu_ES/man3x /usr/share/man/eu_ES/man4 /usr/share/man/eu_ES/man4x /usr/share/man/eu_ES/man5 /usr/share/man/eu_ES/man5x /usr/share/man/eu_ES/man6 /usr/share/man/eu_ES/man6x /usr/share/man/eu_ES/man7 /usr/share/man/eu_ES/man7x /usr/share/man/eu_ES/man8 /usr/share/man/eu_ES/man8x /usr/share/man/eu_ES/man9 /usr/share/man/eu_ES/man9x /usr/share/man/eu_ES/mann /usr/share/man/eu/man0p /usr/share/man/eu/man1 /usr/share/man/eu/man1p /usr/share/man/eu/man1x /usr/share/man/eu/man2 /usr/share/man/eu/man2x /usr/share/man/eu/man3 /usr/share/man/eu/man3p /usr/share/man/eu/man3x /usr/share/man/eu/man4 /usr/share/man/eu/man4x /usr/share/man/eu/man5 /usr/share/man/eu/man5x /usr/share/man/eu/man6 /usr/share/man/eu/man6x /usr/share/man/eu/man7 /usr/share/man/eu/man7x /usr/share/man/eu/man8 /usr/share/man/eu/man8x /usr/share/man/eu/man9 /usr/share/man/eu/man9x /usr/share/man/eu/mann /usr/share/man/ewo /usr/share/man/ewo/man0p /usr/share/man/ewo/man1 /usr/share/man/ewo/man1p /usr/share/man/ewo/man1x /usr/share/man/ewo/man2 /usr/share/man/ewo/man2x /usr/share/man/ewo/man3 /usr/share/man/ewo/man3p /usr/share/man/ewo/man3x /usr/share/man/ewo/man4 /usr/share/man/ewo/man4x /usr/share/man/ewo/man5 /usr/share/man/ewo/man5x /usr/share/man/ewo/man6 /usr/share/man/ewo/man6x /usr/share/man/ewo/man7 /usr/share/man/ewo/man7x /usr/share/man/ewo/man8 /usr/share/man/ewo/man8x /usr/share/man/ewo/man9 /usr/share/man/ewo/man9x /usr/share/man/ewo/mann /usr/share/man/fa /usr/share/man/fa_IR /usr/share/man/fa_IR/man0p /usr/share/man/fa_IR/man1 /usr/share/man/fa_IR/man1p /usr/share/man/fa_IR/man1x /usr/share/man/fa_IR/man2 /usr/share/man/fa_IR/man2x /usr/share/man/fa_IR/man3 /usr/share/man/fa_IR/man3p /usr/share/man/fa_IR/man3x /usr/share/man/fa_IR/man4 /usr/share/man/fa_IR/man4x /usr/share/man/fa_IR/man5 /usr/share/man/fa_IR/man5x /usr/share/man/fa_IR/man6 /usr/share/man/fa_IR/man6x /usr/share/man/fa_IR/man7 /usr/share/man/fa_IR/man7x /usr/share/man/fa_IR/man8 /usr/share/man/fa_IR/man8x /usr/share/man/fa_IR/man9 /usr/share/man/fa_IR/man9x /usr/share/man/fa_IR/mann /usr/share/man/fa/man0p /usr/share/man/fa/man1 /usr/share/man/fa/man1p /usr/share/man/fa/man1x /usr/share/man/fa/man2 /usr/share/man/fa/man2x /usr/share/man/fa/man3 /usr/share/man/fa/man3p /usr/share/man/fa/man3x /usr/share/man/fa/man4 /usr/share/man/fa/man4x /usr/share/man/fa/man5 /usr/share/man/fa/man5x /usr/share/man/fa/man6 /usr/share/man/fa/man6x /usr/share/man/fa/man7 /usr/share/man/fa/man7x /usr/share/man/fa/man8 /usr/share/man/fa/man8x /usr/share/man/fa/man9 /usr/share/man/fa/man9x /usr/share/man/fa/mann /usr/share/man/fan /usr/share/man/fan/man0p /usr/share/man/fan/man1 /usr/share/man/fan/man1p /usr/share/man/fan/man1x /usr/share/man/fan/man2 /usr/share/man/fan/man2x /usr/share/man/fan/man3 /usr/share/man/fan/man3p /usr/share/man/fan/man3x /usr/share/man/fan/man4 /usr/share/man/fan/man4x /usr/share/man/fan/man5 /usr/share/man/fan/man5x /usr/share/man/fan/man6 /usr/share/man/fan/man6x /usr/share/man/fan/man7 /usr/share/man/fan/man7x /usr/share/man/fan/man8 /usr/share/man/fan/man8x /usr/share/man/fan/man9 /usr/share/man/fan/man9x /usr/share/man/fan/mann /usr/share/man/fat /usr/share/man/fat/man0p /usr/share/man/fat/man1 /usr/share/man/fat/man1p /usr/share/man/fat/man1x /usr/share/man/fat/man2 /usr/share/man/fat/man2x /usr/share/man/fat/man3 /usr/share/man/fat/man3p /usr/share/man/fat/man3x /usr/share/man/fat/man4 /usr/share/man/fat/man4x /usr/share/man/fat/man5 /usr/share/man/fat/man5x /usr/share/man/fat/man6 /usr/share/man/fat/man6x /usr/share/man/fat/man7 /usr/share/man/fat/man7x /usr/share/man/fat/man8 /usr/share/man/fat/man8x /usr/share/man/fat/man9 /usr/share/man/fat/man9x /usr/share/man/fat/mann /usr/share/man/ff /usr/share/man/ff/man0p /usr/share/man/ff/man1 /usr/share/man/ff/man1p /usr/share/man/ff/man1x /usr/share/man/ff/man2 /usr/share/man/ff/man2x /usr/share/man/ff/man3 /usr/share/man/ff/man3p /usr/share/man/ff/man3x /usr/share/man/ff/man4 /usr/share/man/ff/man4x /usr/share/man/ff/man5 /usr/share/man/ff/man5x /usr/share/man/ff/man6 /usr/share/man/ff/man6x /usr/share/man/ff/man7 /usr/share/man/ff/man7x /usr/share/man/ff/man8 /usr/share/man/ff/man8x /usr/share/man/ff/man9 /usr/share/man/ff/man9x /usr/share/man/ff/mann /usr/share/man/fi /usr/share/man/fi_FI /usr/share/man/fi_FI/man0p /usr/share/man/fi_FI/man1 /usr/share/man/fi_FI/man1p /usr/share/man/fi_FI/man1x /usr/share/man/fi_FI/man2 /usr/share/man/fi_FI/man2x /usr/share/man/fi_FI/man3 /usr/share/man/fi_FI/man3p /usr/share/man/fi_FI/man3x /usr/share/man/fi_FI/man4 /usr/share/man/fi_FI/man4x /usr/share/man/fi_FI/man5 /usr/share/man/fi_FI/man5x /usr/share/man/fi_FI/man6 /usr/share/man/fi_FI/man6x /usr/share/man/fi_FI/man7 /usr/share/man/fi_FI/man7x /usr/share/man/fi_FI/man8 /usr/share/man/fi_FI/man8x /usr/share/man/fi_FI/man9 /usr/share/man/fi_FI/man9x /usr/share/man/fi_FI/mann /usr/share/man/fil /usr/share/man/fil/man0p /usr/share/man/fil/man1 /usr/share/man/fil/man1p /usr/share/man/fil/man1x /usr/share/man/fil/man2 /usr/share/man/fil/man2x /usr/share/man/fil/man3 /usr/share/man/fil/man3p /usr/share/man/fil/man3x /usr/share/man/fil/man4 /usr/share/man/fil/man4x /usr/share/man/fil/man5 /usr/share/man/fil/man5x /usr/share/man/fil/man6 /usr/share/man/fil/man6x /usr/share/man/fil/man7 /usr/share/man/fil/man7x /usr/share/man/fil/man8 /usr/share/man/fil/man8x /usr/share/man/fil/man9 /usr/share/man/fil/man9x /usr/share/man/fil/mann /usr/share/man/fi/man0p /usr/share/man/fi/man1 /usr/share/man/fi/man1p /usr/share/man/fi/man1x /usr/share/man/fi/man2 /usr/share/man/fi/man2x /usr/share/man/fi/man3 /usr/share/man/fi/man3p /usr/share/man/fi/man3x /usr/share/man/fi/man4 /usr/share/man/fi/man4x /usr/share/man/fi/man5 /usr/share/man/fi/man5x /usr/share/man/fi/man6 /usr/share/man/fi/man6x /usr/share/man/fi/man7 /usr/share/man/fi/man7x /usr/share/man/fi/man8 /usr/share/man/fi/man8x /usr/share/man/fi/man9 /usr/share/man/fi/man9x /usr/share/man/fi/mann /usr/share/man/fiu /usr/share/man/fiu/man0p /usr/share/man/fiu/man1 /usr/share/man/fiu/man1p /usr/share/man/fiu/man1x /usr/share/man/fiu/man2 /usr/share/man/fiu/man2x /usr/share/man/fiu/man3 /usr/share/man/fiu/man3p /usr/share/man/fiu/man3x /usr/share/man/fiu/man4 /usr/share/man/fiu/man4x /usr/share/man/fiu/man5 /usr/share/man/fiu/man5x /usr/share/man/fiu/man6 /usr/share/man/fiu/man6x /usr/share/man/fiu/man7 /usr/share/man/fiu/man7x /usr/share/man/fiu/man8 /usr/share/man/fiu/man8x /usr/share/man/fiu/man9 /usr/share/man/fiu/man9x /usr/share/man/fiu/mann /usr/share/man/fj /usr/share/man/fj/man0p /usr/share/man/fj/man1 /usr/share/man/fj/man1p /usr/share/man/fj/man1x /usr/share/man/fj/man2 /usr/share/man/fj/man2x /usr/share/man/fj/man3 /usr/share/man/fj/man3p /usr/share/man/fj/man3x /usr/share/man/fj/man4 /usr/share/man/fj/man4x /usr/share/man/fj/man5 /usr/share/man/fj/man5x /usr/share/man/fj/man6 /usr/share/man/fj/man6x /usr/share/man/fj/man7 /usr/share/man/fj/man7x /usr/share/man/fj/man8 /usr/share/man/fj/man8x /usr/share/man/fj/man9 /usr/share/man/fj/man9x /usr/share/man/fj/mann /usr/share/man/fo /usr/share/man/fo/man0p /usr/share/man/fo/man1 /usr/share/man/fo/man1p /usr/share/man/fo/man1x /usr/share/man/fo/man2 /usr/share/man/fo/man2x /usr/share/man/fo/man3 /usr/share/man/fo/man3p /usr/share/man/fo/man3x /usr/share/man/fo/man4 /usr/share/man/fo/man4x /usr/share/man/fo/man5 /usr/share/man/fo/man5x /usr/share/man/fo/man6 /usr/share/man/fo/man6x /usr/share/man/fo/man7 /usr/share/man/fo/man7x /usr/share/man/fo/man8 /usr/share/man/fo/man8x /usr/share/man/fo/man9 /usr/share/man/fo/man9x /usr/share/man/fo/mann /usr/share/man/fon /usr/share/man/fon/man0p /usr/share/man/fon/man1 /usr/share/man/fon/man1p /usr/share/man/fon/man1x /usr/share/man/fon/man2 /usr/share/man/fon/man2x /usr/share/man/fon/man3 /usr/share/man/fon/man3p /usr/share/man/fon/man3x /usr/share/man/fon/man4 /usr/share/man/fon/man4x /usr/share/man/fon/man5 /usr/share/man/fon/man5x /usr/share/man/fon/man6 /usr/share/man/fon/man6x /usr/share/man/fon/man7 /usr/share/man/fon/man7x /usr/share/man/fon/man8 /usr/share/man/fon/man8x /usr/share/man/fon/man9 /usr/share/man/fon/man9x /usr/share/man/fon/mann /usr/share/man/fr /usr/share/man/fr_BE /usr/share/man/fr_BE/man0p /usr/share/man/fr_BE/man1 /usr/share/man/fr_BE/man1p /usr/share/man/fr_BE/man1x /usr/share/man/fr_BE/man2 /usr/share/man/fr_BE/man2x /usr/share/man/fr_BE/man3 /usr/share/man/fr_BE/man3p /usr/share/man/fr_BE/man3x /usr/share/man/fr_BE/man4 /usr/share/man/fr_BE/man4x /usr/share/man/fr_BE/man5 /usr/share/man/fr_BE/man5x /usr/share/man/fr_BE/man6 /usr/share/man/fr_BE/man6x /usr/share/man/fr_BE/man7 /usr/share/man/fr_BE/man7x /usr/share/man/fr_BE/man8 /usr/share/man/fr_BE/man8x /usr/share/man/fr_BE/man9 /usr/share/man/fr_BE/man9x /usr/share/man/fr_BE/mann /usr/share/man/fr_CA /usr/share/man/fr_CA/man0p /usr/share/man/fr_CA/man1 /usr/share/man/fr_CA/man1p /usr/share/man/fr_CA/man1x /usr/share/man/fr_CA/man2 /usr/share/man/fr_CA/man2x /usr/share/man/fr_CA/man3 /usr/share/man/fr_CA/man3p /usr/share/man/fr_CA/man3x /usr/share/man/fr_CA/man4 /usr/share/man/fr_CA/man4x /usr/share/man/fr_CA/man5 /usr/share/man/fr_CA/man5x /usr/share/man/fr_CA/man6 /usr/share/man/fr_CA/man6x /usr/share/man/fr_CA/man7 /usr/share/man/fr_CA/man7x /usr/share/man/fr_CA/man8 /usr/share/man/fr_CA/man8x /usr/share/man/fr_CA/man9 /usr/share/man/fr_CA/man9x /usr/share/man/fr_CA/mann /usr/share/man/fr_CH /usr/share/man/fr_CH/man0p /usr/share/man/fr_CH/man1 /usr/share/man/fr_CH/man1p /usr/share/man/fr_CH/man1x /usr/share/man/fr_CH/man2 /usr/share/man/fr_CH/man2x /usr/share/man/fr_CH/man3 /usr/share/man/fr_CH/man3p /usr/share/man/fr_CH/man3x /usr/share/man/fr_CH/man4 /usr/share/man/fr_CH/man4x /usr/share/man/fr_CH/man5 /usr/share/man/fr_CH/man5x /usr/share/man/fr_CH/man6 /usr/share/man/fr_CH/man6x /usr/share/man/fr_CH/man7 /usr/share/man/fr_CH/man7x /usr/share/man/fr_CH/man8 /usr/share/man/fr_CH/man8x /usr/share/man/fr_CH/man9 /usr/share/man/fr_CH/man9x /usr/share/man/fr_CH/mann /usr/share/man/fr_FR /usr/share/man/fr_FR/man0p /usr/share/man/fr_FR/man1 /usr/share/man/fr_FR/man1p /usr/share/man/fr_FR/man1x /usr/share/man/fr_FR/man2 /usr/share/man/fr_FR/man2x /usr/share/man/fr_FR/man3 /usr/share/man/fr_FR/man3p /usr/share/man/fr_FR/man3x /usr/share/man/fr_FR/man4 /usr/share/man/fr_FR/man4x /usr/share/man/fr_FR/man5 /usr/share/man/fr_FR/man5x /usr/share/man/fr_FR/man6 /usr/share/man/fr_FR/man6x /usr/share/man/fr_FR/man7 /usr/share/man/fr_FR/man7x /usr/share/man/fr_FR/man8 /usr/share/man/fr_FR/man8x /usr/share/man/fr_FR/man9 /usr/share/man/fr_FR/man9x /usr/share/man/fr_FR/mann /usr/share/man/frm /usr/share/man/fr/man0p /usr/share/man/fr/man1 /usr/share/man/fr/man1p /usr/share/man/fr/man1x /usr/share/man/fr/man2 /usr/share/man/fr/man2x /usr/share/man/fr/man3 /usr/share/man/fr/man3p /usr/share/man/fr/man3x /usr/share/man/fr/man4 /usr/share/man/fr/man4x /usr/share/man/fr/man5 /usr/share/man/fr/man5x /usr/share/man/fr/man6 /usr/share/man/fr/man6x /usr/share/man/fr/man7 /usr/share/man/fr/man7x /usr/share/man/fr/man8 /usr/share/man/fr/man8x /usr/share/man/fr/man9 /usr/share/man/fr/man9x /usr/share/man/fr/mann /usr/share/man/frm/man0p /usr/share/man/frm/man1 /usr/share/man/frm/man1p /usr/share/man/frm/man1x /usr/share/man/frm/man2 /usr/share/man/frm/man2x /usr/share/man/frm/man3 /usr/share/man/frm/man3p /usr/share/man/frm/man3x /usr/share/man/frm/man4 /usr/share/man/frm/man4x /usr/share/man/frm/man5 /usr/share/man/frm/man5x /usr/share/man/frm/man6 /usr/share/man/frm/man6x /usr/share/man/frm/man7 /usr/share/man/frm/man7x /usr/share/man/frm/man8 /usr/share/man/frm/man8x /usr/share/man/frm/man9 /usr/share/man/frm/man9x /usr/share/man/frm/mann /usr/share/man/fro /usr/share/man/fro/man0p /usr/share/man/fro/man1 /usr/share/man/fro/man1p /usr/share/man/fro/man1x /usr/share/man/fro/man2 /usr/share/man/fro/man2x /usr/share/man/fro/man3 /usr/share/man/fro/man3p /usr/share/man/fro/man3x /usr/share/man/fro/man4 /usr/share/man/fro/man4x /usr/share/man/fro/man5 /usr/share/man/fro/man5x /usr/share/man/fro/man6 /usr/share/man/fro/man6x /usr/share/man/fro/man7 /usr/share/man/fro/man7x /usr/share/man/fro/man8 /usr/share/man/fro/man8x /usr/share/man/fro/man9 /usr/share/man/fro/man9x /usr/share/man/fro/mann /usr/share/man/frr /usr/share/man/frr/man0p /usr/share/man/frr/man1 /usr/share/man/frr/man1p /usr/share/man/frr/man1x /usr/share/man/frr/man2 /usr/share/man/frr/man2x /usr/share/man/frr/man3 /usr/share/man/frr/man3p /usr/share/man/frr/man3x /usr/share/man/frr/man4 /usr/share/man/frr/man4x /usr/share/man/frr/man5 /usr/share/man/frr/man5x /usr/share/man/frr/man6 /usr/share/man/frr/man6x /usr/share/man/frr/man7 /usr/share/man/frr/man7x /usr/share/man/frr/man8 /usr/share/man/frr/man8x /usr/share/man/frr/man9 /usr/share/man/frr/man9x /usr/share/man/frr/mann /usr/share/man/frs /usr/share/man/frs/man0p /usr/share/man/frs/man1 /usr/share/man/frs/man1p /usr/share/man/frs/man1x /usr/share/man/frs/man2 /usr/share/man/frs/man2x /usr/share/man/frs/man3 /usr/share/man/frs/man3p /usr/share/man/frs/man3x /usr/share/man/frs/man4 /usr/share/man/frs/man4x /usr/share/man/frs/man5 /usr/share/man/frs/man5x /usr/share/man/frs/man6 /usr/share/man/frs/man6x /usr/share/man/frs/man7 /usr/share/man/frs/man7x /usr/share/man/frs/man8 /usr/share/man/frs/man8x /usr/share/man/frs/man9 /usr/share/man/frs/man9x /usr/share/man/frs/mann /usr/share/man/fur /usr/share/man/fur/man0p /usr/share/man/fur/man1 /usr/share/man/fur/man1p /usr/share/man/fur/man1x /usr/share/man/fur/man2 /usr/share/man/fur/man2x /usr/share/man/fur/man3 /usr/share/man/fur/man3p /usr/share/man/fur/man3x /usr/share/man/fur/man4 /usr/share/man/fur/man4x /usr/share/man/fur/man5 /usr/share/man/fur/man5x /usr/share/man/fur/man6 /usr/share/man/fur/man6x /usr/share/man/fur/man7 /usr/share/man/fur/man7x /usr/share/man/fur/man8 /usr/share/man/fur/man8x /usr/share/man/fur/man9 /usr/share/man/fur/man9x /usr/share/man/fur/mann /usr/share/man/fy /usr/share/man/fy/man0p /usr/share/man/fy/man1 /usr/share/man/fy/man1p /usr/share/man/fy/man1x /usr/share/man/fy/man2 /usr/share/man/fy/man2x /usr/share/man/fy/man3 /usr/share/man/fy/man3p /usr/share/man/fy/man3x /usr/share/man/fy/man4 /usr/share/man/fy/man4x /usr/share/man/fy/man5 /usr/share/man/fy/man5x /usr/share/man/fy/man6 /usr/share/man/fy/man6x /usr/share/man/fy/man7 /usr/share/man/fy/man7x /usr/share/man/fy/man8 /usr/share/man/fy/man8x /usr/share/man/fy/man9 /usr/share/man/fy/man9x /usr/share/man/fy/mann /usr/share/man/ga /usr/share/man/gaa /usr/share/man/gaa/man0p /usr/share/man/gaa/man1 /usr/share/man/gaa/man1p /usr/share/man/gaa/man1x /usr/share/man/gaa/man2 /usr/share/man/gaa/man2x /usr/share/man/gaa/man3 /usr/share/man/gaa/man3p /usr/share/man/gaa/man3x /usr/share/man/gaa/man4 /usr/share/man/gaa/man4x /usr/share/man/gaa/man5 /usr/share/man/gaa/man5x /usr/share/man/gaa/man6 /usr/share/man/gaa/man6x /usr/share/man/gaa/man7 /usr/share/man/gaa/man7x /usr/share/man/gaa/man8 /usr/share/man/gaa/man8x /usr/share/man/gaa/man9 /usr/share/man/gaa/man9x /usr/share/man/gaa/mann /usr/share/man/ga/man0p /usr/share/man/ga/man1 /usr/share/man/ga/man1p /usr/share/man/ga/man1x /usr/share/man/ga/man2 /usr/share/man/ga/man2x /usr/share/man/ga/man3 /usr/share/man/ga/man3p /usr/share/man/ga/man3x /usr/share/man/ga/man4 /usr/share/man/ga/man4x /usr/share/man/ga/man5 /usr/share/man/ga/man5x /usr/share/man/ga/man6 /usr/share/man/ga/man6x /usr/share/man/ga/man7 /usr/share/man/ga/man7x /usr/share/man/ga/man8 /usr/share/man/ga/man8x /usr/share/man/ga/man9 /usr/share/man/ga/man9x /usr/share/man/ga/mann /usr/share/man/gay /usr/share/man/gay/man0p /usr/share/man/gay/man1 /usr/share/man/gay/man1p /usr/share/man/gay/man1x /usr/share/man/gay/man2 /usr/share/man/gay/man2x /usr/share/man/gay/man3 /usr/share/man/gay/man3p /usr/share/man/gay/man3x /usr/share/man/gay/man4 /usr/share/man/gay/man4x /usr/share/man/gay/man5 /usr/share/man/gay/man5x /usr/share/man/gay/man6 /usr/share/man/gay/man6x /usr/share/man/gay/man7 /usr/share/man/gay/man7x /usr/share/man/gay/man8 /usr/share/man/gay/man8x /usr/share/man/gay/man9 /usr/share/man/gay/man9x /usr/share/man/gay/mann /usr/share/man/gba /usr/share/man/gba/man0p /usr/share/man/gba/man1 /usr/share/man/gba/man1p /usr/share/man/gba/man1x /usr/share/man/gba/man2 /usr/share/man/gba/man2x /usr/share/man/gba/man3 /usr/share/man/gba/man3p /usr/share/man/gba/man3x /usr/share/man/gba/man4 /usr/share/man/gba/man4x /usr/share/man/gba/man5 /usr/share/man/gba/man5x /usr/share/man/gba/man6 /usr/share/man/gba/man6x /usr/share/man/gba/man7 /usr/share/man/gba/man7x /usr/share/man/gba/man8 /usr/share/man/gba/man8x /usr/share/man/gba/man9 /usr/share/man/gba/man9x /usr/share/man/gba/mann /usr/share/man/gd /usr/share/man/gd/man0p /usr/share/man/gd/man1 /usr/share/man/gd/man1p /usr/share/man/gd/man1x /usr/share/man/gd/man2 /usr/share/man/gd/man2x /usr/share/man/gd/man3 /usr/share/man/gd/man3p /usr/share/man/gd/man3x /usr/share/man/gd/man4 /usr/share/man/gd/man4x /usr/share/man/gd/man5 /usr/share/man/gd/man5x /usr/share/man/gd/man6 /usr/share/man/gd/man6x /usr/share/man/gd/man7 /usr/share/man/gd/man7x /usr/share/man/gd/man8 /usr/share/man/gd/man8x /usr/share/man/gd/man9 /usr/share/man/gd/man9x /usr/share/man/gd/mann /usr/share/man/gem /usr/share/man/gem/man0p /usr/share/man/gem/man1 /usr/share/man/gem/man1p /usr/share/man/gem/man1x /usr/share/man/gem/man2 /usr/share/man/gem/man2x /usr/share/man/gem/man3 /usr/share/man/gem/man3p /usr/share/man/gem/man3x /usr/share/man/gem/man4 /usr/share/man/gem/man4x /usr/share/man/gem/man5 /usr/share/man/gem/man5x /usr/share/man/gem/man6 /usr/share/man/gem/man6x /usr/share/man/gem/man7 /usr/share/man/gem/man7x /usr/share/man/gem/man8 /usr/share/man/gem/man8x /usr/share/man/gem/man9 /usr/share/man/gem/man9x /usr/share/man/gem/mann /usr/share/man/gez /usr/share/man/gez/man0p /usr/share/man/gez/man1 /usr/share/man/gez/man1p /usr/share/man/gez/man1x /usr/share/man/gez/man2 /usr/share/man/gez/man2x /usr/share/man/gez/man3 /usr/share/man/gez/man3p /usr/share/man/gez/man3x /usr/share/man/gez/man4 /usr/share/man/gez/man4x /usr/share/man/gez/man5 /usr/share/man/gez/man5x /usr/share/man/gez/man6 /usr/share/man/gez/man6x /usr/share/man/gez/man7 /usr/share/man/gez/man7x /usr/share/man/gez/man8 /usr/share/man/gez/man8x /usr/share/man/gez/man9 /usr/share/man/gez/man9x /usr/share/man/gez/mann /usr/share/man/gil /usr/share/man/gil/man0p /usr/share/man/gil/man1 /usr/share/man/gil/man1p /usr/share/man/gil/man1x /usr/share/man/gil/man2 /usr/share/man/gil/man2x /usr/share/man/gil/man3 /usr/share/man/gil/man3p /usr/share/man/gil/man3x /usr/share/man/gil/man4 /usr/share/man/gil/man4x /usr/share/man/gil/man5 /usr/share/man/gil/man5x /usr/share/man/gil/man6 /usr/share/man/gil/man6x /usr/share/man/gil/man7 /usr/share/man/gil/man7x /usr/share/man/gil/man8 /usr/share/man/gil/man8x /usr/share/man/gil/man9 /usr/share/man/gil/man9x /usr/share/man/gil/mann /usr/share/man/gl /usr/share/man/gl_ES /usr/share/man/gl_ES/man0p /usr/share/man/gl_ES/man1 /usr/share/man/gl_ES/man1p /usr/share/man/gl_ES/man1x /usr/share/man/gl_ES/man2 /usr/share/man/gl_ES/man2x /usr/share/man/gl_ES/man3 /usr/share/man/gl_ES/man3p /usr/share/man/gl_ES/man3x /usr/share/man/gl_ES/man4 /usr/share/man/gl_ES/man4x /usr/share/man/gl_ES/man5 /usr/share/man/gl_ES/man5x /usr/share/man/gl_ES/man6 /usr/share/man/gl_ES/man6x /usr/share/man/gl_ES/man7 /usr/share/man/gl_ES/man7x /usr/share/man/gl_ES/man8 /usr/share/man/gl_ES/man8x /usr/share/man/gl_ES/man9 /usr/share/man/gl_ES/man9x /usr/share/man/gl_ES/mann /usr/share/man/gl/man0p /usr/share/man/gl/man1 /usr/share/man/gl/man1p /usr/share/man/gl/man1x /usr/share/man/gl/man2 /usr/share/man/gl/man2x /usr/share/man/gl/man3 /usr/share/man/gl/man3p /usr/share/man/gl/man3x /usr/share/man/gl/man4 /usr/share/man/gl/man4x /usr/share/man/gl/man5 /usr/share/man/gl/man5x /usr/share/man/gl/man6 /usr/share/man/gl/man6x /usr/share/man/gl/man7 /usr/share/man/gl/man7x /usr/share/man/gl/man8 /usr/share/man/gl/man8x /usr/share/man/gl/man9 /usr/share/man/gl/man9x /usr/share/man/gl/mann /usr/share/man/gmh /usr/share/man/gmh/man0p /usr/share/man/gmh/man1 /usr/share/man/gmh/man1p /usr/share/man/gmh/man1x /usr/share/man/gmh/man2 /usr/share/man/gmh/man2x /usr/share/man/gmh/man3 /usr/share/man/gmh/man3p /usr/share/man/gmh/man3x /usr/share/man/gmh/man4 /usr/share/man/gmh/man4x /usr/share/man/gmh/man5 /usr/share/man/gmh/man5x /usr/share/man/gmh/man6 /usr/share/man/gmh/man6x /usr/share/man/gmh/man7 /usr/share/man/gmh/man7x /usr/share/man/gmh/man8 /usr/share/man/gmh/man8x /usr/share/man/gmh/man9 /usr/share/man/gmh/man9x /usr/share/man/gmh/mann /usr/share/man/gn /usr/share/man/gn/man0p /usr/share/man/gn/man1 /usr/share/man/gn/man1p /usr/share/man/gn/man1x /usr/share/man/gn/man2 /usr/share/man/gn/man2x /usr/share/man/gn/man3 /usr/share/man/gn/man3p /usr/share/man/gn/man3x /usr/share/man/gn/man4 /usr/share/man/gn/man4x /usr/share/man/gn/man5 /usr/share/man/gn/man5x /usr/share/man/gn/man6 /usr/share/man/gn/man6x /usr/share/man/gn/man7 /usr/share/man/gn/man7x /usr/share/man/gn/man8 /usr/share/man/gn/man8x /usr/share/man/gn/man9 /usr/share/man/gn/man9x /usr/share/man/gn/mann /usr/share/man/goh /usr/share/man/goh/man0p /usr/share/man/goh/man1 /usr/share/man/goh/man1p /usr/share/man/goh/man1x /usr/share/man/goh/man2 /usr/share/man/goh/man2x /usr/share/man/goh/man3 /usr/share/man/goh/man3p /usr/share/man/goh/man3x /usr/share/man/goh/man4 /usr/share/man/goh/man4x /usr/share/man/goh/man5 /usr/share/man/goh/man5x /usr/share/man/goh/man6 /usr/share/man/goh/man6x /usr/share/man/goh/man7 /usr/share/man/goh/man7x /usr/share/man/goh/man8 /usr/share/man/goh/man8x /usr/share/man/goh/man9 /usr/share/man/goh/man9x /usr/share/man/goh/mann /usr/share/man/gon /usr/share/man/gon/man0p /usr/share/man/gon/man1 /usr/share/man/gon/man1p /usr/share/man/gon/man1x /usr/share/man/gon/man2 /usr/share/man/gon/man2x /usr/share/man/gon/man3 /usr/share/man/gon/man3p /usr/share/man/gon/man3x /usr/share/man/gon/man4 /usr/share/man/gon/man4x /usr/share/man/gon/man5 /usr/share/man/gon/man5x /usr/share/man/gon/man6 /usr/share/man/gon/man6x /usr/share/man/gon/man7 /usr/share/man/gon/man7x /usr/share/man/gon/man8 /usr/share/man/gon/man8x /usr/share/man/gon/man9 /usr/share/man/gon/man9x /usr/share/man/gon/mann /usr/share/man/gor /usr/share/man/gor/man0p /usr/share/man/gor/man1 /usr/share/man/gor/man1p /usr/share/man/gor/man1x /usr/share/man/gor/man2 /usr/share/man/gor/man2x /usr/share/man/gor/man3 /usr/share/man/gor/man3p /usr/share/man/gor/man3x /usr/share/man/gor/man4 /usr/share/man/gor/man4x /usr/share/man/gor/man5 /usr/share/man/gor/man5x /usr/share/man/gor/man6 /usr/share/man/gor/man6x /usr/share/man/gor/man7 /usr/share/man/gor/man7x /usr/share/man/gor/man8 /usr/share/man/gor/man8x /usr/share/man/gor/man9 /usr/share/man/gor/man9x /usr/share/man/gor/mann /usr/share/man/got /usr/share/man/got/man0p /usr/share/man/got/man1 /usr/share/man/got/man1p /usr/share/man/got/man1x /usr/share/man/got/man2 /usr/share/man/got/man2x /usr/share/man/got/man3 /usr/share/man/got/man3p /usr/share/man/got/man3x /usr/share/man/got/man4 /usr/share/man/got/man4x /usr/share/man/got/man5 /usr/share/man/got/man5x /usr/share/man/got/man6 /usr/share/man/got/man6x /usr/share/man/got/man7 /usr/share/man/got/man7x /usr/share/man/got/man8 /usr/share/man/got/man8x /usr/share/man/got/man9 /usr/share/man/got/man9x /usr/share/man/got/mann /usr/share/man/grb /usr/share/man/grb/man0p /usr/share/man/grb/man1 /usr/share/man/grb/man1p /usr/share/man/grb/man1x /usr/share/man/grb/man2 /usr/share/man/grb/man2x /usr/share/man/grb/man3 /usr/share/man/grb/man3p /usr/share/man/grb/man3x /usr/share/man/grb/man4 /usr/share/man/grb/man4x /usr/share/man/grb/man5 /usr/share/man/grb/man5x /usr/share/man/grb/man6 /usr/share/man/grb/man6x /usr/share/man/grb/man7 /usr/share/man/grb/man7x /usr/share/man/grb/man8 /usr/share/man/grb/man8x /usr/share/man/grb/man9 /usr/share/man/grb/man9x /usr/share/man/grb/mann /usr/share/man/grc /usr/share/man/grc/man0p /usr/share/man/grc/man1 /usr/share/man/grc/man1p /usr/share/man/grc/man1x /usr/share/man/grc/man2 /usr/share/man/grc/man2x /usr/share/man/grc/man3 /usr/share/man/grc/man3p /usr/share/man/grc/man3x /usr/share/man/grc/man4 /usr/share/man/grc/man4x /usr/share/man/grc/man5 /usr/share/man/grc/man5x /usr/share/man/grc/man6 /usr/share/man/grc/man6x /usr/share/man/grc/man7 /usr/share/man/grc/man7x /usr/share/man/grc/man8 /usr/share/man/grc/man8x /usr/share/man/grc/man9 /usr/share/man/grc/man9x /usr/share/man/grc/mann /usr/share/man/gsw /usr/share/man/gsw/man0p /usr/share/man/gsw/man1 /usr/share/man/gsw/man1p /usr/share/man/gsw/man1x /usr/share/man/gsw/man2 /usr/share/man/gsw/man2x /usr/share/man/gsw/man3 /usr/share/man/gsw/man3p /usr/share/man/gsw/man3x /usr/share/man/gsw/man4 /usr/share/man/gsw/man4x /usr/share/man/gsw/man5 /usr/share/man/gsw/man5x /usr/share/man/gsw/man6 /usr/share/man/gsw/man6x /usr/share/man/gsw/man7 /usr/share/man/gsw/man7x /usr/share/man/gsw/man8 /usr/share/man/gsw/man8x /usr/share/man/gsw/man9 /usr/share/man/gsw/man9x /usr/share/man/gsw/mann /usr/share/man/gu /usr/share/man/gu/man0p /usr/share/man/gu/man1 /usr/share/man/gu/man1p /usr/share/man/gu/man1x /usr/share/man/gu/man2 /usr/share/man/gu/man2x /usr/share/man/gu/man3 /usr/share/man/gu/man3p /usr/share/man/gu/man3x /usr/share/man/gu/man4 /usr/share/man/gu/man4x /usr/share/man/gu/man5 /usr/share/man/gu/man5x /usr/share/man/gu/man6 /usr/share/man/gu/man6x /usr/share/man/gu/man7 /usr/share/man/gu/man7x /usr/share/man/gu/man8 /usr/share/man/gu/man8x /usr/share/man/gu/man9 /usr/share/man/gu/man9x /usr/share/man/gu/mann /usr/share/man/gv /usr/share/man/gv/man0p /usr/share/man/gv/man1 /usr/share/man/gv/man1p /usr/share/man/gv/man1x /usr/share/man/gv/man2 /usr/share/man/gv/man2x /usr/share/man/gv/man3 /usr/share/man/gv/man3p /usr/share/man/gv/man3x /usr/share/man/gv/man4 /usr/share/man/gv/man4x /usr/share/man/gv/man5 /usr/share/man/gv/man5x /usr/share/man/gv/man6 /usr/share/man/gv/man6x /usr/share/man/gv/man7 /usr/share/man/gv/man7x /usr/share/man/gv/man8 /usr/share/man/gv/man8x /usr/share/man/gv/man9 /usr/share/man/gv/man9x /usr/share/man/gv/mann /usr/share/man/gwi /usr/share/man/gwi/man0p /usr/share/man/gwi/man1 /usr/share/man/gwi/man1p /usr/share/man/gwi/man1x /usr/share/man/gwi/man2 /usr/share/man/gwi/man2x /usr/share/man/gwi/man3 /usr/share/man/gwi/man3p /usr/share/man/gwi/man3x /usr/share/man/gwi/man4 /usr/share/man/gwi/man4x /usr/share/man/gwi/man5 /usr/share/man/gwi/man5x /usr/share/man/gwi/man6 /usr/share/man/gwi/man6x /usr/share/man/gwi/man7 /usr/share/man/gwi/man7x /usr/share/man/gwi/man8 /usr/share/man/gwi/man8x /usr/share/man/gwi/man9 /usr/share/man/gwi/man9x /usr/share/man/gwi/mann /usr/share/man/ha /usr/share/man/hai /usr/share/man/hai/man0p /usr/share/man/hai/man1 /usr/share/man/hai/man1p /usr/share/man/hai/man1x /usr/share/man/hai/man2 /usr/share/man/hai/man2x /usr/share/man/hai/man3 /usr/share/man/hai/man3p /usr/share/man/hai/man3x /usr/share/man/hai/man4 /usr/share/man/hai/man4x /usr/share/man/hai/man5 /usr/share/man/hai/man5x /usr/share/man/hai/man6 /usr/share/man/hai/man6x /usr/share/man/hai/man7 /usr/share/man/hai/man7x /usr/share/man/hai/man8 /usr/share/man/hai/man8x /usr/share/man/hai/man9 /usr/share/man/hai/man9x /usr/share/man/hai/mann /usr/share/man/ha/man0p /usr/share/man/ha/man1 /usr/share/man/ha/man1p /usr/share/man/ha/man1x /usr/share/man/ha/man2 /usr/share/man/ha/man2x /usr/share/man/ha/man3 /usr/share/man/ha/man3p /usr/share/man/ha/man3x /usr/share/man/ha/man4 /usr/share/man/ha/man4x /usr/share/man/ha/man5 /usr/share/man/ha/man5x /usr/share/man/ha/man6 /usr/share/man/ha/man6x /usr/share/man/ha/man7 /usr/share/man/ha/man7x /usr/share/man/ha/man8 /usr/share/man/ha/man8x /usr/share/man/ha/man9 /usr/share/man/ha/man9x /usr/share/man/ha/mann /usr/share/man/haw /usr/share/man/haw/man0p /usr/share/man/haw/man1 /usr/share/man/haw/man1p /usr/share/man/haw/man1x /usr/share/man/haw/man2 /usr/share/man/haw/man2x /usr/share/man/haw/man3 /usr/share/man/haw/man3p /usr/share/man/haw/man3x /usr/share/man/haw/man4 /usr/share/man/haw/man4x /usr/share/man/haw/man5 /usr/share/man/haw/man5x /usr/share/man/haw/man6 /usr/share/man/haw/man6x /usr/share/man/haw/man7 /usr/share/man/haw/man7x /usr/share/man/haw/man8 /usr/share/man/haw/man8x /usr/share/man/haw/man9 /usr/share/man/haw/man9x /usr/share/man/haw/mann /usr/share/man/he /usr/share/man/he_IL /usr/share/man/he_IL/man0p /usr/share/man/he_IL/man1 /usr/share/man/he_IL/man1p /usr/share/man/he_IL/man1x /usr/share/man/he_IL/man2 /usr/share/man/he_IL/man2x /usr/share/man/he_IL/man3 /usr/share/man/he_IL/man3p /usr/share/man/he_IL/man3x /usr/share/man/he_IL/man4 /usr/share/man/he_IL/man4x /usr/share/man/he_IL/man5 /usr/share/man/he_IL/man5x /usr/share/man/he_IL/man6 /usr/share/man/he_IL/man6x /usr/share/man/he_IL/man7 /usr/share/man/he_IL/man7x /usr/share/man/he_IL/man8 /usr/share/man/he_IL/man8x /usr/share/man/he_IL/man9 /usr/share/man/he_IL/man9x /usr/share/man/he_IL/mann /usr/share/man/he/man0p /usr/share/man/he/man1 /usr/share/man/he/man1p /usr/share/man/he/man1x /usr/share/man/he/man2 /usr/share/man/he/man2x /usr/share/man/he/man3 /usr/share/man/he/man3p /usr/share/man/he/man3x /usr/share/man/he/man4 /usr/share/man/he/man4x /usr/share/man/he/man5 /usr/share/man/he/man5x /usr/share/man/he/man6 /usr/share/man/he/man6x /usr/share/man/he/man7 /usr/share/man/he/man7x /usr/share/man/he/man8 /usr/share/man/he/man8x /usr/share/man/he/man9 /usr/share/man/he/man9x /usr/share/man/he/mann /usr/share/man/hi /usr/share/man/hil /usr/share/man/hil/man0p /usr/share/man/hil/man1 /usr/share/man/hil/man1p /usr/share/man/hil/man1x /usr/share/man/hil/man2 /usr/share/man/hil/man2x /usr/share/man/hil/man3 /usr/share/man/hil/man3p /usr/share/man/hil/man3x /usr/share/man/hil/man4 /usr/share/man/hil/man4x /usr/share/man/hil/man5 /usr/share/man/hil/man5x /usr/share/man/hil/man6 /usr/share/man/hil/man6x /usr/share/man/hil/man7 /usr/share/man/hil/man7x /usr/share/man/hil/man8 /usr/share/man/hil/man8x /usr/share/man/hil/man9 /usr/share/man/hil/man9x /usr/share/man/hil/mann /usr/share/man/him /usr/share/man/hi/man0p /usr/share/man/hi/man1 /usr/share/man/hi/man1p /usr/share/man/hi/man1x /usr/share/man/hi/man2 /usr/share/man/hi/man2x /usr/share/man/hi/man3 /usr/share/man/hi/man3p /usr/share/man/hi/man3x /usr/share/man/hi/man4 /usr/share/man/hi/man4x /usr/share/man/hi/man5 /usr/share/man/hi/man5x /usr/share/man/hi/man6 /usr/share/man/hi/man6x /usr/share/man/hi/man7 /usr/share/man/hi/man7x /usr/share/man/hi/man8 /usr/share/man/hi/man8x /usr/share/man/hi/man9 /usr/share/man/hi/man9x /usr/share/man/hi/mann /usr/share/man/him/man0p /usr/share/man/him/man1 /usr/share/man/him/man1p /usr/share/man/him/man1x /usr/share/man/him/man2 /usr/share/man/him/man2x /usr/share/man/him/man3 /usr/share/man/him/man3p /usr/share/man/him/man3x /usr/share/man/him/man4 /usr/share/man/him/man4x /usr/share/man/him/man5 /usr/share/man/him/man5x /usr/share/man/him/man6 /usr/share/man/him/man6x /usr/share/man/him/man7 /usr/share/man/him/man7x /usr/share/man/him/man8 /usr/share/man/him/man8x /usr/share/man/him/man9 /usr/share/man/him/man9x /usr/share/man/him/mann /usr/share/man/hit /usr/share/man/hit/man0p /usr/share/man/hit/man1 /usr/share/man/hit/man1p /usr/share/man/hit/man1x /usr/share/man/hit/man2 /usr/share/man/hit/man2x /usr/share/man/hit/man3 /usr/share/man/hit/man3p /usr/share/man/hit/man3x /usr/share/man/hit/man4 /usr/share/man/hit/man4x /usr/share/man/hit/man5 /usr/share/man/hit/man5x /usr/share/man/hit/man6 /usr/share/man/hit/man6x /usr/share/man/hit/man7 /usr/share/man/hit/man7x /usr/share/man/hit/man8 /usr/share/man/hit/man8x /usr/share/man/hit/man9 /usr/share/man/hit/man9x /usr/share/man/hit/mann /usr/share/man/hmn /usr/share/man/hmn/man0p /usr/share/man/hmn/man1 /usr/share/man/hmn/man1p /usr/share/man/hmn/man1x /usr/share/man/hmn/man2 /usr/share/man/hmn/man2x /usr/share/man/hmn/man3 /usr/share/man/hmn/man3p /usr/share/man/hmn/man3x /usr/share/man/hmn/man4 /usr/share/man/hmn/man4x /usr/share/man/hmn/man5 /usr/share/man/hmn/man5x /usr/share/man/hmn/man6 /usr/share/man/hmn/man6x /usr/share/man/hmn/man7 /usr/share/man/hmn/man7x /usr/share/man/hmn/man8 /usr/share/man/hmn/man8x /usr/share/man/hmn/man9 /usr/share/man/hmn/man9x /usr/share/man/hmn/mann /usr/share/man/ho /usr/share/man/ho/man0p /usr/share/man/ho/man1 /usr/share/man/ho/man1p /usr/share/man/ho/man1x /usr/share/man/ho/man2 /usr/share/man/ho/man2x /usr/share/man/ho/man3 /usr/share/man/ho/man3p /usr/share/man/ho/man3x /usr/share/man/ho/man4 /usr/share/man/ho/man4x /usr/share/man/ho/man5 /usr/share/man/ho/man5x /usr/share/man/ho/man6 /usr/share/man/ho/man6x /usr/share/man/ho/man7 /usr/share/man/ho/man7x /usr/share/man/ho/man8 /usr/share/man/ho/man8x /usr/share/man/ho/man9 /usr/share/man/ho/man9x /usr/share/man/ho/mann /usr/share/man/hr /usr/share/man/hr_HR /usr/share/man/hr_HR/man0p /usr/share/man/hr_HR/man1 /usr/share/man/hr_HR/man1p /usr/share/man/hr_HR/man1x /usr/share/man/hr_HR/man2 /usr/share/man/hr_HR/man2x /usr/share/man/hr_HR/man3 /usr/share/man/hr_HR/man3p /usr/share/man/hr_HR/man3x /usr/share/man/hr_HR/man4 /usr/share/man/hr_HR/man4x /usr/share/man/hr_HR/man5 /usr/share/man/hr_HR/man5x /usr/share/man/hr_HR/man6 /usr/share/man/hr_HR/man6x /usr/share/man/hr_HR/man7 /usr/share/man/hr_HR/man7x /usr/share/man/hr_HR/man8 /usr/share/man/hr_HR/man8x /usr/share/man/hr_HR/man9 /usr/share/man/hr_HR/man9x /usr/share/man/hr_HR/mann /usr/share/man/hr/man0p /usr/share/man/hr/man1 /usr/share/man/hr/man1p /usr/share/man/hr/man1x /usr/share/man/hr/man2 /usr/share/man/hr/man2x /usr/share/man/hr/man3 /usr/share/man/hr/man3p /usr/share/man/hr/man3x /usr/share/man/hr/man4 /usr/share/man/hr/man4x /usr/share/man/hr/man5 /usr/share/man/hr/man5x /usr/share/man/hr/man6 /usr/share/man/hr/man6x /usr/share/man/hr/man7 /usr/share/man/hr/man7x /usr/share/man/hr/man8 /usr/share/man/hr/man8x /usr/share/man/hr/man9 /usr/share/man/hr/man9x /usr/share/man/hr/mann /usr/share/man/hsb /usr/share/man/hsb/man0p /usr/share/man/hsb/man1 /usr/share/man/hsb/man1p /usr/share/man/hsb/man1x /usr/share/man/hsb/man2 /usr/share/man/hsb/man2x /usr/share/man/hsb/man3 /usr/share/man/hsb/man3p /usr/share/man/hsb/man3x /usr/share/man/hsb/man4 /usr/share/man/hsb/man4x /usr/share/man/hsb/man5 /usr/share/man/hsb/man5x /usr/share/man/hsb/man6 /usr/share/man/hsb/man6x /usr/share/man/hsb/man7 /usr/share/man/hsb/man7x /usr/share/man/hsb/man8 /usr/share/man/hsb/man8x /usr/share/man/hsb/man9 /usr/share/man/hsb/man9x /usr/share/man/hsb/mann /usr/share/man/ht /usr/share/man/ht/man0p /usr/share/man/ht/man1 /usr/share/man/ht/man1p /usr/share/man/ht/man1x /usr/share/man/ht/man2 /usr/share/man/ht/man2x /usr/share/man/ht/man3 /usr/share/man/ht/man3p /usr/share/man/ht/man3x /usr/share/man/ht/man4 /usr/share/man/ht/man4x /usr/share/man/ht/man5 /usr/share/man/ht/man5x /usr/share/man/ht/man6 /usr/share/man/ht/man6x /usr/share/man/ht/man7 /usr/share/man/ht/man7x /usr/share/man/ht/man8 /usr/share/man/ht/man8x /usr/share/man/ht/man9 /usr/share/man/ht/man9x /usr/share/man/ht/mann /usr/share/man/hu /usr/share/man/hu_HU /usr/share/man/hu_HU/man0p /usr/share/man/hu_HU/man1 /usr/share/man/hu_HU/man1p /usr/share/man/hu_HU/man1x /usr/share/man/hu_HU/man2 /usr/share/man/hu_HU/man2x /usr/share/man/hu_HU/man3 /usr/share/man/hu_HU/man3p /usr/share/man/hu_HU/man3x /usr/share/man/hu_HU/man4 /usr/share/man/hu_HU/man4x /usr/share/man/hu_HU/man5 /usr/share/man/hu_HU/man5x /usr/share/man/hu_HU/man6 /usr/share/man/hu_HU/man6x /usr/share/man/hu_HU/man7 /usr/share/man/hu_HU/man7x /usr/share/man/hu_HU/man8 /usr/share/man/hu_HU/man8x /usr/share/man/hu_HU/man9 /usr/share/man/hu_HU/man9x /usr/share/man/hu_HU/mann /usr/share/man/hu/man0p /usr/share/man/hu/man1 /usr/share/man/hu/man1p /usr/share/man/hu/man1x /usr/share/man/hu/man2 /usr/share/man/hu/man2x /usr/share/man/hu/man3 /usr/share/man/hu/man3p /usr/share/man/hu/man3x /usr/share/man/hu/man4 /usr/share/man/hu/man4x /usr/share/man/hu/man5 /usr/share/man/hu/man5x /usr/share/man/hu/man6 /usr/share/man/hu/man6x /usr/share/man/hu/man7 /usr/share/man/hu/man7x /usr/share/man/hu/man8 /usr/share/man/hu/man8x /usr/share/man/hu/man9 /usr/share/man/hu/man9x /usr/share/man/hu/mann /usr/share/man/hup /usr/share/man/hup/man0p /usr/share/man/hup/man1 /usr/share/man/hup/man1p /usr/share/man/hup/man1x /usr/share/man/hup/man2 /usr/share/man/hup/man2x /usr/share/man/hup/man3 /usr/share/man/hup/man3p /usr/share/man/hup/man3x /usr/share/man/hup/man4 /usr/share/man/hup/man4x /usr/share/man/hup/man5 /usr/share/man/hup/man5x /usr/share/man/hup/man6 /usr/share/man/hup/man6x /usr/share/man/hup/man7 /usr/share/man/hup/man7x /usr/share/man/hup/man8 /usr/share/man/hup/man8x /usr/share/man/hup/man9 /usr/share/man/hup/man9x /usr/share/man/hup/mann /usr/share/man/hy /usr/share/man/hy/man0p /usr/share/man/hy/man1 /usr/share/man/hy/man1p /usr/share/man/hy/man1x /usr/share/man/hy/man2 /usr/share/man/hy/man2x /usr/share/man/hy/man3 /usr/share/man/hy/man3p /usr/share/man/hy/man3x /usr/share/man/hy/man4 /usr/share/man/hy/man4x /usr/share/man/hy/man5 /usr/share/man/hy/man5x /usr/share/man/hy/man6 /usr/share/man/hy/man6x /usr/share/man/hy/man7 /usr/share/man/hy/man7x /usr/share/man/hy/man8 /usr/share/man/hy/man8x /usr/share/man/hy/man9 /usr/share/man/hy/man9x /usr/share/man/hy/mann /usr/share/man/hz /usr/share/man/hz/man0p /usr/share/man/hz/man1 /usr/share/man/hz/man1p /usr/share/man/hz/man1x /usr/share/man/hz/man2 /usr/share/man/hz/man2x /usr/share/man/hz/man3 /usr/share/man/hz/man3p /usr/share/man/hz/man3x /usr/share/man/hz/man4 /usr/share/man/hz/man4x /usr/share/man/hz/man5 /usr/share/man/hz/man5x /usr/share/man/hz/man6 /usr/share/man/hz/man6x /usr/share/man/hz/man7 /usr/share/man/hz/man7x /usr/share/man/hz/man8 /usr/share/man/hz/man8x /usr/share/man/hz/man9 /usr/share/man/hz/man9x /usr/share/man/hz/mann /usr/share/man/ia /usr/share/man/ia/man0p /usr/share/man/ia/man1 /usr/share/man/ia/man1p /usr/share/man/ia/man1x /usr/share/man/ia/man2 /usr/share/man/ia/man2x /usr/share/man/ia/man3 /usr/share/man/ia/man3p /usr/share/man/ia/man3x /usr/share/man/ia/man4 /usr/share/man/ia/man4x /usr/share/man/ia/man5 /usr/share/man/ia/man5x /usr/share/man/ia/man6 /usr/share/man/ia/man6x /usr/share/man/ia/man7 /usr/share/man/ia/man7x /usr/share/man/ia/man8 /usr/share/man/ia/man8x /usr/share/man/ia/man9 /usr/share/man/ia/man9x /usr/share/man/ia/mann /usr/share/man/iba /usr/share/man/iba/man0p /usr/share/man/iba/man1 /usr/share/man/iba/man1p /usr/share/man/iba/man1x /usr/share/man/iba/man2 /usr/share/man/iba/man2x /usr/share/man/iba/man3 /usr/share/man/iba/man3p /usr/share/man/iba/man3x /usr/share/man/iba/man4 /usr/share/man/iba/man4x /usr/share/man/iba/man5 /usr/share/man/iba/man5x /usr/share/man/iba/man6 /usr/share/man/iba/man6x /usr/share/man/iba/man7 /usr/share/man/iba/man7x /usr/share/man/iba/man8 /usr/share/man/iba/man8x /usr/share/man/iba/man9 /usr/share/man/iba/man9x /usr/share/man/iba/mann /usr/share/man/id /usr/share/man/id/man0p /usr/share/man/id/man1 /usr/share/man/id/man1p /usr/share/man/id/man1x /usr/share/man/id/man2 /usr/share/man/id/man2x /usr/share/man/id/man3 /usr/share/man/id/man3p /usr/share/man/id/man3x /usr/share/man/id/man4 /usr/share/man/id/man4x /usr/share/man/id/man5 /usr/share/man/id/man5x /usr/share/man/id/man6 /usr/share/man/id/man6x /usr/share/man/id/man7 /usr/share/man/id/man7x /usr/share/man/id/man8 /usr/share/man/id/man8x /usr/share/man/id/man9 /usr/share/man/id/man9x /usr/share/man/id/mann /usr/share/man/ie /usr/share/man/ie/man0p /usr/share/man/ie/man1 /usr/share/man/ie/man1p /usr/share/man/ie/man1x /usr/share/man/ie/man2 /usr/share/man/ie/man2x /usr/share/man/ie/man3 /usr/share/man/ie/man3p /usr/share/man/ie/man3x /usr/share/man/ie/man4 /usr/share/man/ie/man4x /usr/share/man/ie/man5 /usr/share/man/ie/man5x /usr/share/man/ie/man6 /usr/share/man/ie/man6x /usr/share/man/ie/man7 /usr/share/man/ie/man7x /usr/share/man/ie/man8 /usr/share/man/ie/man8x /usr/share/man/ie/man9 /usr/share/man/ie/man9x /usr/share/man/ie/mann /usr/share/man/ig /usr/share/man/ig/man0p /usr/share/man/ig/man1 /usr/share/man/ig/man1p /usr/share/man/ig/man1x /usr/share/man/ig/man2 /usr/share/man/ig/man2x /usr/share/man/ig/man3 /usr/share/man/ig/man3p /usr/share/man/ig/man3x /usr/share/man/ig/man4 /usr/share/man/ig/man4x /usr/share/man/ig/man5 /usr/share/man/ig/man5x /usr/share/man/ig/man6 /usr/share/man/ig/man6x /usr/share/man/ig/man7 /usr/share/man/ig/man7x /usr/share/man/ig/man8 /usr/share/man/ig/man8x /usr/share/man/ig/man9 /usr/share/man/ig/man9x /usr/share/man/ig/mann /usr/share/man/ii /usr/share/man/ii/man0p /usr/share/man/ii/man1 /usr/share/man/ii/man1p /usr/share/man/ii/man1x /usr/share/man/ii/man2 /usr/share/man/ii/man2x /usr/share/man/ii/man3 /usr/share/man/ii/man3p /usr/share/man/ii/man3x /usr/share/man/ii/man4 /usr/share/man/ii/man4x /usr/share/man/ii/man5 /usr/share/man/ii/man5x /usr/share/man/ii/man6 /usr/share/man/ii/man6x /usr/share/man/ii/man7 /usr/share/man/ii/man7x /usr/share/man/ii/man8 /usr/share/man/ii/man8x /usr/share/man/ii/man9 /usr/share/man/ii/man9x /usr/share/man/ii/mann /usr/share/man/ijo /usr/share/man/ijo/man0p /usr/share/man/ijo/man1 /usr/share/man/ijo/man1p /usr/share/man/ijo/man1x /usr/share/man/ijo/man2 /usr/share/man/ijo/man2x /usr/share/man/ijo/man3 /usr/share/man/ijo/man3p /usr/share/man/ijo/man3x /usr/share/man/ijo/man4 /usr/share/man/ijo/man4x /usr/share/man/ijo/man5 /usr/share/man/ijo/man5x /usr/share/man/ijo/man6 /usr/share/man/ijo/man6x /usr/share/man/ijo/man7 /usr/share/man/ijo/man7x /usr/share/man/ijo/man8 /usr/share/man/ijo/man8x /usr/share/man/ijo/man9 /usr/share/man/ijo/man9x /usr/share/man/ijo/mann /usr/share/man/ik /usr/share/man/ik/man0p /usr/share/man/ik/man1 /usr/share/man/ik/man1p /usr/share/man/ik/man1x /usr/share/man/ik/man2 /usr/share/man/ik/man2x /usr/share/man/ik/man3 /usr/share/man/ik/man3p /usr/share/man/ik/man3x /usr/share/man/ik/man4 /usr/share/man/ik/man4x /usr/share/man/ik/man5 /usr/share/man/ik/man5x /usr/share/man/ik/man6 /usr/share/man/ik/man6x /usr/share/man/ik/man7 /usr/share/man/ik/man7x /usr/share/man/ik/man8 /usr/share/man/ik/man8x /usr/share/man/ik/man9 /usr/share/man/ik/man9x /usr/share/man/ik/mann /usr/share/man/ilo /usr/share/man/ilo/man0p /usr/share/man/ilo/man1 /usr/share/man/ilo/man1p /usr/share/man/ilo/man1x /usr/share/man/ilo/man2 /usr/share/man/ilo/man2x /usr/share/man/ilo/man3 /usr/share/man/ilo/man3p /usr/share/man/ilo/man3x /usr/share/man/ilo/man4 /usr/share/man/ilo/man4x /usr/share/man/ilo/man5 /usr/share/man/ilo/man5x /usr/share/man/ilo/man6 /usr/share/man/ilo/man6x /usr/share/man/ilo/man7 /usr/share/man/ilo/man7x /usr/share/man/ilo/man8 /usr/share/man/ilo/man8x /usr/share/man/ilo/man9 /usr/share/man/ilo/man9x /usr/share/man/ilo/mann /usr/share/man/inc /usr/share/man/inc/man0p /usr/share/man/inc/man1 /usr/share/man/inc/man1p /usr/share/man/inc/man1x /usr/share/man/inc/man2 /usr/share/man/inc/man2x /usr/share/man/inc/man3 /usr/share/man/inc/man3p /usr/share/man/inc/man3x /usr/share/man/inc/man4 /usr/share/man/inc/man4x /usr/share/man/inc/man5 /usr/share/man/inc/man5x /usr/share/man/inc/man6 /usr/share/man/inc/man6x /usr/share/man/inc/man7 /usr/share/man/inc/man7x /usr/share/man/inc/man8 /usr/share/man/inc/man8x /usr/share/man/inc/man9 /usr/share/man/inc/man9x /usr/share/man/inc/mann /usr/share/man/ine /usr/share/man/ine/man0p /usr/share/man/ine/man1 /usr/share/man/ine/man1p /usr/share/man/ine/man1x /usr/share/man/ine/man2 /usr/share/man/ine/man2x /usr/share/man/ine/man3 /usr/share/man/ine/man3p /usr/share/man/ine/man3x /usr/share/man/ine/man4 /usr/share/man/ine/man4x /usr/share/man/ine/man5 /usr/share/man/ine/man5x /usr/share/man/ine/man6 /usr/share/man/ine/man6x /usr/share/man/ine/man7 /usr/share/man/ine/man7x /usr/share/man/ine/man8 /usr/share/man/ine/man8x /usr/share/man/ine/man9 /usr/share/man/ine/man9x /usr/share/man/ine/mann /usr/share/man/inh /usr/share/man/inh/man0p /usr/share/man/inh/man1 /usr/share/man/inh/man1p /usr/share/man/inh/man1x /usr/share/man/inh/man2 /usr/share/man/inh/man2x /usr/share/man/inh/man3 /usr/share/man/inh/man3p /usr/share/man/inh/man3x /usr/share/man/inh/man4 /usr/share/man/inh/man4x /usr/share/man/inh/man5 /usr/share/man/inh/man5x /usr/share/man/inh/man6 /usr/share/man/inh/man6x /usr/share/man/inh/man7 /usr/share/man/inh/man7x /usr/share/man/inh/man8 /usr/share/man/inh/man8x /usr/share/man/inh/man9 /usr/share/man/inh/man9x /usr/share/man/inh/mann /usr/share/man/io /usr/share/man/io/man0p /usr/share/man/io/man1 /usr/share/man/io/man1p /usr/share/man/io/man1x /usr/share/man/io/man2 /usr/share/man/io/man2x /usr/share/man/io/man3 /usr/share/man/io/man3p /usr/share/man/io/man3x /usr/share/man/io/man4 /usr/share/man/io/man4x /usr/share/man/io/man5 /usr/share/man/io/man5x /usr/share/man/io/man6 /usr/share/man/io/man6x /usr/share/man/io/man7 /usr/share/man/io/man7x /usr/share/man/io/man8 /usr/share/man/io/man8x /usr/share/man/io/man9 /usr/share/man/io/man9x /usr/share/man/io/mann /usr/share/man/ira /usr/share/man/ira/man0p /usr/share/man/ira/man1 /usr/share/man/ira/man1p /usr/share/man/ira/man1x /usr/share/man/ira/man2 /usr/share/man/ira/man2x /usr/share/man/ira/man3 /usr/share/man/ira/man3p /usr/share/man/ira/man3x /usr/share/man/ira/man4 /usr/share/man/ira/man4x /usr/share/man/ira/man5 /usr/share/man/ira/man5x /usr/share/man/ira/man6 /usr/share/man/ira/man6x /usr/share/man/ira/man7 /usr/share/man/ira/man7x /usr/share/man/ira/man8 /usr/share/man/ira/man8x /usr/share/man/ira/man9 /usr/share/man/ira/man9x /usr/share/man/ira/mann /usr/share/man/iro /usr/share/man/iro/man0p /usr/share/man/iro/man1 /usr/share/man/iro/man1p /usr/share/man/iro/man1x /usr/share/man/iro/man2 /usr/share/man/iro/man2x /usr/share/man/iro/man3 /usr/share/man/iro/man3p /usr/share/man/iro/man3x /usr/share/man/iro/man4 /usr/share/man/iro/man4x /usr/share/man/iro/man5 /usr/share/man/iro/man5x /usr/share/man/iro/man6 /usr/share/man/iro/man6x /usr/share/man/iro/man7 /usr/share/man/iro/man7x /usr/share/man/iro/man8 /usr/share/man/iro/man8x /usr/share/man/iro/man9 /usr/share/man/iro/man9x /usr/share/man/iro/mann /usr/share/man/is /usr/share/man/is/man0p /usr/share/man/is/man1 /usr/share/man/is/man1p /usr/share/man/is/man1x /usr/share/man/is/man2 /usr/share/man/is/man2x /usr/share/man/is/man3 /usr/share/man/is/man3p /usr/share/man/is/man3x /usr/share/man/is/man4 /usr/share/man/is/man4x /usr/share/man/is/man5 /usr/share/man/is/man5x /usr/share/man/is/man6 /usr/share/man/is/man6x /usr/share/man/is/man7 /usr/share/man/is/man7x /usr/share/man/is/man8 /usr/share/man/is/man8x /usr/share/man/is/man9 /usr/share/man/is/man9x /usr/share/man/is/mann /usr/share/man/it /usr/share/man/it_CH /usr/share/man/it_CH/man0p /usr/share/man/it_CH/man1 /usr/share/man/it_CH/man1p /usr/share/man/it_CH/man1x /usr/share/man/it_CH/man2 /usr/share/man/it_CH/man2x /usr/share/man/it_CH/man3 /usr/share/man/it_CH/man3p /usr/share/man/it_CH/man3x /usr/share/man/it_CH/man4 /usr/share/man/it_CH/man4x /usr/share/man/it_CH/man5 /usr/share/man/it_CH/man5x /usr/share/man/it_CH/man6 /usr/share/man/it_CH/man6x /usr/share/man/it_CH/man7 /usr/share/man/it_CH/man7x /usr/share/man/it_CH/man8 /usr/share/man/it_CH/man8x /usr/share/man/it_CH/man9 /usr/share/man/it_CH/man9x /usr/share/man/it_CH/mann /usr/share/man/it_IT /usr/share/man/it_IT/man0p /usr/share/man/it_IT/man1 /usr/share/man/it_IT/man1p /usr/share/man/it_IT/man1x /usr/share/man/it_IT/man2 /usr/share/man/it_IT/man2x /usr/share/man/it_IT/man3 /usr/share/man/it_IT/man3p /usr/share/man/it_IT/man3x /usr/share/man/it_IT/man4 /usr/share/man/it_IT/man4x /usr/share/man/it_IT/man5 /usr/share/man/it_IT/man5x /usr/share/man/it_IT/man6 /usr/share/man/it_IT/man6x /usr/share/man/it_IT/man7 /usr/share/man/it_IT/man7x /usr/share/man/it_IT/man8 /usr/share/man/it_IT/man8x /usr/share/man/it_IT/man9 /usr/share/man/it_IT/man9x /usr/share/man/it_IT/mann /usr/share/man/it/man0p /usr/share/man/it/man1 /usr/share/man/it/man1p /usr/share/man/it/man1x /usr/share/man/it/man2 /usr/share/man/it/man2x /usr/share/man/it/man3 /usr/share/man/it/man3p /usr/share/man/it/man3x /usr/share/man/it/man4 /usr/share/man/it/man4x /usr/share/man/it/man5 /usr/share/man/it/man5x /usr/share/man/it/man6 /usr/share/man/it/man6x /usr/share/man/it/man7 /usr/share/man/it/man7x /usr/share/man/it/man8 /usr/share/man/it/man8x /usr/share/man/it/man9 /usr/share/man/it/man9x /usr/share/man/it/mann /usr/share/man/iu /usr/share/man/iu/man0p /usr/share/man/iu/man1 /usr/share/man/iu/man1p /usr/share/man/iu/man1x /usr/share/man/iu/man2 /usr/share/man/iu/man2x /usr/share/man/iu/man3 /usr/share/man/iu/man3p /usr/share/man/iu/man3x /usr/share/man/iu/man4 /usr/share/man/iu/man4x /usr/share/man/iu/man5 /usr/share/man/iu/man5x /usr/share/man/iu/man6 /usr/share/man/iu/man6x /usr/share/man/iu/man7 /usr/share/man/iu/man7x /usr/share/man/iu/man8 /usr/share/man/iu/man8x /usr/share/man/iu/man9 /usr/share/man/iu/man9x /usr/share/man/iu/mann /usr/share/man/ja /usr/share/man/ja_JP /usr/share/man/ja_JP/man0p /usr/share/man/ja_JP/man1 /usr/share/man/ja_JP/man1p /usr/share/man/ja_JP/man1x /usr/share/man/ja_JP/man2 /usr/share/man/ja_JP/man2x /usr/share/man/ja_JP/man3 /usr/share/man/ja_JP/man3p /usr/share/man/ja_JP/man3x /usr/share/man/ja_JP/man4 /usr/share/man/ja_JP/man4x /usr/share/man/ja_JP/man5 /usr/share/man/ja_JP/man5x /usr/share/man/ja_JP/man6 /usr/share/man/ja_JP/man6x /usr/share/man/ja_JP/man7 /usr/share/man/ja_JP/man7x /usr/share/man/ja_JP/man8 /usr/share/man/ja_JP/man8x /usr/share/man/ja_JP/man9 /usr/share/man/ja_JP/man9x /usr/share/man/ja_JP/mann /usr/share/man/ja/man0p /usr/share/man/ja/man1 /usr/share/man/ja/man1p /usr/share/man/ja/man1x /usr/share/man/ja/man2 /usr/share/man/ja/man2x /usr/share/man/ja/man3 /usr/share/man/ja/man3p /usr/share/man/ja/man3x /usr/share/man/ja/man4 /usr/share/man/ja/man4x /usr/share/man/ja/man5 /usr/share/man/ja/man5x /usr/share/man/ja/man6 /usr/share/man/ja/man6x /usr/share/man/ja/man7 /usr/share/man/ja/man7x /usr/share/man/ja/man8 /usr/share/man/ja/man8x /usr/share/man/ja/man9 /usr/share/man/ja/man9x /usr/share/man/ja/mann /usr/share/man/jbo /usr/share/man/jbo/man0p /usr/share/man/jbo/man1 /usr/share/man/jbo/man1p /usr/share/man/jbo/man1x /usr/share/man/jbo/man2 /usr/share/man/jbo/man2x /usr/share/man/jbo/man3 /usr/share/man/jbo/man3p /usr/share/man/jbo/man3x /usr/share/man/jbo/man4 /usr/share/man/jbo/man4x /usr/share/man/jbo/man5 /usr/share/man/jbo/man5x /usr/share/man/jbo/man6 /usr/share/man/jbo/man6x /usr/share/man/jbo/man7 /usr/share/man/jbo/man7x /usr/share/man/jbo/man8 /usr/share/man/jbo/man8x /usr/share/man/jbo/man9 /usr/share/man/jbo/man9x /usr/share/man/jbo/mann /usr/share/man/jpr /usr/share/man/jpr/man0p /usr/share/man/jpr/man1 /usr/share/man/jpr/man1p /usr/share/man/jpr/man1x /usr/share/man/jpr/man2 /usr/share/man/jpr/man2x /usr/share/man/jpr/man3 /usr/share/man/jpr/man3p /usr/share/man/jpr/man3x /usr/share/man/jpr/man4 /usr/share/man/jpr/man4x /usr/share/man/jpr/man5 /usr/share/man/jpr/man5x /usr/share/man/jpr/man6 /usr/share/man/jpr/man6x /usr/share/man/jpr/man7 /usr/share/man/jpr/man7x /usr/share/man/jpr/man8 /usr/share/man/jpr/man8x /usr/share/man/jpr/man9 /usr/share/man/jpr/man9x /usr/share/man/jpr/mann /usr/share/man/jrb /usr/share/man/jrb/man0p /usr/share/man/jrb/man1 /usr/share/man/jrb/man1p /usr/share/man/jrb/man1x /usr/share/man/jrb/man2 /usr/share/man/jrb/man2x /usr/share/man/jrb/man3 /usr/share/man/jrb/man3p /usr/share/man/jrb/man3x /usr/share/man/jrb/man4 /usr/share/man/jrb/man4x /usr/share/man/jrb/man5 /usr/share/man/jrb/man5x /usr/share/man/jrb/man6 /usr/share/man/jrb/man6x /usr/share/man/jrb/man7 /usr/share/man/jrb/man7x /usr/share/man/jrb/man8 /usr/share/man/jrb/man8x /usr/share/man/jrb/man9 /usr/share/man/jrb/man9x /usr/share/man/jrb/mann /usr/share/man/jv /usr/share/man/jv/man0p /usr/share/man/jv/man1 /usr/share/man/jv/man1p /usr/share/man/jv/man1x /usr/share/man/jv/man2 /usr/share/man/jv/man2x /usr/share/man/jv/man3 /usr/share/man/jv/man3p /usr/share/man/jv/man3x /usr/share/man/jv/man4 /usr/share/man/jv/man4x /usr/share/man/jv/man5 /usr/share/man/jv/man5x /usr/share/man/jv/man6 /usr/share/man/jv/man6x /usr/share/man/jv/man7 /usr/share/man/jv/man7x /usr/share/man/jv/man8 /usr/share/man/jv/man8x /usr/share/man/jv/man9 /usr/share/man/jv/man9x /usr/share/man/jv/mann /usr/share/man/ka /usr/share/man/kaa /usr/share/man/kaa/man0p /usr/share/man/kaa/man1 /usr/share/man/kaa/man1p /usr/share/man/kaa/man1x /usr/share/man/kaa/man2 /usr/share/man/kaa/man2x /usr/share/man/kaa/man3 /usr/share/man/kaa/man3p /usr/share/man/kaa/man3x /usr/share/man/kaa/man4 /usr/share/man/kaa/man4x /usr/share/man/kaa/man5 /usr/share/man/kaa/man5x /usr/share/man/kaa/man6 /usr/share/man/kaa/man6x /usr/share/man/kaa/man7 /usr/share/man/kaa/man7x /usr/share/man/kaa/man8 /usr/share/man/kaa/man8x /usr/share/man/kaa/man9 /usr/share/man/kaa/man9x /usr/share/man/kaa/mann /usr/share/man/kab /usr/share/man/kab/man0p /usr/share/man/kab/man1 /usr/share/man/kab/man1p /usr/share/man/kab/man1x /usr/share/man/kab/man2 /usr/share/man/kab/man2x /usr/share/man/kab/man3 /usr/share/man/kab/man3p /usr/share/man/kab/man3x /usr/share/man/kab/man4 /usr/share/man/kab/man4x /usr/share/man/kab/man5 /usr/share/man/kab/man5x /usr/share/man/kab/man6 /usr/share/man/kab/man6x /usr/share/man/kab/man7 /usr/share/man/kab/man7x /usr/share/man/kab/man8 /usr/share/man/kab/man8x /usr/share/man/kab/man9 /usr/share/man/kab/man9x /usr/share/man/kab/mann /usr/share/man/kac /usr/share/man/kac/man0p /usr/share/man/kac/man1 /usr/share/man/kac/man1p /usr/share/man/kac/man1x /usr/share/man/kac/man2 /usr/share/man/kac/man2x /usr/share/man/kac/man3 /usr/share/man/kac/man3p /usr/share/man/kac/man3x /usr/share/man/kac/man4 /usr/share/man/kac/man4x /usr/share/man/kac/man5 /usr/share/man/kac/man5x /usr/share/man/kac/man6 /usr/share/man/kac/man6x /usr/share/man/kac/man7 /usr/share/man/kac/man7x /usr/share/man/kac/man8 /usr/share/man/kac/man8x /usr/share/man/kac/man9 /usr/share/man/kac/man9x /usr/share/man/kac/mann /usr/share/man/kam /usr/share/man/ka/man0p /usr/share/man/ka/man1 /usr/share/man/ka/man1p /usr/share/man/ka/man1x /usr/share/man/ka/man2 /usr/share/man/ka/man2x /usr/share/man/ka/man3 /usr/share/man/ka/man3p /usr/share/man/ka/man3x /usr/share/man/ka/man4 /usr/share/man/ka/man4x /usr/share/man/ka/man5 /usr/share/man/ka/man5x /usr/share/man/ka/man6 /usr/share/man/ka/man6x /usr/share/man/ka/man7 /usr/share/man/ka/man7x /usr/share/man/ka/man8 /usr/share/man/ka/man8x /usr/share/man/ka/man9 /usr/share/man/ka/man9x /usr/share/man/ka/mann /usr/share/man/kam/man0p /usr/share/man/kam/man1 /usr/share/man/kam/man1p /usr/share/man/kam/man1x /usr/share/man/kam/man2 /usr/share/man/kam/man2x /usr/share/man/kam/man3 /usr/share/man/kam/man3p /usr/share/man/kam/man3x /usr/share/man/kam/man4 /usr/share/man/kam/man4x /usr/share/man/kam/man5 /usr/share/man/kam/man5x /usr/share/man/kam/man6 /usr/share/man/kam/man6x /usr/share/man/kam/man7 /usr/share/man/kam/man7x /usr/share/man/kam/man8 /usr/share/man/kam/man8x /usr/share/man/kam/man9 /usr/share/man/kam/man9x /usr/share/man/kam/mann /usr/share/man/kar /usr/share/man/kar/man0p /usr/share/man/kar/man1 /usr/share/man/kar/man1p /usr/share/man/kar/man1x /usr/share/man/kar/man2 /usr/share/man/kar/man2x /usr/share/man/kar/man3 /usr/share/man/kar/man3p /usr/share/man/kar/man3x /usr/share/man/kar/man4 /usr/share/man/kar/man4x /usr/share/man/kar/man5 /usr/share/man/kar/man5x /usr/share/man/kar/man6 /usr/share/man/kar/man6x /usr/share/man/kar/man7 /usr/share/man/kar/man7x /usr/share/man/kar/man8 /usr/share/man/kar/man8x /usr/share/man/kar/man9 /usr/share/man/kar/man9x /usr/share/man/kar/mann /usr/share/man/kaw /usr/share/man/kaw/man0p /usr/share/man/kaw/man1 /usr/share/man/kaw/man1p /usr/share/man/kaw/man1x /usr/share/man/kaw/man2 /usr/share/man/kaw/man2x /usr/share/man/kaw/man3 /usr/share/man/kaw/man3p /usr/share/man/kaw/man3x /usr/share/man/kaw/man4 /usr/share/man/kaw/man4x /usr/share/man/kaw/man5 /usr/share/man/kaw/man5x /usr/share/man/kaw/man6 /usr/share/man/kaw/man6x /usr/share/man/kaw/man7 /usr/share/man/kaw/man7x /usr/share/man/kaw/man8 /usr/share/man/kaw/man8x /usr/share/man/kaw/man9 /usr/share/man/kaw/man9x /usr/share/man/kaw/mann /usr/share/man/kbd /usr/share/man/kbd/man0p /usr/share/man/kbd/man1 /usr/share/man/kbd/man1p /usr/share/man/kbd/man1x /usr/share/man/kbd/man2 /usr/share/man/kbd/man2x /usr/share/man/kbd/man3 /usr/share/man/kbd/man3p /usr/share/man/kbd/man3x /usr/share/man/kbd/man4 /usr/share/man/kbd/man4x /usr/share/man/kbd/man5 /usr/share/man/kbd/man5x /usr/share/man/kbd/man6 /usr/share/man/kbd/man6x /usr/share/man/kbd/man7 /usr/share/man/kbd/man7x /usr/share/man/kbd/man8 /usr/share/man/kbd/man8x /usr/share/man/kbd/man9 /usr/share/man/kbd/man9x /usr/share/man/kbd/mann /usr/share/man/kg /usr/share/man/kg/man0p /usr/share/man/kg/man1 /usr/share/man/kg/man1p /usr/share/man/kg/man1x /usr/share/man/kg/man2 /usr/share/man/kg/man2x /usr/share/man/kg/man3 /usr/share/man/kg/man3p /usr/share/man/kg/man3x /usr/share/man/kg/man4 /usr/share/man/kg/man4x /usr/share/man/kg/man5 /usr/share/man/kg/man5x /usr/share/man/kg/man6 /usr/share/man/kg/man6x /usr/share/man/kg/man7 /usr/share/man/kg/man7x /usr/share/man/kg/man8 /usr/share/man/kg/man8x /usr/share/man/kg/man9 /usr/share/man/kg/man9x /usr/share/man/kg/mann /usr/share/man/kha /usr/share/man/kha/man0p /usr/share/man/kha/man1 /usr/share/man/kha/man1p /usr/share/man/kha/man1x /usr/share/man/kha/man2 /usr/share/man/kha/man2x /usr/share/man/kha/man3 /usr/share/man/kha/man3p /usr/share/man/kha/man3x /usr/share/man/kha/man4 /usr/share/man/kha/man4x /usr/share/man/kha/man5 /usr/share/man/kha/man5x /usr/share/man/kha/man6 /usr/share/man/kha/man6x /usr/share/man/kha/man7 /usr/share/man/kha/man7x /usr/share/man/kha/man8 /usr/share/man/kha/man8x /usr/share/man/kha/man9 /usr/share/man/kha/man9x /usr/share/man/kha/mann /usr/share/man/khi /usr/share/man/khi/man0p /usr/share/man/khi/man1 /usr/share/man/khi/man1p /usr/share/man/khi/man1x /usr/share/man/khi/man2 /usr/share/man/khi/man2x /usr/share/man/khi/man3 /usr/share/man/khi/man3p /usr/share/man/khi/man3x /usr/share/man/khi/man4 /usr/share/man/khi/man4x /usr/share/man/khi/man5 /usr/share/man/khi/man5x /usr/share/man/khi/man6 /usr/share/man/khi/man6x /usr/share/man/khi/man7 /usr/share/man/khi/man7x /usr/share/man/khi/man8 /usr/share/man/khi/man8x /usr/share/man/khi/man9 /usr/share/man/khi/man9x /usr/share/man/khi/mann /usr/share/man/kho /usr/share/man/kho/man0p /usr/share/man/kho/man1 /usr/share/man/kho/man1p /usr/share/man/kho/man1x /usr/share/man/kho/man2 /usr/share/man/kho/man2x /usr/share/man/kho/man3 /usr/share/man/kho/man3p /usr/share/man/kho/man3x /usr/share/man/kho/man4 /usr/share/man/kho/man4x /usr/share/man/kho/man5 /usr/share/man/kho/man5x /usr/share/man/kho/man6 /usr/share/man/kho/man6x /usr/share/man/kho/man7 /usr/share/man/kho/man7x /usr/share/man/kho/man8 /usr/share/man/kho/man8x /usr/share/man/kho/man9 /usr/share/man/kho/man9x /usr/share/man/kho/mann /usr/share/man/ki /usr/share/man/ki/man0p /usr/share/man/ki/man1 /usr/share/man/ki/man1p /usr/share/man/ki/man1x /usr/share/man/ki/man2 /usr/share/man/ki/man2x /usr/share/man/ki/man3 /usr/share/man/ki/man3p /usr/share/man/ki/man3x /usr/share/man/ki/man4 /usr/share/man/ki/man4x /usr/share/man/ki/man5 /usr/share/man/ki/man5x /usr/share/man/ki/man6 /usr/share/man/ki/man6x /usr/share/man/ki/man7 /usr/share/man/ki/man7x /usr/share/man/ki/man8 /usr/share/man/ki/man8x /usr/share/man/ki/man9 /usr/share/man/ki/man9x /usr/share/man/ki/mann /usr/share/man/kj /usr/share/man/kj/man0p /usr/share/man/kj/man1 /usr/share/man/kj/man1p /usr/share/man/kj/man1x /usr/share/man/kj/man2 /usr/share/man/kj/man2x /usr/share/man/kj/man3 /usr/share/man/kj/man3p /usr/share/man/kj/man3x /usr/share/man/kj/man4 /usr/share/man/kj/man4x /usr/share/man/kj/man5 /usr/share/man/kj/man5x /usr/share/man/kj/man6 /usr/share/man/kj/man6x /usr/share/man/kj/man7 /usr/share/man/kj/man7x /usr/share/man/kj/man8 /usr/share/man/kj/man8x /usr/share/man/kj/man9 /usr/share/man/kj/man9x /usr/share/man/kj/mann /usr/share/man/kk /usr/share/man/kk/man0p /usr/share/man/kk/man1 /usr/share/man/kk/man1p /usr/share/man/kk/man1x /usr/share/man/kk/man2 /usr/share/man/kk/man2x /usr/share/man/kk/man3 /usr/share/man/kk/man3p /usr/share/man/kk/man3x /usr/share/man/kk/man4 /usr/share/man/kk/man4x /usr/share/man/kk/man5 /usr/share/man/kk/man5x /usr/share/man/kk/man6 /usr/share/man/kk/man6x /usr/share/man/kk/man7 /usr/share/man/kk/man7x /usr/share/man/kk/man8 /usr/share/man/kk/man8x /usr/share/man/kk/man9 /usr/share/man/kk/man9x /usr/share/man/kk/mann /usr/share/man/kl /usr/share/man/kl/man0p /usr/share/man/kl/man1 /usr/share/man/kl/man1p /usr/share/man/kl/man1x /usr/share/man/kl/man2 /usr/share/man/kl/man2x /usr/share/man/kl/man3 /usr/share/man/kl/man3p /usr/share/man/kl/man3x /usr/share/man/kl/man4 /usr/share/man/kl/man4x /usr/share/man/kl/man5 /usr/share/man/kl/man5x /usr/share/man/kl/man6 /usr/share/man/kl/man6x /usr/share/man/kl/man7 /usr/share/man/kl/man7x /usr/share/man/kl/man8 /usr/share/man/kl/man8x /usr/share/man/kl/man9 /usr/share/man/kl/man9x /usr/share/man/kl/mann /usr/share/man/km /usr/share/man/kmb /usr/share/man/kmb/man0p /usr/share/man/kmb/man1 /usr/share/man/kmb/man1p /usr/share/man/kmb/man1x /usr/share/man/kmb/man2 /usr/share/man/kmb/man2x /usr/share/man/kmb/man3 /usr/share/man/kmb/man3p /usr/share/man/kmb/man3x /usr/share/man/kmb/man4 /usr/share/man/kmb/man4x /usr/share/man/kmb/man5 /usr/share/man/kmb/man5x /usr/share/man/kmb/man6 /usr/share/man/kmb/man6x /usr/share/man/kmb/man7 /usr/share/man/kmb/man7x /usr/share/man/kmb/man8 /usr/share/man/kmb/man8x /usr/share/man/kmb/man9 /usr/share/man/kmb/man9x /usr/share/man/kmb/mann /usr/share/man/km/man0p /usr/share/man/km/man1 /usr/share/man/km/man1p /usr/share/man/km/man1x /usr/share/man/km/man2 /usr/share/man/km/man2x /usr/share/man/km/man3 /usr/share/man/km/man3p /usr/share/man/km/man3x /usr/share/man/km/man4 /usr/share/man/km/man4x /usr/share/man/km/man5 /usr/share/man/km/man5x /usr/share/man/km/man6 /usr/share/man/km/man6x /usr/share/man/km/man7 /usr/share/man/km/man7x /usr/share/man/km/man8 /usr/share/man/km/man8x /usr/share/man/km/man9 /usr/share/man/km/man9x /usr/share/man/km/mann /usr/share/man/kn /usr/share/man/kn/man0p /usr/share/man/kn/man1 /usr/share/man/kn/man1p /usr/share/man/kn/man1x /usr/share/man/kn/man2 /usr/share/man/kn/man2x /usr/share/man/kn/man3 /usr/share/man/kn/man3p /usr/share/man/kn/man3x /usr/share/man/kn/man4 /usr/share/man/kn/man4x /usr/share/man/kn/man5 /usr/share/man/kn/man5x /usr/share/man/kn/man6 /usr/share/man/kn/man6x /usr/share/man/kn/man7 /usr/share/man/kn/man7x /usr/share/man/kn/man8 /usr/share/man/kn/man8x /usr/share/man/kn/man9 /usr/share/man/kn/man9x /usr/share/man/kn/mann /usr/share/man/ko /usr/share/man/kok /usr/share/man/kok/man0p /usr/share/man/kok/man1 /usr/share/man/kok/man1p /usr/share/man/kok/man1x /usr/share/man/kok/man2 /usr/share/man/kok/man2x /usr/share/man/kok/man3 /usr/share/man/kok/man3p /usr/share/man/kok/man3x /usr/share/man/kok/man4 /usr/share/man/kok/man4x /usr/share/man/kok/man5 /usr/share/man/kok/man5x /usr/share/man/kok/man6 /usr/share/man/kok/man6x /usr/share/man/kok/man7 /usr/share/man/kok/man7x /usr/share/man/kok/man8 /usr/share/man/kok/man8x /usr/share/man/kok/man9 /usr/share/man/kok/man9x /usr/share/man/kok/mann /usr/share/man/ko_KR /usr/share/man/ko_KR/man0p /usr/share/man/ko_KR/man1 /usr/share/man/ko_KR/man1p /usr/share/man/ko_KR/man1x /usr/share/man/ko_KR/man2 /usr/share/man/ko_KR/man2x /usr/share/man/ko_KR/man3 /usr/share/man/ko_KR/man3p /usr/share/man/ko_KR/man3x /usr/share/man/ko_KR/man4 /usr/share/man/ko_KR/man4x /usr/share/man/ko_KR/man5 /usr/share/man/ko_KR/man5x /usr/share/man/ko_KR/man6 /usr/share/man/ko_KR/man6x /usr/share/man/ko_KR/man7 /usr/share/man/ko_KR/man7x /usr/share/man/ko_KR/man8 /usr/share/man/ko_KR/man8x /usr/share/man/ko_KR/man9 /usr/share/man/ko_KR/man9x /usr/share/man/ko_KR/mann /usr/share/man/ko/man0p /usr/share/man/ko/man1 /usr/share/man/ko/man1p /usr/share/man/ko/man1x /usr/share/man/ko/man2 /usr/share/man/ko/man2x /usr/share/man/ko/man3 /usr/share/man/ko/man3p /usr/share/man/ko/man3x /usr/share/man/ko/man4 /usr/share/man/ko/man4x /usr/share/man/ko/man5 /usr/share/man/ko/man5x /usr/share/man/ko/man6 /usr/share/man/ko/man6x /usr/share/man/ko/man7 /usr/share/man/ko/man7x /usr/share/man/ko/man8 /usr/share/man/ko/man8x /usr/share/man/ko/man9 /usr/share/man/ko/man9x /usr/share/man/ko/mann /usr/share/man/kos /usr/share/man/kos/man0p /usr/share/man/kos/man1 /usr/share/man/kos/man1p /usr/share/man/kos/man1x /usr/share/man/kos/man2 /usr/share/man/kos/man2x /usr/share/man/kos/man3 /usr/share/man/kos/man3p /usr/share/man/kos/man3x /usr/share/man/kos/man4 /usr/share/man/kos/man4x /usr/share/man/kos/man5 /usr/share/man/kos/man5x /usr/share/man/kos/man6 /usr/share/man/kos/man6x /usr/share/man/kos/man7 /usr/share/man/kos/man7x /usr/share/man/kos/man8 /usr/share/man/kos/man8x /usr/share/man/kos/man9 /usr/share/man/kos/man9x /usr/share/man/kos/mann /usr/share/man/kpe /usr/share/man/kpe/man0p /usr/share/man/kpe/man1 /usr/share/man/kpe/man1p /usr/share/man/kpe/man1x /usr/share/man/kpe/man2 /usr/share/man/kpe/man2x /usr/share/man/kpe/man3 /usr/share/man/kpe/man3p /usr/share/man/kpe/man3x /usr/share/man/kpe/man4 /usr/share/man/kpe/man4x /usr/share/man/kpe/man5 /usr/share/man/kpe/man5x /usr/share/man/kpe/man6 /usr/share/man/kpe/man6x /usr/share/man/kpe/man7 /usr/share/man/kpe/man7x /usr/share/man/kpe/man8 /usr/share/man/kpe/man8x /usr/share/man/kpe/man9 /usr/share/man/kpe/man9x /usr/share/man/kpe/mann /usr/share/man/kr /usr/share/man/krc /usr/share/man/krc/man0p /usr/share/man/krc/man1 /usr/share/man/krc/man1p /usr/share/man/krc/man1x /usr/share/man/krc/man2 /usr/share/man/krc/man2x /usr/share/man/krc/man3 /usr/share/man/krc/man3p /usr/share/man/krc/man3x /usr/share/man/krc/man4 /usr/share/man/krc/man4x /usr/share/man/krc/man5 /usr/share/man/krc/man5x /usr/share/man/krc/man6 /usr/share/man/krc/man6x /usr/share/man/krc/man7 /usr/share/man/krc/man7x /usr/share/man/krc/man8 /usr/share/man/krc/man8x /usr/share/man/krc/man9 /usr/share/man/krc/man9x /usr/share/man/krc/mann /usr/share/man/krl /usr/share/man/krl/man0p /usr/share/man/krl/man1 /usr/share/man/krl/man1p /usr/share/man/krl/man1x /usr/share/man/krl/man2 /usr/share/man/krl/man2x /usr/share/man/krl/man3 /usr/share/man/krl/man3p /usr/share/man/krl/man3x /usr/share/man/krl/man4 /usr/share/man/krl/man4x /usr/share/man/krl/man5 /usr/share/man/krl/man5x /usr/share/man/krl/man6 /usr/share/man/krl/man6x /usr/share/man/krl/man7 /usr/share/man/krl/man7x /usr/share/man/krl/man8 /usr/share/man/krl/man8x /usr/share/man/krl/man9 /usr/share/man/krl/man9x /usr/share/man/krl/mann /usr/share/man/kr/man0p /usr/share/man/kr/man1 /usr/share/man/kr/man1p /usr/share/man/kr/man1x /usr/share/man/kr/man2 /usr/share/man/kr/man2x /usr/share/man/kr/man3 /usr/share/man/kr/man3p /usr/share/man/kr/man3x /usr/share/man/kr/man4 /usr/share/man/kr/man4x /usr/share/man/kr/man5 /usr/share/man/kr/man5x /usr/share/man/kr/man6 /usr/share/man/kr/man6x /usr/share/man/kr/man7 /usr/share/man/kr/man7x /usr/share/man/kr/man8 /usr/share/man/kr/man8x /usr/share/man/kr/man9 /usr/share/man/kr/man9x /usr/share/man/kr/mann /usr/share/man/kro /usr/share/man/kro/man0p /usr/share/man/kro/man1 /usr/share/man/kro/man1p /usr/share/man/kro/man1x /usr/share/man/kro/man2 /usr/share/man/kro/man2x /usr/share/man/kro/man3 /usr/share/man/kro/man3p /usr/share/man/kro/man3x /usr/share/man/kro/man4 /usr/share/man/kro/man4x /usr/share/man/kro/man5 /usr/share/man/kro/man5x /usr/share/man/kro/man6 /usr/share/man/kro/man6x /usr/share/man/kro/man7 /usr/share/man/kro/man7x /usr/share/man/kro/man8 /usr/share/man/kro/man8x /usr/share/man/kro/man9 /usr/share/man/kro/man9x /usr/share/man/kro/mann /usr/share/man/kru /usr/share/man/kru/man0p /usr/share/man/kru/man1 /usr/share/man/kru/man1p /usr/share/man/kru/man1x /usr/share/man/kru/man2 /usr/share/man/kru/man2x /usr/share/man/kru/man3 /usr/share/man/kru/man3p /usr/share/man/kru/man3x /usr/share/man/kru/man4 /usr/share/man/kru/man4x /usr/share/man/kru/man5 /usr/share/man/kru/man5x /usr/share/man/kru/man6 /usr/share/man/kru/man6x /usr/share/man/kru/man7 /usr/share/man/kru/man7x /usr/share/man/kru/man8 /usr/share/man/kru/man8x /usr/share/man/kru/man9 /usr/share/man/kru/man9x /usr/share/man/kru/mann /usr/share/man/ks /usr/share/man/ks@devanagari /usr/share/man/ks@devanagari/man0p /usr/share/man/ks@devanagari/man1 /usr/share/man/ks@devanagari/man1p /usr/share/man/ks@devanagari/man1x /usr/share/man/ks@devanagari/man2 /usr/share/man/ks@devanagari/man2x /usr/share/man/ks@devanagari/man3 /usr/share/man/ks@devanagari/man3p /usr/share/man/ks@devanagari/man3x /usr/share/man/ks@devanagari/man4 /usr/share/man/ks@devanagari/man4x /usr/share/man/ks@devanagari/man5 /usr/share/man/ks@devanagari/man5x /usr/share/man/ks@devanagari/man6 /usr/share/man/ks@devanagari/man6x /usr/share/man/ks@devanagari/man7 /usr/share/man/ks@devanagari/man7x /usr/share/man/ks@devanagari/man8 /usr/share/man/ks@devanagari/man8x /usr/share/man/ks@devanagari/man9 /usr/share/man/ks@devanagari/man9x /usr/share/man/ks@devanagari/mann /usr/share/man/ks/man0p /usr/share/man/ks/man1 /usr/share/man/ks/man1p /usr/share/man/ks/man1x /usr/share/man/ks/man2 /usr/share/man/ks/man2x /usr/share/man/ks/man3 /usr/share/man/ks/man3p /usr/share/man/ks/man3x /usr/share/man/ks/man4 /usr/share/man/ks/man4x /usr/share/man/ks/man5 /usr/share/man/ks/man5x /usr/share/man/ks/man6 /usr/share/man/ks/man6x /usr/share/man/ks/man7 /usr/share/man/ks/man7x /usr/share/man/ks/man8 /usr/share/man/ks/man8x /usr/share/man/ks/man9 /usr/share/man/ks/man9x /usr/share/man/ks/mann /usr/share/man/ku /usr/share/man/kum /usr/share/man/ku/man0p /usr/share/man/ku/man1 /usr/share/man/ku/man1p /usr/share/man/ku/man1x /usr/share/man/ku/man2 /usr/share/man/ku/man2x /usr/share/man/ku/man3 /usr/share/man/ku/man3p /usr/share/man/ku/man3x /usr/share/man/ku/man4 /usr/share/man/ku/man4x /usr/share/man/ku/man5 /usr/share/man/ku/man5x /usr/share/man/ku/man6 /usr/share/man/ku/man6x /usr/share/man/ku/man7 /usr/share/man/ku/man7x /usr/share/man/ku/man8 /usr/share/man/ku/man8x /usr/share/man/ku/man9 /usr/share/man/ku/man9x /usr/share/man/ku/mann /usr/share/man/kum/man0p /usr/share/man/kum/man1 /usr/share/man/kum/man1p /usr/share/man/kum/man1x /usr/share/man/kum/man2 /usr/share/man/kum/man2x /usr/share/man/kum/man3 /usr/share/man/kum/man3p /usr/share/man/kum/man3x /usr/share/man/kum/man4 /usr/share/man/kum/man4x /usr/share/man/kum/man5 /usr/share/man/kum/man5x /usr/share/man/kum/man6 /usr/share/man/kum/man6x /usr/share/man/kum/man7 /usr/share/man/kum/man7x /usr/share/man/kum/man8 /usr/share/man/kum/man8x /usr/share/man/kum/man9 /usr/share/man/kum/man9x /usr/share/man/kum/mann /usr/share/man/kut /usr/share/man/kut/man0p /usr/share/man/kut/man1 /usr/share/man/kut/man1p /usr/share/man/kut/man1x /usr/share/man/kut/man2 /usr/share/man/kut/man2x /usr/share/man/kut/man3 /usr/share/man/kut/man3p /usr/share/man/kut/man3x /usr/share/man/kut/man4 /usr/share/man/kut/man4x /usr/share/man/kut/man5 /usr/share/man/kut/man5x /usr/share/man/kut/man6 /usr/share/man/kut/man6x /usr/share/man/kut/man7 /usr/share/man/kut/man7x /usr/share/man/kut/man8 /usr/share/man/kut/man8x /usr/share/man/kut/man9 /usr/share/man/kut/man9x /usr/share/man/kut/mann /usr/share/man/kv /usr/share/man/kv/man0p /usr/share/man/kv/man1 /usr/share/man/kv/man1p /usr/share/man/kv/man1x /usr/share/man/kv/man2 /usr/share/man/kv/man2x /usr/share/man/kv/man3 /usr/share/man/kv/man3p /usr/share/man/kv/man3x /usr/share/man/kv/man4 /usr/share/man/kv/man4x /usr/share/man/kv/man5 /usr/share/man/kv/man5x /usr/share/man/kv/man6 /usr/share/man/kv/man6x /usr/share/man/kv/man7 /usr/share/man/kv/man7x /usr/share/man/kv/man8 /usr/share/man/kv/man8x /usr/share/man/kv/man9 /usr/share/man/kv/man9x /usr/share/man/kv/mann /usr/share/man/kw /usr/share/man/kw/man0p /usr/share/man/kw/man1 /usr/share/man/kw/man1p /usr/share/man/kw/man1x /usr/share/man/kw/man2 /usr/share/man/kw/man2x /usr/share/man/kw/man3 /usr/share/man/kw/man3p /usr/share/man/kw/man3x /usr/share/man/kw/man4 /usr/share/man/kw/man4x /usr/share/man/kw/man5 /usr/share/man/kw/man5x /usr/share/man/kw/man6 /usr/share/man/kw/man6x /usr/share/man/kw/man7 /usr/share/man/kw/man7x /usr/share/man/kw/man8 /usr/share/man/kw/man8x /usr/share/man/kw/man9 /usr/share/man/kw/man9x /usr/share/man/kw/mann /usr/share/man/ky /usr/share/man/ky/man0p /usr/share/man/ky/man1 /usr/share/man/ky/man1p /usr/share/man/ky/man1x /usr/share/man/ky/man2 /usr/share/man/ky/man2x /usr/share/man/ky/man3 /usr/share/man/ky/man3p /usr/share/man/ky/man3x /usr/share/man/ky/man4 /usr/share/man/ky/man4x /usr/share/man/ky/man5 /usr/share/man/ky/man5x /usr/share/man/ky/man6 /usr/share/man/ky/man6x /usr/share/man/ky/man7 /usr/share/man/ky/man7x /usr/share/man/ky/man8 /usr/share/man/ky/man8x /usr/share/man/ky/man9 /usr/share/man/ky/man9x /usr/share/man/ky/mann /usr/share/man/la /usr/share/man/lad /usr/share/man/lad/man0p /usr/share/man/lad/man1 /usr/share/man/lad/man1p /usr/share/man/lad/man1x /usr/share/man/lad/man2 /usr/share/man/lad/man2x /usr/share/man/lad/man3 /usr/share/man/lad/man3p /usr/share/man/lad/man3x /usr/share/man/lad/man4 /usr/share/man/lad/man4x /usr/share/man/lad/man5 /usr/share/man/lad/man5x /usr/share/man/lad/man6 /usr/share/man/lad/man6x /usr/share/man/lad/man7 /usr/share/man/lad/man7x /usr/share/man/lad/man8 /usr/share/man/lad/man8x /usr/share/man/lad/man9 /usr/share/man/lad/man9x /usr/share/man/lad/mann /usr/share/man/lah /usr/share/man/lah/man0p /usr/share/man/lah/man1 /usr/share/man/lah/man1p /usr/share/man/lah/man1x /usr/share/man/lah/man2 /usr/share/man/lah/man2x /usr/share/man/lah/man3 /usr/share/man/lah/man3p /usr/share/man/lah/man3x /usr/share/man/lah/man4 /usr/share/man/lah/man4x /usr/share/man/lah/man5 /usr/share/man/lah/man5x /usr/share/man/lah/man6 /usr/share/man/lah/man6x /usr/share/man/lah/man7 /usr/share/man/lah/man7x /usr/share/man/lah/man8 /usr/share/man/lah/man8x /usr/share/man/lah/man9 /usr/share/man/lah/man9x /usr/share/man/lah/mann /usr/share/man/lam /usr/share/man/la/man0p /usr/share/man/la/man1 /usr/share/man/la/man1p /usr/share/man/la/man1x /usr/share/man/la/man2 /usr/share/man/la/man2x /usr/share/man/la/man3 /usr/share/man/la/man3p /usr/share/man/la/man3x /usr/share/man/la/man4 /usr/share/man/la/man4x /usr/share/man/la/man5 /usr/share/man/la/man5x /usr/share/man/la/man6 /usr/share/man/la/man6x /usr/share/man/la/man7 /usr/share/man/la/man7x /usr/share/man/la/man8 /usr/share/man/la/man8x /usr/share/man/la/man9 /usr/share/man/la/man9x /usr/share/man/la/mann /usr/share/man/lam/man0p /usr/share/man/lam/man1 /usr/share/man/lam/man1p /usr/share/man/lam/man1x /usr/share/man/lam/man2 /usr/share/man/lam/man2x /usr/share/man/lam/man3 /usr/share/man/lam/man3p /usr/share/man/lam/man3x /usr/share/man/lam/man4 /usr/share/man/lam/man4x /usr/share/man/lam/man5 /usr/share/man/lam/man5x /usr/share/man/lam/man6 /usr/share/man/lam/man6x /usr/share/man/lam/man7 /usr/share/man/lam/man7x /usr/share/man/lam/man8 /usr/share/man/lam/man8x /usr/share/man/lam/man9 /usr/share/man/lam/man9x /usr/share/man/lam/mann /usr/share/man/lb /usr/share/man/lb/man0p /usr/share/man/lb/man1 /usr/share/man/lb/man1p /usr/share/man/lb/man1x /usr/share/man/lb/man2 /usr/share/man/lb/man2x /usr/share/man/lb/man3 /usr/share/man/lb/man3p /usr/share/man/lb/man3x /usr/share/man/lb/man4 /usr/share/man/lb/man4x /usr/share/man/lb/man5 /usr/share/man/lb/man5x /usr/share/man/lb/man6 /usr/share/man/lb/man6x /usr/share/man/lb/man7 /usr/share/man/lb/man7x /usr/share/man/lb/man8 /usr/share/man/lb/man8x /usr/share/man/lb/man9 /usr/share/man/lb/man9x /usr/share/man/lb/mann /usr/share/man/lez /usr/share/man/lez/man0p /usr/share/man/lez/man1 /usr/share/man/lez/man1p /usr/share/man/lez/man1x /usr/share/man/lez/man2 /usr/share/man/lez/man2x /usr/share/man/lez/man3 /usr/share/man/lez/man3p /usr/share/man/lez/man3x /usr/share/man/lez/man4 /usr/share/man/lez/man4x /usr/share/man/lez/man5 /usr/share/man/lez/man5x /usr/share/man/lez/man6 /usr/share/man/lez/man6x /usr/share/man/lez/man7 /usr/share/man/lez/man7x /usr/share/man/lez/man8 /usr/share/man/lez/man8x /usr/share/man/lez/man9 /usr/share/man/lez/man9x /usr/share/man/lez/mann /usr/share/man/lg /usr/share/man/lg/man0p /usr/share/man/lg/man1 /usr/share/man/lg/man1p /usr/share/man/lg/man1x /usr/share/man/lg/man2 /usr/share/man/lg/man2x /usr/share/man/lg/man3 /usr/share/man/lg/man3p /usr/share/man/lg/man3x /usr/share/man/lg/man4 /usr/share/man/lg/man4x /usr/share/man/lg/man5 /usr/share/man/lg/man5x /usr/share/man/lg/man6 /usr/share/man/lg/man6x /usr/share/man/lg/man7 /usr/share/man/lg/man7x /usr/share/man/lg/man8 /usr/share/man/lg/man8x /usr/share/man/lg/man9 /usr/share/man/lg/man9x /usr/share/man/lg/mann /usr/share/man/li /usr/share/man/li/man0p /usr/share/man/li/man1 /usr/share/man/li/man1p /usr/share/man/li/man1x /usr/share/man/li/man2 /usr/share/man/li/man2x /usr/share/man/li/man3 /usr/share/man/li/man3p /usr/share/man/li/man3x /usr/share/man/li/man4 /usr/share/man/li/man4x /usr/share/man/li/man5 /usr/share/man/li/man5x /usr/share/man/li/man6 /usr/share/man/li/man6x /usr/share/man/li/man7 /usr/share/man/li/man7x /usr/share/man/li/man8 /usr/share/man/li/man8x /usr/share/man/li/man9 /usr/share/man/li/man9x /usr/share/man/li/mann /usr/share/man/ln /usr/share/man/ln/man0p /usr/share/man/ln/man1 /usr/share/man/ln/man1p /usr/share/man/ln/man1x /usr/share/man/ln/man2 /usr/share/man/ln/man2x /usr/share/man/ln/man3 /usr/share/man/ln/man3p /usr/share/man/ln/man3x /usr/share/man/ln/man4 /usr/share/man/ln/man4x /usr/share/man/ln/man5 /usr/share/man/ln/man5x /usr/share/man/ln/man6 /usr/share/man/ln/man6x /usr/share/man/ln/man7 /usr/share/man/ln/man7x /usr/share/man/ln/man8 /usr/share/man/ln/man8x /usr/share/man/ln/man9 /usr/share/man/ln/man9x /usr/share/man/ln/mann /usr/share/man/lo /usr/share/man/lol /usr/share/man/lol/man0p /usr/share/man/lol/man1 /usr/share/man/lol/man1p /usr/share/man/lol/man1x /usr/share/man/lol/man2 /usr/share/man/lol/man2x /usr/share/man/lol/man3 /usr/share/man/lol/man3p /usr/share/man/lol/man3x /usr/share/man/lol/man4 /usr/share/man/lol/man4x /usr/share/man/lol/man5 /usr/share/man/lol/man5x /usr/share/man/lol/man6 /usr/share/man/lol/man6x /usr/share/man/lol/man7 /usr/share/man/lol/man7x /usr/share/man/lol/man8 /usr/share/man/lol/man8x /usr/share/man/lol/man9 /usr/share/man/lol/man9x /usr/share/man/lol/mann /usr/share/man/lo/man0p /usr/share/man/lo/man1 /usr/share/man/lo/man1p /usr/share/man/lo/man1x /usr/share/man/lo/man2 /usr/share/man/lo/man2x /usr/share/man/lo/man3 /usr/share/man/lo/man3p /usr/share/man/lo/man3x /usr/share/man/lo/man4 /usr/share/man/lo/man4x /usr/share/man/lo/man5 /usr/share/man/lo/man5x /usr/share/man/lo/man6 /usr/share/man/lo/man6x /usr/share/man/lo/man7 /usr/share/man/lo/man7x /usr/share/man/lo/man8 /usr/share/man/lo/man8x /usr/share/man/lo/man9 /usr/share/man/lo/man9x /usr/share/man/lo/mann /usr/share/man/loz /usr/share/man/loz/man0p /usr/share/man/loz/man1 /usr/share/man/loz/man1p /usr/share/man/loz/man1x /usr/share/man/loz/man2 /usr/share/man/loz/man2x /usr/share/man/loz/man3 /usr/share/man/loz/man3p /usr/share/man/loz/man3x /usr/share/man/loz/man4 /usr/share/man/loz/man4x /usr/share/man/loz/man5 /usr/share/man/loz/man5x /usr/share/man/loz/man6 /usr/share/man/loz/man6x /usr/share/man/loz/man7 /usr/share/man/loz/man7x /usr/share/man/loz/man8 /usr/share/man/loz/man8x /usr/share/man/loz/man9 /usr/share/man/loz/man9x /usr/share/man/loz/mann /usr/share/man/lt /usr/share/man/lt/man0p /usr/share/man/lt/man1 /usr/share/man/lt/man1p /usr/share/man/lt/man1x /usr/share/man/lt/man2 /usr/share/man/lt/man2x /usr/share/man/lt/man3 /usr/share/man/lt/man3p /usr/share/man/lt/man3x /usr/share/man/lt/man4 /usr/share/man/lt/man4x /usr/share/man/lt/man5 /usr/share/man/lt/man5x /usr/share/man/lt/man6 /usr/share/man/lt/man6x /usr/share/man/lt/man7 /usr/share/man/lt/man7x /usr/share/man/lt/man8 /usr/share/man/lt/man8x /usr/share/man/lt/man9 /usr/share/man/lt/man9x /usr/share/man/lt/mann /usr/share/man/lu /usr/share/man/lua /usr/share/man/lua/man0p /usr/share/man/lua/man1 /usr/share/man/lua/man1p /usr/share/man/lua/man1x /usr/share/man/lua/man2 /usr/share/man/lua/man2x /usr/share/man/lua/man3 /usr/share/man/lua/man3p /usr/share/man/lua/man3x /usr/share/man/lua/man4 /usr/share/man/lua/man4x /usr/share/man/lua/man5 /usr/share/man/lua/man5x /usr/share/man/lua/man6 /usr/share/man/lua/man6x /usr/share/man/lua/man7 /usr/share/man/lua/man7x /usr/share/man/lua/man8 /usr/share/man/lua/man8x /usr/share/man/lua/man9 /usr/share/man/lua/man9x /usr/share/man/lua/mann /usr/share/man/lui /usr/share/man/lui/man0p /usr/share/man/lui/man1 /usr/share/man/lui/man1p /usr/share/man/lui/man1x /usr/share/man/lui/man2 /usr/share/man/lui/man2x /usr/share/man/lui/man3 /usr/share/man/lui/man3p /usr/share/man/lui/man3x /usr/share/man/lui/man4 /usr/share/man/lui/man4x /usr/share/man/lui/man5 /usr/share/man/lui/man5x /usr/share/man/lui/man6 /usr/share/man/lui/man6x /usr/share/man/lui/man7 /usr/share/man/lui/man7x /usr/share/man/lui/man8 /usr/share/man/lui/man8x /usr/share/man/lui/man9 /usr/share/man/lui/man9x /usr/share/man/lui/mann /usr/share/man/lu/man0p /usr/share/man/lu/man1 /usr/share/man/lu/man1p /usr/share/man/lu/man1x /usr/share/man/lu/man2 /usr/share/man/lu/man2x /usr/share/man/lu/man3 /usr/share/man/lu/man3p /usr/share/man/lu/man3x /usr/share/man/lu/man4 /usr/share/man/lu/man4x /usr/share/man/lu/man5 /usr/share/man/lu/man5x /usr/share/man/lu/man6 /usr/share/man/lu/man6x /usr/share/man/lu/man7 /usr/share/man/lu/man7x /usr/share/man/lu/man8 /usr/share/man/lu/man8x /usr/share/man/lu/man9 /usr/share/man/lu/man9x /usr/share/man/lu/mann /usr/share/man/lun /usr/share/man/lun/man0p /usr/share/man/lun/man1 /usr/share/man/lun/man1p /usr/share/man/lun/man1x /usr/share/man/lun/man2 /usr/share/man/lun/man2x /usr/share/man/lun/man3 /usr/share/man/lun/man3p /usr/share/man/lun/man3x /usr/share/man/lun/man4 /usr/share/man/lun/man4x /usr/share/man/lun/man5 /usr/share/man/lun/man5x /usr/share/man/lun/man6 /usr/share/man/lun/man6x /usr/share/man/lun/man7 /usr/share/man/lun/man7x /usr/share/man/lun/man8 /usr/share/man/lun/man8x /usr/share/man/lun/man9 /usr/share/man/lun/man9x /usr/share/man/lun/mann /usr/share/man/luo /usr/share/man/luo/man0p /usr/share/man/luo/man1 /usr/share/man/luo/man1p /usr/share/man/luo/man1x /usr/share/man/luo/man2 /usr/share/man/luo/man2x /usr/share/man/luo/man3 /usr/share/man/luo/man3p /usr/share/man/luo/man3x /usr/share/man/luo/man4 /usr/share/man/luo/man4x /usr/share/man/luo/man5 /usr/share/man/luo/man5x /usr/share/man/luo/man6 /usr/share/man/luo/man6x /usr/share/man/luo/man7 /usr/share/man/luo/man7x /usr/share/man/luo/man8 /usr/share/man/luo/man8x /usr/share/man/luo/man9 /usr/share/man/luo/man9x /usr/share/man/luo/mann /usr/share/man/lus /usr/share/man/lus/man0p /usr/share/man/lus/man1 /usr/share/man/lus/man1p /usr/share/man/lus/man1x /usr/share/man/lus/man2 /usr/share/man/lus/man2x /usr/share/man/lus/man3 /usr/share/man/lus/man3p /usr/share/man/lus/man3x /usr/share/man/lus/man4 /usr/share/man/lus/man4x /usr/share/man/lus/man5 /usr/share/man/lus/man5x /usr/share/man/lus/man6 /usr/share/man/lus/man6x /usr/share/man/lus/man7 /usr/share/man/lus/man7x /usr/share/man/lus/man8 /usr/share/man/lus/man8x /usr/share/man/lus/man9 /usr/share/man/lus/man9x /usr/share/man/lus/mann /usr/share/man/lv /usr/share/man/lv_LV /usr/share/man/lv_LV/man0p /usr/share/man/lv_LV/man1 /usr/share/man/lv_LV/man1p /usr/share/man/lv_LV/man1x /usr/share/man/lv_LV/man2 /usr/share/man/lv_LV/man2x /usr/share/man/lv_LV/man3 /usr/share/man/lv_LV/man3p /usr/share/man/lv_LV/man3x /usr/share/man/lv_LV/man4 /usr/share/man/lv_LV/man4x /usr/share/man/lv_LV/man5 /usr/share/man/lv_LV/man5x /usr/share/man/lv_LV/man6 /usr/share/man/lv_LV/man6x /usr/share/man/lv_LV/man7 /usr/share/man/lv_LV/man7x /usr/share/man/lv_LV/man8 /usr/share/man/lv_LV/man8x /usr/share/man/lv_LV/man9 /usr/share/man/lv_LV/man9x /usr/share/man/lv_LV/mann /usr/share/man/lv/man0p /usr/share/man/lv/man1 /usr/share/man/lv/man1p /usr/share/man/lv/man1x /usr/share/man/lv/man2 /usr/share/man/lv/man2x /usr/share/man/lv/man3 /usr/share/man/lv/man3p /usr/share/man/lv/man3x /usr/share/man/lv/man4 /usr/share/man/lv/man4x /usr/share/man/lv/man5 /usr/share/man/lv/man5x /usr/share/man/lv/man6 /usr/share/man/lv/man6x /usr/share/man/lv/man7 /usr/share/man/lv/man7x /usr/share/man/lv/man8 /usr/share/man/lv/man8x /usr/share/man/lv/man9 /usr/share/man/lv/man9x /usr/share/man/lv/mann /usr/share/man/mad /usr/share/man/mad/man0p /usr/share/man/mad/man1 /usr/share/man/mad/man1p /usr/share/man/mad/man1x /usr/share/man/mad/man2 /usr/share/man/mad/man2x /usr/share/man/mad/man3 /usr/share/man/mad/man3p /usr/share/man/mad/man3x /usr/share/man/mad/man4 /usr/share/man/mad/man4x /usr/share/man/mad/man5 /usr/share/man/mad/man5x /usr/share/man/mad/man6 /usr/share/man/mad/man6x /usr/share/man/mad/man7 /usr/share/man/mad/man7x /usr/share/man/mad/man8 /usr/share/man/mad/man8x /usr/share/man/mad/man9 /usr/share/man/mad/man9x /usr/share/man/mad/mann /usr/share/man/mag /usr/share/man/mag/man0p /usr/share/man/mag/man1 /usr/share/man/mag/man1p /usr/share/man/mag/man1x /usr/share/man/mag/man2 /usr/share/man/mag/man2x /usr/share/man/mag/man3 /usr/share/man/mag/man3p /usr/share/man/mag/man3x /usr/share/man/mag/man4 /usr/share/man/mag/man4x /usr/share/man/mag/man5 /usr/share/man/mag/man5x /usr/share/man/mag/man6 /usr/share/man/mag/man6x /usr/share/man/mag/man7 /usr/share/man/mag/man7x /usr/share/man/mag/man8 /usr/share/man/mag/man8x /usr/share/man/mag/man9 /usr/share/man/mag/man9x /usr/share/man/mag/mann /usr/share/man/mai /usr/share/man/mai/man0p /usr/share/man/mai/man1 /usr/share/man/mai/man1p /usr/share/man/mai/man1x /usr/share/man/mai/man2 /usr/share/man/mai/man2x /usr/share/man/mai/man3 /usr/share/man/mai/man3p /usr/share/man/mai/man3x /usr/share/man/mai/man4 /usr/share/man/mai/man4x /usr/share/man/mai/man5 /usr/share/man/mai/man5x /usr/share/man/mai/man6 /usr/share/man/mai/man6x /usr/share/man/mai/man7 /usr/share/man/mai/man7x /usr/share/man/mai/man8 /usr/share/man/mai/man8x /usr/share/man/mai/man9 /usr/share/man/mai/man9x /usr/share/man/mai/mann /usr/share/man/mak /usr/share/man/mak/man0p /usr/share/man/mak/man1 /usr/share/man/mak/man1p /usr/share/man/mak/man1x /usr/share/man/mak/man2 /usr/share/man/mak/man2x /usr/share/man/mak/man3 /usr/share/man/mak/man3p /usr/share/man/mak/man3x /usr/share/man/mak/man4 /usr/share/man/mak/man4x /usr/share/man/mak/man5 /usr/share/man/mak/man5x /usr/share/man/mak/man6 /usr/share/man/mak/man6x /usr/share/man/mak/man7 /usr/share/man/mak/man7x /usr/share/man/mak/man8 /usr/share/man/mak/man8x /usr/share/man/mak/man9 /usr/share/man/mak/man9x /usr/share/man/mak/mann /usr/share/man/man /usr/share/man/man0p /usr/share/man/man1 /usr/share/man/man1p /usr/share/man/man1x /usr/share/man/man2 /usr/share/man/man2x /usr/share/man/man3 /usr/share/man/man3p /usr/share/man/man3x /usr/share/man/man4 /usr/share/man/man4x /usr/share/man/man5 /usr/share/man/man5x /usr/share/man/man6 /usr/share/man/man6x /usr/share/man/man7 /usr/share/man/man7x /usr/share/man/man8 /usr/share/man/man8x /usr/share/man/man9 /usr/share/man/man9x /usr/share/man/man/man0p /usr/share/man/man/man1 /usr/share/man/man/man1p /usr/share/man/man/man1x /usr/share/man/man/man2 /usr/share/man/man/man2x /usr/share/man/man/man3 /usr/share/man/man/man3p /usr/share/man/man/man3x /usr/share/man/man/man4 /usr/share/man/man/man4x /usr/share/man/man/man5 /usr/share/man/man/man5x /usr/share/man/man/man6 /usr/share/man/man/man6x /usr/share/man/man/man7 /usr/share/man/man/man7x /usr/share/man/man/man8 /usr/share/man/man/man8x /usr/share/man/man/man9 /usr/share/man/man/man9x /usr/share/man/man/mann /usr/share/man/mann /usr/share/man/map /usr/share/man/map/man0p /usr/share/man/map/man1 /usr/share/man/map/man1p /usr/share/man/map/man1x /usr/share/man/map/man2 /usr/share/man/map/man2x /usr/share/man/map/man3 /usr/share/man/map/man3p /usr/share/man/map/man3x /usr/share/man/map/man4 /usr/share/man/map/man4x /usr/share/man/map/man5 /usr/share/man/map/man5x /usr/share/man/map/man6 /usr/share/man/map/man6x /usr/share/man/map/man7 /usr/share/man/map/man7x /usr/share/man/map/man8 /usr/share/man/map/man8x /usr/share/man/map/man9 /usr/share/man/map/man9x /usr/share/man/map/mann /usr/share/man/mas /usr/share/man/mas/man0p /usr/share/man/mas/man1 /usr/share/man/mas/man1p /usr/share/man/mas/man1x /usr/share/man/mas/man2 /usr/share/man/mas/man2x /usr/share/man/mas/man3 /usr/share/man/mas/man3p /usr/share/man/mas/man3x /usr/share/man/mas/man4 /usr/share/man/mas/man4x /usr/share/man/mas/man5 /usr/share/man/mas/man5x /usr/share/man/mas/man6 /usr/share/man/mas/man6x /usr/share/man/mas/man7 /usr/share/man/mas/man7x /usr/share/man/mas/man8 /usr/share/man/mas/man8x /usr/share/man/mas/man9 /usr/share/man/mas/man9x /usr/share/man/mas/mann /usr/share/man/mdf /usr/share/man/mdf/man0p /usr/share/man/mdf/man1 /usr/share/man/mdf/man1p /usr/share/man/mdf/man1x /usr/share/man/mdf/man2 /usr/share/man/mdf/man2x /usr/share/man/mdf/man3 /usr/share/man/mdf/man3p /usr/share/man/mdf/man3x /usr/share/man/mdf/man4 /usr/share/man/mdf/man4x /usr/share/man/mdf/man5 /usr/share/man/mdf/man5x /usr/share/man/mdf/man6 /usr/share/man/mdf/man6x /usr/share/man/mdf/man7 /usr/share/man/mdf/man7x /usr/share/man/mdf/man8 /usr/share/man/mdf/man8x /usr/share/man/mdf/man9 /usr/share/man/mdf/man9x /usr/share/man/mdf/mann /usr/share/man/mdr /usr/share/man/mdr/man0p /usr/share/man/mdr/man1 /usr/share/man/mdr/man1p /usr/share/man/mdr/man1x /usr/share/man/mdr/man2 /usr/share/man/mdr/man2x /usr/share/man/mdr/man3 /usr/share/man/mdr/man3p /usr/share/man/mdr/man3x /usr/share/man/mdr/man4 /usr/share/man/mdr/man4x /usr/share/man/mdr/man5 /usr/share/man/mdr/man5x /usr/share/man/mdr/man6 /usr/share/man/mdr/man6x /usr/share/man/mdr/man7 /usr/share/man/mdr/man7x /usr/share/man/mdr/man8 /usr/share/man/mdr/man8x /usr/share/man/mdr/man9 /usr/share/man/mdr/man9x /usr/share/man/mdr/mann /usr/share/man/men /usr/share/man/men/man0p /usr/share/man/men/man1 /usr/share/man/men/man1p /usr/share/man/men/man1x /usr/share/man/men/man2 /usr/share/man/men/man2x /usr/share/man/men/man3 /usr/share/man/men/man3p /usr/share/man/men/man3x /usr/share/man/men/man4 /usr/share/man/men/man4x /usr/share/man/men/man5 /usr/share/man/men/man5x /usr/share/man/men/man6 /usr/share/man/men/man6x /usr/share/man/men/man7 /usr/share/man/men/man7x /usr/share/man/men/man8 /usr/share/man/men/man8x /usr/share/man/men/man9 /usr/share/man/men/man9x /usr/share/man/men/mann /usr/share/man/mg /usr/share/man/mga /usr/share/man/mga/man0p /usr/share/man/mga/man1 /usr/share/man/mga/man1p /usr/share/man/mga/man1x /usr/share/man/mga/man2 /usr/share/man/mga/man2x /usr/share/man/mga/man3 /usr/share/man/mga/man3p /usr/share/man/mga/man3x /usr/share/man/mga/man4 /usr/share/man/mga/man4x /usr/share/man/mga/man5 /usr/share/man/mga/man5x /usr/share/man/mga/man6 /usr/share/man/mga/man6x /usr/share/man/mga/man7 /usr/share/man/mga/man7x /usr/share/man/mga/man8 /usr/share/man/mga/man8x /usr/share/man/mga/man9 /usr/share/man/mga/man9x /usr/share/man/mga/mann /usr/share/man/mg/man0p /usr/share/man/mg/man1 /usr/share/man/mg/man1p /usr/share/man/mg/man1x /usr/share/man/mg/man2 /usr/share/man/mg/man2x /usr/share/man/mg/man3 /usr/share/man/mg/man3p /usr/share/man/mg/man3x /usr/share/man/mg/man4 /usr/share/man/mg/man4x /usr/share/man/mg/man5 /usr/share/man/mg/man5x /usr/share/man/mg/man6 /usr/share/man/mg/man6x /usr/share/man/mg/man7 /usr/share/man/mg/man7x /usr/share/man/mg/man8 /usr/share/man/mg/man8x /usr/share/man/mg/man9 /usr/share/man/mg/man9x /usr/share/man/mg/mann /usr/share/man/mh /usr/share/man/mh/man0p /usr/share/man/mh/man1 /usr/share/man/mh/man1p /usr/share/man/mh/man1x /usr/share/man/mh/man2 /usr/share/man/mh/man2x /usr/share/man/mh/man3 /usr/share/man/mh/man3p /usr/share/man/mh/man3x /usr/share/man/mh/man4 /usr/share/man/mh/man4x /usr/share/man/mh/man5 /usr/share/man/mh/man5x /usr/share/man/mh/man6 /usr/share/man/mh/man6x /usr/share/man/mh/man7 /usr/share/man/mh/man7x /usr/share/man/mh/man8 /usr/share/man/mh/man8x /usr/share/man/mh/man9 /usr/share/man/mh/man9x /usr/share/man/mh/mann /usr/share/man/mi /usr/share/man/mic /usr/share/man/mic/man0p /usr/share/man/mic/man1 /usr/share/man/mic/man1p /usr/share/man/mic/man1x /usr/share/man/mic/man2 /usr/share/man/mic/man2x /usr/share/man/mic/man3 /usr/share/man/mic/man3p /usr/share/man/mic/man3x /usr/share/man/mic/man4 /usr/share/man/mic/man4x /usr/share/man/mic/man5 /usr/share/man/mic/man5x /usr/share/man/mic/man6 /usr/share/man/mic/man6x /usr/share/man/mic/man7 /usr/share/man/mic/man7x /usr/share/man/mic/man8 /usr/share/man/mic/man8x /usr/share/man/mic/man9 /usr/share/man/mic/man9x /usr/share/man/mic/mann /usr/share/man/mi/man0p /usr/share/man/mi/man1 /usr/share/man/mi/man1p /usr/share/man/mi/man1x /usr/share/man/mi/man2 /usr/share/man/mi/man2x /usr/share/man/mi/man3 /usr/share/man/mi/man3p /usr/share/man/mi/man3x /usr/share/man/mi/man4 /usr/share/man/mi/man4x /usr/share/man/mi/man5 /usr/share/man/mi/man5x /usr/share/man/mi/man6 /usr/share/man/mi/man6x /usr/share/man/mi/man7 /usr/share/man/mi/man7x /usr/share/man/mi/man8 /usr/share/man/mi/man8x /usr/share/man/mi/man9 /usr/share/man/mi/man9x /usr/share/man/mi/mann /usr/share/man/min /usr/share/man/min/man0p /usr/share/man/min/man1 /usr/share/man/min/man1p /usr/share/man/min/man1x /usr/share/man/min/man2 /usr/share/man/min/man2x /usr/share/man/min/man3 /usr/share/man/min/man3p /usr/share/man/min/man3x /usr/share/man/min/man4 /usr/share/man/min/man4x /usr/share/man/min/man5 /usr/share/man/min/man5x /usr/share/man/min/man6 /usr/share/man/min/man6x /usr/share/man/min/man7 /usr/share/man/min/man7x /usr/share/man/min/man8 /usr/share/man/min/man8x /usr/share/man/min/man9 /usr/share/man/min/man9x /usr/share/man/min/mann /usr/share/man/mis /usr/share/man/mis/man0p /usr/share/man/mis/man1 /usr/share/man/mis/man1p /usr/share/man/mis/man1x /usr/share/man/mis/man2 /usr/share/man/mis/man2x /usr/share/man/mis/man3 /usr/share/man/mis/man3p /usr/share/man/mis/man3x /usr/share/man/mis/man4 /usr/share/man/mis/man4x /usr/share/man/mis/man5 /usr/share/man/mis/man5x /usr/share/man/mis/man6 /usr/share/man/mis/man6x /usr/share/man/mis/man7 /usr/share/man/mis/man7x /usr/share/man/mis/man8 /usr/share/man/mis/man8x /usr/share/man/mis/man9 /usr/share/man/mis/man9x /usr/share/man/mis/mann /usr/share/man/mk /usr/share/man/mkh /usr/share/man/mkh/man0p /usr/share/man/mkh/man1 /usr/share/man/mkh/man1p /usr/share/man/mkh/man1x /usr/share/man/mkh/man2 /usr/share/man/mkh/man2x /usr/share/man/mkh/man3 /usr/share/man/mkh/man3p /usr/share/man/mkh/man3x /usr/share/man/mkh/man4 /usr/share/man/mkh/man4x /usr/share/man/mkh/man5 /usr/share/man/mkh/man5x /usr/share/man/mkh/man6 /usr/share/man/mkh/man6x /usr/share/man/mkh/man7 /usr/share/man/mkh/man7x /usr/share/man/mkh/man8 /usr/share/man/mkh/man8x /usr/share/man/mkh/man9 /usr/share/man/mkh/man9x /usr/share/man/mkh/mann /usr/share/man/mk/man0p /usr/share/man/mk/man1 /usr/share/man/mk/man1p /usr/share/man/mk/man1x /usr/share/man/mk/man2 /usr/share/man/mk/man2x /usr/share/man/mk/man3 /usr/share/man/mk/man3p /usr/share/man/mk/man3x /usr/share/man/mk/man4 /usr/share/man/mk/man4x /usr/share/man/mk/man5 /usr/share/man/mk/man5x /usr/share/man/mk/man6 /usr/share/man/mk/man6x /usr/share/man/mk/man7 /usr/share/man/mk/man7x /usr/share/man/mk/man8 /usr/share/man/mk/man8x /usr/share/man/mk/man9 /usr/share/man/mk/man9x /usr/share/man/mk/mann /usr/share/man/ml /usr/share/man/ml/man0p /usr/share/man/ml/man1 /usr/share/man/ml/man1p /usr/share/man/ml/man1x /usr/share/man/ml/man2 /usr/share/man/ml/man2x /usr/share/man/ml/man3 /usr/share/man/ml/man3p /usr/share/man/ml/man3x /usr/share/man/ml/man4 /usr/share/man/ml/man4x /usr/share/man/ml/man5 /usr/share/man/ml/man5x /usr/share/man/ml/man6 /usr/share/man/ml/man6x /usr/share/man/ml/man7 /usr/share/man/ml/man7x /usr/share/man/ml/man8 /usr/share/man/ml/man8x /usr/share/man/ml/man9 /usr/share/man/ml/man9x /usr/share/man/ml/mann /usr/share/man/mn /usr/share/man/mnc /usr/share/man/mnc/man0p /usr/share/man/mnc/man1 /usr/share/man/mnc/man1p /usr/share/man/mnc/man1x /usr/share/man/mnc/man2 /usr/share/man/mnc/man2x /usr/share/man/mnc/man3 /usr/share/man/mnc/man3p /usr/share/man/mnc/man3x /usr/share/man/mnc/man4 /usr/share/man/mnc/man4x /usr/share/man/mnc/man5 /usr/share/man/mnc/man5x /usr/share/man/mnc/man6 /usr/share/man/mnc/man6x /usr/share/man/mnc/man7 /usr/share/man/mnc/man7x /usr/share/man/mnc/man8 /usr/share/man/mnc/man8x /usr/share/man/mnc/man9 /usr/share/man/mnc/man9x /usr/share/man/mnc/mann /usr/share/man/mni /usr/share/man/mni/man0p /usr/share/man/mni/man1 /usr/share/man/mni/man1p /usr/share/man/mni/man1x /usr/share/man/mni/man2 /usr/share/man/mni/man2x /usr/share/man/mni/man3 /usr/share/man/mni/man3p /usr/share/man/mni/man3x /usr/share/man/mni/man4 /usr/share/man/mni/man4x /usr/share/man/mni/man5 /usr/share/man/mni/man5x /usr/share/man/mni/man6 /usr/share/man/mni/man6x /usr/share/man/mni/man7 /usr/share/man/mni/man7x /usr/share/man/mni/man8 /usr/share/man/mni/man8x /usr/share/man/mni/man9 /usr/share/man/mni/man9x /usr/share/man/mni/mann /usr/share/man/mn/man0p /usr/share/man/mn/man1 /usr/share/man/mn/man1p /usr/share/man/mn/man1x /usr/share/man/mn/man2 /usr/share/man/mn/man2x /usr/share/man/mn/man3 /usr/share/man/mn/man3p /usr/share/man/mn/man3x /usr/share/man/mn/man4 /usr/share/man/mn/man4x /usr/share/man/mn/man5 /usr/share/man/mn/man5x /usr/share/man/mn/man6 /usr/share/man/mn/man6x /usr/share/man/mn/man7 /usr/share/man/mn/man7x /usr/share/man/mn/man8 /usr/share/man/mn/man8x /usr/share/man/mn/man9 /usr/share/man/mn/man9x /usr/share/man/mn/mann /usr/share/man/mno /usr/share/man/mno/man0p /usr/share/man/mno/man1 /usr/share/man/mno/man1p /usr/share/man/mno/man1x /usr/share/man/mno/man2 /usr/share/man/mno/man2x /usr/share/man/mno/man3 /usr/share/man/mno/man3p /usr/share/man/mno/man3x /usr/share/man/mno/man4 /usr/share/man/mno/man4x /usr/share/man/mno/man5 /usr/share/man/mno/man5x /usr/share/man/mno/man6 /usr/share/man/mno/man6x /usr/share/man/mno/man7 /usr/share/man/mno/man7x /usr/share/man/mno/man8 /usr/share/man/mno/man8x /usr/share/man/mno/man9 /usr/share/man/mno/man9x /usr/share/man/mno/mann /usr/share/man/mo /usr/share/man/moh /usr/share/man/moh/man0p /usr/share/man/moh/man1 /usr/share/man/moh/man1p /usr/share/man/moh/man1x /usr/share/man/moh/man2 /usr/share/man/moh/man2x /usr/share/man/moh/man3 /usr/share/man/moh/man3p /usr/share/man/moh/man3x /usr/share/man/moh/man4 /usr/share/man/moh/man4x /usr/share/man/moh/man5 /usr/share/man/moh/man5x /usr/share/man/moh/man6 /usr/share/man/moh/man6x /usr/share/man/moh/man7 /usr/share/man/moh/man7x /usr/share/man/moh/man8 /usr/share/man/moh/man8x /usr/share/man/moh/man9 /usr/share/man/moh/man9x /usr/share/man/moh/mann /usr/share/man/mo/man0p /usr/share/man/mo/man1 /usr/share/man/mo/man1p /usr/share/man/mo/man1x /usr/share/man/mo/man2 /usr/share/man/mo/man2x /usr/share/man/mo/man3 /usr/share/man/mo/man3p /usr/share/man/mo/man3x /usr/share/man/mo/man4 /usr/share/man/mo/man4x /usr/share/man/mo/man5 /usr/share/man/mo/man5x /usr/share/man/mo/man6 /usr/share/man/mo/man6x /usr/share/man/mo/man7 /usr/share/man/mo/man7x /usr/share/man/mo/man8 /usr/share/man/mo/man8x /usr/share/man/mo/man9 /usr/share/man/mo/man9x /usr/share/man/mo/mann /usr/share/man/mos /usr/share/man/mos/man0p /usr/share/man/mos/man1 /usr/share/man/mos/man1p /usr/share/man/mos/man1x /usr/share/man/mos/man2 /usr/share/man/mos/man2x /usr/share/man/mos/man3 /usr/share/man/mos/man3p /usr/share/man/mos/man3x /usr/share/man/mos/man4 /usr/share/man/mos/man4x /usr/share/man/mos/man5 /usr/share/man/mos/man5x /usr/share/man/mos/man6 /usr/share/man/mos/man6x /usr/share/man/mos/man7 /usr/share/man/mos/man7x /usr/share/man/mos/man8 /usr/share/man/mos/man8x /usr/share/man/mos/man9 /usr/share/man/mos/man9x /usr/share/man/mos/mann /usr/share/man/mr /usr/share/man/mr/man0p /usr/share/man/mr/man1 /usr/share/man/mr/man1p /usr/share/man/mr/man1x /usr/share/man/mr/man2 /usr/share/man/mr/man2x /usr/share/man/mr/man3 /usr/share/man/mr/man3p /usr/share/man/mr/man3x /usr/share/man/mr/man4 /usr/share/man/mr/man4x /usr/share/man/mr/man5 /usr/share/man/mr/man5x /usr/share/man/mr/man6 /usr/share/man/mr/man6x /usr/share/man/mr/man7 /usr/share/man/mr/man7x /usr/share/man/mr/man8 /usr/share/man/mr/man8x /usr/share/man/mr/man9 /usr/share/man/mr/man9x /usr/share/man/mr/mann /usr/share/man/ms /usr/share/man/ms/man0p /usr/share/man/ms/man1 /usr/share/man/ms/man1p /usr/share/man/ms/man1x /usr/share/man/ms/man2 /usr/share/man/ms/man2x /usr/share/man/ms/man3 /usr/share/man/ms/man3p /usr/share/man/ms/man3x /usr/share/man/ms/man4 /usr/share/man/ms/man4x /usr/share/man/ms/man5 /usr/share/man/ms/man5x /usr/share/man/ms/man6 /usr/share/man/ms/man6x /usr/share/man/ms/man7 /usr/share/man/ms/man7x /usr/share/man/ms/man8 /usr/share/man/ms/man8x /usr/share/man/ms/man9 /usr/share/man/ms/man9x /usr/share/man/ms/mann /usr/share/man/ms_MY /usr/share/man/ms_MY/man0p /usr/share/man/ms_MY/man1 /usr/share/man/ms_MY/man1p /usr/share/man/ms_MY/man1x /usr/share/man/ms_MY/man2 /usr/share/man/ms_MY/man2x /usr/share/man/ms_MY/man3 /usr/share/man/ms_MY/man3p /usr/share/man/ms_MY/man3x /usr/share/man/ms_MY/man4 /usr/share/man/ms_MY/man4x /usr/share/man/ms_MY/man5 /usr/share/man/ms_MY/man5x /usr/share/man/ms_MY/man6 /usr/share/man/ms_MY/man6x /usr/share/man/ms_MY/man7 /usr/share/man/ms_MY/man7x /usr/share/man/ms_MY/man8 /usr/share/man/ms_MY/man8x /usr/share/man/ms_MY/man9 /usr/share/man/ms_MY/man9x /usr/share/man/ms_MY/mann /usr/share/man/mt /usr/share/man/mt/man0p /usr/share/man/mt/man1 /usr/share/man/mt/man1p /usr/share/man/mt/man1x /usr/share/man/mt/man2 /usr/share/man/mt/man2x /usr/share/man/mt/man3 /usr/share/man/mt/man3p /usr/share/man/mt/man3x /usr/share/man/mt/man4 /usr/share/man/mt/man4x /usr/share/man/mt/man5 /usr/share/man/mt/man5x /usr/share/man/mt/man6 /usr/share/man/mt/man6x /usr/share/man/mt/man7 /usr/share/man/mt/man7x /usr/share/man/mt/man8 /usr/share/man/mt/man8x /usr/share/man/mt/man9 /usr/share/man/mt/man9x /usr/share/man/mt/mann /usr/share/man/mul /usr/share/man/mul/man0p /usr/share/man/mul/man1 /usr/share/man/mul/man1p /usr/share/man/mul/man1x /usr/share/man/mul/man2 /usr/share/man/mul/man2x /usr/share/man/mul/man3 /usr/share/man/mul/man3p /usr/share/man/mul/man3x /usr/share/man/mul/man4 /usr/share/man/mul/man4x /usr/share/man/mul/man5 /usr/share/man/mul/man5x /usr/share/man/mul/man6 /usr/share/man/mul/man6x /usr/share/man/mul/man7 /usr/share/man/mul/man7x /usr/share/man/mul/man8 /usr/share/man/mul/man8x /usr/share/man/mul/man9 /usr/share/man/mul/man9x /usr/share/man/mul/mann /usr/share/man/mun /usr/share/man/mun/man0p /usr/share/man/mun/man1 /usr/share/man/mun/man1p /usr/share/man/mun/man1x /usr/share/man/mun/man2 /usr/share/man/mun/man2x /usr/share/man/mun/man3 /usr/share/man/mun/man3p /usr/share/man/mun/man3x /usr/share/man/mun/man4 /usr/share/man/mun/man4x /usr/share/man/mun/man5 /usr/share/man/mun/man5x /usr/share/man/mun/man6 /usr/share/man/mun/man6x /usr/share/man/mun/man7 /usr/share/man/mun/man7x /usr/share/man/mun/man8 /usr/share/man/mun/man8x /usr/share/man/mun/man9 /usr/share/man/mun/man9x /usr/share/man/mun/mann /usr/share/man/mus /usr/share/man/mus/man0p /usr/share/man/mus/man1 /usr/share/man/mus/man1p /usr/share/man/mus/man1x /usr/share/man/mus/man2 /usr/share/man/mus/man2x /usr/share/man/mus/man3 /usr/share/man/mus/man3p /usr/share/man/mus/man3x /usr/share/man/mus/man4 /usr/share/man/mus/man4x /usr/share/man/mus/man5 /usr/share/man/mus/man5x /usr/share/man/mus/man6 /usr/share/man/mus/man6x /usr/share/man/mus/man7 /usr/share/man/mus/man7x /usr/share/man/mus/man8 /usr/share/man/mus/man8x /usr/share/man/mus/man9 /usr/share/man/mus/man9x /usr/share/man/mus/mann /usr/share/man/mwl /usr/share/man/mwl/man0p /usr/share/man/mwl/man1 /usr/share/man/mwl/man1p /usr/share/man/mwl/man1x /usr/share/man/mwl/man2 /usr/share/man/mwl/man2x /usr/share/man/mwl/man3 /usr/share/man/mwl/man3p /usr/share/man/mwl/man3x /usr/share/man/mwl/man4 /usr/share/man/mwl/man4x /usr/share/man/mwl/man5 /usr/share/man/mwl/man5x /usr/share/man/mwl/man6 /usr/share/man/mwl/man6x /usr/share/man/mwl/man7 /usr/share/man/mwl/man7x /usr/share/man/mwl/man8 /usr/share/man/mwl/man8x /usr/share/man/mwl/man9 /usr/share/man/mwl/man9x /usr/share/man/mwl/mann /usr/share/man/mwr /usr/share/man/mwr/man0p /usr/share/man/mwr/man1 /usr/share/man/mwr/man1p /usr/share/man/mwr/man1x /usr/share/man/mwr/man2 /usr/share/man/mwr/man2x /usr/share/man/mwr/man3 /usr/share/man/mwr/man3p /usr/share/man/mwr/man3x /usr/share/man/mwr/man4 /usr/share/man/mwr/man4x /usr/share/man/mwr/man5 /usr/share/man/mwr/man5x /usr/share/man/mwr/man6 /usr/share/man/mwr/man6x /usr/share/man/mwr/man7 /usr/share/man/mwr/man7x /usr/share/man/mwr/man8 /usr/share/man/mwr/man8x /usr/share/man/mwr/man9 /usr/share/man/mwr/man9x /usr/share/man/mwr/mann /usr/share/man/my /usr/share/man/my/man0p /usr/share/man/my/man1 /usr/share/man/my/man1p /usr/share/man/my/man1x /usr/share/man/my/man2 /usr/share/man/my/man2x /usr/share/man/my/man3 /usr/share/man/my/man3p /usr/share/man/my/man3x /usr/share/man/my/man4 /usr/share/man/my/man4x /usr/share/man/my/man5 /usr/share/man/my/man5x /usr/share/man/my/man6 /usr/share/man/my/man6x /usr/share/man/my/man7 /usr/share/man/my/man7x /usr/share/man/my/man8 /usr/share/man/my/man8x /usr/share/man/my/man9 /usr/share/man/my/man9x /usr/share/man/my/mann /usr/share/man/my_MM /usr/share/man/my_MM/man0p /usr/share/man/my_MM/man1 /usr/share/man/my_MM/man1p /usr/share/man/my_MM/man1x /usr/share/man/my_MM/man2 /usr/share/man/my_MM/man2x /usr/share/man/my_MM/man3 /usr/share/man/my_MM/man3p /usr/share/man/my_MM/man3x /usr/share/man/my_MM/man4 /usr/share/man/my_MM/man4x /usr/share/man/my_MM/man5 /usr/share/man/my_MM/man5x /usr/share/man/my_MM/man6 /usr/share/man/my_MM/man6x /usr/share/man/my_MM/man7 /usr/share/man/my_MM/man7x /usr/share/man/my_MM/man8 /usr/share/man/my_MM/man8x /usr/share/man/my_MM/man9 /usr/share/man/my_MM/man9x /usr/share/man/my_MM/mann /usr/share/man/myn /usr/share/man/myn/man0p /usr/share/man/myn/man1 /usr/share/man/myn/man1p /usr/share/man/myn/man1x /usr/share/man/myn/man2 /usr/share/man/myn/man2x /usr/share/man/myn/man3 /usr/share/man/myn/man3p /usr/share/man/myn/man3x /usr/share/man/myn/man4 /usr/share/man/myn/man4x /usr/share/man/myn/man5 /usr/share/man/myn/man5x /usr/share/man/myn/man6 /usr/share/man/myn/man6x /usr/share/man/myn/man7 /usr/share/man/myn/man7x /usr/share/man/myn/man8 /usr/share/man/myn/man8x /usr/share/man/myn/man9 /usr/share/man/myn/man9x /usr/share/man/myn/mann /usr/share/man/myv /usr/share/man/myv/man0p /usr/share/man/myv/man1 /usr/share/man/myv/man1p /usr/share/man/myv/man1x /usr/share/man/myv/man2 /usr/share/man/myv/man2x /usr/share/man/myv/man3 /usr/share/man/myv/man3p /usr/share/man/myv/man3x /usr/share/man/myv/man4 /usr/share/man/myv/man4x /usr/share/man/myv/man5 /usr/share/man/myv/man5x /usr/share/man/myv/man6 /usr/share/man/myv/man6x /usr/share/man/myv/man7 /usr/share/man/myv/man7x /usr/share/man/myv/man8 /usr/share/man/myv/man8x /usr/share/man/myv/man9 /usr/share/man/myv/man9x /usr/share/man/myv/mann /usr/share/man/na /usr/share/man/nah /usr/share/man/nah/man0p /usr/share/man/nah/man1 /usr/share/man/nah/man1p /usr/share/man/nah/man1x /usr/share/man/nah/man2 /usr/share/man/nah/man2x /usr/share/man/nah/man3 /usr/share/man/nah/man3p /usr/share/man/nah/man3x /usr/share/man/nah/man4 /usr/share/man/nah/man4x /usr/share/man/nah/man5 /usr/share/man/nah/man5x /usr/share/man/nah/man6 /usr/share/man/nah/man6x /usr/share/man/nah/man7 /usr/share/man/nah/man7x /usr/share/man/nah/man8 /usr/share/man/nah/man8x /usr/share/man/nah/man9 /usr/share/man/nah/man9x /usr/share/man/nah/mann /usr/share/man/nai /usr/share/man/nai/man0p /usr/share/man/nai/man1 /usr/share/man/nai/man1p /usr/share/man/nai/man1x /usr/share/man/nai/man2 /usr/share/man/nai/man2x /usr/share/man/nai/man3 /usr/share/man/nai/man3p /usr/share/man/nai/man3x /usr/share/man/nai/man4 /usr/share/man/nai/man4x /usr/share/man/nai/man5 /usr/share/man/nai/man5x /usr/share/man/nai/man6 /usr/share/man/nai/man6x /usr/share/man/nai/man7 /usr/share/man/nai/man7x /usr/share/man/nai/man8 /usr/share/man/nai/man8x /usr/share/man/nai/man9 /usr/share/man/nai/man9x /usr/share/man/nai/mann /usr/share/man/na/man0p /usr/share/man/na/man1 /usr/share/man/na/man1p /usr/share/man/na/man1x /usr/share/man/na/man2 /usr/share/man/na/man2x /usr/share/man/na/man3 /usr/share/man/na/man3p /usr/share/man/na/man3x /usr/share/man/na/man4 /usr/share/man/na/man4x /usr/share/man/na/man5 /usr/share/man/na/man5x /usr/share/man/na/man6 /usr/share/man/na/man6x /usr/share/man/na/man7 /usr/share/man/na/man7x /usr/share/man/na/man8 /usr/share/man/na/man8x /usr/share/man/na/man9 /usr/share/man/na/man9x /usr/share/man/na/mann /usr/share/man/nap /usr/share/man/nap/man0p /usr/share/man/nap/man1 /usr/share/man/nap/man1p /usr/share/man/nap/man1x /usr/share/man/nap/man2 /usr/share/man/nap/man2x /usr/share/man/nap/man3 /usr/share/man/nap/man3p /usr/share/man/nap/man3x /usr/share/man/nap/man4 /usr/share/man/nap/man4x /usr/share/man/nap/man5 /usr/share/man/nap/man5x /usr/share/man/nap/man6 /usr/share/man/nap/man6x /usr/share/man/nap/man7 /usr/share/man/nap/man7x /usr/share/man/nap/man8 /usr/share/man/nap/man8x /usr/share/man/nap/man9 /usr/share/man/nap/man9x /usr/share/man/nap/mann /usr/share/man/nb /usr/share/man/nb/man0p /usr/share/man/nb/man1 /usr/share/man/nb/man1p /usr/share/man/nb/man1x /usr/share/man/nb/man2 /usr/share/man/nb/man2x /usr/share/man/nb/man3 /usr/share/man/nb/man3p /usr/share/man/nb/man3x /usr/share/man/nb/man4 /usr/share/man/nb/man4x /usr/share/man/nb/man5 /usr/share/man/nb/man5x /usr/share/man/nb/man6 /usr/share/man/nb/man6x /usr/share/man/nb/man7 /usr/share/man/nb/man7x /usr/share/man/nb/man8 /usr/share/man/nb/man8x /usr/share/man/nb/man9 /usr/share/man/nb/man9x /usr/share/man/nb/mann /usr/share/man/nb_NO /usr/share/man/nb_NO/man0p /usr/share/man/nb_NO/man1 /usr/share/man/nb_NO/man1p /usr/share/man/nb_NO/man1x /usr/share/man/nb_NO/man2 /usr/share/man/nb_NO/man2x /usr/share/man/nb_NO/man3 /usr/share/man/nb_NO/man3p /usr/share/man/nb_NO/man3x /usr/share/man/nb_NO/man4 /usr/share/man/nb_NO/man4x /usr/share/man/nb_NO/man5 /usr/share/man/nb_NO/man5x /usr/share/man/nb_NO/man6 /usr/share/man/nb_NO/man6x /usr/share/man/nb_NO/man7 /usr/share/man/nb_NO/man7x /usr/share/man/nb_NO/man8 /usr/share/man/nb_NO/man8x /usr/share/man/nb_NO/man9 /usr/share/man/nb_NO/man9x /usr/share/man/nb_NO/mann /usr/share/man/nd /usr/share/man/nd/man0p /usr/share/man/nd/man1 /usr/share/man/nd/man1p /usr/share/man/nd/man1x /usr/share/man/nd/man2 /usr/share/man/nd/man2x /usr/share/man/nd/man3 /usr/share/man/nd/man3p /usr/share/man/nd/man3x /usr/share/man/nd/man4 /usr/share/man/nd/man4x /usr/share/man/nd/man5 /usr/share/man/nd/man5x /usr/share/man/nd/man6 /usr/share/man/nd/man6x /usr/share/man/nd/man7 /usr/share/man/nd/man7x /usr/share/man/nd/man8 /usr/share/man/nd/man8x /usr/share/man/nd/man9 /usr/share/man/nd/man9x /usr/share/man/nd/mann /usr/share/man/nds /usr/share/man/nds_DE /usr/share/man/nds_DE/man0p /usr/share/man/nds_DE/man1 /usr/share/man/nds_DE/man1p /usr/share/man/nds_DE/man1x /usr/share/man/nds_DE/man2 /usr/share/man/nds_DE/man2x /usr/share/man/nds_DE/man3 /usr/share/man/nds_DE/man3p /usr/share/man/nds_DE/man3x /usr/share/man/nds_DE/man4 /usr/share/man/nds_DE/man4x /usr/share/man/nds_DE/man5 /usr/share/man/nds_DE/man5x /usr/share/man/nds_DE/man6 /usr/share/man/nds_DE/man6x /usr/share/man/nds_DE/man7 /usr/share/man/nds_DE/man7x /usr/share/man/nds_DE/man8 /usr/share/man/nds_DE/man8x /usr/share/man/nds_DE/man9 /usr/share/man/nds_DE/man9x /usr/share/man/nds_DE/mann /usr/share/man/nds/man0p /usr/share/man/nds/man1 /usr/share/man/nds/man1p /usr/share/man/nds/man1x /usr/share/man/nds/man2 /usr/share/man/nds/man2x /usr/share/man/nds/man3 /usr/share/man/nds/man3p /usr/share/man/nds/man3x /usr/share/man/nds/man4 /usr/share/man/nds/man4x /usr/share/man/nds/man5 /usr/share/man/nds/man5x /usr/share/man/nds/man6 /usr/share/man/nds/man6x /usr/share/man/nds/man7 /usr/share/man/nds/man7x /usr/share/man/nds/man8 /usr/share/man/nds/man8x /usr/share/man/nds/man9 /usr/share/man/nds/man9x /usr/share/man/nds/mann /usr/share/man/nds@NFE /usr/share/man/nds@NFE/man0p /usr/share/man/nds@NFE/man1 /usr/share/man/nds@NFE/man1p /usr/share/man/nds@NFE/man1x /usr/share/man/nds@NFE/man2 /usr/share/man/nds@NFE/man2x /usr/share/man/nds@NFE/man3 /usr/share/man/nds@NFE/man3p /usr/share/man/nds@NFE/man3x /usr/share/man/nds@NFE/man4 /usr/share/man/nds@NFE/man4x /usr/share/man/nds@NFE/man5 /usr/share/man/nds@NFE/man5x /usr/share/man/nds@NFE/man6 /usr/share/man/nds@NFE/man6x /usr/share/man/nds@NFE/man7 /usr/share/man/nds@NFE/man7x /usr/share/man/nds@NFE/man8 /usr/share/man/nds@NFE/man8x /usr/share/man/nds@NFE/man9 /usr/share/man/nds@NFE/man9x /usr/share/man/nds@NFE/mann /usr/share/man/ne /usr/share/man/ne/man0p /usr/share/man/ne/man1 /usr/share/man/ne/man1p /usr/share/man/ne/man1x /usr/share/man/ne/man2 /usr/share/man/ne/man2x /usr/share/man/ne/man3 /usr/share/man/ne/man3p /usr/share/man/ne/man3x /usr/share/man/ne/man4 /usr/share/man/ne/man4x /usr/share/man/ne/man5 /usr/share/man/ne/man5x /usr/share/man/ne/man6 /usr/share/man/ne/man6x /usr/share/man/ne/man7 /usr/share/man/ne/man7x /usr/share/man/ne/man8 /usr/share/man/ne/man8x /usr/share/man/ne/man9 /usr/share/man/ne/man9x /usr/share/man/ne/mann /usr/share/man/new /usr/share/man/new/man0p /usr/share/man/new/man1 /usr/share/man/new/man1p /usr/share/man/new/man1x /usr/share/man/new/man2 /usr/share/man/new/man2x /usr/share/man/new/man3 /usr/share/man/new/man3p /usr/share/man/new/man3x /usr/share/man/new/man4 /usr/share/man/new/man4x /usr/share/man/new/man5 /usr/share/man/new/man5x /usr/share/man/new/man6 /usr/share/man/new/man6x /usr/share/man/new/man7 /usr/share/man/new/man7x /usr/share/man/new/man8 /usr/share/man/new/man8x /usr/share/man/new/man9 /usr/share/man/new/man9x /usr/share/man/new/mann /usr/share/man/ng /usr/share/man/ng/man0p /usr/share/man/ng/man1 /usr/share/man/ng/man1p /usr/share/man/ng/man1x /usr/share/man/ng/man2 /usr/share/man/ng/man2x /usr/share/man/ng/man3 /usr/share/man/ng/man3p /usr/share/man/ng/man3x /usr/share/man/ng/man4 /usr/share/man/ng/man4x /usr/share/man/ng/man5 /usr/share/man/ng/man5x /usr/share/man/ng/man6 /usr/share/man/ng/man6x /usr/share/man/ng/man7 /usr/share/man/ng/man7x /usr/share/man/ng/man8 /usr/share/man/ng/man8x /usr/share/man/ng/man9 /usr/share/man/ng/man9x /usr/share/man/ng/mann /usr/share/man/nia /usr/share/man/nia/man0p /usr/share/man/nia/man1 /usr/share/man/nia/man1p /usr/share/man/nia/man1x /usr/share/man/nia/man2 /usr/share/man/nia/man2x /usr/share/man/nia/man3 /usr/share/man/nia/man3p /usr/share/man/nia/man3x /usr/share/man/nia/man4 /usr/share/man/nia/man4x /usr/share/man/nia/man5 /usr/share/man/nia/man5x /usr/share/man/nia/man6 /usr/share/man/nia/man6x /usr/share/man/nia/man7 /usr/share/man/nia/man7x /usr/share/man/nia/man8 /usr/share/man/nia/man8x /usr/share/man/nia/man9 /usr/share/man/nia/man9x /usr/share/man/nia/mann /usr/share/man/nic /usr/share/man/nic/man0p /usr/share/man/nic/man1 /usr/share/man/nic/man1p /usr/share/man/nic/man1x /usr/share/man/nic/man2 /usr/share/man/nic/man2x /usr/share/man/nic/man3 /usr/share/man/nic/man3p /usr/share/man/nic/man3x /usr/share/man/nic/man4 /usr/share/man/nic/man4x /usr/share/man/nic/man5 /usr/share/man/nic/man5x /usr/share/man/nic/man6 /usr/share/man/nic/man6x /usr/share/man/nic/man7 /usr/share/man/nic/man7x /usr/share/man/nic/man8 /usr/share/man/nic/man8x /usr/share/man/nic/man9 /usr/share/man/nic/man9x /usr/share/man/nic/mann /usr/share/man/niu /usr/share/man/niu/man0p /usr/share/man/niu/man1 /usr/share/man/niu/man1p /usr/share/man/niu/man1x /usr/share/man/niu/man2 /usr/share/man/niu/man2x /usr/share/man/niu/man3 /usr/share/man/niu/man3p /usr/share/man/niu/man3x /usr/share/man/niu/man4 /usr/share/man/niu/man4x /usr/share/man/niu/man5 /usr/share/man/niu/man5x /usr/share/man/niu/man6 /usr/share/man/niu/man6x /usr/share/man/niu/man7 /usr/share/man/niu/man7x /usr/share/man/niu/man8 /usr/share/man/niu/man8x /usr/share/man/niu/man9 /usr/share/man/niu/man9x /usr/share/man/niu/mann /usr/share/man/nl /usr/share/man/nl_BE /usr/share/man/nl_BE/man0p /usr/share/man/nl_BE/man1 /usr/share/man/nl_BE/man1p /usr/share/man/nl_BE/man1x /usr/share/man/nl_BE/man2 /usr/share/man/nl_BE/man2x /usr/share/man/nl_BE/man3 /usr/share/man/nl_BE/man3p /usr/share/man/nl_BE/man3x /usr/share/man/nl_BE/man4 /usr/share/man/nl_BE/man4x /usr/share/man/nl_BE/man5 /usr/share/man/nl_BE/man5x /usr/share/man/nl_BE/man6 /usr/share/man/nl_BE/man6x /usr/share/man/nl_BE/man7 /usr/share/man/nl_BE/man7x /usr/share/man/nl_BE/man8 /usr/share/man/nl_BE/man8x /usr/share/man/nl_BE/man9 /usr/share/man/nl_BE/man9x /usr/share/man/nl_BE/mann /usr/share/man/nl/man0p /usr/share/man/nl/man1 /usr/share/man/nl/man1p /usr/share/man/nl/man1x /usr/share/man/nl/man2 /usr/share/man/nl/man2x /usr/share/man/nl/man3 /usr/share/man/nl/man3p /usr/share/man/nl/man3x /usr/share/man/nl/man4 /usr/share/man/nl/man4x /usr/share/man/nl/man5 /usr/share/man/nl/man5x /usr/share/man/nl/man6 /usr/share/man/nl/man6x /usr/share/man/nl/man7 /usr/share/man/nl/man7x /usr/share/man/nl/man8 /usr/share/man/nl/man8x /usr/share/man/nl/man9 /usr/share/man/nl/man9x /usr/share/man/nl/mann /usr/share/man/nl_NL /usr/share/man/nl_NL/man0p /usr/share/man/nl_NL/man1 /usr/share/man/nl_NL/man1p /usr/share/man/nl_NL/man1x /usr/share/man/nl_NL/man2 /usr/share/man/nl_NL/man2x /usr/share/man/nl_NL/man3 /usr/share/man/nl_NL/man3p /usr/share/man/nl_NL/man3x /usr/share/man/nl_NL/man4 /usr/share/man/nl_NL/man4x /usr/share/man/nl_NL/man5 /usr/share/man/nl_NL/man5x /usr/share/man/nl_NL/man6 /usr/share/man/nl_NL/man6x /usr/share/man/nl_NL/man7 /usr/share/man/nl_NL/man7x /usr/share/man/nl_NL/man8 /usr/share/man/nl_NL/man8x /usr/share/man/nl_NL/man9 /usr/share/man/nl_NL/man9x /usr/share/man/nl_NL/mann /usr/share/man/nn /usr/share/man/nn/man0p /usr/share/man/nn/man1 /usr/share/man/nn/man1p /usr/share/man/nn/man1x /usr/share/man/nn/man2 /usr/share/man/nn/man2x /usr/share/man/nn/man3 /usr/share/man/nn/man3p /usr/share/man/nn/man3x /usr/share/man/nn/man4 /usr/share/man/nn/man4x /usr/share/man/nn/man5 /usr/share/man/nn/man5x /usr/share/man/nn/man6 /usr/share/man/nn/man6x /usr/share/man/nn/man7 /usr/share/man/nn/man7x /usr/share/man/nn/man8 /usr/share/man/nn/man8x /usr/share/man/nn/man9 /usr/share/man/nn/man9x /usr/share/man/nn/mann /usr/share/man/no /usr/share/man/nog /usr/share/man/nog/man0p /usr/share/man/nog/man1 /usr/share/man/nog/man1p /usr/share/man/nog/man1x /usr/share/man/nog/man2 /usr/share/man/nog/man2x /usr/share/man/nog/man3 /usr/share/man/nog/man3p /usr/share/man/nog/man3x /usr/share/man/nog/man4 /usr/share/man/nog/man4x /usr/share/man/nog/man5 /usr/share/man/nog/man5x /usr/share/man/nog/man6 /usr/share/man/nog/man6x /usr/share/man/nog/man7 /usr/share/man/nog/man7x /usr/share/man/nog/man8 /usr/share/man/nog/man8x /usr/share/man/nog/man9 /usr/share/man/nog/man9x /usr/share/man/nog/mann /usr/share/man/no/man0p /usr/share/man/no/man1 /usr/share/man/no/man1p /usr/share/man/no/man1x /usr/share/man/no/man2 /usr/share/man/no/man2x /usr/share/man/no/man3 /usr/share/man/no/man3p /usr/share/man/no/man3x /usr/share/man/no/man4 /usr/share/man/no/man4x /usr/share/man/no/man5 /usr/share/man/no/man5x /usr/share/man/no/man6 /usr/share/man/no/man6x /usr/share/man/no/man7 /usr/share/man/no/man7x /usr/share/man/no/man8 /usr/share/man/no/man8x /usr/share/man/no/man9 /usr/share/man/no/man9x /usr/share/man/no/mann /usr/share/man/non /usr/share/man/non/man0p /usr/share/man/non/man1 /usr/share/man/non/man1p /usr/share/man/non/man1x /usr/share/man/non/man2 /usr/share/man/non/man2x /usr/share/man/non/man3 /usr/share/man/non/man3p /usr/share/man/non/man3x /usr/share/man/non/man4 /usr/share/man/non/man4x /usr/share/man/non/man5 /usr/share/man/non/man5x /usr/share/man/non/man6 /usr/share/man/non/man6x /usr/share/man/non/man7 /usr/share/man/non/man7x /usr/share/man/non/man8 /usr/share/man/non/man8x /usr/share/man/non/man9 /usr/share/man/non/man9x /usr/share/man/non/mann /usr/share/man/nqo /usr/share/man/nqo/man0p /usr/share/man/nqo/man1 /usr/share/man/nqo/man1p /usr/share/man/nqo/man1x /usr/share/man/nqo/man2 /usr/share/man/nqo/man2x /usr/share/man/nqo/man3 /usr/share/man/nqo/man3p /usr/share/man/nqo/man3x /usr/share/man/nqo/man4 /usr/share/man/nqo/man4x /usr/share/man/nqo/man5 /usr/share/man/nqo/man5x /usr/share/man/nqo/man6 /usr/share/man/nqo/man6x /usr/share/man/nqo/man7 /usr/share/man/nqo/man7x /usr/share/man/nqo/man8 /usr/share/man/nqo/man8x /usr/share/man/nqo/man9 /usr/share/man/nqo/man9x /usr/share/man/nqo/mann /usr/share/man/nr /usr/share/man/nr/man0p /usr/share/man/nr/man1 /usr/share/man/nr/man1p /usr/share/man/nr/man1x /usr/share/man/nr/man2 /usr/share/man/nr/man2x /usr/share/man/nr/man3 /usr/share/man/nr/man3p /usr/share/man/nr/man3x /usr/share/man/nr/man4 /usr/share/man/nr/man4x /usr/share/man/nr/man5 /usr/share/man/nr/man5x /usr/share/man/nr/man6 /usr/share/man/nr/man6x /usr/share/man/nr/man7 /usr/share/man/nr/man7x /usr/share/man/nr/man8 /usr/share/man/nr/man8x /usr/share/man/nr/man9 /usr/share/man/nr/man9x /usr/share/man/nr/mann /usr/share/man/nso /usr/share/man/nso/man0p /usr/share/man/nso/man1 /usr/share/man/nso/man1p /usr/share/man/nso/man1x /usr/share/man/nso/man2 /usr/share/man/nso/man2x /usr/share/man/nso/man3 /usr/share/man/nso/man3p /usr/share/man/nso/man3x /usr/share/man/nso/man4 /usr/share/man/nso/man4x /usr/share/man/nso/man5 /usr/share/man/nso/man5x /usr/share/man/nso/man6 /usr/share/man/nso/man6x /usr/share/man/nso/man7 /usr/share/man/nso/man7x /usr/share/man/nso/man8 /usr/share/man/nso/man8x /usr/share/man/nso/man9 /usr/share/man/nso/man9x /usr/share/man/nso/mann /usr/share/man/nub /usr/share/man/nub/man0p /usr/share/man/nub/man1 /usr/share/man/nub/man1p /usr/share/man/nub/man1x /usr/share/man/nub/man2 /usr/share/man/nub/man2x /usr/share/man/nub/man3 /usr/share/man/nub/man3p /usr/share/man/nub/man3x /usr/share/man/nub/man4 /usr/share/man/nub/man4x /usr/share/man/nub/man5 /usr/share/man/nub/man5x /usr/share/man/nub/man6 /usr/share/man/nub/man6x /usr/share/man/nub/man7 /usr/share/man/nub/man7x /usr/share/man/nub/man8 /usr/share/man/nub/man8x /usr/share/man/nub/man9 /usr/share/man/nub/man9x /usr/share/man/nub/mann /usr/share/man/nv /usr/share/man/nv/man0p /usr/share/man/nv/man1 /usr/share/man/nv/man1p /usr/share/man/nv/man1x /usr/share/man/nv/man2 /usr/share/man/nv/man2x /usr/share/man/nv/man3 /usr/share/man/nv/man3p /usr/share/man/nv/man3x /usr/share/man/nv/man4 /usr/share/man/nv/man4x /usr/share/man/nv/man5 /usr/share/man/nv/man5x /usr/share/man/nv/man6 /usr/share/man/nv/man6x /usr/share/man/nv/man7 /usr/share/man/nv/man7x /usr/share/man/nv/man8 /usr/share/man/nv/man8x /usr/share/man/nv/man9 /usr/share/man/nv/man9x /usr/share/man/nv/mann /usr/share/man/nwc /usr/share/man/nwc/man0p /usr/share/man/nwc/man1 /usr/share/man/nwc/man1p /usr/share/man/nwc/man1x /usr/share/man/nwc/man2 /usr/share/man/nwc/man2x /usr/share/man/nwc/man3 /usr/share/man/nwc/man3p /usr/share/man/nwc/man3x /usr/share/man/nwc/man4 /usr/share/man/nwc/man4x /usr/share/man/nwc/man5 /usr/share/man/nwc/man5x /usr/share/man/nwc/man6 /usr/share/man/nwc/man6x /usr/share/man/nwc/man7 /usr/share/man/nwc/man7x /usr/share/man/nwc/man8 /usr/share/man/nwc/man8x /usr/share/man/nwc/man9 /usr/share/man/nwc/man9x /usr/share/man/nwc/mann /usr/share/man/ny /usr/share/man/nym /usr/share/man/ny/man0p /usr/share/man/ny/man1 /usr/share/man/ny/man1p /usr/share/man/ny/man1x /usr/share/man/ny/man2 /usr/share/man/ny/man2x /usr/share/man/ny/man3 /usr/share/man/ny/man3p /usr/share/man/ny/man3x /usr/share/man/ny/man4 /usr/share/man/ny/man4x /usr/share/man/ny/man5 /usr/share/man/ny/man5x /usr/share/man/ny/man6 /usr/share/man/ny/man6x /usr/share/man/ny/man7 /usr/share/man/ny/man7x /usr/share/man/ny/man8 /usr/share/man/ny/man8x /usr/share/man/ny/man9 /usr/share/man/ny/man9x /usr/share/man/ny/mann /usr/share/man/nym/man0p /usr/share/man/nym/man1 /usr/share/man/nym/man1p /usr/share/man/nym/man1x /usr/share/man/nym/man2 /usr/share/man/nym/man2x /usr/share/man/nym/man3 /usr/share/man/nym/man3p /usr/share/man/nym/man3x /usr/share/man/nym/man4 /usr/share/man/nym/man4x /usr/share/man/nym/man5 /usr/share/man/nym/man5x /usr/share/man/nym/man6 /usr/share/man/nym/man6x /usr/share/man/nym/man7 /usr/share/man/nym/man7x /usr/share/man/nym/man8 /usr/share/man/nym/man8x /usr/share/man/nym/man9 /usr/share/man/nym/man9x /usr/share/man/nym/mann /usr/share/man/nyn /usr/share/man/nyn/man0p /usr/share/man/nyn/man1 /usr/share/man/nyn/man1p /usr/share/man/nyn/man1x /usr/share/man/nyn/man2 /usr/share/man/nyn/man2x /usr/share/man/nyn/man3 /usr/share/man/nyn/man3p /usr/share/man/nyn/man3x /usr/share/man/nyn/man4 /usr/share/man/nyn/man4x /usr/share/man/nyn/man5 /usr/share/man/nyn/man5x /usr/share/man/nyn/man6 /usr/share/man/nyn/man6x /usr/share/man/nyn/man7 /usr/share/man/nyn/man7x /usr/share/man/nyn/man8 /usr/share/man/nyn/man8x /usr/share/man/nyn/man9 /usr/share/man/nyn/man9x /usr/share/man/nyn/mann /usr/share/man/nyo /usr/share/man/nyo/man0p /usr/share/man/nyo/man1 /usr/share/man/nyo/man1p /usr/share/man/nyo/man1x /usr/share/man/nyo/man2 /usr/share/man/nyo/man2x /usr/share/man/nyo/man3 /usr/share/man/nyo/man3p /usr/share/man/nyo/man3x /usr/share/man/nyo/man4 /usr/share/man/nyo/man4x /usr/share/man/nyo/man5 /usr/share/man/nyo/man5x /usr/share/man/nyo/man6 /usr/share/man/nyo/man6x /usr/share/man/nyo/man7 /usr/share/man/nyo/man7x /usr/share/man/nyo/man8 /usr/share/man/nyo/man8x /usr/share/man/nyo/man9 /usr/share/man/nyo/man9x /usr/share/man/nyo/mann /usr/share/man/nzi /usr/share/man/nzi/man0p /usr/share/man/nzi/man1 /usr/share/man/nzi/man1p /usr/share/man/nzi/man1x /usr/share/man/nzi/man2 /usr/share/man/nzi/man2x /usr/share/man/nzi/man3 /usr/share/man/nzi/man3p /usr/share/man/nzi/man3x /usr/share/man/nzi/man4 /usr/share/man/nzi/man4x /usr/share/man/nzi/man5 /usr/share/man/nzi/man5x /usr/share/man/nzi/man6 /usr/share/man/nzi/man6x /usr/share/man/nzi/man7 /usr/share/man/nzi/man7x /usr/share/man/nzi/man8 /usr/share/man/nzi/man8x /usr/share/man/nzi/man9 /usr/share/man/nzi/man9x /usr/share/man/nzi/mann /usr/share/man/oc /usr/share/man/oc/man0p /usr/share/man/oc/man1 /usr/share/man/oc/man1p /usr/share/man/oc/man1x /usr/share/man/oc/man2 /usr/share/man/oc/man2x /usr/share/man/oc/man3 /usr/share/man/oc/man3p /usr/share/man/oc/man3x /usr/share/man/oc/man4 /usr/share/man/oc/man4x /usr/share/man/oc/man5 /usr/share/man/oc/man5x /usr/share/man/oc/man6 /usr/share/man/oc/man6x /usr/share/man/oc/man7 /usr/share/man/oc/man7x /usr/share/man/oc/man8 /usr/share/man/oc/man8x /usr/share/man/oc/man9 /usr/share/man/oc/man9x /usr/share/man/oc/mann /usr/share/man/oj /usr/share/man/oj/man0p /usr/share/man/oj/man1 /usr/share/man/oj/man1p /usr/share/man/oj/man1x /usr/share/man/oj/man2 /usr/share/man/oj/man2x /usr/share/man/oj/man3 /usr/share/man/oj/man3p /usr/share/man/oj/man3x /usr/share/man/oj/man4 /usr/share/man/oj/man4x /usr/share/man/oj/man5 /usr/share/man/oj/man5x /usr/share/man/oj/man6 /usr/share/man/oj/man6x /usr/share/man/oj/man7 /usr/share/man/oj/man7x /usr/share/man/oj/man8 /usr/share/man/oj/man8x /usr/share/man/oj/man9 /usr/share/man/oj/man9x /usr/share/man/oj/mann /usr/share/man/om /usr/share/man/om/man0p /usr/share/man/om/man1 /usr/share/man/om/man1p /usr/share/man/om/man1x /usr/share/man/om/man2 /usr/share/man/om/man2x /usr/share/man/om/man3 /usr/share/man/om/man3p /usr/share/man/om/man3x /usr/share/man/om/man4 /usr/share/man/om/man4x /usr/share/man/om/man5 /usr/share/man/om/man5x /usr/share/man/om/man6 /usr/share/man/om/man6x /usr/share/man/om/man7 /usr/share/man/om/man7x /usr/share/man/om/man8 /usr/share/man/om/man8x /usr/share/man/om/man9 /usr/share/man/om/man9x /usr/share/man/om/mann /usr/share/man/or /usr/share/man/or/man0p /usr/share/man/or/man1 /usr/share/man/or/man1p /usr/share/man/or/man1x /usr/share/man/or/man2 /usr/share/man/or/man2x /usr/share/man/or/man3 /usr/share/man/or/man3p /usr/share/man/or/man3x /usr/share/man/or/man4 /usr/share/man/or/man4x /usr/share/man/or/man5 /usr/share/man/or/man5x /usr/share/man/or/man6 /usr/share/man/or/man6x /usr/share/man/or/man7 /usr/share/man/or/man7x /usr/share/man/or/man8 /usr/share/man/or/man8x /usr/share/man/or/man9 /usr/share/man/or/man9x /usr/share/man/or/mann /usr/share/man/os /usr/share/man/osa /usr/share/man/osa/man0p /usr/share/man/osa/man1 /usr/share/man/osa/man1p /usr/share/man/osa/man1x /usr/share/man/osa/man2 /usr/share/man/osa/man2x /usr/share/man/osa/man3 /usr/share/man/osa/man3p /usr/share/man/osa/man3x /usr/share/man/osa/man4 /usr/share/man/osa/man4x /usr/share/man/osa/man5 /usr/share/man/osa/man5x /usr/share/man/osa/man6 /usr/share/man/osa/man6x /usr/share/man/osa/man7 /usr/share/man/osa/man7x /usr/share/man/osa/man8 /usr/share/man/osa/man8x /usr/share/man/osa/man9 /usr/share/man/osa/man9x /usr/share/man/osa/mann /usr/share/man/os/man0p /usr/share/man/os/man1 /usr/share/man/os/man1p /usr/share/man/os/man1x /usr/share/man/os/man2 /usr/share/man/os/man2x /usr/share/man/os/man3 /usr/share/man/os/man3p /usr/share/man/os/man3x /usr/share/man/os/man4 /usr/share/man/os/man4x /usr/share/man/os/man5 /usr/share/man/os/man5x /usr/share/man/os/man6 /usr/share/man/os/man6x /usr/share/man/os/man7 /usr/share/man/os/man7x /usr/share/man/os/man8 /usr/share/man/os/man8x /usr/share/man/os/man9 /usr/share/man/os/man9x /usr/share/man/os/mann /usr/share/man/ota /usr/share/man/ota/man0p /usr/share/man/ota/man1 /usr/share/man/ota/man1p /usr/share/man/ota/man1x /usr/share/man/ota/man2 /usr/share/man/ota/man2x /usr/share/man/ota/man3 /usr/share/man/ota/man3p /usr/share/man/ota/man3x /usr/share/man/ota/man4 /usr/share/man/ota/man4x /usr/share/man/ota/man5 /usr/share/man/ota/man5x /usr/share/man/ota/man6 /usr/share/man/ota/man6x /usr/share/man/ota/man7 /usr/share/man/ota/man7x /usr/share/man/ota/man8 /usr/share/man/ota/man8x /usr/share/man/ota/man9 /usr/share/man/ota/man9x /usr/share/man/ota/mann /usr/share/man/oto /usr/share/man/oto/man0p /usr/share/man/oto/man1 /usr/share/man/oto/man1p /usr/share/man/oto/man1x /usr/share/man/oto/man2 /usr/share/man/oto/man2x /usr/share/man/oto/man3 /usr/share/man/oto/man3p /usr/share/man/oto/man3x /usr/share/man/oto/man4 /usr/share/man/oto/man4x /usr/share/man/oto/man5 /usr/share/man/oto/man5x /usr/share/man/oto/man6 /usr/share/man/oto/man6x /usr/share/man/oto/man7 /usr/share/man/oto/man7x /usr/share/man/oto/man8 /usr/share/man/oto/man8x /usr/share/man/oto/man9 /usr/share/man/oto/man9x /usr/share/man/oto/mann /usr/share/man/pa /usr/share/man/paa /usr/share/man/paa/man0p /usr/share/man/paa/man1 /usr/share/man/paa/man1p /usr/share/man/paa/man1x /usr/share/man/paa/man2 /usr/share/man/paa/man2x /usr/share/man/paa/man3 /usr/share/man/paa/man3p /usr/share/man/paa/man3x /usr/share/man/paa/man4 /usr/share/man/paa/man4x /usr/share/man/paa/man5 /usr/share/man/paa/man5x /usr/share/man/paa/man6 /usr/share/man/paa/man6x /usr/share/man/paa/man7 /usr/share/man/paa/man7x /usr/share/man/paa/man8 /usr/share/man/paa/man8x /usr/share/man/paa/man9 /usr/share/man/paa/man9x /usr/share/man/paa/mann /usr/share/man/pag /usr/share/man/pag/man0p /usr/share/man/pag/man1 /usr/share/man/pag/man1p /usr/share/man/pag/man1x /usr/share/man/pag/man2 /usr/share/man/pag/man2x /usr/share/man/pag/man3 /usr/share/man/pag/man3p /usr/share/man/pag/man3x /usr/share/man/pag/man4 /usr/share/man/pag/man4x /usr/share/man/pag/man5 /usr/share/man/pag/man5x /usr/share/man/pag/man6 /usr/share/man/pag/man6x /usr/share/man/pag/man7 /usr/share/man/pag/man7x /usr/share/man/pag/man8 /usr/share/man/pag/man8x /usr/share/man/pag/man9 /usr/share/man/pag/man9x /usr/share/man/pag/mann /usr/share/man/pal /usr/share/man/pal/man0p /usr/share/man/pal/man1 /usr/share/man/pal/man1p /usr/share/man/pal/man1x /usr/share/man/pal/man2 /usr/share/man/pal/man2x /usr/share/man/pal/man3 /usr/share/man/pal/man3p /usr/share/man/pal/man3x /usr/share/man/pal/man4 /usr/share/man/pal/man4x /usr/share/man/pal/man5 /usr/share/man/pal/man5x /usr/share/man/pal/man6 /usr/share/man/pal/man6x /usr/share/man/pal/man7 /usr/share/man/pal/man7x /usr/share/man/pal/man8 /usr/share/man/pal/man8x /usr/share/man/pal/man9 /usr/share/man/pal/man9x /usr/share/man/pal/mann /usr/share/man/pam /usr/share/man/pa/man0p /usr/share/man/pa/man1 /usr/share/man/pa/man1p /usr/share/man/pa/man1x /usr/share/man/pa/man2 /usr/share/man/pa/man2x /usr/share/man/pa/man3 /usr/share/man/pa/man3p /usr/share/man/pa/man3x /usr/share/man/pa/man4 /usr/share/man/pa/man4x /usr/share/man/pa/man5 /usr/share/man/pa/man5x /usr/share/man/pa/man6 /usr/share/man/pa/man6x /usr/share/man/pa/man7 /usr/share/man/pa/man7x /usr/share/man/pa/man8 /usr/share/man/pa/man8x /usr/share/man/pa/man9 /usr/share/man/pa/man9x /usr/share/man/pa/mann /usr/share/man/pam/man0p /usr/share/man/pam/man1 /usr/share/man/pam/man1p /usr/share/man/pam/man1x /usr/share/man/pam/man2 /usr/share/man/pam/man2x /usr/share/man/pam/man3 /usr/share/man/pam/man3p /usr/share/man/pam/man3x /usr/share/man/pam/man4 /usr/share/man/pam/man4x /usr/share/man/pam/man5 /usr/share/man/pam/man5x /usr/share/man/pam/man6 /usr/share/man/pam/man6x /usr/share/man/pam/man7 /usr/share/man/pam/man7x /usr/share/man/pam/man8 /usr/share/man/pam/man8x /usr/share/man/pam/man9 /usr/share/man/pam/man9x /usr/share/man/pam/mann /usr/share/man/pap /usr/share/man/pap/man0p /usr/share/man/pap/man1 /usr/share/man/pap/man1p /usr/share/man/pap/man1x /usr/share/man/pap/man2 /usr/share/man/pap/man2x /usr/share/man/pap/man3 /usr/share/man/pap/man3p /usr/share/man/pap/man3x /usr/share/man/pap/man4 /usr/share/man/pap/man4x /usr/share/man/pap/man5 /usr/share/man/pap/man5x /usr/share/man/pap/man6 /usr/share/man/pap/man6x /usr/share/man/pap/man7 /usr/share/man/pap/man7x /usr/share/man/pap/man8 /usr/share/man/pap/man8x /usr/share/man/pap/man9 /usr/share/man/pap/man9x /usr/share/man/pap/mann /usr/share/man/pau /usr/share/man/pau/man0p /usr/share/man/pau/man1 /usr/share/man/pau/man1p /usr/share/man/pau/man1x /usr/share/man/pau/man2 /usr/share/man/pau/man2x /usr/share/man/pau/man3 /usr/share/man/pau/man3p /usr/share/man/pau/man3x /usr/share/man/pau/man4 /usr/share/man/pau/man4x /usr/share/man/pau/man5 /usr/share/man/pau/man5x /usr/share/man/pau/man6 /usr/share/man/pau/man6x /usr/share/man/pau/man7 /usr/share/man/pau/man7x /usr/share/man/pau/man8 /usr/share/man/pau/man8x /usr/share/man/pau/man9 /usr/share/man/pau/man9x /usr/share/man/pau/mann /usr/share/man/peo /usr/share/man/peo/man0p /usr/share/man/peo/man1 /usr/share/man/peo/man1p /usr/share/man/peo/man1x /usr/share/man/peo/man2 /usr/share/man/peo/man2x /usr/share/man/peo/man3 /usr/share/man/peo/man3p /usr/share/man/peo/man3x /usr/share/man/peo/man4 /usr/share/man/peo/man4x /usr/share/man/peo/man5 /usr/share/man/peo/man5x /usr/share/man/peo/man6 /usr/share/man/peo/man6x /usr/share/man/peo/man7 /usr/share/man/peo/man7x /usr/share/man/peo/man8 /usr/share/man/peo/man8x /usr/share/man/peo/man9 /usr/share/man/peo/man9x /usr/share/man/peo/mann /usr/share/man/phi /usr/share/man/phi/man0p /usr/share/man/phi/man1 /usr/share/man/phi/man1p /usr/share/man/phi/man1x /usr/share/man/phi/man2 /usr/share/man/phi/man2x /usr/share/man/phi/man3 /usr/share/man/phi/man3p /usr/share/man/phi/man3x /usr/share/man/phi/man4 /usr/share/man/phi/man4x /usr/share/man/phi/man5 /usr/share/man/phi/man5x /usr/share/man/phi/man6 /usr/share/man/phi/man6x /usr/share/man/phi/man7 /usr/share/man/phi/man7x /usr/share/man/phi/man8 /usr/share/man/phi/man8x /usr/share/man/phi/man9 /usr/share/man/phi/man9x /usr/share/man/phi/mann /usr/share/man/phn /usr/share/man/phn/man0p /usr/share/man/phn/man1 /usr/share/man/phn/man1p /usr/share/man/phn/man1x /usr/share/man/phn/man2 /usr/share/man/phn/man2x /usr/share/man/phn/man3 /usr/share/man/phn/man3p /usr/share/man/phn/man3x /usr/share/man/phn/man4 /usr/share/man/phn/man4x /usr/share/man/phn/man5 /usr/share/man/phn/man5x /usr/share/man/phn/man6 /usr/share/man/phn/man6x /usr/share/man/phn/man7 /usr/share/man/phn/man7x /usr/share/man/phn/man8 /usr/share/man/phn/man8x /usr/share/man/phn/man9 /usr/share/man/phn/man9x /usr/share/man/phn/mann /usr/share/man/pi /usr/share/man/pi/man0p /usr/share/man/pi/man1 /usr/share/man/pi/man1p /usr/share/man/pi/man1x /usr/share/man/pi/man2 /usr/share/man/pi/man2x /usr/share/man/pi/man3 /usr/share/man/pi/man3p /usr/share/man/pi/man3x /usr/share/man/pi/man4 /usr/share/man/pi/man4x /usr/share/man/pi/man5 /usr/share/man/pi/man5x /usr/share/man/pi/man6 /usr/share/man/pi/man6x /usr/share/man/pi/man7 /usr/share/man/pi/man7x /usr/share/man/pi/man8 /usr/share/man/pi/man8x /usr/share/man/pi/man9 /usr/share/man/pi/man9x /usr/share/man/pi/mann /usr/share/man/pl /usr/share/man/pl/man0p /usr/share/man/pl/man1 /usr/share/man/pl/man1p /usr/share/man/pl/man1x /usr/share/man/pl/man2 /usr/share/man/pl/man2x /usr/share/man/pl/man3 /usr/share/man/pl/man3p /usr/share/man/pl/man3x /usr/share/man/pl/man4 /usr/share/man/pl/man4x /usr/share/man/pl/man5 /usr/share/man/pl/man5x /usr/share/man/pl/man6 /usr/share/man/pl/man6x /usr/share/man/pl/man7 /usr/share/man/pl/man7x /usr/share/man/pl/man8 /usr/share/man/pl/man8x /usr/share/man/pl/man9 /usr/share/man/pl/man9x /usr/share/man/pl/mann /usr/share/man/pl_PL /usr/share/man/pl_PL/man0p /usr/share/man/pl_PL/man1 /usr/share/man/pl_PL/man1p /usr/share/man/pl_PL/man1x /usr/share/man/pl_PL/man2 /usr/share/man/pl_PL/man2x /usr/share/man/pl_PL/man3 /usr/share/man/pl_PL/man3p /usr/share/man/pl_PL/man3x /usr/share/man/pl_PL/man4 /usr/share/man/pl_PL/man4x /usr/share/man/pl_PL/man5 /usr/share/man/pl_PL/man5x /usr/share/man/pl_PL/man6 /usr/share/man/pl_PL/man6x /usr/share/man/pl_PL/man7 /usr/share/man/pl_PL/man7x /usr/share/man/pl_PL/man8 /usr/share/man/pl_PL/man8x /usr/share/man/pl_PL/man9 /usr/share/man/pl_PL/man9x /usr/share/man/pl_PL/mann /usr/share/man/pon /usr/share/man/pon/man0p /usr/share/man/pon/man1 /usr/share/man/pon/man1p /usr/share/man/pon/man1x /usr/share/man/pon/man2 /usr/share/man/pon/man2x /usr/share/man/pon/man3 /usr/share/man/pon/man3p /usr/share/man/pon/man3x /usr/share/man/pon/man4 /usr/share/man/pon/man4x /usr/share/man/pon/man5 /usr/share/man/pon/man5x /usr/share/man/pon/man6 /usr/share/man/pon/man6x /usr/share/man/pon/man7 /usr/share/man/pon/man7x /usr/share/man/pon/man8 /usr/share/man/pon/man8x /usr/share/man/pon/man9 /usr/share/man/pon/man9x /usr/share/man/pon/mann /usr/share/man/pra /usr/share/man/pra/man0p /usr/share/man/pra/man1 /usr/share/man/pra/man1p /usr/share/man/pra/man1x /usr/share/man/pra/man2 /usr/share/man/pra/man2x /usr/share/man/pra/man3 /usr/share/man/pra/man3p /usr/share/man/pra/man3x /usr/share/man/pra/man4 /usr/share/man/pra/man4x /usr/share/man/pra/man5 /usr/share/man/pra/man5x /usr/share/man/pra/man6 /usr/share/man/pra/man6x /usr/share/man/pra/man7 /usr/share/man/pra/man7x /usr/share/man/pra/man8 /usr/share/man/pra/man8x /usr/share/man/pra/man9 /usr/share/man/pra/man9x /usr/share/man/pra/mann /usr/share/man/pro /usr/share/man/pro/man0p /usr/share/man/pro/man1 /usr/share/man/pro/man1p /usr/share/man/pro/man1x /usr/share/man/pro/man2 /usr/share/man/pro/man2x /usr/share/man/pro/man3 /usr/share/man/pro/man3p /usr/share/man/pro/man3x /usr/share/man/pro/man4 /usr/share/man/pro/man4x /usr/share/man/pro/man5 /usr/share/man/pro/man5x /usr/share/man/pro/man6 /usr/share/man/pro/man6x /usr/share/man/pro/man7 /usr/share/man/pro/man7x /usr/share/man/pro/man8 /usr/share/man/pro/man8x /usr/share/man/pro/man9 /usr/share/man/pro/man9x /usr/share/man/pro/mann /usr/share/man/ps /usr/share/man/ps/man0p /usr/share/man/ps/man1 /usr/share/man/ps/man1p /usr/share/man/ps/man1x /usr/share/man/ps/man2 /usr/share/man/ps/man2x /usr/share/man/ps/man3 /usr/share/man/ps/man3p /usr/share/man/ps/man3x /usr/share/man/ps/man4 /usr/share/man/ps/man4x /usr/share/man/ps/man5 /usr/share/man/ps/man5x /usr/share/man/ps/man6 /usr/share/man/ps/man6x /usr/share/man/ps/man7 /usr/share/man/ps/man7x /usr/share/man/ps/man8 /usr/share/man/ps/man8x /usr/share/man/ps/man9 /usr/share/man/ps/man9x /usr/share/man/ps/mann /usr/share/man/pt /usr/share/man/pt_BR /usr/share/man/pt_BR/man0p /usr/share/man/pt_BR/man1 /usr/share/man/pt_BR/man1p /usr/share/man/pt_BR/man1x /usr/share/man/pt_BR/man2 /usr/share/man/pt_BR/man2x /usr/share/man/pt_BR/man3 /usr/share/man/pt_BR/man3p /usr/share/man/pt_BR/man3x /usr/share/man/pt_BR/man4 /usr/share/man/pt_BR/man4x /usr/share/man/pt_BR/man5 /usr/share/man/pt_BR/man5x /usr/share/man/pt_BR/man6 /usr/share/man/pt_BR/man6x /usr/share/man/pt_BR/man7 /usr/share/man/pt_BR/man7x /usr/share/man/pt_BR/man8 /usr/share/man/pt_BR/man8x /usr/share/man/pt_BR/man9 /usr/share/man/pt_BR/man9x /usr/share/man/pt_BR/mann /usr/share/man/pt/man0p /usr/share/man/pt/man1 /usr/share/man/pt/man1p /usr/share/man/pt/man1x /usr/share/man/pt/man2 /usr/share/man/pt/man2x /usr/share/man/pt/man3 /usr/share/man/pt/man3p /usr/share/man/pt/man3x /usr/share/man/pt/man4 /usr/share/man/pt/man4x /usr/share/man/pt/man5 /usr/share/man/pt/man5x /usr/share/man/pt/man6 /usr/share/man/pt/man6x /usr/share/man/pt/man7 /usr/share/man/pt/man7x /usr/share/man/pt/man8 /usr/share/man/pt/man8x /usr/share/man/pt/man9 /usr/share/man/pt/man9x /usr/share/man/pt/mann /usr/share/man/pt_PT /usr/share/man/pt_PT/man0p /usr/share/man/pt_PT/man1 /usr/share/man/pt_PT/man1p /usr/share/man/pt_PT/man1x /usr/share/man/pt_PT/man2 /usr/share/man/pt_PT/man2x /usr/share/man/pt_PT/man3 /usr/share/man/pt_PT/man3p /usr/share/man/pt_PT/man3x /usr/share/man/pt_PT/man4 /usr/share/man/pt_PT/man4x /usr/share/man/pt_PT/man5 /usr/share/man/pt_PT/man5x /usr/share/man/pt_PT/man6 /usr/share/man/pt_PT/man6x /usr/share/man/pt_PT/man7 /usr/share/man/pt_PT/man7x /usr/share/man/pt_PT/man8 /usr/share/man/pt_PT/man8x /usr/share/man/pt_PT/man9 /usr/share/man/pt_PT/man9x /usr/share/man/pt_PT/mann /usr/share/man/qaa-qtz /usr/share/man/qaa-qtz/man0p /usr/share/man/qaa-qtz/man1 /usr/share/man/qaa-qtz/man1p /usr/share/man/qaa-qtz/man1x /usr/share/man/qaa-qtz/man2 /usr/share/man/qaa-qtz/man2x /usr/share/man/qaa-qtz/man3 /usr/share/man/qaa-qtz/man3p /usr/share/man/qaa-qtz/man3x /usr/share/man/qaa-qtz/man4 /usr/share/man/qaa-qtz/man4x /usr/share/man/qaa-qtz/man5 /usr/share/man/qaa-qtz/man5x /usr/share/man/qaa-qtz/man6 /usr/share/man/qaa-qtz/man6x /usr/share/man/qaa-qtz/man7 /usr/share/man/qaa-qtz/man7x /usr/share/man/qaa-qtz/man8 /usr/share/man/qaa-qtz/man8x /usr/share/man/qaa-qtz/man9 /usr/share/man/qaa-qtz/man9x /usr/share/man/qaa-qtz/mann /usr/share/man/qu /usr/share/man/qu/man0p /usr/share/man/qu/man1 /usr/share/man/qu/man1p /usr/share/man/qu/man1x /usr/share/man/qu/man2 /usr/share/man/qu/man2x /usr/share/man/qu/man3 /usr/share/man/qu/man3p /usr/share/man/qu/man3x /usr/share/man/qu/man4 /usr/share/man/qu/man4x /usr/share/man/qu/man5 /usr/share/man/qu/man5x /usr/share/man/qu/man6 /usr/share/man/qu/man6x /usr/share/man/qu/man7 /usr/share/man/qu/man7x /usr/share/man/qu/man8 /usr/share/man/qu/man8x /usr/share/man/qu/man9 /usr/share/man/qu/man9x /usr/share/man/qu/mann /usr/share/man/raj /usr/share/man/raj/man0p /usr/share/man/raj/man1 /usr/share/man/raj/man1p /usr/share/man/raj/man1x /usr/share/man/raj/man2 /usr/share/man/raj/man2x /usr/share/man/raj/man3 /usr/share/man/raj/man3p /usr/share/man/raj/man3x /usr/share/man/raj/man4 /usr/share/man/raj/man4x /usr/share/man/raj/man5 /usr/share/man/raj/man5x /usr/share/man/raj/man6 /usr/share/man/raj/man6x /usr/share/man/raj/man7 /usr/share/man/raj/man7x /usr/share/man/raj/man8 /usr/share/man/raj/man8x /usr/share/man/raj/man9 /usr/share/man/raj/man9x /usr/share/man/raj/mann /usr/share/man/rap /usr/share/man/rap/man0p /usr/share/man/rap/man1 /usr/share/man/rap/man1p /usr/share/man/rap/man1x /usr/share/man/rap/man2 /usr/share/man/rap/man2x /usr/share/man/rap/man3 /usr/share/man/rap/man3p /usr/share/man/rap/man3x /usr/share/man/rap/man4 /usr/share/man/rap/man4x /usr/share/man/rap/man5 /usr/share/man/rap/man5x /usr/share/man/rap/man6 /usr/share/man/rap/man6x /usr/share/man/rap/man7 /usr/share/man/rap/man7x /usr/share/man/rap/man8 /usr/share/man/rap/man8x /usr/share/man/rap/man9 /usr/share/man/rap/man9x /usr/share/man/rap/mann /usr/share/man/rar /usr/share/man/rar/man0p /usr/share/man/rar/man1 /usr/share/man/rar/man1p /usr/share/man/rar/man1x /usr/share/man/rar/man2 /usr/share/man/rar/man2x /usr/share/man/rar/man3 /usr/share/man/rar/man3p /usr/share/man/rar/man3x /usr/share/man/rar/man4 /usr/share/man/rar/man4x /usr/share/man/rar/man5 /usr/share/man/rar/man5x /usr/share/man/rar/man6 /usr/share/man/rar/man6x /usr/share/man/rar/man7 /usr/share/man/rar/man7x /usr/share/man/rar/man8 /usr/share/man/rar/man8x /usr/share/man/rar/man9 /usr/share/man/rar/man9x /usr/share/man/rar/mann /usr/share/man/rm /usr/share/man/rm/man0p /usr/share/man/rm/man1 /usr/share/man/rm/man1p /usr/share/man/rm/man1x /usr/share/man/rm/man2 /usr/share/man/rm/man2x /usr/share/man/rm/man3 /usr/share/man/rm/man3p /usr/share/man/rm/man3x /usr/share/man/rm/man4 /usr/share/man/rm/man4x /usr/share/man/rm/man5 /usr/share/man/rm/man5x /usr/share/man/rm/man6 /usr/share/man/rm/man6x /usr/share/man/rm/man7 /usr/share/man/rm/man7x /usr/share/man/rm/man8 /usr/share/man/rm/man8x /usr/share/man/rm/man9 /usr/share/man/rm/man9x /usr/share/man/rm/mann /usr/share/man/rn /usr/share/man/rn/man0p /usr/share/man/rn/man1 /usr/share/man/rn/man1p /usr/share/man/rn/man1x /usr/share/man/rn/man2 /usr/share/man/rn/man2x /usr/share/man/rn/man3 /usr/share/man/rn/man3p /usr/share/man/rn/man3x /usr/share/man/rn/man4 /usr/share/man/rn/man4x /usr/share/man/rn/man5 /usr/share/man/rn/man5x /usr/share/man/rn/man6 /usr/share/man/rn/man6x /usr/share/man/rn/man7 /usr/share/man/rn/man7x /usr/share/man/rn/man8 /usr/share/man/rn/man8x /usr/share/man/rn/man9 /usr/share/man/rn/man9x /usr/share/man/rn/mann /usr/share/man/ro /usr/share/man/roa /usr/share/man/roa/man0p /usr/share/man/roa/man1 /usr/share/man/roa/man1p /usr/share/man/roa/man1x /usr/share/man/roa/man2 /usr/share/man/roa/man2x /usr/share/man/roa/man3 /usr/share/man/roa/man3p /usr/share/man/roa/man3x /usr/share/man/roa/man4 /usr/share/man/roa/man4x /usr/share/man/roa/man5 /usr/share/man/roa/man5x /usr/share/man/roa/man6 /usr/share/man/roa/man6x /usr/share/man/roa/man7 /usr/share/man/roa/man7x /usr/share/man/roa/man8 /usr/share/man/roa/man8x /usr/share/man/roa/man9 /usr/share/man/roa/man9x /usr/share/man/roa/mann /usr/share/man/rom /usr/share/man/ro/man0p /usr/share/man/ro/man1 /usr/share/man/ro/man1p /usr/share/man/ro/man1x /usr/share/man/ro/man2 /usr/share/man/ro/man2x /usr/share/man/ro/man3 /usr/share/man/ro/man3p /usr/share/man/ro/man3x /usr/share/man/ro/man4 /usr/share/man/ro/man4x /usr/share/man/ro/man5 /usr/share/man/ro/man5x /usr/share/man/ro/man6 /usr/share/man/ro/man6x /usr/share/man/ro/man7 /usr/share/man/ro/man7x /usr/share/man/ro/man8 /usr/share/man/ro/man8x /usr/share/man/ro/man9 /usr/share/man/ro/man9x /usr/share/man/ro/mann /usr/share/man/rom/man0p /usr/share/man/rom/man1 /usr/share/man/rom/man1p /usr/share/man/rom/man1x /usr/share/man/rom/man2 /usr/share/man/rom/man2x /usr/share/man/rom/man3 /usr/share/man/rom/man3p /usr/share/man/rom/man3x /usr/share/man/rom/man4 /usr/share/man/rom/man4x /usr/share/man/rom/man5 /usr/share/man/rom/man5x /usr/share/man/rom/man6 /usr/share/man/rom/man6x /usr/share/man/rom/man7 /usr/share/man/rom/man7x /usr/share/man/rom/man8 /usr/share/man/rom/man8x /usr/share/man/rom/man9 /usr/share/man/rom/man9x /usr/share/man/rom/mann /usr/share/man/ru /usr/share/man/ru/man0p /usr/share/man/ru/man1 /usr/share/man/ru/man1p /usr/share/man/ru/man1x /usr/share/man/ru/man2 /usr/share/man/ru/man2x /usr/share/man/ru/man3 /usr/share/man/ru/man3p /usr/share/man/ru/man3x /usr/share/man/ru/man4 /usr/share/man/ru/man4x /usr/share/man/ru/man5 /usr/share/man/ru/man5x /usr/share/man/ru/man6 /usr/share/man/ru/man6x /usr/share/man/ru/man7 /usr/share/man/ru/man7x /usr/share/man/ru/man8 /usr/share/man/ru/man8x /usr/share/man/ru/man9 /usr/share/man/ru/man9x /usr/share/man/ru/mann /usr/share/man/rup /usr/share/man/rup/man0p /usr/share/man/rup/man1 /usr/share/man/rup/man1p /usr/share/man/rup/man1x /usr/share/man/rup/man2 /usr/share/man/rup/man2x /usr/share/man/rup/man3 /usr/share/man/rup/man3p /usr/share/man/rup/man3x /usr/share/man/rup/man4 /usr/share/man/rup/man4x /usr/share/man/rup/man5 /usr/share/man/rup/man5x /usr/share/man/rup/man6 /usr/share/man/rup/man6x /usr/share/man/rup/man7 /usr/share/man/rup/man7x /usr/share/man/rup/man8 /usr/share/man/rup/man8x /usr/share/man/rup/man9 /usr/share/man/rup/man9x /usr/share/man/rup/mann /usr/share/man/ru_RU /usr/share/man/ru_RU/man0p /usr/share/man/ru_RU/man1 /usr/share/man/ru_RU/man1p /usr/share/man/ru_RU/man1x /usr/share/man/ru_RU/man2 /usr/share/man/ru_RU/man2x /usr/share/man/ru_RU/man3 /usr/share/man/ru_RU/man3p /usr/share/man/ru_RU/man3x /usr/share/man/ru_RU/man4 /usr/share/man/ru_RU/man4x /usr/share/man/ru_RU/man5 /usr/share/man/ru_RU/man5x /usr/share/man/ru_RU/man6 /usr/share/man/ru_RU/man6x /usr/share/man/ru_RU/man7 /usr/share/man/ru_RU/man7x /usr/share/man/ru_RU/man8 /usr/share/man/ru_RU/man8x /usr/share/man/ru_RU/man9 /usr/share/man/ru_RU/man9x /usr/share/man/ru_RU/mann /usr/share/man/rw /usr/share/man/rw/man0p /usr/share/man/rw/man1 /usr/share/man/rw/man1p /usr/share/man/rw/man1x /usr/share/man/rw/man2 /usr/share/man/rw/man2x /usr/share/man/rw/man3 /usr/share/man/rw/man3p /usr/share/man/rw/man3x /usr/share/man/rw/man4 /usr/share/man/rw/man4x /usr/share/man/rw/man5 /usr/share/man/rw/man5x /usr/share/man/rw/man6 /usr/share/man/rw/man6x /usr/share/man/rw/man7 /usr/share/man/rw/man7x /usr/share/man/rw/man8 /usr/share/man/rw/man8x /usr/share/man/rw/man9 /usr/share/man/rw/man9x /usr/share/man/rw/mann /usr/share/man/sa /usr/share/man/sad /usr/share/man/sad/man0p /usr/share/man/sad/man1 /usr/share/man/sad/man1p /usr/share/man/sad/man1x /usr/share/man/sad/man2 /usr/share/man/sad/man2x /usr/share/man/sad/man3 /usr/share/man/sad/man3p /usr/share/man/sad/man3x /usr/share/man/sad/man4 /usr/share/man/sad/man4x /usr/share/man/sad/man5 /usr/share/man/sad/man5x /usr/share/man/sad/man6 /usr/share/man/sad/man6x /usr/share/man/sad/man7 /usr/share/man/sad/man7x /usr/share/man/sad/man8 /usr/share/man/sad/man8x /usr/share/man/sad/man9 /usr/share/man/sad/man9x /usr/share/man/sad/mann /usr/share/man/sah /usr/share/man/sah/man0p /usr/share/man/sah/man1 /usr/share/man/sah/man1p /usr/share/man/sah/man1x /usr/share/man/sah/man2 /usr/share/man/sah/man2x /usr/share/man/sah/man3 /usr/share/man/sah/man3p /usr/share/man/sah/man3x /usr/share/man/sah/man4 /usr/share/man/sah/man4x /usr/share/man/sah/man5 /usr/share/man/sah/man5x /usr/share/man/sah/man6 /usr/share/man/sah/man6x /usr/share/man/sah/man7 /usr/share/man/sah/man7x /usr/share/man/sah/man8 /usr/share/man/sah/man8x /usr/share/man/sah/man9 /usr/share/man/sah/man9x /usr/share/man/sah/mann /usr/share/man/sai /usr/share/man/sai/man0p /usr/share/man/sai/man1 /usr/share/man/sai/man1p /usr/share/man/sai/man1x /usr/share/man/sai/man2 /usr/share/man/sai/man2x /usr/share/man/sai/man3 /usr/share/man/sai/man3p /usr/share/man/sai/man3x /usr/share/man/sai/man4 /usr/share/man/sai/man4x /usr/share/man/sai/man5 /usr/share/man/sai/man5x /usr/share/man/sai/man6 /usr/share/man/sai/man6x /usr/share/man/sai/man7 /usr/share/man/sai/man7x /usr/share/man/sai/man8 /usr/share/man/sai/man8x /usr/share/man/sai/man9 /usr/share/man/sai/man9x /usr/share/man/sai/mann /usr/share/man/sal /usr/share/man/sal/man0p /usr/share/man/sal/man1 /usr/share/man/sal/man1p /usr/share/man/sal/man1x /usr/share/man/sal/man2 /usr/share/man/sal/man2x /usr/share/man/sal/man3 /usr/share/man/sal/man3p /usr/share/man/sal/man3x /usr/share/man/sal/man4 /usr/share/man/sal/man4x /usr/share/man/sal/man5 /usr/share/man/sal/man5x /usr/share/man/sal/man6 /usr/share/man/sal/man6x /usr/share/man/sal/man7 /usr/share/man/sal/man7x /usr/share/man/sal/man8 /usr/share/man/sal/man8x /usr/share/man/sal/man9 /usr/share/man/sal/man9x /usr/share/man/sal/mann /usr/share/man/sam /usr/share/man/sa/man0p /usr/share/man/sa/man1 /usr/share/man/sa/man1p /usr/share/man/sa/man1x /usr/share/man/sa/man2 /usr/share/man/sa/man2x /usr/share/man/sa/man3 /usr/share/man/sa/man3p /usr/share/man/sa/man3x /usr/share/man/sa/man4 /usr/share/man/sa/man4x /usr/share/man/sa/man5 /usr/share/man/sa/man5x /usr/share/man/sa/man6 /usr/share/man/sa/man6x /usr/share/man/sa/man7 /usr/share/man/sa/man7x /usr/share/man/sa/man8 /usr/share/man/sa/man8x /usr/share/man/sa/man9 /usr/share/man/sa/man9x /usr/share/man/sa/mann /usr/share/man/sam/man0p /usr/share/man/sam/man1 /usr/share/man/sam/man1p /usr/share/man/sam/man1x /usr/share/man/sam/man2 /usr/share/man/sam/man2x /usr/share/man/sam/man3 /usr/share/man/sam/man3p /usr/share/man/sam/man3x /usr/share/man/sam/man4 /usr/share/man/sam/man4x /usr/share/man/sam/man5 /usr/share/man/sam/man5x /usr/share/man/sam/man6 /usr/share/man/sam/man6x /usr/share/man/sam/man7 /usr/share/man/sam/man7x /usr/share/man/sam/man8 /usr/share/man/sam/man8x /usr/share/man/sam/man9 /usr/share/man/sam/man9x /usr/share/man/sam/mann /usr/share/man/sas /usr/share/man/sas/man0p /usr/share/man/sas/man1 /usr/share/man/sas/man1p /usr/share/man/sas/man1x /usr/share/man/sas/man2 /usr/share/man/sas/man2x /usr/share/man/sas/man3 /usr/share/man/sas/man3p /usr/share/man/sas/man3x /usr/share/man/sas/man4 /usr/share/man/sas/man4x /usr/share/man/sas/man5 /usr/share/man/sas/man5x /usr/share/man/sas/man6 /usr/share/man/sas/man6x /usr/share/man/sas/man7 /usr/share/man/sas/man7x /usr/share/man/sas/man8 /usr/share/man/sas/man8x /usr/share/man/sas/man9 /usr/share/man/sas/man9x /usr/share/man/sas/mann /usr/share/man/sat /usr/share/man/sat/man0p /usr/share/man/sat/man1 /usr/share/man/sat/man1p /usr/share/man/sat/man1x /usr/share/man/sat/man2 /usr/share/man/sat/man2x /usr/share/man/sat/man3 /usr/share/man/sat/man3p /usr/share/man/sat/man3x /usr/share/man/sat/man4 /usr/share/man/sat/man4x /usr/share/man/sat/man5 /usr/share/man/sat/man5x /usr/share/man/sat/man6 /usr/share/man/sat/man6x /usr/share/man/sat/man7 /usr/share/man/sat/man7x /usr/share/man/sat/man8 /usr/share/man/sat/man8x /usr/share/man/sat/man9 /usr/share/man/sat/man9x /usr/share/man/sat/mann /usr/share/man/sc /usr/share/man/sc/man0p /usr/share/man/sc/man1 /usr/share/man/sc/man1p /usr/share/man/sc/man1x /usr/share/man/sc/man2 /usr/share/man/sc/man2x /usr/share/man/sc/man3 /usr/share/man/sc/man3p /usr/share/man/sc/man3x /usr/share/man/sc/man4 /usr/share/man/sc/man4x /usr/share/man/sc/man5 /usr/share/man/sc/man5x /usr/share/man/sc/man6 /usr/share/man/sc/man6x /usr/share/man/sc/man7 /usr/share/man/sc/man7x /usr/share/man/sc/man8 /usr/share/man/sc/man8x /usr/share/man/sc/man9 /usr/share/man/sc/man9x /usr/share/man/sc/mann /usr/share/man/scn /usr/share/man/scn/man0p /usr/share/man/scn/man1 /usr/share/man/scn/man1p /usr/share/man/scn/man1x /usr/share/man/scn/man2 /usr/share/man/scn/man2x /usr/share/man/scn/man3 /usr/share/man/scn/man3p /usr/share/man/scn/man3x /usr/share/man/scn/man4 /usr/share/man/scn/man4x /usr/share/man/scn/man5 /usr/share/man/scn/man5x /usr/share/man/scn/man6 /usr/share/man/scn/man6x /usr/share/man/scn/man7 /usr/share/man/scn/man7x /usr/share/man/scn/man8 /usr/share/man/scn/man8x /usr/share/man/scn/man9 /usr/share/man/scn/man9x /usr/share/man/scn/mann /usr/share/man/sco /usr/share/man/sco/man0p /usr/share/man/sco/man1 /usr/share/man/sco/man1p /usr/share/man/sco/man1x /usr/share/man/sco/man2 /usr/share/man/sco/man2x /usr/share/man/sco/man3 /usr/share/man/sco/man3p /usr/share/man/sco/man3x /usr/share/man/sco/man4 /usr/share/man/sco/man4x /usr/share/man/sco/man5 /usr/share/man/sco/man5x /usr/share/man/sco/man6 /usr/share/man/sco/man6x /usr/share/man/sco/man7 /usr/share/man/sco/man7x /usr/share/man/sco/man8 /usr/share/man/sco/man8x /usr/share/man/sco/man9 /usr/share/man/sco/man9x /usr/share/man/sco/mann /usr/share/man/sd /usr/share/man/sd/man0p /usr/share/man/sd/man1 /usr/share/man/sd/man1p /usr/share/man/sd/man1x /usr/share/man/sd/man2 /usr/share/man/sd/man2x /usr/share/man/sd/man3 /usr/share/man/sd/man3p /usr/share/man/sd/man3x /usr/share/man/sd/man4 /usr/share/man/sd/man4x /usr/share/man/sd/man5 /usr/share/man/sd/man5x /usr/share/man/sd/man6 /usr/share/man/sd/man6x /usr/share/man/sd/man7 /usr/share/man/sd/man7x /usr/share/man/sd/man8 /usr/share/man/sd/man8x /usr/share/man/sd/man9 /usr/share/man/sd/man9x /usr/share/man/sd/mann /usr/share/man/se /usr/share/man/sel /usr/share/man/sel/man0p /usr/share/man/sel/man1 /usr/share/man/sel/man1p /usr/share/man/sel/man1x /usr/share/man/sel/man2 /usr/share/man/sel/man2x /usr/share/man/sel/man3 /usr/share/man/sel/man3p /usr/share/man/sel/man3x /usr/share/man/sel/man4 /usr/share/man/sel/man4x /usr/share/man/sel/man5 /usr/share/man/sel/man5x /usr/share/man/sel/man6 /usr/share/man/sel/man6x /usr/share/man/sel/man7 /usr/share/man/sel/man7x /usr/share/man/sel/man8 /usr/share/man/sel/man8x /usr/share/man/sel/man9 /usr/share/man/sel/man9x /usr/share/man/sel/mann /usr/share/man/sem /usr/share/man/se/man0p /usr/share/man/se/man1 /usr/share/man/se/man1p /usr/share/man/se/man1x /usr/share/man/se/man2 /usr/share/man/se/man2x /usr/share/man/se/man3 /usr/share/man/se/man3p /usr/share/man/se/man3x /usr/share/man/se/man4 /usr/share/man/se/man4x /usr/share/man/se/man5 /usr/share/man/se/man5x /usr/share/man/se/man6 /usr/share/man/se/man6x /usr/share/man/se/man7 /usr/share/man/se/man7x /usr/share/man/se/man8 /usr/share/man/se/man8x /usr/share/man/se/man9 /usr/share/man/se/man9x /usr/share/man/se/mann /usr/share/man/sem/man0p /usr/share/man/sem/man1 /usr/share/man/sem/man1p /usr/share/man/sem/man1x /usr/share/man/sem/man2 /usr/share/man/sem/man2x /usr/share/man/sem/man3 /usr/share/man/sem/man3p /usr/share/man/sem/man3x /usr/share/man/sem/man4 /usr/share/man/sem/man4x /usr/share/man/sem/man5 /usr/share/man/sem/man5x /usr/share/man/sem/man6 /usr/share/man/sem/man6x /usr/share/man/sem/man7 /usr/share/man/sem/man7x /usr/share/man/sem/man8 /usr/share/man/sem/man8x /usr/share/man/sem/man9 /usr/share/man/sem/man9x /usr/share/man/sem/mann /usr/share/man/sg /usr/share/man/sga /usr/share/man/sga/man0p /usr/share/man/sga/man1 /usr/share/man/sga/man1p /usr/share/man/sga/man1x /usr/share/man/sga/man2 /usr/share/man/sga/man2x /usr/share/man/sga/man3 /usr/share/man/sga/man3p /usr/share/man/sga/man3x /usr/share/man/sga/man4 /usr/share/man/sga/man4x /usr/share/man/sga/man5 /usr/share/man/sga/man5x /usr/share/man/sga/man6 /usr/share/man/sga/man6x /usr/share/man/sga/man7 /usr/share/man/sga/man7x /usr/share/man/sga/man8 /usr/share/man/sga/man8x /usr/share/man/sga/man9 /usr/share/man/sga/man9x /usr/share/man/sga/mann /usr/share/man/sg/man0p /usr/share/man/sg/man1 /usr/share/man/sg/man1p /usr/share/man/sg/man1x /usr/share/man/sg/man2 /usr/share/man/sg/man2x /usr/share/man/sg/man3 /usr/share/man/sg/man3p /usr/share/man/sg/man3x /usr/share/man/sg/man4 /usr/share/man/sg/man4x /usr/share/man/sg/man5 /usr/share/man/sg/man5x /usr/share/man/sg/man6 /usr/share/man/sg/man6x /usr/share/man/sg/man7 /usr/share/man/sg/man7x /usr/share/man/sg/man8 /usr/share/man/sg/man8x /usr/share/man/sg/man9 /usr/share/man/sg/man9x /usr/share/man/sg/mann /usr/share/man/sgn /usr/share/man/sgn/man0p /usr/share/man/sgn/man1 /usr/share/man/sgn/man1p /usr/share/man/sgn/man1x /usr/share/man/sgn/man2 /usr/share/man/sgn/man2x /usr/share/man/sgn/man3 /usr/share/man/sgn/man3p /usr/share/man/sgn/man3x /usr/share/man/sgn/man4 /usr/share/man/sgn/man4x /usr/share/man/sgn/man5 /usr/share/man/sgn/man5x /usr/share/man/sgn/man6 /usr/share/man/sgn/man6x /usr/share/man/sgn/man7 /usr/share/man/sgn/man7x /usr/share/man/sgn/man8 /usr/share/man/sgn/man8x /usr/share/man/sgn/man9 /usr/share/man/sgn/man9x /usr/share/man/sgn/mann /usr/share/man/shn /usr/share/man/shn/man0p /usr/share/man/shn/man1 /usr/share/man/shn/man1p /usr/share/man/shn/man1x /usr/share/man/shn/man2 /usr/share/man/shn/man2x /usr/share/man/shn/man3 /usr/share/man/shn/man3p /usr/share/man/shn/man3x /usr/share/man/shn/man4 /usr/share/man/shn/man4x /usr/share/man/shn/man5 /usr/share/man/shn/man5x /usr/share/man/shn/man6 /usr/share/man/shn/man6x /usr/share/man/shn/man7 /usr/share/man/shn/man7x /usr/share/man/shn/man8 /usr/share/man/shn/man8x /usr/share/man/shn/man9 /usr/share/man/shn/man9x /usr/share/man/shn/mann /usr/share/man/si /usr/share/man/sid /usr/share/man/sid/man0p /usr/share/man/sid/man1 /usr/share/man/sid/man1p /usr/share/man/sid/man1x /usr/share/man/sid/man2 /usr/share/man/sid/man2x /usr/share/man/sid/man3 /usr/share/man/sid/man3p /usr/share/man/sid/man3x /usr/share/man/sid/man4 /usr/share/man/sid/man4x /usr/share/man/sid/man5 /usr/share/man/sid/man5x /usr/share/man/sid/man6 /usr/share/man/sid/man6x /usr/share/man/sid/man7 /usr/share/man/sid/man7x /usr/share/man/sid/man8 /usr/share/man/sid/man8x /usr/share/man/sid/man9 /usr/share/man/sid/man9x /usr/share/man/sid/mann /usr/share/man/si/man0p /usr/share/man/si/man1 /usr/share/man/si/man1p /usr/share/man/si/man1x /usr/share/man/si/man2 /usr/share/man/si/man2x /usr/share/man/si/man3 /usr/share/man/si/man3p /usr/share/man/si/man3x /usr/share/man/si/man4 /usr/share/man/si/man4x /usr/share/man/si/man5 /usr/share/man/si/man5x /usr/share/man/si/man6 /usr/share/man/si/man6x /usr/share/man/si/man7 /usr/share/man/si/man7x /usr/share/man/si/man8 /usr/share/man/si/man8x /usr/share/man/si/man9 /usr/share/man/si/man9x /usr/share/man/si/mann /usr/share/man/sio /usr/share/man/sio/man0p /usr/share/man/sio/man1 /usr/share/man/sio/man1p /usr/share/man/sio/man1x /usr/share/man/sio/man2 /usr/share/man/sio/man2x /usr/share/man/sio/man3 /usr/share/man/sio/man3p /usr/share/man/sio/man3x /usr/share/man/sio/man4 /usr/share/man/sio/man4x /usr/share/man/sio/man5 /usr/share/man/sio/man5x /usr/share/man/sio/man6 /usr/share/man/sio/man6x /usr/share/man/sio/man7 /usr/share/man/sio/man7x /usr/share/man/sio/man8 /usr/share/man/sio/man8x /usr/share/man/sio/man9 /usr/share/man/sio/man9x /usr/share/man/sio/mann /usr/share/man/sit /usr/share/man/sit/man0p /usr/share/man/sit/man1 /usr/share/man/sit/man1p /usr/share/man/sit/man1x /usr/share/man/sit/man2 /usr/share/man/sit/man2x /usr/share/man/sit/man3 /usr/share/man/sit/man3p /usr/share/man/sit/man3x /usr/share/man/sit/man4 /usr/share/man/sit/man4x /usr/share/man/sit/man5 /usr/share/man/sit/man5x /usr/share/man/sit/man6 /usr/share/man/sit/man6x /usr/share/man/sit/man7 /usr/share/man/sit/man7x /usr/share/man/sit/man8 /usr/share/man/sit/man8x /usr/share/man/sit/man9 /usr/share/man/sit/man9x /usr/share/man/sit/mann /usr/share/man/sk /usr/share/man/sk/man0p /usr/share/man/sk/man1 /usr/share/man/sk/man1p /usr/share/man/sk/man1x /usr/share/man/sk/man2 /usr/share/man/sk/man2x /usr/share/man/sk/man3 /usr/share/man/sk/man3p /usr/share/man/sk/man3x /usr/share/man/sk/man4 /usr/share/man/sk/man4x /usr/share/man/sk/man5 /usr/share/man/sk/man5x /usr/share/man/sk/man6 /usr/share/man/sk/man6x /usr/share/man/sk/man7 /usr/share/man/sk/man7x /usr/share/man/sk/man8 /usr/share/man/sk/man8x /usr/share/man/sk/man9 /usr/share/man/sk/man9x /usr/share/man/sk/mann /usr/share/man/sl /usr/share/man/sla /usr/share/man/sla/man0p /usr/share/man/sla/man1 /usr/share/man/sla/man1p /usr/share/man/sla/man1x /usr/share/man/sla/man2 /usr/share/man/sla/man2x /usr/share/man/sla/man3 /usr/share/man/sla/man3p /usr/share/man/sla/man3x /usr/share/man/sla/man4 /usr/share/man/sla/man4x /usr/share/man/sla/man5 /usr/share/man/sla/man5x /usr/share/man/sla/man6 /usr/share/man/sla/man6x /usr/share/man/sla/man7 /usr/share/man/sla/man7x /usr/share/man/sla/man8 /usr/share/man/sla/man8x /usr/share/man/sla/man9 /usr/share/man/sla/man9x /usr/share/man/sla/mann /usr/share/man/sl/man0p /usr/share/man/sl/man1 /usr/share/man/sl/man1p /usr/share/man/sl/man1x /usr/share/man/sl/man2 /usr/share/man/sl/man2x /usr/share/man/sl/man3 /usr/share/man/sl/man3p /usr/share/man/sl/man3x /usr/share/man/sl/man4 /usr/share/man/sl/man4x /usr/share/man/sl/man5 /usr/share/man/sl/man5x /usr/share/man/sl/man6 /usr/share/man/sl/man6x /usr/share/man/sl/man7 /usr/share/man/sl/man7x /usr/share/man/sl/man8 /usr/share/man/sl/man8x /usr/share/man/sl/man9 /usr/share/man/sl/man9x /usr/share/man/sl/mann /usr/share/man/sl_SI /usr/share/man/sl_SI/man0p /usr/share/man/sl_SI/man1 /usr/share/man/sl_SI/man1p /usr/share/man/sl_SI/man1x /usr/share/man/sl_SI/man2 /usr/share/man/sl_SI/man2x /usr/share/man/sl_SI/man3 /usr/share/man/sl_SI/man3p /usr/share/man/sl_SI/man3x /usr/share/man/sl_SI/man4 /usr/share/man/sl_SI/man4x /usr/share/man/sl_SI/man5 /usr/share/man/sl_SI/man5x /usr/share/man/sl_SI/man6 /usr/share/man/sl_SI/man6x /usr/share/man/sl_SI/man7 /usr/share/man/sl_SI/man7x /usr/share/man/sl_SI/man8 /usr/share/man/sl_SI/man8x /usr/share/man/sl_SI/man9 /usr/share/man/sl_SI/man9x /usr/share/man/sl_SI/mann /usr/share/man/sm /usr/share/man/sma /usr/share/man/sma/man0p /usr/share/man/sma/man1 /usr/share/man/sma/man1p /usr/share/man/sma/man1x /usr/share/man/sma/man2 /usr/share/man/sma/man2x /usr/share/man/sma/man3 /usr/share/man/sma/man3p /usr/share/man/sma/man3x /usr/share/man/sma/man4 /usr/share/man/sma/man4x /usr/share/man/sma/man5 /usr/share/man/sma/man5x /usr/share/man/sma/man6 /usr/share/man/sma/man6x /usr/share/man/sma/man7 /usr/share/man/sma/man7x /usr/share/man/sma/man8 /usr/share/man/sma/man8x /usr/share/man/sma/man9 /usr/share/man/sma/man9x /usr/share/man/sma/mann /usr/share/man/smi /usr/share/man/smi/man0p /usr/share/man/smi/man1 /usr/share/man/smi/man1p /usr/share/man/smi/man1x /usr/share/man/smi/man2 /usr/share/man/smi/man2x /usr/share/man/smi/man3 /usr/share/man/smi/man3p /usr/share/man/smi/man3x /usr/share/man/smi/man4 /usr/share/man/smi/man4x /usr/share/man/smi/man5 /usr/share/man/smi/man5x /usr/share/man/smi/man6 /usr/share/man/smi/man6x /usr/share/man/smi/man7 /usr/share/man/smi/man7x /usr/share/man/smi/man8 /usr/share/man/smi/man8x /usr/share/man/smi/man9 /usr/share/man/smi/man9x /usr/share/man/smi/mann /usr/share/man/smj /usr/share/man/smj/man0p /usr/share/man/smj/man1 /usr/share/man/smj/man1p /usr/share/man/smj/man1x /usr/share/man/smj/man2 /usr/share/man/smj/man2x /usr/share/man/smj/man3 /usr/share/man/smj/man3p /usr/share/man/smj/man3x /usr/share/man/smj/man4 /usr/share/man/smj/man4x /usr/share/man/smj/man5 /usr/share/man/smj/man5x /usr/share/man/smj/man6 /usr/share/man/smj/man6x /usr/share/man/smj/man7 /usr/share/man/smj/man7x /usr/share/man/smj/man8 /usr/share/man/smj/man8x /usr/share/man/smj/man9 /usr/share/man/smj/man9x /usr/share/man/smj/mann /usr/share/man/sm/man0p /usr/share/man/sm/man1 /usr/share/man/sm/man1p /usr/share/man/sm/man1x /usr/share/man/sm/man2 /usr/share/man/sm/man2x /usr/share/man/sm/man3 /usr/share/man/sm/man3p /usr/share/man/sm/man3x /usr/share/man/sm/man4 /usr/share/man/sm/man4x /usr/share/man/sm/man5 /usr/share/man/sm/man5x /usr/share/man/sm/man6 /usr/share/man/sm/man6x /usr/share/man/sm/man7 /usr/share/man/sm/man7x /usr/share/man/sm/man8 /usr/share/man/sm/man8x /usr/share/man/sm/man9 /usr/share/man/sm/man9x /usr/share/man/sm/mann /usr/share/man/smn /usr/share/man/smn/man0p /usr/share/man/smn/man1 /usr/share/man/smn/man1p /usr/share/man/smn/man1x /usr/share/man/smn/man2 /usr/share/man/smn/man2x /usr/share/man/smn/man3 /usr/share/man/smn/man3p /usr/share/man/smn/man3x /usr/share/man/smn/man4 /usr/share/man/smn/man4x /usr/share/man/smn/man5 /usr/share/man/smn/man5x /usr/share/man/smn/man6 /usr/share/man/smn/man6x /usr/share/man/smn/man7 /usr/share/man/smn/man7x /usr/share/man/smn/man8 /usr/share/man/smn/man8x /usr/share/man/smn/man9 /usr/share/man/smn/man9x /usr/share/man/smn/mann /usr/share/man/sms /usr/share/man/sms/man0p /usr/share/man/sms/man1 /usr/share/man/sms/man1p /usr/share/man/sms/man1x /usr/share/man/sms/man2 /usr/share/man/sms/man2x /usr/share/man/sms/man3 /usr/share/man/sms/man3p /usr/share/man/sms/man3x /usr/share/man/sms/man4 /usr/share/man/sms/man4x /usr/share/man/sms/man5 /usr/share/man/sms/man5x /usr/share/man/sms/man6 /usr/share/man/sms/man6x /usr/share/man/sms/man7 /usr/share/man/sms/man7x /usr/share/man/sms/man8 /usr/share/man/sms/man8x /usr/share/man/sms/man9 /usr/share/man/sms/man9x /usr/share/man/sms/mann /usr/share/man/sn /usr/share/man/snk /usr/share/man/snk/man0p /usr/share/man/snk/man1 /usr/share/man/snk/man1p /usr/share/man/snk/man1x /usr/share/man/snk/man2 /usr/share/man/snk/man2x /usr/share/man/snk/man3 /usr/share/man/snk/man3p /usr/share/man/snk/man3x /usr/share/man/snk/man4 /usr/share/man/snk/man4x /usr/share/man/snk/man5 /usr/share/man/snk/man5x /usr/share/man/snk/man6 /usr/share/man/snk/man6x /usr/share/man/snk/man7 /usr/share/man/snk/man7x /usr/share/man/snk/man8 /usr/share/man/snk/man8x /usr/share/man/snk/man9 /usr/share/man/snk/man9x /usr/share/man/snk/mann /usr/share/man/sn/man0p /usr/share/man/sn/man1 /usr/share/man/sn/man1p /usr/share/man/sn/man1x /usr/share/man/sn/man2 /usr/share/man/sn/man2x /usr/share/man/sn/man3 /usr/share/man/sn/man3p /usr/share/man/sn/man3x /usr/share/man/sn/man4 /usr/share/man/sn/man4x /usr/share/man/sn/man5 /usr/share/man/sn/man5x /usr/share/man/sn/man6 /usr/share/man/sn/man6x /usr/share/man/sn/man7 /usr/share/man/sn/man7x /usr/share/man/sn/man8 /usr/share/man/sn/man8x /usr/share/man/sn/man9 /usr/share/man/sn/man9x /usr/share/man/sn/mann /usr/share/man/so /usr/share/man/sog /usr/share/man/sog/man0p /usr/share/man/sog/man1 /usr/share/man/sog/man1p /usr/share/man/sog/man1x /usr/share/man/sog/man2 /usr/share/man/sog/man2x /usr/share/man/sog/man3 /usr/share/man/sog/man3p /usr/share/man/sog/man3x /usr/share/man/sog/man4 /usr/share/man/sog/man4x /usr/share/man/sog/man5 /usr/share/man/sog/man5x /usr/share/man/sog/man6 /usr/share/man/sog/man6x /usr/share/man/sog/man7 /usr/share/man/sog/man7x /usr/share/man/sog/man8 /usr/share/man/sog/man8x /usr/share/man/sog/man9 /usr/share/man/sog/man9x /usr/share/man/sog/mann /usr/share/man/so/man0p /usr/share/man/so/man1 /usr/share/man/so/man1p /usr/share/man/so/man1x /usr/share/man/so/man2 /usr/share/man/so/man2x /usr/share/man/so/man3 /usr/share/man/so/man3p /usr/share/man/so/man3x /usr/share/man/so/man4 /usr/share/man/so/man4x /usr/share/man/so/man5 /usr/share/man/so/man5x /usr/share/man/so/man6 /usr/share/man/so/man6x /usr/share/man/so/man7 /usr/share/man/so/man7x /usr/share/man/so/man8 /usr/share/man/so/man8x /usr/share/man/so/man9 /usr/share/man/so/man9x /usr/share/man/so/mann /usr/share/man/son /usr/share/man/son/man0p /usr/share/man/son/man1 /usr/share/man/son/man1p /usr/share/man/son/man1x /usr/share/man/son/man2 /usr/share/man/son/man2x /usr/share/man/son/man3 /usr/share/man/son/man3p /usr/share/man/son/man3x /usr/share/man/son/man4 /usr/share/man/son/man4x /usr/share/man/son/man5 /usr/share/man/son/man5x /usr/share/man/son/man6 /usr/share/man/son/man6x /usr/share/man/son/man7 /usr/share/man/son/man7x /usr/share/man/son/man8 /usr/share/man/son/man8x /usr/share/man/son/man9 /usr/share/man/son/man9x /usr/share/man/son/mann /usr/share/man/sq /usr/share/man/sq_AL /usr/share/man/sq_AL/man0p /usr/share/man/sq_AL/man1 /usr/share/man/sq_AL/man1p /usr/share/man/sq_AL/man1x /usr/share/man/sq_AL/man2 /usr/share/man/sq_AL/man2x /usr/share/man/sq_AL/man3 /usr/share/man/sq_AL/man3p /usr/share/man/sq_AL/man3x /usr/share/man/sq_AL/man4 /usr/share/man/sq_AL/man4x /usr/share/man/sq_AL/man5 /usr/share/man/sq_AL/man5x /usr/share/man/sq_AL/man6 /usr/share/man/sq_AL/man6x /usr/share/man/sq_AL/man7 /usr/share/man/sq_AL/man7x /usr/share/man/sq_AL/man8 /usr/share/man/sq_AL/man8x /usr/share/man/sq_AL/man9 /usr/share/man/sq_AL/man9x /usr/share/man/sq_AL/mann /usr/share/man/sq/man0p /usr/share/man/sq/man1 /usr/share/man/sq/man1p /usr/share/man/sq/man1x /usr/share/man/sq/man2 /usr/share/man/sq/man2x /usr/share/man/sq/man3 /usr/share/man/sq/man3p /usr/share/man/sq/man3x /usr/share/man/sq/man4 /usr/share/man/sq/man4x /usr/share/man/sq/man5 /usr/share/man/sq/man5x /usr/share/man/sq/man6 /usr/share/man/sq/man6x /usr/share/man/sq/man7 /usr/share/man/sq/man7x /usr/share/man/sq/man8 /usr/share/man/sq/man8x /usr/share/man/sq/man9 /usr/share/man/sq/man9x /usr/share/man/sq/mann /usr/share/man/sr /usr/share/man/sr@ije /usr/share/man/sr@ijekavian /usr/share/man/sr@ijekavianlatin /usr/share/man/sr@ijekavianlatin/man0p /usr/share/man/sr@ijekavianlatin/man1 /usr/share/man/sr@ijekavianlatin/man1p /usr/share/man/sr@ijekavianlatin/man1x /usr/share/man/sr@ijekavianlatin/man2 /usr/share/man/sr@ijekavianlatin/man2x /usr/share/man/sr@ijekavianlatin/man3 /usr/share/man/sr@ijekavianlatin/man3p /usr/share/man/sr@ijekavianlatin/man3x /usr/share/man/sr@ijekavianlatin/man4 /usr/share/man/sr@ijekavianlatin/man4x /usr/share/man/sr@ijekavianlatin/man5 /usr/share/man/sr@ijekavianlatin/man5x /usr/share/man/sr@ijekavianlatin/man6 /usr/share/man/sr@ijekavianlatin/man6x /usr/share/man/sr@ijekavianlatin/man7 /usr/share/man/sr@ijekavianlatin/man7x /usr/share/man/sr@ijekavianlatin/man8 /usr/share/man/sr@ijekavianlatin/man8x /usr/share/man/sr@ijekavianlatin/man9 /usr/share/man/sr@ijekavianlatin/man9x /usr/share/man/sr@ijekavianlatin/mann /usr/share/man/sr@ijekavian/man0p /usr/share/man/sr@ijekavian/man1 /usr/share/man/sr@ijekavian/man1p /usr/share/man/sr@ijekavian/man1x /usr/share/man/sr@ijekavian/man2 /usr/share/man/sr@ijekavian/man2x /usr/share/man/sr@ijekavian/man3 /usr/share/man/sr@ijekavian/man3p /usr/share/man/sr@ijekavian/man3x /usr/share/man/sr@ijekavian/man4 /usr/share/man/sr@ijekavian/man4x /usr/share/man/sr@ijekavian/man5 /usr/share/man/sr@ijekavian/man5x /usr/share/man/sr@ijekavian/man6 /usr/share/man/sr@ijekavian/man6x /usr/share/man/sr@ijekavian/man7 /usr/share/man/sr@ijekavian/man7x /usr/share/man/sr@ijekavian/man8 /usr/share/man/sr@ijekavian/man8x /usr/share/man/sr@ijekavian/man9 /usr/share/man/sr@ijekavian/man9x /usr/share/man/sr@ijekavian/mann /usr/share/man/sr@ije/man0p /usr/share/man/sr@ije/man1 /usr/share/man/sr@ije/man1p /usr/share/man/sr@ije/man1x /usr/share/man/sr@ije/man2 /usr/share/man/sr@ije/man2x /usr/share/man/sr@ije/man3 /usr/share/man/sr@ije/man3p /usr/share/man/sr@ije/man3x /usr/share/man/sr@ije/man4 /usr/share/man/sr@ije/man4x /usr/share/man/sr@ije/man5 /usr/share/man/sr@ije/man5x /usr/share/man/sr@ije/man6 /usr/share/man/sr@ije/man6x /usr/share/man/sr@ije/man7 /usr/share/man/sr@ije/man7x /usr/share/man/sr@ije/man8 /usr/share/man/sr@ije/man8x /usr/share/man/sr@ije/man9 /usr/share/man/sr@ije/man9x /usr/share/man/sr@ije/mann /usr/share/man/sr@latin /usr/share/man/sr@latin/man0p /usr/share/man/sr@latin/man1 /usr/share/man/sr@latin/man1p /usr/share/man/sr@latin/man1x /usr/share/man/sr@latin/man2 /usr/share/man/sr@latin/man2x /usr/share/man/sr@latin/man3 /usr/share/man/sr@latin/man3p /usr/share/man/sr@latin/man3x /usr/share/man/sr@latin/man4 /usr/share/man/sr@latin/man4x /usr/share/man/sr@latin/man5 /usr/share/man/sr@latin/man5x /usr/share/man/sr@latin/man6 /usr/share/man/sr@latin/man6x /usr/share/man/sr@latin/man7 /usr/share/man/sr@latin/man7x /usr/share/man/sr@latin/man8 /usr/share/man/sr@latin/man8x /usr/share/man/sr@latin/man9 /usr/share/man/sr@latin/man9x /usr/share/man/sr@latin/mann /usr/share/man/sr@Latn /usr/share/man/sr@Latn/man0p /usr/share/man/sr@Latn/man1 /usr/share/man/sr@Latn/man1p /usr/share/man/sr@Latn/man1x /usr/share/man/sr@Latn/man2 /usr/share/man/sr@Latn/man2x /usr/share/man/sr@Latn/man3 /usr/share/man/sr@Latn/man3p /usr/share/man/sr@Latn/man3x /usr/share/man/sr@Latn/man4 /usr/share/man/sr@Latn/man4x /usr/share/man/sr@Latn/man5 /usr/share/man/sr@Latn/man5x /usr/share/man/sr@Latn/man6 /usr/share/man/sr@Latn/man6x /usr/share/man/sr@Latn/man7 /usr/share/man/sr@Latn/man7x /usr/share/man/sr@Latn/man8 /usr/share/man/sr@Latn/man8x /usr/share/man/sr@Latn/man9 /usr/share/man/sr@Latn/man9x /usr/share/man/sr@Latn/mann /usr/share/man/sr/man0p /usr/share/man/sr/man1 /usr/share/man/sr/man1p /usr/share/man/sr/man1x /usr/share/man/sr/man2 /usr/share/man/sr/man2x /usr/share/man/sr/man3 /usr/share/man/sr/man3p /usr/share/man/sr/man3x /usr/share/man/sr/man4 /usr/share/man/sr/man4x /usr/share/man/sr/man5 /usr/share/man/sr/man5x /usr/share/man/sr/man6 /usr/share/man/sr/man6x /usr/share/man/sr/man7 /usr/share/man/sr/man7x /usr/share/man/sr/man8 /usr/share/man/sr/man8x /usr/share/man/sr/man9 /usr/share/man/sr/man9x /usr/share/man/sr/mann /usr/share/man/srn /usr/share/man/srn/man0p /usr/share/man/srn/man1 /usr/share/man/srn/man1p /usr/share/man/srn/man1x /usr/share/man/srn/man2 /usr/share/man/srn/man2x /usr/share/man/srn/man3 /usr/share/man/srn/man3p /usr/share/man/srn/man3x /usr/share/man/srn/man4 /usr/share/man/srn/man4x /usr/share/man/srn/man5 /usr/share/man/srn/man5x /usr/share/man/srn/man6 /usr/share/man/srn/man6x /usr/share/man/srn/man7 /usr/share/man/srn/man7x /usr/share/man/srn/man8 /usr/share/man/srn/man8x /usr/share/man/srn/man9 /usr/share/man/srn/man9x /usr/share/man/srn/mann /usr/share/man/srr /usr/share/man/srr/man0p /usr/share/man/srr/man1 /usr/share/man/srr/man1p /usr/share/man/srr/man1x /usr/share/man/srr/man2 /usr/share/man/srr/man2x /usr/share/man/srr/man3 /usr/share/man/srr/man3p /usr/share/man/srr/man3x /usr/share/man/srr/man4 /usr/share/man/srr/man4x /usr/share/man/srr/man5 /usr/share/man/srr/man5x /usr/share/man/srr/man6 /usr/share/man/srr/man6x /usr/share/man/srr/man7 /usr/share/man/srr/man7x /usr/share/man/srr/man8 /usr/share/man/srr/man8x /usr/share/man/srr/man9 /usr/share/man/srr/man9x /usr/share/man/srr/mann /usr/share/man/sr_RS /usr/share/man/sr_RS/man0p /usr/share/man/sr_RS/man1 /usr/share/man/sr_RS/man1p /usr/share/man/sr_RS/man1x /usr/share/man/sr_RS/man2 /usr/share/man/sr_RS/man2x /usr/share/man/sr_RS/man3 /usr/share/man/sr_RS/man3p /usr/share/man/sr_RS/man3x /usr/share/man/sr_RS/man4 /usr/share/man/sr_RS/man4x /usr/share/man/sr_RS/man5 /usr/share/man/sr_RS/man5x /usr/share/man/sr_RS/man6 /usr/share/man/sr_RS/man6x /usr/share/man/sr_RS/man7 /usr/share/man/sr_RS/man7x /usr/share/man/sr_RS/man8 /usr/share/man/sr_RS/man8x /usr/share/man/sr_RS/man9 /usr/share/man/sr_RS/man9x /usr/share/man/sr_RS/mann /usr/share/man/ss /usr/share/man/ssa /usr/share/man/ssa/man0p /usr/share/man/ssa/man1 /usr/share/man/ssa/man1p /usr/share/man/ssa/man1x /usr/share/man/ssa/man2 /usr/share/man/ssa/man2x /usr/share/man/ssa/man3 /usr/share/man/ssa/man3p /usr/share/man/ssa/man3x /usr/share/man/ssa/man4 /usr/share/man/ssa/man4x /usr/share/man/ssa/man5 /usr/share/man/ssa/man5x /usr/share/man/ssa/man6 /usr/share/man/ssa/man6x /usr/share/man/ssa/man7 /usr/share/man/ssa/man7x /usr/share/man/ssa/man8 /usr/share/man/ssa/man8x /usr/share/man/ssa/man9 /usr/share/man/ssa/man9x /usr/share/man/ssa/mann /usr/share/man/ss/man0p /usr/share/man/ss/man1 /usr/share/man/ss/man1p /usr/share/man/ss/man1x /usr/share/man/ss/man2 /usr/share/man/ss/man2x /usr/share/man/ss/man3 /usr/share/man/ss/man3p /usr/share/man/ss/man3x /usr/share/man/ss/man4 /usr/share/man/ss/man4x /usr/share/man/ss/man5 /usr/share/man/ss/man5x /usr/share/man/ss/man6 /usr/share/man/ss/man6x /usr/share/man/ss/man7 /usr/share/man/ss/man7x /usr/share/man/ss/man8 /usr/share/man/ss/man8x /usr/share/man/ss/man9 /usr/share/man/ss/man9x /usr/share/man/ss/mann /usr/share/man/st /usr/share/man/st/man0p /usr/share/man/st/man1 /usr/share/man/st/man1p /usr/share/man/st/man1x /usr/share/man/st/man2 /usr/share/man/st/man2x /usr/share/man/st/man3 /usr/share/man/st/man3p /usr/share/man/st/man3x /usr/share/man/st/man4 /usr/share/man/st/man4x /usr/share/man/st/man5 /usr/share/man/st/man5x /usr/share/man/st/man6 /usr/share/man/st/man6x /usr/share/man/st/man7 /usr/share/man/st/man7x /usr/share/man/st/man8 /usr/share/man/st/man8x /usr/share/man/st/man9 /usr/share/man/st/man9x /usr/share/man/st/mann /usr/share/man/su /usr/share/man/suk /usr/share/man/suk/man0p /usr/share/man/suk/man1 /usr/share/man/suk/man1p /usr/share/man/suk/man1x /usr/share/man/suk/man2 /usr/share/man/suk/man2x /usr/share/man/suk/man3 /usr/share/man/suk/man3p /usr/share/man/suk/man3x /usr/share/man/suk/man4 /usr/share/man/suk/man4x /usr/share/man/suk/man5 /usr/share/man/suk/man5x /usr/share/man/suk/man6 /usr/share/man/suk/man6x /usr/share/man/suk/man7 /usr/share/man/suk/man7x /usr/share/man/suk/man8 /usr/share/man/suk/man8x /usr/share/man/suk/man9 /usr/share/man/suk/man9x /usr/share/man/suk/mann /usr/share/man/su/man0p /usr/share/man/su/man1 /usr/share/man/su/man1p /usr/share/man/su/man1x /usr/share/man/su/man2 /usr/share/man/su/man2x /usr/share/man/su/man3 /usr/share/man/su/man3p /usr/share/man/su/man3x /usr/share/man/su/man4 /usr/share/man/su/man4x /usr/share/man/su/man5 /usr/share/man/su/man5x /usr/share/man/su/man6 /usr/share/man/su/man6x /usr/share/man/su/man7 /usr/share/man/su/man7x /usr/share/man/su/man8 /usr/share/man/su/man8x /usr/share/man/su/man9 /usr/share/man/su/man9x /usr/share/man/su/mann /usr/share/man/sus /usr/share/man/sus/man0p /usr/share/man/sus/man1 /usr/share/man/sus/man1p /usr/share/man/sus/man1x /usr/share/man/sus/man2 /usr/share/man/sus/man2x /usr/share/man/sus/man3 /usr/share/man/sus/man3p /usr/share/man/sus/man3x /usr/share/man/sus/man4 /usr/share/man/sus/man4x /usr/share/man/sus/man5 /usr/share/man/sus/man5x /usr/share/man/sus/man6 /usr/share/man/sus/man6x /usr/share/man/sus/man7 /usr/share/man/sus/man7x /usr/share/man/sus/man8 /usr/share/man/sus/man8x /usr/share/man/sus/man9 /usr/share/man/sus/man9x /usr/share/man/sus/mann /usr/share/man/sux /usr/share/man/sux/man0p /usr/share/man/sux/man1 /usr/share/man/sux/man1p /usr/share/man/sux/man1x /usr/share/man/sux/man2 /usr/share/man/sux/man2x /usr/share/man/sux/man3 /usr/share/man/sux/man3p /usr/share/man/sux/man3x /usr/share/man/sux/man4 /usr/share/man/sux/man4x /usr/share/man/sux/man5 /usr/share/man/sux/man5x /usr/share/man/sux/man6 /usr/share/man/sux/man6x /usr/share/man/sux/man7 /usr/share/man/sux/man7x /usr/share/man/sux/man8 /usr/share/man/sux/man8x /usr/share/man/sux/man9 /usr/share/man/sux/man9x /usr/share/man/sux/mann /usr/share/man/sv /usr/share/man/sv/man0p /usr/share/man/sv/man1 /usr/share/man/sv/man1p /usr/share/man/sv/man1x /usr/share/man/sv/man2 /usr/share/man/sv/man2x /usr/share/man/sv/man3 /usr/share/man/sv/man3p /usr/share/man/sv/man3x /usr/share/man/sv/man4 /usr/share/man/sv/man4x /usr/share/man/sv/man5 /usr/share/man/sv/man5x /usr/share/man/sv/man6 /usr/share/man/sv/man6x /usr/share/man/sv/man7 /usr/share/man/sv/man7x /usr/share/man/sv/man8 /usr/share/man/sv/man8x /usr/share/man/sv/man9 /usr/share/man/sv/man9x /usr/share/man/sv/mann /usr/share/man/sv_SE /usr/share/man/sv_SE/man0p /usr/share/man/sv_SE/man1 /usr/share/man/sv_SE/man1p /usr/share/man/sv_SE/man1x /usr/share/man/sv_SE/man2 /usr/share/man/sv_SE/man2x /usr/share/man/sv_SE/man3 /usr/share/man/sv_SE/man3p /usr/share/man/sv_SE/man3x /usr/share/man/sv_SE/man4 /usr/share/man/sv_SE/man4x /usr/share/man/sv_SE/man5 /usr/share/man/sv_SE/man5x /usr/share/man/sv_SE/man6 /usr/share/man/sv_SE/man6x /usr/share/man/sv_SE/man7 /usr/share/man/sv_SE/man7x /usr/share/man/sv_SE/man8 /usr/share/man/sv_SE/man8x /usr/share/man/sv_SE/man9 /usr/share/man/sv_SE/man9x /usr/share/man/sv_SE/mann /usr/share/man/sw /usr/share/man/sw/man0p /usr/share/man/sw/man1 /usr/share/man/sw/man1p /usr/share/man/sw/man1x /usr/share/man/sw/man2 /usr/share/man/sw/man2x /usr/share/man/sw/man3 /usr/share/man/sw/man3p /usr/share/man/sw/man3x /usr/share/man/sw/man4 /usr/share/man/sw/man4x /usr/share/man/sw/man5 /usr/share/man/sw/man5x /usr/share/man/sw/man6 /usr/share/man/sw/man6x /usr/share/man/sw/man7 /usr/share/man/sw/man7x /usr/share/man/sw/man8 /usr/share/man/sw/man8x /usr/share/man/sw/man9 /usr/share/man/sw/man9x /usr/share/man/sw/mann /usr/share/man/syc /usr/share/man/syc/man0p /usr/share/man/syc/man1 /usr/share/man/syc/man1p /usr/share/man/syc/man1x /usr/share/man/syc/man2 /usr/share/man/syc/man2x /usr/share/man/syc/man3 /usr/share/man/syc/man3p /usr/share/man/syc/man3x /usr/share/man/syc/man4 /usr/share/man/syc/man4x /usr/share/man/syc/man5 /usr/share/man/syc/man5x /usr/share/man/syc/man6 /usr/share/man/syc/man6x /usr/share/man/syc/man7 /usr/share/man/syc/man7x /usr/share/man/syc/man8 /usr/share/man/syc/man8x /usr/share/man/syc/man9 /usr/share/man/syc/man9x /usr/share/man/syc/mann /usr/share/man/syr /usr/share/man/syr/man0p /usr/share/man/syr/man1 /usr/share/man/syr/man1p /usr/share/man/syr/man1x /usr/share/man/syr/man2 /usr/share/man/syr/man2x /usr/share/man/syr/man3 /usr/share/man/syr/man3p /usr/share/man/syr/man3x /usr/share/man/syr/man4 /usr/share/man/syr/man4x /usr/share/man/syr/man5 /usr/share/man/syr/man5x /usr/share/man/syr/man6 /usr/share/man/syr/man6x /usr/share/man/syr/man7 /usr/share/man/syr/man7x /usr/share/man/syr/man8 /usr/share/man/syr/man8x /usr/share/man/syr/man9 /usr/share/man/syr/man9x /usr/share/man/syr/mann /usr/share/man/ta /usr/share/man/tai /usr/share/man/tai/man0p /usr/share/man/tai/man1 /usr/share/man/tai/man1p /usr/share/man/tai/man1x /usr/share/man/tai/man2 /usr/share/man/tai/man2x /usr/share/man/tai/man3 /usr/share/man/tai/man3p /usr/share/man/tai/man3x /usr/share/man/tai/man4 /usr/share/man/tai/man4x /usr/share/man/tai/man5 /usr/share/man/tai/man5x /usr/share/man/tai/man6 /usr/share/man/tai/man6x /usr/share/man/tai/man7 /usr/share/man/tai/man7x /usr/share/man/tai/man8 /usr/share/man/tai/man8x /usr/share/man/tai/man9 /usr/share/man/tai/man9x /usr/share/man/tai/mann /usr/share/man/ta/man0p /usr/share/man/ta/man1 /usr/share/man/ta/man1p /usr/share/man/ta/man1x /usr/share/man/ta/man2 /usr/share/man/ta/man2x /usr/share/man/ta/man3 /usr/share/man/ta/man3p /usr/share/man/ta/man3x /usr/share/man/ta/man4 /usr/share/man/ta/man4x /usr/share/man/ta/man5 /usr/share/man/ta/man5x /usr/share/man/ta/man6 /usr/share/man/ta/man6x /usr/share/man/ta/man7 /usr/share/man/ta/man7x /usr/share/man/ta/man8 /usr/share/man/ta/man8x /usr/share/man/ta/man9 /usr/share/man/ta/man9x /usr/share/man/ta/mann /usr/share/man/te /usr/share/man/tem /usr/share/man/te/man0p /usr/share/man/te/man1 /usr/share/man/te/man1p /usr/share/man/te/man1x /usr/share/man/te/man2 /usr/share/man/te/man2x /usr/share/man/te/man3 /usr/share/man/te/man3p /usr/share/man/te/man3x /usr/share/man/te/man4 /usr/share/man/te/man4x /usr/share/man/te/man5 /usr/share/man/te/man5x /usr/share/man/te/man6 /usr/share/man/te/man6x /usr/share/man/te/man7 /usr/share/man/te/man7x /usr/share/man/te/man8 /usr/share/man/te/man8x /usr/share/man/te/man9 /usr/share/man/te/man9x /usr/share/man/te/mann /usr/share/man/tem/man0p /usr/share/man/tem/man1 /usr/share/man/tem/man1p /usr/share/man/tem/man1x /usr/share/man/tem/man2 /usr/share/man/tem/man2x /usr/share/man/tem/man3 /usr/share/man/tem/man3p /usr/share/man/tem/man3x /usr/share/man/tem/man4 /usr/share/man/tem/man4x /usr/share/man/tem/man5 /usr/share/man/tem/man5x /usr/share/man/tem/man6 /usr/share/man/tem/man6x /usr/share/man/tem/man7 /usr/share/man/tem/man7x /usr/share/man/tem/man8 /usr/share/man/tem/man8x /usr/share/man/tem/man9 /usr/share/man/tem/man9x /usr/share/man/tem/mann /usr/share/man/ter /usr/share/man/ter/man0p /usr/share/man/ter/man1 /usr/share/man/ter/man1p /usr/share/man/ter/man1x /usr/share/man/ter/man2 /usr/share/man/ter/man2x /usr/share/man/ter/man3 /usr/share/man/ter/man3p /usr/share/man/ter/man3x /usr/share/man/ter/man4 /usr/share/man/ter/man4x /usr/share/man/ter/man5 /usr/share/man/ter/man5x /usr/share/man/ter/man6 /usr/share/man/ter/man6x /usr/share/man/ter/man7 /usr/share/man/ter/man7x /usr/share/man/ter/man8 /usr/share/man/ter/man8x /usr/share/man/ter/man9 /usr/share/man/ter/man9x /usr/share/man/ter/mann /usr/share/man/tet /usr/share/man/tet/man0p /usr/share/man/tet/man1 /usr/share/man/tet/man1p /usr/share/man/tet/man1x /usr/share/man/tet/man2 /usr/share/man/tet/man2x /usr/share/man/tet/man3 /usr/share/man/tet/man3p /usr/share/man/tet/man3x /usr/share/man/tet/man4 /usr/share/man/tet/man4x /usr/share/man/tet/man5 /usr/share/man/tet/man5x /usr/share/man/tet/man6 /usr/share/man/tet/man6x /usr/share/man/tet/man7 /usr/share/man/tet/man7x /usr/share/man/tet/man8 /usr/share/man/tet/man8x /usr/share/man/tet/man9 /usr/share/man/tet/man9x /usr/share/man/tet/mann /usr/share/man/tg /usr/share/man/tg/man0p /usr/share/man/tg/man1 /usr/share/man/tg/man1p /usr/share/man/tg/man1x /usr/share/man/tg/man2 /usr/share/man/tg/man2x /usr/share/man/tg/man3 /usr/share/man/tg/man3p /usr/share/man/tg/man3x /usr/share/man/tg/man4 /usr/share/man/tg/man4x /usr/share/man/tg/man5 /usr/share/man/tg/man5x /usr/share/man/tg/man6 /usr/share/man/tg/man6x /usr/share/man/tg/man7 /usr/share/man/tg/man7x /usr/share/man/tg/man8 /usr/share/man/tg/man8x /usr/share/man/tg/man9 /usr/share/man/tg/man9x /usr/share/man/tg/mann /usr/share/man/th /usr/share/man/th/man0p /usr/share/man/th/man1 /usr/share/man/th/man1p /usr/share/man/th/man1x /usr/share/man/th/man2 /usr/share/man/th/man2x /usr/share/man/th/man3 /usr/share/man/th/man3p /usr/share/man/th/man3x /usr/share/man/th/man4 /usr/share/man/th/man4x /usr/share/man/th/man5 /usr/share/man/th/man5x /usr/share/man/th/man6 /usr/share/man/th/man6x /usr/share/man/th/man7 /usr/share/man/th/man7x /usr/share/man/th/man8 /usr/share/man/th/man8x /usr/share/man/th/man9 /usr/share/man/th/man9x /usr/share/man/th/mann /usr/share/man/ti /usr/share/man/tig /usr/share/man/tig/man0p /usr/share/man/tig/man1 /usr/share/man/tig/man1p /usr/share/man/tig/man1x /usr/share/man/tig/man2 /usr/share/man/tig/man2x /usr/share/man/tig/man3 /usr/share/man/tig/man3p /usr/share/man/tig/man3x /usr/share/man/tig/man4 /usr/share/man/tig/man4x /usr/share/man/tig/man5 /usr/share/man/tig/man5x /usr/share/man/tig/man6 /usr/share/man/tig/man6x /usr/share/man/tig/man7 /usr/share/man/tig/man7x /usr/share/man/tig/man8 /usr/share/man/tig/man8x /usr/share/man/tig/man9 /usr/share/man/tig/man9x /usr/share/man/tig/mann /usr/share/man/ti/man0p /usr/share/man/ti/man1 /usr/share/man/ti/man1p /usr/share/man/ti/man1x /usr/share/man/ti/man2 /usr/share/man/ti/man2x /usr/share/man/ti/man3 /usr/share/man/ti/man3p /usr/share/man/ti/man3x /usr/share/man/ti/man4 /usr/share/man/ti/man4x /usr/share/man/ti/man5 /usr/share/man/ti/man5x /usr/share/man/ti/man6 /usr/share/man/ti/man6x /usr/share/man/ti/man7 /usr/share/man/ti/man7x /usr/share/man/ti/man8 /usr/share/man/ti/man8x /usr/share/man/ti/man9 /usr/share/man/ti/man9x /usr/share/man/ti/mann /usr/share/man/tiv /usr/share/man/tiv/man0p /usr/share/man/tiv/man1 /usr/share/man/tiv/man1p /usr/share/man/tiv/man1x /usr/share/man/tiv/man2 /usr/share/man/tiv/man2x /usr/share/man/tiv/man3 /usr/share/man/tiv/man3p /usr/share/man/tiv/man3x /usr/share/man/tiv/man4 /usr/share/man/tiv/man4x /usr/share/man/tiv/man5 /usr/share/man/tiv/man5x /usr/share/man/tiv/man6 /usr/share/man/tiv/man6x /usr/share/man/tiv/man7 /usr/share/man/tiv/man7x /usr/share/man/tiv/man8 /usr/share/man/tiv/man8x /usr/share/man/tiv/man9 /usr/share/man/tiv/man9x /usr/share/man/tiv/mann /usr/share/man/tk /usr/share/man/tkl /usr/share/man/tkl/man0p /usr/share/man/tkl/man1 /usr/share/man/tkl/man1p /usr/share/man/tkl/man1x /usr/share/man/tkl/man2 /usr/share/man/tkl/man2x /usr/share/man/tkl/man3 /usr/share/man/tkl/man3p /usr/share/man/tkl/man3x /usr/share/man/tkl/man4 /usr/share/man/tkl/man4x /usr/share/man/tkl/man5 /usr/share/man/tkl/man5x /usr/share/man/tkl/man6 /usr/share/man/tkl/man6x /usr/share/man/tkl/man7 /usr/share/man/tkl/man7x /usr/share/man/tkl/man8 /usr/share/man/tkl/man8x /usr/share/man/tkl/man9 /usr/share/man/tkl/man9x /usr/share/man/tkl/mann /usr/share/man/tk/man0p /usr/share/man/tk/man1 /usr/share/man/tk/man1p /usr/share/man/tk/man1x /usr/share/man/tk/man2 /usr/share/man/tk/man2x /usr/share/man/tk/man3 /usr/share/man/tk/man3p /usr/share/man/tk/man3x /usr/share/man/tk/man4 /usr/share/man/tk/man4x /usr/share/man/tk/man5 /usr/share/man/tk/man5x /usr/share/man/tk/man6 /usr/share/man/tk/man6x /usr/share/man/tk/man7 /usr/share/man/tk/man7x /usr/share/man/tk/man8 /usr/share/man/tk/man8x /usr/share/man/tk/man9 /usr/share/man/tk/man9x /usr/share/man/tk/mann /usr/share/man/tl /usr/share/man/tlh /usr/share/man/tlh/man0p /usr/share/man/tlh/man1 /usr/share/man/tlh/man1p /usr/share/man/tlh/man1x /usr/share/man/tlh/man2 /usr/share/man/tlh/man2x /usr/share/man/tlh/man3 /usr/share/man/tlh/man3p /usr/share/man/tlh/man3x /usr/share/man/tlh/man4 /usr/share/man/tlh/man4x /usr/share/man/tlh/man5 /usr/share/man/tlh/man5x /usr/share/man/tlh/man6 /usr/share/man/tlh/man6x /usr/share/man/tlh/man7 /usr/share/man/tlh/man7x /usr/share/man/tlh/man8 /usr/share/man/tlh/man8x /usr/share/man/tlh/man9 /usr/share/man/tlh/man9x /usr/share/man/tlh/mann /usr/share/man/tli /usr/share/man/tli/man0p /usr/share/man/tli/man1 /usr/share/man/tli/man1p /usr/share/man/tli/man1x /usr/share/man/tli/man2 /usr/share/man/tli/man2x /usr/share/man/tli/man3 /usr/share/man/tli/man3p /usr/share/man/tli/man3x /usr/share/man/tli/man4 /usr/share/man/tli/man4x /usr/share/man/tli/man5 /usr/share/man/tli/man5x /usr/share/man/tli/man6 /usr/share/man/tli/man6x /usr/share/man/tli/man7 /usr/share/man/tli/man7x /usr/share/man/tli/man8 /usr/share/man/tli/man8x /usr/share/man/tli/man9 /usr/share/man/tli/man9x /usr/share/man/tli/mann /usr/share/man/tl/man0p /usr/share/man/tl/man1 /usr/share/man/tl/man1p /usr/share/man/tl/man1x /usr/share/man/tl/man2 /usr/share/man/tl/man2x /usr/share/man/tl/man3 /usr/share/man/tl/man3p /usr/share/man/tl/man3x /usr/share/man/tl/man4 /usr/share/man/tl/man4x /usr/share/man/tl/man5 /usr/share/man/tl/man5x /usr/share/man/tl/man6 /usr/share/man/tl/man6x /usr/share/man/tl/man7 /usr/share/man/tl/man7x /usr/share/man/tl/man8 /usr/share/man/tl/man8x /usr/share/man/tl/man9 /usr/share/man/tl/man9x /usr/share/man/tl/mann /usr/share/man/tmh /usr/share/man/tmh/man0p /usr/share/man/tmh/man1 /usr/share/man/tmh/man1p /usr/share/man/tmh/man1x /usr/share/man/tmh/man2 /usr/share/man/tmh/man2x /usr/share/man/tmh/man3 /usr/share/man/tmh/man3p /usr/share/man/tmh/man3x /usr/share/man/tmh/man4 /usr/share/man/tmh/man4x /usr/share/man/tmh/man5 /usr/share/man/tmh/man5x /usr/share/man/tmh/man6 /usr/share/man/tmh/man6x /usr/share/man/tmh/man7 /usr/share/man/tmh/man7x /usr/share/man/tmh/man8 /usr/share/man/tmh/man8x /usr/share/man/tmh/man9 /usr/share/man/tmh/man9x /usr/share/man/tmh/mann /usr/share/man/tn /usr/share/man/tn/man0p /usr/share/man/tn/man1 /usr/share/man/tn/man1p /usr/share/man/tn/man1x /usr/share/man/tn/man2 /usr/share/man/tn/man2x /usr/share/man/tn/man3 /usr/share/man/tn/man3p /usr/share/man/tn/man3x /usr/share/man/tn/man4 /usr/share/man/tn/man4x /usr/share/man/tn/man5 /usr/share/man/tn/man5x /usr/share/man/tn/man6 /usr/share/man/tn/man6x /usr/share/man/tn/man7 /usr/share/man/tn/man7x /usr/share/man/tn/man8 /usr/share/man/tn/man8x /usr/share/man/tn/man9 /usr/share/man/tn/man9x /usr/share/man/tn/mann /usr/share/man/to /usr/share/man/tog /usr/share/man/tog/man0p /usr/share/man/tog/man1 /usr/share/man/tog/man1p /usr/share/man/tog/man1x /usr/share/man/tog/man2 /usr/share/man/tog/man2x /usr/share/man/tog/man3 /usr/share/man/tog/man3p /usr/share/man/tog/man3x /usr/share/man/tog/man4 /usr/share/man/tog/man4x /usr/share/man/tog/man5 /usr/share/man/tog/man5x /usr/share/man/tog/man6 /usr/share/man/tog/man6x /usr/share/man/tog/man7 /usr/share/man/tog/man7x /usr/share/man/tog/man8 /usr/share/man/tog/man8x /usr/share/man/tog/man9 /usr/share/man/tog/man9x /usr/share/man/tog/mann /usr/share/man/to/man0p /usr/share/man/to/man1 /usr/share/man/to/man1p /usr/share/man/to/man1x /usr/share/man/to/man2 /usr/share/man/to/man2x /usr/share/man/to/man3 /usr/share/man/to/man3p /usr/share/man/to/man3x /usr/share/man/to/man4 /usr/share/man/to/man4x /usr/share/man/to/man5 /usr/share/man/to/man5x /usr/share/man/to/man6 /usr/share/man/to/man6x /usr/share/man/to/man7 /usr/share/man/to/man7x /usr/share/man/to/man8 /usr/share/man/to/man8x /usr/share/man/to/man9 /usr/share/man/to/man9x /usr/share/man/to/mann /usr/share/man/tpi /usr/share/man/tpi/man0p /usr/share/man/tpi/man1 /usr/share/man/tpi/man1p /usr/share/man/tpi/man1x /usr/share/man/tpi/man2 /usr/share/man/tpi/man2x /usr/share/man/tpi/man3 /usr/share/man/tpi/man3p /usr/share/man/tpi/man3x /usr/share/man/tpi/man4 /usr/share/man/tpi/man4x /usr/share/man/tpi/man5 /usr/share/man/tpi/man5x /usr/share/man/tpi/man6 /usr/share/man/tpi/man6x /usr/share/man/tpi/man7 /usr/share/man/tpi/man7x /usr/share/man/tpi/man8 /usr/share/man/tpi/man8x /usr/share/man/tpi/man9 /usr/share/man/tpi/man9x /usr/share/man/tpi/mann /usr/share/man/tr /usr/share/man/tr/man0p /usr/share/man/tr/man1 /usr/share/man/tr/man1p /usr/share/man/tr/man1x /usr/share/man/tr/man2 /usr/share/man/tr/man2x /usr/share/man/tr/man3 /usr/share/man/tr/man3p /usr/share/man/tr/man3x /usr/share/man/tr/man4 /usr/share/man/tr/man4x /usr/share/man/tr/man5 /usr/share/man/tr/man5x /usr/share/man/tr/man6 /usr/share/man/tr/man6x /usr/share/man/tr/man7 /usr/share/man/tr/man7x /usr/share/man/tr/man8 /usr/share/man/tr/man8x /usr/share/man/tr/man9 /usr/share/man/tr/man9x /usr/share/man/tr/mann /usr/share/man/ts /usr/share/man/tsi /usr/share/man/tsi/man0p /usr/share/man/tsi/man1 /usr/share/man/tsi/man1p /usr/share/man/tsi/man1x /usr/share/man/tsi/man2 /usr/share/man/tsi/man2x /usr/share/man/tsi/man3 /usr/share/man/tsi/man3p /usr/share/man/tsi/man3x /usr/share/man/tsi/man4 /usr/share/man/tsi/man4x /usr/share/man/tsi/man5 /usr/share/man/tsi/man5x /usr/share/man/tsi/man6 /usr/share/man/tsi/man6x /usr/share/man/tsi/man7 /usr/share/man/tsi/man7x /usr/share/man/tsi/man8 /usr/share/man/tsi/man8x /usr/share/man/tsi/man9 /usr/share/man/tsi/man9x /usr/share/man/tsi/mann /usr/share/man/ts/man0p /usr/share/man/ts/man1 /usr/share/man/ts/man1p /usr/share/man/ts/man1x /usr/share/man/ts/man2 /usr/share/man/ts/man2x /usr/share/man/ts/man3 /usr/share/man/ts/man3p /usr/share/man/ts/man3x /usr/share/man/ts/man4 /usr/share/man/ts/man4x /usr/share/man/ts/man5 /usr/share/man/ts/man5x /usr/share/man/ts/man6 /usr/share/man/ts/man6x /usr/share/man/ts/man7 /usr/share/man/ts/man7x /usr/share/man/ts/man8 /usr/share/man/ts/man8x /usr/share/man/ts/man9 /usr/share/man/ts/man9x /usr/share/man/ts/mann /usr/share/man/tt /usr/share/man/tt/man0p /usr/share/man/tt/man1 /usr/share/man/tt/man1p /usr/share/man/tt/man1x /usr/share/man/tt/man2 /usr/share/man/tt/man2x /usr/share/man/tt/man3 /usr/share/man/tt/man3p /usr/share/man/tt/man3x /usr/share/man/tt/man4 /usr/share/man/tt/man4x /usr/share/man/tt/man5 /usr/share/man/tt/man5x /usr/share/man/tt/man6 /usr/share/man/tt/man6x /usr/share/man/tt/man7 /usr/share/man/tt/man7x /usr/share/man/tt/man8 /usr/share/man/tt/man8x /usr/share/man/tt/man9 /usr/share/man/tt/man9x /usr/share/man/tt/mann /usr/share/man/tum /usr/share/man/tum/man0p /usr/share/man/tum/man1 /usr/share/man/tum/man1p /usr/share/man/tum/man1x /usr/share/man/tum/man2 /usr/share/man/tum/man2x /usr/share/man/tum/man3 /usr/share/man/tum/man3p /usr/share/man/tum/man3x /usr/share/man/tum/man4 /usr/share/man/tum/man4x /usr/share/man/tum/man5 /usr/share/man/tum/man5x /usr/share/man/tum/man6 /usr/share/man/tum/man6x /usr/share/man/tum/man7 /usr/share/man/tum/man7x /usr/share/man/tum/man8 /usr/share/man/tum/man8x /usr/share/man/tum/man9 /usr/share/man/tum/man9x /usr/share/man/tum/mann /usr/share/man/tup /usr/share/man/tup/man0p /usr/share/man/tup/man1 /usr/share/man/tup/man1p /usr/share/man/tup/man1x /usr/share/man/tup/man2 /usr/share/man/tup/man2x /usr/share/man/tup/man3 /usr/share/man/tup/man3p /usr/share/man/tup/man3x /usr/share/man/tup/man4 /usr/share/man/tup/man4x /usr/share/man/tup/man5 /usr/share/man/tup/man5x /usr/share/man/tup/man6 /usr/share/man/tup/man6x /usr/share/man/tup/man7 /usr/share/man/tup/man7x /usr/share/man/tup/man8 /usr/share/man/tup/man8x /usr/share/man/tup/man9 /usr/share/man/tup/man9x /usr/share/man/tup/mann /usr/share/man/tut /usr/share/man/tut/man0p /usr/share/man/tut/man1 /usr/share/man/tut/man1p /usr/share/man/tut/man1x /usr/share/man/tut/man2 /usr/share/man/tut/man2x /usr/share/man/tut/man3 /usr/share/man/tut/man3p /usr/share/man/tut/man3x /usr/share/man/tut/man4 /usr/share/man/tut/man4x /usr/share/man/tut/man5 /usr/share/man/tut/man5x /usr/share/man/tut/man6 /usr/share/man/tut/man6x /usr/share/man/tut/man7 /usr/share/man/tut/man7x /usr/share/man/tut/man8 /usr/share/man/tut/man8x /usr/share/man/tut/man9 /usr/share/man/tut/man9x /usr/share/man/tut/mann /usr/share/man/tvl /usr/share/man/tvl/man0p /usr/share/man/tvl/man1 /usr/share/man/tvl/man1p /usr/share/man/tvl/man1x /usr/share/man/tvl/man2 /usr/share/man/tvl/man2x /usr/share/man/tvl/man3 /usr/share/man/tvl/man3p /usr/share/man/tvl/man3x /usr/share/man/tvl/man4 /usr/share/man/tvl/man4x /usr/share/man/tvl/man5 /usr/share/man/tvl/man5x /usr/share/man/tvl/man6 /usr/share/man/tvl/man6x /usr/share/man/tvl/man7 /usr/share/man/tvl/man7x /usr/share/man/tvl/man8 /usr/share/man/tvl/man8x /usr/share/man/tvl/man9 /usr/share/man/tvl/man9x /usr/share/man/tvl/mann /usr/share/man/tw /usr/share/man/tw/man0p /usr/share/man/tw/man1 /usr/share/man/tw/man1p /usr/share/man/tw/man1x /usr/share/man/tw/man2 /usr/share/man/tw/man2x /usr/share/man/tw/man3 /usr/share/man/tw/man3p /usr/share/man/tw/man3x /usr/share/man/tw/man4 /usr/share/man/tw/man4x /usr/share/man/tw/man5 /usr/share/man/tw/man5x /usr/share/man/tw/man6 /usr/share/man/tw/man6x /usr/share/man/tw/man7 /usr/share/man/tw/man7x /usr/share/man/tw/man8 /usr/share/man/tw/man8x /usr/share/man/tw/man9 /usr/share/man/tw/man9x /usr/share/man/tw/mann /usr/share/man/ty /usr/share/man/ty/man0p /usr/share/man/ty/man1 /usr/share/man/ty/man1p /usr/share/man/ty/man1x /usr/share/man/ty/man2 /usr/share/man/ty/man2x /usr/share/man/ty/man3 /usr/share/man/ty/man3p /usr/share/man/ty/man3x /usr/share/man/ty/man4 /usr/share/man/ty/man4x /usr/share/man/ty/man5 /usr/share/man/ty/man5x /usr/share/man/ty/man6 /usr/share/man/ty/man6x /usr/share/man/ty/man7 /usr/share/man/ty/man7x /usr/share/man/ty/man8 /usr/share/man/ty/man8x /usr/share/man/ty/man9 /usr/share/man/ty/man9x /usr/share/man/ty/mann /usr/share/man/tyv /usr/share/man/tyv/man0p /usr/share/man/tyv/man1 /usr/share/man/tyv/man1p /usr/share/man/tyv/man1x /usr/share/man/tyv/man2 /usr/share/man/tyv/man2x /usr/share/man/tyv/man3 /usr/share/man/tyv/man3p /usr/share/man/tyv/man3x /usr/share/man/tyv/man4 /usr/share/man/tyv/man4x /usr/share/man/tyv/man5 /usr/share/man/tyv/man5x /usr/share/man/tyv/man6 /usr/share/man/tyv/man6x /usr/share/man/tyv/man7 /usr/share/man/tyv/man7x /usr/share/man/tyv/man8 /usr/share/man/tyv/man8x /usr/share/man/tyv/man9 /usr/share/man/tyv/man9x /usr/share/man/tyv/mann /usr/share/man/udm /usr/share/man/udm/man0p /usr/share/man/udm/man1 /usr/share/man/udm/man1p /usr/share/man/udm/man1x /usr/share/man/udm/man2 /usr/share/man/udm/man2x /usr/share/man/udm/man3 /usr/share/man/udm/man3p /usr/share/man/udm/man3x /usr/share/man/udm/man4 /usr/share/man/udm/man4x /usr/share/man/udm/man5 /usr/share/man/udm/man5x /usr/share/man/udm/man6 /usr/share/man/udm/man6x /usr/share/man/udm/man7 /usr/share/man/udm/man7x /usr/share/man/udm/man8 /usr/share/man/udm/man8x /usr/share/man/udm/man9 /usr/share/man/udm/man9x /usr/share/man/udm/mann /usr/share/man/ug /usr/share/man/uga /usr/share/man/uga/man0p /usr/share/man/uga/man1 /usr/share/man/uga/man1p /usr/share/man/uga/man1x /usr/share/man/uga/man2 /usr/share/man/uga/man2x /usr/share/man/uga/man3 /usr/share/man/uga/man3p /usr/share/man/uga/man3x /usr/share/man/uga/man4 /usr/share/man/uga/man4x /usr/share/man/uga/man5 /usr/share/man/uga/man5x /usr/share/man/uga/man6 /usr/share/man/uga/man6x /usr/share/man/uga/man7 /usr/share/man/uga/man7x /usr/share/man/uga/man8 /usr/share/man/uga/man8x /usr/share/man/uga/man9 /usr/share/man/uga/man9x /usr/share/man/uga/mann /usr/share/man/ug/man0p /usr/share/man/ug/man1 /usr/share/man/ug/man1p /usr/share/man/ug/man1x /usr/share/man/ug/man2 /usr/share/man/ug/man2x /usr/share/man/ug/man3 /usr/share/man/ug/man3p /usr/share/man/ug/man3x /usr/share/man/ug/man4 /usr/share/man/ug/man4x /usr/share/man/ug/man5 /usr/share/man/ug/man5x /usr/share/man/ug/man6 /usr/share/man/ug/man6x /usr/share/man/ug/man7 /usr/share/man/ug/man7x /usr/share/man/ug/man8 /usr/share/man/ug/man8x /usr/share/man/ug/man9 /usr/share/man/ug/man9x /usr/share/man/ug/mann /usr/share/man/uk /usr/share/man/uk/man0p /usr/share/man/uk/man1 /usr/share/man/uk/man1p /usr/share/man/uk/man1x /usr/share/man/uk/man2 /usr/share/man/uk/man2x /usr/share/man/uk/man3 /usr/share/man/uk/man3p /usr/share/man/uk/man3x /usr/share/man/uk/man4 /usr/share/man/uk/man4x /usr/share/man/uk/man5 /usr/share/man/uk/man5x /usr/share/man/uk/man6 /usr/share/man/uk/man6x /usr/share/man/uk/man7 /usr/share/man/uk/man7x /usr/share/man/uk/man8 /usr/share/man/uk/man8x /usr/share/man/uk/man9 /usr/share/man/uk/man9x /usr/share/man/uk/mann /usr/share/man/uk_UA /usr/share/man/uk_UA/man0p /usr/share/man/uk_UA/man1 /usr/share/man/uk_UA/man1p /usr/share/man/uk_UA/man1x /usr/share/man/uk_UA/man2 /usr/share/man/uk_UA/man2x /usr/share/man/uk_UA/man3 /usr/share/man/uk_UA/man3p /usr/share/man/uk_UA/man3x /usr/share/man/uk_UA/man4 /usr/share/man/uk_UA/man4x /usr/share/man/uk_UA/man5 /usr/share/man/uk_UA/man5x /usr/share/man/uk_UA/man6 /usr/share/man/uk_UA/man6x /usr/share/man/uk_UA/man7 /usr/share/man/uk_UA/man7x /usr/share/man/uk_UA/man8 /usr/share/man/uk_UA/man8x /usr/share/man/uk_UA/man9 /usr/share/man/uk_UA/man9x /usr/share/man/uk_UA/mann /usr/share/man/umb /usr/share/man/umb/man0p /usr/share/man/umb/man1 /usr/share/man/umb/man1p /usr/share/man/umb/man1x /usr/share/man/umb/man2 /usr/share/man/umb/man2x /usr/share/man/umb/man3 /usr/share/man/umb/man3p /usr/share/man/umb/man3x /usr/share/man/umb/man4 /usr/share/man/umb/man4x /usr/share/man/umb/man5 /usr/share/man/umb/man5x /usr/share/man/umb/man6 /usr/share/man/umb/man6x /usr/share/man/umb/man7 /usr/share/man/umb/man7x /usr/share/man/umb/man8 /usr/share/man/umb/man8x /usr/share/man/umb/man9 /usr/share/man/umb/man9x /usr/share/man/umb/mann /usr/share/man/und /usr/share/man/und/man0p /usr/share/man/und/man1 /usr/share/man/und/man1p /usr/share/man/und/man1x /usr/share/man/und/man2 /usr/share/man/und/man2x /usr/share/man/und/man3 /usr/share/man/und/man3p /usr/share/man/und/man3x /usr/share/man/und/man4 /usr/share/man/und/man4x /usr/share/man/und/man5 /usr/share/man/und/man5x /usr/share/man/und/man6 /usr/share/man/und/man6x /usr/share/man/und/man7 /usr/share/man/und/man7x /usr/share/man/und/man8 /usr/share/man/und/man8x /usr/share/man/und/man9 /usr/share/man/und/man9x /usr/share/man/und/mann /usr/share/man/ur /usr/share/man/ur/man0p /usr/share/man/ur/man1 /usr/share/man/ur/man1p /usr/share/man/ur/man1x /usr/share/man/ur/man2 /usr/share/man/ur/man2x /usr/share/man/ur/man3 /usr/share/man/ur/man3p /usr/share/man/ur/man3x /usr/share/man/ur/man4 /usr/share/man/ur/man4x /usr/share/man/ur/man5 /usr/share/man/ur/man5x /usr/share/man/ur/man6 /usr/share/man/ur/man6x /usr/share/man/ur/man7 /usr/share/man/ur/man7x /usr/share/man/ur/man8 /usr/share/man/ur/man8x /usr/share/man/ur/man9 /usr/share/man/ur/man9x /usr/share/man/ur/mann /usr/share/man/ur_PK /usr/share/man/ur_PK/man0p /usr/share/man/ur_PK/man1 /usr/share/man/ur_PK/man1p /usr/share/man/ur_PK/man1x /usr/share/man/ur_PK/man2 /usr/share/man/ur_PK/man2x /usr/share/man/ur_PK/man3 /usr/share/man/ur_PK/man3p /usr/share/man/ur_PK/man3x /usr/share/man/ur_PK/man4 /usr/share/man/ur_PK/man4x /usr/share/man/ur_PK/man5 /usr/share/man/ur_PK/man5x /usr/share/man/ur_PK/man6 /usr/share/man/ur_PK/man6x /usr/share/man/ur_PK/man7 /usr/share/man/ur_PK/man7x /usr/share/man/ur_PK/man8 /usr/share/man/ur_PK/man8x /usr/share/man/ur_PK/man9 /usr/share/man/ur_PK/man9x /usr/share/man/ur_PK/mann /usr/share/man/uz /usr/share/man/uz@cyrillic /usr/share/man/uz@cyrillic/man0p /usr/share/man/uz@cyrillic/man1 /usr/share/man/uz@cyrillic/man1p /usr/share/man/uz@cyrillic/man1x /usr/share/man/uz@cyrillic/man2 /usr/share/man/uz@cyrillic/man2x /usr/share/man/uz@cyrillic/man3 /usr/share/man/uz@cyrillic/man3p /usr/share/man/uz@cyrillic/man3x /usr/share/man/uz@cyrillic/man4 /usr/share/man/uz@cyrillic/man4x /usr/share/man/uz@cyrillic/man5 /usr/share/man/uz@cyrillic/man5x /usr/share/man/uz@cyrillic/man6 /usr/share/man/uz@cyrillic/man6x /usr/share/man/uz@cyrillic/man7 /usr/share/man/uz@cyrillic/man7x /usr/share/man/uz@cyrillic/man8 /usr/share/man/uz@cyrillic/man8x /usr/share/man/uz@cyrillic/man9 /usr/share/man/uz@cyrillic/man9x /usr/share/man/uz@cyrillic/mann /usr/share/man/uz@Latn /usr/share/man/uz@Latn/man0p /usr/share/man/uz@Latn/man1 /usr/share/man/uz@Latn/man1p /usr/share/man/uz@Latn/man1x /usr/share/man/uz@Latn/man2 /usr/share/man/uz@Latn/man2x /usr/share/man/uz@Latn/man3 /usr/share/man/uz@Latn/man3p /usr/share/man/uz@Latn/man3x /usr/share/man/uz@Latn/man4 /usr/share/man/uz@Latn/man4x /usr/share/man/uz@Latn/man5 /usr/share/man/uz@Latn/man5x /usr/share/man/uz@Latn/man6 /usr/share/man/uz@Latn/man6x /usr/share/man/uz@Latn/man7 /usr/share/man/uz@Latn/man7x /usr/share/man/uz@Latn/man8 /usr/share/man/uz@Latn/man8x /usr/share/man/uz@Latn/man9 /usr/share/man/uz@Latn/man9x /usr/share/man/uz@Latn/mann /usr/share/man/uz/man0p /usr/share/man/uz/man1 /usr/share/man/uz/man1p /usr/share/man/uz/man1x /usr/share/man/uz/man2 /usr/share/man/uz/man2x /usr/share/man/uz/man3 /usr/share/man/uz/man3p /usr/share/man/uz/man3x /usr/share/man/uz/man4 /usr/share/man/uz/man4x /usr/share/man/uz/man5 /usr/share/man/uz/man5x /usr/share/man/uz/man6 /usr/share/man/uz/man6x /usr/share/man/uz/man7 /usr/share/man/uz/man7x /usr/share/man/uz/man8 /usr/share/man/uz/man8x /usr/share/man/uz/man9 /usr/share/man/uz/man9x /usr/share/man/uz/mann /usr/share/man/vai /usr/share/man/vai/man0p /usr/share/man/vai/man1 /usr/share/man/vai/man1p /usr/share/man/vai/man1x /usr/share/man/vai/man2 /usr/share/man/vai/man2x /usr/share/man/vai/man3 /usr/share/man/vai/man3p /usr/share/man/vai/man3x /usr/share/man/vai/man4 /usr/share/man/vai/man4x /usr/share/man/vai/man5 /usr/share/man/vai/man5x /usr/share/man/vai/man6 /usr/share/man/vai/man6x /usr/share/man/vai/man7 /usr/share/man/vai/man7x /usr/share/man/vai/man8 /usr/share/man/vai/man8x /usr/share/man/vai/man9 /usr/share/man/vai/man9x /usr/share/man/vai/mann /usr/share/man/ve /usr/share/man/ve/man0p /usr/share/man/ve/man1 /usr/share/man/ve/man1p /usr/share/man/ve/man1x /usr/share/man/ve/man2 /usr/share/man/ve/man2x /usr/share/man/ve/man3 /usr/share/man/ve/man3p /usr/share/man/ve/man3x /usr/share/man/ve/man4 /usr/share/man/ve/man4x /usr/share/man/ve/man5 /usr/share/man/ve/man5x /usr/share/man/ve/man6 /usr/share/man/ve/man6x /usr/share/man/ve/man7 /usr/share/man/ve/man7x /usr/share/man/ve/man8 /usr/share/man/ve/man8x /usr/share/man/ve/man9 /usr/share/man/ve/man9x /usr/share/man/ve/mann /usr/share/man/vi /usr/share/man/vi/man0p /usr/share/man/vi/man1 /usr/share/man/vi/man1p /usr/share/man/vi/man1x /usr/share/man/vi/man2 /usr/share/man/vi/man2x /usr/share/man/vi/man3 /usr/share/man/vi/man3p /usr/share/man/vi/man3x /usr/share/man/vi/man4 /usr/share/man/vi/man4x /usr/share/man/vi/man5 /usr/share/man/vi/man5x /usr/share/man/vi/man6 /usr/share/man/vi/man6x /usr/share/man/vi/man7 /usr/share/man/vi/man7x /usr/share/man/vi/man8 /usr/share/man/vi/man8x /usr/share/man/vi/man9 /usr/share/man/vi/man9x /usr/share/man/vi/mann /usr/share/man/vo /usr/share/man/vo/man0p /usr/share/man/vo/man1 /usr/share/man/vo/man1p /usr/share/man/vo/man1x /usr/share/man/vo/man2 /usr/share/man/vo/man2x /usr/share/man/vo/man3 /usr/share/man/vo/man3p /usr/share/man/vo/man3x /usr/share/man/vo/man4 /usr/share/man/vo/man4x /usr/share/man/vo/man5 /usr/share/man/vo/man5x /usr/share/man/vo/man6 /usr/share/man/vo/man6x /usr/share/man/vo/man7 /usr/share/man/vo/man7x /usr/share/man/vo/man8 /usr/share/man/vo/man8x /usr/share/man/vo/man9 /usr/share/man/vo/man9x /usr/share/man/vo/mann /usr/share/man/vot /usr/share/man/vot/man0p /usr/share/man/vot/man1 /usr/share/man/vot/man1p /usr/share/man/vot/man1x /usr/share/man/vot/man2 /usr/share/man/vot/man2x /usr/share/man/vot/man3 /usr/share/man/vot/man3p /usr/share/man/vot/man3x /usr/share/man/vot/man4 /usr/share/man/vot/man4x /usr/share/man/vot/man5 /usr/share/man/vot/man5x /usr/share/man/vot/man6 /usr/share/man/vot/man6x /usr/share/man/vot/man7 /usr/share/man/vot/man7x /usr/share/man/vot/man8 /usr/share/man/vot/man8x /usr/share/man/vot/man9 /usr/share/man/vot/man9x /usr/share/man/vot/mann /usr/share/man/wa /usr/share/man/wak /usr/share/man/wak/man0p /usr/share/man/wak/man1 /usr/share/man/wak/man1p /usr/share/man/wak/man1x /usr/share/man/wak/man2 /usr/share/man/wak/man2x /usr/share/man/wak/man3 /usr/share/man/wak/man3p /usr/share/man/wak/man3x /usr/share/man/wak/man4 /usr/share/man/wak/man4x /usr/share/man/wak/man5 /usr/share/man/wak/man5x /usr/share/man/wak/man6 /usr/share/man/wak/man6x /usr/share/man/wak/man7 /usr/share/man/wak/man7x /usr/share/man/wak/man8 /usr/share/man/wak/man8x /usr/share/man/wak/man9 /usr/share/man/wak/man9x /usr/share/man/wak/mann /usr/share/man/wal /usr/share/man/wal/man0p /usr/share/man/wal/man1 /usr/share/man/wal/man1p /usr/share/man/wal/man1x /usr/share/man/wal/man2 /usr/share/man/wal/man2x /usr/share/man/wal/man3 /usr/share/man/wal/man3p /usr/share/man/wal/man3x /usr/share/man/wal/man4 /usr/share/man/wal/man4x /usr/share/man/wal/man5 /usr/share/man/wal/man5x /usr/share/man/wal/man6 /usr/share/man/wal/man6x /usr/share/man/wal/man7 /usr/share/man/wal/man7x /usr/share/man/wal/man8 /usr/share/man/wal/man8x /usr/share/man/wal/man9 /usr/share/man/wal/man9x /usr/share/man/wal/mann /usr/share/man/wa/man0p /usr/share/man/wa/man1 /usr/share/man/wa/man1p /usr/share/man/wa/man1x /usr/share/man/wa/man2 /usr/share/man/wa/man2x /usr/share/man/wa/man3 /usr/share/man/wa/man3p /usr/share/man/wa/man3x /usr/share/man/wa/man4 /usr/share/man/wa/man4x /usr/share/man/wa/man5 /usr/share/man/wa/man5x /usr/share/man/wa/man6 /usr/share/man/wa/man6x /usr/share/man/wa/man7 /usr/share/man/wa/man7x /usr/share/man/wa/man8 /usr/share/man/wa/man8x /usr/share/man/wa/man9 /usr/share/man/wa/man9x /usr/share/man/wa/mann /usr/share/man/war /usr/share/man/war/man0p /usr/share/man/war/man1 /usr/share/man/war/man1p /usr/share/man/war/man1x /usr/share/man/war/man2 /usr/share/man/war/man2x /usr/share/man/war/man3 /usr/share/man/war/man3p /usr/share/man/war/man3x /usr/share/man/war/man4 /usr/share/man/war/man4x /usr/share/man/war/man5 /usr/share/man/war/man5x /usr/share/man/war/man6 /usr/share/man/war/man6x /usr/share/man/war/man7 /usr/share/man/war/man7x /usr/share/man/war/man8 /usr/share/man/war/man8x /usr/share/man/war/man9 /usr/share/man/war/man9x /usr/share/man/war/mann /usr/share/man/was /usr/share/man/was/man0p /usr/share/man/was/man1 /usr/share/man/was/man1p /usr/share/man/was/man1x /usr/share/man/was/man2 /usr/share/man/was/man2x /usr/share/man/was/man3 /usr/share/man/was/man3p /usr/share/man/was/man3x /usr/share/man/was/man4 /usr/share/man/was/man4x /usr/share/man/was/man5 /usr/share/man/was/man5x /usr/share/man/was/man6 /usr/share/man/was/man6x /usr/share/man/was/man7 /usr/share/man/was/man7x /usr/share/man/was/man8 /usr/share/man/was/man8x /usr/share/man/was/man9 /usr/share/man/was/man9x /usr/share/man/was/mann /usr/share/man/wen /usr/share/man/wen/man0p /usr/share/man/wen/man1 /usr/share/man/wen/man1p /usr/share/man/wen/man1x /usr/share/man/wen/man2 /usr/share/man/wen/man2x /usr/share/man/wen/man3 /usr/share/man/wen/man3p /usr/share/man/wen/man3x /usr/share/man/wen/man4 /usr/share/man/wen/man4x /usr/share/man/wen/man5 /usr/share/man/wen/man5x /usr/share/man/wen/man6 /usr/share/man/wen/man6x /usr/share/man/wen/man7 /usr/share/man/wen/man7x /usr/share/man/wen/man8 /usr/share/man/wen/man8x /usr/share/man/wen/man9 /usr/share/man/wen/man9x /usr/share/man/wen/mann /usr/share/man/wo /usr/share/man/wo/man0p /usr/share/man/wo/man1 /usr/share/man/wo/man1p /usr/share/man/wo/man1x /usr/share/man/wo/man2 /usr/share/man/wo/man2x /usr/share/man/wo/man3 /usr/share/man/wo/man3p /usr/share/man/wo/man3x /usr/share/man/wo/man4 /usr/share/man/wo/man4x /usr/share/man/wo/man5 /usr/share/man/wo/man5x /usr/share/man/wo/man6 /usr/share/man/wo/man6x /usr/share/man/wo/man7 /usr/share/man/wo/man7x /usr/share/man/wo/man8 /usr/share/man/wo/man8x /usr/share/man/wo/man9 /usr/share/man/wo/man9x /usr/share/man/wo/mann /usr/share/man/xal /usr/share/man/xal/man0p /usr/share/man/xal/man1 /usr/share/man/xal/man1p /usr/share/man/xal/man1x /usr/share/man/xal/man2 /usr/share/man/xal/man2x /usr/share/man/xal/man3 /usr/share/man/xal/man3p /usr/share/man/xal/man3x /usr/share/man/xal/man4 /usr/share/man/xal/man4x /usr/share/man/xal/man5 /usr/share/man/xal/man5x /usr/share/man/xal/man6 /usr/share/man/xal/man6x /usr/share/man/xal/man7 /usr/share/man/xal/man7x /usr/share/man/xal/man8 /usr/share/man/xal/man8x /usr/share/man/xal/man9 /usr/share/man/xal/man9x /usr/share/man/xal/mann /usr/share/man/xh /usr/share/man/xh/man0p /usr/share/man/xh/man1 /usr/share/man/xh/man1p /usr/share/man/xh/man1x /usr/share/man/xh/man2 /usr/share/man/xh/man2x /usr/share/man/xh/man3 /usr/share/man/xh/man3p /usr/share/man/xh/man3x /usr/share/man/xh/man4 /usr/share/man/xh/man4x /usr/share/man/xh/man5 /usr/share/man/xh/man5x /usr/share/man/xh/man6 /usr/share/man/xh/man6x /usr/share/man/xh/man7 /usr/share/man/xh/man7x /usr/share/man/xh/man8 /usr/share/man/xh/man8x /usr/share/man/xh/man9 /usr/share/man/xh/man9x /usr/share/man/xh/mann /usr/share/man/yao /usr/share/man/yao/man0p /usr/share/man/yao/man1 /usr/share/man/yao/man1p /usr/share/man/yao/man1x /usr/share/man/yao/man2 /usr/share/man/yao/man2x /usr/share/man/yao/man3 /usr/share/man/yao/man3p /usr/share/man/yao/man3x /usr/share/man/yao/man4 /usr/share/man/yao/man4x /usr/share/man/yao/man5 /usr/share/man/yao/man5x /usr/share/man/yao/man6 /usr/share/man/yao/man6x /usr/share/man/yao/man7 /usr/share/man/yao/man7x /usr/share/man/yao/man8 /usr/share/man/yao/man8x /usr/share/man/yao/man9 /usr/share/man/yao/man9x /usr/share/man/yao/mann /usr/share/man/yap /usr/share/man/yap/man0p /usr/share/man/yap/man1 /usr/share/man/yap/man1p /usr/share/man/yap/man1x /usr/share/man/yap/man2 /usr/share/man/yap/man2x /usr/share/man/yap/man3 /usr/share/man/yap/man3p /usr/share/man/yap/man3x /usr/share/man/yap/man4 /usr/share/man/yap/man4x /usr/share/man/yap/man5 /usr/share/man/yap/man5x /usr/share/man/yap/man6 /usr/share/man/yap/man6x /usr/share/man/yap/man7 /usr/share/man/yap/man7x /usr/share/man/yap/man8 /usr/share/man/yap/man8x /usr/share/man/yap/man9 /usr/share/man/yap/man9x /usr/share/man/yap/mann /usr/share/man/yi /usr/share/man/yi/man0p /usr/share/man/yi/man1 /usr/share/man/yi/man1p /usr/share/man/yi/man1x /usr/share/man/yi/man2 /usr/share/man/yi/man2x /usr/share/man/yi/man3 /usr/share/man/yi/man3p /usr/share/man/yi/man3x /usr/share/man/yi/man4 /usr/share/man/yi/man4x /usr/share/man/yi/man5 /usr/share/man/yi/man5x /usr/share/man/yi/man6 /usr/share/man/yi/man6x /usr/share/man/yi/man7 /usr/share/man/yi/man7x /usr/share/man/yi/man8 /usr/share/man/yi/man8x /usr/share/man/yi/man9 /usr/share/man/yi/man9x /usr/share/man/yi/mann /usr/share/man/yo /usr/share/man/yo/man0p /usr/share/man/yo/man1 /usr/share/man/yo/man1p /usr/share/man/yo/man1x /usr/share/man/yo/man2 /usr/share/man/yo/man2x /usr/share/man/yo/man3 /usr/share/man/yo/man3p /usr/share/man/yo/man3x /usr/share/man/yo/man4 /usr/share/man/yo/man4x /usr/share/man/yo/man5 /usr/share/man/yo/man5x /usr/share/man/yo/man6 /usr/share/man/yo/man6x /usr/share/man/yo/man7 /usr/share/man/yo/man7x /usr/share/man/yo/man8 /usr/share/man/yo/man8x /usr/share/man/yo/man9 /usr/share/man/yo/man9x /usr/share/man/yo/mann /usr/share/man/ypk /usr/share/man/ypk/man0p /usr/share/man/ypk/man1 /usr/share/man/ypk/man1p /usr/share/man/ypk/man1x /usr/share/man/ypk/man2 /usr/share/man/ypk/man2x /usr/share/man/ypk/man3 /usr/share/man/ypk/man3p /usr/share/man/ypk/man3x /usr/share/man/ypk/man4 /usr/share/man/ypk/man4x /usr/share/man/ypk/man5 /usr/share/man/ypk/man5x /usr/share/man/ypk/man6 /usr/share/man/ypk/man6x /usr/share/man/ypk/man7 /usr/share/man/ypk/man7x /usr/share/man/ypk/man8 /usr/share/man/ypk/man8x /usr/share/man/ypk/man9 /usr/share/man/ypk/man9x /usr/share/man/ypk/mann /usr/share/man/za /usr/share/man/za/man0p /usr/share/man/za/man1 /usr/share/man/za/man1p /usr/share/man/za/man1x /usr/share/man/za/man2 /usr/share/man/za/man2x /usr/share/man/za/man3 /usr/share/man/za/man3p /usr/share/man/za/man3x /usr/share/man/za/man4 /usr/share/man/za/man4x /usr/share/man/za/man5 /usr/share/man/za/man5x /usr/share/man/za/man6 /usr/share/man/za/man6x /usr/share/man/za/man7 /usr/share/man/za/man7x /usr/share/man/za/man8 /usr/share/man/za/man8x /usr/share/man/za/man9 /usr/share/man/za/man9x /usr/share/man/za/mann /usr/share/man/zap /usr/share/man/zap/man0p /usr/share/man/zap/man1 /usr/share/man/zap/man1p /usr/share/man/zap/man1x /usr/share/man/zap/man2 /usr/share/man/zap/man2x /usr/share/man/zap/man3 /usr/share/man/zap/man3p /usr/share/man/zap/man3x /usr/share/man/zap/man4 /usr/share/man/zap/man4x /usr/share/man/zap/man5 /usr/share/man/zap/man5x /usr/share/man/zap/man6 /usr/share/man/zap/man6x /usr/share/man/zap/man7 /usr/share/man/zap/man7x /usr/share/man/zap/man8 /usr/share/man/zap/man8x /usr/share/man/zap/man9 /usr/share/man/zap/man9x /usr/share/man/zap/mann /usr/share/man/zbl /usr/share/man/zbl/man0p /usr/share/man/zbl/man1 /usr/share/man/zbl/man1p /usr/share/man/zbl/man1x /usr/share/man/zbl/man2 /usr/share/man/zbl/man2x /usr/share/man/zbl/man3 /usr/share/man/zbl/man3p /usr/share/man/zbl/man3x /usr/share/man/zbl/man4 /usr/share/man/zbl/man4x /usr/share/man/zbl/man5 /usr/share/man/zbl/man5x /usr/share/man/zbl/man6 /usr/share/man/zbl/man6x /usr/share/man/zbl/man7 /usr/share/man/zbl/man7x /usr/share/man/zbl/man8 /usr/share/man/zbl/man8x /usr/share/man/zbl/man9 /usr/share/man/zbl/man9x /usr/share/man/zbl/mann /usr/share/man/zen /usr/share/man/zen/man0p /usr/share/man/zen/man1 /usr/share/man/zen/man1p /usr/share/man/zen/man1x /usr/share/man/zen/man2 /usr/share/man/zen/man2x /usr/share/man/zen/man3 /usr/share/man/zen/man3p /usr/share/man/zen/man3x /usr/share/man/zen/man4 /usr/share/man/zen/man4x /usr/share/man/zen/man5 /usr/share/man/zen/man5x /usr/share/man/zen/man6 /usr/share/man/zen/man6x /usr/share/man/zen/man7 /usr/share/man/zen/man7x /usr/share/man/zen/man8 /usr/share/man/zen/man8x /usr/share/man/zen/man9 /usr/share/man/zen/man9x /usr/share/man/zen/mann /usr/share/man/zh /usr/share/man/zh_CN /usr/share/man/zh_CN.GB2312 /usr/share/man/zh_CN.GB2312/man0p /usr/share/man/zh_CN.GB2312/man1 /usr/share/man/zh_CN.GB2312/man1p /usr/share/man/zh_CN.GB2312/man1x /usr/share/man/zh_CN.GB2312/man2 /usr/share/man/zh_CN.GB2312/man2x /usr/share/man/zh_CN.GB2312/man3 /usr/share/man/zh_CN.GB2312/man3p /usr/share/man/zh_CN.GB2312/man3x /usr/share/man/zh_CN.GB2312/man4 /usr/share/man/zh_CN.GB2312/man4x /usr/share/man/zh_CN.GB2312/man5 /usr/share/man/zh_CN.GB2312/man5x /usr/share/man/zh_CN.GB2312/man6 /usr/share/man/zh_CN.GB2312/man6x /usr/share/man/zh_CN.GB2312/man7 /usr/share/man/zh_CN.GB2312/man7x /usr/share/man/zh_CN.GB2312/man8 /usr/share/man/zh_CN.GB2312/man8x /usr/share/man/zh_CN.GB2312/man9 /usr/share/man/zh_CN.GB2312/man9x /usr/share/man/zh_CN.GB2312/mann /usr/share/man/zh_CN/man0p /usr/share/man/zh_CN/man1 /usr/share/man/zh_CN/man1p /usr/share/man/zh_CN/man1x /usr/share/man/zh_CN/man2 /usr/share/man/zh_CN/man2x /usr/share/man/zh_CN/man3 /usr/share/man/zh_CN/man3p /usr/share/man/zh_CN/man3x /usr/share/man/zh_CN/man4 /usr/share/man/zh_CN/man4x /usr/share/man/zh_CN/man5 /usr/share/man/zh_CN/man5x /usr/share/man/zh_CN/man6 /usr/share/man/zh_CN/man6x /usr/share/man/zh_CN/man7 /usr/share/man/zh_CN/man7x /usr/share/man/zh_CN/man8 /usr/share/man/zh_CN/man8x /usr/share/man/zh_CN/man9 /usr/share/man/zh_CN/man9x /usr/share/man/zh_CN/mann /usr/share/man/zh_HK /usr/share/man/zh_HK/man0p /usr/share/man/zh_HK/man1 /usr/share/man/zh_HK/man1p /usr/share/man/zh_HK/man1x /usr/share/man/zh_HK/man2 /usr/share/man/zh_HK/man2x /usr/share/man/zh_HK/man3 /usr/share/man/zh_HK/man3p /usr/share/man/zh_HK/man3x /usr/share/man/zh_HK/man4 /usr/share/man/zh_HK/man4x /usr/share/man/zh_HK/man5 /usr/share/man/zh_HK/man5x /usr/share/man/zh_HK/man6 /usr/share/man/zh_HK/man6x /usr/share/man/zh_HK/man7 /usr/share/man/zh_HK/man7x /usr/share/man/zh_HK/man8 /usr/share/man/zh_HK/man8x /usr/share/man/zh_HK/man9 /usr/share/man/zh_HK/man9x /usr/share/man/zh_HK/mann /usr/share/man/zh/man0p /usr/share/man/zh/man1 /usr/share/man/zh/man1p /usr/share/man/zh/man1x /usr/share/man/zh/man2 /usr/share/man/zh/man2x /usr/share/man/zh/man3 /usr/share/man/zh/man3p /usr/share/man/zh/man3x /usr/share/man/zh/man4 /usr/share/man/zh/man4x /usr/share/man/zh/man5 /usr/share/man/zh/man5x /usr/share/man/zh/man6 /usr/share/man/zh/man6x /usr/share/man/zh/man7 /usr/share/man/zh/man7x /usr/share/man/zh/man8 /usr/share/man/zh/man8x /usr/share/man/zh/man9 /usr/share/man/zh/man9x /usr/share/man/zh/mann /usr/share/man/zh_TW /usr/share/man/zh_TW.Big5 /usr/share/man/zh_TW.Big5/man0p /usr/share/man/zh_TW.Big5/man1 /usr/share/man/zh_TW.Big5/man1p /usr/share/man/zh_TW.Big5/man1x /usr/share/man/zh_TW.Big5/man2 /usr/share/man/zh_TW.Big5/man2x /usr/share/man/zh_TW.Big5/man3 /usr/share/man/zh_TW.Big5/man3p /usr/share/man/zh_TW.Big5/man3x /usr/share/man/zh_TW.Big5/man4 /usr/share/man/zh_TW.Big5/man4x /usr/share/man/zh_TW.Big5/man5 /usr/share/man/zh_TW.Big5/man5x /usr/share/man/zh_TW.Big5/man6 /usr/share/man/zh_TW.Big5/man6x /usr/share/man/zh_TW.Big5/man7 /usr/share/man/zh_TW.Big5/man7x /usr/share/man/zh_TW.Big5/man8 /usr/share/man/zh_TW.Big5/man8x /usr/share/man/zh_TW.Big5/man9 /usr/share/man/zh_TW.Big5/man9x /usr/share/man/zh_TW.Big5/mann /usr/share/man/zh_TW/man0p /usr/share/man/zh_TW/man1 /usr/share/man/zh_TW/man1p /usr/share/man/zh_TW/man1x /usr/share/man/zh_TW/man2 /usr/share/man/zh_TW/man2x /usr/share/man/zh_TW/man3 /usr/share/man/zh_TW/man3p /usr/share/man/zh_TW/man3x /usr/share/man/zh_TW/man4 /usr/share/man/zh_TW/man4x /usr/share/man/zh_TW/man5 /usr/share/man/zh_TW/man5x /usr/share/man/zh_TW/man6 /usr/share/man/zh_TW/man6x /usr/share/man/zh_TW/man7 /usr/share/man/zh_TW/man7x /usr/share/man/zh_TW/man8 /usr/share/man/zh_TW/man8x /usr/share/man/zh_TW/man9 /usr/share/man/zh_TW/man9x /usr/share/man/zh_TW/mann /usr/share/man/znd /usr/share/man/znd/man0p /usr/share/man/znd/man1 /usr/share/man/znd/man1p /usr/share/man/znd/man1x /usr/share/man/znd/man2 /usr/share/man/znd/man2x /usr/share/man/znd/man3 /usr/share/man/znd/man3p /usr/share/man/znd/man3x /usr/share/man/znd/man4 /usr/share/man/znd/man4x /usr/share/man/znd/man5 /usr/share/man/znd/man5x /usr/share/man/znd/man6 /usr/share/man/znd/man6x /usr/share/man/znd/man7 /usr/share/man/znd/man7x /usr/share/man/znd/man8 /usr/share/man/znd/man8x /usr/share/man/znd/man9 /usr/share/man/znd/man9x /usr/share/man/znd/mann /usr/share/man/zu /usr/share/man/zu/man0p /usr/share/man/zu/man1 /usr/share/man/zu/man1p /usr/share/man/zu/man1x /usr/share/man/zu/man2 /usr/share/man/zu/man2x /usr/share/man/zu/man3 /usr/share/man/zu/man3p /usr/share/man/zu/man3x /usr/share/man/zu/man4 /usr/share/man/zu/man4x /usr/share/man/zu/man5 /usr/share/man/zu/man5x /usr/share/man/zu/man6 /usr/share/man/zu/man6x /usr/share/man/zu/man7 /usr/share/man/zu/man7x /usr/share/man/zu/man8 /usr/share/man/zu/man8x /usr/share/man/zu/man9 /usr/share/man/zu/man9x /usr/share/man/zu/mann /usr/share/man/zun /usr/share/man/zun/man0p /usr/share/man/zun/man1 /usr/share/man/zun/man1p /usr/share/man/zun/man1x /usr/share/man/zun/man2 /usr/share/man/zun/man2x /usr/share/man/zun/man3 /usr/share/man/zun/man3p /usr/share/man/zun/man3x /usr/share/man/zun/man4 /usr/share/man/zun/man4x /usr/share/man/zun/man5 /usr/share/man/zun/man5x /usr/share/man/zun/man6 /usr/share/man/zun/man6x /usr/share/man/zun/man7 /usr/share/man/zun/man7x /usr/share/man/zun/man8 /usr/share/man/zun/man8x /usr/share/man/zun/man9 /usr/share/man/zun/man9x /usr/share/man/zun/mann /usr/share/man/zxx /usr/share/man/zxx/man0p /usr/share/man/zxx/man1 /usr/share/man/zxx/man1p /usr/share/man/zxx/man1x /usr/share/man/zxx/man2 /usr/share/man/zxx/man2x /usr/share/man/zxx/man3 /usr/share/man/zxx/man3p /usr/share/man/zxx/man3x /usr/share/man/zxx/man4 /usr/share/man/zxx/man4x /usr/share/man/zxx/man5 /usr/share/man/zxx/man5x /usr/share/man/zxx/man6 /usr/share/man/zxx/man6x /usr/share/man/zxx/man7 /usr/share/man/zxx/man7x /usr/share/man/zxx/man8 /usr/share/man/zxx/man8x /usr/share/man/zxx/man9 /usr/share/man/zxx/man9x /usr/share/man/zxx/mann /usr/share/man/zza /usr/share/man/zza/man0p /usr/share/man/zza/man1 /usr/share/man/zza/man1p /usr/share/man/zza/man1x /usr/share/man/zza/man2 /usr/share/man/zza/man2x /usr/share/man/zza/man3 /usr/share/man/zza/man3p /usr/share/man/zza/man3x /usr/share/man/zza/man4 /usr/share/man/zza/man4x /usr/share/man/zza/man5 /usr/share/man/zza/man5x /usr/share/man/zza/man6 /usr/share/man/zza/man6x /usr/share/man/zza/man7 /usr/share/man/zza/man7x /usr/share/man/zza/man8 /usr/share/man/zza/man8x /usr/share/man/zza/man9 /usr/share/man/zza/man9x /usr/share/man/zza/mann /usr/share/mime-info /usr/share/misc /usr/share/omf /usr/share/pixmaps /usr/share/sounds /usr/share/themes /usr/share/X11 /usr/share/xsessions /usr/src /usr/src/debug /usr/src/kernels /usr/tmp /var /var/cache /var/db /var/empty /var/games /var/lib /var/lib/games /var/lib/misc /var/local /var/lock /var/lock/subsys /var/log /var/mail /var/nis /var/opt /var/preserve /var/run /var/spool /var/spool/lpd /var/spool/mail /var/tmp /var/yp ================================================ FILE: templates/rpm.erb ================================================ # Hello packaging friend! # # If you find yourself using this 'fpm --edit' feature frequently, it is # a sign that fpm is missing a feature! I welcome your feature requests! # Please visit the following URL and ask for a feature that helps you never # need to edit this file again! :) # https://github.com/jordansissel/fpm/issues # ------------------------------------------------------------------------ # Disable the stupid stuff rpm distros include in the build process by default: <% %w(prep build install clean).each do |step| -%> <%# These definitions have to be non-empty... I guess... -%> # Disable any <%= step %> shell actions. replace them with simply 'true' %define __spec_<%= step %>_post true %define __spec_<%= step %>_pre true <% end -%> # Disable checking for unpackaged files ? #%undefine __check_files # Allow building noarch packages that contain binaries %define _binaries_in_noarch_packages_terminate_build 0 # Use <%= attributes[:rpm_digest] %> file digest method. # The first macro is the one used in RPM v4.9.1.1 %define _binary_filedigest_algorithm <%= digest_algorithm %> # This is the macro I find on OSX when Homebrew provides rpmbuild (rpm v5.4.14) %define _build_binary_file_digest_algo <%= digest_algorithm %> # Use <%= attributes[:rpm_compression] %> payload compression %define _binary_payload <%= payload_compression %> <% (attributes[:rpm_filter_from_requires] or []).each do |reqfilter| -%> %filter_from_requires <%= reqfilter %> <% end -%> <% (attributes[:rpm_filter_from_provides] or []).each do |provfilter| -%> %filter_from_provides <%= provfilter %> <% end -%> <% if !(attributes[:rpm_filter_from_requires] or []).empty? or !(attributes[:rpm_filter_from_provides] or []).empty?-%> %filter_setup <% end -%> Name: <%= name %> Version: <%= version %> <% if epoch -%> Epoch: <%= epoch %> <% end -%> Release: <%= iteration or 1 %><%= "%{?dist}" if attributes[:rpm_dist] %> <%# use the first line of the description as the summary -%> Summary: <%= summary %> <% if !attributes[:rpm_autoreqprov?] -%> AutoReqProv: no <% else -%> AutoReqProv: yes <% end -%> <% if attributes[:rpm_autoreq?] -%> AutoReq: yes <% end -%> <% if attributes[:rpm_autoprov?] -%> AutoProv: yes <% end -%> # Seems specifying BuildRoot is required on older rpmbuild (like on CentOS 5) # fpm passes '--define buildroot ...' on the commandline, so just reuse that. BuildRoot: %buildroot <% if !prefix.nil? and !prefix.empty? %> Prefix: <%= prefix %> <% end -%> Group: <%= category %> <%# Sometimes the 'license' field has multiple lines... Hack around it. # While technically yes this means we are 'modifying' the license, # since the job of FPM is to get shit done and that this is only # modifying whitespace, it should be reasonably OK. -%> License: <%= license.gsub("\n", " ") %> <% if !vendor.nil? and !vendor.empty? -%> Vendor: <%= vendor %> <% end -%> <% if !url.nil? and !url.empty? -%> URL: <%= url %> <%else -%> URL: http://nourlgiven.example.com/ <% end -%> Packager: <%= maintainer %> <% if !attributes[:no_depends?] -%> <% dependencies.each do |req| -%> Requires: <%= req %> <% end -%> <% (attributes[:rpm_tag] or []).each do |tag| -%> <%= tag %> <% end -%> <% end -%> <% provides.each do |prov| -%> Provides: <%= prov %> <% end -%> <% conflicts.each do |conflict| -%> Conflicts: <%= conflict %> <% end -%> <% replaces.each do |repl| -%> <%# The closes equivalent in RPM to "replaces" is "Obsoletes" -%> Obsoletes: <%= repl %> <% end -%> <%# rpm rejects descriptions with blank lines (even between content), so hack around it by replacing blank lines with ' .' -%> %description <%= description.gsub(/^\s*$/, " .") %> %prep # noop %build # noop %install # noop %clean # noop <%# This next section puts any %pre, %post, %preun, %postun, %verifyscript, %pretrans or %posttrans scripts %> <% scriptmap = { :rpm_verifyscript => "verifyscript", :rpm_posttrans => "posttrans", :rpm_pretrans => "pretrans" } -%> <% if script?(:before_upgrade) or script?(:after_upgrade) -%> <% if script?(:before_upgrade) or script?(:before_install) -%> %pre <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %> upgrade() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:before_upgrade) -%> <%= script(:before_upgrade) %> <% end -%> } _install() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:before_install) -%> <%= script(:before_install) %> <% end -%> } if [ "${1}" -eq 1 ] then # "before install" goes here _install elif [ "${1}" -gt 1 ] then # "before upgrade" goes here upgrade fi <% end -%> <% if script?(:after_upgrade) or script?(:after_install) -%> %post <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %> upgrade() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_upgrade) -%> <%= script(:after_upgrade) %> <% end -%> } _install() { <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <% if script?(:after_install) -%> <%= script(:after_install) %> <% end -%> } if [ "${1}" -eq 1 ] then # "after install" goes here _install elif [ "${1}" -gt 1 ] then # "after upgrade" goes here upgrade fi <% end -%> <% if script?(:before_remove) -%> %preun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %> if [ "${1}" -eq 0 ] then <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <%= script(:before_remove) %> fi <% end -%> <% if script?(:after_remove) -%> %postun <% if attributes[:rpm_macro_expansion?] -%><%= " -e " %> <% end %> if [ "${1}" -eq 0 ] then <%# Making sure that at least one command is in the function -%> <%# avoids a lot of potential errors, including the case that -%> <%# the script is non-empty, but just whitespace and/or comments -%> : <%= script(:after_remove) %> fi <% end -%> <% else other_scriptmap = { :before_install => "pre", :after_install => "post", :before_remove => "preun", :after_remove => "postun" } scriptmap.merge!(other_scriptmap) end -%> <% scriptmap.each do |name, rpmname| -%> <% if script?(name) -%> %<%= rpmname -%> <%= ' -e' if attributes[:rpm_macro_expansion?] %> <%= script(name) %> <% end -%> <% end -%> <%# This section adds any triggers, as ordered in the command line -%> <% triggermap = { :before_install => "prein", :after_install => "in", :before_uninstall => "un", :after_target_uninstall => "postun" } triggermap.each do |name, rpmtype| (attributes["rpm_trigger_#{name}".to_sym] or []).each do |trigger_name, trigger_script, trigger_scriptprog| -%> %trigger<%= rpmtype -%> <%= trigger_scriptprog -%> -- <%= trigger_name %> <%= trigger_script %> <% end -%> <% end -%> %files %defattr(<%= attributes[:rpm_defattrfile] %>,<%= attributes[:rpm_user] || "root" %>,<%= attributes[:rpm_group] || "root" %>,<%= attributes[:rpm_defattrdir] %>) <%# Output config files and then regular files. -%> <% config_files.each do |path| -%> %config(noreplace) <%= rpm_file_entry(path) %> <% end -%> <%# list directories %> <% directories.each do |path| -%> %dir <%= rpm_file_entry(path) %> <% end -%> <%# list only files, not directories? -%> # Reject config files already listed or parent directories, then prefix files # with "/", then make sure paths with spaces are quoted. I hate rpm so much. <% files.each do |path| -%> <% path = "/#{path}" -%> <% next if config_files.include?(path)-%> <% next if directories.include?(path)-%> <%= rpm_file_entry(path) %> <% end -%> %changelog <%= changelog %> ================================================ FILE: templates/sh.erb ================================================ #!/bin/bash # bail out if any part of this fails set -e # This is the self-extracting installer script for an FPM shell installer package. # It contains the logic to unpack a tar archive appended to the end of this script # and, optionally, to run post install logic. # Run the package file with -h to see a usage message or look at the print_usage method. # # The post install scripts are called with INSTALL_ROOT, INSTALL_DIR and VERBOSE exported # into the environment for their use. # # INSTALL_ROOT = the path passed in with -i or a relative directory of the name of the package # file with no extension # INSTALL_DIR = the same as INSTALL_ROOT unless -c (capistrano release directory) argumetn # is used. Then it is $INSTALL_ROOT/releases/ # CURRENT_DIR = if -c argument is used, this is set to the $INSTALL_ROOT/current which is # symlinked to INSTALL_DIR # VERBOSE = is set if the package was called with -v for verbose output function main() { set_install_dir if ! slug_already_current ; then create_pid wait_for_others kill_others set_owner pre_install unpack_payload if [ "$UNPACK_ONLY" == "1" ] ; then echo "Unpacking complete, not moving symlinks or restarting because unpack only was specified." else create_symlinks set +e # don't exit on errors to allow us to clean up if ! run_post_install ; then revert_symlinks log "Installation failed." exit 1 else clean_out_old_releases log "Installation complete." fi fi else echo "This slug is already installed in 'current'. Specify -f to force reinstall. Exiting." fi } # check if this slug is already running and exit unless `force` specified # Note: this only works with RELEASE_ID is used function slug_already_current(){ local this_slug=$(basename $0 .slug) local current=$(basename "$(readlink ${INSTALL_ROOT}/current)") log "'current' symlink points to slug: ${current}" if [ "$this_slug" == "$current" ] ; then if [ "$FORCE" == "1" ] ; then log "Force was specified. Proceeding with install after renaming live directory to allow running service to shutdown correctly." local real_dir=$(readlink ${INSTALL_ROOT}/current) if [ -e ${real_dir}.old ] ; then # remove that .old directory, if needed log "removing existing .old version of release" rm -rf ${real_dir}.old fi mv ${real_dir} ${real_dir}.old mkdir -p ${real_dir} else return 0; fi fi return 1; } # deletes the PID file for this installation function delete_pid(){ rm -f ${INSTALL_ROOT}/$$.pid 2> /dev/null } # creates a PID file for this installation function create_pid(){ trap "delete_pid" EXIT echo $$> ${INSTALL_ROOT}/$$.pid } # checks for other PID files and sleeps for a grace period if found function wait_for_others(){ local count=`ls ${INSTALL_ROOT}/*.pid | wc -l` if [ $count -gt 1 ] ; then sleep 10 fi } # kills other running installations function kill_others(){ for PID_FILE in $(ls ${INSTALL_ROOT}/*.pid) ; do local p=`cat ${PID_FILE}` if ! [ $p == $$ ] ; then kill -9 $p rm -f $PID_FILE 2> /dev/null fi done } # echos metadata file. A function so that we can have it change after we set INSTALL_ROOT function fpm_metadata_file(){ echo "${INSTALL_ROOT}/.install-metadata" } # if this package was installed at this location already we will find a metadata file with the details # about the installation that we left here. Load from that if available but allow command line args to trump function load_environment(){ local METADATA=$(fpm_metadata_file) if [ -r "${METADATA}" ] ; then log "Found existing metadata file '${METADATA}'. Loading previous install details. Env vars in current environment will take precedence over saved values." local TMP="/tmp/$(basename $0).$$.tmp" # save existing environment, load saved environment from previous run from install-metadata and then # overlay current environment so that anything set currencly will take precedence # but missing values will be loaded from previous runs. save_environment "$TMP" source "${METADATA}" source $TMP rm "$TMP" fi } # write out metadata for future installs function save_environment(){ local METADATA=$1 echo -n "" > ${METADATA} # empty file # just piping env to a file doesn't quote the variables. This does # filter out multiline junk, _, and functions. _ is a readonly variable. env | grep -v "^_=" | grep -v "^[^=(]*()=" | grep -v "^BASH_FUNC_.*%%=" |egrep "^[^ ]+=" | while read ENVVAR ; do local NAME=${ENVVAR%%=*} # sed is to preserve variable values with dollars (for escaped variables or $() style command replacement), # and command replacement backticks # Escaped parens captures backward reference \1 which gets replaced with backslash and \1 to esape them in the saved # variable value local VALUE=$(eval echo '$'$NAME | sed 's/\([$`]\)/\\\1/g') echo "export $NAME=\"$VALUE\"" >> ${METADATA} done if [ -n "${OWNER}" ] ; then chown ${OWNER} ${METADATA} fi } function set_install_dir(){ # if INSTALL_ROOT isn't set by parsed args, use basename of package file with no extension DEFAULT_DIR=$(echo $(basename $0) | sed -e 's/\.[^\.]*$//') INSTALL_DIR=${INSTALL_ROOT:-$DEFAULT_DIR} DATESTAMP=$(date +%Y%m%d%H%M%S) if [ -z "$USE_FLAT_RELEASE_DIRECTORY" ] ; then <%= "RELEASE_ID=#{release_id}" if respond_to?(:release_id) %> INSTALL_DIR="${RELEASES_DIR}/${RELEASE_ID:-$DATESTAMP}" fi mkdir -p "$INSTALL_DIR" || die "Unable to create install directory $INSTALL_DIR" export INSTALL_DIR log "Installing package to '$INSTALL_DIR'" } function set_owner(){ export OWNER=${OWNER:-$USER} log "Installing as user $OWNER" } function pre_install() { # for rationale on the `:`, see #871 : <% if script?(:before_install) -%> <%= script(:before_install) %> <% end %> } function unpack_payload(){ if [ "$FORCE" == "1" ] || [ ! "$(ls -A $INSTALL_DIR)" ] ; then log "Unpacking payload . . ." local archive_line=$(grep -a -n -m1 '__ARCHIVE__$' $0 | sed 's/:.*//') tail -n +$((archive_line + 1)) $0 | tar -C $INSTALL_DIR -xf - > /dev/null || die "Failed to unpack payload from the end of '$0' into '$INSTALL_DIR'" else # Files are already here, just move symlinks log "Directory already exists and has contents ($INSTALL_DIR). Not unpacking payload." fi } function run_post_install(){ local AFTER_INSTALL=$INSTALL_DIR/.fpm/after_install if [ -r $AFTER_INSTALL ] ; then set_post_install_vars chmod +x $AFTER_INSTALL log "Running post install script" output=$($AFTER_INSTALL 2>&1) errorlevel=$? log $output return $errorlevel fi return 0 } function set_post_install_vars(){ # for rationale on the `:`, see #871 : <% if respond_to?(:package_metadata)%> <% package_metadata_hash = JSON.parse(package_metadata)%> <% package_metadata_hash.each do |k,v| %> <%= "export #{k.upcase}='#{v}'; "%> <% end %> <% end %> } function create_symlinks(){ [ -n "$USE_FLAT_RELEASE_DIRECTORY" ] && return export CURRENT_DIR="$INSTALL_ROOT/current" if [ -e "$CURRENT_DIR" ] || [ -h "$CURRENT_DIR" ] ; then log "Removing current symlink" OLD_CURRENT_TARGET=$(readlink $CURRENT_DIR) rm "$CURRENT_DIR" fi ln -s "$INSTALL_DIR" "$CURRENT_DIR" log "Symlinked '$INSTALL_DIR' to '$CURRENT_DIR'" } # in case post install fails we may have to back out switching the symlink to current # We can't switch the symlink after because post install may assume that it is in the # exact state of being installed (services looking to current for their latest code) function revert_symlinks(){ if [ -n "$OLD_CURRENT_TARGET" ] ; then log "Putting current symlink back to '$OLD_CURRENT_TARGET'" if [ -e "$CURRENT_DIR" ] ; then rm "$CURRENT_DIR" fi ln -s "$OLD_CURRENT_TARGET" "$CURRENT_DIR" fi } function clean_out_old_releases(){ [ -n "$USE_FLAT_RELEASE_DIRECTORY" ] && return if [ -n "$OLD_CURRENT_TARGET" ] ; then # exclude old 'current' from deletions while [ $(ls -tr "${RELEASES_DIR}" | grep -v ^$(basename "${OLD_CURRENT_TARGET}")$ | wc -l) -gt 2 ] ; do OLDEST_RELEASE=$(ls -tr "${RELEASES_DIR}" | grep -v ^$(basename "${OLD_CURRENT_TARGET}")$ | head -1) log "Deleting old release '${OLDEST_RELEASE}'" rm -rf "${RELEASES_DIR}/${OLDEST_RELEASE}" done else while [ $(ls -tr "${RELEASES_DIR}" | wc -l) -gt 2 ] ; do OLDEST_RELEASE=$(ls -tr "${RELEASES_DIR}" | head -1) log "Deleting old release '${OLDEST_RELEASE}'" rm -rf "${RELEASES_DIR}/${OLDEST_RELEASE}" done fi } function print_package_metadata(){ local metadata_line=$(grep -a -n -m1 '__METADATA__$' $0 | sed 's/:.*//') local archive_line=$(grep -a -n -m1 '__ARCHIVE__$' $0 | sed 's/:.*//') # This used to be a sed call but it was taking _forever_ and this method is super fast local start_at=$((metadata_line + 1)) local take_num=$((archive_line - start_at)) head -n${start_at} $0 | tail -n${take_num} } function print_usage(){ echo "Usage: `basename $0` [options]" echo "Install this package" echo " -i : install_root - an optional directory to install to." echo " Default is package file name without file extension" echo " -o : owner - the name of the user that will own the files installed" echo " by the package. Defaults to current user" echo " -r: disable capistrano style release directories - Default behavior is to create a releases directory inside" echo " install_root and unpack contents into a date stamped (or build time id named) directory under the release" echo " directory. Then create a 'current' symlink under install_root to the unpacked" echo " directory once installation is complete replacing the symlink if it already " echo " exists. If this flag is set just install into install_root directly" echo " -u: Unpack the package, but do not install and symlink the payload" echo " -f: force - Always overwrite existing installations" echo " -y: yes - Don't prompt to clobber existing installations" echo " -v: verbose - More output on installation" echo " -h: help - Display this message" } function die () { local message=$* echo "Error: $message : $!" exit 1 } function log(){ local message=$* if [ -n "$VERBOSE" ] ; then echo "$*" fi } function parse_args() { args=`getopt mi:o:rfuyvh $*` if [ $? != 0 ] ; then print_usage exit 2 fi set -- $args for i do case "$i" in -m) print_package_metadata exit 0 shift;; -r) USE_FLAT_RELEASE_DIRECTORY=1 shift;; -i) shift; export INSTALL_ROOT="$1" export RELEASES_DIR="${INSTALL_ROOT}/releases" shift;; -o) shift; export OWNER="$1" shift;; -v) export VERBOSE=1 shift;; -u) UNPACK_ONLY=1 shift;; -f) FORCE=1 shift;; -y) CONFIRM="y" shift;; -h) print_usage exit 0 shift;; --) shift; break;; esac done } # parse args first to get install root parse_args $* # load environment from previous installations so we get defaults from that load_environment # reparse args so they can override any settings from previous installations if provided on the command line parse_args $* main save_environment $(fpm_metadata_file) exit 0 __METADATA__ <%= package_metadata if respond_to?(:package_metadata) %> __ARCHIVE__ ================================================ FILE: templates/solaris.erb ================================================ CLASSES=none TZ=PST PATH=/sbin:/usr/sbin:/usr/bin:/usr/sadm/install/bin BASEDIR=/ PKG=<%= name %> NAME=<%= name %> ARCH=<%= architecture %> VERSION=<%= version %><%= iteration && "-" + iteration.to_s %> CATEGORY=application <%# pkginfo(4) says DESC is max 256 characters -%> DESC=<%= description.split("\n").first[0..255] or "no description given" %> VENDOR=<%= maintainer %> <%# Take maintainer of "Foo " and use "bar@baz.com" -%> EMAIL=<%= (maintainer[/<.+>/] or maintainer).gsub(/[<>]/, "") %> ================================================ FILE: test/vagrant.pp ================================================ case $operatingsystem { centos, redhat, fedora: { $pkgupdate = "yum clean all" $devsuffix = "-devel" } debian, ubuntu: { $pkgupdate = "apt-get update" $devsuffix = "-dev" package { "lintian": ensure => latest } } Archlinux: { $pkgupdate = "pacman -Syu --noconfirm --needed" $devsuffix = "dev" } } exec { "update-packages": command => $pkgupdate, path => [ "/bin", "/usr/bin", "/sbin", "/usr/sbin" ], timeout => 14400 } package { "git": ensure => latest; "bundler": provider => "gem", ensure => latest; "ruby$devsuffix": ensure => latest; } Exec["update-packages"] -> Package <| |>