bundler-1.16.1/0000755000175000017500000000000013217261023014004 5ustar samuelophsamuelophbundler-1.16.1/man/0000755000175000017500000000000013217261023014557 5ustar samuelophsamuelophbundler-1.16.1/man/bundle-show.1.txt0000644000175000017500000000105513217261023017707 0ustar samuelophsamuelophBUNDLE-SHOW(1) BUNDLE-SHOW(1) NAME bundle-show - Shows all the gems in your bundle, or the path to a gem SYNOPSIS bundle show [GEM] [--paths] DESCRIPTION Without the [GEM] option, show will print a list of the names and ver- sions of all gems that are required by your Gemfile(5). Calling show with [GEM] will list the exact location of that gem on your machine. OPTIONS --paths List the paths of all gems that are required by your Gemfile(5). February 2017 BUNDLE-SHOW(1) bundler-1.16.1/man/bundle-platform.10000644000175000017500000000247413217261023017743 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-PLATFORM" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-platform\fR \- Displays platform compatibility information . .SH "SYNOPSIS" \fBbundle platform\fR [\-\-ruby] . .SH "DESCRIPTION" \fBplatform\fR will display information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\. . .P For instance, using this Gemfile(5): . .IP "" 4 . .nf source "https://rubygems\.org" ruby "1\.9\.3" gem "rack" . .fi . .IP "" 0 . .P If you run \fBbundle platform\fR on Ruby 1\.9\.3, it will display the following output: . .IP "" 4 . .nf Your platform is: x86_64\-linux Your app has gems that work on these platforms: * ruby Your Gemfile specifies a Ruby version requirement: * ruby 1\.9\.3 Your current platform satisfies the Ruby version requirement\. . .fi . .IP "" 0 . .P \fBplatform\fR will list all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It will also let you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it will tell you what part does not\. . .SH "OPTIONS" . .TP \fB\-\-ruby\fR It will display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\. bundler-1.16.1/man/bundle-binstubs.1.txt0000644000175000017500000000323313217261023020560 0ustar samuelophsamuelophBUNDLE-BINSTUBS(1) BUNDLE-BINSTUBS(1) NAME bundle-binstubs - Install the binstubs of the listed gems SYNOPSIS bundle binstubs GEM_NAME [--force] [--path PATH] [--standalone] DESCRIPTION Binstubs are scripts that wrap aroung executables. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it into bin/. Binstubs are a shortcut-or alternative- to always using bundle exec. This gives you a file that can by run directly, and one that will always run the correct gem version used by the applica- tion. For example, if you run bundle binstubs rspec-core, Bundler will create the file bin/rspec. That file will contain enough code to load Bundler, tell it to load the bundled gems, and then run rspec. This command generates binstubs for executables in GEM_NAME. Binstubs are put into bin, or the --path directory if one has been set. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems. OPTIONS --force Overwrite existing binstubs if they exist. --path The location to install the specified binstubs to. This defaults to bin. --standalone Makes binstubs that can work without depending on Rubygems or Bundler at runtime. --sheband Specify a different shebang executable name than the default (default 'ruby') BUNDLE INSTALL --BINSTUBS To create binstubs for all the gems in the bundle you can use the --binstubs flag in [bundle install(1)][bundle-install]. October 2017 BUNDLE-BINSTUBS(1) bundler-1.16.1/man/bundle-show.ronn0000644000175000017500000000102213217261023017677 0ustar samuelophsamuelophbundle-show(1) -- Shows all the gems in your bundle, or the path to a gem ========================================================================= ## SYNOPSIS `bundle show` [GEM] [--paths] ## DESCRIPTION Without the [GEM] option, `show` will print a list of the names and versions of all gems that are required by your `Gemfile(5)`. Calling show with [GEM] will list the exact location of that gem on your machine. ## OPTIONS * `--paths`: List the paths of all gems that are required by your `Gemfile(5)`. bundler-1.16.1/man/bundle-exec.ronn0000644000175000017500000001352113217261023017652 0ustar samuelophsamuelophbundle-exec(1) -- Execute a command in the context of the bundle ================================================================ ## SYNOPSIS `bundle exec` [--keep-file-descriptors] ## DESCRIPTION This command executes the command, making all gems specified in the `Gemfile(5)` available to `require` in Ruby programs. Essentially, if you would normally have run something like `rspec spec/my_spec.rb`, and you want to use the gems specified in the `Gemfile(5)` and installed via [bundle install(1)][bundle-install], you should run `bundle exec rspec spec/my_spec.rb`. Note that `bundle exec` does not require that an executable is available on your shell's `$PATH`. ## OPTIONS * `--keep-file-descriptors`: Exec in Ruby 2.0 began discarding non-standard file descriptors. When this flag is passed, exec will revert to the 1.9 behaviour of passing all file descriptors to the new process. ## BUNDLE INSTALL --BINSTUBS If you use the `--binstubs` flag in [bundle install(1)][bundle-install], Bundler will automatically create a directory (which defaults to `app_root/bin`) containing all of the executables available from gems in the bundle. After using `--binstubs`, `bin/rspec spec/my_spec.rb` is identical to `bundle exec rspec spec/my_spec.rb`. ## ENVIRONMENT MODIFICATIONS `bundle exec` makes a number of changes to the shell environment, then executes the command you specify in full. * make sure that it's still possible to shell out to `bundle` from inside a command invoked by `bundle exec` (using `$BUNDLE_BIN_PATH`) * put the directory containing executables (like `rails`, `rspec`, `rackup`) for your bundle on `$PATH` * make sure that if bundler is invoked in the subshell, it uses the same `Gemfile` (by setting `BUNDLE_GEMFILE`) * add `-rbundler/setup` to `$RUBYOPT`, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle It also modifies Rubygems: * disallow loading additional gems not in the bundle * modify the `gem` method to be a no-op if a gem matching the requirements is in the bundle, and to raise a `Gem::LoadError` if it's not * Define `Gem.refresh` to be a no-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment * Override `Gem.bin_path` to use the gems in the bundle, making system executables work * Add all gems in the bundle into Gem.loaded_specs Finally, `bundle exec` also implicitly modifies `Gemfile.lock` if the lockfile and the Gemfile do not match. Bundler needs the Gemfile to determine things such as a gem's groups, `autorequire`, and platforms, etc., and that information isn't stored in the lockfile. The Gemfile and lockfile must be synced in order to `bundle exec` successfully, so `bundle exec` updates the lockfile beforehand. ### Loading By default, when attempting to `bundle exec` to a file with a ruby shebang, Bundler will `Kernel.load` that file instead of using `Kernel.exec`. For the vast majority of cases, this is a performance improvement. In a rare few cases, this could cause some subtle side-effects (such as dependence on the exact contents of `$0` or `__FILE__`) and the optimization can be disabled by enabling the `disable_exec_load` setting. ### Shelling out Any Ruby code that opens a subshell (like `system`, backticks, or `%x{}`) will automatically use the current Bundler environment. If you need to shell out to a Ruby command that is not part of your current bundle, use the `with_clean_env` method with a block. Any subshells created inside the block will be given the environment present before Bundler was activated. For example, Homebrew commands run Ruby, but don't work inside a bundle: Bundler.with_clean_env do `brew install wget` end Using `with_clean_env` is also necessary if you are shelling out to a different bundle. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use `with_clean_env`. Bundler.with_clean_env do Dir.chdir "/other/bundler/project" do `bundle exec ./script` end end Bundler provides convenience helpers that wrap `system` and `exec`, and they can be used like this: Bundler.clean_system('brew install wget') Bundler.clean_exec('brew install wget') ## RUBYGEMS PLUGINS At present, the Rubygems plugin system requires all files named `rubygems_plugin.rb` on the load path of _any_ installed gem when any Ruby code requires `rubygems.rb`. This includes executables installed into the system, like `rails`, `rackup`, and `rspec`. Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies. For instance, the `gemcutter 0.5` gem depended on `json_pure`. If you had that version of gemcutter installed (even if you _also_ had a newer version without this problem), Rubygems would activate `gemcutter 0.5` and `json_pure `. If your Gemfile(5) also contained `json_pure` (or a gem with a dependency on `json_pure`), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your `Gemfile.lock`. If this happens, bundler will say: You have already activated json_pure 1.4.6 but your Gemfile requires json_pure 1.4.3. Consider using bundle exec. In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin. In general, the authors of these plugins (in this case, the `gemcutter` gem) have released newer versions that are more careful in their plugins. You can find a list of all the gems containing gem plugins by running ruby -rubygems -e "puts Gem.find_files('rubygems_plugin.rb')" At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren't using (`gem uninstall gem_name`). bundler-1.16.1/man/bundle-viz.ronn0000644000175000017500000000164513217261023017542 0ustar samuelophsamuelophbundle-viz(1) -- Generates a visual dependency graph for your Gemfile ===================================================================== ## SYNOPSIS `bundle viz` [--file=FILE] [--format=FORMAT] [--requirements] [--version] [--without=GROUP GROUP] ## DESCRIPTION `viz` generates a PNG file of the current `Gemfile(5)` as a dependency graph. `viz` requires the ruby-graphviz gem (and its dependencies). The associated gems must also be installed via `bundle install(1)`. ## OPTIONS * `--file`, `-f`: The name to use for the generated file. See `--format` option * `--format`, `-F`: This is output format option. Supported format is png, jpg, svg, dot ... * `--requirements`, `-R`: Set to show the version of each required dependency. * `--version`, `-v`: Set to show each gem version. * `--without`, `-W`: Exclude gems that are part of the specified named group. bundler-1.16.1/man/bundle-lock.10000644000175000017500000000615313217261023017045 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-LOCK" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing . .SH "SYNOPSIS" \fBbundle lock\fR [\-\-update] [\-\-local] [\-\-print] [\-\-lockfile=PATH] [\-\-full\-index] [\-\-add\-platform] [\-\-remove\-platform] [\-\-patch] [\-\-minor] [\-\-major] [\-\-strict] [\-\-conservative] . .SH "DESCRIPTION" Lock the gems specified in Gemfile\. . .SH "OPTIONS" . .TP \fB\-\-update=<*gems>\fR Ignores the existing lockfile\. Resolve then updates lockfile\. Taking a list of gems or updating all gems if no list is given\. . .TP \fB\-\-local\fR Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if a appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\. . .TP \fB\-\-print\fR Prints the lockfile to STDOUT instead of writing to the file system\. . .TP \fB\-\-lockfile=\fR The path where the lockfile should be written to\. . .TP \fB\-\-full\-index\fR Fall back to using the single\-file index of all gems\. . .TP \fB\-\-add\-platform\fR Add a new platform to the lockfile, re\-resolving for the addition of that platform\. . .TP \fB\-\-remove\-platform\fR Remove a platform from the lockfile\. . .TP \fB\-\-patch\fR If updating, prefer updating only to next patch version\. . .TP \fB\-\-minor\fR If updating, prefer updating only to next minor version\. . .TP \fB\-\-major\fR If updating, prefer updating to next major version (default)\. . .TP \fB\-\-strict\fR If updating, do not allow any gem to be updated past latest \-\-patch | \-\-minor | \-\-major\. . .TP \fB\-\-conservative\fR If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated\. . .SH "UPDATING ALL GEMS" If you run \fBbundle lock\fR with \fB\-\-update\fR option without list of gems, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\. . .SH "UPDATING A LIST OF GEMS" Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\. . .P For instance, you only want to update \fBnokogiri\fR, run \fBbundle lock \-\-update nokogiri\fR\. . .P Bundler will update \fBnokogiri\fR and any of its dependencies, but leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\. . .SH "SUPPORTING OTHER PLATFORMS" If you want your bundle to support platforms other than the one you\'re running locally, you can run \fBbundle lock \-\-add\-platform PLATFORM\fR to add PLATFORM to the lockfile, force bundler to re\-resolve and consider the new platform when picking gems, all without needing to have a machine that matches PLATFORM handy to install those platform\-specific gems on\. . .P For a full explanation of gem platforms, see \fBgem help platform\fR\. . .SH "PATCH LEVEL OPTIONS" See [bundle update(1)][bundle\-update] for details\. bundler-1.16.1/man/bundle-update.10000644000175000017500000003255513217261023017404 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-UPDATE" "1" "July 2017" "" "" . .SH "NAME" \fBbundle\-update\fR \- Update your gems to the latest available versions . .SH "SYNOPSIS" \fBbundle update\fR \fI*gems\fR [\-\-group=NAME] [\-\-source=NAME] [\-\-local] [\-\-ruby] [\-\-bundler[=VERSION]] [\-\-full\-index] [\-\-jobs=JOBS] [\-\-quiet] [\-\-force] [\-\-patch|\-\-minor|\-\-major] [\-\-strict] [\-\-conservative] . .SH "DESCRIPTION" Update the gems specified (all gems, if none are specified), ignoring the previously installed gems specified in the \fBGemfile\.lock\fR\. In general, you should use [bundle install(1)][bundle\-install] to install the same exact gems and versions across machines\. . .P You would use \fBbundle update\fR to explicitly update the version of a gem\. . .SH "OPTIONS" . .TP \fB\-\-group=\fR, \fB\-g=[]\fR Only update the gems in the specified group\. For instance, you can update all gems in the development group with \fBbundle update \-\-group development\fR\. You can also call \fBbundle update rails \-\-group test\fR to update the rails gem and all gems in the test group, for example\. . .TP \fB\-\-source=\fR The name of a \fB:git\fR or \fB:path\fR source used in the Gemfile(5)\. For instance, with a \fB:git\fR source of \fBhttp://github\.com/rails/rails\.git\fR, you would call \fBbundle update \-\-source rails\fR . .TP \fB\-\-local\fR Do not attempt to fetch gems remotely and use the gem cache instead\. . .TP \fB\-\-ruby\fR Update the locked version of Ruby to the current version of Ruby\. . .TP \fB\-\-bundler\fR Update the locked version of bundler to the invoked bundler version\. . .TP \fB\-\-full\-index\fR Fall back to using the single\-file index of all gems\. . .TP \fB\-\-jobs=[]\fR, \fB\-j[]\fR Specify the number of jobs to run in parallel\. The default is \fB1\fR\. . .TP \fB\-\-retry=[]\fR Retry failed network or git requests for \fInumber\fR times\. . .TP \fB\-\-quiet\fR Only output warnings and errors\. . .TP \fB\-\-force\fR Force downloading every gem\. . .TP \fB\-\-patch\fR Prefer updating only to next patch version\. . .TP \fB\-\-minor\fR Prefer updating only to next minor version\. . .TP \fB\-\-major\fR Prefer updating to next major version (default)\. . .TP \fB\-\-strict\fR Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\. . .TP \fB\-\-conservative\fR Use bundle install conservative update behavior and do not allow shared dependencies to be updated\. . .SH "UPDATING ALL GEMS" If you run \fBbundle update\fR with no parameters, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\. . .P Consider the following Gemfile(5): . .IP "" 4 . .nf source "https://rubygems\.org" gem "rails", "3\.0\.0\.rc" gem "nokogiri" . .fi . .IP "" 0 . .P When you run [bundle install(1)][bundle\-install] the first time, bundler will resolve all of the dependencies, all the way down, and install what you need: . .IP "" 4 . .nf Fetching gem metadata from https://rubygems\.org/\.\.\.\.\.\.\.\.\. Resolving dependencies\.\.\. Installing builder 2\.1\.2 Installing abstract 1\.0\.0 Installing rack 1\.2\.8 Using bundler 1\.7\.6 Installing rake 10\.4\.0 Installing polyglot 0\.3\.5 Installing mime\-types 1\.25\.1 Installing i18n 0\.4\.2 Installing mini_portile 0\.6\.1 Installing tzinfo 0\.3\.42 Installing rack\-mount 0\.6\.14 Installing rack\-test 0\.5\.7 Installing treetop 1\.4\.15 Installing thor 0\.14\.6 Installing activesupport 3\.0\.0\.rc Installing erubis 2\.6\.6 Installing activemodel 3\.0\.0\.rc Installing arel 0\.4\.0 Installing mail 2\.2\.20 Installing activeresource 3\.0\.0\.rc Installing actionpack 3\.0\.0\.rc Installing activerecord 3\.0\.0\.rc Installing actionmailer 3\.0\.0\.rc Installing railties 3\.0\.0\.rc Installing rails 3\.0\.0\.rc Installing nokogiri 1\.6\.5 Bundle complete! 2 Gemfile dependencies, 26 gems total\. Use `bundle show [gemname]` to see where a bundled gem is installed\. . .fi . .IP "" 0 . .P As you can see, even though you have two gems in the Gemfile(5), your application needs 26 different gems in order to run\. Bundler remembers the exact versions it installed in \fBGemfile\.lock\fR\. The next time you run [bundle install(1)][bundle\-install], bundler skips the dependency resolution and installs the same gems as it installed last time\. . .P After checking in the \fBGemfile\.lock\fR into version control and cloning it on another machine, running [bundle install(1)][bundle\-install] will \fIstill\fR install the gems that you installed last time\. You don\'t need to worry that a new release of \fBerubis\fR or \fBmail\fR changes the gems you use\. . .P However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gemfile(5)\. . .P To do this, run \fBbundle update\fR, which will ignore the \fBGemfile\.lock\fR, and resolve all the dependencies again\. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran \fBbundle update\fR\. . .SH "UPDATING A LIST OF GEMS" Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\. . .P For instance, in the scenario above, imagine that \fBnokogiri\fR releases version \fB1\.4\.4\fR, and you want to update it \fIwithout\fR updating Rails and all of its dependencies\. To do this, run \fBbundle update nokogiri\fR\. . .P Bundler will update \fBnokogiri\fR and any of its dependencies, but leave alone Rails and its dependencies\. . .SH "OVERLAPPING DEPENDENCIES" Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second\-level dependency\. For instance, consider the case of \fBthin\fR and \fBrack\-perftools\-profiler\fR\. . .IP "" 4 . .nf source "https://rubygems\.org" gem "thin" gem "rack\-perftools\-profiler" . .fi . .IP "" 0 . .P The \fBthin\fR gem depends on \fBrack >= 1\.0\fR, while \fBrack\-perftools\-profiler\fR depends on \fBrack ~> 1\.0\fR\. If you run bundle install, you get: . .IP "" 4 . .nf Fetching source index for https://rubygems\.org/ Installing daemons (1\.1\.0) Installing eventmachine (0\.12\.10) with native extensions Installing open4 (1\.0\.1) Installing perftools\.rb (0\.4\.7) with native extensions Installing rack (1\.2\.1) Installing rack\-perftools_profiler (0\.0\.2) Installing thin (1\.2\.7) with native extensions Using bundler (1\.0\.0\.rc\.3) . .fi . .IP "" 0 . .P In this case, the two gems have their own set of dependencies, but they share \fBrack\fR in common\. If you run \fBbundle update thin\fR, bundler will update \fBdaemons\fR, \fBeventmachine\fR and \fBrack\fR, which are dependencies of \fBthin\fR, but not \fBopen4\fR or \fBperftools\.rb\fR, which are dependencies of \fBrack\-perftools_profiler\fR\. Note that \fBbundle update thin\fR will update \fBrack\fR even though it\'s \fIalso\fR a dependency of \fBrack\-perftools_profiler\fR\. . .P In short, by default, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\. . .P To prevent updating shared dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in [bundle install(1)][bundle\-install]: . .P In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running [bundle install(1)][bundle\-install] will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of [bundle install(1)][bundle\-install]\. . .P Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent shared dependencies from being updated\. . .SH "PATCH LEVEL OPTIONS" Version 1\.14 introduced 4 patch\-level options that will influence how gem versions are resolved\. One of the following options can be used: \fB\-\-patch\fR, \fB\-\-minor\fR or \fB\-\-major\fR\. \fB\-\-strict\fR can be added to further influence resolution\. . .TP \fB\-\-patch\fR Prefer updating only to next patch version\. . .TP \fB\-\-minor\fR Prefer updating only to next minor version\. . .TP \fB\-\-major\fR Prefer updating to next major version (default)\. . .TP \fB\-\-strict\fR Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\. . .P When Bundler is resolving what versions to use to satisfy declared requirements in the Gemfile or in parent gems, it looks up all available versions, filters out any versions that don\'t satisfy the requirement, and then, by default, sorts them from newest to oldest, considering them in that order\. . .P Providing one of the patch level options (e\.g\. \fB\-\-patch\fR) changes the sort order of the satisfying versions, causing Bundler to consider the latest \fB\-\-patch\fR or \fB\-\-minor\fR version available before other versions\. Note that versions outside the stated patch level could still be resolved to if necessary to find a suitable dependency graph\. . .P For example, if gem \'foo\' is locked at 1\.0\.2, with no gem requirement defined in the Gemfile, and versions 1\.0\.3, 1\.0\.4, 1\.1\.0, 1\.1\.1, 2\.0\.0 all exist, the default order of preference by default (\fB\-\-major\fR) will be "2\.0\.0, 1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\. . .P If the \fB\-\-patch\fR option is used, the order of preference will change to "1\.0\.4, 1\.0\.3, 1\.0\.2, 1\.1\.1, 1\.1\.0, 2\.0\.0"\. . .P If the \fB\-\-minor\fR option is used, the order of preference will change to "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2, 2\.0\.0"\. . .P Combining the \fB\-\-strict\fR option with any of the patch level options will remove any versions beyond the scope of the patch level option, to ensure that no gem is updated that far\. . .P To continue the previous example, if both \fB\-\-patch\fR and \fB\-\-strict\fR options are used, the available versions for resolution would be "1\.0\.4, 1\.0\.3, 1\.0\.2"\. If \fB\-\-minor\fR and \fB\-\-strict\fR are used, it would be "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\. . .P Gem requirements as defined in the Gemfile will still be the first determining factor for what versions are available\. If the gem requirement for \fBfoo\fR in the Gemfile is \'~> 1\.0\', that will accomplish the same thing as providing the \fB\-\-minor\fR and \fB\-\-strict\fR options\. . .SH "PATCH LEVEL EXAMPLES" Given the following gem specifications: . .IP "" 4 . .nf foo 1\.4\.3, requires: ~> bar 2\.0 foo 1\.4\.4, requires: ~> bar 2\.0 foo 1\.4\.5, requires: ~> bar 2\.1 foo 1\.5\.0, requires: ~> bar 2\.1 foo 1\.5\.1, requires: ~> bar 3\.0 bar with versions 2\.0\.3, 2\.0\.4, 2\.1\.0, 2\.1\.1, 3\.0\.0 . .fi . .IP "" 0 . .P Gemfile: . .IP "" 4 . .nf gem \'foo\' . .fi . .IP "" 0 . .P Gemfile\.lock: . .IP "" 4 . .nf foo (1\.4\.3) bar (~> 2\.0) bar (2\.0\.3) . .fi . .IP "" 0 . .P Cases: . .IP "" 4 . .nf # Command Line Result \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- 1 bundle update \-\-patch \'foo 1\.4\.5\', \'bar 2\.1\.1\' 2 bundle update \-\-patch foo \'foo 1\.4\.5\', \'bar 2\.1\.1\' 3 bundle update \-\-minor \'foo 1\.5\.1\', \'bar 3\.0\.0\' 4 bundle update \-\-minor \-\-strict \'foo 1\.5\.0\', \'bar 2\.1\.1\' 5 bundle update \-\-patch \-\-strict \'foo 1\.4\.4\', \'bar 2\.0\.4\' . .fi . .IP "" 0 . .P In case 1, bar is upgraded to 2\.1\.1, a minor version increase, because the dependency from foo 1\.4\.5 required it\. . .P In case 2, only foo is requested to be unlocked, but bar is also allowed to move because it\'s not a declared dependency in the Gemfile\. . .P In case 3, bar goes up a whole major release, because a minor increase is preferred now for foo, and when it goes to 1\.5\.1, it requires 3\.0\.0 of bar\. . .P In case 4, foo is preferred up to a minor version, but 1\.5\.1 won\'t work because the \-\-strict flag removes bar 3\.0\.0 from consideration since it\'s a major increment\. . .P In case 5, both foo and bar have any minor or major increments removed from consideration because of the \-\-strict flag, so the most they can move is up to 1\.4\.4 and 2\.0\.4\. . .SH "RECOMMENDED WORKFLOW" In general, when working with an application managed with bundler, you should use the following workflow: . .IP "\(bu" 4 After you create your Gemfile(5) for the first time, run . .IP $ bundle install . .IP "\(bu" 4 Check the resulting \fBGemfile\.lock\fR into version control . .IP $ git add Gemfile\.lock . .IP "\(bu" 4 When checking out this repository on another development machine, run . .IP $ bundle install . .IP "\(bu" 4 When checking out this repository on a deployment machine, run . .IP $ bundle install \-\-deployment . .IP "\(bu" 4 After changing the Gemfile(5) to reflect a new or update dependency, run . .IP $ bundle install . .IP "\(bu" 4 Make sure to check the updated \fBGemfile\.lock\fR into version control . .IP $ git add Gemfile\.lock . .IP "\(bu" 4 If [bundle install(1)][bundle\-install] reports a conflict, manually update the specific gems that you changed in the Gemfile(5) . .IP $ bundle update rails thin . .IP "\(bu" 4 If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run . .IP $ bundle update . .IP "" 0 bundler-1.16.1/man/bundle-clean.ronn0000644000175000017500000000074413217261023020013 0ustar samuelophsamuelophbundle-clean(1) -- Cleans up unused gems in your bundler directory ================================================================== ## SYNOPSIS `bundle clean` [--dry-run] [--force] ## DESCRIPTION This command will remove all unused gems in your bundler directory. This is useful when you have made many changes to your gem dependencies. ## OPTIONS * `--dry-run`: Print the changes, but do not clean the unused gems. * `--force`: Force a clean even if `--path` is not set. bundler-1.16.1/man/bundle-check.10000644000175000017500000000163413217261023017171 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-CHECK" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems . .SH "SYNOPSIS" \fBbundle check\fR [\-\-dry\-run] [\-\-gemfile=FILE] [\-\-path=PATH] . .SH "DESCRIPTION" \fBcheck\fR searches the local machine for each of the gems requested in the Gemfile\. If all gems are found, Bundler prints a success message and exits with a status of 0\. . .P If not, the first missing gem is listed and Bundler exits status 1\. . .SH "OPTIONS" . .TP \fB\-\-dry\-run\fR Locks the \fBGemfile(5)\fR before running the command\. . .TP \fB\-\-gemfile\fR Use the specified gemfile instead of the \fBGemfile(5)\fR . .TP \fB\-\-path\fR Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME)\. Bundler will remember this value for future installs on this machine\. bundler-1.16.1/man/bundle-package.1.txt0000644000175000017500000000636413217261023020332 0ustar samuelophsamuelophBUNDLE-PACKAGE(1) BUNDLE-PACKAGE(1) NAME bundle-package - Package your needed .gem files into your application SYNOPSIS bundle package DESCRIPTION Copy all of the .gem files needed to run the application into the ven- dor/cache directory. In the future, when running [bundle install(1)][bundle-install], use the gems in the cache in preference to the ones on rubygems.org. GIT AND PATH GEMS Since Bundler 1.2, the bundle package command can also package :git and :path dependencies besides .gem files. This needs to be explicitly enabled via the --all option. Once used, the --all option will be remembered. SUPPORT FOR MULTIPLE PLATFORMS When using gems that have different packages for different platforms, Bundler 1.8 and newer support caching of gems for other platforms where the Gemfile has been resolved (i.e. present in the lockfile) in ven- dor/cache. This needs to be enabled via the --all-platforms option. This setting will be remembered in your local bundler configuration. REMOTE FETCHING By default, if you run [bundle install(1)][bundle-install] after run- ning [bundle package(1)][bundle-package], bundler will still connect to rubygems.org to check whether a platform-specific gem exists for any of the gems in vendor/cache. For instance, consider this Gemfile(5): source "https://rubygems.org" gem "nokogiri" If you run bundle package under C Ruby, bundler will retrieve the ver- sion of nokogiri for the "ruby" platform. If you deploy to JRuby and run bundle install, bundler is forced to check to see whether a "java" platformed nokogiri exists. Even though the nokogiri gem for the Ruby platform is technically acceptable on JRuby, it has a C extension that does not run on JRuby. As a result, bundler will, by default, still connect to rubygems.org to check whether it has a version of one of your gems more specific to your platform. This problem is also not limited to the "java" platform. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux. If you know for sure that the gems packaged in vendor/cache are appro- priate for the platform you are on, you can run bundle install --local to skip checking for more appropriate gems, and use the ones in ven- dor/cache. One way to be sure that you have the right platformed versions of all your gems is to run bundle package on an identical machine and check in the gems. For instance, you can run bundle package on an identical staging box during your staging process, and check in the vendor/cache before deploying to production. By default, [bundle package(1)][bundle-package] fetches and also installs the gems to the default location. To package the dependencies to vendor/cache without installing them to the local install location, you can run bundle package --no-install. September 2017 BUNDLE-PACKAGE(1) bundler-1.16.1/man/bundle-outdated.10000644000175000017500000000713713217261023017731 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-OUTDATED" "1" "July 2017" "" "" . .SH "NAME" \fBbundle\-outdated\fR \- List installed gems with newer versions available . .SH "SYNOPSIS" \fBbundle outdated\fR [GEM] [\-\-local] [\-\-pre] [\-\-source] [\-\-strict] [\-\-parseable | \-\-porcelain] [\-\-group=GROUP] [\-\-groups] [\-\-update\-strict] [\-\-patch|\-\-minor|\-\-major] [\-\-filter\-major] [\-\-filter\-minor] [\-\-filter\-patch] . .SH "DESCRIPTION" Outdated lists the names and versions of gems that have a newer version available in the given source\. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems\. Prerelease gems are ignored by default\. If your gems are up to date, Bundler will exit with a status of 0\. Otherwise, it will exit 1\. . .SH "OPTIONS" . .TP \fB\-\-local\fR Do not attempt to fetch gems remotely and use the gem cache instead\. . .TP \fB\-\-pre\fR Check for newer pre\-release gems\. . .TP \fB\-\-source\fR Check against a specific source\. . .TP \fB\-\-strict\fR Only list newer versions allowed by your Gemfile requirements\. . .TP \fB\-\-parseable\fR, \fB\-\-porcelain\fR Use minimal formatting for more parseable output\. . .TP \fB\-\-group\fR List gems from a specific group\. . .TP \fB\-\-groups\fR List gems organized by groups\. . .TP \fB\-\-update\-strict\fR Strict conservative resolution, do not allow any gem to be updated past latest \-\-patch | \-\-minor| \-\-major\. . .TP \fB\-\-minor\fR Prefer updating only to next minor version\. . .TP \fB\-\-major\fR Prefer updating to next major version (default)\. . .TP \fB\-\-patch\fR Prefer updating only to next patch version\. . .TP \fB\-\-filter\-major\fR Only list major newer versions\. . .TP \fB\-\-filter\-minor\fR Only list minor newer versions\. . .TP \fB\-\-filter\-patch\fR Only list patch newer versions\. . .SH "PATCH LEVEL OPTIONS" See [bundle update(1)][bundle\-update] for details\. . .P One difference between the patch level options in \fBbundle update\fR and here is the \fB\-\-strict\fR option\. \fB\-\-strict\fR was already an option on outdated before the patch level options were added\. \fB\-\-strict\fR wasn\'t altered, and the \fB\-\-update\-strict\fR option on \fBoutdated\fR reflects what \fB\-\-strict\fR does on \fBbundle update\fR\. . .SH "FILTERING OUTPUT" The 3 filtering options do not affect the resolution of versions, merely what versions are shown in the output\. . .P If the regular output shows the following: . .IP "" 4 . .nf * faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test" * hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default" * headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test" . .fi . .IP "" 0 . .P \fB\-\-filter\-major\fR would only show: . .IP "" 4 . .nf * hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default" . .fi . .IP "" 0 . .P \fB\-\-filter\-minor\fR would only show: . .IP "" 4 . .nf * headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test" . .fi . .IP "" 0 . .P \fB\-\-filter\-patch\fR would only show: . .IP "" 4 . .nf * faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test" . .fi . .IP "" 0 . .P Filter options can be combined\. \fB\-\-filter\-minor\fR and \fB\-\-filter\-patch\fR would show: . .IP "" 4 . .nf * faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test" * headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test" . .fi . .IP "" 0 . .P Combining all three \fBfilter\fR options would be the same result as providing none of them\. bundler-1.16.1/man/bundle-gem.ronn0000644000175000017500000000547013217261023017502 0ustar samuelophsamuelophbundle-gem(1) -- Generate a project skeleton for creating a rubygem ==================================================================== ## SYNOPSIS `bundle gem` [OPTIONS] ## DESCRIPTION Generates a directory named `GEM_NAME` with a `Rakefile`, `GEM_NAME.gemspec`, and other supporting files and directories that can be used to develop a rubygem with that name. Run `rake -T` in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems.org. The generated project skeleton can be customized with OPTIONS, as explained below. Note that these options can also be specified via Bundler's global configuration file using the following names: * `gem.coc` * `gem.mit` * `gem.test` ## OPTIONS * `--exe` or `-b` or `--bin`: Specify that Bundler should create a binary executable (as `exe/GEM_NAME`) in the generated rubygem project. This binary will also be added to the `GEM_NAME.gemspec` manifest. This behavior is disabled by default. * `--no-exe`: Do not create a binary (overrides `--exe` specified in the global config). * `--coc`: Add a `CODE_OF_CONDUCT.md` file to the root of the generated project. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future `bundle gem` use. * `--no-coc`: Do not create a `CODE_OF_CONDUCT.md` (overrides `--coc` specified in the global config). * `--ext`: Add boilerplate for C extension code to the generated project. This behavior is disabled by default. * `--no-ext`: Do not add C extension code (overrides `--ext` specified in the global config). * `--mit`: Add an MIT license to a `LICENSE.txt` file in the root of the generated project. Your name from the global git config is used for the copyright statement. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future `bundle gem` use. * `--no-mit`: Do not create a `LICENSE.txt` (overrides `--mit` specified in the global config). * `-t`, `--test=minitest`, `--test=rspec`: Specify the test framework that Bundler should use when generating the project. Acceptable values are `minitest` and `rspec`. The `GEM_NAME.gemspec` will be configured and a skeleton test/spec directory will be created based on this option. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future `bundle gem` use. If no option is specified, the default testing framework is RSpec. * `-e`, `--edit[=EDITOR]`: Open the resulting GEM_NAME.gemspec in EDITOR, or the default editor if not specified. The default is `$BUNDLER_EDITOR`, `$VISUAL`, or `$EDITOR`. ## SEE ALSO * [bundle-config](http://bundler.io/v1.14/bundle_config.html) bundler-1.16.1/man/bundle-open.ronn0000644000175000017500000000067213217261023017672 0ustar samuelophsamuelophbundle-open(1) -- Opens the source directory for a gem in your bundle ===================================================================== ## SYNOPSIS `bundle open` [GEM] ## DESCRIPTION Opens the source directory of the provided GEM in your editor. For this to work the `EDITOR` or `BUNDLER_EDITOR` environment variable has to be set. Example: bundle open 'rack' Will open the source directory for the 'rack' gem in your bundle. bundler-1.16.1/man/bundle-pristine.1.txt0000644000175000017500000000321213217261023020561 0ustar samuelophsamuelophBUNDLE-PRISTINE(1) BUNDLE-PRISTINE(1) NAME bundle-pristine - Restores installed gems to their pristine condition SYNOPSIS bundle pristine DESCRIPTION pristine restores the installed gems in the bundle to their pristine condition using the local gem cache from RubyGems. For git gems, a forced checkout will be performed. For further explanation, bundle pristine ignores unpacked files on disk. In other words, this command utilizes the local .gem cache or the gem's git repository as if one were installing from scratch. Note: the Bundler gem cannot be restored to its original state with pristine. One also cannot use bundle pristine on gems with a 'path' option in the Gemfile, because bundler has no original copy it can restore from. When is it practical to use bundle pristine? It comes in handy when a developer is debugging a gem. bundle pristine is a great way to get rid of experimental changes to a gem that one may not want. Why use bundle pristine over gem pristine --all? Both commands are very similar. For context: bundle pristine, without arguments, cleans all gems from the lockfile. Meanwhile, gem pristine --all cleans all installed gems for that Ruby version. If a developer forgets which gems in their project they might have been debugging, the Rubygems gem pristine [GEMNAME] command may be inconve- nient. One can avoid waiting for gem pristine --all, and instead run bundle pristine. August 2017 BUNDLE-PRISTINE(1) bundler-1.16.1/man/bundle-package.10000644000175000017500000000633113217261023017506 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-PACKAGE" "1" "September 2017" "" "" . .SH "NAME" \fBbundle\-package\fR \- Package your needed \fB\.gem\fR files into your application . .SH "SYNOPSIS" \fBbundle package\fR . .SH "DESCRIPTION" Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\. . .SH "GIT AND PATH GEMS" Since Bundler 1\.2, the \fBbundle package\fR command can also package \fB:git\fR and \fB:path\fR dependencies besides \.gem files\. This needs to be explicitly enabled via the \fB\-\-all\fR option\. Once used, the \fB\-\-all\fR option will be remembered\. . .SH "SUPPORT FOR MULTIPLE PLATFORMS" When using gems that have different packages for different platforms, Bundler 1\.8 and newer support caching of gems for other platforms where the Gemfile has been resolved (i\.e\. present in the lockfile) in \fBvendor/cache\fR\. This needs to be enabled via the \fB\-\-all\-platforms\fR option\. This setting will be remembered in your local bundler configuration\. . .SH "REMOTE FETCHING" By default, if you run [bundle install(1)][bundle\-install] after running [bundle package(1)][bundle\-package], bundler will still connect to \fBrubygems\.org\fR to check whether a platform\-specific gem exists for any of the gems in \fBvendor/cache\fR\. . .P For instance, consider this Gemfile(5): . .IP "" 4 . .nf source "https://rubygems\.org" gem "nokogiri" . .fi . .IP "" 0 . .P If you run \fBbundle package\fR under C Ruby, bundler will retrieve the version of \fBnokogiri\fR for the \fB"ruby"\fR platform\. If you deploy to JRuby and run \fBbundle install\fR, bundler is forced to check to see whether a \fB"java"\fR platformed \fBnokogiri\fR exists\. . .P Even though the \fBnokogiri\fR gem for the Ruby platform is \fItechnically\fR acceptable on JRuby, it has a C extension that does not run on JRuby\. As a result, bundler will, by default, still connect to \fBrubygems\.org\fR to check whether it has a version of one of your gems more specific to your platform\. . .P This problem is also not limited to the \fB"java"\fR platform\. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux\. . .P If you know for sure that the gems packaged in \fBvendor/cache\fR are appropriate for the platform you are on, you can run \fBbundle install \-\-local\fR to skip checking for more appropriate gems, and use the ones in \fBvendor/cache\fR\. . .P One way to be sure that you have the right platformed versions of all your gems is to run \fBbundle package\fR on an identical machine and check in the gems\. For instance, you can run \fBbundle package\fR on an identical staging box during your staging process, and check in the \fBvendor/cache\fR before deploying to production\. . .P By default, [bundle package(1)][bundle\-package] fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle package \-\-no\-install\fR\. bundler-1.16.1/man/bundle-init.ronn0000644000175000017500000000103413217261023017665 0ustar samuelophsamuelophbundle-init(1) -- Generates a Gemfile into the current working directory ======================================================================== ## SYNOPSIS `bundle init` [--gemspec=FILE] ## DESCRIPTION Init generates a default `Gemfile(5)` in the current working directory. When adding a `Gemfile(5)` to a gem with a gemspec, the `--gemspec` option will automatically add each dependency listed in the gemspec file to the newly created `Gemfile(5)`. ## OPTIONS * `--gemspec`: Use the specified .gemspec to create the `Gemfile(5)` bundler-1.16.1/man/bundle-inject.ronn0000644000175000017500000000105313217261023020177 0ustar samuelophsamuelophbundle-inject(1) -- Add named gem(s) with version requirements to Gemfile ========================================================================= ## SYNOPSIS `bundle inject` [GEM] [VERSION] ## DESCRIPTION Adds the named gem(s) with their version requirements to the resolved `Gemfile(5)`. This command will add the gem to both your `Gemfile(5)` and Gemfile.lock if it isn't listed yet. Example: bundle install bundle inject 'rack' '> 0' This will inject the 'rack' gem with a version greater than 0 in your `Gemfile(5)` and Gemfile.lock bundler-1.16.1/man/bundle-clean.1.txt0000644000175000017500000000105213217261023020006 0ustar samuelophsamuelophBUNDLE-CLEAN(1) BUNDLE-CLEAN(1) NAME bundle-clean - Cleans up unused gems in your bundler directory SYNOPSIS bundle clean [--dry-run] [--force] DESCRIPTION This command will remove all unused gems in your bundler directory. This is useful when you have made many changes to your gem dependen- cies. OPTIONS --dry-run Print the changes, but do not clean the unused gems. --force Force a clean even if --path is not set. February 2017 BUNDLE-CLEAN(1) bundler-1.16.1/man/bundle-config.10000644000175000017500000004736213217261023017371 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-CONFIG" "1" "December 2017" "" "" . .SH "NAME" \fBbundle\-config\fR \- Set bundler configuration options . .SH "SYNOPSIS" \fBbundle config\fR [\fIname\fR [\fIvalue\fR]] . .SH "DESCRIPTION" This command allows you to interact with bundler\'s configuration system\. Bundler retrieves its configuration from the local application (\fBapp/\.bundle/config\fR), environment variables, and the user\'s home directory (\fB~/\.bundle/config\fR), in that order of priority\. . .P Executing \fBbundle config\fR with no parameters will print a list of all bundler configuration for the current bundle, and where that configuration was set\. . .P Executing \fBbundle config \fR will print the value of that configuration setting, and where it was set\. . .P Executing \fBbundle config \fR will set that configuration to the value specified for all bundles executed as the current user\. The configuration will be stored in \fB~/\.bundle/config\fR\. If \fIname\fR already is set, \fIname\fR will be overridden and user will be warned\. . .P Executing \fBbundle config \-\-global \fR works the same as above\. . .P Executing \fBbundle config \-\-local \fR will set that configuration to the local application\. The configuration will be stored in \fBapp/\.bundle/config\fR\. . .P Executing \fBbundle config \-\-delete \fR will delete the configuration in both local and global sources\. Not compatible with \-\-global or \-\-local flag\. . .P Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\. . .P Executing \fBbundle config disable_multisource true\fR upgrades the warning about the Gemfile containing multiple primary sources to an error\. Executing \fBbundle config \-\-delete disable_multisource\fR downgrades this error to a warning\. . .SH "REMEMBERING OPTIONS" Flags passed to \fBbundle install\fR or the Bundler runtime, such as \fB\-\-path foo\fR or \fB\-\-without production\fR, are not remembered between commands\. If these options must be remembered,they must be set using \fBbundle config\fR (e\.g\., \fBbundle config path foo\fR)\. . .P The options that can be configured are: . .TP \fBbin\fR Creates a directory (defaults to \fB~/bin\fR) and place any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\. . .TP \fBdeployment\fR In deployment mode, Bundler will \'roll\-out\' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\. . .TP \fBpath\fR The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\. . .TP \fBwithout\fR A space\-separated list of groups referencing gems to skip during installation\. . .TP \fBwith\fR A space\-separated list of groups referencing gems to include during installation\. . .SH "BUILD OPTIONS" You can use \fBbundle config\fR to give bundler the flags to pass to the gem installer every time bundler tries to install a particular gem\. . .P A very common example, the \fBmysql\fR gem, requires Snow Leopard users to pass configuration flags to \fBgem install\fR to specify where to find the \fBmysql_config\fR executable\. . .IP "" 4 . .nf gem install mysql \-\- \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config . .fi . .IP "" 0 . .P Since the specific location of that executable can change from machine to machine, you can specify these flags on a per\-machine basis\. . .IP "" 4 . .nf bundle config build\.mysql \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config . .fi . .IP "" 0 . .P After running this command, every time bundler needs to install the \fBmysql\fR gem, it will pass along the flags you specified\. . .SH "CONFIGURATION KEYS" Configuration keys in bundler have two forms: the canonical form and the environment variable form\. . .P For instance, passing the \fB\-\-without\fR flag to [bundle install(1)][bundle\-install] prevents Bundler from installing certain groups specified in the Gemfile(5)\. Bundler persists this value in \fBapp/\.bundle/config\fR so that calls to \fBBundler\.setup\fR do not try to find gems from the \fBGemfile\fR that you didn\'t install\. Additionally, subsequent calls to [bundle install(1)][bundle\-install] remember this setting and skip those groups\. . .P The canonical form of this configuration is \fB"without"\fR\. To convert the canonical form to the environment variable form, capitalize it, and prepend \fBBUNDLE_\fR\. The environment variable form of \fB"without"\fR is \fBBUNDLE_WITHOUT\fR\. . .P Any periods in the configuration keys must be replaced with two underscores when setting it via environment variables\. The configuration key \fBlocal\.rack\fR becomes the environment variable \fBBUNDLE_LOCAL__RACK\fR\. . .SH "LIST OF AVAILABLE KEYS" The following is a list of all configuration keys and their purpose\. You can learn more about their operation in [bundle install(1)][bundle\-install]\. . .IP "\(bu" 4 \fBallow_bundler_dependency_conflicts\fR (\fBBUNDLE_ALLOW_BUNDLER_DEPENDENCY_CONFLICTS\fR): Allow resolving to specifications that have dependencies on \fBbundler\fR that are incompatible with the running Bundler version\. . .IP "\(bu" 4 \fBallow_deployment_source_credential_changes\fR (\fBBUNDLE_ALLOW_DEPLOYMENT_SOURCE_CREDENTIAL_CHANGES\fR): When in deployment mode, allow changing the credentials to a gem\'s source\. Ex: \fBhttps://some\.host\.com/gems/path/\fR \-> \fBhttps://user_name:password@some\.host\.com/gems/path\fR . .IP "\(bu" 4 \fBallow_offline_install\fR (\fBBUNDLE_ALLOW_OFFLINE_INSTALL\fR): Allow Bundler to use cached data when installing without network access\. . .IP "\(bu" 4 \fBauto_clean_without_path\fR (\fBBUNDLE_AUTO_CLEAN_WITHOUT_PATH\fR): Automatically run \fBbundle clean\fR after installing when an explicit \fBpath\fR has not been set and Bundler is not installing into the system gems\. . .IP "\(bu" 4 \fBauto_install\fR (\fBBUNDLE_AUTO_INSTALL\fR): Automatically run \fBbundle install\fR when gems are missing\. . .IP "\(bu" 4 \fBbin\fR (\fBBUNDLE_BIN\fR): Install executables from gems in the bundle to the specified directory\. Defaults to \fBfalse\fR\. . .IP "\(bu" 4 \fBcache_all\fR (\fBBUNDLE_CACHE_ALL\fR): Cache all gems, including path and git gems\. . .IP "\(bu" 4 \fBcache_all_platforms\fR (\fBBUNDLE_CACHE_ALL_PLATFORMS\fR): Cache gems for all platforms\. . .IP "\(bu" 4 \fBcache_path\fR (\fBBUNDLE_CACHE_PATH\fR): The directory that bundler will place cached gems in when running \fBbundle package\fR, and that bundler will look in when installing gems\. Defaults to \fBvendor/bundle\fR\. . .IP "\(bu" 4 \fBclean\fR (\fBBUNDLE_CLEAN\fR): Whether Bundler should run \fBbundle clean\fR automatically after \fBbundle install\fR\. . .IP "\(bu" 4 \fBconsole\fR (\fBBUNDLE_CONSOLE\fR): The console that \fBbundle console\fR starts\. Defaults to \fBirb\fR\. . .IP "\(bu" 4 \fBdefault_install_uses_path\fR (\fBBUNDLE_DEFAULT_INSTALL_USES_PATH\fR): Whether a \fBbundle install\fR without an explicit \fB\-\-path\fR argument defaults to installing gems in \fB\.bundle\fR\. . .IP "\(bu" 4 \fBdeployment\fR (\fBBUNDLE_DEPLOYMENT\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\. . .IP "\(bu" 4 \fBdisable_checksum_validation\fR (\fBBUNDLE_DISABLE_CHECKSUM_VALIDATION\fR): Allow installing gems even if they do not match the checksum provided by RubyGems\. . .IP "\(bu" 4 \fBdisable_exec_load\fR (\fBBUNDLE_DISABLE_EXEC_LOAD\fR): Stop Bundler from using \fBload\fR to launch an executable in\-process in \fBbundle exec\fR\. . .IP "\(bu" 4 \fBdisable_local_branch_check\fR (\fBBUNDLE_DISABLE_LOCAL_BRANCH_CHECK\fR): Allow Bundler to use a local git override without a branch specified in the Gemfile\. . .IP "\(bu" 4 \fBdisable_multisource\fR (\fBBUNDLE_DISABLE_MULTISOURCE\fR): When set, Gemfiles containing multiple sources will produce errors instead of warnings\. Use \fBbundle config \-\-delete disable_multisource\fR to unset\. . .IP "\(bu" 4 \fBdisable_shared_gems\fR (\fBBUNDLE_DISABLE_SHARED_GEMS\fR): Stop Bundler from accessing gems installed to RubyGems\' normal location\. . .IP "\(bu" 4 \fBdisable_version_check\fR (\fBBUNDLE_DISABLE_VERSION_CHECK\fR): Stop Bundler from checking if a newer Bundler version is available on rubygems\.org\. . .IP "\(bu" 4 \fBerror_on_stderr\fR (\fBBUNDLE_ERROR_ON_STDERR\fR): Print Bundler errors to stderr\. . .IP "\(bu" 4 \fBforce_ruby_platform\fR (\fBBUNDLE_FORCE_RUBY_PLATFORM\fR): Ignore the current machine\'s platform and install only \fBruby\fR platform gems\. As a result, gems with native extensions will be compiled from source\. . .IP "\(bu" 4 \fBfrozen\fR (\fBBUNDLE_FROZEN\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\. Defaults to \fBtrue\fR when \fB\-\-deployment\fR is used\. . .IP "\(bu" 4 \fBgem\.push_key\fR (\fBBUNDLE_GEM__PUSH_KEY\fR): Sets the \fB\-\-key\fR parameter for \fBgem push\fR when using the \fBrake release\fR command with a private gemstash server\. . .IP "\(bu" 4 \fBgemfile\fR (\fBBUNDLE_GEMFILE\fR): The name of the file that bundler should use as the \fBGemfile\fR\. This location of this file also sets the root of the project, which is used to resolve relative paths in the \fBGemfile\fR, among other things\. By default, bundler will search up from the current working directory until it finds a \fBGemfile\fR\. . .IP "\(bu" 4 \fBglobal_gem_cache\fR (\fBBUNDLE_GLOBAL_GEM_CACHE\fR): Whether Bundler should cache all gems globally, rather than locally to the installing Ruby installation\. . .IP "\(bu" 4 \fBignore_messages\fR (\fBBUNDLE_IGNORE_MESSAGES\fR): When set, no post install messages will be printed\. To silence a single gem, use dot notation like \fBignore_messages\.httparty true\fR\. . .IP "\(bu" 4 \fBinit_gems_rb\fR (\fBBUNDLE_INIT_GEMS_RB\fR) Generate a \fBgems\.rb\fR instead of a \fBGemfile\fR when running \fBbundle init\fR\. . .IP "\(bu" 4 \fBjobs\fR (\fBBUNDLE_JOBS\fR): The number of gems Bundler can install in parallel\. Defaults to 1\. . .IP "\(bu" 4 \fBlist_command\fR (\fBBUNDLE_LIST_COMMAND\fR) Enable new list command feature . .IP "\(bu" 4 \fBmajor_deprecations\fR (\fBBUNDLE_MAJOR_DEPRECATIONS\fR): Whether Bundler should print deprecation warnings for behavior that will be changed in the next major version\. . .IP "\(bu" 4 \fBno_install\fR (\fBBUNDLE_NO_INSTALL\fR): Whether \fBbundle package\fR should skip installing gems\. . .IP "\(bu" 4 \fBno_prune\fR (\fBBUNDLE_NO_PRUNE\fR): Whether Bundler should leave outdated gems unpruned when caching\. . .IP "\(bu" 4 \fBonly_update_to_newer_versions\fR (\fBBUNDLE_ONLY_UPDATE_TO_NEWER_VERSIONS\fR): During \fBbundle update\fR, only resolve to newer versions of the gems in the lockfile\. . .IP "\(bu" 4 \fBpath\fR (\fBBUNDLE_PATH\fR): The location on disk where all gems in your bundle will be located regardless of \fB$GEM_HOME\fR or \fB$GEM_PATH\fR values\. Bundle gems not found in this location will be installed by \fBbundle install\fR\. Defaults to \fBGem\.dir\fR\. When \-\-deployment is used, defaults to vendor/bundle\. . .IP "\(bu" 4 \fBpath\.system\fR (\fBBUNDLE_PATH__SYSTEM\fR): Whether Bundler will install gems into the default system path (\fBGem\.dir\fR)\. . .IP "\(bu" 4 \fBplugins\fR (\fBBUNDLE_PLUGINS\fR): Enable Bundler\'s experimental plugin system\. . .IP "\(bu" 4 \fBprefer_gems_rb\fR (\fBBUNDLE_PREFER_GEMS_RB\fR) Prefer \fBgems\.rb\fR to \fBGemfile\fR when Bundler is searching for a Gemfile\. . .IP "\(bu" 4 \fBprint_only_version_number\fR (\fBBUNDLE_PRINT_ONLY_VERSION_NUMBER\fR) Print only version number from \fBbundler \-\-version\fR\. . .IP "\(bu" 4 \fBredirect\fR (\fBBUNDLE_REDIRECT\fR): The number of redirects allowed for network requests\. Defaults to \fB5\fR\. . .IP "\(bu" 4 \fBretry\fR (\fBBUNDLE_RETRY\fR): The number of times to retry failed network requests\. Defaults to \fB3\fR\. . .IP "\(bu" 4 \fBsetup_makes_kernel_gem_public\fR (\fBBUNDLE_SETUP_MAKES_KERNEL_GEM_PUBLIC\fR): Have \fBBundler\.setup\fR make the \fBKernel#gem\fR method public, even though RubyGems declares it as private\. . .IP "\(bu" 4 \fBshebang\fR (\fBBUNDLE_SHEBANG\fR): The program name that should be invoked for generated binstubs\. Defaults to the ruby install name used to generate the binstub\. . .IP "\(bu" 4 \fBsilence_root_warning\fR (\fBBUNDLE_SILENCE_ROOT_WARNING\fR): Silence the warning Bundler prints when installing gems as root\. . .IP "\(bu" 4 \fBskip_default_git_sources\fR (\fBBUNDLE_SKIP_DEFAULT_GIT_SOURCES\fR): Whether Bundler should skip adding default git source shortcuts to the Gemfile DSL\. . .IP "\(bu" 4 \fBspecific_platform\fR (\fBBUNDLE_SPECIFIC_PLATFORM\fR): Allow bundler to resolve for the specific running platform and store it in the lockfile, instead of only using a generic platform\. A specific platform is the exact platform triple reported by \fBGem::Platform\.local\fR, such as \fBx86_64\-darwin\-16\fR or \fBuniversal\-java\-1\.8\fR\. On the other hand, generic platforms are those such as \fBruby\fR, \fBmswin\fR, or \fBjava\fR\. In this example, \fBx86_64\-darwin\-16\fR would map to \fBruby\fR and \fBuniversal\-java\-1\.8\fR to \fBjava\fR\. . .IP "\(bu" 4 \fBssl_ca_cert\fR (\fBBUNDLE_SSL_CA_CERT\fR): Path to a designated CA certificate file or folder containing multiple certificates for trusted CAs in PEM format\. . .IP "\(bu" 4 \fBssl_client_cert\fR (\fBBUNDLE_SSL_CLIENT_CERT\fR): Path to a designated file containing a X\.509 client certificate and key in PEM format\. . .IP "\(bu" 4 \fBssl_verify_mode\fR (\fBBUNDLE_SSL_VERIFY_MODE\fR): The SSL verification mode Bundler uses when making HTTPS requests\. Defaults to verify peer\. . .IP "\(bu" 4 \fBsuppress_install_using_messages\fR (\fBBUNDLE_SUPPRESS_INSTALL_USING_MESSAGES\fR): Avoid printing \fBUsing \.\.\.\fR messages during installation when the version of a gem has not changed\. . .IP "\(bu" 4 \fBsystem_bindir\fR (\fBBUNDLE_SYSTEM_BINDIR\fR): The location where RubyGems installs binstubs\. Defaults to \fBGem\.bindir\fR\. . .IP "\(bu" 4 \fBtimeout\fR (\fBBUNDLE_TIMEOUT\fR): The seconds allowed before timing out for network requests\. Defaults to \fB10\fR\. . .IP "\(bu" 4 \fBunlock_source_unlocks_spec\fR (\fBBUNDLE_UNLOCK_SOURCE_UNLOCKS_SPEC\fR): Whether running \fBbundle update \-\-source NAME\fR unlocks a gem with the given name\. Defaults to \fBtrue\fR\. . .IP "\(bu" 4 \fBupdate_requires_all_flag\fR (\fBBUNDLE_UPDATE_REQUIRES_ALL_FLAG\fR) Require passing \fB\-\-all\fR to \fBbundle update\fR when everything should be updated, and disallow passing no options to \fBbundle update\fR\. . .IP "\(bu" 4 \fBuser_agent\fR (\fBBUNDLE_USER_AGENT\fR): The custom user agent fragment Bundler includes in API requests\. . .IP "\(bu" 4 \fBwith\fR (\fBBUNDLE_WITH\fR): A \fB:\fR\-separated list of groups whose gems bundler should install\. . .IP "\(bu" 4 \fBwithout\fR (\fBBUNDLE_WITHOUT\fR): A \fB:\fR\-separated list of groups whose gems bundler should not install\. . .IP "" 0 . .P In general, you should set these settings per\-application by using the applicable flag to the [bundle install(1)][bundle\-install] or [bundle package(1)][bundle\-package] command\. . .P You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\. . .SH "LOCAL GIT REPOS" Bundler also allows you to work against a git repository locally instead of using the remote version\. This can be achieved by setting up a local override: . .IP "" 4 . .nf bundle config local\.GEM_NAME /path/to/local/git/repository . .fi . .IP "" 0 . .P For example, in order to use a local Rack repository, a developer could call: . .IP "" 4 . .nf bundle config local\.rack ~/Work/git/rack . .fi . .IP "" 0 . .P Now instead of checking out the remote git repository, the local override will be used\. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler\. This means a commit in the local git repo will update the revision in the \fBGemfile\.lock\fR to the local git repo revision\. This requires the same attention as git submodules\. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a commit that only exists in your local machine\. You\'ll also need to CGI escape your usernames and passwords as well\. . .P Bundler does many checks to ensure a developer won\'t work with invalid references\. Particularly, we force a developer to specify a branch in the \fBGemfile\fR in order to use this feature\. If the branch specified in the \fBGemfile\fR and the current branch in the local git repository do not match, Bundler will abort\. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch\. . .P Finally, Bundler also ensures that the current revision in the \fBGemfile\.lock\fR exists in the local git repository\. By doing this, Bundler forces you to fetch the latest changes in the remotes\. . .SH "MIRRORS OF GEM SOURCES" Bundler supports overriding gem sources with mirrors\. This allows you to configure rubygems\.org as the gem source in your Gemfile while still using your mirror to fetch gems\. . .IP "" 4 . .nf bundle config mirror\.SOURCE_URL MIRROR_URL . .fi . .IP "" 0 . .P For example, to use a mirror of rubygems\.org hosted at rubygems\-mirror\.org: . .IP "" 4 . .nf bundle config mirror\.http://rubygems\.org http://rubygems\-mirror\.org . .fi . .IP "" 0 . .P Each mirror also provides a fallback timeout setting\. If the mirror does not respond within the fallback timeout, Bundler will try to use the original server instead of the mirror\. . .IP "" 4 . .nf bundle config mirror\.SOURCE_URL\.fallback_timeout TIMEOUT . .fi . .IP "" 0 . .P For example, to fall back to rubygems\.org after 3 seconds: . .IP "" 4 . .nf bundle config mirror\.https://rubygems\.org\.fallback_timeout 3 . .fi . .IP "" 0 . .P The default fallback timeout is 0\.1 seconds, but the setting can currently only accept whole seconds (for example, 1, 15, or 30)\. . .SH "CREDENTIALS FOR GEM SOURCES" Bundler allows you to configure credentials for any gem source, which allows you to avoid putting secrets into your Gemfile\. . .IP "" 4 . .nf bundle config SOURCE_HOSTNAME USERNAME:PASSWORD . .fi . .IP "" 0 . .P For example, to save the credentials of user \fBclaudette\fR for the gem source at \fBgems\.longerous\.com\fR, you would run: . .IP "" 4 . .nf bundle config gems\.longerous\.com claudette:s00pers3krit . .fi . .IP "" 0 . .P Or you can set the credentials as an environment variable like this: . .IP "" 4 . .nf export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit" . .fi . .IP "" 0 . .P For gems with a git source with HTTP(S) URL you can specify credentials like so: . .IP "" 4 . .nf bundle config https://github\.com/bundler/bundler\.git username:password . .fi . .IP "" 0 . .P Or you can set the credentials as an environment variable like so: . .IP "" 4 . .nf export BUNDLE_GITHUB__COM=username:password . .fi . .IP "" 0 . .P This is especially useful for private repositories on hosts such as Github, where you can use personal OAuth tokens: . .IP "" 4 . .nf export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x\-oauth\-basic . .fi . .IP "" 0 bundler-1.16.1/man/bundle-info.10000644000175000017500000000070113217261023017041 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-INFO" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-info\fR \- Show information for the given gem in your bundle . .SH "SYNOPSIS" \fBbundle info\fR [GEM] [\-\-path] . .SH "DESCRIPTION" Print the basic information about the provided GEM such as homepage, version, path and summary\. . .SH "OPTIONS" . .TP \fB\-\-path\fR Print the path of the given gem bundler-1.16.1/man/bundle-platform.ronn0000644000175000017500000000217513217261023020555 0ustar samuelophsamuelophbundle-platform(1) -- Displays platform compatibility information ================================================================= ## SYNOPSIS `bundle platform` [--ruby] ## DESCRIPTION `platform` will display information from your Gemfile, Gemfile.lock, and Ruby VM about your platform. For instance, using this Gemfile(5): source "https://rubygems.org" ruby "1.9.3" gem "rack" If you run `bundle platform` on Ruby 1.9.3, it will display the following output: Your platform is: x86_64-linux Your app has gems that work on these platforms: * ruby Your Gemfile specifies a Ruby version requirement: * ruby 1.9.3 Your current platform satisfies the Ruby version requirement. `platform` will list all the platforms in your `Gemfile.lock` as well as the `ruby` directive if applicable from your Gemfile(5). It will also let you know if the `ruby` directive requirement has been met. If `ruby` directive doesn't match the running Ruby VM, it will tell you what part does not. ## OPTIONS * `--ruby`: It will display the ruby directive information, so you don't have to parse it from the Gemfile(5). bundler-1.16.1/man/bundle-show.10000644000175000017500000000116213217261023017070 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-SHOW" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem . .SH "SYNOPSIS" \fBbundle show\fR [GEM] [\-\-paths] . .SH "DESCRIPTION" Without the [GEM] option, \fBshow\fR will print a list of the names and versions of all gems that are required by your \fBGemfile(5)\fR\. . .P Calling show with [GEM] will list the exact location of that gem on your machine\. . .SH "OPTIONS" . .TP \fB\-\-paths\fR List the paths of all gems that are required by your \fBGemfile(5)\fR\. bundler-1.16.1/man/bundle-viz.10000644000175000017500000000205613217261023016723 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-VIZ" "1" "July 2017" "" "" . .SH "NAME" \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile . .SH "SYNOPSIS" \fBbundle viz\fR [\-\-file=FILE] [\-\-format=FORMAT] [\-\-requirements] [\-\-version] [\-\-without=GROUP GROUP] . .SH "DESCRIPTION" \fBviz\fR generates a PNG file of the current \fBGemfile(5)\fR as a dependency graph\. \fBviz\fR requires the ruby\-graphviz gem (and its dependencies)\. . .P The associated gems must also be installed via \fBbundle install(1)\fR\. . .SH "OPTIONS" . .TP \fB\-\-file\fR, \fB\-f\fR The name to use for the generated file\. See \fB\-\-format\fR option . .TP \fB\-\-format\fR, \fB\-F\fR This is output format option\. Supported format is png, jpg, svg, dot \.\.\. . .TP \fB\-\-requirements\fR, \fB\-R\fR Set to show the version of each required dependency\. . .TP \fB\-\-version\fR, \fB\-v\fR Set to show each gem version\. . .TP \fB\-\-without\fR, \fB\-W\fR Exclude gems that are part of the specified named group\. bundler-1.16.1/man/bundle-exec.1.txt0000644000175000017500000001464613217261023017665 0ustar samuelophsamuelophBUNDLE-EXEC(1) BUNDLE-EXEC(1) NAME bundle-exec - Execute a command in the context of the bundle SYNOPSIS bundle exec [--keep-file-descriptors] command DESCRIPTION This command executes the command, making all gems specified in the Gemfile(5) available to require in Ruby programs. Essentially, if you would normally have run something like rspec spec/my_spec.rb, and you want to use the gems specified in the Gem- file(5) and installed via [bundle install(1)][bundle-install], you should run bundle exec rspec spec/my_spec.rb. Note that bundle exec does not require that an executable is available on your shell's $PATH. OPTIONS --keep-file-descriptors Exec in Ruby 2.0 began discarding non-standard file descriptors. When this flag is passed, exec will revert to the 1.9 behaviour of passing all file descriptors to the new process. BUNDLE INSTALL --BINSTUBS If you use the --binstubs flag in [bundle install(1)][bundle-install], Bundler will automatically create a directory (which defaults to app_root/bin) containing all of the executables available from gems in the bundle. After using --binstubs, bin/rspec spec/my_spec.rb is identical to bun- dle exec rspec spec/my_spec.rb. ENVIRONMENT MODIFICATIONS bundle exec makes a number of changes to the shell environment, then executes the command you specify in full. o make sure that it's still possible to shell out to bundle from inside a command invoked by bundle exec (using $BUNDLE_BIN_PATH) o put the directory containing executables (like rails, rspec, rackup) for your bundle on $PATH o make sure that if bundler is invoked in the subshell, it uses the same Gemfile (by setting BUNDLE_GEMFILE) o add -rbundler/setup to $RUBYOPT, which makes sure that Ruby pro- grams invoked in the subshell can see the gems in the bundle It also modifies Rubygems: o disallow loading additional gems not in the bundle o modify the gem method to be a no-op if a gem matching the require- ments is in the bundle, and to raise a Gem::LoadError if it's not o Define Gem.refresh to be a no-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment o Override Gem.bin_path to use the gems in the bundle, making system executables work o Add all gems in the bundle into Gem.loaded_specs Finally, bundle exec also implicitly modifies Gemfile.lock if the lock- file and the Gemfile do not match. Bundler needs the Gemfile to deter- mine things such as a gem's groups, autorequire, and platforms, etc., and that information isn't stored in the lockfile. The Gemfile and lockfile must be synced in order to bundle exec successfully, so bundle exec updates the lockfile beforehand. Loading By default, when attempting to bundle exec to a file with a ruby she- bang, Bundler will Kernel.load that file instead of using Kernel.exec. For the vast majority of cases, this is a performance improvement. In a rare few cases, this could cause some subtle side-effects (such as dependence on the exact contents of $0 or __FILE__) and the optimiza- tion can be disabled by enabling the disable_exec_load setting. Shelling out Any Ruby code that opens a subshell (like system, backticks, or %x{}) will automatically use the current Bundler environment. If you need to shell out to a Ruby command that is not part of your current bundle, use the with_clean_env method with a block. Any subshells created inside the block will be given the environment present before Bundler was activated. For example, Homebrew commands run Ruby, but don't work inside a bundle: Bundler.with_clean_env do `brew install wget` end Using with_clean_env is also necessary if you are shelling out to a different bundle. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use with_clean_env. Bundler.with_clean_env do Dir.chdir "/other/bundler/project" do `bundle exec ./script` end end Bundler provides convenience helpers that wrap system and exec, and they can be used like this: Bundler.clean_system('brew install wget') Bundler.clean_exec('brew install wget') RUBYGEMS PLUGINS At present, the Rubygems plugin system requires all files named rubygems_plugin.rb on the load path of any installed gem when any Ruby code requires rubygems.rb. This includes executables installed into the system, like rails, rackup, and rspec. Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies. For instance, the gemcutter 0.5 gem depended on json_pure. If you had that version of gemcutter installed (even if you also had a newer ver- sion without this problem), Rubygems would activate gemcutter 0.5 and json_pure . If your Gemfile(5) also contained json_pure (or a gem with a dependency on json_pure), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your Gem- file.lock. If this happens, bundler will say: You have already activated json_pure 1.4.6 but your Gemfile requires json_pure 1.4.3. Consider using bundle exec. In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin. In general, the authors of these plugins (in this case, the gemcutter gem) have released newer versions that are more careful in their plugins. You can find a list of all the gems containing gem plugins by running ruby -rubygems -e "puts Gem.find_files('rubygems_plugin.rb')" At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren't using (gem uninstall gem_name). July 2017 BUNDLE-EXEC(1) bundler-1.16.1/man/bundle-package.ronn0000644000175000017500000000563713217261023020332 0ustar samuelophsamuelophbundle-package(1) -- Package your needed `.gem` files into your application =========================================================================== ## SYNOPSIS `bundle package` ## DESCRIPTION Copy all of the `.gem` files needed to run the application into the `vendor/cache` directory. In the future, when running [bundle install(1)][bundle-install], use the gems in the cache in preference to the ones on `rubygems.org`. ## GIT AND PATH GEMS Since Bundler 1.2, the `bundle package` command can also package `:git` and `:path` dependencies besides .gem files. This needs to be explicitly enabled via the `--all` option. Once used, the `--all` option will be remembered. ## SUPPORT FOR MULTIPLE PLATFORMS When using gems that have different packages for different platforms, Bundler 1.8 and newer support caching of gems for other platforms where the Gemfile has been resolved (i.e. present in the lockfile) in `vendor/cache`. This needs to be enabled via the `--all-platforms` option. This setting will be remembered in your local bundler configuration. ## REMOTE FETCHING By default, if you run [bundle install(1)][bundle-install] after running [bundle package(1)][bundle-package], bundler will still connect to `rubygems.org` to check whether a platform-specific gem exists for any of the gems in `vendor/cache`. For instance, consider this Gemfile(5): source "https://rubygems.org" gem "nokogiri" If you run `bundle package` under C Ruby, bundler will retrieve the version of `nokogiri` for the `"ruby"` platform. If you deploy to JRuby and run `bundle install`, bundler is forced to check to see whether a `"java"` platformed `nokogiri` exists. Even though the `nokogiri` gem for the Ruby platform is _technically_ acceptable on JRuby, it has a C extension that does not run on JRuby. As a result, bundler will, by default, still connect to `rubygems.org` to check whether it has a version of one of your gems more specific to your platform. This problem is also not limited to the `"java"` platform. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux. If you know for sure that the gems packaged in `vendor/cache` are appropriate for the platform you are on, you can run `bundle install --local` to skip checking for more appropriate gems, and use the ones in `vendor/cache`. One way to be sure that you have the right platformed versions of all your gems is to run `bundle package` on an identical machine and check in the gems. For instance, you can run `bundle package` on an identical staging box during your staging process, and check in the `vendor/cache` before deploying to production. By default, [bundle package(1)][bundle-package] fetches and also installs the gems to the default location. To package the dependencies to `vendor/cache` without installing them to the local install location, you can run `bundle package --no-install`. bundler-1.16.1/man/bundle-add.ronn0000644000175000017500000000140013217261023017447 0ustar samuelophsamuelophbundle-add(1) -- Add gem to the Gemfile and run bundle install ================================================================ ## SYNOPSIS `bundle add` [--group=GROUP] [--version=VERSION] [--source=SOURCE] ## DESCRIPTION Adds the named gem to the Gemfile and run `bundle install`. Example: bundle add rails bundle add rails --version "< 3.0, > 1.1" bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development" bundle add rails --group "development, test" ## OPTIONS * `--version`, `-v`: Specify version requirements(s) for the added gem. * `--group`, `-g`: Specify the group(s) for the added gem. Multiple groups should be separated by commas. * `--source`, , `-s`: Specify the source for the added gem. bundler-1.16.1/man/bundle-config.ronn0000644000175000017500000004275213217261023020203 0ustar samuelophsamuelophbundle-config(1) -- Set bundler configuration options ===================================================== ## SYNOPSIS `bundle config` [ []] ## DESCRIPTION This command allows you to interact with bundler's configuration system. Bundler retrieves its configuration from the local application (`app/.bundle/config`), environment variables, and the user's home directory (`~/.bundle/config`), in that order of priority. Executing `bundle config` with no parameters will print a list of all bundler configuration for the current bundle, and where that configuration was set. Executing `bundle config ` will print the value of that configuration setting, and where it was set. Executing `bundle config ` will set that configuration to the value specified for all bundles executed as the current user. The configuration will be stored in `~/.bundle/config`. If already is set, will be overridden and user will be warned. Executing `bundle config --global ` works the same as above. Executing `bundle config --local ` will set that configuration to the local application. The configuration will be stored in `app/.bundle/config`. Executing `bundle config --delete ` will delete the configuration in both local and global sources. Not compatible with --global or --local flag. Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will cause it to ignore all configuration. Executing `bundle config disable_multisource true` upgrades the warning about the Gemfile containing multiple primary sources to an error. Executing `bundle config --delete disable_multisource` downgrades this error to a warning. ## REMEMBERING OPTIONS Flags passed to `bundle install` or the Bundler runtime, such as `--path foo` or `--without production`, are not remembered between commands. If these options must be remembered,they must be set using `bundle config` (e.g., `bundle config path foo`). The options that can be configured are: * `bin`: Creates a directory (defaults to `~/bin`) and place any executables from the gem there. These executables run in Bundler's context. If used, you might add this directory to your environment's `PATH` variable. For instance, if the `rails` gem comes with a `rails` executable, this flag will create a `bin/rails` executable that ensures that all referred dependencies will be resolved using the bundled gems. * `deployment`: In deployment mode, Bundler will 'roll-out' the bundle for `production` use. Please check carefully if you want to have this option enabled in `development` or `test` environments. * `path`: The location to install the specified gems to. This defaults to Rubygems' setting. Bundler shares this location with Rubygems, `gem install ...` will have gem installed there, too. Therefore, gems installed without a `--path ...` setting will show up by calling `gem list`. Accordingly, gems installed to other locations will not get listed. * `without`: A space-separated list of groups referencing gems to skip during installation. * `with`: A space-separated list of groups referencing gems to include during installation. ## BUILD OPTIONS You can use `bundle config` to give bundler the flags to pass to the gem installer every time bundler tries to install a particular gem. A very common example, the `mysql` gem, requires Snow Leopard users to pass configuration flags to `gem install` to specify where to find the `mysql_config` executable. gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config Since the specific location of that executable can change from machine to machine, you can specify these flags on a per-machine basis. bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config After running this command, every time bundler needs to install the `mysql` gem, it will pass along the flags you specified. ## CONFIGURATION KEYS Configuration keys in bundler have two forms: the canonical form and the environment variable form. For instance, passing the `--without` flag to [bundle install(1)][bundle-install] prevents Bundler from installing certain groups specified in the Gemfile(5). Bundler persists this value in `app/.bundle/config` so that calls to `Bundler.setup` do not try to find gems from the `Gemfile` that you didn't install. Additionally, subsequent calls to [bundle install(1)][bundle-install] remember this setting and skip those groups. The canonical form of this configuration is `"without"`. To convert the canonical form to the environment variable form, capitalize it, and prepend `BUNDLE_`. The environment variable form of `"without"` is `BUNDLE_WITHOUT`. Any periods in the configuration keys must be replaced with two underscores when setting it via environment variables. The configuration key `local.rack` becomes the environment variable `BUNDLE_LOCAL__RACK`. ## LIST OF AVAILABLE KEYS The following is a list of all configuration keys and their purpose. You can learn more about their operation in [bundle install(1)][bundle-install]. * `allow_bundler_dependency_conflicts` (`BUNDLE_ALLOW_BUNDLER_DEPENDENCY_CONFLICTS`): Allow resolving to specifications that have dependencies on `bundler` that are incompatible with the running Bundler version. * `allow_deployment_source_credential_changes` (`BUNDLE_ALLOW_DEPLOYMENT_SOURCE_CREDENTIAL_CHANGES`): When in deployment mode, allow changing the credentials to a gem's source. Ex: `https://some.host.com/gems/path/` -> `https://user_name:password@some.host.com/gems/path` * `allow_offline_install` (`BUNDLE_ALLOW_OFFLINE_INSTALL`): Allow Bundler to use cached data when installing without network access. * `auto_clean_without_path` (`BUNDLE_AUTO_CLEAN_WITHOUT_PATH`): Automatically run `bundle clean` after installing when an explicit `path` has not been set and Bundler is not installing into the system gems. * `auto_install` (`BUNDLE_AUTO_INSTALL`): Automatically run `bundle install` when gems are missing. * `bin` (`BUNDLE_BIN`): Install executables from gems in the bundle to the specified directory. Defaults to `false`. * `cache_all` (`BUNDLE_CACHE_ALL`): Cache all gems, including path and git gems. * `cache_all_platforms` (`BUNDLE_CACHE_ALL_PLATFORMS`): Cache gems for all platforms. * `cache_path` (`BUNDLE_CACHE_PATH`): The directory that bundler will place cached gems in when running bundle package, and that bundler will look in when installing gems. Defaults to `vendor/bundle`. * `clean` (`BUNDLE_CLEAN`): Whether Bundler should run `bundle clean` automatically after `bundle install`. * `console` (`BUNDLE_CONSOLE`): The console that `bundle console` starts. Defaults to `irb`. * `default_install_uses_path` (`BUNDLE_DEFAULT_INSTALL_USES_PATH`): Whether a `bundle install` without an explicit `--path` argument defaults to installing gems in `.bundle`. * `deployment` (`BUNDLE_DEPLOYMENT`): Disallow changes to the `Gemfile`. When the `Gemfile` is changed and the lockfile has not been updated, running Bundler commands will be blocked. * `disable_checksum_validation` (`BUNDLE_DISABLE_CHECKSUM_VALIDATION`): Allow installing gems even if they do not match the checksum provided by RubyGems. * `disable_exec_load` (`BUNDLE_DISABLE_EXEC_LOAD`): Stop Bundler from using `load` to launch an executable in-process in `bundle exec`. * `disable_local_branch_check` (`BUNDLE_DISABLE_LOCAL_BRANCH_CHECK`): Allow Bundler to use a local git override without a branch specified in the Gemfile. * `disable_multisource` (`BUNDLE_DISABLE_MULTISOURCE`): When set, Gemfiles containing multiple sources will produce errors instead of warnings. Use `bundle config --delete disable_multisource` to unset. * `disable_shared_gems` (`BUNDLE_DISABLE_SHARED_GEMS`): Stop Bundler from accessing gems installed to RubyGems' normal location. * `disable_version_check` (`BUNDLE_DISABLE_VERSION_CHECK`): Stop Bundler from checking if a newer Bundler version is available on rubygems.org. * `error_on_stderr` (`BUNDLE_ERROR_ON_STDERR`): Print Bundler errors to stderr. * `force_ruby_platform` (`BUNDLE_FORCE_RUBY_PLATFORM`): Ignore the current machine's platform and install only `ruby` platform gems. As a result, gems with native extensions will be compiled from source. * `frozen` (`BUNDLE_FROZEN`): Disallow changes to the `Gemfile`. When the `Gemfile` is changed and the lockfile has not been updated, running Bundler commands will be blocked. Defaults to `true` when `--deployment` is used. * `gem.push_key` (`BUNDLE_GEM__PUSH_KEY`): Sets the `--key` parameter for `gem push` when using the `rake release` command with a private gemstash server. * `gemfile` (`BUNDLE_GEMFILE`): The name of the file that bundler should use as the `Gemfile`. This location of this file also sets the root of the project, which is used to resolve relative paths in the `Gemfile`, among other things. By default, bundler will search up from the current working directory until it finds a `Gemfile`. * `global_gem_cache` (`BUNDLE_GLOBAL_GEM_CACHE`): Whether Bundler should cache all gems globally, rather than locally to the installing Ruby installation. * `ignore_messages` (`BUNDLE_IGNORE_MESSAGES`): When set, no post install messages will be printed. To silence a single gem, use dot notation like `ignore_messages.httparty true`. * `init_gems_rb` (`BUNDLE_INIT_GEMS_RB`) Generate a `gems.rb` instead of a `Gemfile` when running `bundle init`. * `jobs` (`BUNDLE_JOBS`): The number of gems Bundler can install in parallel. Defaults to 1. * `list_command` (`BUNDLE_LIST_COMMAND`) Enable new list command feature * `major_deprecations` (`BUNDLE_MAJOR_DEPRECATIONS`): Whether Bundler should print deprecation warnings for behavior that will be changed in the next major version. * `no_install` (`BUNDLE_NO_INSTALL`): Whether `bundle package` should skip installing gems. * `no_prune` (`BUNDLE_NO_PRUNE`): Whether Bundler should leave outdated gems unpruned when caching. * `only_update_to_newer_versions` (`BUNDLE_ONLY_UPDATE_TO_NEWER_VERSIONS`): During `bundle update`, only resolve to newer versions of the gems in the lockfile. * `path` (`BUNDLE_PATH`): The location on disk where all gems in your bundle will be located regardless of `$GEM_HOME` or `$GEM_PATH` values. Bundle gems not found in this location will be installed by `bundle install`. Defaults to `Gem.dir`. When --deployment is used, defaults to vendor/bundle. * `path.system` (`BUNDLE_PATH__SYSTEM`): Whether Bundler will install gems into the default system path (`Gem.dir`). * `plugins` (`BUNDLE_PLUGINS`): Enable Bundler's experimental plugin system. * `prefer_gems_rb` (`BUNDLE_PREFER_GEMS_RB`) Prefer `gems.rb` to `Gemfile` when Bundler is searching for a Gemfile. * `print_only_version_number` (`BUNDLE_PRINT_ONLY_VERSION_NUMBER`) Print only version number from `bundler --version`. * `redirect` (`BUNDLE_REDIRECT`): The number of redirects allowed for network requests. Defaults to `5`. * `retry` (`BUNDLE_RETRY`): The number of times to retry failed network requests. Defaults to `3`. * `setup_makes_kernel_gem_public` (`BUNDLE_SETUP_MAKES_KERNEL_GEM_PUBLIC`): Have `Bundler.setup` make the `Kernel#gem` method public, even though RubyGems declares it as private. * `shebang` (`BUNDLE_SHEBANG`): The program name that should be invoked for generated binstubs. Defaults to the ruby install name used to generate the binstub. * `silence_root_warning` (`BUNDLE_SILENCE_ROOT_WARNING`): Silence the warning Bundler prints when installing gems as root. * `skip_default_git_sources` (`BUNDLE_SKIP_DEFAULT_GIT_SOURCES`): Whether Bundler should skip adding default git source shortcuts to the Gemfile DSL. * `specific_platform` (`BUNDLE_SPECIFIC_PLATFORM`): Allow bundler to resolve for the specific running platform and store it in the lockfile, instead of only using a generic platform. A specific platform is the exact platform triple reported by `Gem::Platform.local`, such as `x86_64-darwin-16` or `universal-java-1.8`. On the other hand, generic platforms are those such as `ruby`, `mswin`, or `java`. In this example, `x86_64-darwin-16` would map to `ruby` and `universal-java-1.8` to `java`. * `ssl_ca_cert` (`BUNDLE_SSL_CA_CERT`): Path to a designated CA certificate file or folder containing multiple certificates for trusted CAs in PEM format. * `ssl_client_cert` (`BUNDLE_SSL_CLIENT_CERT`): Path to a designated file containing a X.509 client certificate and key in PEM format. * `ssl_verify_mode` (`BUNDLE_SSL_VERIFY_MODE`): The SSL verification mode Bundler uses when making HTTPS requests. Defaults to verify peer. * `suppress_install_using_messages` (`BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES`): Avoid printing `Using ...` messages during installation when the version of a gem has not changed. * `system_bindir` (`BUNDLE_SYSTEM_BINDIR`): The location where RubyGems installs binstubs. Defaults to `Gem.bindir`. * `timeout` (`BUNDLE_TIMEOUT`): The seconds allowed before timing out for network requests. Defaults to `10`. * `unlock_source_unlocks_spec` (`BUNDLE_UNLOCK_SOURCE_UNLOCKS_SPEC`): Whether running `bundle update --source NAME` unlocks a gem with the given name. Defaults to `true`. * `update_requires_all_flag` (`BUNDLE_UPDATE_REQUIRES_ALL_FLAG`) Require passing `--all` to `bundle update` when everything should be updated, and disallow passing no options to `bundle update`. * `user_agent` (`BUNDLE_USER_AGENT`): The custom user agent fragment Bundler includes in API requests. * `with` (`BUNDLE_WITH`): A `:`-separated list of groups whose gems bundler should install. * `without` (`BUNDLE_WITHOUT`): A `:`-separated list of groups whose gems bundler should not install. In general, you should set these settings per-application by using the applicable flag to the [bundle install(1)][bundle-install] or [bundle package(1)][bundle-package] command. You can set them globally either via environment variables or `bundle config`, whichever is preferable for your setup. If you use both, environment variables will take preference over global settings. ## LOCAL GIT REPOS Bundler also allows you to work against a git repository locally instead of using the remote version. This can be achieved by setting up a local override: bundle config local.GEM_NAME /path/to/local/git/repository For example, in order to use a local Rack repository, a developer could call: bundle config local.rack ~/Work/git/rack Now instead of checking out the remote git repository, the local override will be used. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler. This means a commit in the local git repo will update the revision in the `Gemfile.lock` to the local git repo revision. This requires the same attention as git submodules. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a commit that only exists in your local machine. You'll also need to CGI escape your usernames and passwords as well. Bundler does many checks to ensure a developer won't work with invalid references. Particularly, we force a developer to specify a branch in the `Gemfile` in order to use this feature. If the branch specified in the `Gemfile` and the current branch in the local git repository do not match, Bundler will abort. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch. Finally, Bundler also ensures that the current revision in the `Gemfile.lock` exists in the local git repository. By doing this, Bundler forces you to fetch the latest changes in the remotes. ## MIRRORS OF GEM SOURCES Bundler supports overriding gem sources with mirrors. This allows you to configure rubygems.org as the gem source in your Gemfile while still using your mirror to fetch gems. bundle config mirror.SOURCE_URL MIRROR_URL For example, to use a mirror of rubygems.org hosted at rubygems-mirror.org: bundle config mirror.http://rubygems.org http://rubygems-mirror.org Each mirror also provides a fallback timeout setting. If the mirror does not respond within the fallback timeout, Bundler will try to use the original server instead of the mirror. bundle config mirror.SOURCE_URL.fallback_timeout TIMEOUT For example, to fall back to rubygems.org after 3 seconds: bundle config mirror.https://rubygems.org.fallback_timeout 3 The default fallback timeout is 0.1 seconds, but the setting can currently only accept whole seconds (for example, 1, 15, or 30). ## CREDENTIALS FOR GEM SOURCES Bundler allows you to configure credentials for any gem source, which allows you to avoid putting secrets into your Gemfile. bundle config SOURCE_HOSTNAME USERNAME:PASSWORD For example, to save the credentials of user `claudette` for the gem source at `gems.longerous.com`, you would run: bundle config gems.longerous.com claudette:s00pers3krit Or you can set the credentials as an environment variable like this: export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit" For gems with a git source with HTTP(S) URL you can specify credentials like so: bundle config https://github.com/bundler/bundler.git username:password Or you can set the credentials as an environment variable like so: export BUNDLE_GITHUB__COM=username:password This is especially useful for private repositories on hosts such as Github, where you can use personal OAuth tokens: export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x-oauth-basic bundler-1.16.1/man/bundle-clean.10000644000175000017500000000113413217261023017171 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-CLEAN" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory . .SH "SYNOPSIS" \fBbundle clean\fR [\-\-dry\-run] [\-\-force] . .SH "DESCRIPTION" This command will remove all unused gems in your bundler directory\. This is useful when you have made many changes to your gem dependencies\. . .SH "OPTIONS" . .TP \fB\-\-dry\-run\fR Print the changes, but do not clean the unused gems\. . .TP \fB\-\-force\fR Force a clean even if \fB\-\-path\fR is not set\. bundler-1.16.1/man/bundle-list.10000644000175000017500000000063213217261023017064 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-LIST" "1" "August 2017" "" "" . .SH "NAME" \fBbundle\-list\fR \- List all the gems in the bundle . .SH "SYNOPSIS" \fBbundle list\fR [\-\-name\-only] . .SH "DESCRIPTION" Prints a list of all the gems in the bundle including their version\. . .SH "OPTIONS" . .TP \fB\-\-name\-only\fR Print only the name of each gem\. bundler-1.16.1/man/gemfile.5.ronn0000644000175000017500000004567113217261023017245 0ustar samuelophsamuelophGemfile(5) -- A format for describing gem dependencies for Ruby programs ======================================================================== ## SYNOPSIS A `Gemfile` describes the gem dependencies required to execute associated Ruby code. Place the `Gemfile` in the root of the directory containing the associated code. For instance, in a Rails application, place the `Gemfile` in the same directory as the `Rakefile`. ## SYNTAX A `Gemfile` is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements. ## GLOBAL SOURCES At the top of the `Gemfile`, add a line for the `Rubygems` source that contains the gems listed in the `Gemfile`. source "https://rubygems.org" It is possible, but not recommended as of Bundler 1.7, to add multiple global `source` lines. Each of these `source`s `MUST` be a valid Rubygems repository. Sources are checked for gems following the heuristics described in [SOURCE PRIORITY][]. If a gem is found in more than one global source, Bundler will print a warning after installing the gem indicating which source was used, and listing the other sources where the gem is available. A specific source can be selected for gems that need to use a non-standard repository, suppressing this warning, by using the [`:source` option](#SOURCE) or a [`source` block](#BLOCK-FORM-OF-SOURCE-GIT-PATH-GROUP-and-PLATFORMS). ### CREDENTIALS Some gem sources require a username and password. Use [bundle config(1)][bundle-config] to set the username and password for any of the sources that need it. The command must be run once on each computer that will install the Gemfile, but this keeps the credentials from being stored in plain text in version control. bundle config gems.example.com user:password For some sources, like a company Gemfury account, it may be easier to include the credentials in the Gemfile as part of the source URL. source "https://user:password@gems.example.com" Credentials in the source URL will take precedence over credentials set using `config`. ## RUBY If your application requires a specific Ruby version or engine, specify your requirements using the `ruby` method, with the following arguments. All parameters are `OPTIONAL` unless otherwise specified. ### VERSION (required) The version of Ruby that your application requires. If your application requires an alternate Ruby engine, such as JRuby or Rubinius, this should be the Ruby version that the engine is compatible with. ruby "1.9.3" ### ENGINE Each application _may_ specify a Ruby engine. If an engine is specified, an engine version _must_ also be specified. What exactly is an Engine? - A Ruby engine is an implementation of the Ruby language. - For background: the reference or original implementation of the Ruby programming language is called [Matz's Ruby Interpreter](https://en.wikipedia.org/wiki/Ruby_MRI), or MRI for short. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz. MRI is also known as CRuby, because it is written in C. MRI is the most widely used Ruby engine. - [Other implementations](https://www.ruby-lang.org/en/about/) of Ruby exist. Some of the more well-known implementations include [Rubinius](https://rubinius.com/), and [JRuby](http://jruby.org/). Rubinius is an alternative implementation of Ruby written in Ruby. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine. ### ENGINE VERSION Each application _may_ specify a Ruby engine version. If an engine version is specified, an engine _must_ also be specified. If the engine is "ruby" the engine version specified _must_ match the Ruby version. ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7" ### PATCHLEVEL Each application _may_ specify a Ruby patchlevel. ruby "2.0.0", :patchlevel => "247" ## GEMS Specify gem requirements using the `gem` method, with the following arguments. All parameters are `OPTIONAL` unless otherwise specified. ### NAME (required) For each gem requirement, list a single _gem_ line. gem "nokogiri" ### VERSION Each _gem_ `MAY` have one or more version specifiers. gem "nokogiri", ">= 1.4.2" gem "RedCloth", ">= 4.1.0", "< 4.2.0" ### REQUIRE AS Each _gem_ `MAY` specify files that should be used when autorequiring via `Bundler.require`. You may pass an array with multiple files or `true` if file you want `required` has same name as _gem_ or `false` to prevent any file from being autorequired. gem "redis", :require => ["redis/connection/hiredis", "redis"] gem "webmock", :require => false gem "debugger", :require => true The argument defaults to the name of the gem. For example, these are identical: gem "nokogiri" gem "nokogiri", :require => "nokogiri" gem "nokogiri", :require => true ### GROUPS Each _gem_ `MAY` specify membership in one or more groups. Any _gem_ that does not specify membership in any group is placed in the `default` group. gem "rspec", :group => :test gem "wirble", :groups => [:development, :test] The Bundler runtime allows its two main methods, `Bundler.setup` and `Bundler.require`, to limit their impact to particular groups. # setup adds gems to Ruby's load path Bundler.setup # defaults to all groups require "bundler/setup" # same as Bundler.setup Bundler.setup(:default) # only set up the _default_ group Bundler.setup(:test) # only set up the _test_ group (but `not` _default_) Bundler.setup(:default, :test) # set up the _default_ and _test_ groups, but no others # require requires all of the gems in the specified groups Bundler.require # defaults to the _default_ group Bundler.require(:default) # identical Bundler.require(:default, :test) # requires the _default_ and _test_ groups Bundler.require(:test) # requires the _test_ group The Bundler CLI allows you to specify a list of groups whose gems `bundle install` should not install with the `--without` option. To specify multiple groups to ignore, specify a list of groups separated by spaces. bundle install --without test bundle install --without development test After running `bundle install --without test`, bundler will remember that you excluded the test group in the last installation. The next time you run `bundle install`, without any `--without option`, bundler will recall it. Also, calling `Bundler.setup` with no parameters, or calling `require "bundler/setup"` will setup all groups except for the ones you excluded via `--without` (since they are not available). Note that on `bundle install`, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies. This means that you cannot list different versions of the same gems in different groups. For more details, see [Understanding Bundler](http://bundler.io/rationale.html). ### PLATFORMS If a gem should only be used in a particular platform or set of platforms, you can specify them. Platforms are essentially identical to groups, except that you do not need to use the `--without` install-time flag to exclude groups of gems for other platforms. There are a number of `Gemfile` platforms: * `ruby`: C Ruby (MRI) or Rubinius, but `NOT` Windows * `mri`: Same as _ruby_, but not Rubinius * `mingw`: Windows 32 bit 'mingw32' platform (aka RubyInstaller) * `x64_mingw`: Windows 64 bit 'mingw32' platform (aka RubyInstaller x64) * `rbx`: Same as _ruby_, but only Rubinius (not MRI) * `jruby`: JRuby * `mswin`: Windows You can restrict further by platform and version for all platforms *except* for `rbx`, `jruby`, and `mswin`. To specify a version in addition to a platform, append the version number without the delimiter to the platform. For example, to specify that a gem should only be used on platforms with Ruby 2.3, use: ruby_23 The full list of platforms and supported versions includes: * `ruby`: 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 * `mri`: 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 * `mingw`: 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 * `x64_mingw`: 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 As with groups, you can specify one or more platforms: gem "weakling", :platforms => :jruby gem "ruby-debug", :platforms => :mri_18 gem "nokogiri", :platforms => [:mri_18, :jruby] All operations involving groups (`bundle install`, `Bundler.setup`, `Bundler.require`) behave exactly the same as if any groups not matching the current platform were explicitly excluded. ### SOURCE You can select an alternate Rubygems repository for a gem using the ':source' option. gem "some_internal_gem", :source => "https://gems.example.com" This forces the gem to be loaded from this source and ignores any global sources declared at the top level of the file. If the gem does not exist in this source, it will not be installed. Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on global sources using the ordering described in [SOURCE PRIORITY][]. Selecting a specific source repository this way also suppresses the ambiguous gem warning described above in [GLOBAL SOURCES (#source)](#GLOBAL-SOURCES). ### GIT If necessary, you can specify that a gem is located at a particular git repository using the `:git` parameter. The repository can be accessed via several protocols: * `HTTP(S)`: gem "rails", :git => "https://github.com/rails/rails.git" * `SSH`: gem "rails", :git => "git@github.com:rails/rails.git" * `git`: gem "rails", :git => "git://github.com/rails/rails.git" If using SSH, the user that you use to run `bundle install` `MUST` have the appropriate keys available in their `$HOME/.ssh`. `NOTE`: `http://` and `git://` URLs should be avoided if at all possible. These protocols are unauthenticated, so a man-in-the-middle attacker can deliver malicious code and compromise your system. HTTPS and SSH are strongly preferred. The `group`, `platforms`, and `require` options are available and behave exactly the same as they would for a normal gem. A git repository `SHOULD` have at least one file, at the root of the directory containing the gem, with the extension `.gemspec`. This file `MUST` contain a valid gem specification, as expected by the `gem build` command. If a git repository does not have a `.gemspec`, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions. As a result, it may fail to properly integrate into your application. If a git repository does have a `.gemspec` for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the `.gemspec` specifies a version matching the version specifier. If not, bundler will print a warning. gem "rails", "2.3.8", :git => "https://github.com/rails/rails.git" # bundle install will fail, because the .gemspec in the rails # repository's master branch specifies version 3.0.0 If a git repository does `not` have a `.gemspec` for the gem you attached it to, a version specifier `MUST` be provided. Bundler will use this version in the simple `.gemspec` it creates. Git repositories support a number of additional options. * `branch`, `tag`, and `ref`: You `MUST` only specify at most one of these options. The default is `:branch => "master"` * For example: git "https://github.com/rails/rails.git", :branch => "5-0-stable" do git "https://github.com/rails/rails.git", :tag => "v5.0.0" do git "https://github.com/rails/rails.git", :ref => "4aded" do * `submodules`: For reference, a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) lets you have another git repository within a subfolder of your repository. Specify `:submodules => true` to cause bundler to expand any submodules included in the git repository If a git repository contains multiple `.gemspecs`, each `.gemspec` represents a gem located at the same place in the file system as the `.gemspec`. |~rails [git root] | |-rails.gemspec [rails gem located here] |~actionpack | |-actionpack.gemspec [actionpack gem located here] |~activesupport | |-activesupport.gemspec [activesupport gem located here] |... To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs `gem build name.gemspec` and then installs the resulting gem. The `gem build` command, which comes standard with Rubygems, evaluates the `.gemspec` in the context of the directory in which it is located. ### GIT SOURCE A custom git source can be defined via the `git_source` method. Provide the source's name as an argument, and a block which receives a single argument and interpolates it into a string to return the full repo address: git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" } gem 'rails', :stash => 'forks/rails' In addition, if you wish to choose a specific branch: gem "rails", :stash => "forks/rails", :branch => "branch_name" ### GITHUB `NOTE`: This shorthand should be avoided until Bundler 2.0, since it currently expands to an insecure `git://` URL. This allows a man-in-the-middle attacker to compromise your system. If the git repository you want to use is hosted on GitHub and is public, you can use the :github shorthand to specify the github username and repository name (without the trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. gem "rails", :github => "rails/rails" gem "rails", :github => "rails" Are both equivalent to gem "rails", :git => "git://github.com/rails/rails.git" Since the `github` method is a specialization of `git_source`, it accepts a `:branch` named argument. ### GIST If the git repository you want to use is hosted as a Github Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing ".git"). gem "the_hatch", :gist => "4815162342" Is equivalent to: gem "the_hatch", :git => "https://gist.github.com/4815162342.git" Since the `gist` method is a specialization of `git_source`, it accepts a `:branch` named argument. ### BITBUCKET If the git repository you want to use is hosted on Bitbucket and is public, you can use the :bitbucket shorthand to specify the bitbucket username and repository name (without the trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. gem "rails", :bitbucket => "rails/rails" gem "rails", :bitbucket => "rails" Are both equivalent to gem "rails", :git => "https://rails@bitbucket.org/rails/rails.git" Since the `bitbucket` method is a specialization of `git_source`, it accepts a `:branch` named argument. ### PATH You can specify that a gem is located in a particular location on the file system. Relative paths are resolved relative to the directory containing the `Gemfile`. Similar to the semantics of the `:git` option, the `:path` option requires that the directory in question either contains a `.gemspec` for the gem, or that you specify an explicit version that bundler should use. Unlike `:git`, bundler does not compile C extensions for gems specified as paths. gem "rails", :path => "vendor/rails" If you would like to use multiple local gems directly from the filesystem, you can set a global `path` option to the path containing the gem's files. This will automatically load gemspec files from subdirectories. path 'components' do gem 'admin_ui' gem 'public_ui' end ## BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS The `:source`, `:git`, `:path`, `:group`, and `:platforms` options may be applied to a group of gems by using block form. source "https://gems.example.com" do gem "some_internal_gem" gem "another_internal_gem" end git "https://github.com/rails/rails.git" do gem "activesupport" gem "actionpack" end platforms :ruby do gem "ruby-debug" gem "sqlite3" end group :development, :optional => true do gem "wirble" gem "faker" end In the case of the group block form the :optional option can be given to prevent a group from being installed unless listed in the `--with` option given to the `bundle install` command. In the case of the `git` block form, the `:ref`, `:branch`, `:tag`, and `:submodules` options may be passed to the `git` method, and all gems in the block will inherit those options. ## INSTALL_IF The `install_if` method allows gems to be installed based on a proc or lambda. This is especially useful for optional gems that can only be used if certain software is installed or some other conditions are met. install_if -> { RUBY_PLATFORM =~ /darwin/ } do gem "pasteboard" end ## GEMSPEC The [.gemspec](http://guides.rubygems.org/specification-reference/) file is where you provide metadata about your gem to Rubygems. Some required Gemspec attributes include the name, description, and homepage of your gem. This is also where you specify the dependencies your gem needs to run. If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the `gemspec` method to pull in the dependencies listed in the `.gemspec` file. The `gemspec` method adds any runtime dependencies as gem requirements in the default group. It also adds development dependencies as gem requirements in the `development` group. Finally, it adds a gem requirement on your project (`:path => '.'`). In conjunction with `Bundler.setup`, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths. The `gemspec` method supports optional `:path`, `:glob`, `:name`, and `:development_group` options, which control where bundler looks for the `.gemspec`, the glob it uses to look for the gemspec (defaults to: "{,*,*/*}.gemspec"), what named `.gemspec` it uses (if more than one is present), and which group development dependencies are included in. When a `gemspec` dependency encounters version conflicts during resolution, the local version under development will always be selected -- even if there are remote versions that better match other requirements for the `gemspec` gem. ## SOURCE PRIORITY When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order: 1. The source explicitly attached to the gem (using `:source`, `:path`, or `:git`) 2. For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from `rubygems.org` 3. The sources specified via global `source` lines, searching each source in your `Gemfile` from last added to first added. bundler-1.16.1/man/bundle-update.ronn0000644000175000017500000003047613217261023020220 0ustar samuelophsamuelophbundle-update(1) -- Update your gems to the latest available versions ===================================================================== ## SYNOPSIS `bundle update` <*gems> [--group=NAME] [--source=NAME] [--local] [--ruby] [--bundler[=VERSION]] [--full-index] [--jobs=JOBS] [--quiet] [--force] [--patch|--minor|--major] [--strict] [--conservative] ## DESCRIPTION Update the gems specified (all gems, if none are specified), ignoring the previously installed gems specified in the `Gemfile.lock`. In general, you should use [bundle install(1)][bundle-install] to install the same exact gems and versions across machines. You would use `bundle update` to explicitly update the version of a gem. ## OPTIONS * `--group=`, `-g=[]`: Only update the gems in the specified group. For instance, you can update all gems in the development group with `bundle update --group development`. You can also call `bundle update rails --group test` to update the rails gem and all gems in the test group, for example. * `--source=`: The name of a `:git` or `:path` source used in the Gemfile(5). For instance, with a `:git` source of `http://github.com/rails/rails.git`, you would call `bundle update --source rails` * `--local`: Do not attempt to fetch gems remotely and use the gem cache instead. * `--ruby`: Update the locked version of Ruby to the current version of Ruby. * `--bundler`: Update the locked version of bundler to the invoked bundler version. * `--full-index`: Fall back to using the single-file index of all gems. * `--jobs=[]`, `-j[]`: Specify the number of jobs to run in parallel. The default is `1`. * `--retry=[]`: Retry failed network or git requests for times. * `--quiet`: Only output warnings and errors. * `--force`: Force downloading every gem. * `--patch`: Prefer updating only to next patch version. * `--minor`: Prefer updating only to next minor version. * `--major`: Prefer updating to next major version (default). * `--strict`: Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`. * `--conservative`: Use bundle install conservative update behavior and do not allow shared dependencies to be updated. ## UPDATING ALL GEMS If you run `bundle update` with no parameters, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources. Consider the following Gemfile(5): source "https://rubygems.org" gem "rails", "3.0.0.rc" gem "nokogiri" When you run [bundle install(1)][bundle-install] the first time, bundler will resolve all of the dependencies, all the way down, and install what you need: Fetching gem metadata from https://rubygems.org/......... Resolving dependencies... Installing builder 2.1.2 Installing abstract 1.0.0 Installing rack 1.2.8 Using bundler 1.7.6 Installing rake 10.4.0 Installing polyglot 0.3.5 Installing mime-types 1.25.1 Installing i18n 0.4.2 Installing mini_portile 0.6.1 Installing tzinfo 0.3.42 Installing rack-mount 0.6.14 Installing rack-test 0.5.7 Installing treetop 1.4.15 Installing thor 0.14.6 Installing activesupport 3.0.0.rc Installing erubis 2.6.6 Installing activemodel 3.0.0.rc Installing arel 0.4.0 Installing mail 2.2.20 Installing activeresource 3.0.0.rc Installing actionpack 3.0.0.rc Installing activerecord 3.0.0.rc Installing actionmailer 3.0.0.rc Installing railties 3.0.0.rc Installing rails 3.0.0.rc Installing nokogiri 1.6.5 Bundle complete! 2 Gemfile dependencies, 26 gems total. Use `bundle show [gemname]` to see where a bundled gem is installed. As you can see, even though you have two gems in the Gemfile(5), your application needs 26 different gems in order to run. Bundler remembers the exact versions it installed in `Gemfile.lock`. The next time you run [bundle install(1)][bundle-install], bundler skips the dependency resolution and installs the same gems as it installed last time. After checking in the `Gemfile.lock` into version control and cloning it on another machine, running [bundle install(1)][bundle-install] will _still_ install the gems that you installed last time. You don't need to worry that a new release of `erubis` or `mail` changes the gems you use. However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gemfile(5). To do this, run `bundle update`, which will ignore the `Gemfile.lock`, and resolve all the dependencies again. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran `bundle update`. ## UPDATING A LIST OF GEMS Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the `Gemfile.lock`. For instance, in the scenario above, imagine that `nokogiri` releases version `1.4.4`, and you want to update it _without_ updating Rails and all of its dependencies. To do this, run `bundle update nokogiri`. Bundler will update `nokogiri` and any of its dependencies, but leave alone Rails and its dependencies. ## OVERLAPPING DEPENDENCIES Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second-level dependency. For instance, consider the case of `thin` and `rack-perftools-profiler`. source "https://rubygems.org" gem "thin" gem "rack-perftools-profiler" The `thin` gem depends on `rack >= 1.0`, while `rack-perftools-profiler` depends on `rack ~> 1.0`. If you run bundle install, you get: Fetching source index for https://rubygems.org/ Installing daemons (1.1.0) Installing eventmachine (0.12.10) with native extensions Installing open4 (1.0.1) Installing perftools.rb (0.4.7) with native extensions Installing rack (1.2.1) Installing rack-perftools_profiler (0.0.2) Installing thin (1.2.7) with native extensions Using bundler (1.0.0.rc.3) In this case, the two gems have their own set of dependencies, but they share `rack` in common. If you run `bundle update thin`, bundler will update `daemons`, `eventmachine` and `rack`, which are dependencies of `thin`, but not `open4` or `perftools.rb`, which are dependencies of `rack-perftools_profiler`. Note that `bundle update thin` will update `rack` even though it's _also_ a dependency of `rack-perftools_profiler`. In short, by default, when you update a gem using `bundle update`, bundler will update all dependencies of that gem, including those that are also dependencies of another gem. To prevent updating shared dependencies, prior to version 1.14 the only option was the `CONSERVATIVE UPDATING` behavior in [bundle install(1)][bundle-install]: In this scenario, updating the `thin` version manually in the Gemfile(5), and then running [bundle install(1)][bundle-install] will only update `daemons` and `eventmachine`, but not `rack`. For more information, see the `CONSERVATIVE UPDATING` section of [bundle install(1)][bundle-install]. Starting with 1.14, specifying the `--conservative` option will also prevent shared dependencies from being updated. ## PATCH LEVEL OPTIONS Version 1.14 introduced 4 patch-level options that will influence how gem versions are resolved. One of the following options can be used: `--patch`, `--minor` or `--major`. `--strict` can be added to further influence resolution. * `--patch`: Prefer updating only to next patch version. * `--minor`: Prefer updating only to next minor version. * `--major`: Prefer updating to next major version (default). * `--strict`: Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`. When Bundler is resolving what versions to use to satisfy declared requirements in the Gemfile or in parent gems, it looks up all available versions, filters out any versions that don't satisfy the requirement, and then, by default, sorts them from newest to oldest, considering them in that order. Providing one of the patch level options (e.g. `--patch`) changes the sort order of the satisfying versions, causing Bundler to consider the latest `--patch` or `--minor` version available before other versions. Note that versions outside the stated patch level could still be resolved to if necessary to find a suitable dependency graph. For example, if gem 'foo' is locked at 1.0.2, with no gem requirement defined in the Gemfile, and versions 1.0.3, 1.0.4, 1.1.0, 1.1.1, 2.0.0 all exist, the default order of preference by default (`--major`) will be "2.0.0, 1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2". If the `--patch` option is used, the order of preference will change to "1.0.4, 1.0.3, 1.0.2, 1.1.1, 1.1.0, 2.0.0". If the `--minor` option is used, the order of preference will change to "1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2, 2.0.0". Combining the `--strict` option with any of the patch level options will remove any versions beyond the scope of the patch level option, to ensure that no gem is updated that far. To continue the previous example, if both `--patch` and `--strict` options are used, the available versions for resolution would be "1.0.4, 1.0.3, 1.0.2". If `--minor` and `--strict` are used, it would be "1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2". Gem requirements as defined in the Gemfile will still be the first determining factor for what versions are available. If the gem requirement for `foo` in the Gemfile is '~> 1.0', that will accomplish the same thing as providing the `--minor` and `--strict` options. ## PATCH LEVEL EXAMPLES Given the following gem specifications: foo 1.4.3, requires: ~> bar 2.0 foo 1.4.4, requires: ~> bar 2.0 foo 1.4.5, requires: ~> bar 2.1 foo 1.5.0, requires: ~> bar 2.1 foo 1.5.1, requires: ~> bar 3.0 bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1, 3.0.0 Gemfile: gem 'foo' Gemfile.lock: foo (1.4.3) bar (~> 2.0) bar (2.0.3) Cases: # Command Line Result ------------------------------------------------------------ 1 bundle update --patch 'foo 1.4.5', 'bar 2.1.1' 2 bundle update --patch foo 'foo 1.4.5', 'bar 2.1.1' 3 bundle update --minor 'foo 1.5.1', 'bar 3.0.0' 4 bundle update --minor --strict 'foo 1.5.0', 'bar 2.1.1' 5 bundle update --patch --strict 'foo 1.4.4', 'bar 2.0.4' In case 1, bar is upgraded to 2.1.1, a minor version increase, because the dependency from foo 1.4.5 required it. In case 2, only foo is requested to be unlocked, but bar is also allowed to move because it's not a declared dependency in the Gemfile. In case 3, bar goes up a whole major release, because a minor increase is preferred now for foo, and when it goes to 1.5.1, it requires 3.0.0 of bar. In case 4, foo is preferred up to a minor version, but 1.5.1 won't work because the --strict flag removes bar 3.0.0 from consideration since it's a major increment. In case 5, both foo and bar have any minor or major increments removed from consideration because of the --strict flag, so the most they can move is up to 1.4.4 and 2.0.4. ## RECOMMENDED WORKFLOW In general, when working with an application managed with bundler, you should use the following workflow: * After you create your Gemfile(5) for the first time, run $ bundle install * Check the resulting `Gemfile.lock` into version control $ git add Gemfile.lock * When checking out this repository on another development machine, run $ bundle install * When checking out this repository on a deployment machine, run $ bundle install --deployment * After changing the Gemfile(5) to reflect a new or update dependency, run $ bundle install * Make sure to check the updated `Gemfile.lock` into version control $ git add Gemfile.lock * If [bundle install(1)][bundle-install] reports a conflict, manually update the specific gems that you changed in the Gemfile(5) $ bundle update rails thin * If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run $ bundle update bundler-1.16.1/man/bundle-viz.1.txt0000644000175000017500000000166213217261023017543 0ustar samuelophsamuelophBUNDLE-VIZ(1) BUNDLE-VIZ(1) NAME bundle-viz - Generates a visual dependency graph for your Gemfile SYNOPSIS bundle viz [--file=FILE] [--format=FORMAT] [--requirements] [--version] [--without=GROUP GROUP] DESCRIPTION viz generates a PNG file of the current Gemfile(5) as a dependency graph. viz requires the ruby-graphviz gem (and its dependencies). The associated gems must also be installed via bundle install(1). OPTIONS --file, -f The name to use for the generated file. See --format option --format, -F This is output format option. Supported format is png, jpg, svg, dot ... --requirements, -R Set to show the version of each required dependency. --version, -v Set to show each gem version. --without, -W Exclude gems that are part of the specified named group. July 2017 BUNDLE-VIZ(1) bundler-1.16.1/man/bundle-lock.ronn0000644000175000017500000000572613217261023017666 0ustar samuelophsamuelophbundle-lock(1) -- Creates / Updates a lockfile without installing ================================================================= ## SYNOPSIS `bundle lock` [--update] [--local] [--print] [--lockfile=PATH] [--full-index] [--add-platform] [--remove-platform] [--patch] [--minor] [--major] [--strict] [--conservative] ## DESCRIPTION Lock the gems specified in Gemfile. ## OPTIONS * `--update=<*gems>`: Ignores the existing lockfile. Resolve then updates lockfile. Taking a list of gems or updating all gems if no list is given. * `--local`: Do not attempt to connect to `rubygems.org`. Instead, Bundler will use the gems already present in Rubygems' cache or in `vendor/cache`. Note that if a appropriate platform-specific gem exists on `rubygems.org` it will not be found. * `--print`: Prints the lockfile to STDOUT instead of writing to the file system. * `--lockfile=`: The path where the lockfile should be written to. * `--full-index`: Fall back to using the single-file index of all gems. * `--add-platform`: Add a new platform to the lockfile, re-resolving for the addition of that platform. * `--remove-platform`: Remove a platform from the lockfile. * `--patch`: If updating, prefer updating only to next patch version. * `--minor`: If updating, prefer updating only to next minor version. * `--major`: If updating, prefer updating to next major version (default). * `--strict`: If updating, do not allow any gem to be updated past latest --patch | --minor | --major. * `--conservative`: If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated. ## UPDATING ALL GEMS If you run `bundle lock` with `--update` option without list of gems, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources. ## UPDATING A LIST OF GEMS Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the `Gemfile.lock`. For instance, you only want to update `nokogiri`, run `bundle lock --update nokogiri`. Bundler will update `nokogiri` and any of its dependencies, but leave the rest of the gems that you specified locked to the versions in the `Gemfile.lock`. ## SUPPORTING OTHER PLATFORMS If you want your bundle to support platforms other than the one you're running locally, you can run `bundle lock --add-platform PLATFORM` to add PLATFORM to the lockfile, force bundler to re-resolve and consider the new platform when picking gems, all without needing to have a machine that matches PLATFORM handy to install those platform-specific gems on. For a full explanation of gem platforms, see `gem help platform`. ## PATCH LEVEL OPTIONS See [bundle update(1)][bundle-update] for details. bundler-1.16.1/man/bundle-update.1.txt0000644000175000017500000003227113217261023020215 0ustar samuelophsamuelophBUNDLE-UPDATE(1) BUNDLE-UPDATE(1) NAME bundle-update - Update your gems to the latest available versions SYNOPSIS bundle update *gems [--group=NAME] [--source=NAME] [--local] [--ruby] [--bundler[=VERSION]] [--full-index] [--jobs=JOBS] [--quiet] [--force] [--patch|--minor|--major] [--strict] [--conservative] DESCRIPTION Update the gems specified (all gems, if none are specified), ignoring the previously installed gems specified in the Gemfile.lock. In gen- eral, you should use [bundle install(1)][bundle-install] to install the same exact gems and versions across machines. You would use bundle update to explicitly update the version of a gem. OPTIONS --group=, -g=[] Only update the gems in the specified group. For instance, you can update all gems in the development group with bundle update --group development. You can also call bundle update rails --group test to update the rails gem and all gems in the test group, for example. --source= The name of a :git or :path source used in the Gemfile(5). For instance, with a :git source of http://github.com/rails/rails.git, you would call bundle update --source rails --local Do not attempt to fetch gems remotely and use the gem cache instead. --ruby Update the locked version of Ruby to the current version of Ruby. --bundler Update the locked version of bundler to the invoked bundler ver- sion. --full-index Fall back to using the single-file index of all gems. --jobs=[], -j[] Specify the number of jobs to run in parallel. The default is 1. --retry=[] Retry failed network or git requests for number times. --quiet Only output warnings and errors. --force Force downloading every gem. --patch Prefer updating only to next patch version. --minor Prefer updating only to next minor version. --major Prefer updating to next major version (default). --strict Do not allow any gem to be updated past latest --patch | --minor | --major. --conservative Use bundle install conservative update behavior and do not allow shared dependencies to be updated. UPDATING ALL GEMS If you run bundle update with no parameters, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources. Consider the following Gemfile(5): source "https://rubygems.org" gem "rails", "3.0.0.rc" gem "nokogiri" When you run [bundle install(1)][bundle-install] the first time, bundler will resolve all of the dependencies, all the way down, and install what you need: Fetching gem metadata from https://rubygems.org/......... Resolving dependencies... Installing builder 2.1.2 Installing abstract 1.0.0 Installing rack 1.2.8 Using bundler 1.7.6 Installing rake 10.4.0 Installing polyglot 0.3.5 Installing mime-types 1.25.1 Installing i18n 0.4.2 Installing mini_portile 0.6.1 Installing tzinfo 0.3.42 Installing rack-mount 0.6.14 Installing rack-test 0.5.7 Installing treetop 1.4.15 Installing thor 0.14.6 Installing activesupport 3.0.0.rc Installing erubis 2.6.6 Installing activemodel 3.0.0.rc Installing arel 0.4.0 Installing mail 2.2.20 Installing activeresource 3.0.0.rc Installing actionpack 3.0.0.rc Installing activerecord 3.0.0.rc Installing actionmailer 3.0.0.rc Installing railties 3.0.0.rc Installing rails 3.0.0.rc Installing nokogiri 1.6.5 Bundle complete! 2 Gemfile dependencies, 26 gems total. Use `bundle show [gemname]` to see where a bundled gem is installed. As you can see, even though you have two gems in the Gemfile(5), your application needs 26 different gems in order to run. Bundler remembers the exact versions it installed in Gemfile.lock. The next time you run [bundle install(1)][bundle-install], bundler skips the dependency reso- lution and installs the same gems as it installed last time. After checking in the Gemfile.lock into version control and cloning it on another machine, running [bundle install(1)][bundle-install] will still install the gems that you installed last time. You don't need to worry that a new release of erubis or mail changes the gems you use. However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gem- file(5). To do this, run bundle update, which will ignore the Gemfile.lock, and resolve all the dependencies again. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran bundle update. UPDATING A LIST OF GEMS Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the Gemfile.lock. For instance, in the scenario above, imagine that nokogiri releases version 1.4.4, and you want to update it without updating Rails and all of its dependencies. To do this, run bundle update nokogiri. Bundler will update nokogiri and any of its dependencies, but leave alone Rails and its dependencies. OVERLAPPING DEPENDENCIES Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second-level dependency. For instance, consider the case of thin and rack-perftools-profiler. source "https://rubygems.org" gem "thin" gem "rack-perftools-profiler" The thin gem depends on rack >= 1.0, while rack-perftools-profiler depends on rack ~> 1.0. If you run bundle install, you get: Fetching source index for https://rubygems.org/ Installing daemons (1.1.0) Installing eventmachine (0.12.10) with native extensions Installing open4 (1.0.1) Installing perftools.rb (0.4.7) with native extensions Installing rack (1.2.1) Installing rack-perftools_profiler (0.0.2) Installing thin (1.2.7) with native extensions Using bundler (1.0.0.rc.3) In this case, the two gems have their own set of dependencies, but they share rack in common. If you run bundle update thin, bundler will update daemons, eventmachine and rack, which are dependencies of thin, but not open4 or perftools.rb, which are dependencies of rack-perftools_profiler. Note that bundle update thin will update rack even though it's also a dependency of rack-perftools_profiler. In short, by default, when you update a gem using bundle update, bundler will update all dependencies of that gem, including those that are also dependencies of another gem. To prevent updating shared dependencies, prior to version 1.14 the only option was the CONSERVATIVE UPDATING behavior in [bundle install(1)][bundle-install]: In this scenario, updating the thin version manually in the Gemfile(5), and then running [bundle install(1)][bundle-install] will only update daemons and eventmachine, but not rack. For more information, see the CONSERVATIVE UPDATING section of [bundle install(1)][bundle-install]. Starting with 1.14, specifying the --conservative option will also pre- vent shared dependencies from being updated. PATCH LEVEL OPTIONS Version 1.14 introduced 4 patch-level options that will influence how gem versions are resolved. One of the following options can be used: --patch, --minor or --major. --strict can be added to further influence resolution. --patch Prefer updating only to next patch version. --minor Prefer updating only to next minor version. --major Prefer updating to next major version (default). --strict Do not allow any gem to be updated past latest --patch | --minor | --major. When Bundler is resolving what versions to use to satisfy declared requirements in the Gemfile or in parent gems, it looks up all avail- able versions, filters out any versions that don't satisfy the require- ment, and then, by default, sorts them from newest to oldest, consider- ing them in that order. Providing one of the patch level options (e.g. --patch) changes the sort order of the satisfying versions, causing Bundler to consider the latest --patch or --minor version available before other versions. Note that versions outside the stated patch level could still be resolved to if necessary to find a suitable dependency graph. For example, if gem 'foo' is locked at 1.0.2, with no gem requirement defined in the Gemfile, and versions 1.0.3, 1.0.4, 1.1.0, 1.1.1, 2.0.0 all exist, the default order of preference by default (--major) will be "2.0.0, 1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2". If the --patch option is used, the order of preference will change to "1.0.4, 1.0.3, 1.0.2, 1.1.1, 1.1.0, 2.0.0". If the --minor option is used, the order of preference will change to "1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2, 2.0.0". Combining the --strict option with any of the patch level options will remove any versions beyond the scope of the patch level option, to ensure that no gem is updated that far. To continue the previous example, if both --patch and --strict options are used, the available versions for resolution would be "1.0.4, 1.0.3, 1.0.2". If --minor and --strict are used, it would be "1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2". Gem requirements as defined in the Gemfile will still be the first determining factor for what versions are available. If the gem require- ment for foo in the Gemfile is '~> 1.0', that will accomplish the same thing as providing the --minor and --strict options. PATCH LEVEL EXAMPLES Given the following gem specifications: foo 1.4.3, requires: ~> bar 2.0 foo 1.4.4, requires: ~> bar 2.0 foo 1.4.5, requires: ~> bar 2.1 foo 1.5.0, requires: ~> bar 2.1 foo 1.5.1, requires: ~> bar 3.0 bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1, 3.0.0 Gemfile: gem 'foo' Gemfile.lock: foo (1.4.3) bar (~> 2.0) bar (2.0.3) Cases: # Command Line Result ------------------------------------------------------------ 1 bundle update --patch 'foo 1.4.5', 'bar 2.1.1' 2 bundle update --patch foo 'foo 1.4.5', 'bar 2.1.1' 3 bundle update --minor 'foo 1.5.1', 'bar 3.0.0' 4 bundle update --minor --strict 'foo 1.5.0', 'bar 2.1.1' 5 bundle update --patch --strict 'foo 1.4.4', 'bar 2.0.4' In case 1, bar is upgraded to 2.1.1, a minor version increase, because the dependency from foo 1.4.5 required it. In case 2, only foo is requested to be unlocked, but bar is also allowed to move because it's not a declared dependency in the Gemfile. In case 3, bar goes up a whole major release, because a minor increase is preferred now for foo, and when it goes to 1.5.1, it requires 3.0.0 of bar. In case 4, foo is preferred up to a minor version, but 1.5.1 won't work because the --strict flag removes bar 3.0.0 from consideration since it's a major increment. In case 5, both foo and bar have any minor or major increments removed from consideration because of the --strict flag, so the most they can move is up to 1.4.4 and 2.0.4. RECOMMENDED WORKFLOW In general, when working with an application managed with bundler, you should use the following workflow: o After you create your Gemfile(5) for the first time, run $ bundle install o Check the resulting Gemfile.lock into version control $ git add Gemfile.lock o When checking out this repository on another development machine, run $ bundle install o When checking out this repository on a deployment machine, run $ bundle install --deployment o After changing the Gemfile(5) to reflect a new or update depen- dency, run $ bundle install o Make sure to check the updated Gemfile.lock into version control $ git add Gemfile.lock o If [bundle install(1)][bundle-install] reports a conflict, manually update the specific gems that you changed in the Gemfile(5) $ bundle update rails thin o If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run $ bundle update July 2017 BUNDLE-UPDATE(1) bundler-1.16.1/man/bundle-init.10000644000175000017500000000122113217261023017047 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-INIT" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-init\fR \- Generates a Gemfile into the current working directory . .SH "SYNOPSIS" \fBbundle init\fR [\-\-gemspec=FILE] . .SH "DESCRIPTION" Init generates a default \fBGemfile(5)\fR in the current working directory\. When adding a \fBGemfile(5)\fR to a gem with a gemspec, the \fB\-\-gemspec\fR option will automatically add each dependency listed in the gemspec file to the newly created \fBGemfile(5)\fR\. . .SH "OPTIONS" . .TP \fB\-\-gemspec\fR Use the specified \.gemspec to create the \fBGemfile(5)\fR bundler-1.16.1/man/bundle-check.1.txt0000644000175000017500000000155013217261023020004 0ustar samuelophsamuelophBUNDLE-CHECK(1) BUNDLE-CHECK(1) NAME bundle-check - Verifies if dependencies are satisfied by installed gems SYNOPSIS bundle check [--dry-run] [--gemfile=FILE] [--path=PATH] DESCRIPTION check searches the local machine for each of the gems requested in the Gemfile. If all gems are found, Bundler prints a success message and exits with a status of 0. If not, the first missing gem is listed and Bundler exits status 1. OPTIONS --dry-run Locks the Gemfile(5) before running the command. --gemfile Use the specified gemfile instead of the Gemfile(5) --path Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine. February 2017 BUNDLE-CHECK(1) bundler-1.16.1/man/bundle-inject.10000644000175000017500000000127013217261023017364 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-INJECT" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile . .SH "SYNOPSIS" \fBbundle inject\fR [GEM] [VERSION] . .SH "DESCRIPTION" Adds the named gem(s) with their version requirements to the resolved \fBGemfile(5)\fR\. . .P This command will add the gem to both your \fBGemfile(5)\fR and Gemfile\.lock if it isn\'t listed yet\. . .P Example: . .IP "" 4 . .nf bundle install bundle inject \'rack\' \'> 0\' . .fi . .IP "" 0 . .P This will inject the \'rack\' gem with a version greater than 0 in your \fBGemfile(5)\fR and Gemfile\.lock bundler-1.16.1/man/bundle.1.txt0000644000175000017500000000604113217261023016731 0ustar samuelophsamuelophBUNDLE(1) BUNDLE(1) NAME bundle - Ruby Dependency Management SYNOPSIS bundle COMMAND [--no-color] [--verbose] [ARGS] DESCRIPTION Bundler manages an application's dependencies through its entire life across many machines systematically and repeatably. See the bundler website http://bundler.io for information on getting started, and Gemfile(5) for more information on the Gemfile format. OPTIONS --no-color Print all output without color --retry, -r Specify the number of times you wish to attempt network commands --verbose, -V Print out additional logging information BUNDLE COMMANDS We divide bundle subcommands into primary commands and utilities. PRIMARY COMMANDS [bundle install(1)][bundle-install] Install the gems specified by the Gemfile or Gemfile.lock [bundle update(1)][bundle-update] Update dependencies to their latest versions [bundle package(1)][bundle-package] Package the .gem files required by your application into the vendor/cache directory [bundle exec(1)][bundle-exec] Execute a script in the context of the current bundle [bundle config(1)][bundle-config] Specify and read configuration options for bundler bundle help(1) Display detailed help for each subcommand UTILITIES bundle add(1) Add the named gem to the Gemfile and run bundle install bundle binstubs(1) Generate binstubs for executables in a gem bundle check(1) Determine whether the requirements for your application are installed and available to bundler bundle show(1) Show the source location of a particular gem in the bundle [bundle outdated(1)][bundle-outdated] Show all of the outdated gems in the current bundle bundle console(1) Start an IRB session in the context of the current bundle bundle open(1) Open an installed gem in the editor [bundle lock(1)][bundle-lock] Generate a lockfile for your dependencies bundle viz(1) Generate a visual representation of your dependencies bundle init(1) Generate a simple Gemfile, placed in the current directory [bundle gem(1)][bundle-gem] Create a simple gem, suitable for development with bundler [bundle platform(1)][bundle-platform] Display platform compatibility information bundle clean(1) Clean up unused gems in your bundler directory bundle doctor(1) Display warnings about common potential problems PLUGINS When running a command that isn't listed in PRIMARY COMMANDS or UTILI- TIES, Bundler will try to find an executable on your path named bundler- and execute it, passing down any extra arguments to it. OBSOLETE These commands are obsolete and should no longer be used o bundle cache(1) o bundle show(1) July 2017 BUNDLE(1) bundler-1.16.1/man/bundle-install.ronn0000644000175000017500000003551313217261023020401 0ustar samuelophsamuelophbundle-install(1) -- Install the dependencies specified in your Gemfile ======================================================================= ## SYNOPSIS `bundle install` [--binstubs[=DIRECTORY]] [--clean] [--deployment] [--force] [--frozen] [--full-index] [--gemfile=GEMFILE] [--jobs=NUMBER] [--local] [--no-cache] [--no-prune] [--path PATH] [--quiet] [--retry=NUMBER] [--shebang] [--standalone[=GROUP[ GROUP...]]] [--system] [--trust-policy=POLICY] [--with=GROUP[ GROUP...]] [--without=GROUP[ GROUP...]] ## DESCRIPTION Install the gems specified in your Gemfile(5). If this is the first time you run bundle install (and a `Gemfile.lock` does not exist), Bundler will fetch all remote sources, resolve dependencies and install all needed gems. If a `Gemfile.lock` does exist, and you have not updated your Gemfile(5), Bundler will fetch all remote sources, but use the dependencies specified in the `Gemfile.lock` instead of resolving dependencies. If a `Gemfile.lock` does exist, and you have updated your Gemfile(5), Bundler will use the dependencies in the `Gemfile.lock` for all gems that you did not update, but will re-resolve the dependencies of gems that you did update. You can find more information about this update process below under [CONSERVATIVE UPDATING][]. ## OPTIONS To apply any of `--binstubs`, `--deployment`, `--path`, or `--without` every time `bundle install` is run, use `bundle config` (see bundle-config(1)). * `--binstubs[=]`: Creates a directory (defaults to `~/bin`) and place any executables from the gem there. These executables run in Bundler's context. If used, you might add this directory to your environment's `PATH` variable. For instance, if the `rails` gem comes with a `rails` executable, this flag will create a `bin/rails` executable that ensures that all referred dependencies will be resolved using the bundled gems. * `--clean`: On finishing the installation Bundler is going to remove any gems not present in the current Gemfile(5). Don't worry, gems currently in use will not be removed. * `--deployment`: In [deployment mode][DEPLOYMENT MODE], Bundler will 'roll-out' the bundle for production or CI use. Please check carefully if you want to have this option enabled in your development environment. * `--force`: Force download every gem, even if the required versions are already available locally. * `--frozen`: Do not allow the Gemfile.lock to be updated after this install. Exits non-zero if there are going to be changes to the Gemfile.lock. * `--full-index`: Bundler will not call Rubygems' API endpoint (default) but download and cache a (currently big) index file of all gems. Performance can be improved for large bundles that seldom change by enabling this option. * `--gemfile=`: The location of the Gemfile(5) which Bundler should use. This defaults to a Gemfile(5) in the current working directory. In general, Bundler will assume that the location of the Gemfile(5) is also the project's root and will try to find `Gemfile.lock` and `vendor/cache` relative to this location. * `--jobs=[]`, `-j[]`: The maximum number of parallel download and install jobs. The default is `1`. * `--local`: Do not attempt to connect to `rubygems.org`. Instead, Bundler will use the gems already present in Rubygems' cache or in `vendor/cache`. Note that if a appropriate platform-specific gem exists on `rubygems.org` it will not be found. * `--no-cache`: Do not update the cache in `vendor/cache` with the newly bundled gems. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install. * `--no-prune`: Don't remove stale gems from the cache when the installation finishes. * `--path=`: The location to install the specified gems to. This defaults to Rubygems' setting. Bundler shares this location with Rubygems, `gem install ...` will have gem installed there, too. Therefore, gems installed without a `--path ...` setting will show up by calling `gem list`. Accordingly, gems installed to other locations will not get listed. * `--quiet`: Do not print progress information to the standard output. Instead, Bundler will exit using a status code (`$?`). * `--retry=[]`: Retry failed network or git requests for times. * `--shebang=`: Uses the specified ruby executable (usually `ruby`) to execute the scripts created with `--binstubs`. In addition, if you use `--binstubs` together with `--shebang jruby` these executables will be changed to execute `jruby` instead. * `--standalone[=]`: Makes a bundle that can work without depending on Rubygems or Bundler at runtime. A space separated list of groups to install has to be specified. Bundler creates a directory named `bundle` and installs the bundle there. It also generates a `bundle/bundler/setup.rb` file to replace Bundler's own setup in the manner required. Using this option implicitly sets `path`, which is a [remembered option][REMEMBERED OPTIONS]. * `--system`: Installs the gems specified in the bundle to the system's Rubygems location. This overrides any previous configuration of `--path`. * `--trust-policy=[]`: Apply the Rubygems security policy , where policy is one of `HighSecurity`, `MediumSecurity`, `LowSecurity`, `AlmostNoSecurity`, or `NoSecurity`. For more details, please see the Rubygems signing documentation linked below in [SEE ALSO][]. * `--with=`: A space-separated list of groups referencing gems to install. If an optional group is given it is installed. If a group is given that is in the remembered list of groups given to --without, it is removed from that list. * `--without=`: A space-separated list of groups referencing gems to skip during installation. If a group is given that is in the remembered list of groups given to --with, it is removed from that list. ## DEPLOYMENT MODE Bundler's defaults are optimized for development. To switch to defaults optimized for deployment and for CI, use the `--deployment` flag. Do not activate deployment mode on development machines, as it will cause an error when the Gemfile(5) is modified. 1. A `Gemfile.lock` is required. To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a `Gemfile.lock` is required. This is mainly to ensure that you remember to check your `Gemfile.lock` into version control. 2. The `Gemfile.lock` must be up to date In development, you can modify your Gemfile(5) and re-run `bundle install` to [conservatively update][CONSERVATIVE UPDATING] your `Gemfile.lock` snapshot. In deployment, your `Gemfile.lock` should be up-to-date with changes made in your Gemfile(5). 3. Gems are installed to `vendor/bundle` not your default system location In development, it's convenient to share the gems used in your application with other applications and other scripts that run on the system. In deployment, isolation is a more important default. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permission to read them. As a result, `bundle install --deployment` installs gems to the `vendor/bundle` directory in the application. This may be overridden using the `--path` option. ## SUDO USAGE By default, Bundler installs gems to the same location as `gem install`. In some cases, that location may not be writable by your Unix user. In that case, Bundler will stage everything in a temporary directory, then ask you for your `sudo` password in order to copy the gems into their system location. From your perspective, this is identical to installing the gems directly into the system. You should never use `sudo bundle install`. This is because several other steps in `bundle install` must be performed as the current user: * Updating your `Gemfile.lock` * Updating your `vendor/cache`, if necessary * Checking out private git repositories using your user's SSH keys Of these three, the first two could theoretically be performed by `chown`ing the resulting files to `$SUDO_USER`. The third, however, can only be performed by invoking the `git` command as the current user. Therefore, git gems are downloaded and installed into `~/.bundle` rather than $GEM_HOME or $BUNDLE_PATH. As a result, you should run `bundle install` as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location. ## INSTALLING GROUPS By default, `bundle install` will install all gems in all groups in your Gemfile(5), except those declared for a different platform. However, you can explicitly tell Bundler to skip installing certain groups with the `--without` option. This option takes a space-separated list of groups. While the `--without` option will skip _installing_ the gems in the specified groups, it will still _download_ those gems and use them to resolve the dependencies of every gem in your Gemfile(5). This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against. `Bundler offers a rock-solid guarantee that the third-party code you are running in development and testing is also the third-party code you are running in production. You can choose to exclude some of that code in different environments, but you will never be caught flat-footed by different versions of third-party code being used in different environments.` For a simple illustration, consider the following Gemfile(5): source 'https://rubygems.org' gem 'sinatra' group :production do gem 'rack-perftools-profiler' end In this case, `sinatra` depends on any version of Rack (`>= 1.0`), while `rack-perftools-profiler` depends on 1.x (`~> 1.0`). When you run `bundle install --without production` in development, we look at the dependencies of `rack-perftools-profiler` as well. That way, you do not spend all your time developing against Rack 2.0, using new APIs unavailable in Rack 1.x, only to have Bundler switch to Rack 1.2 when the `production` group _is_ used. This should not cause any problems in practice, because we do not attempt to `install` the gems in the excluded groups, and only evaluate as part of the dependency resolution process. This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production. Because of the vagaries of the dependency resolution process, this usually affects more than the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using. ## THE GEMFILE.LOCK When you run `bundle install`, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called `Gemfile.lock`. Bundler uses this file in all subsequent calls to `bundle install`, which guarantees that you always use the same exact code, even as your application moves across machines. Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies. As a result, you `SHOULD` check your `Gemfile.lock` into version control. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third-party code being used if `any` of the gems in the Gemfile(5) or any of their dependencies have been updated. ## CONSERVATIVE UPDATING When you make a change to the Gemfile(5) and then run `bundle install`, Bundler will update only the gems that you modified. In other words, if a gem that you `did not modify` worked before you called `bundle install`, it will continue to use the exact same versions of all dependencies as it used before the update. Let's take a look at an example. Here's your original Gemfile(5): source 'https://rubygems.org' gem 'actionpack', '2.3.8' gem 'activemerchant' In this case, both `actionpack` and `activemerchant` depend on `activesupport`. The `actionpack` gem depends on `activesupport 2.3.8` and `rack ~> 1.1.0`, while the `activemerchant` gem depends on `activesupport >= 2.3.2`, `braintree >= 2.0.0`, and `builder >= 2.0.0`. When the dependencies are first resolved, Bundler will select `activesupport 2.3.8`, which satisfies the requirements of both gems in your Gemfile(5). Next, you modify your Gemfile(5) to: source 'https://rubygems.org' gem 'actionpack', '3.0.0.rc' gem 'activemerchant' The `actionpack 3.0.0.rc` gem has a number of new dependencies, and updates the `activesupport` dependency to `= 3.0.0.rc` and the `rack` dependency to `~> 1.2.1`. When you run `bundle install`, Bundler notices that you changed the `actionpack` gem, but not the `activemerchant` gem. It evaluates the gems currently being used to satisfy its requirements: * `activesupport 2.3.8`: also used to satisfy a dependency in `activemerchant`, which is not being updated * `rack ~> 1.1.0`: not currently being used to satisfy another dependency Because you did not explicitly ask to update `activemerchant`, you would not expect it to suddenly stop working after updating `actionpack`. However, satisfying the new `activesupport 3.0.0.rc` dependency of actionpack requires updating one of its dependencies. Even though `activemerchant` declares a very loose dependency that theoretically matches `activesupport 3.0.0.rc`, Bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies. In this case, the `activemerchant` dependency is treated as `activemerchant 1.7.1 + activesupport 2.3.8`, so `bundle install` will report that it cannot update `actionpack`. To explicitly update `actionpack`, including its dependencies which other gems in the Gemfile(5) still depend on, run `bundle update actionpack` (see `bundle update(1)`). `Summary`: In general, after making a change to the Gemfile(5) , you should first try to run `bundle install`, which will guarantee that no other gem in the Gemfile(5) is impacted by the change. If that does not work, run [bundle update(1)][bundle-update]. ## SEE ALSO * [Gem install docs](http://guides.rubygems.org/rubygems-basics/#installing-gems) * [Rubygems signing docs](http://guides.rubygems.org/security/) bundler-1.16.1/man/bundle-add.1.txt0000644000175000017500000000155413217261023017463 0ustar samuelophsamuelophBUNDLE-ADD(1) BUNDLE-ADD(1) NAME bundle-add - Add gem to the Gemfile and run bundle install SYNOPSIS bundle add GEM_NAME [--group=GROUP] [--version=VERSION] [--source=SOURCE] DESCRIPTION Adds the named gem to the Gemfile and run bundle install. Example: bundle add rails bundle add rails --version "< 3.0, > 1.1" bundle add rails --version "~> 5.0.0" --source "https://gems.exam- ple.com" --group "development" bundle add rails --group "development, test" OPTIONS --version, -v Specify version requirements(s) for the added gem. --group, -g Specify the group(s) for the added gem. Multiple groups should be separated by commas. --source, , -s Specify the source for the added gem. June 2017 BUNDLE-ADD(1) bundler-1.16.1/man/bundle-pristine.10000644000175000017500000000321413217261023017745 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-PRISTINE" "1" "August 2017" "" "" . .SH "NAME" \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition . .SH "SYNOPSIS" \fBbundle pristine\fR . .SH "DESCRIPTION" \fBpristine\fR restores the installed gems in the bundle to their pristine condition using the local gem cache from RubyGems\. For git gems, a forced checkout will be performed\. . .P For further explanation, \fBbundle pristine\fR ignores unpacked files on disk\. In other words, this command utilizes the local \fB\.gem\fR cache or the gem\'s git repository as if one were installing from scratch\. . .P Note: the Bundler gem cannot be restored to its original state with \fBpristine\fR\. One also cannot use \fBbundle pristine\fR on gems with a \'path\' option in the Gemfile, because bundler has no original copy it can restore from\. . .P When is it practical to use \fBbundle pristine\fR? . .P It comes in handy when a developer is debugging a gem\. \fBbundle pristine\fR is a great way to get rid of experimental changes to a gem that one may not want\. . .P Why use \fBbundle pristine\fR over \fBgem pristine \-\-all\fR? . .P Both commands are very similar\. For context: \fBbundle pristine\fR, without arguments, cleans all gems from the lockfile\. Meanwhile, \fBgem pristine \-\-all\fR cleans all installed gems for that Ruby version\. . .P If a developer forgets which gems in their project they might have been debugging, the Rubygems \fBgem pristine [GEMNAME]\fR command may be inconvenient\. One can avoid waiting for \fBgem pristine \-\-all\fR, and instead run \fBbundle pristine\fR\. bundler-1.16.1/man/index.txt0000644000175000017500000000151613217261023016432 0ustar samuelophsamuelophGemfile(5) gemfile.5 bundle(1) bundle.1 bundle-add(1) bundle-add.1 bundle-binstubs(1) bundle-binstubs.1 bundle-check(1) bundle-check.1 bundle-clean(1) bundle-clean.1 bundle-config(1) bundle-config.1 bundle-exec(1) bundle-exec.1 bundle-gem(1) bundle-gem.1 bundle-info(1) bundle-info.1 bundle-init(1) bundle-init.1 bundle-inject(1) bundle-inject.1 bundle-install(1) bundle-install.1 bundle-list(1) bundle-list.1 bundle-lock(1) bundle-lock.1 bundle-open(1) bundle-open.1 bundle-outdated(1) bundle-outdated.1 bundle-package(1) bundle-package.1 bundle-platform(1) bundle-platform.1 bundle-pristine(1) bundle-pristine.1 bundle-show(1) bundle-show.1 bundle-update(1) bundle-update.1 bundle-viz(1) bundle-viz.1 bundler-1.16.1/man/bundle-install.10000644000175000017500000003733213217261023017566 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-INSTALL" "1" "December 2017" "" "" . .SH "NAME" \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile . .SH "SYNOPSIS" \fBbundle install\fR [\-\-binstubs[=DIRECTORY]] [\-\-clean] [\-\-deployment] [\-\-force] [\-\-frozen] [\-\-full\-index] [\-\-gemfile=GEMFILE] [\-\-jobs=NUMBER] [\-\-local] [\-\-no\-cache] [\-\-no\-prune] [\-\-path PATH] [\-\-quiet] [\-\-retry=NUMBER] [\-\-shebang] [\-\-standalone[=GROUP[ GROUP\.\.\.]]] [\-\-system] [\-\-trust\-policy=POLICY] [\-\-with=GROUP[ GROUP\.\.\.]] [\-\-without=GROUP[ GROUP\.\.\.]] . .SH "DESCRIPTION" Install the gems specified in your Gemfile(5)\. If this is the first time you run bundle install (and a \fBGemfile\.lock\fR does not exist), Bundler will fetch all remote sources, resolve dependencies and install all needed gems\. . .P If a \fBGemfile\.lock\fR does exist, and you have not updated your Gemfile(5), Bundler will fetch all remote sources, but use the dependencies specified in the \fBGemfile\.lock\fR instead of resolving dependencies\. . .P If a \fBGemfile\.lock\fR does exist, and you have updated your Gemfile(5), Bundler will use the dependencies in the \fBGemfile\.lock\fR for all gems that you did not update, but will re\-resolve the dependencies of gems that you did update\. You can find more information about this update process below under \fICONSERVATIVE UPDATING\fR\. . .SH "OPTIONS" To apply any of \fB\-\-binstubs\fR, \fB\-\-deployment\fR, \fB\-\-path\fR, or \fB\-\-without\fR every time \fBbundle install\fR is run, use \fBbundle config\fR (see bundle\-config(1))\. . .TP \fB\-\-binstubs[=]\fR Creates a directory (defaults to \fB~/bin\fR) and place any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\. . .TP \fB\-\-clean\fR On finishing the installation Bundler is going to remove any gems not present in the current Gemfile(5)\. Don\'t worry, gems currently in use will not be removed\. . .TP \fB\-\-deployment\fR In \fIdeployment mode\fR, Bundler will \'roll\-out\' the bundle for production or CI use\. Please check carefully if you want to have this option enabled in your development environment\. . .TP \fB\-\-force\fR Force download every gem, even if the required versions are already available locally\. . .TP \fB\-\-frozen\fR Do not allow the Gemfile\.lock to be updated after this install\. Exits non\-zero if there are going to be changes to the Gemfile\.lock\. . .TP \fB\-\-full\-index\fR Bundler will not call Rubygems\' API endpoint (default) but download and cache a (currently big) index file of all gems\. Performance can be improved for large bundles that seldom change by enabling this option\. . .TP \fB\-\-gemfile=\fR The location of the Gemfile(5) which Bundler should use\. This defaults to a Gemfile(5) in the current working directory\. In general, Bundler will assume that the location of the Gemfile(5) is also the project\'s root and will try to find \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to this location\. . .TP \fB\-\-jobs=[]\fR, \fB\-j[]\fR The maximum number of parallel download and install jobs\. The default is \fB1\fR\. . .TP \fB\-\-local\fR Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if a appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\. . .TP \fB\-\-no\-cache\fR Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\. . .TP \fB\-\-no\-prune\fR Don\'t remove stale gems from the cache when the installation finishes\. . .TP \fB\-\-path=\fR The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\. . .TP \fB\-\-quiet\fR Do not print progress information to the standard output\. Instead, Bundler will exit using a status code (\fB$?\fR)\. . .TP \fB\-\-retry=[]\fR Retry failed network or git requests for \fInumber\fR times\. . .TP \fB\-\-shebang=\fR Uses the specified ruby executable (usually \fBruby\fR) to execute the scripts created with \fB\-\-binstubs\fR\. In addition, if you use \fB\-\-binstubs\fR together with \fB\-\-shebang jruby\fR these executables will be changed to execute \fBjruby\fR instead\. . .TP \fB\-\-standalone[=]\fR Makes a bundle that can work without depending on Rubygems or Bundler at runtime\. A space separated list of groups to install has to be specified\. Bundler creates a directory named \fBbundle\fR and installs the bundle there\. It also generates a \fBbundle/bundler/setup\.rb\fR file to replace Bundler\'s own setup in the manner required\. Using this option implicitly sets \fBpath\fR, which is a [remembered option][REMEMBERED OPTIONS]\. . .TP \fB\-\-system\fR Installs the gems specified in the bundle to the system\'s Rubygems location\. This overrides any previous configuration of \fB\-\-path\fR\. . .TP \fB\-\-trust\-policy=[]\fR Apply the Rubygems security policy \fIpolicy\fR, where policy is one of \fBHighSecurity\fR, \fBMediumSecurity\fR, \fBLowSecurity\fR, \fBAlmostNoSecurity\fR, or \fBNoSecurity\fR\. For more details, please see the Rubygems signing documentation linked below in \fISEE ALSO\fR\. . .TP \fB\-\-with=\fR A space\-separated list of groups referencing gems to install\. If an optional group is given it is installed\. If a group is given that is in the remembered list of groups given to \-\-without, it is removed from that list\. . .TP \fB\-\-without=\fR A space\-separated list of groups referencing gems to skip during installation\. If a group is given that is in the remembered list of groups given to \-\-with, it is removed from that list\. . .SH "DEPLOYMENT MODE" Bundler\'s defaults are optimized for development\. To switch to defaults optimized for deployment and for CI, use the \fB\-\-deployment\fR flag\. Do not activate deployment mode on development machines, as it will cause an error when the Gemfile(5) is modified\. . .IP "1." 4 A \fBGemfile\.lock\fR is required\. . .IP To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a \fBGemfile\.lock\fR is required\. . .IP This is mainly to ensure that you remember to check your \fBGemfile\.lock\fR into version control\. . .IP "2." 4 The \fBGemfile\.lock\fR must be up to date . .IP In development, you can modify your Gemfile(5) and re\-run \fBbundle install\fR to \fIconservatively update\fR your \fBGemfile\.lock\fR snapshot\. . .IP In deployment, your \fBGemfile\.lock\fR should be up\-to\-date with changes made in your Gemfile(5)\. . .IP "3." 4 Gems are installed to \fBvendor/bundle\fR not your default system location . .IP In development, it\'s convenient to share the gems used in your application with other applications and other scripts that run on the system\. . .IP In deployment, isolation is a more important default\. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permission to read them\. . .IP As a result, \fBbundle install \-\-deployment\fR installs gems to the \fBvendor/bundle\fR directory in the application\. This may be overridden using the \fB\-\-path\fR option\. . .IP "" 0 . .SH "SUDO USAGE" By default, Bundler installs gems to the same location as \fBgem install\fR\. . .P In some cases, that location may not be writable by your Unix user\. In that case, Bundler will stage everything in a temporary directory, then ask you for your \fBsudo\fR password in order to copy the gems into their system location\. . .P From your perspective, this is identical to installing the gems directly into the system\. . .P You should never use \fBsudo bundle install\fR\. This is because several other steps in \fBbundle install\fR must be performed as the current user: . .IP "\(bu" 4 Updating your \fBGemfile\.lock\fR . .IP "\(bu" 4 Updating your \fBvendor/cache\fR, if necessary . .IP "\(bu" 4 Checking out private git repositories using your user\'s SSH keys . .IP "" 0 . .P Of these three, the first two could theoretically be performed by \fBchown\fRing the resulting files to \fB$SUDO_USER\fR\. The third, however, can only be performed by invoking the \fBgit\fR command as the current user\. Therefore, git gems are downloaded and installed into \fB~/\.bundle\fR rather than $GEM_HOME or $BUNDLE_PATH\. . .P As a result, you should run \fBbundle install\fR as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location\. . .SH "INSTALLING GROUPS" By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\. . .P However, you can explicitly tell Bundler to skip installing certain groups with the \fB\-\-without\fR option\. This option takes a space\-separated list of groups\. . .P While the \fB\-\-without\fR option will skip \fIinstalling\fR the gems in the specified groups, it will still \fIdownload\fR those gems and use them to resolve the dependencies of every gem in your Gemfile(5)\. . .P This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against\. . .P \fBBundler offers a rock\-solid guarantee that the third\-party code you are running in development and testing is also the third\-party code you are running in production\. You can choose to exclude some of that code in different environments, but you will never be caught flat\-footed by different versions of third\-party code being used in different environments\.\fR . .P For a simple illustration, consider the following Gemfile(5): . .IP "" 4 . .nf source \'https://rubygems\.org\' gem \'sinatra\' group :production do gem \'rack\-perftools\-profiler\' end . .fi . .IP "" 0 . .P In this case, \fBsinatra\fR depends on any version of Rack (\fB>= 1\.0\fR), while \fBrack\-perftools\-profiler\fR depends on 1\.x (\fB~> 1\.0\fR)\. . .P When you run \fBbundle install \-\-without production\fR in development, we look at the dependencies of \fBrack\-perftools\-profiler\fR as well\. That way, you do not spend all your time developing against Rack 2\.0, using new APIs unavailable in Rack 1\.x, only to have Bundler switch to Rack 1\.2 when the \fBproduction\fR group \fIis\fR used\. . .P This should not cause any problems in practice, because we do not attempt to \fBinstall\fR the gems in the excluded groups, and only evaluate as part of the dependency resolution process\. . .P This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production\. Because of the vagaries of the dependency resolution process, this usually affects more than the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using\. . .SH "THE GEMFILE\.LOCK" When you run \fBbundle install\fR, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called \fBGemfile\.lock\fR\. . .P Bundler uses this file in all subsequent calls to \fBbundle install\fR, which guarantees that you always use the same exact code, even as your application moves across machines\. . .P Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point\-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies\. . .P As a result, you \fBSHOULD\fR check your \fBGemfile\.lock\fR into version control\. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third\-party code being used if \fBany\fR of the gems in the Gemfile(5) or any of their dependencies have been updated\. . .SH "CONSERVATIVE UPDATING" When you make a change to the Gemfile(5) and then run \fBbundle install\fR, Bundler will update only the gems that you modified\. . .P In other words, if a gem that you \fBdid not modify\fR worked before you called \fBbundle install\fR, it will continue to use the exact same versions of all dependencies as it used before the update\. . .P Let\'s take a look at an example\. Here\'s your original Gemfile(5): . .IP "" 4 . .nf source \'https://rubygems\.org\' gem \'actionpack\', \'2\.3\.8\' gem \'activemerchant\' . .fi . .IP "" 0 . .P In this case, both \fBactionpack\fR and \fBactivemerchant\fR depend on \fBactivesupport\fR\. The \fBactionpack\fR gem depends on \fBactivesupport 2\.3\.8\fR and \fBrack ~> 1\.1\.0\fR, while the \fBactivemerchant\fR gem depends on \fBactivesupport >= 2\.3\.2\fR, \fBbraintree >= 2\.0\.0\fR, and \fBbuilder >= 2\.0\.0\fR\. . .P When the dependencies are first resolved, Bundler will select \fBactivesupport 2\.3\.8\fR, which satisfies the requirements of both gems in your Gemfile(5)\. . .P Next, you modify your Gemfile(5) to: . .IP "" 4 . .nf source \'https://rubygems\.org\' gem \'actionpack\', \'3\.0\.0\.rc\' gem \'activemerchant\' . .fi . .IP "" 0 . .P The \fBactionpack 3\.0\.0\.rc\fR gem has a number of new dependencies, and updates the \fBactivesupport\fR dependency to \fB= 3\.0\.0\.rc\fR and the \fBrack\fR dependency to \fB~> 1\.2\.1\fR\. . .P When you run \fBbundle install\fR, Bundler notices that you changed the \fBactionpack\fR gem, but not the \fBactivemerchant\fR gem\. It evaluates the gems currently being used to satisfy its requirements: . .TP \fBactivesupport 2\.3\.8\fR also used to satisfy a dependency in \fBactivemerchant\fR, which is not being updated . .TP \fBrack ~> 1\.1\.0\fR not currently being used to satisfy another dependency . .P Because you did not explicitly ask to update \fBactivemerchant\fR, you would not expect it to suddenly stop working after updating \fBactionpack\fR\. However, satisfying the new \fBactivesupport 3\.0\.0\.rc\fR dependency of actionpack requires updating one of its dependencies\. . .P Even though \fBactivemerchant\fR declares a very loose dependency that theoretically matches \fBactivesupport 3\.0\.0\.rc\fR, Bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies\. In this case, the \fBactivemerchant\fR dependency is treated as \fBactivemerchant 1\.7\.1 + activesupport 2\.3\.8\fR, so \fBbundle install\fR will report that it cannot update \fBactionpack\fR\. . .P To explicitly update \fBactionpack\fR, including its dependencies which other gems in the Gemfile(5) still depend on, run \fBbundle update actionpack\fR (see \fBbundle update(1)\fR)\. . .P \fBSummary\fR: In general, after making a change to the Gemfile(5) , you should first try to run \fBbundle install\fR, which will guarantee that no other gem in the Gemfile(5) is impacted by the change\. If that does not work, run [bundle update(1)][bundle\-update]\. . .SH "SEE ALSO" . .IP "\(bu" 4 Gem install docs \fIhttp://guides\.rubygems\.org/rubygems\-basics/#installing\-gems\fR . .IP "\(bu" 4 Rubygems signing docs \fIhttp://guides\.rubygems\.org/security/\fR . .IP "" 0 bundler-1.16.1/man/bundle.ronn0000644000175000017500000000542413217261023016733 0ustar samuelophsamuelophbundle(1) -- Ruby Dependency Management ======================================= ## SYNOPSIS `bundle` COMMAND [--no-color] [--verbose] [ARGS] ## DESCRIPTION Bundler manages an `application's dependencies` through its entire life across many machines systematically and repeatably. See [the bundler website](http://bundler.io) for information on getting started, and Gemfile(5) for more information on the `Gemfile` format. ## OPTIONS * `--no-color`: Print all output without color * `--retry`, `-r`: Specify the number of times you wish to attempt network commands * `--verbose`, `-V`: Print out additional logging information ## BUNDLE COMMANDS We divide `bundle` subcommands into primary commands and utilities. ## PRIMARY COMMANDS * [`bundle install(1)`][bundle-install]: Install the gems specified by the `Gemfile` or `Gemfile.lock` * [`bundle update(1)`][bundle-update]: Update dependencies to their latest versions * [`bundle package(1)`][bundle-package]: Package the .gem files required by your application into the `vendor/cache` directory * [`bundle exec(1)`][bundle-exec]: Execute a script in the context of the current bundle * [`bundle config(1)`][bundle-config]: Specify and read configuration options for bundler * `bundle help(1)`: Display detailed help for each subcommand ## UTILITIES * `bundle add(1)`: Add the named gem to the Gemfile and run `bundle install` * `bundle binstubs(1)`: Generate binstubs for executables in a gem * `bundle check(1)`: Determine whether the requirements for your application are installed and available to bundler * `bundle show(1)`: Show the source location of a particular gem in the bundle * [`bundle outdated(1)`][bundle-outdated]: Show all of the outdated gems in the current bundle * `bundle console(1)`: Start an IRB session in the context of the current bundle * `bundle open(1)`: Open an installed gem in the editor * [`bundle lock(1)`][bundle-lock]: Generate a lockfile for your dependencies * `bundle viz(1)`: Generate a visual representation of your dependencies * `bundle init(1)`: Generate a simple `Gemfile`, placed in the current directory * [`bundle gem(1)`][bundle-gem]: Create a simple gem, suitable for development with bundler * [`bundle platform(1)`][bundle-platform]: Display platform compatibility information * `bundle clean(1)`: Clean up unused gems in your bundler directory * `bundle doctor(1)`: Display warnings about common potential problems ## PLUGINS When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named `bundler-` and execute it, passing down any extra arguments to it. ## OBSOLETE These commands are obsolete and should no longer be used * `bundle cache(1)` * `bundle show(1)` bundler-1.16.1/man/bundle-gem.1.txt0000644000175000017500000000613313217261023017501 0ustar samuelophsamuelophBUNDLE-GEM(1) BUNDLE-GEM(1) NAME bundle-gem - Generate a project skeleton for creating a rubygem SYNOPSIS bundle gem GEM_NAME OPTIONS DESCRIPTION Generates a directory named GEM_NAME with a Rakefile, GEM_NAME.gemspec, and other supporting files and directories that can be used to develop a rubygem with that name. Run rake -T in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems.org. The generated project skeleton can be customized with OPTIONS, as explained below. Note that these options can also be specified via Bundler's global configuration file using the following names: o gem.coc o gem.mit o gem.test OPTIONS --exe or -b or --bin Specify that Bundler should create a binary executable (as exe/GEM_NAME) in the generated rubygem project. This binary will also be added to the GEM_NAME.gemspec manifest. This behavior is disabled by default. --no-exe Do not create a binary (overrides --exe specified in the global config). --coc Add a CODE_OF_CONDUCT.md file to the root of the generated project. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future bundle gem use. --no-coc Do not create a CODE_OF_CONDUCT.md (overrides --coc specified in the global config). --ext Add boilerplate for C extension code to the generated project. This behavior is disabled by default. --no-ext Do not add C extension code (overrides --ext specified in the global config). --mit Add an MIT license to a LICENSE.txt file in the root of the gen- erated project. Your name from the global git config is used for the copyright statement. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future bundle gem use. --no-mit Do not create a LICENSE.txt (overrides --mit specified in the global config). -t, --test=minitest, --test=rspec Specify the test framework that Bundler should use when generat- ing the project. Acceptable values are minitest and rspec. The GEM_NAME.gemspec will be configured and a skeleton test/spec directory will be created based on this option. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future bun- dle gem use. If no option is specified, the default testing framework is RSpec. -e, --edit[=EDITOR] Open the resulting GEM_NAME.gemspec in EDITOR, or the default editor if not specified. The default is $BUNDLER_EDITOR, $VISUAL, or $EDITOR. SEE ALSO o bundle-config http://bundler.io/v1.14/bundle_config.html December 2017 BUNDLE-GEM(1) bundler-1.16.1/man/bundle-pristine.ronn0000644000175000017500000000272313217261023020565 0ustar samuelophsamuelophbundle-pristine(1) -- Restores installed gems to their pristine condition =========================================================================== ## SYNOPSIS `bundle pristine` ## DESCRIPTION `pristine` restores the installed gems in the bundle to their pristine condition using the local gem cache from RubyGems. For git gems, a forced checkout will be performed. For further explanation, `bundle pristine` ignores unpacked files on disk. In other words, this command utilizes the local `.gem` cache or the gem's git repository as if one were installing from scratch. Note: the Bundler gem cannot be restored to its original state with `pristine`. One also cannot use `bundle pristine` on gems with a 'path' option in the Gemfile, because bundler has no original copy it can restore from. When is it practical to use `bundle pristine`? It comes in handy when a developer is debugging a gem. `bundle pristine` is a great way to get rid of experimental changes to a gem that one may not want. Why use `bundle pristine` over `gem pristine --all`? Both commands are very similar. For context: `bundle pristine`, without arguments, cleans all gems from the lockfile. Meanwhile, `gem pristine --all` cleans all installed gems for that Ruby version. If a developer forgets which gems in their project they might have been debugging, the Rubygems `gem pristine [GEMNAME]` command may be inconvenient. One can avoid waiting for `gem pristine --all`, and instead run `bundle pristine`. bundler-1.16.1/man/bundle-list.1.txt0000644000175000017500000000052013217261023017676 0ustar samuelophsamuelophBUNDLE-LIST(1) BUNDLE-LIST(1) NAME bundle-list - List all the gems in the bundle SYNOPSIS bundle list [--name-only] DESCRIPTION Prints a list of all the gems in the bundle including their version. OPTIONS --name-only Print only the name of each gem. August 2017 BUNDLE-LIST(1) bundler-1.16.1/man/gemfile.50000644000175000017500000005142013217261023016257 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "GEMFILE" "5" "July 2017" "" "" . .SH "NAME" \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs . .SH "SYNOPSIS" A \fBGemfile\fR describes the gem dependencies required to execute associated Ruby code\. . .P Place the \fBGemfile\fR in the root of the directory containing the associated code\. For instance, in a Rails application, place the \fBGemfile\fR in the same directory as the \fBRakefile\fR\. . .SH "SYNTAX" A \fBGemfile\fR is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements\. . .SH "GLOBAL SOURCES" At the top of the \fBGemfile\fR, add a line for the \fBRubygems\fR source that contains the gems listed in the \fBGemfile\fR\. . .IP "" 4 . .nf source "https://rubygems\.org" . .fi . .IP "" 0 . .P It is possible, but not recommended as of Bundler 1\.7, to add multiple global \fBsource\fR lines\. Each of these \fBsource\fRs \fBMUST\fR be a valid Rubygems repository\. . .P Sources are checked for gems following the heuristics described in \fISOURCE PRIORITY\fR\. If a gem is found in more than one global source, Bundler will print a warning after installing the gem indicating which source was used, and listing the other sources where the gem is available\. A specific source can be selected for gems that need to use a non\-standard repository, suppressing this warning, by using the \fI\fB:source\fR option\fR or a \fI\fBsource\fR block\fR\. . .SS "CREDENTIALS" Some gem sources require a username and password\. Use [bundle config(1)][bundle\-config] to set the username and password for any of the sources that need it\. The command must be run once on each computer that will install the Gemfile, but this keeps the credentials from being stored in plain text in version control\. . .IP "" 4 . .nf bundle config gems\.example\.com user:password . .fi . .IP "" 0 . .P For some sources, like a company Gemfury account, it may be easier to include the credentials in the Gemfile as part of the source URL\. . .IP "" 4 . .nf source "https://user:password@gems\.example\.com" . .fi . .IP "" 0 . .P Credentials in the source URL will take precedence over credentials set using \fBconfig\fR\. . .SH "RUBY" If your application requires a specific Ruby version or engine, specify your requirements using the \fBruby\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\. . .SS "VERSION (required)" The version of Ruby that your application requires\. If your application requires an alternate Ruby engine, such as JRuby or Rubinius, this should be the Ruby version that the engine is compatible with\. . .IP "" 4 . .nf ruby "1\.9\.3" . .fi . .IP "" 0 . .SS "ENGINE" Each application \fImay\fR specify a Ruby engine\. If an engine is specified, an engine version \fImust\fR also be specified\. . .P What exactly is an Engine? \- A Ruby engine is an implementation of the Ruby language\. . .IP "\(bu" 4 For background: the reference or original implementation of the Ruby programming language is called Matz\'s Ruby Interpreter \fIhttps://en\.wikipedia\.org/wiki/Ruby_MRI\fR, or MRI for short\. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz\. MRI is also known as CRuby, because it is written in C\. MRI is the most widely used Ruby engine\. . .IP "\(bu" 4 Other implementations \fIhttps://www\.ruby\-lang\.org/en/about/\fR of Ruby exist\. Some of the more well\-known implementations include Rubinius \fIhttps://rubinius\.com/\fR, and JRuby \fIhttp://jruby\.org/\fR\. Rubinius is an alternative implementation of Ruby written in Ruby\. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine\. . .IP "" 0 . .SS "ENGINE VERSION" Each application \fImay\fR specify a Ruby engine version\. If an engine version is specified, an engine \fImust\fR also be specified\. If the engine is "ruby" the engine version specified \fImust\fR match the Ruby version\. . .IP "" 4 . .nf ruby "1\.8\.7", :engine => "jruby", :engine_version => "1\.6\.7" . .fi . .IP "" 0 . .SS "PATCHLEVEL" Each application \fImay\fR specify a Ruby patchlevel\. . .IP "" 4 . .nf ruby "2\.0\.0", :patchlevel => "247" . .fi . .IP "" 0 . .SH "GEMS" Specify gem requirements using the \fBgem\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\. . .SS "NAME (required)" For each gem requirement, list a single \fIgem\fR line\. . .IP "" 4 . .nf gem "nokogiri" . .fi . .IP "" 0 . .SS "VERSION" Each \fIgem\fR \fBMAY\fR have one or more version specifiers\. . .IP "" 4 . .nf gem "nokogiri", ">= 1\.4\.2" gem "RedCloth", ">= 4\.1\.0", "< 4\.2\.0" . .fi . .IP "" 0 . .SS "REQUIRE AS" Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files or \fBtrue\fR if file you want \fBrequired\fR has same name as \fIgem\fR or \fBfalse\fR to prevent any file from being autorequired\. . .IP "" 4 . .nf gem "redis", :require => ["redis/connection/hiredis", "redis"] gem "webmock", :require => false gem "debugger", :require => true . .fi . .IP "" 0 . .P The argument defaults to the name of the gem\. For example, these are identical: . .IP "" 4 . .nf gem "nokogiri" gem "nokogiri", :require => "nokogiri" gem "nokogiri", :require => true . .fi . .IP "" 0 . .SS "GROUPS" Each \fIgem\fR \fBMAY\fR specify membership in one or more groups\. Any \fIgem\fR that does not specify membership in any group is placed in the \fBdefault\fR group\. . .IP "" 4 . .nf gem "rspec", :group => :test gem "wirble", :groups => [:development, :test] . .fi . .IP "" 0 . .P The Bundler runtime allows its two main methods, \fBBundler\.setup\fR and \fBBundler\.require\fR, to limit their impact to particular groups\. . .IP "" 4 . .nf # setup adds gems to Ruby\'s load path Bundler\.setup # defaults to all groups require "bundler/setup" # same as Bundler\.setup Bundler\.setup(:default) # only set up the _default_ group Bundler\.setup(:test) # only set up the _test_ group (but `not` _default_) Bundler\.setup(:default, :test) # set up the _default_ and _test_ groups, but no others # require requires all of the gems in the specified groups Bundler\.require # defaults to the _default_ group Bundler\.require(:default) # identical Bundler\.require(:default, :test) # requires the _default_ and _test_ groups Bundler\.require(:test) # requires the _test_ group . .fi . .IP "" 0 . .P The Bundler CLI allows you to specify a list of groups whose gems \fBbundle install\fR should not install with the \fB\-\-without\fR option\. To specify multiple groups to ignore, specify a list of groups separated by spaces\. . .IP "" 4 . .nf bundle install \-\-without test bundle install \-\-without development test . .fi . .IP "" 0 . .P After running \fBbundle install \-\-without test\fR, bundler will remember that you excluded the test group in the last installation\. The next time you run \fBbundle install\fR, without any \fB\-\-without option\fR, bundler will recall it\. . .P Also, calling \fBBundler\.setup\fR with no parameters, or calling \fBrequire "bundler/setup"\fR will setup all groups except for the ones you excluded via \fB\-\-without\fR (since they are not available)\. . .P Note that on \fBbundle install\fR, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies\. This means that you cannot list different versions of the same gems in different groups\. For more details, see Understanding Bundler \fIhttp://bundler\.io/rationale\.html\fR\. . .SS "PLATFORMS" If a gem should only be used in a particular platform or set of platforms, you can specify them\. Platforms are essentially identical to groups, except that you do not need to use the \fB\-\-without\fR install\-time flag to exclude groups of gems for other platforms\. . .P There are a number of \fBGemfile\fR platforms: . .TP \fBruby\fR C Ruby (MRI) or Rubinius, but \fBNOT\fR Windows . .TP \fBmri\fR Same as \fIruby\fR, but not Rubinius . .TP \fBmingw\fR Windows 32 bit \'mingw32\' platform (aka RubyInstaller) . .TP \fBx64_mingw\fR Windows 64 bit \'mingw32\' platform (aka RubyInstaller x64) . .TP \fBrbx\fR Same as \fIruby\fR, but only Rubinius (not MRI) . .TP \fBjruby\fR JRuby . .TP \fBmswin\fR Windows . .P You can restrict further by platform and version for all platforms \fIexcept\fR for \fBrbx\fR, \fBjruby\fR, and \fBmswin\fR\. . .P To specify a version in addition to a platform, append the version number without the delimiter to the platform\. For example, to specify that a gem should only be used on platforms with Ruby 2\.3, use: . .IP "" 4 . .nf ruby_23 . .fi . .IP "" 0 . .P The full list of platforms and supported versions includes: . .TP \fBruby\fR 1\.8, 1\.9, 2\.0, 2\.1, 2\.2, 2\.3, 2\.4, 2\.5 . .TP \fBmri\fR 1\.8, 1\.9, 2\.0, 2\.1, 2\.2, 2\.3, 2\.4, 2\.5 . .TP \fBmingw\fR 1\.8, 1\.9, 2\.0, 2\.1, 2\.2, 2\.3, 2\.4, 2\.5 . .TP \fBx64_mingw\fR 2\.0, 2\.1, 2\.2, 2\.3, 2\.4, 2\.5 . .P As with groups, you can specify one or more platforms: . .IP "" 4 . .nf gem "weakling", :platforms => :jruby gem "ruby\-debug", :platforms => :mri_18 gem "nokogiri", :platforms => [:mri_18, :jruby] . .fi . .IP "" 0 . .P All operations involving groups (\fBbundle install\fR, \fBBundler\.setup\fR, \fBBundler\.require\fR) behave exactly the same as if any groups not matching the current platform were explicitly excluded\. . .SS "SOURCE" You can select an alternate Rubygems repository for a gem using the \':source\' option\. . .IP "" 4 . .nf gem "some_internal_gem", :source => "https://gems\.example\.com" . .fi . .IP "" 0 . .P This forces the gem to be loaded from this source and ignores any global sources declared at the top level of the file\. If the gem does not exist in this source, it will not be installed\. . .P Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on global sources using the ordering described in \fISOURCE PRIORITY\fR\. . .P Selecting a specific source repository this way also suppresses the ambiguous gem warning described above in \fIGLOBAL SOURCES (#source)\fR\. . .SS "GIT" If necessary, you can specify that a gem is located at a particular git repository using the \fB:git\fR parameter\. The repository can be accessed via several protocols: . .TP \fBHTTP(S)\fR gem "rails", :git => "https://github\.com/rails/rails\.git" . .TP \fBSSH\fR gem "rails", :git => "git@github\.com:rails/rails\.git" . .TP \fBgit\fR gem "rails", :git => "git://github\.com/rails/rails\.git" . .P If using SSH, the user that you use to run \fBbundle install\fR \fBMUST\fR have the appropriate keys available in their \fB$HOME/\.ssh\fR\. . .P \fBNOTE\fR: \fBhttp://\fR and \fBgit://\fR URLs should be avoided if at all possible\. These protocols are unauthenticated, so a man\-in\-the\-middle attacker can deliver malicious code and compromise your system\. HTTPS and SSH are strongly preferred\. . .P The \fBgroup\fR, \fBplatforms\fR, and \fBrequire\fR options are available and behave exactly the same as they would for a normal gem\. . .P A git repository \fBSHOULD\fR have at least one file, at the root of the directory containing the gem, with the extension \fB\.gemspec\fR\. This file \fBMUST\fR contain a valid gem specification, as expected by the \fBgem build\fR command\. . .P If a git repository does not have a \fB\.gemspec\fR, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions\. As a result, it may fail to properly integrate into your application\. . .P If a git repository does have a \fB\.gemspec\fR for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the \fB\.gemspec\fR specifies a version matching the version specifier\. If not, bundler will print a warning\. . .IP "" 4 . .nf gem "rails", "2\.3\.8", :git => "https://github\.com/rails/rails\.git" # bundle install will fail, because the \.gemspec in the rails # repository\'s master branch specifies version 3\.0\.0 . .fi . .IP "" 0 . .P If a git repository does \fBnot\fR have a \fB\.gemspec\fR for the gem you attached it to, a version specifier \fBMUST\fR be provided\. Bundler will use this version in the simple \fB\.gemspec\fR it creates\. . .P Git repositories support a number of additional options\. . .TP \fBbranch\fR, \fBtag\fR, and \fBref\fR You \fBMUST\fR only specify at most one of these options\. The default is \fB:branch => "master"\fR . .TP For example: . .IP git "https://github\.com/rails/rails\.git", :branch => "5\-0\-stable" do . .IP git "https://github\.com/rails/rails\.git", :tag => "v5\.0\.0" do . .IP git "https://github\.com/rails/rails\.git", :ref => "4aded" do . .TP \fBsubmodules\fR For reference, a git submodule \fIhttps://git\-scm\.com/book/en/v2/Git\-Tools\-Submodules\fR lets you have another git repository within a subfolder of your repository\. Specify \fB:submodules => true\fR to cause bundler to expand any submodules included in the git repository . .P If a git repository contains multiple \fB\.gemspecs\fR, each \fB\.gemspec\fR represents a gem located at the same place in the file system as the \fB\.gemspec\fR\. . .IP "" 4 . .nf |~rails [git root] | |\-rails\.gemspec [rails gem located here] |~actionpack | |\-actionpack\.gemspec [actionpack gem located here] |~activesupport | |\-activesupport\.gemspec [activesupport gem located here] |\.\.\. . .fi . .IP "" 0 . .P To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs \fBgem build name\.gemspec\fR and then installs the resulting gem\. The \fBgem build\fR command, which comes standard with Rubygems, evaluates the \fB\.gemspec\fR in the context of the directory in which it is located\. . .SS "GIT SOURCE" A custom git source can be defined via the \fBgit_source\fR method\. Provide the source\'s name as an argument, and a block which receives a single argument and interpolates it into a string to return the full repo address: . .IP "" 4 . .nf git_source(:stash){ |repo_name| "https://stash\.corp\.acme\.pl/#{repo_name}\.git" } gem \'rails\', :stash => \'forks/rails\' . .fi . .IP "" 0 . .P In addition, if you wish to choose a specific branch: . .IP "" 4 . .nf gem "rails", :stash => "forks/rails", :branch => "branch_name" . .fi . .IP "" 0 . .SS "GITHUB" \fBNOTE\fR: This shorthand should be avoided until Bundler 2\.0, since it currently expands to an insecure \fBgit://\fR URL\. This allows a man\-in\-the\-middle attacker to compromise your system\. . .P If the git repository you want to use is hosted on GitHub and is public, you can use the :github shorthand to specify the github username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\. . .IP "" 4 . .nf gem "rails", :github => "rails/rails" gem "rails", :github => "rails" . .fi . .IP "" 0 . .P Are both equivalent to . .IP "" 4 . .nf gem "rails", :git => "git://github\.com/rails/rails\.git" . .fi . .IP "" 0 . .P Since the \fBgithub\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\. . .SS "GIST" If the git repository you want to use is hosted as a Github Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing "\.git")\. . .IP "" 4 . .nf gem "the_hatch", :gist => "4815162342" . .fi . .IP "" 0 . .P Is equivalent to: . .IP "" 4 . .nf gem "the_hatch", :git => "https://gist\.github\.com/4815162342\.git" . .fi . .IP "" 0 . .P Since the \fBgist\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\. . .SS "BITBUCKET" If the git repository you want to use is hosted on Bitbucket and is public, you can use the :bitbucket shorthand to specify the bitbucket username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\. . .IP "" 4 . .nf gem "rails", :bitbucket => "rails/rails" gem "rails", :bitbucket => "rails" . .fi . .IP "" 0 . .P Are both equivalent to . .IP "" 4 . .nf gem "rails", :git => "https://rails@bitbucket\.org/rails/rails\.git" . .fi . .IP "" 0 . .P Since the \fBbitbucket\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\. . .SS "PATH" You can specify that a gem is located in a particular location on the file system\. Relative paths are resolved relative to the directory containing the \fBGemfile\fR\. . .P Similar to the semantics of the \fB:git\fR option, the \fB:path\fR option requires that the directory in question either contains a \fB\.gemspec\fR for the gem, or that you specify an explicit version that bundler should use\. . .P Unlike \fB:git\fR, bundler does not compile C extensions for gems specified as paths\. . .IP "" 4 . .nf gem "rails", :path => "vendor/rails" . .fi . .IP "" 0 . .P If you would like to use multiple local gems directly from the filesystem, you can set a global \fBpath\fR option to the path containing the gem\'s files\. This will automatically load gemspec files from subdirectories\. . .IP "" 4 . .nf path \'components\' do gem \'admin_ui\' gem \'public_ui\' end . .fi . .IP "" 0 . .SH "BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS" The \fB:source\fR, \fB:git\fR, \fB:path\fR, \fB:group\fR, and \fB:platforms\fR options may be applied to a group of gems by using block form\. . .IP "" 4 . .nf source "https://gems\.example\.com" do gem "some_internal_gem" gem "another_internal_gem" end git "https://github\.com/rails/rails\.git" do gem "activesupport" gem "actionpack" end platforms :ruby do gem "ruby\-debug" gem "sqlite3" end group :development, :optional => true do gem "wirble" gem "faker" end . .fi . .IP "" 0 . .P In the case of the group block form the :optional option can be given to prevent a group from being installed unless listed in the \fB\-\-with\fR option given to the \fBbundle install\fR command\. . .P In the case of the \fBgit\fR block form, the \fB:ref\fR, \fB:branch\fR, \fB:tag\fR, and \fB:submodules\fR options may be passed to the \fBgit\fR method, and all gems in the block will inherit those options\. . .SH "INSTALL_IF" The \fBinstall_if\fR method allows gems to be installed based on a proc or lambda\. This is especially useful for optional gems that can only be used if certain software is installed or some other conditions are met\. . .IP "" 4 . .nf install_if \-> { RUBY_PLATFORM =~ /darwin/ } do gem "pasteboard" end . .fi . .IP "" 0 . .SH "GEMSPEC" The \.gemspec \fIhttp://guides\.rubygems\.org/specification\-reference/\fR file is where you provide metadata about your gem to Rubygems\. Some required Gemspec attributes include the name, description, and homepage of your gem\. This is also where you specify the dependencies your gem needs to run\. . .P If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\. . .P The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fB:path => \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths\. . .P The \fBgemspec\fR method supports optional \fB:path\fR, \fB:glob\fR, \fB:name\fR, and \fB:development_group\fR options, which control where bundler looks for the \fB\.gemspec\fR, the glob it uses to look for the gemspec (defaults to: "{,\fI,\fR/*}\.gemspec"), what named \fB\.gemspec\fR it uses (if more than one is present), and which group development dependencies are included in\. . .P When a \fBgemspec\fR dependency encounters version conflicts during resolution, the local version under development will always be selected \-\- even if there are remote versions that better match other requirements for the \fBgemspec\fR gem\. . .SH "SOURCE PRIORITY" When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order: . .IP "1." 4 The source explicitly attached to the gem (using \fB:source\fR, \fB:path\fR, or \fB:git\fR) . .IP "2." 4 For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent\. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from \fBrubygems\.org\fR . .IP "3." 4 The sources specified via global \fBsource\fR lines, searching each source in your \fBGemfile\fR from last added to first added\. . .IP "" 0 bundler-1.16.1/man/bundle-init.1.txt0000644000175000017500000000110013217261023017661 0ustar samuelophsamuelophBUNDLE-INIT(1) BUNDLE-INIT(1) NAME bundle-init - Generates a Gemfile into the current working directory SYNOPSIS bundle init [--gemspec=FILE] DESCRIPTION Init generates a default Gemfile(5) in the current working directory. When adding a Gemfile(5) to a gem with a gemspec, the --gemspec option will automatically add each dependency listed in the gemspec file to the newly created Gemfile(5). OPTIONS --gemspec Use the specified .gemspec to create the Gemfile(5) February 2017 BUNDLE-INIT(1) bundler-1.16.1/man/bundle-check.ronn0000644000175000017500000000147013217261023020003 0ustar samuelophsamuelophbundle-check(1) -- Verifies if dependencies are satisfied by installed gems =========================================================================== ## SYNOPSIS `bundle check` [--dry-run] [--gemfile=FILE] [--path=PATH] ## DESCRIPTION `check` searches the local machine for each of the gems requested in the Gemfile. If all gems are found, Bundler prints a success message and exits with a status of 0. If not, the first missing gem is listed and Bundler exits status 1. ## OPTIONS * `--dry-run`: Locks the `Gemfile(5)` before running the command. * `--gemfile`: Use the specified gemfile instead of the `Gemfile(5)` * `--path`: Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine. bundler-1.16.1/man/bundle-install.1.txt0000644000175000017500000003775613217261023020416 0ustar samuelophsamuelophBUNDLE-INSTALL(1) BUNDLE-INSTALL(1) NAME bundle-install - Install the dependencies specified in your Gemfile SYNOPSIS bundle install [--binstubs[=DIRECTORY]] [--clean] [--deployment] [--force] [--frozen] [--full-index] [--gemfile=GEMFILE] [--jobs=NUMBER] [--local] [--no-cache] [--no-prune] [--path PATH] [--quiet] [--retry=NUMBER] [--shebang] [--standalone[=GROUP[ GROUP...]]] [--sys- tem] [--trust-policy=POLICY] [--with=GROUP[ GROUP...]] [--with- out=GROUP[ GROUP...]] DESCRIPTION Install the gems specified in your Gemfile(5). If this is the first time you run bundle install (and a Gemfile.lock does not exist), Bundler will fetch all remote sources, resolve dependencies and install all needed gems. If a Gemfile.lock does exist, and you have not updated your Gemfile(5), Bundler will fetch all remote sources, but use the dependencies speci- fied in the Gemfile.lock instead of resolving dependencies. If a Gemfile.lock does exist, and you have updated your Gemfile(5), Bundler will use the dependencies in the Gemfile.lock for all gems that you did not update, but will re-resolve the dependencies of gems that you did update. You can find more information about this update process below under CONSERVATIVE UPDATING. OPTIONS To apply any of --binstubs, --deployment, --path, or --without every time bundle install is run, use bundle config (see bundle-config(1)). --binstubs[=] Creates a directory (defaults to ~/bin) and place any executa- bles from the gem there. These executables run in Bundler's con- text. If used, you might add this directory to your environ- ment's PATH variable. For instance, if the rails gem comes with a rails executable, this flag will create a bin/rails executable that ensures that all referred dependencies will be resolved using the bundled gems. --clean On finishing the installation Bundler is going to remove any gems not present in the current Gemfile(5). Don't worry, gems currently in use will not be removed. --deployment In deployment mode, Bundler will 'roll-out' the bundle for pro- duction or CI use. Please check carefully if you want to have this option enabled in your development environment. --force Force download every gem, even if the required versions are already available locally. --frozen Do not allow the Gemfile.lock to be updated after this install. Exits non-zero if there are going to be changes to the Gem- file.lock. --full-index Bundler will not call Rubygems' API endpoint (default) but down- load and cache a (currently big) index file of all gems. Perfor- mance can be improved for large bundles that seldom change by enabling this option. --gemfile= The location of the Gemfile(5) which Bundler should use. This defaults to a Gemfile(5) in the current working directory. In general, Bundler will assume that the location of the Gemfile(5) is also the project's root and will try to find Gemfile.lock and vendor/cache relative to this location. --jobs=[], -j[] The maximum number of parallel download and install jobs. The default is 1. --local Do not attempt to connect to rubygems.org. Instead, Bundler will use the gems already present in Rubygems' cache or in ven- dor/cache. Note that if a appropriate platform-specific gem exists on rubygems.org it will not be found. --no-cache Do not update the cache in vendor/cache with the newly bundled gems. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install. --no-prune Don't remove stale gems from the cache when the installation finishes. --path= The location to install the specified gems to. This defaults to Rubygems' setting. Bundler shares this location with Rubygems, gem install ... will have gem installed there, too. Therefore, gems installed without a --path ... setting will show up by calling gem list. Accordingly, gems installed to other locations will not get listed. --quiet Do not print progress information to the standard output. Instead, Bundler will exit using a status code ($?). --retry=[] Retry failed network or git requests for number times. --shebang= Uses the specified ruby executable (usually ruby) to execute the scripts created with --binstubs. In addition, if you use --bin- stubs together with --shebang jruby these executables will be changed to execute jruby instead. --standalone[=] Makes a bundle that can work without depending on Rubygems or Bundler at runtime. A space separated list of groups to install has to be specified. Bundler creates a directory named bundle and installs the bundle there. It also generates a bun- dle/bundler/setup.rb file to replace Bundler's own setup in the manner required. Using this option implicitly sets path, which is a [remembered option][REMEMBERED OPTIONS]. --system Installs the gems specified in the bundle to the system's Rubygems location. This overrides any previous configuration of --path. --trust-policy=[] Apply the Rubygems security policy policy, where policy is one of HighSecurity, MediumSecurity, LowSecurity, AlmostNoSecurity, or NoSecurity. For more details, please see the Rubygems signing documentation linked below in SEE ALSO. --with= A space-separated list of groups referencing gems to install. If an optional group is given it is installed. If a group is given that is in the remembered list of groups given to --without, it is removed from that list. --without= A space-separated list of groups referencing gems to skip during installation. If a group is given that is in the remembered list of groups given to --with, it is removed from that list. DEPLOYMENT MODE Bundler's defaults are optimized for development. To switch to defaults optimized for deployment and for CI, use the --deployment flag. Do not activate deployment mode on development machines, as it will cause an error when the Gemfile(5) is modified. 1. A Gemfile.lock is required. To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a Gemfile.lock is required. This is mainly to ensure that you remember to check your Gem- file.lock into version control. 2. The Gemfile.lock must be up to date In development, you can modify your Gemfile(5) and re-run bundle install to conservatively update your Gemfile.lock snapshot. In deployment, your Gemfile.lock should be up-to-date with changes made in your Gemfile(5). 3. Gems are installed to vendor/bundle not your default system loca- tion In development, it's convenient to share the gems used in your application with other applications and other scripts that run on the system. In deployment, isolation is a more important default. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permis- sion to read them. As a result, bundle install --deployment installs gems to the ven- dor/bundle directory in the application. This may be overridden using the --path option. SUDO USAGE By default, Bundler installs gems to the same location as gem install. In some cases, that location may not be writable by your Unix user. In that case, Bundler will stage everything in a temporary directory, then ask you for your sudo password in order to copy the gems into their system location. From your perspective, this is identical to installing the gems directly into the system. You should never use sudo bundle install. This is because several other steps in bundle install must be performed as the current user: o Updating your Gemfile.lock o Updating your vendor/cache, if necessary o Checking out private git repositories using your user's SSH keys Of these three, the first two could theoretically be performed by chowning the resulting files to $SUDO_USER. The third, however, can only be performed by invoking the git command as the current user. Therefore, git gems are downloaded and installed into ~/.bundle rather than $GEM_HOME or $BUNDLE_PATH. As a result, you should run bundle install as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location. INSTALLING GROUPS By default, bundle install will install all gems in all groups in your Gemfile(5), except those declared for a different platform. However, you can explicitly tell Bundler to skip installing certain groups with the --without option. This option takes a space-separated list of groups. While the --without option will skip installing the gems in the speci- fied groups, it will still download those gems and use them to resolve the dependencies of every gem in your Gemfile(5). This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against. Bundler offers a rock-solid guarantee that the third-party code you are running in development and testing is also the third-party code you are running in production. You can choose to exclude some of that code in different environments, but you will never be caught flat-footed by different versions of third-party code being used in different environ- ments. For a simple illustration, consider the following Gemfile(5): source 'https://rubygems.org' gem 'sinatra' group :production do gem 'rack-perftools-profiler' end In this case, sinatra depends on any version of Rack (>= 1.0), while rack-perftools-profiler depends on 1.x (~> 1.0). When you run bundle install --without production in development, we look at the dependencies of rack-perftools-profiler as well. That way, you do not spend all your time developing against Rack 2.0, using new APIs unavailable in Rack 1.x, only to have Bundler switch to Rack 1.2 when the production group is used. This should not cause any problems in practice, because we do not attempt to install the gems in the excluded groups, and only evaluate as part of the dependency resolution process. This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production. Because of the vagaries of the dependency resolution process, this usually affects more than the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using. THE GEMFILE.LOCK When you run bundle install, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called Gemfile.lock. Bundler uses this file in all subsequent calls to bundle install, which guarantees that you always use the same exact code, even as your appli- cation moves across machines. Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies. As a result, you SHOULD check your Gemfile.lock into version control. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third-party code being used if any of the gems in the Gemfile(5) or any of their dependencies have been updated. CONSERVATIVE UPDATING When you make a change to the Gemfile(5) and then run bundle install, Bundler will update only the gems that you modified. In other words, if a gem that you did not modify worked before you called bundle install, it will continue to use the exact same versions of all dependencies as it used before the update. Let's take a look at an example. Here's your original Gemfile(5): source 'https://rubygems.org' gem 'actionpack', '2.3.8' gem 'activemerchant' In this case, both actionpack and activemerchant depend on activesup- port. The actionpack gem depends on activesupport 2.3.8 and rack ~> 1.1.0, while the activemerchant gem depends on activesupport >= 2.3.2, braintree >= 2.0.0, and builder >= 2.0.0. When the dependencies are first resolved, Bundler will select activesupport 2.3.8, which satisfies the requirements of both gems in your Gemfile(5). Next, you modify your Gemfile(5) to: source 'https://rubygems.org' gem 'actionpack', '3.0.0.rc' gem 'activemerchant' The actionpack 3.0.0.rc gem has a number of new dependencies, and updates the activesupport dependency to = 3.0.0.rc and the rack depen- dency to ~> 1.2.1. When you run bundle install, Bundler notices that you changed the actionpack gem, but not the activemerchant gem. It evaluates the gems currently being used to satisfy its requirements: activesupport 2.3.8 also used to satisfy a dependency in activemerchant, which is not being updated rack ~> 1.1.0 not currently being used to satisfy another dependency Because you did not explicitly ask to update activemerchant, you would not expect it to suddenly stop working after updating actionpack. How- ever, satisfying the new activesupport 3.0.0.rc dependency of action- pack requires updating one of its dependencies. Even though activemerchant declares a very loose dependency that theo- retically matches activesupport 3.0.0.rc, Bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies. In this case, the activemerchant dependency is treated as activemerchant 1.7.1 + activesupport 2.3.8, so bundle install will report that it cannot update actionpack. To explicitly update actionpack, including its dependencies which other gems in the Gemfile(5) still depend on, run bundle update actionpack (see bundle update(1)). Summary: In general, after making a change to the Gemfile(5) , you should first try to run bundle install, which will guarantee that no other gem in the Gemfile(5) is impacted by the change. If that does not work, run [bundle update(1)][bundle-update]. SEE ALSO o Gem install docs http://guides.rubygems.org/rubygems-basics/#installing-gems o Rubygems signing docs http://guides.rubygems.org/security/ December 2017 BUNDLE-INSTALL(1) bundler-1.16.1/man/bundle-add.10000644000175000017500000000166113217261023016644 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-ADD" "1" "June 2017" "" "" . .SH "NAME" \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install . .SH "SYNOPSIS" \fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] . .SH "DESCRIPTION" Adds the named gem to the Gemfile and run \fBbundle install\fR\. . .P Example: . .P bundle add rails . .P bundle add rails \-\-version "< 3\.0, > 1\.1" . .P bundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development" . .P bundle add rails \-\-group "development, test" . .SH "OPTIONS" . .TP \fB\-\-version\fR, \fB\-v\fR Specify version requirements(s) for the added gem\. . .TP \fB\-\-group\fR, \fB\-g\fR Specify the group(s) for the added gem\. Multiple groups should be separated by commas\. . .TP \fB\-\-source\fR, , \fB\-s\fR Specify the source for the added gem\. bundler-1.16.1/man/bundle-open.1.txt0000644000175000017500000000075313217261023017674 0ustar samuelophsamuelophBUNDLE-OPEN(1) BUNDLE-OPEN(1) NAME bundle-open - Opens the source directory for a gem in your bundle SYNOPSIS bundle open [GEM] DESCRIPTION Opens the source directory of the provided GEM in your editor. For this to work the EDITOR or BUNDLER_EDITOR environment variable has to be set. Example: bundle open 'rack' Will open the source directory for the 'rack' gem in your bundle. February 2017 BUNDLE-OPEN(1) bundler-1.16.1/man/bundle-platform.1.txt0000644000175000017500000000235213217261023020554 0ustar samuelophsamuelophBUNDLE-PLATFORM(1) BUNDLE-PLATFORM(1) NAME bundle-platform - Displays platform compatibility information SYNOPSIS bundle platform [--ruby] DESCRIPTION platform will display information from your Gemfile, Gemfile.lock, and Ruby VM about your platform. For instance, using this Gemfile(5): source "https://rubygems.org" ruby "1.9.3" gem "rack" If you run bundle platform on Ruby 1.9.3, it will display the following output: Your platform is: x86_64-linux Your app has gems that work on these platforms: * ruby Your Gemfile specifies a Ruby version requirement: * ruby 1.9.3 Your current platform satisfies the Ruby version requirement. platform will list all the platforms in your Gemfile.lock as well as the ruby directive if applicable from your Gemfile(5). It will also let you know if the ruby directive requirement has been met. If ruby direc- tive doesn't match the running Ruby VM, it will tell you what part does not. OPTIONS --ruby It will display the ruby directive information, so you don't have to parse it from the Gemfile(5). February 2017 BUNDLE-PLATFORM(1) bundler-1.16.1/man/bundle.10000644000175000017500000000614713217261023016122 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE" "1" "July 2017" "" "" . .SH "NAME" \fBbundle\fR \- Ruby Dependency Management . .SH "SYNOPSIS" \fBbundle\fR COMMAND [\-\-no\-color] [\-\-verbose] [ARGS] . .SH "DESCRIPTION" Bundler manages an \fBapplication\'s dependencies\fR through its entire life across many machines systematically and repeatably\. . .P See the bundler website \fIhttp://bundler\.io\fR for information on getting started, and Gemfile(5) for more information on the \fBGemfile\fR format\. . .SH "OPTIONS" . .TP \fB\-\-no\-color\fR Print all output without color . .TP \fB\-\-retry\fR, \fB\-r\fR Specify the number of times you wish to attempt network commands . .TP \fB\-\-verbose\fR, \fB\-V\fR Print out additional logging information . .SH "BUNDLE COMMANDS" We divide \fBbundle\fR subcommands into primary commands and utilities\. . .SH "PRIMARY COMMANDS" . .TP [\fBbundle install(1)\fR][bundle\-install] Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR . .TP [\fBbundle update(1)\fR][bundle\-update] Update dependencies to their latest versions . .TP [\fBbundle package(1)\fR][bundle\-package] Package the \.gem files required by your application into the \fBvendor/cache\fR directory . .TP [\fBbundle exec(1)\fR][bundle\-exec] Execute a script in the context of the current bundle . .TP [\fBbundle config(1)\fR][bundle\-config] Specify and read configuration options for bundler . .TP \fBbundle help(1)\fR Display detailed help for each subcommand . .SH "UTILITIES" . .TP \fBbundle add(1)\fR Add the named gem to the Gemfile and run \fBbundle install\fR . .TP \fBbundle binstubs(1)\fR Generate binstubs for executables in a gem . .TP \fBbundle check(1)\fR Determine whether the requirements for your application are installed and available to bundler . .TP \fBbundle show(1)\fR Show the source location of a particular gem in the bundle . .TP [\fBbundle outdated(1)\fR][bundle\-outdated] Show all of the outdated gems in the current bundle . .TP \fBbundle console(1)\fR Start an IRB session in the context of the current bundle . .TP \fBbundle open(1)\fR Open an installed gem in the editor . .TP [\fBbundle lock(1)\fR][bundle\-lock] Generate a lockfile for your dependencies . .TP \fBbundle viz(1)\fR Generate a visual representation of your dependencies . .TP \fBbundle init(1)\fR Generate a simple \fBGemfile\fR, placed in the current directory . .TP [\fBbundle gem(1)\fR][bundle\-gem] Create a simple gem, suitable for development with bundler . .TP [\fBbundle platform(1)\fR][bundle\-platform] Display platform compatibility information . .TP \fBbundle clean(1)\fR Clean up unused gems in your bundler directory . .TP \fBbundle doctor(1)\fR Display warnings about common potential problems . .SH "PLUGINS" When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-\fR and execute it, passing down any extra arguments to it\. . .SH "OBSOLETE" These commands are obsolete and should no longer be used . .IP "\(bu" 4 \fBbundle cache(1)\fR . .IP "\(bu" 4 \fBbundle show(1)\fR . .IP "" 0 bundler-1.16.1/man/bundle-binstubs.10000644000175000017500000000326513217261023017747 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-BINSTUBS" "1" "October 2017" "" "" . .SH "NAME" \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems . .SH "SYNOPSIS" \fBbundle binstubs\fR \fIGEM_NAME\fR [\-\-force] [\-\-path PATH] [\-\-standalone] . .SH "DESCRIPTION" Binstubs are scripts that wrap aroung executables\. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it into \fBbin/\fR\. Binstubs are a shortcut\-or alternative\- to always using \fBbundle exec\fR\. This gives you a file that can by run directly, and one that will always run the correct gem version used by the application\. . .P For example, if you run \fBbundle binstubs rspec\-core\fR, Bundler will create the file \fBbin/rspec\fR\. That file will contain enough code to load Bundler, tell it to load the bundled gems, and then run rspec\. . .P This command generates binstubs for executables in \fBGEM_NAME\fR\. Binstubs are put into \fBbin\fR, or the \fB\-\-path\fR directory if one has been set\. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems\. . .SH "OPTIONS" . .TP \fB\-\-force\fR Overwrite existing binstubs if they exist\. . .TP \fB\-\-path\fR The location to install the specified binstubs to\. This defaults to \fBbin\fR\. . .TP \fB\-\-standalone\fR Makes binstubs that can work without depending on Rubygems or Bundler at runtime\. . .TP \fB\-\-sheband\fR Specify a different shebang executable name than the default (default \'ruby\') . .SH "BUNDLE INSTALL \-\-BINSTUBS" To create binstubs for all the gems in the bundle you can use the \fB\-\-binstubs\fR flag in [bundle install(1)][bundle\-install]\. bundler-1.16.1/man/bundle-config.1.txt0000644000175000017500000004575013217261023020206 0ustar samuelophsamuelophBUNDLE-CONFIG(1) BUNDLE-CONFIG(1) NAME bundle-config - Set bundler configuration options SYNOPSIS bundle config [name [value]] DESCRIPTION This command allows you to interact with bundler's configuration sys- tem. Bundler retrieves its configuration from the local application (app/.bundle/config), environment variables, and the user's home direc- tory (~/.bundle/config), in that order of priority. Executing bundle config with no parameters will print a list of all bundler configuration for the current bundle, and where that configura- tion was set. Executing bundle config will print the value of that configura- tion setting, and where it was set. Executing bundle config will set that configuration to the value specified for all bundles executed as the current user. The configuration will be stored in ~/.bundle/config. If name already is set, name will be overridden and user will be warned. Executing bundle config --global works the same as above. Executing bundle config --local will set that configura- tion to the local application. The configuration will be stored in app/.bundle/config. Executing bundle config --delete will delete the configuration in both local and global sources. Not compatible with --global or --local flag. Executing bundle with the BUNDLE_IGNORE_CONFIG environment variable set will cause it to ignore all configuration. Executing bundle config disable_multisource true upgrades the warning about the Gemfile containing multiple primary sources to an error. Exe- cuting bundle config --delete disable_multisource downgrades this error to a warning. REMEMBERING OPTIONS Flags passed to bundle install or the Bundler runtime, such as --path foo or --without production, are not remembered between commands. If these options must be remembered,they must be set using bundle config (e.g., bundle config path foo). The options that can be configured are: bin Creates a directory (defaults to ~/bin) and place any executa- bles from the gem there. These executables run in Bundler's con- text. If used, you might add this directory to your environ- ment's PATH variable. For instance, if the rails gem comes with a rails executable, this flag will create a bin/rails executable that ensures that all referred dependencies will be resolved using the bundled gems. deployment In deployment mode, Bundler will 'roll-out' the bundle for pro- duction use. Please check carefully if you want to have this option enabled in development or test environments. path The location to install the specified gems to. This defaults to Rubygems' setting. Bundler shares this location with Rubygems, gem install ... will have gem installed there, too. Therefore, gems installed without a --path ... setting will show up by calling gem list. Accordingly, gems installed to other locations will not get listed. without A space-separated list of groups referencing gems to skip during installation. with A space-separated list of groups referencing gems to include during installation. BUILD OPTIONS You can use bundle config to give bundler the flags to pass to the gem installer every time bundler tries to install a particular gem. A very common example, the mysql gem, requires Snow Leopard users to pass configuration flags to gem install to specify where to find the mysql_config executable. gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config Since the specific location of that executable can change from machine to machine, you can specify these flags on a per-machine basis. bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config After running this command, every time bundler needs to install the mysql gem, it will pass along the flags you specified. CONFIGURATION KEYS Configuration keys in bundler have two forms: the canonical form and the environment variable form. For instance, passing the --without flag to [bundle install(1)][bun- dle-install] prevents Bundler from installing certain groups specified in the Gemfile(5). Bundler persists this value in app/.bundle/config so that calls to Bundler.setup do not try to find gems from the Gemfile that you didn't install. Additionally, subsequent calls to [bundle install(1)][bundle-install] remember this setting and skip those groups. The canonical form of this configuration is "without". To convert the canonical form to the environment variable form, capitalize it, and prepend BUNDLE_. The environment variable form of "without" is BUN- DLE_WITHOUT. Any periods in the configuration keys must be replaced with two under- scores when setting it via environment variables. The configuration key local.rack becomes the environment variable BUNDLE_LOCAL__RACK. LIST OF AVAILABLE KEYS The following is a list of all configuration keys and their purpose. You can learn more about their operation in [bundle install(1)][bun- dle-install]. o allow_bundler_dependency_conflicts (BUNDLE_ALLOW_BUNDLER_DEPEN- DENCY_CONFLICTS): Allow resolving to specifications that have dependencies on bundler that are incompatible with the running Bundler version. o allow_deployment_source_credential_changes (BUNDLE_ALLOW_DEPLOY- MENT_SOURCE_CREDENTIAL_CHANGES): When in deployment mode, allow changing the credentials to a gem's source. Ex: https://some.host.com/gems/path/ -> https://user_name:pass- word@some.host.com/gems/path o allow_offline_install (BUNDLE_ALLOW_OFFLINE_INSTALL): Allow Bundler to use cached data when installing without network access. o auto_clean_without_path (BUNDLE_AUTO_CLEAN_WITHOUT_PATH): Automati- cally run bundle clean after installing when an explicit path has not been set and Bundler is not installing into the system gems. o auto_install (BUNDLE_AUTO_INSTALL): Automatically run bundle install when gems are missing. o bin (BUNDLE_BIN): Install executables from gems in the bundle to the specified directory. Defaults to false. o cache_all (BUNDLE_CACHE_ALL): Cache all gems, including path and git gems. o cache_all_platforms (BUNDLE_CACHE_ALL_PLATFORMS): Cache gems for all platforms. o cache_path (BUNDLE_CACHE_PATH): The directory that bundler will place cached gems in when running bundle package, and that bundler will look in when installing gems. Defaults to vendor/bundle. o clean (BUNDLE_CLEAN): Whether Bundler should run bundle clean auto- matically after bundle install. o console (BUNDLE_CONSOLE): The console that bundle console starts. Defaults to irb. o default_install_uses_path (BUNDLE_DEFAULT_INSTALL_USES_PATH): Whether a bundle install without an explicit --path argument defaults to installing gems in .bundle. o deployment (BUNDLE_DEPLOYMENT): Disallow changes to the Gemfile. When the Gemfile is changed and the lockfile has not been updated, running Bundler commands will be blocked. o disable_checksum_validation (BUNDLE_DISABLE_CHECKSUM_VALIDATION): Allow installing gems even if they do not match the checksum pro- vided by RubyGems. o disable_exec_load (BUNDLE_DISABLE_EXEC_LOAD): Stop Bundler from using load to launch an executable in-process in bundle exec. o disable_local_branch_check (BUNDLE_DISABLE_LOCAL_BRANCH_CHECK): Allow Bundler to use a local git override without a branch speci- fied in the Gemfile. o disable_multisource (BUNDLE_DISABLE_MULTISOURCE): When set, Gem- files containing multiple sources will produce errors instead of warnings. Use bundle config --delete disable_multisource to unset. o disable_shared_gems (BUNDLE_DISABLE_SHARED_GEMS): Stop Bundler from accessing gems installed to RubyGems' normal location. o disable_version_check (BUNDLE_DISABLE_VERSION_CHECK): Stop Bundler from checking if a newer Bundler version is available on rubygems.org. o error_on_stderr (BUNDLE_ERROR_ON_STDERR): Print Bundler errors to stderr. o force_ruby_platform (BUNDLE_FORCE_RUBY_PLATFORM): Ignore the cur- rent machine's platform and install only ruby platform gems. As a result, gems with native extensions will be compiled from source. o frozen (BUNDLE_FROZEN): Disallow changes to the Gemfile. When the Gemfile is changed and the lockfile has not been updated, running Bundler commands will be blocked. Defaults to true when --deploy- ment is used. o gem.push_key (BUNDLE_GEM__PUSH_KEY): Sets the --key parameter for gem push when using the rake release command with a private gem- stash server. o gemfile (BUNDLE_GEMFILE): The name of the file that bundler should use as the Gemfile. This location of this file also sets the root of the project, which is used to resolve relative paths in the Gem- file, among other things. By default, bundler will search up from the current working directory until it finds a Gemfile. o global_gem_cache (BUNDLE_GLOBAL_GEM_CACHE): Whether Bundler should cache all gems globally, rather than locally to the installing Ruby installation. o ignore_messages (BUNDLE_IGNORE_MESSAGES): When set, no post install messages will be printed. To silence a single gem, use dot notation like ignore_messages.httparty true. o init_gems_rb (BUNDLE_INIT_GEMS_RB) Generate a gems.rb instead of a Gemfile when running bundle init. o jobs (BUNDLE_JOBS): The number of gems Bundler can install in par- allel. Defaults to 1. o list_command (BUNDLE_LIST_COMMAND) Enable new list command feature o major_deprecations (BUNDLE_MAJOR_DEPRECATIONS): Whether Bundler should print deprecation warnings for behavior that will be changed in the next major version. o no_install (BUNDLE_NO_INSTALL): Whether bundle package should skip installing gems. o no_prune (BUNDLE_NO_PRUNE): Whether Bundler should leave outdated gems unpruned when caching. o only_update_to_newer_versions (BUNDLE_ONLY_UPDATE_TO_NEWER_VER- SIONS): During bundle update, only resolve to newer versions of the gems in the lockfile. o path (BUNDLE_PATH): The location on disk where all gems in your bundle will be located regardless of $GEM_HOME or $GEM_PATH values. Bundle gems not found in this location will be installed by bundle install. Defaults to Gem.dir. When --deployment is used, defaults to vendor/bundle. o path.system (BUNDLE_PATH__SYSTEM): Whether Bundler will install gems into the default system path (Gem.dir). o plugins (BUNDLE_PLUGINS): Enable Bundler's experimental plugin sys- tem. o prefer_gems_rb (BUNDLE_PREFER_GEMS_RB) Prefer gems.rb to Gemfile when Bundler is searching for a Gemfile. o print_only_version_number (BUNDLE_PRINT_ONLY_VERSION_NUMBER) Print only version number from bundler --version. o redirect (BUNDLE_REDIRECT): The number of redirects allowed for network requests. Defaults to 5. o retry (BUNDLE_RETRY): The number of times to retry failed network requests. Defaults to 3. o setup_makes_kernel_gem_public (BUNDLE_SETUP_MAKES_KERNEL_GEM_PUB- LIC): Have Bundler.setup make the Kernel#gem method public, even though RubyGems declares it as private. o shebang (BUNDLE_SHEBANG): The program name that should be invoked for generated binstubs. Defaults to the ruby install name used to generate the binstub. o silence_root_warning (BUNDLE_SILENCE_ROOT_WARNING): Silence the warning Bundler prints when installing gems as root. o skip_default_git_sources (BUNDLE_SKIP_DEFAULT_GIT_SOURCES): Whether Bundler should skip adding default git source shortcuts to the Gem- file DSL. o specific_platform (BUNDLE_SPECIFIC_PLATFORM): Allow bundler to resolve for the specific running platform and store it in the lock- file, instead of only using a generic platform. A specific platform is the exact platform triple reported by Gem::Platform.local, such as x86_64-darwin-16 or universal-java-1.8. On the other hand, generic platforms are those such as ruby, mswin, or java. In this example, x86_64-darwin-16 would map to ruby and universal-java-1.8 to java. o ssl_ca_cert (BUNDLE_SSL_CA_CERT): Path to a designated CA certifi- cate file or folder containing multiple certificates for trusted CAs in PEM format. o ssl_client_cert (BUNDLE_SSL_CLIENT_CERT): Path to a designated file containing a X.509 client certificate and key in PEM format. o ssl_verify_mode (BUNDLE_SSL_VERIFY_MODE): The SSL verification mode Bundler uses when making HTTPS requests. Defaults to verify peer. o suppress_install_using_messages (BUNDLE_SUPPRESS_INSTALL_USING_MES- SAGES): Avoid printing Using ... messages during installation when the version of a gem has not changed. o system_bindir (BUNDLE_SYSTEM_BINDIR): The location where RubyGems installs binstubs. Defaults to Gem.bindir. o timeout (BUNDLE_TIMEOUT): The seconds allowed before timing out for network requests. Defaults to 10. o unlock_source_unlocks_spec (BUNDLE_UNLOCK_SOURCE_UNLOCKS_SPEC): Whether running bundle update --source NAME unlocks a gem with the given name. Defaults to true. o update_requires_all_flag (BUNDLE_UPDATE_REQUIRES_ALL_FLAG) Require passing --all to bundle update when everything should be updated, and disallow passing no options to bundle update. o user_agent (BUNDLE_USER_AGENT): The custom user agent fragment Bundler includes in API requests. o with (BUNDLE_WITH): A :-separated list of groups whose gems bundler should install. o without (BUNDLE_WITHOUT): A :-separated list of groups whose gems bundler should not install. In general, you should set these settings per-application by using the applicable flag to the [bundle install(1)][bundle-install] or [bundle package(1)][bundle-package] command. You can set them globally either via environment variables or bundle config, whichever is preferable for your setup. If you use both, envi- ronment variables will take preference over global settings. LOCAL GIT REPOS Bundler also allows you to work against a git repository locally instead of using the remote version. This can be achieved by setting up a local override: bundle config local.GEM_NAME /path/to/local/git/repository For example, in order to use a local Rack repository, a developer could call: bundle config local.rack ~/Work/git/rack Now instead of checking out the remote git repository, the local over- ride will be used. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler. This means a commit in the local git repo will update the revision in the Gemfile.lock to the local git repo revision. This requires the same attention as git submodules. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a com- mit that only exists in your local machine. You'll also need to CGI escape your usernames and passwords as well. Bundler does many checks to ensure a developer won't work with invalid references. Particularly, we force a developer to specify a branch in the Gemfile in order to use this feature. If the branch specified in the Gemfile and the current branch in the local git repository do not match, Bundler will abort. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch. Finally, Bundler also ensures that the current revision in the Gem- file.lock exists in the local git repository. By doing this, Bundler forces you to fetch the latest changes in the remotes. MIRRORS OF GEM SOURCES Bundler supports overriding gem sources with mirrors. This allows you to configure rubygems.org as the gem source in your Gemfile while still using your mirror to fetch gems. bundle config mirror.SOURCE_URL MIRROR_URL For example, to use a mirror of rubygems.org hosted at rubygems-mir- ror.org: bundle config mirror.http://rubygems.org http://rubygems-mirror.org Each mirror also provides a fallback timeout setting. If the mirror does not respond within the fallback timeout, Bundler will try to use the original server instead of the mirror. bundle config mirror.SOURCE_URL.fallback_timeout TIMEOUT For example, to fall back to rubygems.org after 3 seconds: bundle config mirror.https://rubygems.org.fallback_timeout 3 The default fallback timeout is 0.1 seconds, but the setting can cur- rently only accept whole seconds (for example, 1, 15, or 30). CREDENTIALS FOR GEM SOURCES Bundler allows you to configure credentials for any gem source, which allows you to avoid putting secrets into your Gemfile. bundle config SOURCE_HOSTNAME USERNAME:PASSWORD For example, to save the credentials of user claudette for the gem source at gems.longerous.com, you would run: bundle config gems.longerous.com claudette:s00pers3krit Or you can set the credentials as an environment variable like this: export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit" For gems with a git source with HTTP(S) URL you can specify credentials like so: bundle config https://github.com/bundler/bundler.git username:password Or you can set the credentials as an environment variable like so: export BUNDLE_GITHUB__COM=username:password This is especially useful for private repositories on hosts such as Github, where you can use personal OAuth tokens: export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x-oauth-basic December 2017 BUNDLE-CONFIG(1) bundler-1.16.1/man/bundle-outdated.ronn0000644000175000017500000000651413217261023020543 0ustar samuelophsamuelophbundle-outdated(1) -- List installed gems with newer versions available ======================================================================= ## SYNOPSIS `bundle outdated` [GEM] [--local] [--pre] [--source] [--strict] [--parseable | --porcelain] [--group=GROUP] [--groups] [--update-strict] [--patch|--minor|--major] [--filter-major] [--filter-minor] [--filter-patch] ## DESCRIPTION Outdated lists the names and versions of gems that have a newer version available in the given source. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems. Prerelease gems are ignored by default. If your gems are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1. ## OPTIONS * `--local`: Do not attempt to fetch gems remotely and use the gem cache instead. * `--pre`: Check for newer pre-release gems. * `--source`: Check against a specific source. * `--strict`: Only list newer versions allowed by your Gemfile requirements. * `--parseable`, `--porcelain`: Use minimal formatting for more parseable output. * `--group`: List gems from a specific group. * `--groups`: List gems organized by groups. * `--update-strict`: Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor| --major. * `--minor`: Prefer updating only to next minor version. * `--major`: Prefer updating to next major version (default). * `--patch`: Prefer updating only to next patch version. * `--filter-major`: Only list major newer versions. * `--filter-minor`: Only list minor newer versions. * `--filter-patch`: Only list patch newer versions. ## PATCH LEVEL OPTIONS See [bundle update(1)][bundle-update] for details. One difference between the patch level options in `bundle update` and here is the `--strict` option. `--strict` was already an option on outdated before the patch level options were added. `--strict` wasn't altered, and the `--update-strict` option on `outdated` reflects what `--strict` does on `bundle update`. ## FILTERING OUTPUT The 3 filtering options do not affect the resolution of versions, merely what versions are shown in the output. If the regular output shows the following: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default" * headless (newest 2.3.1, installed 2.2.3) in groups "test" `--filter-major` would only show: * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default" `--filter-minor` would only show: * headless (newest 2.3.1, installed 2.2.3) in groups "test" `--filter-patch` would only show: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" Filter options can be combined. `--filter-minor` and `--filter-patch` would show: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" * headless (newest 2.3.1, installed 2.2.3) in groups "test" Combining all three `filter` options would be the same result as providing none of them. bundler-1.16.1/man/gemfile.5.txt0000644000175000017500000005063713217261023017106 0ustar samuelophsamuelophGEMFILE(5) GEMFILE(5) NAME Gemfile - A format for describing gem dependencies for Ruby programs SYNOPSIS A Gemfile describes the gem dependencies required to execute associated Ruby code. Place the Gemfile in the root of the directory containing the associ- ated code. For instance, in a Rails application, place the Gemfile in the same directory as the Rakefile. SYNTAX A Gemfile is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements. GLOBAL SOURCES At the top of the Gemfile, add a line for the Rubygems source that con- tains the gems listed in the Gemfile. source "https://rubygems.org" It is possible, but not recommended as of Bundler 1.7, to add multiple global source lines. Each of these sources MUST be a valid Rubygems repository. Sources are checked for gems following the heuristics described in SOURCE PRIORITY. If a gem is found in more than one global source, Bundler will print a warning after installing the gem indicating which source was used, and listing the other sources where the gem is avail- able. A specific source can be selected for gems that need to use a non-standard repository, suppressing this warning, by using the :source option or a source block. CREDENTIALS Some gem sources require a username and password. Use [bundle con- fig(1)][bundle-config] to set the username and password for any of the sources that need it. The command must be run once on each computer that will install the Gemfile, but this keeps the credentials from being stored in plain text in version control. bundle config gems.example.com user:password For some sources, like a company Gemfury account, it may be easier to include the credentials in the Gemfile as part of the source URL. source "https://user:password@gems.example.com" Credentials in the source URL will take precedence over credentials set using config. RUBY If your application requires a specific Ruby version or engine, specify your requirements using the ruby method, with the following arguments. All parameters are OPTIONAL unless otherwise specified. VERSION (required) The version of Ruby that your application requires. If your application requires an alternate Ruby engine, such as JRuby or Rubinius, this should be the Ruby version that the engine is compatible with. ruby "1.9.3" ENGINE Each application may specify a Ruby engine. If an engine is specified, an engine version must also be specified. What exactly is an Engine? - A Ruby engine is an implementation of the Ruby language. o For background: the reference or original implementation of the Ruby programming language is called Matz's Ruby Interpreter https://en.wikipedia.org/wiki/Ruby_MRI, or MRI for short. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz. MRI is also known as CRuby, because it is written in C. MRI is the most widely used Ruby engine. o Other implementations https://www.ruby-lang.org/en/about/ of Ruby exist. Some of the more well-known implementations include Rubinius https://rubinius.com/, and JRuby http://jruby.org/. Rubinius is an alternative implementation of Ruby written in Ruby. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine. ENGINE VERSION Each application may specify a Ruby engine version. If an engine ver- sion is specified, an engine must also be specified. If the engine is "ruby" the engine version specified must match the Ruby version. ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7" PATCHLEVEL Each application may specify a Ruby patchlevel. ruby "2.0.0", :patchlevel => "247" GEMS Specify gem requirements using the gem method, with the following argu- ments. All parameters are OPTIONAL unless otherwise specified. NAME (required) For each gem requirement, list a single gem line. gem "nokogiri" VERSION Each gem MAY have one or more version specifiers. gem "nokogiri", ">= 1.4.2" gem "RedCloth", ">= 4.1.0", "< 4.2.0" REQUIRE AS Each gem MAY specify files that should be used when autorequiring via Bundler.require. You may pass an array with multiple files or true if file you want required has same name as gem or false to prevent any file from being autorequired. gem "redis", :require => ["redis/connection/hiredis", "redis"] gem "webmock", :require => false gem "debugger", :require => true The argument defaults to the name of the gem. For example, these are identical: gem "nokogiri" gem "nokogiri", :require => "nokogiri" gem "nokogiri", :require => true GROUPS Each gem MAY specify membership in one or more groups. Any gem that does not specify membership in any group is placed in the default group. gem "rspec", :group => :test gem "wirble", :groups => [:development, :test] The Bundler runtime allows its two main methods, Bundler.setup and Bundler.require, to limit their impact to particular groups. # setup adds gems to Ruby's load path Bundler.setup # defaults to all groups require "bundler/setup" # same as Bundler.setup Bundler.setup(:default) # only set up the _default_ group Bundler.setup(:test) # only set up the _test_ group (but `not` _default_) Bundler.setup(:default, :test) # set up the _default_ and _test_ groups, but no others # require requires all of the gems in the specified groups Bundler.require # defaults to the _default_ group Bundler.require(:default) # identical Bundler.require(:default, :test) # requires the _default_ and _test_ groups Bundler.require(:test) # requires the _test_ group The Bundler CLI allows you to specify a list of groups whose gems bun- dle install should not install with the --without option. To specify multiple groups to ignore, specify a list of groups separated by spa- ces. bundle install --without test bundle install --without development test After running bundle install --without test, bundler will remember that you excluded the test group in the last installation. The next time you run bundle install, without any --without option, bundler will recall it. Also, calling Bundler.setup with no parameters, or calling require "bundler/setup" will setup all groups except for the ones you excluded via --without (since they are not available). Note that on bundle install, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies. This means that you cannot list different ver- sions of the same gems in different groups. For more details, see Understanding Bundler http://bundler.io/rationale.html. PLATFORMS If a gem should only be used in a particular platform or set of plat- forms, you can specify them. Platforms are essentially identical to groups, except that you do not need to use the --without install-time flag to exclude groups of gems for other platforms. There are a number of Gemfile platforms: ruby C Ruby (MRI) or Rubinius, but NOT Windows mri Same as ruby, but not Rubinius mingw Windows 32 bit 'mingw32' platform (aka RubyInstaller) x64_mingw Windows 64 bit 'mingw32' platform (aka RubyInstaller x64) rbx Same as ruby, but only Rubinius (not MRI) jruby JRuby mswin Windows You can restrict further by platform and version for all platforms except for rbx, jruby, and mswin. To specify a version in addition to a platform, append the version num- ber without the delimiter to the platform. For example, to specify that a gem should only be used on platforms with Ruby 2.3, use: ruby_23 The full list of platforms and supported versions includes: ruby 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 mri 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 mingw 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 x64_mingw 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 As with groups, you can specify one or more platforms: gem "weakling", :platforms => :jruby gem "ruby-debug", :platforms => :mri_18 gem "nokogiri", :platforms => [:mri_18, :jruby] All operations involving groups (bundle install, Bundler.setup, Bundler.require) behave exactly the same as if any groups not matching the current platform were explicitly excluded. SOURCE You can select an alternate Rubygems repository for a gem using the ':source' option. gem "some_internal_gem", :source => "https://gems.example.com" This forces the gem to be loaded from this source and ignores any global sources declared at the top level of the file. If the gem does not exist in this source, it will not be installed. Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on global sources using the ordering described in SOURCE PRIORITY. Selecting a specific source repository this way also suppresses the ambiguous gem warning described above in GLOBAL SOURCES (#source). GIT If necessary, you can specify that a gem is located at a particular git repository using the :git parameter. The repository can be accessed via several protocols: HTTP(S) gem "rails", :git => "https://github.com/rails/rails.git" SSH gem "rails", :git => "git@github.com:rails/rails.git" git gem "rails", :git => "git://github.com/rails/rails.git" If using SSH, the user that you use to run bundle install MUST have the appropriate keys available in their $HOME/.ssh. NOTE: http:// and git:// URLs should be avoided if at all possible. These protocols are unauthenticated, so a man-in-the-middle attacker can deliver malicious code and compromise your system. HTTPS and SSH are strongly preferred. The group, platforms, and require options are available and behave exactly the same as they would for a normal gem. A git repository SHOULD have at least one file, at the root of the directory containing the gem, with the extension .gemspec. This file MUST contain a valid gem specification, as expected by the gem build command. If a git repository does not have a .gemspec, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions. As a result, it may fail to prop- erly integrate into your application. If a git repository does have a .gemspec for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the .gemspec specifies a version matching the version specifier. If not, bundler will print a warning. gem "rails", "2.3.8", :git => "https://github.com/rails/rails.git" # bundle install will fail, because the .gemspec in the rails # repository's master branch specifies version 3.0.0 If a git repository does not have a .gemspec for the gem you attached it to, a version specifier MUST be provided. Bundler will use this ver- sion in the simple .gemspec it creates. Git repositories support a number of additional options. branch, tag, and ref You MUST only specify at most one of these options. The default is :branch => "master" For example: git "https://github.com/rails/rails.git", :branch => "5-0-sta- ble" do git "https://github.com/rails/rails.git", :tag => "v5.0.0" do git "https://github.com/rails/rails.git", :ref => "4aded" do submodules For reference, a git submodule https://git-scm.com/book/en/v2/Git-Tools-Submodules lets you have another git repository within a subfolder of your reposi- tory. Specify :submodules => true to cause bundler to expand any submodules included in the git repository If a git repository contains multiple .gemspecs, each .gemspec repre- sents a gem located at the same place in the file system as the .gem- spec. |~rails [git root] | |-rails.gemspec [rails gem located here] |~actionpack | |-actionpack.gemspec [actionpack gem located here] |~activesupport | |-activesupport.gemspec [activesupport gem located here] |... To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs gem build name.gemspec and then installs the resulting gem. The gem build command, which comes standard with Rubygems, evaluates the .gemspec in the context of the directory in which it is located. GIT SOURCE A custom git source can be defined via the git_source method. Provide the source's name as an argument, and a block which receives a single argument and interpolates it into a string to return the full repo address: git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" } gem 'rails', :stash => 'forks/rails' In addition, if you wish to choose a specific branch: gem "rails", :stash => "forks/rails", :branch => "branch_name" GITHUB NOTE: This shorthand should be avoided until Bundler 2.0, since it cur- rently expands to an insecure git:// URL. This allows a man-in-the-mid- dle attacker to compromise your system. If the git repository you want to use is hosted on GitHub and is pub- lic, you can use the :github shorthand to specify the github username and repository name (without the trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. gem "rails", :github => "rails/rails" gem "rails", :github => "rails" Are both equivalent to gem "rails", :git => "git://github.com/rails/rails.git" Since the github method is a specialization of git_source, it accepts a :branch named argument. GIST If the git repository you want to use is hosted as a Github Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing ".git"). gem "the_hatch", :gist => "4815162342" Is equivalent to: gem "the_hatch", :git => "https://gist.github.com/4815162342.git" Since the gist method is a specialization of git_source, it accepts a :branch named argument. BITBUCKET If the git repository you want to use is hosted on Bitbucket and is public, you can use the :bitbucket shorthand to specify the bitbucket username and repository name (without the trailing ".git"), separated by a slash. If both the username and repository name are the same, you can omit one. gem "rails", :bitbucket => "rails/rails" gem "rails", :bitbucket => "rails" Are both equivalent to gem "rails", :git => "https://rails@bitbucket.org/rails/rails.git" Since the bitbucket method is a specialization of git_source, it accepts a :branch named argument. PATH You can specify that a gem is located in a particular location on the file system. Relative paths are resolved relative to the directory con- taining the Gemfile. Similar to the semantics of the :git option, the :path option requires that the directory in question either contains a .gemspec for the gem, or that you specify an explicit version that bundler should use. Unlike :git, bundler does not compile C extensions for gems specified as paths. gem "rails", :path => "vendor/rails" If you would like to use multiple local gems directly from the filesys- tem, you can set a global path option to the path containing the gem's files. This will automatically load gemspec files from subdirectories. path 'components' do gem 'admin_ui' gem 'public_ui' end BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS The :source, :git, :path, :group, and :platforms options may be applied to a group of gems by using block form. source "https://gems.example.com" do gem "some_internal_gem" gem "another_internal_gem" end git "https://github.com/rails/rails.git" do gem "activesupport" gem "actionpack" end platforms :ruby do gem "ruby-debug" gem "sqlite3" end group :development, :optional => true do gem "wirble" gem "faker" end In the case of the group block form the :optional option can be given to prevent a group from being installed unless listed in the --with option given to the bundle install command. In the case of the git block form, the :ref, :branch, :tag, and :sub- modules options may be passed to the git method, and all gems in the block will inherit those options. INSTALL_IF The install_if method allows gems to be installed based on a proc or lambda. This is especially useful for optional gems that can only be used if certain software is installed or some other conditions are met. install_if -> { RUBY_PLATFORM =~ /darwin/ } do gem "pasteboard" end GEMSPEC The .gemspec http://guides.rubygems.org/specification-reference/ file is where you provide metadata about your gem to Rubygems. Some required Gemspec attributes include the name, description, and homepage of your gem. This is also where you specify the dependencies your gem needs to run. If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the gemspec method to pull in the dependen- cies listed in the .gemspec file. The gemspec method adds any runtime dependencies as gem requirements in the default group. It also adds development dependencies as gem requirements in the development group. Finally, it adds a gem require- ment on your project (:path => '.'). In conjunction with Bundler.setup, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths. The gemspec method supports optional :path, :glob, :name, and :develop- ment_group options, which control where bundler looks for the .gemspec, the glob it uses to look for the gemspec (defaults to: "{,,/*}.gem- spec"), what named .gemspec it uses (if more than one is present), and which group development dependencies are included in. When a gemspec dependency encounters version conflicts during resolu- tion, the local version under development will always be selected -- even if there are remote versions that better match other requirements for the gemspec gem. SOURCE PRIORITY When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order: 1. The source explicitly attached to the gem (using :source, :path, or :git) 2. For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from rubygems.org 3. The sources specified via global source lines, searching each source in your Gemfile from last added to first added. July 2017 GEMFILE(5) bundler-1.16.1/man/bundle-exec.10000644000175000017500000001506113217261023017037 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-EXEC" "1" "July 2017" "" "" . .SH "NAME" \fBbundle\-exec\fR \- Execute a command in the context of the bundle . .SH "SYNOPSIS" \fBbundle exec\fR [\-\-keep\-file\-descriptors] \fIcommand\fR . .SH "DESCRIPTION" This command executes the command, making all gems specified in the \fBGemfile(5)\fR available to \fBrequire\fR in Ruby programs\. . .P Essentially, if you would normally have run something like \fBrspec spec/my_spec\.rb\fR, and you want to use the gems specified in the \fBGemfile(5)\fR and installed via [bundle install(1)][bundle\-install], you should run \fBbundle exec rspec spec/my_spec\.rb\fR\. . .P Note that \fBbundle exec\fR does not require that an executable is available on your shell\'s \fB$PATH\fR\. . .SH "OPTIONS" . .TP \fB\-\-keep\-file\-descriptors\fR Exec in Ruby 2\.0 began discarding non\-standard file descriptors\. When this flag is passed, exec will revert to the 1\.9 behaviour of passing all file descriptors to the new process\. . .SH "BUNDLE INSTALL \-\-BINSTUBS" If you use the \fB\-\-binstubs\fR flag in [bundle install(1)][bundle\-install], Bundler will automatically create a directory (which defaults to \fBapp_root/bin\fR) containing all of the executables available from gems in the bundle\. . .P After using \fB\-\-binstubs\fR, \fBbin/rspec spec/my_spec\.rb\fR is identical to \fBbundle exec rspec spec/my_spec\.rb\fR\. . .SH "ENVIRONMENT MODIFICATIONS" \fBbundle exec\fR makes a number of changes to the shell environment, then executes the command you specify in full\. . .IP "\(bu" 4 make sure that it\'s still possible to shell out to \fBbundle\fR from inside a command invoked by \fBbundle exec\fR (using \fB$BUNDLE_BIN_PATH\fR) . .IP "\(bu" 4 put the directory containing executables (like \fBrails\fR, \fBrspec\fR, \fBrackup\fR) for your bundle on \fB$PATH\fR . .IP "\(bu" 4 make sure that if bundler is invoked in the subshell, it uses the same \fBGemfile\fR (by setting \fBBUNDLE_GEMFILE\fR) . .IP "\(bu" 4 add \fB\-rbundler/setup\fR to \fB$RUBYOPT\fR, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle . .IP "" 0 . .P It also modifies Rubygems: . .IP "\(bu" 4 disallow loading additional gems not in the bundle . .IP "\(bu" 4 modify the \fBgem\fR method to be a no\-op if a gem matching the requirements is in the bundle, and to raise a \fBGem::LoadError\fR if it\'s not . .IP "\(bu" 4 Define \fBGem\.refresh\fR to be a no\-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment . .IP "\(bu" 4 Override \fBGem\.bin_path\fR to use the gems in the bundle, making system executables work . .IP "\(bu" 4 Add all gems in the bundle into Gem\.loaded_specs . .IP "" 0 . .P Finally, \fBbundle exec\fR also implicitly modifies \fBGemfile\.lock\fR if the lockfile and the Gemfile do not match\. Bundler needs the Gemfile to determine things such as a gem\'s groups, \fBautorequire\fR, and platforms, etc\., and that information isn\'t stored in the lockfile\. The Gemfile and lockfile must be synced in order to \fBbundle exec\fR successfully, so \fBbundle exec\fR updates the lockfile beforehand\. . .SS "Loading" By default, when attempting to \fBbundle exec\fR to a file with a ruby shebang, Bundler will \fBKernel\.load\fR that file instead of using \fBKernel\.exec\fR\. For the vast majority of cases, this is a performance improvement\. In a rare few cases, this could cause some subtle side\-effects (such as dependence on the exact contents of \fB$0\fR or \fB__FILE__\fR) and the optimization can be disabled by enabling the \fBdisable_exec_load\fR setting\. . .SS "Shelling out" Any Ruby code that opens a subshell (like \fBsystem\fR, backticks, or \fB%x{}\fR) will automatically use the current Bundler environment\. If you need to shell out to a Ruby command that is not part of your current bundle, use the \fBwith_clean_env\fR method with a block\. Any subshells created inside the block will be given the environment present before Bundler was activated\. For example, Homebrew commands run Ruby, but don\'t work inside a bundle: . .IP "" 4 . .nf Bundler\.with_clean_env do `brew install wget` end . .fi . .IP "" 0 . .P Using \fBwith_clean_env\fR is also necessary if you are shelling out to a different bundle\. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use \fBwith_clean_env\fR\. . .IP "" 4 . .nf Bundler\.with_clean_env do Dir\.chdir "/other/bundler/project" do `bundle exec \./script` end end . .fi . .IP "" 0 . .P Bundler provides convenience helpers that wrap \fBsystem\fR and \fBexec\fR, and they can be used like this: . .IP "" 4 . .nf Bundler\.clean_system(\'brew install wget\') Bundler\.clean_exec(\'brew install wget\') . .fi . .IP "" 0 . .SH "RUBYGEMS PLUGINS" At present, the Rubygems plugin system requires all files named \fBrubygems_plugin\.rb\fR on the load path of \fIany\fR installed gem when any Ruby code requires \fBrubygems\.rb\fR\. This includes executables installed into the system, like \fBrails\fR, \fBrackup\fR, and \fBrspec\fR\. . .P Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies\. . .P For instance, the \fBgemcutter 0\.5\fR gem depended on \fBjson_pure\fR\. If you had that version of gemcutter installed (even if you \fIalso\fR had a newer version without this problem), Rubygems would activate \fBgemcutter 0\.5\fR and \fBjson_pure \fR\. . .P If your Gemfile(5) also contained \fBjson_pure\fR (or a gem with a dependency on \fBjson_pure\fR), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your \fBGemfile\.lock\fR\. . .P If this happens, bundler will say: . .IP "" 4 . .nf You have already activated json_pure 1\.4\.6 but your Gemfile requires json_pure 1\.4\.3\. Consider using bundle exec\. . .fi . .IP "" 0 . .P In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin\. In general, the authors of these plugins (in this case, the \fBgemcutter\fR gem) have released newer versions that are more careful in their plugins\. . .P You can find a list of all the gems containing gem plugins by running . .IP "" 4 . .nf ruby \-rubygems \-e "puts Gem\.find_files(\'rubygems_plugin\.rb\')" . .fi . .IP "" 0 . .P At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren\'t using (\fBgem uninstall gem_name\fR)\. bundler-1.16.1/man/bundle-info.ronn0000644000175000017500000000056113217261023017661 0ustar samuelophsamuelophbundle-info(1) -- Show information for the given gem in your bundle ========================================================================= ## SYNOPSIS `bundle info` [GEM] [--path] ## DESCRIPTION Print the basic information about the provided GEM such as homepage, version, path and summary. ## OPTIONS * `--path`: Print the path of the given gem bundler-1.16.1/man/bundle-outdated.1.txt0000644000175000017500000000661613217261023020550 0ustar samuelophsamuelophBUNDLE-OUTDATED(1) BUNDLE-OUTDATED(1) NAME bundle-outdated - List installed gems with newer versions available SYNOPSIS bundle outdated [GEM] [--local] [--pre] [--source] [--strict] [--parseable | --porcelain] [--group=GROUP] [--groups] [--update-strict] [--patch|--minor|--major] [--filter-major] [--fil- ter-minor] [--filter-patch] DESCRIPTION Outdated lists the names and versions of gems that have a newer version available in the given source. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems. Prerelease gems are ignored by default. If your gems are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1. OPTIONS --local Do not attempt to fetch gems remotely and use the gem cache instead. --pre Check for newer pre-release gems. --source Check against a specific source. --strict Only list newer versions allowed by your Gemfile requirements. --parseable, --porcelain Use minimal formatting for more parseable output. --group List gems from a specific group. --groups List gems organized by groups. --update-strict Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor| --major. --minor Prefer updating only to next minor version. --major Prefer updating to next major version (default). --patch Prefer updating only to next patch version. --filter-major Only list major newer versions. --filter-minor Only list minor newer versions. --filter-patch Only list patch newer versions. PATCH LEVEL OPTIONS See [bundle update(1)][bundle-update] for details. One difference between the patch level options in bundle update and here is the --strict option. --strict was already an option on outdated before the patch level options were added. --strict wasn't altered, and the --update-strict option on outdated reflects what --strict does on bundle update. FILTERING OUTPUT The 3 filtering options do not affect the resolution of versions, merely what versions are shown in the output. If the regular output shows the following: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default" * headless (newest 2.3.1, installed 2.2.3) in groups "test" --filter-major would only show: * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default" --filter-minor would only show: * headless (newest 2.3.1, installed 2.2.3) in groups "test" --filter-patch would only show: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" Filter options can be combined. --filter-minor and --filter-patch would show: * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test" * headless (newest 2.3.1, installed 2.2.3) in groups "test" Combining all three filter options would be the same result as provid- ing none of them. July 2017 BUNDLE-OUTDATED(1) bundler-1.16.1/man/bundle-open.10000644000175000017500000000110513217261023017046 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-OPEN" "1" "February 2017" "" "" . .SH "NAME" \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle . .SH "SYNOPSIS" \fBbundle open\fR [GEM] . .SH "DESCRIPTION" Opens the source directory of the provided GEM in your editor\. . .P For this to work the \fBEDITOR\fR or \fBBUNDLER_EDITOR\fR environment variable has to be set\. . .P Example: . .IP "" 4 . .nf bundle open \'rack\' . .fi . .IP "" 0 . .P Will open the source directory for the \'rack\' gem in your bundle\. bundler-1.16.1/man/bundle-lock.1.txt0000644000175000017500000000617013217261023017662 0ustar samuelophsamuelophBUNDLE-LOCK(1) BUNDLE-LOCK(1) NAME bundle-lock - Creates / Updates a lockfile without installing SYNOPSIS bundle lock [--update] [--local] [--print] [--lockfile=PATH] [--full-index] [--add-platform] [--remove-platform] [--patch] [--minor] [--major] [--strict] [--conservative] DESCRIPTION Lock the gems specified in Gemfile. OPTIONS --update=<*gems> Ignores the existing lockfile. Resolve then updates lockfile. Taking a list of gems or updating all gems if no list is given. --local Do not attempt to connect to rubygems.org. Instead, Bundler will use the gems already present in Rubygems' cache or in ven- dor/cache. Note that if a appropriate platform-specific gem exists on rubygems.org it will not be found. --print Prints the lockfile to STDOUT instead of writing to the file system. --lockfile= The path where the lockfile should be written to. --full-index Fall back to using the single-file index of all gems. --add-platform Add a new platform to the lockfile, re-resolving for the addi- tion of that platform. --remove-platform Remove a platform from the lockfile. --patch If updating, prefer updating only to next patch version. --minor If updating, prefer updating only to next minor version. --major If updating, prefer updating to next major version (default). --strict If updating, do not allow any gem to be updated past latest --patch | --minor | --major. --conservative If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated. UPDATING ALL GEMS If you run bundle lock with --update option without list of gems, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources. UPDATING A LIST OF GEMS Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the Gemfile.lock. For instance, you only want to update nokogiri, run bundle lock --update nokogiri. Bundler will update nokogiri and any of its dependencies, but leave the rest of the gems that you specified locked to the versions in the Gem- file.lock. SUPPORTING OTHER PLATFORMS If you want your bundle to support platforms other than the one you're running locally, you can run bundle lock --add-platform PLATFORM to add PLATFORM to the lockfile, force bundler to re-resolve and consider the new platform when picking gems, all without needing to have a machine that matches PLATFORM handy to install those platform-specific gems on. For a full explanation of gem platforms, see gem help platform. PATCH LEVEL OPTIONS See [bundle update(1)][bundle-update] for details. February 2017 BUNDLE-LOCK(1) bundler-1.16.1/man/bundle-binstubs.ronn0000644000175000017500000000275313217261023020564 0ustar samuelophsamuelophbundle-binstubs(1) -- Install the binstubs of the listed gems ============================================================= ## SYNOPSIS `bundle binstubs` [--force] [--path PATH] [--standalone] ## DESCRIPTION Binstubs are scripts that wrap aroung executables. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it into `bin/`. Binstubs are a shortcut-or alternative- to always using `bundle exec`. This gives you a file that can by run directly, and one that will always run the correct gem version used by the application. For example, if you run `bundle binstubs rspec-core`, Bundler will create the file `bin/rspec`. That file will contain enough code to load Bundler, tell it to load the bundled gems, and then run rspec. This command generates binstubs for executables in `GEM_NAME`. Binstubs are put into `bin`, or the `--path` directory if one has been set. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems. ## OPTIONS * `--force`: Overwrite existing binstubs if they exist. * `--path`: The location to install the specified binstubs to. This defaults to `bin`. * `--standalone`: Makes binstubs that can work without depending on Rubygems or Bundler at runtime. * `--sheband`: Specify a different shebang executable name than the default (default 'ruby') ## BUNDLE INSTALL --BINSTUBS To create binstubs for all the gems in the bundle you can use the `--binstubs` flag in [bundle install(1)][bundle-install]. bundler-1.16.1/man/bundle-info.1.txt0000644000175000017500000000057413217261023017667 0ustar samuelophsamuelophBUNDLE-INFO(1) BUNDLE-INFO(1) NAME bundle-info - Show information for the given gem in your bundle SYNOPSIS bundle info [GEM] [--path] DESCRIPTION Print the basic information about the provided GEM such as homepage, version, path and summary. OPTIONS --path Print the path of the given gem February 2017 BUNDLE-INFO(1) bundler-1.16.1/man/bundle-gem.10000644000175000017500000000630013217261023016657 0ustar samuelophsamueloph.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "BUNDLE\-GEM" "1" "December 2017" "" "" . .SH "NAME" \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem . .SH "SYNOPSIS" \fBbundle gem\fR \fIGEM_NAME\fR \fIOPTIONS\fR . .SH "DESCRIPTION" Generates a directory named \fBGEM_NAME\fR with a \fBRakefile\fR, \fBGEM_NAME\.gemspec\fR, and other supporting files and directories that can be used to develop a rubygem with that name\. . .P Run \fBrake \-T\fR in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems\.org\. . .P The generated project skeleton can be customized with OPTIONS, as explained below\. Note that these options can also be specified via Bundler\'s global configuration file using the following names: . .IP "\(bu" 4 \fBgem\.coc\fR . .IP "\(bu" 4 \fBgem\.mit\fR . .IP "\(bu" 4 \fBgem\.test\fR . .IP "" 0 . .SH "OPTIONS" . .TP \fB\-\-exe\fR or \fB\-b\fR or \fB\-\-bin\fR Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\. . .TP \fB\-\-no\-exe\fR Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\. . .TP \fB\-\-coc\fR Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\. . .TP \fB\-\-no\-coc\fR Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\. . .TP \fB\-\-ext\fR Add boilerplate for C extension code to the generated project\. This behavior is disabled by default\. . .TP \fB\-\-no\-ext\fR Do not add C extension code (overrides \fB\-\-ext\fR specified in the global config)\. . .TP \fB\-\-mit\fR Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\. . .TP \fB\-\-no\-mit\fR Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\. . .TP \fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR and \fBrspec\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\. If no option is specified, the default testing framework is RSpec\. . .TP \fB\-e\fR, \fB\-\-edit[=EDITOR]\fR Open the resulting GEM_NAME\.gemspec in EDITOR, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\. . .SH "SEE ALSO" . .IP "\(bu" 4 bundle\-config \fIhttp://bundler\.io/v1\.14/bundle_config\.html\fR . .IP "" 0 bundler-1.16.1/man/bundle-list.ronn0000644000175000017500000000047513217261023017705 0ustar samuelophsamuelophbundle-list(1) -- List all the gems in the bundle ========================================================================= ## SYNOPSIS `bundle list` [--name-only] ## DESCRIPTION Prints a list of all the gems in the bundle including their version. ## OPTIONS * `--name-only`: Print only the name of each gem. bundler-1.16.1/man/bundle-inject.1.txt0000644000175000017500000000116713217261023020207 0ustar samuelophsamuelophBUNDLE-INJECT(1) BUNDLE-INJECT(1) NAME bundle-inject - Add named gem(s) with version requirements to Gemfile SYNOPSIS bundle inject [GEM] [VERSION] DESCRIPTION Adds the named gem(s) with their version requirements to the resolved Gemfile(5). This command will add the gem to both your Gemfile(5) and Gemfile.lock if it isn't listed yet. Example: bundle install bundle inject 'rack' '> 0' This will inject the 'rack' gem with a version greater than 0 in your Gemfile(5) and Gemfile.lock February 2017 BUNDLE-INJECT(1) bundler-1.16.1/README.md0000644000175000017500000000701413217261023015265 0ustar samuelophsamueloph[![Version ](https://img.shields.io/gem/v/bundler.svg?style=flat)](https://rubygems.org/gems/bundler) [![Build Status](https://img.shields.io/travis/bundler/bundler/master.svg?style=flat)](https://travis-ci.org/bundler/bundler) [![Code Climate](https://img.shields.io/codeclimate/github/bundler/bundler.svg?style=flat)](https://codeclimate.com/github/bundler/bundler) [![Inline docs ](http://inch-ci.org/github/bundler/bundler.svg?style=flat)](http://inch-ci.org/github/bundler/bundler) [![Slack ](http://bundler-slackin.herokuapp.com/badge.svg)](http://bundler-slackin.herokuapp.com) # Bundler: a gem to bundle gems Bundler makes sure Ruby applications run the same code on every machine. It does this by managing the gems that the application depends on. Given a list of gems, it can automatically download and install those gems, as well as any other gems needed by the gems that are listed. Before installing gems, it checks the versions of every gem to make sure that they are compatible, and can all be loaded at the same time. After the gems have been installed, Bundler can help you update some or all of them when new versions become available. Finally, it records the exact versions that have been installed, so that others can install the exact same gems. ### Installation and usage To install (or update to the latest version): ``` gem install bundler ``` To install a prerelease version (if one is available), run `gem install bundler --pre`. To uninstall Bundler, run `gem uninstall bundler`. Bundler is most commonly used to manage your application's dependencies. For example, these commands will allow you to use Bundler to manage the `rspec` gem for your application: ``` bundle init echo 'gem "rspec"' >> Gemfile bundle install bundle exec rspec ``` See [bundler.io](http://bundler.io) for the full documentation. ### Troubleshooting For help with common problems, see [TROUBLESHOOTING](doc/TROUBLESHOOTING.md). Still stuck? Try [filing an issue](doc/contributing/ISSUES.md). ### Other questions To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANGELOG.md). To get in touch with the Bundler core team and other Bundler users, please see [getting help](doc/contributing/GETTING_HELP.md). ### Contributing If you'd like to contribute to Bundler, that's awesome, and we <3 you. There's a guide to contributing to Bundler (both code and general help) over in [our documentation section](doc/README.md). While some Bundler contributors are compensated by Ruby Together, the project maintainers make decisions independent of Ruby Together. As a project, we welcome contributions regardless of the author’s affiliation with Ruby Together. ### Supporting
Ruby Together pays some Bundler maintainers for their ongoing work. As a grassroots initiative committed to supporting the critical Ruby infrastructure you rely on, Ruby Together is funded entirely by the Ruby community. Contribute today as an individual or (better yet) as a company to ensure that Bundler, RubyGems, and other shared tooling is around for years to come. ### Code of Conduct Everyone interacting in the Bundler project’s codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [Bundler code of conduct](https://github.com/bundler/bundler/blob/master/CODE_OF_CONDUCT.md). bundler-1.16.1/LICENSE.md0000644000175000017500000000213613217261023015412 0ustar samuelophsamuelophPortions copyright (c) 2010 Andre Arko Portions copyright (c) 2009 Engine Yard MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. bundler-1.16.1/exe/0000755000175000017500000000000013217261023014565 5ustar samuelophsamuelophbundler-1.16.1/exe/bundle0000755000175000017500000000166513217261023015774 0ustar samuelophsamueloph#!/usr/bin/env ruby # frozen_string_literal: true # Exit cleanly from an early interrupt Signal.trap("INT") do Bundler.ui.debug("\n#{caller.join("\n")}") if defined?(Bundler) exit 1 end require "bundler" # Check if an older version of bundler is installed $LOAD_PATH.each do |path| next unless path =~ %r{/bundler-0\.(\d+)} && $1.to_i < 9 err = String.new err << "Looks like you have a version of bundler that's older than 0.9.\n" err << "Please remove your old versions.\n" err << "An easy way to do this is by running `gem cleanup bundler`." abort(err) end require "bundler/friendly_errors" Bundler.with_friendly_errors do require "bundler/cli" # Allow any command to use --help flag to show help for that command help_flags = %w[--help -h] help_flag_used = ARGV.any? {|a| help_flags.include? a } args = help_flag_used ? Bundler::CLI.reformatted_help_args(ARGV) : ARGV Bundler::CLI.start(args, :debug => true) end bundler-1.16.1/exe/bundler0000755000175000017500000000014013217261023016141 0ustar samuelophsamueloph#!/usr/bin/env ruby # frozen_string_literal: true load File.expand_path("../bundle", __FILE__) bundler-1.16.1/exe/bundle_ruby0000755000175000017500000000264313217261023017032 0ustar samuelophsamueloph#!/usr/bin/env ruby # frozen_string_literal: true require "bundler/shared_helpers" Bundler::SharedHelpers.major_deprecation(2, "the bundle_ruby executable has been removed in favor of `bundle platform --ruby`") Signal.trap("INT") { exit 1 } require "bundler/errors" require "bundler/ruby_version" require "bundler/ruby_dsl" module Bundler class Dsl include RubyDsl attr_accessor :ruby_version def initialize @ruby_version = nil end def eval_gemfile(gemfile, contents = nil) contents ||= File.open(gemfile, "rb", &:read) instance_eval(contents, gemfile.to_s, 1) rescue SyntaxError => e bt = e.message.split("\n")[1..-1] raise GemfileError, ["Gemfile syntax error:", *bt].join("\n") rescue ScriptError, RegexpError, NameError, ArgumentError => e e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})" STDERR.puts e.backtrace.join("\n ") raise GemfileError, "There was an error in your Gemfile," \ " and Bundler cannot continue." end def source(source, options = {}) end def gem(name, *args) end def group(*args) end end end dsl = Bundler::Dsl.new begin dsl.eval_gemfile(Bundler::SharedHelpers.default_gemfile) ruby_version = dsl.ruby_version if ruby_version puts ruby_version else puts "No ruby version specified" end rescue Bundler::GemfileError => e puts e.message exit(-1) end bundler-1.16.1/CHANGELOG.md0000644000175000017500000033006013217261023015617 0ustar samuelophsamueloph## 1.16.1 (2017-12-12) Bugfixes: - avoid hanging on complex resolver errors ([#6114](https://github.com/bundler/bundler/issues/6114), @halfbyte) - avoid an error when running `bundle update --group` ([#6156](https://github.com/bundler/bundler/issues/6156), @mattbrictson) - ensure the resolver prefers non-pre-release gems when possible ([#6181](https://github.com/bundler/bundler/issues/6181), @greysteil) - include bundler's gemspec in the built gem ([#6165](https://github.com/bundler/bundler/issues/6165), @dr-itz) - ensure locally installed specs are not overriden by those in remote sources during dependency resolution ([#6072](https://github.com/bundler/bundler/issues/6072), @indirect) - ensure custom gemfiles are respected in generated binstubs (@pftg) - fail gracefully when loading a bundler-generated binstub when `bin/bundle` was not generated by bundler ([#6149](https://github.com/bundler/bundler/issues/6149), @hsbt) - allow `bundle init` to be run even when a parent directory contains a gemfile ([#6205](https://github.com/bundler/bundler/issues/6205), @colby-swandale) ## 1.16.0 (2017-10-31) Bugfixes: - avoid new RubyGems warning about unsafe YAML loading (to keep output consistent) (@segiddins) - load digest subclasses in a thread-safe manner (@segiddins, @colby-swandale) - avoid unusued variable warnings under ruby 2.5 (@amatsuda) - fix printing the same message twice in verbose mode ([#6028](https://github.com/bundler/bundler/issues/6028), @akhramov) - allow `SignalException`s to bubble up to the interpreter during `bundle exec` ([#6090](https://github.com/bundler/bundler/issues/6090), @dekellum) - avoid activating stdlib digest under Ruby 2.5 (@segiddins) - prioritise explicitly requested gems in dependency resolution sort order (@segiddins) - reduce memory usage during dependency resolution ([#6114](https://github.com/bundler/bundler/issues/6114), @greysteil) - ensure that the default bundler gem is not accidentally activated on ruby 2.5 when using local git overrides (@segiddins) ## 1.16.0.pre.3 (2017-10-04) Features: - the output from `bundle env` includes more information, particularly both the compiled & loaded versions of OpenSSL (@indirect) Bugfixes: - fix a bug where installing on FreeBSD would accidentally raise an error (#6013, @olleolleolle) - fix a regression in 1.16 where pre-release gems could accidentally be resolved even when the gemfile contained no pre-release requirements (@greysteil) - bundler will avoid making unnecessary network requests to fetch dependency data, fixing a regression introduced in 1.16 (@segiddins) - the outdated bundler version message is disabled by default until the message has been fine-tuned (#6004, @segiddins) ## 1.16.0.pre.2 (2017-09-06) Bugfixes: - handle when a connection is missing a socket when warning about OpenSSL version (@greysteil) - the description for the `rake release` task now reflects `$RUBYGEMS_HOST` (@wadetandy) - fix a bug where `bundle update` would regress transitive dependencies (@greysteil) ## 1.16.0.pre.1 (2017-09-04) Features: - allow using non-branch symbolic refs in a git source (#4845, @segiddins) - allow absolute paths in the `cache path` setting (#5627, @mal) - gems created via `bundle gem` with rspec have `--require spec_helper` in their `.rspec` file (@koic) - `bundle env` includes `Gem.ruby` and the `bundle` binstub shebang when they don't match (#5616, @segiddins) - allow passing gem names to `bundle pristine` (@segiddins) - `bundle version` and `bundle env` include the commit and build date for the bundler gem (#5049, @segiddins) - add the `--shebang` option to `bundle binstubs` (#4070, @segiddins, @Zorbash) - gemfiles are `eval`ed one fewer time when running `bundle install` (#4952, #3096, #4417, @segiddins) - the `fileutils` gem is now vendored so different versions of the gem can be activated (@segiddins) - speed up no-op installations (#5842, @segiddins) - default to keeping the lockfile in the default gem template (@deivid-rodriguez) - add a special bundler binstub that ensures the correct version of bundler is activated (#5876, @segiddins) - speed up dependency resolution and ensure that all resolvable gemfiles can be installed (@segiddins, @greysteil) - add a `bundle list` command that prints the gems in use (#4754, @colby-swandale) - allow adding credentials to a gem source during deployment when `allow_deployment_source_credential_changes` is set (@adrian-gomez) - making an outdated (and insecure) TLS connection to rubygems.org will print a warning (@segiddins) Bugfixes: - allow configuring a mirror fallback timeout without a trailing slash (#4830, @segiddins) - fix handling of mirrors for file: urls that contain upper-case characters (@segiddins) - list the correct gem host for `rake release` when `allowed_push_host` has been set (@mdeering) - ensure `Bundler.original_env` preserves all env keys that bundler sets (#5700, @segiddins) - ensure `bundle pristine` removes files added to a git gem (@segiddins) - load plugin files from path gems before gem installation (#5429, @segiddins) - ensure gems containing manpages are properly set up (#5730, @segiddins) - avoid fetching remote specs when all effected gems are in groups that are not being installed (@segiddins) - allow `BUNDLE_GEMFILE` to be a relative path (#5712, @gxespino) - show a more helpful error message when a gem fails to install due to a corrupted lockfile (#5846, @segiddins) - add a process lock to allow multiple concurrent `bundle install`s (#5851, @stefansedich) - ensure that specifications always return an array for `#extensions` (@greysteil) - print a helpful error message when using a gem in the Gemfile with an empty name (@colby-swandale) - ensure that all gemfiles are included in `bundle env` (@segiddins) - use ssl client cert and ca cert settings from gem configuration as fallbacks (@stan3) - avoid global namespace pollution when loading gems (#5958, @shyouhei) - avoid running a complete re-resolve on `bundle update --bundler` (@segiddins) - allow `bundle binstubs --standalone` to work without `path` being set (@colby-swandale) - fix support for bundle paths that include jars or wars on jruby (#5975, @torcido) ## 1.15.4 (2017-08-19) Bugfixes: - handle file conflicts gracefully in `bundle gem` (@rafaelfranca, @segiddins) - bundler will fail gracefully when the bundle path contains the system path separator (#5485, ajwann) - failed gem downloads will be retried consistently across different RubyGems versions (@shayonj) - `bundle pristine` will respect build options while re-building native extensions (@NickLaMuro) ## 1.15.3 (2017-07-21) Bugfixes: - ensure that empty strings passed to `bundle config` are serialized & parsed properly (#5881, @segiddins) - avoid printing an outdated version warning when running a parseable command (@segiddins) ## 1.15.2 (2017-07-17) Features: - new gemfiles created by bundler will include an explicit `github` git source that uses `https` (@segiddins) Bugfixes: - inline gemfiles work when `BUNDLE_BIN` is set (#5847, @segiddins) - avoid using the old dependency API when there are no changes to the compact index files (#5373, @greysteil) - fail gracefully when the full index serves gemspecs with invalid dependencies (#5797, @segiddins) - support installing gemfiles that use `eval_gemfile`, `:path` gems with relative paths, and `--deployment` simultaneously (@NickLaMuro) - `bundle config` will print settings as the type they are interpreted as (@segiddins) - respect the `no_proxy` environment variable when making network requests (#5781, @jakauppila) - commands invoked with `--verbose` will not have default flags printed (@segiddins) - allow `bundle viz` to work when another gem has a requirable `grapviz` file (#5707, @segiddins) - ensure bundler puts activated gems on the `$LOAD_PATH` in a consistent order (#5696, @segiddins) ## 1.15.1 (2017-06-02) Bugfixes: - `bundle lock --update GEM` will fail gracefully when the gem is not in the lockfile (#5693, @segiddins) - `bundle init --gemspec` will fail gracefully when the gemspec is invalid (@colby-swandale) - `bundle install --force` works when the gemfile contains git gems (#5678, @segiddins) - `bundle env` will print well-formed markdown when there are no settings (#5677, @segiddins) ## 1.15.0 (2017-05-19) This space intentionally left blank. ## 1.15.0.pre.4 (2017-05-10) Bugfixes: - avoid conflicts when `Gem.finish_resolve` is called after the bundle has been set up (@segiddins) - ensure that `Gem::Specification.find_by_name` always returns an object that can have `#to_spec` called on it (#5592, @jules2689) ## 1.15.0.pre.3 (2017-04-30) Bugfixes: - avoid redundant blank lines in the readme generated by `bundle gem` (@koic) - ensure that `open-uri` is not loaded after `bundle exec` (@segiddins) - print a helpful error message when an activated default gem conflicts with a gem in the gemfile (@segiddins) - only shorten `ref` option for git gems when it is a SHA (#5620, @segiddins) ## 1.15.0.pre.2 (2017-04-23) Bugfixes: - ensure pre-existing fit caches are updated from remote sources (#5423, @alextaylor000) - avoid duplicating specs in the lockfile after updating with the gem uninstalled (#5599, @segiddins) - ensure git gems have their extensions available at runtime (#5594, @jules2689, @segiddins) ## 1.15.0.pre.1 (2017-04-16) Features: - print a notification when a newer version of bundler is available (#4683, @segiddins) - add man pages for all bundler commands (#4988, @feministy) - add the `bundle info` command (@fredrb, @colby-swandale) - all files created with `bundle gem` comply with the bundler style guide (@zachahn) - if installing a gem fails, print out the reason the gem needed to be installed (#5078, @segiddins) - allow setting `gem.push_key` to set the key used when running `rake release` (@DTrierweiler) - print gem versions that are regressing during `bundle update` in yellow (#5506, @brchristian) - avoid printing extraneous dependencies when the resolver encounters a conflict (@segiddins) - add the `bundle issue` command that prints instructions for reporting issues (#4871, @jonathanpike) - add `--source` and `--group` options to the `bundle inject` command (#5452, @Shekharrajak) - add the `bundle add` command to add a gem to the gemfile (@denniss) - add the `bundle pristine` command to re-install gems from cached `.gem` files (#4509, @denniss) - add a `--parseable` option for `bundle config` (@JuanitoFatas, @colby-swandale) Performance: - speed up gemfile initialization by storing locked dependencies as a hash (@jules2689) - speed up gemfile initialization by making locked dependency comparison lazy, avoiding object allocation (@jules2689) - only validate git gems when they are downloaded, instead of every time `Bundler.setup` is run (@segiddins) - avoid regenerating the lockfile when nothing has changed (@segiddins) - avoid diffing large arrays when no sources in the gemfile have changed (@segiddins) - avoid evaluating full gemspecs when running with RubyGems 2.5+ (@segiddins) Bugfixes: - fix cases where `bundle update` would print a resolver conflict instead of updating the selected gems (#5031, #5095, @segiddins) - print out a stack trace after an interrupt when running in debug mode (@segiddins) - print out when bundler starts fetching a gem from a remote server (@segiddins) - fix `bundle gem` failing when `git` is unavailable (#5458, @Shekharrajak, @colby-swandale) - suggest the appropriate command to unfreeze a bundle (#5009, @denniss) - ensure nested calls to `bundle exec` resolve default gems correctly (#5500, @segiddins) - ensure that a plugin failing to install doesn't uninstall other plugins (@kerrizor, @roseaboveit) - ensure `socket` is required before being referenced (#5533, @rafaelfranca) - allow running `bundle outdated` when gems aren't installed locally (#5553, @segiddins) - print a helpful error when `bundle exec`ing to a gem that isn't included in the bundle (#5487, @segiddins) - print an error message when a non-git gem is given a `branch` option (#5530, @colby-swandale) - allow interrupts to exit the process after gems have been installed (@segiddins) - print the underlying error when downloading gem metadata fails (#5579, @segiddins) - avoid deadlocking when installing with a lockfile that is missing dependencies (#5378, #5480, #5519, #5526, #5529, #5549, #5572, @segiddins) ## 1.14.6 (2017-03-03) Bugfixes: - avoid undefined constant `Bundler::Plugin::API::Source` exception (#5409, @segiddins) - avoid incorrect warnings about needing to enable `specific_platform` (@segiddins) - fail gracefully when the compact index does not send an ETag (#5463, @olleolleolle) - ensure `bundle outdated --local` shows all outdated gems (#5430, @denniss) - fix a case where ruby version requirements could lead to incorrect resolver conflicts (#5425, @segiddins) ## 1.14.5 (2017-02-22) Bugfixes: - avoid loading all unused gemspecs during `bundle exec` on RubyGems 2.3+ (@segiddins) - improve resolver performance when dependencies have zero or one total possibilities ignoring requirements (#5444, #5457, @segiddins) - enable compact index when OpenSSL FIPS mode is enabled but not active (#5433, @wjordan) - use github username instead of git name for the github url in `bundle gem` (#5438, @danielpclark) - avoid a TypeError on RubyGems 2.6.8 when no build settings are set for native extensions (@okkez) - fail gracefully when the dependency api is missing runtime dependencies for a gem (@segiddins) - handle when a platform-specific gem has more dependencies than the ruby platform version (#5339, #5426, @segiddins) - allow running bundler on a machine with no home directory where the temporary directory is not writable (#5371, @segiddins) - avoid gem version conflicts on openssl using Ruby 2.5 (#5235, @rhenium) - fail when installing in frozen mode and the dependencies for `gemspec` gems have changed without the lockfile being updated (#5264, @segiddins) ## 1.14.4 (2017-02-12) Bugfixes: - fail gracefully when attempting to overwrite an existing directory with `bundle gem` (#5358, @nodo) - fix a resolver bug that would cause bundler to report conflicts that it could resolve (#5359, #5362, @segiddins) - set native extension build arguments for git gems (#5401, @segiddins) - fix the suggested `bundle lock` command printed when a dependency is unused on any platform (@5t111111) - ensure the version passed to `ruby` in the Gemfile is valid during Gemfile parsing (#5380, @segiddins) - show `bundle inject` usage when too many arguments are passed (#5384, @Shekharrajak) - stop `bundle show --outdated` from implicitly running `bundle update` (#5375, @colby-swandale) - allow the temporary home directory fallback to work for multiple users (@svoop) ## 1.14.3 (2017-01-24) Bugfixes: - fix the resolver attempting to activate ruby-platform gems when the bundle is only for other platforms (#5349, #5356, @segiddins) - avoid re-resolving a locked gemfile that uses `gemspec` and includes development dependencies (#5349, @segiddins) ## 1.14.2 (2017-01-22) Bugfixes: - fix using `force_ruby_platform` on windows (#5344, @segiddins) - fix an incorrect version conflict error when using `gemspec` on multiple platforms (#5340, @segiddins) ## 1.14.1 (2017-01-21) Bugfixes: - work around a ruby 2.2.2 bug that caused a stack consistency error during installation (#5342, @segiddins) ## 1.14.0 (2017-01-20) Bugfixes: - ensure `Settings::Mirror` is autoloaded under the `Settings` namespace (#5238, @segiddins) - fix `bundler/inline` when `BUNDLE_GEMFILE=""` (#5079, @segiddins) ## 1.14.0.pre.2 (2017-01-11) Bugfixes: - allow not selecting a gem when running `bundle open` (#5301, @segiddins) - support installing gems from git branches that contain shell metacharacters (#5295, @segiddins) - fix a resolver error that could leave dependencies unresolved (#5294, @segiddins) - fix a stack overflow error when invoking commands (#5296, @segiddins) ## 1.14.0.pre.1 (2016-12-29) Features: - `bundle doctor` first runs `bundle check` (@segiddins) - the bundler trampoline is automatically enabled when the target version is greater than bundler 2 (@segiddins) - gem checksums returned by rubygems.org are validated when installing gems (#4464, @segiddins) - use the git username as a github username when running `bundle gem` (@JuanitoFatas) - show more context when the resolver conflicts on required ruby and rubygems versions (@segiddins) - improve platform support by allowing bundler to pick the best platform match during dependency resolution, enabled with the `specific_platform` setting (#4295, #4896, @segiddins) - always prompt the user for a password when using `sudo` (#3006, @segiddins) - support running without a home directory (#4778, @segiddins) - print a warning when the gemfile uses a platform conditional that will exclude the gem from all lockfile platforms (@segiddins) - add the `force_ruby_platform` setting to force bundler to install ruby-platform gems, even on other platforms (#4813, @segiddins) - add conservative update options to `bundle lock` (#4912, @chrismo) - improve `bundle outdated` output to group gems by group (@ryanfox1985) - add conservative update options to `bundle update` (#5065, #5076, @chrismo) - print the output of `bundle env` as github-flavored markdown, making it easier to preserve formatting when copy-pasting into a new issue (@segiddins) - configure the persistence file when using `bundle gem` with `rspec` (@segiddins) - add support for the `ruby_25` gemfile filter (@amatsuda) - when installing with a lockfile that is missing dependencies, allow installation to proceed (but without parallelism) (@segiddins) Performance: - improve `require "bundler"` performance by ~5x (@segiddins) - allow install gems in parallel when running on rubygems 2+ Bugfixes: - config files with CRLF line endings can be read (#4435, @segiddins) - `bundle lock` activates gems for the current platform even if they were activated under a different platform for a separate dependency (#4896, @segiddins) - running `bundle env` in a directory without a gemfile no longer crashes (@segiddins) - fail gracefully when attempting to use a source with an unknown URI scheme (#4953, @segiddins) - store paths in the lockfile relative to the root gemfile directory when using `eval_gemfile` (#4966, @segiddins) - `bundle lock` will not update without the `--update` flag (#4957, @segiddins) - the `console` binstub generated by `bundle gem` will load `.irbrc` files (@mattbrictson) - print friendly filesystem access errors in the new index (@segiddins) - print a helpful error when running out of memory on jruby (#4673, @segiddins) - load all rubygems plugins when installing gems (#2824, @segiddins) - `bundle clean --dry-run` prints the list of gems without the `--force` option when no path is set (#5027, @hmistry) - local installs no longer print "this gem may have been yanked" (#5022, @hmistry) - avoid leaking `which` output when running `bundle doctor` (@colby-swandale) - print a warning when attempting to `bundle exec` an empty program (#5084, @bronzdoc) - ensure `bundle outdated` lists all outdated gems (#4979, @chrismo) - fail gracefully when attempting to `bundle gem` with an invalid constant name (#5185, @segiddins) - allow `bundler/inline` to work in a directory that contains a gemfile (#5117, @colby-swandale) - ensure that the new index is thread-safe, allowing installation on rbx (#5142, @segiddins) - remove deprecated `rspec` syntax in `bundle gem` output (@gearnode) - fail gracefully when any system error is encountered when touching the filesystem (#5134, @segiddins) - fix compatibility with a machine running with FIPS mode enabled (#4989, @segiddins) - fix `bundle lock --add-platform ruby` (#5230, @segiddins) - print gem post-install messages when running `bundle update` (@smathy) - ensure errors due to a retries are all separated by a newline (@segiddins) - print out the bundle path in gem not found errors (#4854, @diegosteiner) - fail gracefully when creating threads fails (@segiddins) - avoid downloading metadata for gems that are only development dependencies (@Paxa) ## 1.13.7 (2016-12-25) Features: - add support for the `ruby_24` gemfile filter (#5281, @amatsuda) ## 1.13.6 (2016-10-22) Bugfixes: - make the `gem` method public again, fixing a regression in 1.13.4 (#5102, @segiddins) ## 1.13.5 (2016-10-15) Bugfixes: - Ensure a locked pre-release spec can always be re-resolved (#5089, @segiddins) ## 1.13.4 (2016-10-11) Bugfixes: - stop printing warning when compact index versions file is rewritten (#5064, @indirect) - fix `parent directory is world writable but not sticky` error on install (#5043, @indirect) - fix for `uninitialized constant Bundler::Plugin::API::Source` error (#5010, @hsbt, @aycabta) - make `update` options for major, minor, and patch updates consistent (#4934, @chrismo) ## 1.13.3 (2016-10-10) Bugfixes: - add support for weak etags to the new index (@segiddins) ## 1.13.2 (2016-09-30) Bugfixes: - allow `Settings` to be initialized without a root directory (@m1k3) - allow specifying ruby engines in the gemfile as a symbol (#4919, @JuanitoFatas) - avoid an exception when using `bundler/deployment` with Vlad (@srbaker) - ensure redefined methods have the same visibility as the one they're replacing, fixing `Kernel.require` failing on JRuby (#4975, @segiddins) - ensure that Bundler won't complain about a corrupt lockfile when no lockfile exists when using `gemspec` in the Gemfile (#5006, @segiddins) - fail gracefully when parsing the metadata for a gemspec from the compact index fails (@segiddins) - fix system gems not being copied to --path on bundle install (e.g. --deployment) (#4974, @chrismo) Performance: - avoid parsing the lockfile twice when evaluating gemfiles (@segiddins) ## 1.13.1 (2016-09-13) Bugfixes: - ensure that `Gem::Source` is available, fixing several exceptions (#4944, @dekellum) - ensure that dependency resolution works when multiple gems have the same dependency (#4961, @segiddins) ## 1.13.0 (2016-09-05) This space deliberately left blank. ## 1.13.0.rc.2 (2016-08-21) Features: - add setting `exec_disable_load` to force `exec` to spawn a new Ruby process (@segiddins) - add `doctor` command to help with issues like unlinked compiled gems (#4765, @mistydemeo) - rework the `update` command, providing fine-grained control via flags (#4676, @chrismo) - add URI to http response output in debug mode (#4808, @NickLaMuro) - add manpage for `binstubs` command (#4847, @Zorbash) - support `mirror` settings for sources by hostname, not only full URL (@opiethehokie) - print gem installation errors after other install output (#4834, @segiddins) - add `lock --remove-platform` flag to remove platforms from the lock (#4877, @segiddins) - add `only_update_to_newer_versions` setting to prevent downgrades during `update` (@segiddins) - expanded experimental plugin support to include hooks and sources (@asutoshpalai) Bugfixes: - retry gem downloads (#4846, @jkeiser) - improve the CompactIndex to handle capitalized legacy gems (#4867, @segiddins) - re-use persistent HTTP connections for CompactIndex (@NickLaMuro) - respect `required_ruby_version` when Gemfile contains `ruby` version (@indirect) - allow `rake release` to sign git tags (#4743, @eagletmt) - set process titles when using `#load` during `exec` (@yob) - recognize JRuby shebangs for using `#load` during `exec` (@ojab) - handle world-writable home directories (#4726, @allenzhao) - support multi-platform gems via the `gemspec` Gemfile method (#4798, @segiddins) - print dots correctly for CompactIndex fetcher (@NickLaMuro) - set an `open_timeout` when requesting gem data via HTTP (@NickLaMuro) - rename the BUNDLE\_ORIG\_ENV variable so it no longer shows up in `config` (@indirect) - show help only when `-h` or `--help` is passed to Bundler, not to `exec` (#4801, @segiddins) - handle symlinks to binstubs created by `--standalone` (#4782, @terinjokes) ## 1.13.0.rc.1 (2016-06-27) Features: - when `bundle config major_deprecations` or `BUNDLE_MAJOR_DEPRECATIONS` is set, deprecation warnings for bundler 2 will be printed (@segiddins) - when running with `--verbose`, bundler will print the reason it is re-resolving a gemfile (@segiddins) Bugfixes: - fix support for running RubyGems 1.x on Ruby 2.3 (#4698, @segiddins) - fix bundle exec'ing to a ruby file when gems are installed into a path (#4592, @chrismo) - when multiple specs in a bundle have the same executable, prefer activating the one from the requested gem (#4705, @segiddins) - stop changing the load path to require the vendored postit when trampolining (@segiddins) - ensure relative paths are properly printed after completing an installation (@jenseng) - fix re-resolving when there are multiple unchanged path sources (@segiddins) - de-init submodules when running git 2.9 and requesting a git gem without submodules (@segiddins) ## 1.13.0.pre.1 (2016-06-20) Performance: - speed up gemfile resolution during `bundle install` by between 4x-100x (#4376, @segiddins) - generally reduce object allocations when using bundler (@segiddins) - speed up bin generation for path gems with many files (#2846, @segiddins) - fix detecting path spec changes to avoid re-resolving unnecessarily (@jrafanie) Features: - automatically trampoline to the bundler version locked in the lockfile, only updating to the running version on `bundle update --bundler` (@segiddins) - laying the groundwork for plugin support, which is currently unsuppported, undocumented, disabled by default, and liable to change without notice (@asutoshpalai) - allow `bundle viz --without` to accept multiple `:`-delimited groups (@mobilutz) - support for RubyGems 2.6.4 (#4368, @segiddins, @RochesterinNYC) - colorize updated gem versions (#4334, @bronzdoc) - add the `--standalone` flag to `bundle binstubs` (#4594, @b-ggs) - update the `bundle gem` CoC to contributor covenant v1.4 (@cllns) - use a custom YAML serializer to make config file consistent (@segiddins) - filter credentials from error messages (bundler/bundler-features#111, @RochesterinNYC, @sandlerr) - support relative paths used inside a nested invocation of `eval_gemfile` (#4584, @RochesterinNYC) - fail gracefully when attempting to install a yanked gem (#4344, @allenzhao) - automatically install an inline gemfile when gems are missing locally (@segiddins) - allow conflicts for gems resolved via `gemspec` (@segiddins) - add `--add-platform` option to `bundle lock` (@segiddins) - fail gracefully when a resolved spec's `required_ruby_version` or `required_rubygems_version` is incompatible (@segiddins) Bugfixes: - implicitly unlock the resolved ruby version when the declared requirements in the gemfile are incompatible with the locked version (#4595, #4627, @segiddins) - add support for quoted paths in `$PATH` (#4323, @segiddins) - check out missing git repos that are not being installed (#3981, @asutoshpalai) - write `bundler/setup.rb` to a consistent path (@glennpratt) - open editor in `bundle open` with a clean environment (@sj26) - resolve infinitely recursive copy when running `bundle package --all` with a `gemspec` in the gemfile (#4392, #4430, @RochesterinNYC) - fail gracefully when encountering an `Errno::ENOTSUP` (#4394, @segiddins) - fail gracefully when encountering an `Errno::EHOSTUNREACH` (#4642, @allenzhao) - fix loading config files with very long values (#4370, @segiddins) - only show potential updates for gemfile platforms in `bundle outdated` (#4450, @RochesterinNYC) - allow running `bundle install --deployment` after `bundle package --all` with path gems (#2175, @allenzhao) - add support for patchlevels in ruby versions in the gemfile and gemspecs (#4593, @chalkos) ## 1.12.6 (2016-10-10) Bugfixes: - add support for weak etags to the new index (@segiddins) ## 1.12.5 (2016-05-25) Bugfixes: - only take over `--help` on `bundle exec` when the first two arguments are `exec` and `--help` (#4596, @segiddins) - don't require `require: true` dependencies that are excluded via `env` or `install_if` (@BrianHawley) - reduce the number of threads used simultaneously by bundler (#4367, @will-in-wi) ## 1.12.4 (2016-05-16) Bugfixes: - ensure concurrent use of the new index can't corrupt the cache (#4519, @domcleal) - allow missing rubygems credentials when pushing a gem with a custom host (#4437, @Cohen-Carlisle) - fix installing built-in specs with `--standalone` (#4557, @segiddins) - fix `bundle show` when a gem has a prerelease version that includes a `-` (#4385, @segiddins) ## 1.12.3 (2016-05-06) Bugfixes: - fix uncoditionally writing `.bundle/config` when running `bundle install` (@segiddins) - fall back to the dependency API and the full index when the home directory is not writable (@segiddins) ## 1.12.2 (2016-05-04) Bugfixes: - fix modifying a frozen string when the resolver conflicts on dependencies with requirements (#4520, @grzuy) - fix `bundle exec foo --help` not showing the invoked command's help (#4480, @b-ggs) ## 1.12.1 (2016-04-30) Bugfixes: - automatically fallback when the new index has a checksum mismatch instead of erroring (@segiddins) - fix computation of new index file local checksums on Windows (#4472, @mwrock) - properly handle certain resolver backtracking cases without erroring (@segiddins, #4484) - ensure the `$LOAD_PATH` contains specs' load paths in the correct order (@segiddins, #4482) ## 1.12.0 (2016-04-28) This space intentionally left blank. ## 1.12.0.rc.4 (2016-04-21) Bugfixes: - don't fail when `bundle outdated` is run with flags and the lockfile contains non-semver versions (#4438, @RochesterinNYC) ## 1.12.0.rc.3 (2016-04-19) Bugfixes: - don't allow new attributes to dirty a lockfile when running `bundle exec`, `-rbundler/setup`, or `bundle check` (@segiddins) ## 1.12.0.rc.2 (2016-04-15) Features: - `bundle outdated` handles all combinations of `--major`, `--minor`, and `--patch` (#4396, @RochesterinNYC) Bugfixes: - prevent endless recursive copy for `bundle package --all` (#4392, @RochesterinNYC) - allow executables that are `load`ed to exit non-0 via an `at_exit` hook when invoked by `bundle exec` (@segiddins) - nested invocations of `bundle exec` properly preserve the `$PATH` and `$GEM_PATH` environment variables (@segiddins) ## 1.12.0.rc (2016-03-13) Performance: - Download gem metadata from globally distributed CDN endpoints (#4358, @segiddins) Bugfixes: - handle Ruby pre-releases built from source (#4324, @RochesterinNYC) - support binstubs from RubyGems 2.6 (#4341, @segiddins) - handle quotes present in in PATH (#4326, @segiddins) ## 1.12.0.pre.2 (2016-02-26) Performance: - speed up `bundle exec` by `load`ing the executable whenever possible, saving roughly .2 seconds per invocation (@segiddins) Features: - add a `--patch` flag for `bundle outdated` (@RochesterinNYC) - add `Bundler.clean_env` and `Bundler.original_env` (#4232, @njam) - add `--frozen` support to `bundle package` (#3356, @RochesterinNYC) Bugfixes: - place bundler loaded gems after `-I` and `RUBYLIB` (@Elffers) - give a better error message when filesystem access raises an `EPROTO` error (#3581, #3932, #4163, @RochesterinNYC) - give a better error message when both `--deployment` and `--system` are used together (@RochesterinNYC) - fix `$PATH` being preserved for use in `Bundler.with_clean_env` (#4251, @segiddins, @njam) - give a better error message when running `bundle outdated` in frozen mode (#4287, @RochesterinNYC) - handle when `http_proxy` is set to `:no_proxy` in the rubygems configuration (#4294, @segiddins) - give a better error message when authentication details aren't properly escaped (#4288, @RochesterinNYC) - fix `bundle outdated --minor` to only report updates that match the current minor version (@RochesterinNYC) - fix extra dependencies being resolved unnecessarily (#4276, @segiddins) - give a better error message when missing specs due to platform mis-matches (#4259, @RochesterinNYC) - skip rebuilding extensions for git gems if they are already built (#4082, @csfrancis, @indirect, @segiddins) - fix `bundle install` not installing when the `no_install` setting is set (#3966, @chulkilee, @segiddins) ## 1.12.0.pre.1 (2016-02-09) Performance: - speed up `bundle install` and `bundle update` by using the new compact gem index (@segiddins, @fotanus, @indirect) - speed up `bundle exec` by avoiding loading the gemfile twice (#2951, #2952, @segiddins) Features: - add support for using version operators to specify ruby versions in the Gemfile (@jtarchie) - redirect `--help` flag for plugins to that plugin's man page (@RochesterinNYC) - support probing a mirror with a fallback timeout (#4128, @pcarranza) - add `--full-index` option to `bundle lock` (@segiddins) - support running with frozen string literals (@deepj, @segiddins) - add `--major` and `--minor` options to `bundle outdated` (#3805, @cirdes) - allow passing a custom `ui` to `bundler/inline` (@lamont-granquist) - add support for ruby 2.4 (#4266, @segiddins) - add `bundle outdated --parseable` for machine-readable output (@RochesterinNYC) Bugfixes: - fix `bundle package --all` recursing endlessly (#4158, @RochesterinNYC) - fail fast on more errors when fetching remote resources (#4154, @RochesterinNYC) - give a better error message when a given git commit can't be found (#4140, @doy) - give a better error message when `bundle clean` doesn't have sufficient permissions (#4170, @RochesterinNYC) - give a better error message when reading a bundler config file fails (@segiddins) - restrict platforms when referencing a `gemspec` in the `Gemfile` to those defined in the gemspec (#4102, #4150, @smellsblue) - fix `bundle gem` with minitest to use the correct rake task (@kotoshenya) - give a better error message when ssl isn't available (#4054, @RochesterinNYC) - print the original `require` error when `Bundler.require` fails (#4182, @RochesterinNYC) - give a better error message when certain resources are temporarily unavailable (#4183, @RochesterinNYC) - fix returning case-sensitive gem mirror URIs on ruby 2.3 (@segiddins) - ignore colorized output from `git` when determining the current branch (#4056, @agis-) - fix storing the shared gems config option as a boolean (@vassilevsky) - add support for running `bundle gem --exe` instead of using the `--bin` option (@christhekeele) - fix `exec`-ing with 0 args in a directory with spaces (#4230, @segiddins) - avoid installing extraneous gems when resolving to an older version of a spec (#4101, #4198, @segiddins) - ensure paths resolved when parsing a gemfile are relative to that file (#3349, @dtognazzini) - give a better error message when encountering an invalid gemspec (#4248, #4275, @RochesterinNYC) - preserve the original `PATH` in `Bundler.with_clean_env` (#4251, @segiddins) - ensure standalone file paths are relative to the project root (#4144, @glennpratt) ## 1.11.2 (2015-12-15) Bugfixes: - _really_ stop calling `required_ruby_version` on nil @specifications (#4147, @indirect) ## 1.11.1 (2015-12-15) Bugfixes: - lazy-load Psych, again (#4149, @indirect) - allow gemspec gems on other platforms (#4150, @indirect) - fix --no-coc and --no-mit flags on `gem` (#4148, @RochesterinNYC) - stop calling `required_ruby_version` on nil @specifications (#4147, @indirect) ## 1.11.0 (2015-12-12) (this space intentionally left blank) ## 1.11.0.pre.2 (2015-12-06) Bugfixes: - fail gracefully when trying to execute a non-executable file (#4081, @fotanus) - fix a crash when pushing a gem via `rake release` (@segiddins) ## 1.11.0.pre.1 (2015-11-29) Features: - actual Gemfile and lockfile filenames are used in messages (#3672, @segiddins) - the git remote for `rake release` is now customizable (@skateman) - file access permissions errors are now much more friendly (#3703, #3735, #3858, #3988, #4009 @repinel, @Elffers, @segiddins, @agis-) - add support for showing help for plugin commands (@tf) - send `X-Gemfile-Source` header to source mirrors (@agis-) - show what version upstream dependencies were resolved to in conflict messages (@segiddins) - add support for using bundler setting to add private access credentials for git sources (@frsyuki) - take into consideration HTTP proxy settings in `.gemrc` (@PG-kura) - allow specifying a gem host to push to in the `GEM_HOST` environment variable (@pmenglund) - when gempec `required_ruby_version` is available and the Gemfile specifies a ruby version, resolve for the given ruby version (@segiddins) - allow setting a `silence_root_warning` setting to silence the warning when `bundle install` is run as root (@blackxored) - update the `bundle gem` code of conduct template to Contributor Covenant v1.3.0 (@CoralineAda) - add support for specifying gems to update when running `bundle lock` via `--update gem1 gem2` (@JuanitoFatas) - added support for MRI 2.3 (@amatsuda) - show a helpful message when requiring a file in `bundler require` fails (#3960, @agis-) - include git revision hash when printing a git source (#3433, @agis-) - improve hint when a resolution conflict occurs (@seanlinsley) - show a friendly error when a git ref is not found (#3879, @agis-) - improve error message when sources are not absolute URIs (#3925, @agis-) - add `pkg` to rake's clobber list (#3676, @jasonkarns) - retry fetching specs when fetching version metadata fails (@jingweno) Bugfixes: - avoid showing bundler version warning messages twice (@fotanus) - fix running `bundle check` with `--path` when the gems are only installed globally (@akihiro17) - fix `bin/setup` from `bundle gem` assuming `bash` is in `/bin` - fail more gracefully when an HTTP remote is unreachable (#3765, @steverob) - fix a warning running `bundle exec` on jruby 9.0.0.0 (@deivid-rodriguez, @mastfish) - fix the `bundle gem` readme when no tests are generated (@roseweixel) - the dependencies on test gems in `bundle gem` are now locked to major versions (#3811, @indirect) - fix the paths for native extensions generated by `--standalone` (#3813, @AlexanderPavlenko) - fix trying to cache a gem that has no source (@EduardoBautista) - fix `--source` option to `bundle update` causing incorrect gem unlocking (#3759, #3761, @neoeno) - fix handling an empty `BUNDLE_GEMFILE` environment variables (#3678, @agis-) - avoid cleaning up gem extension directory in `bundle clean` (@Sirupsen) - fix the `ssl_verify_mode` setting not being treated as a number (@goughy000) - fix not retrying on zlib errors (#4047, @andremedeiros) - fix a warning being shown for using `URI.encode` (@EduardoBautista) - fix handling of fatal HTTP errors (#3830, @indirect) - ensure all `sudo` access is done in a thread-safe manner (#3910, @agis-) - fix caching gems with a path with the same prefix as the bundled application (@indirect) - fix showing gemspec validation errors on `bundle exec` (#3895, @agis-) - distinguish Gemfile syntax and evaluation errors (#3783, @agis-) - fix nested Gemfile sources not restoring the previous source (#3974, @agis-) - fix the `RUBYLIB` environment variable not being cleaned (#3982, @agis-) - fix handling a dependency missing from `Gemfile.lock` so parallel installation does not deadlock (#4012, @lukaso) - also print gemspecs in `bundle env` output (@agis-) - fix handling when a `path` source does not have a gemspec but a lockfile says there is (#4004, @segiddins) - show a warning when the `RUBYGEMS_GEMDEPS` environment variable is set (#3656, @agis-) - fix handling invalid RubyGems configuration files (#4042, @agis-) - fix `bundle console` falling back to `irb` when the preferred console is unavailable (@felixbuenemann) - restrict platforms when referencing a `gemspec` in the `Gemfile` to those defined in the gemspec (#4102, @smellsblue) Performance: - speed up dependency resolution in pathological cases by 25x (#3803, @segiddins) - drop string allocations when searching for gems (@jrafanie) ## 1.10.6 (2015-07-22) Workarounds: - only warn on invalid gemspecs (@indirect) Bugfixes: - fix installing dependencies in the correct order (#3799, @pducks32) - fix sorting of mixed DependencyLists (#3762, @tony-spataro-rs) - fix `install_if` conditionals when using the block form (@danieltdt) ## 1.10.5 (2015-06-24) Workarounds: - don't add or update BUNDLED WITH during `install` with no changes (@segiddins) Bugfixes: - fix sorting of mixed DependencyLists with RubyGems >= 2.23 (#3762, @tony-spataro-rs) - speed up resolver for path and git gems (@segiddins) - fix `install --force` to not reinstall Bundler (#3743, @karlo57) ## 1.10.4 (2015-06-16) Workarounds: - don't add BUNDLED WITH to the lock when Spring runs `check` over and over (@indirect) Bugfixes: - display "with native extensions" log output correctly (@ivantsepp) - alias `i` to `install`, `c` to `check`, and `e` to `exec` (@indirect) ## 1.10.3 (2015-06-03) Bugfixes: - allow missing gemspec files when validating path and git gems (#3686, #3698, @segiddins) - fix regression in `rake install` (#3701, #3705, @segiddins) - fix regression when calling `gem` with `bundle exec` or `-rbundler/setup` (#3699, @segiddins) - fix `bundler/inline` requiring a newly-installed gem (#3693, @indirect, @segiddins) ## 1.10.2 (2015-05-29) Bugfixes: - fix regression in `bundle update GEM` performance introduced in 1.10.0 (#3687, @segiddins) ## 1.10.1 (2015-05-28) Bugfixes: - silence ruby warning when running CLI commands (@segiddins) - validate gemspecs in non-packaging mode (#3681, @segiddins) - ensure the same chdir mutex as RubyGems is used (#3680, @segiddins) ## 1.10.0 (2015-05-28) (this space intentionally left blank) ## 1.10.0.rc (2015-05-16) Features: - dramatically speed up resolving some slow Gemfiles (#3635, @segiddins) - track CI platforms running Bundler (#3646, @fotanus) Bugfixes: - allow `viz` to work with prereleases (#3621, #3217, @aprescott) - validate gemspecs used in path and git gems (#3639, @segiddins, @indirect) - stop printing config warnings when config is unchanged (#3649, @fotanus, @indirect) - Without groups saved via `config` are no longer ignored when the `--without` flag is used ## 1.10.0.pre.2 (2015-05-07) Bugfixes: - make BUNDLED WITH backwards compatible (#3623, @segiddins) ## 1.10.0.pre.1 (2015-05-05) Bugfixes: - always clean up tmp dirs (#3277, @hone, @indirect, @segiddins) ## 1.10.0.pre (2015-05-03) Features: - support gem extensions built into any directory on RubyGems 2.2+ (#3582, @voxik) - add 'bundler/inline' which provides a `gemfile` method (#3440, @segiddins) - improved error reports for Gemfile errors (#3480, @segiddins) - `lock` command (#3437, @segiddins) - add `ignore_messages` config to suppress post-install text (#3510, @pducks32) - improve `gem` minitest template (#3513, #3515, @arthurnn) - add `install --force` to re-install installed gems (#3519, @segiddins) - show more `outdated` information, including groups (@smlance, @indirect) - add optional groups to the Gemfile (#3531, @jhass) - accept glob argument to `gemspec` in Gemfile (#3464, @pjump) - make timeouts and retries configurable via `config` (#3601, @pducks32) - add `install_if` Gemfile method for conditional installs (#3611, @segiddins) Bugfixes: - standalone mode now uses builtin gems correctly (#3610, @segiddins) - fix `rake spec:deps` on MinGW Ruby 2.0+ (#3487, @marutosi) - remember all y/n answers when generating gems (#3579, @pducks32) Performance: - use RubyGems stub specifications when possible (#3580, @segiddins) Deprecations: - deprecated the (never enabled) `bundle_ruby` binary (@smlance) ## 1.9.10 (2015-06-22) Features: - the `BUNDLED WITH` section of lockfiles generated by 1.10+ will be preserved (@segiddins) ## 1.9.9 (2015-05-16) Bugfixes: - read mirror and credential settings from older versions (#3557, @Strech) ## 1.9.8 (2015-05-12) Bugfixes: - fix regression in sudo mode introduced by 1.9.7 (#3642, @segiddins) ## 1.9.7 (2015-05-11) Bugfixes: - always clean up tmp dirs (#3277, @hone, @indirect, @segiddins) ## 1.9.6 (2015-05-02) Bugfixes: - use RubyGems spec stubs if available (@segiddins) - allow creating gems with names containing two dashes (#3483, @janlelis) - allow creating gems with names extending constants (#3603, @amatsuda) ## 1.9.5 (2015-04-29) Bugfixes: - respect Gemfile sources when installing a gem present in two sources (#3585, @tmoore) ## 1.9.4 (2015-04-13) Bugfixes: - fix regression in installing x86 and universal gems (#3565, @jdmundrawala) - improve error when gems are missing (#3564, @sealocal) ## 1.9.3 (2015-04-12) Bugfixes: - handle removal of `specs` from rubygems/rubygems@620910 (#3558, @indirect) - install 'universal' gems on Windows (#3066, @jdmundrawala) - stop passing --local during `rake install` task (#3236, @indirect) - guard against all possible accidental public gem pushes (#3533, @indirect) ## 1.9.2 (2015-03-30) Bugfixes: - ensure gem executables are executable (#3517, #3511, @indirect) - fix warnings in Molinillo (#3516, @segiddins) - ensure duplicate dependencies do not propagate (#3522, @segiddins) - keep gems locked when updating another gem from the same source (#3520, @indirect) - resolve race that could build gems without saved arguments (#3404, @indirect) ## 1.9.1 (2015-03-21) Bugfixes: - avoid exception in 'bundler/gem_tasks' (#3492, @segiddins) ## 1.9.0 (2015-03-20) ## 1.9.0.rc (2015-03-13) Bugfixes: - make Bundler.which stop finding directories (@nohoho) - handle Bundler prereleases correctly (#3470, @segiddins) - add before_install to .travis.yml template for new gems (@kodnin) ## 1.9.0.pre.1 (2015-03-11) Bugfixes: - make `gem` command work again (@arthurnn) ## 1.9.0.pre (2015-03-11) Features: - prefer gemspecs closest to the directory root (#3428, @segiddins) - debug log for API request limits (#3452, @neerfri) "Features": - Molinillo resolver, shared with CocoaPods (@segiddins) - updated Thor to v0.19.1 (@segiddins) ## 1.8.9 (2015-05-02) Bugfixes: - Use RubyGems spec stubs if available (@segiddins) ## 1.8.8 (2015-04-29) Bugfixes: - Respect Gemfile sources when installing a gem present in two sources (#3585, @tmoore) ## 1.8.7 (2015-04-07) Bugfixes: - stop suppressing errors inside gems that get required (#3549, @indirect) ## 1.8.6 (2015-03-30) Bugfixes: - keep gems locked when updating another gem from the same source (#3250, @indirect) - resolve race that could build gems without saved arguments (#3404, @indirect) ## 1.8.5 (2015-03-11) Bugfixes: - remove MIT license from gemspec when removing license file (@indirect) - respect 'no' immediately as well as saving it in `gem` config (@kirs) ## 1.8.4 (2015-03-05) Bugfixes: - document --all-platforms option (#3449, @moeffju) - find gems from all sources on exec after install (#3450, @TimMoore) ## 1.8.3 (2015-02-24) Bugfixes: - handle boolean values for gem settings (@EduardoBautista) - stop always looking for updated `path` gems (#3414, #3417, #3429, @TimMoore) ## 1.8.2 (2015-02-14) Bugfixes: - allow config settings for gems with 'http' in the name again (#3398, @TimMoore) ## 1.8.1 (2015-02-13) Bugfixes: - synchronize building git gem native extensions (#3385, @antifuchs & @indirect) - set gemspec bindir correctly (#3392, @TimMoore) - request lockfile deletion when it is malformed (#3396, @indirect) - explain problem when mirror config is missing (#3386, @indirect) - explain problem when caching causes permission error (#3390, @indirect) - normalize URLs in config keys (#3391, @indirect) ## 1.8.0 (2015-02-10) Bugfixes: - gemfile `github` blocks now work (#3379, @indirect) Bugfixes from v1.7.13: - look up installed gems in remote sources (#3300, #3368, #3377, #3380, #3381, @indirect) - look up gems across all sources to satisfy dependencies (#3365, @keiths-osc) - request dependencies for no more than 100 gems at a time (#3367, @segiddins) ## 1.8.0.rc (2015-01-26) Features: - add `config disable_multisource` option to ensure sources can't compete (@indirect) Bugfixes: - don't add extra quotes around long, quoted config values (@aroben, #3338) Security: - warn when more than one top-level source is present (@indirect) ## 1.8.0.pre (2015-01-26) Features: - add metadata allowed_push_host to new gem template (#3002, @juanitofatas) - adds a `--no-install` flag to `bundle package` (@d-reinhold) - add `bundle config auto_install true` to install automatically (@smashwilson) - add `bundle viz --without` to exclude gem groups from resulting graph (@fnichol) - prevent whitespace in gem declarations with clear messaging (@benlakey) - tries to find a `bundler-` executable on your path for non-bundler commands (@andremedeiros) - tries to find `gems.rb` and it's new counterpart, `gems.locked` (@andremedeiros) - change the initial version of new gems from `0.0.1` to `0.1.0` (@petedmarsh) - add `package --all-platforms` to cache gems for each known platform (@ccutrer) - speed up `exec` when running commands on the $PATH (@kirs) - add gem code of conduct file and option (@kirs) - add config settings for gem license and tests (@kirs) - add `bin/setup` and `bin/console` to new gems (@indirect) - include configured user-agent in network requests (@indirect) - support `github`, `gist`, and `bitbucket` options on git gems (@indirect) - add `package --cache-path` and `config cache_path` for cache location (@jnraine) - allow `config` to work even when a Gemfile is not present (@dholdren) - add `config gemfile /path` for other Gemfile locations (@dholdren) - add `github` method alonside the `git` method (@BenMorganIO) Bugfixes: - reduce memory usage with threaded parallel workers (@Who828) - support read-only git gems (@pmahoney) - various resolver performance improvements (@dubek) - untaint git gem paths for Rubygems compatibility (@tdtds) Documentation: - add missing Gemfile global `path` explanation (@agenteo) ## 1.7.15 (2015-04-29) Bugfixes: - Respect Gemfile sources when installing a gem present in two sources (#3585, @tmoore) ## 1.7.14 (2015-03-30) Bugfixes: - Keep gems locked when updating another gem from the same source (#3250, @indirect) - Don't add extra quotes around long, quoted config values (@aroben, #3338) ## 1.7.13 (2015-02-07) Bugfixes: - Look up installed gems in remote sources (#3300, #3368, #3377, #3380, #3381, @indirect) - Look up gems across all sources to satisfy dependencies (#3365, @keiths-osc) - Request dependencies for no more than 100 gems at a time (#3367, @segiddins) ## 1.7.12 (2015-01-08) Bugfixes: - Always send credentials for sources, fixing private Gemfury gems (#3342, @TimMoore) ## 1.7.11 (2015-01-04) Bugfixes: - Recognize `:mri_22` and `:mingw_22`, rather than just `:ruby_22` (#3328, @myabc) ## 1.7.10 (2014-12-29) Bugfixes: - Fix source blocks sometimes causing deployment mode to fail wrongly (#3298, @TimMoore) Features(?): - Support `platform :mri_22` and related version bits (#3309, @thomasfedb) ## 1.7.9 (2014-12-09) Bugfixes: - Fix an issue where bundler sometime spams one gem in Gemfile.lock (#3216, @Who828) - Ensure bundle update installs the newer version of the gem (#3089, @Who828) - Fix an regression which stopped Bundler from resolving some Gemfiles (#3059, #3248, @Who828) ## 1.7.8 (2014-12-06) Bugfixes: - Hide credentials while warning about gems with ambiguous sources (#3256, @TimMoore) ## 1.7.7 (2014-11-19) Bugfixes: - Ensure server credentials stored in config or ENV will be used (#3180, @arronmabrey) - Fix race condition causing errors while installing git-based gems (#3174, @Who828) - Use single quotes in config so YAML won't add more quotes (#3261, @indirect) ## 1.7.6 (2014-11-11) Bugfixes: - CA certificates that work with all OpenSSLs (@luislavena, @indirect) ## 1.7.5 (2014-11-10) Bugfixes: - Fix --deployment with source blocks and non-alphabetical gems (#3224, @TimMoore) - Vendor CA chain to validate new rubygems.org HTTPS certificate (@indirect) ## 1.7.4 (2014-10-19) Bugfixes: - Allow --deployment after `pack` while using source blocks (#3167, @TimMoore) - Use dependency API even when HTTP credentials are in ENV (#3191, @fvaleur) - Silence warnings (including root warning) in --quiet mode (#3186, @indirect) - Stop asking gem servers for gems already found locally (#2909, @dubek) ## 1.7.3 (2014-09-14) Bugfixes: - `extconf.rb` is now generated with the right path for `create_makefile` (@andremedeiros) - Fix various Ruby warnings (@piotrsanarki, @indirect) ## 1.7.2 (2014-08-23) Bugfixes: - Revert gem source sorting in lock files (@indirect) ## 1.7.1 (2014-08-20) Bugfixes: - Install gems from one source needed by gems in another source (@indirect) - Install the same gem versions even after some are installed (@TimMoore) - Download specs only when installing from servers (@indirect) ## 1.7.0 (2014-08-13) Security: - Fix for CVE-2013-0334, installing gems from an unexpected source (@TimMoore) Features: - Gemfile `source` calls now take a block containing gems from that source (@TimMoore) - Added the `:source` option to `gem` to specify a source (@TimMoore) Bugfixes: - Warn on ambiguous gems available from more than one source (@TimMoore) ## 1.6.7 (2014-10-19) Features: - warn to upgrade when using useless source blocks (@danfinnie) Documentation: - explain how to use gem server credentials via ENV (@hwartig) ## 1.6.6 (2014-08-23) Bugfixes: - restore Gemfile credentials to Gemfile.lock (@indirect) ## 1.6.5 (2014-07-23) Bugfixes: - require openssl explicitly to fix rare HTTPS request failures (@indirect, #3107) ## 1.6.4 (2014-07-17) Bugfixes: - fix undefined constant error when can't find gem during binstubs (#3095, @jetaggart) - work when installed git gems are not writable (#3092, @pmahoney) - don't store configured source credentials in Gemfile.lock (#3045, @lhz) - don't include config source credentials in the lockfile (Lars Haugseth) - use threads for jobs on Rubinius (@YorickPeterse) - skip dependencies from other platforms (@mvz) - work when Rubygems was built without SSL (@andremedeiros) ## 1.6.3 (2014-06-16) Bugfixes: - fix regression when resolving many conflicts (#2994, @Who828) - use local gemspec for builtin gems during install --local (#3041, @Who828) - don't warn about sudo when installing on Windows (#2984, @indirect) - shell escape `bundle open` arguments (@indirect) ## 1.6.2 (2014-04-13) Bugfixes: - fix an exception when using builtin gems (#2915, #2963, @gnufied) - cache gems that are built in to the running ruby (#2975, @indirect) - re-allow deploying cached git gems without git installed (#2968, @aughr) - keep standalone working even with builtin gems (@indirect) - don't update vendor/cache in deployment mode (#2921, @indirect) Features: - warn informatively when `bundle install` is run as root (#2936, @1337807) ## 1.6.1 (2014-04-02) Bugfixes: - update C extensions when git gem versions change (#2948, @dylanahsmith) Features: - add support for C extensions in sudo mode on Rubygems 2.2 ## 1.6.0 (2014-03-28) Bugfixes: - many Gemfiles that caused incorrect errors now resolve correctly (@Who828) - redirects across hosts now work on rubies without OpenSSL (#2686, @grddev) - gemspecs now handle filenames with newlines (#2634, @jasonmp85) - support escaped characters in usernames and passwords (@punkie) - no more exception on `update GEM` without lock file (@simi) - allow long config values (#2823, @kgrz) - cache successfully even locked to gems shipped with Ruby (#2869, @aughr) - respect NO_PROXY even if a proxy is configured (#2878, @stlay) - only retry git commands that hit the network (#2899, @timmoore) - fix NameError regression when OpenSSL is not available (#2898, @timmoore) - handle exception installing when build_info owned by root (@Who828) - skip HTTP redirects from rubygems.org, huge speed boost (@Who828) Features: - resolver rewritten to avoid recursion (@Who828) - add `git_source` for custom options like :github and :gist (@strzalek) - HTTP auth may now be stored in `bundle config` (@smashwilson) - some complex Gemfiles are resolved up to 10x faster (@Who828) - add support for IRB alternatives such as Pry and Ripl (@joallard, @postmodern) - highlight installed or updated gems (#2722, #2741, @yaotti, @simi) - display the `post_install_message` for gems installed via :git (@phallstrom) - `bundle outdated --strict` now only reports allowed updates (@davidblondeau) - `bundle show --verbose` Add gem summary to the output (@lardcanoe) - `bundle gem GEM --ext` now generates a skeleton for a C extension (@superdealloc) - Avoid using threequals operator where possible (@as-cii) - Add `bundle update --group` to update specific group (#2731 @banyan) Documentation: - Add missing switches for bundle-install(1) and bundle-update(1) (@as-cii) ## 1.5.3 (2014-02-06) Bugfixes: - find "missing" gems that are actually present (#2780, #2818, #2854) - use n-1 cores when given n jobs for parallel install (@jdickey) ## 1.5.2 (2014-01-10) Bugfixes: - fix integration with Rubygems 1.8.0-1.8.19 - handle ENETDOWN exception during network requests - gracefully shut down after interrupt during parallel install (@Who828) - allow Rails to run Thor without debug mode (@rafaelfranca) - set git binstub permissions by umask (@v-yarotsky) - remove parallel install debug log ## 1.5.1 (2013-12-28) Bugfixes: - correctly find gems installed with Ruby by default ## 1.5.0 (2013-12-26) Features: - install missing gems if their specs are present (@hone) Bugfixes: - use print for "Installing…" so messages are thread-safe (@TimMoore) ## 1.5.0.rc.2 (2013-12-18) "Features": - Support threaded installation on Rubygems 2.0.7+ - Debug installation logs in .bundle/install.log "Bugfixes": - Try to catch gem installation race conditions ## 1.5.0.rc.1 (2013-11-09) Features: - bundle update also accepts --jobs (#2692, @mrkn) - add fork URL to README for new `bundle gem` (#2665, @zzak) - add `bundle outdated --strict` (#2685, @davidblondeau) - warn if same gem/version is added twice (#2679, @jendiamond) - don't redownload installed specs for `bundle install` (#2680, @cainlevy) - override gem sources with mirrors (#2650, @danielsdeleo, @mkristian) Bugfixes: - fix sharing same SSL socket when forking workers for parallel install (#2632) - fix msg typo in GitNotAllowedError (#2654, @joyicecloud) - fix Bundler.which for directories (#2697, @rhysd) - properly require `Capistrano::Version` (#2690, @steveklabnik) - search for git.exe and git - fix the bug that downloads every spec when API fetcher encouters an error - only retry network requests ## 1.4.0.rc.1 (2013-09-29) Features: - add support for the x64-mingw32 platform (#2356, #2590, @larskanis) - add :patchlevel option to ruby DSL - add `bundler` bin (#2598, @kirs) - friendly ambiguous error messages (#2581, #2550, @jlsuttles, @jendiamond, @joyicecloud) - add `:jruby_18` and `:jruby_19` platform options (@mcfiredrill) - add X.509 client certificates for auth without passwords (@snackbandit) - add `exec --keep-file-descriptors` for Ruby 1.9-like behavior on 2.0 (@steved555) - print a better error when git is not installed (@joyicecloud) - exit non-zero when `outdated` is run with an unknown gem (@joyicecloud) - add `:ruby_21` platform option (@brandonblack) - add `--retry` to retry failed network and git commands (@schneems) - include command and versions in User-Agent (@indirect, @joyicecloud) Bugfixes: - allow passwordless Basic Auth (#2606, @rykov) - don't suggest `gem install foo` when `foo` is a git gem that fails (@kirs) - revert #2569, staying compatible with git: instead of https: for :github gems - handle exceptions while installing gems in parallel (@gnufied) ## 1.4.0.pre.1 (2013-08-04) Features: - retry network requests while installing gems (#2561, @ascherger) - faster installs using gemspecs from the local system cache (#2497, @mipearson) - add `bundle install -jN` for N parallel gem installations (#2481, @eagletmt) - add `ENV['DEBUG_RESOLVER_TREE']` outputs resolver tree (@dblock) - set $MANPATH so `bundle exec man name` works (#1624, @sunaku) - use `man` instead of `groff` (#2579, @ixti, @simi) - add Gemfile dependency info to bundle outdated output (#2487, @rahearn) - allow `require: true` as an alias for `require: ` (#2538, @ndbroadbent) - rescue and report Thor errors (#2478, @pjvds) - detect cyclic dependencies (#2564, @gnufied) - support multiple gems in `binstubs` (#2576, @lucasmazza) - use https instead of git for :github gems (#2569, @fuadsaud) - add quiet option to `bundle package` (#2573, @shtirlic) - use RUBYLIB instead of RUBYOPT for better Windows support (#2536, @equinux) Bugfixes: - reduce stack size while resolving to fix JRuby overflow (#2510, @headius) - display GitErrors while loading specs in --verbose mode (#2461) - allow the same options hash to be passed to multiple gems (#2447) - handle missing binaries without an exception (#2019, @luismreis) ## 1.3.6 (8 January 2014) Bugfixes: - make gemspec path option preserve relative paths in lock file (@bwillis) - use umask when creating binstubs (#1618, @v-yarotsky) - warn if graphviz is not installed (#2435, @Agis-) - show git errors while loading gemspecs - don't mutate gem method options hash (#2447) - print Thor errors (#2478, @pjvds) - print Rubygems system exit errors (James Cook) - more Pathnames into Strings for MacRuby (@kml) - preserve original gemspec path (@bwillis) - remove warning about deps with :git (#1651, @ixti) - split git files on null (#2634, @jasonmp85) - handle cross-host redirects without SSL (#2686, @grddev) - handle Rubygems 2 security exception (@zzak) - reinstall gems if they are missing with spec present - set binstub permissions using umask (#1618, @v-yarotsky) ## 1.3.5 (3 April 2013) Features: - progress indicator while resolver is running (@chief) Bugfixes: - update local overrides with orphaned revisions (@jamesferguson) - revert to working quoting of RUBYOPT on Windows (@ogra) - use basic auth even when SSL is not available (@jayniz) - installing git gems without dependencies in deployment now works ## 1.3.4 (15 March 2013) Bugfixes: - load YAML on Rubygems versions that define module YAML - fix regression that broke --without on ruby 1.8.7 ## 1.3.3 (13 March 2013) Features: - compatible with Rubygems 2.0.2 (higher and lower already work) - mention skipped groups in bundle install and bundle update output (@simi) - `gem` creates rake tasks for minitest (@coop) and rspec Bugfixes: - require rbconfig for standalone mode ## 1.3.2 (7 March 2013) Features: - include rubygems.org CA chain Bugfixes: - don't store --dry-run as a Bundler setting ## 1.3.1 (3 March 2013) Bugfixes: - include manpages in gem, restoring many help pages - handle more SSL certificate verification failures - check for the full version of SSL, which we need (@alup) - gem rake task 'install' now depends on task 'build' (@sunaku) ## 1.3.0 (24 February 2013) Features: - raise a useful error when the lockfile contains a merge conflict (@zofrex) - ensure `rake release` checks for uncommitted as well as unstaged (@benmoss) - allow environment variables to be negated with 'false' and '0' (@brettporter) - set $MANPATH inside `exec` for gems with man pages (@sunaku) - partial gem names for `open` and `update` now return a list (@takkanm) Bugfixes: - `update` now (again) finds gems that aren't listed in the Gemfile - `install` now (again) updates cached gems that aren't in the Gemfile - install Gemfiles with HTTP sources even without OpenSSL present - display CerficateFailureError message in full ## 1.3.0.pre.8 (12 February 2013) Security: - validate SSL certificate chain during HTTPS network requests - don't send HTTP Basic Auth creds when redirected to other hosts (@perplexes) - add `--trust-policy` to `install`, like `gem install -P` (@CosmicCat, #2293) Features: - optimize resolver when too new of a gem is already activated (@rykov, #2248) - update Net::HTTP::Persistent for SSL cert validation and no_proxy ENV - explain SSL cert validation failures - generate gemspecs when installing git repos, removing shellouts - add pager selection (@csgui) - add `licenses` command (@bryanwoods, #1898) - sort output from `outdated` (@richardkmichael, #1896) - add a .travis.yml to `gem -t` (@ndbroadbent, #2143) - inform users when the resolver starts - disable reverse DNS to speed up API requests (@raggi) Bugfixes: - raise errors while requiring dashed gems (#1807) - quote the Bundler path on Windows (@jgeiger, #1862, #1856) - load gemspecs containing unicode (@gaffneyc, #2301) - support any ruby version in --standalone - resolve some ruby -w warnings (@chastell, #2193) - don't scare users with an error message during API fallback - `install --binstubs` is back to overwriting. thanks, SemVer. ## 1.3.0.pre.7 (22 January 2013) Bugfixes: - stubs for gems with dev deps no longer cause exceptions (#2272) - don't suggest binstubs to --binstubs users ## 1.3.0.pre.6 (22 January 2013) Features: - `binstubs` lists child gem bins if a gem has no binstubs - `bundle gem --edit` will open the new gemspec (@ndbroadbent) - `bundle gem --test rspec` now makes working tests (@tricknotes) - `bundle env` prints info about bundler's environment (@peeja) - add `BUNDLE_IGNORE_CONFIG` environment variable support (@richo) Bugfixes: - don't overwrite custom binstubs during `install --binstubs` - don't throw an exception if `binstubs` gem doesn't exist - `bundle config` now works in directories without a Gemfile ## 1.3.0.pre.5 (Jan 9, 2013) Features: - make `--standalone` require lines ruby engine/version agnostic - add `--dry-run` to `bundle clean` (@wfarr, #2237) Bugfixes: - don't skip writing binstubs when doing `bundle install` - distinguish between ruby 1.9/2.0 when using :platforms (@spastorino) ## 1.3.0.pre.4 (Jan 3, 2013) Features: - `bundle binstubs ` to setup individual binstubs - `bundle install --binstubs ""` will remove binstubs option - `bundle clean --dry-run` will print out gems instead of removing them Bugfixes: - Avoid stack traces when Ctrl+C during bundle command (@mitchellh) - fix YAML parsing in in ruby-preview2 ## 1.3.0.pre.3 (Dec 21, 2012) Features: - pushing gems during `rake release` can be disabled (@trans) - installing gems with `rake install` is much faster (@utkarshkukreti) - added platforms :ruby_20 and :mri_20, since the ABI has changed - added '--edit' option to open generated gemspec in editor Bugfixes: - :git gems with extensions now work with Rubygems >= 2.0 (@jeremy) - revert SemVer breaking change to :github - `outdated` exits non-zero if outdated gems found (@rohit, #2021) - https Gist URLs for compatibility with Gist 2.0 (@NARKOZ) - namespaced gems no longer generate a superfluous directory (@banyan) ## 1.3.0.pre.2 (Dec 9, 2012) Features: - `config` expands local overrides like `local.rack .` (@gkop, #2205) - `gem` generates files correctly for names like `jquery-rails` (@banyan, #2201) - use gems from gists with the :gist option in the Gemfile (@jgaskins) Bugfixes: - Gemfile sources other than rubygems.org work even when .gemrc contains sources - caching git gems now caches specs, fixing e.g. git ls-files (@bison, #2039) - `show GEM` now warns if the directory has been deleted (@rohit, #2070) - git output hidden when running in --quiet mode (@rohit) ## 1.3.0.pre (Nov 29, 2012) Features: - compatible with Ruby 2.0.0-preview2 - compatible with Rubygems 2.0.0.preview2 (@drbrain, @evanphx) - ruby 2.0 added to the `:ruby19` ABI-compatible platform - lazy load YAML, allowing Psych to be specified in the Gemfile - significant performance improvements (@cheald, #2181) - `inject` command for scripted Gemfile additions (Engine Yard) - :github option uses slashless arguments as repo owner (@rking) - `open` suggests gem names for typos (@jdelStrother) - `update` reports non-existent gems (@jdelStrother) - `gem` option --test can generate rspec stubs (@MafcoCinco) - `gem` option --test can generate minitest stubs (@kcurtin) - `gem` command generates MIT license (@BrentWheeldon) - gem rake task 'release' resuses existing tags (@shtirlic) Bugfixes: - JRuby new works with HTTPS gem sources (@davidcelis) - `install` installs both rake rake-built gems at once (@crowbot, #2107) - handle Errno::ETIMEDOUT errors (@jmoses) - handle Errno::EAGAIN errors on JRuby - disable ANSI coloring when output is redirected (@tomykaira) - raise LoadErrors correctly during Bundler.require (@Empact) - do not swallow --verbose on `bundle exec` (@sol, #2102) - `gem` generates gemspecs that block double-requires - `gem` generates gemspecs that admit they depend on rake ## 1.2.5 (Feb 24, 2013) Bugfixes: - install Gemfiles with HTTP sources even without OpenSSL present - display CerficateFailureError message in full ## 1.2.4 (Feb 12, 2013) Features: - warn about Ruby 2.0 and Rubygems 2.0 - inform users when the resolver starts - disable reverse DNS to speed up API requests (@raggi) Bugfixes: - don't send user/pass when redirected to another host (@perplexes) - load gemspecs containing unicode (@gaffneyc, #2301) - support any ruby version in --standalone - resolve some ruby -w warnings (@chastell, #2193) - don't scare users with an error message during API fallback ## 1.2.3 (Nov 29, 2012) Bugfixes: - fix exceptions while loading some gemspecs ## 1.2.2 (Nov 14, 2012) Bugfixes: - support new Psych::SyntaxError for Ruby 2.0.0 (@tenderlove, @sol) - `bundle viz` works with git gems again (@hirochachacha) - recognize more cases when OpenSSL is not present ## 1.2.1 (Sep 19, 2012) Bugfixes: - `bundle clean` now works with BUNDLE_WITHOUT groups again - have a net/http read timeout around the Gemcutter API Endpoint ## 1.2.0 (Aug 30, 2012) Bugfixes: - raise original error message from LoadError's Documentation: - `platform` man pages ## 1.2.0.rc.2 (Aug 8, 2012) Bugfixes: - `clean` doesn't remove gems that are included in the lockfile ## 1.2.0.rc (Jul 17, 2012) Features: - `check` now has a `--dry-run` option (@svenfuchs, #1811) - loosen ruby directive for engines - prune git/path directories inside vendor/cache (@josevalim, #1988) - update vendored thor to 0.15.2 (@sferik) - add .txt to LICENSE (@postmodern, #2001) - add `config disable_local_branch_check` (@josevalim, #1985) - fall back on the full index when experiencing syck errors (#1419) - handle syntax errors in Ruby gemspecs (#1974) Bugfixes: - fix `pack`/`cache` with `--all` (@josevalim, #1989) - don't display warning message when `cache_all` is set - check for `nil` PATH (#2006) - Always try to keep original GEM_PATH (@drogus, #1920) ## 1.2.0.pre.1 (May 27, 2012) Features: - Git gems import submodules of submodules recursively (@nwwatson, #1935) Bugfixes: - Exit from `check` with a non-zero status when frozen with no lock - Use `latest_release` in Capistrano and Vlad integration (#1264) - Work around a Ruby 1.9.3p194 bug in Psych when config files are empty Documentation: - Add instructions for local git repos to the `config` manpage - Update the `Gemfile` manpage to include ruby versions (@stevenh512) - When OpenSSL is missing, provide instructions for fixing (#1776 etc.) - Unknown exceptions now link to ISSUES for help instead of a new ticket - Correct inline help for `clean --force` (@dougbarth, #1911) ## 1.2.0.pre (May 4, 2012) Features: - bundle package now accepts --all to package git and path dependencies - bundle config now accepts --local, --global and --delete options - It is possible to override a git repository via configuration. For instance, if you have a git dependency on rack, you can force it to use a local repo with `bundle config local.rack ~/path/to/rack` - Cache gemspec loads for performance (@dekellum, #1635) - add --full-index flag to `bundle update` (@fluxx, #1829) - add --quiet flag to `bundle update` (@nashby, #1654) - Add Bundler::GemHelper.gemspec (@knu, #1637) - Graceful handling of Gemfile syntax errors (@koraktor, #1661) - `bundle platform` command - add ruby to DSL, to specify version of ruby - error out if the ruby version doesn't match Performance: - bundle exec shouldn't run Bundler.setup just setting the right rubyopts options is enough (@spastorino, #1598) Bugfixes: - Avoid passing RUBYOPT changes in with_clean_env block (@eric1234, #1604) - Use the same ruby to run subprocesses as is running rake (@brixen) Documentation: - Add :github documentation in DSL (@zofrex, #1848, #1851, #1852) - Add docs for the --no-cache option (@fluxx, #1796) - Add basic documentation for bin_path and bundle_path (@radar) - Add documentation for the run method in Bundler::Installer ## 1.1.5 (Jul 17, 2012) Features: - Special case `ruby` directive from 1.2.0, so you can install Gemfiles that use it ## 1.1.4 (May 27, 2012) Bugfixes: - Use `latest_release` in Capistrano and Vlad integration (#1264) - Unknown exceptions now link to ISSUES for help instead of a new ticket - When OpenSSL is missing, provide instructions for fixing (#1776 etc.) - Correct inline help for `clean --force` (@dougbarth, #1911) - Work around a Ruby 1.9.3p194 bug in Psych when config files are empty ## 1.1.3 (March 23, 2012) Bugfixes: - escape the bundler root path (@tenderlove, #1789) ## 1.1.2 (March 20, 2012) Bugfixes: - Fix --deployment for multiple PATH sections of the same source (#1782) ## 1.1.1 (March 14, 2012) Bugfixes: - Rescue EAGAIN so the fetcher works on JRuby on Windows - Stop asking users to report gem installation errors - Clarify "no sources" message - Use $\ so `bundle gem` gemspecs work on Windows (@postmodern) - URI-encode gem names for dependency API (@rohit, #1672) - Fix `cache` edge case in rubygems 1.3.7 (#1202) Performance: - Reduce invocation of git ls-files in `bundle gem` gemspecs (@knu) ## 1.1.0 (Mar 7, 2012) Bugfixes: - Clean up corrupted lockfiles on bundle installs - Prevent duplicate GIT sources - Fix post_install_message when uing the endpoint API ## 1.1.rc.8 (Mar 3, 2012) Performance: - don't resolve if the Gemfile.lock and Gemfile haven't changed Bugfixes: - Load gemspecs from git even when a released gem has the same version (#1609) - Declare an accurate Ruby version requirement of 1.8.7 or newer (#1619) - handle gemspec development dependencies correctly (@raggi, #1639) - Avoid passing RUBYOPT changes in with_clean_env block. (eric1234, #1604) ## 1.1.rc.7 (Dec 29, 2011) Bugfixes: - Fix bug where `clean` would break when using :path with no gemspec ## 1.1.rc.6 (Dec 22, 2011) Bugfixes: - Fix performance regression from 1.0 (@spastorino, #1511, #1591, #1592) - Load gems correctly when GEM_HOME is blank - Refresh gems so Bundler works from inside a bundle - Handle empty .bundle/config files without an error ## 1.1.rc.5 (Dec 14, 2011) Bugfixes: - Fix ASCII encoding errors with gem (rerelease with ruby 1.8) ## 1.1.rc.4 (Dec 14, 2011) Features: - `bundle viz` has the option to output a DOT file instead of a PNG (@hirochachacha, #683) Bugfixes: - Ensure binstubs generated when using --standalone point to the standalonde bundle (@cowboyd, #1588) - fix `bundle viz` (@hirochachacha, #1586) ## 1.1.rc.3 (Dec 8, 2011) Bugfixes: - fix relative_path so it checks Bundler.root is actually in the beginning of the path (#1582) - fix bundle outdated doesn't list all gems (@joelmoss, #1521) ## 1.1.rc.2 (Dec 6, 2011) Features: - Added README.md to `newgem` (@ognevsky, #1574) - Added LICENSE (MIT) to newgem (@ognevsky, #1571) Bugfixes: - only auto-namespace requires for implied requires (#1531) - fix bundle clean output for git repos (#1473) - use Gem.bindir for bundle clean (#1544, #1532) - use `Gem.load_env_plugins` instead of `Gem.load_env_plugins` (#1500, #1543) - differentiate Ruby 2.0 (trunk) from Ruby 1.9 (@tenderlove, #1539) - `bundle clean` handles 7 length git hash for bundle clean (#1490, #1491) - fix Psych loading issues - Search $PATH for a binary rather than shelling out to `which` (@tenderlove, #1573) - do not clear RG cache unless we actually modify GEM_PATH and GEM_HOME- use `Gem.load_env_plugins` instead of `Gem.load_env_plugins` (#1500, #1543) - `newgem` now uses https://rubygems.org (#1562) - `bundle init` now uses https://rubygems.org (@jjb, #1522) - `bundle install/update` does not autoclean when using --path for semver Documentation: - added documentation for --shebang option for `bundle install` (@lunks, #1475, #1558) ## 1.1.rc (Oct 3, 2011) Features: - add `--shebang` option to bundle install (@bensie, #1467) - build passes on ruby 1.9.3rc1 (#1458, #1469) - hide basic auth credentials for custom sources (#1440, #1463) Bugfixes: - fix index search result caching (#1446, #1466) - fix fetcher prints multiple times during install (#1445, #1462) - don't mention API errors from non-rubygems.org sources - fix autoclean so it doesn't remove bins that are used (#1459, #1460) Documentation: - add :require => [...] to the gemfile(5) manpage (@nono, #1468) ## 1.1.pre.10 (Sep 27, 2011) Features: - `config system_bindir foo` added, works like "-n foo" in your .gemrc file ## 1.1.pre.9 (Sep 18, 2011) Features: - `clean` will now clean up all old .gem and .gemspec files, cleaning up older pres - `clean` will be automatically run after bundle install and update when using `--path` (#1420, #1425) - `clean` now takes a `--force` option (#1247, #1426) - `clean` will clean up cached git dirs in bundle clean (#1390) - remove deprecations from DSL (#1119) - autorequire tries directories for gems with dashed names (#1205) - adds a `--paths` flag to `bundle show` to list all the paths of bundled gems (@tiegz, #1360) - load rubygems plugins in the bundle binary (@tpope, #1364) - make `--standalone` respect `--path` (@cowboyd, #1361) Bugfixes: - Fix `clean` to handle nested gems in a git repo (#1329) - Fix conflict from revert of benchmark tool (@boffbowsh, #1355) - Fix fatal error when unable to connect to gem source (#1269) - Fix `outdated` to find pre-release gems that are installed. (#1359) - Fix color for ui. (#1374) - Fix installing to user-owned system gems on OS X - Fix caching issue in the resolver (#1353, #1421) - Fix :github DSL option ## 1.1.pre.8 (Aug 13, 2011) Bugfixes: - Fix `bundle check` to not print fatal error message (@cldwalker, #1347) - Fix require_sudo when Gem.bindir isn't writeable (#1352) - Fix not asking Gemcutter API for dependency chain of git gems in --deployment (#1254) - Fix `install --binstubs` when using --path (#1332) ## 1.1.pre.7 (Aug 8, 2011) Bugfixes: - Fixed invalid byte sequence error while installing gem on Ruby 1.9 (#1341) - Fixed exception when sudo was needed to install gems (@spastorino) ## 1.1.pre.6 (Aug 8, 2011) Bugfixes: - Fix cross repository dependencies (#1138) - Fix git dependency fetching from API endpoint (#1254) - Fixes for bundle outdated (@joelmoss, #1238) - Fix bundle standalone when using the endpoint (#1240) Features: - Implement `to_ary` to avoid calls to method_missing (@tenderlove, #1274) - bundle clean removes old .gem files (@cldwalker, #1293) - Correcly identify missing child dependency in error message - Run pre-install, post-build, and post-install gem hooks for git gems (@warhammerkid, #1120) - create Gemfile.lock for empty Gemfile (#1218) ## 1.1.pre.5 (June 11, 2011) Bugfixes: - Fix LazySpecification on Ruby 1.9 (@dpiddy, #1232) - Fix HTTP proxy support (@leobessa, #878) Features: - Speed up `install --deployment` by using the API endpoint - Support Basic HTTP Auth for the API endpoint (@dpiddy, #1229) - Add `install --full-index` to disable the API endpoint, just in case - Significantly speed up install by removing unneeded gemspec fetches - `outdated` command shows outdated gems (@joelmoss, #1130) - Print gem post install messages (@csquared, #1155) - Reduce memory use by removing Specification.new inside method_missing (@tenderlove, #1222) - Allow `check --path` ## 1.1.pre.4 (May 5, 2011) Bugfixes: - Fix bug that could prevent installing new gems ## 1.1.pre.3 (May 4, 2011) Features: - Add `bundle outdated` to show outdated gems (@joelmoss) - Remove BUNDLE_* from `Bundler.with_clean_env` (@wuputah) - Add Bundler.clean_system, and clean_exec (@wuputah) - Use git config for gem author name and email (@krekoten) Bugfixes: - Fix error calling Bundler.rubygems.gem_path - Fix error when Gem.path returns Gem::FS instead of String ## 1.1.pre.2 (April 28, 2011) Features: - Add :github option to Gemfile DSL for easy git repos - Merge all fixes from 1.0.12 and 1.0.13 ## 1.1.pre.1 (February 2, 2011) Bugfixes: - Compatibility with changes made by Rubygems 1.5 ## 1.1.pre (January 21, 2011) Features: - Add bundle clean. Removes unused gems from --path directory - Initial Gemcutter Endpoint API work, BAI Fetching source index - Added bundle install --standalone - Ignore Gemfile.lock when building new gems - Make it possible to override a .gemspec dependency's source in the Gemfile Removed: - Removed bundle lock - Removed bundle install - Removed bundle install --production - Removed bundle install --disable-shared-gems ## 1.0.21 (September 30, 2011) - No changes from RC ## 1.0.21.rc (September 29, 2011) Bugfixes: - Load Psych unless Syck is defined, because 1.9.2 defines YAML ## 1.0.20 (September 27, 2011) Features: - Add platform :maglev (@timfel, #1444) Bugfixes: - Ensure YAML is required even if Psych is found - Handle directory names that contain invalid regex characters ## 1.0.20.rc (September 18, 2011) Features: - Rescue interrupts to `bundle` while loading bundler.rb (#1395) - Allow clearing without groups by passing `--without ''` (#1259) Bugfixes: - Manually sort requirements in the lockfile (#1375) - Remove several warnings generated by ruby -w (@stephencelis) - Handle trailing slashes on names passed to `gem` (#1372) - Name modules for gems like 'test-foo_bar' correctly (#1303) - Don't require Psych if Syck is already loaded (#1239) ## 1.0.19.rc (September 13, 2011) Features: - Compatibility with Rubygems 1.8.10 installer changes - Report gem installation failures clearly (@rwilcox, #1380) - Useful error for cap and vlad on first deploy (@nexmat, @kirs) Bugfixes: - `exec` now works when the command contains 'exec' - Only touch lock after changes on Windows (@robertwahler, #1358) - Keep load paths when #setup is called multiple times (@radsaq, #1379) ## 1.0.18 (August 16, 2011) Bugfixes: - Fix typo in DEBUG_RESOLVER (@geemus) - Fixes rake 0.9.x warning (@mtylty, #1333) - Fix `bundle cache` again for rubygems 1.3.x Features: - Run the bundle install earlier in a Capistrano deployment (@cgriego, #1300) - Support hidden gemspec (@trans, @cldwalker, #827) - Make fetch_specs faster (@zeha, #1294) - Allow overriding development deps loaded by #gemspec (@lgierth, #1245) ## 1.0.17 (August 8, 2011) Bugfixes: - Fix rake issues with rubygems 1.3.x (#1342) - Fixed invalid byte sequence error while installing gem on Ruby 1.9 (#1341) ## 1.0.16 (August 8, 2011) Features: - Performance fix for MRI 1.9 (@efficientcloud, #1288) - Shortcuts (like `bundle i`) for all commands (@amatsuda) - Correcly identify missing child dependency in error message Bugfixes: - Allow Windows network share paths with forward slashes (@mtscout6, #1253) - Check for rubygems.org credentials so `rake release` doesn't hang (#980) - Find cached prerelease gems on rubygems 1.3.x (@dburt, #1202) - Fix `bundle install --without` on kiji (@tmm1, #1287) - Get rid of warning in ruby 1.9.3 (@smartinez87, #1231) Documentation: - Documentation for `gem ..., :require => false` (@kmayer, #1292) - Gems provide "executables", they are rarely also binaries (@fxn, #1242) ## 1.0.15 (June 9, 2011) Features: - Improved Rubygems integration, removed many deprecation notices Bugfixes: - Escape URL arguments to git correctly on Windows (1.0.14 regression) ## 1.0.14 (May 27, 2011) Features: - Rubinius platform :rbx (@rkbodenner) - Include gem rake tasks with "require 'bundler/gem_tasks" (@indirect) - Include user name and email from git config in new gemspec (@ognevsky) Bugfixes: - Set file permissions after checking out git repos (@tissak) - Remove deprecated call to Gem::SourceIndex#all_gems (@mpj) - Require the version file in new gemspecs (@rubiii) - Allow relative paths from the Gemfile in gems with no gemspec (@mbirk) - Install gems that contain 'bundler', e.g. guard-bundler (@hone) - Display installed path correctly on Windows (@tadman) - Escape quotes in git URIs (@mheffner) - Improve Rake 0.9 support (@quix) - Handle certain directories already existing (@raggi) - Escape filenames containing regex characters (@indirect) ## 1.0.13 (May 4, 2011) Features: - Compatibility with Rubygems master (soon to be v1.8) (@evanphx) - Informative error when --path points to a broken symlink - Support Rake 0.9 and greater (@e2) - Output full errors for non-TTYs e.g. pow (@josh) Bugfixes: - Allow spaces in gem path names for gem tasks (@rslifka) - Have cap run bundle install from release_path (@martinjagusch) - Quote git refspec so zsh doesn't expand it (@goneflyin) ## 1.0.12 (April 8, 2011) Features: - Add --no-deployment option to `install` for disabling it on dev machines - Better error message when git fails and cache is present (@parndt) - Honor :bundle_cmd in cap `rake` command (@voidlock, @cgriego) Bugfixes: - Compatibility with Rubygems 1.7 and Rails 2.3 and vendored gems (@evanphx) - Fix changing gem order in lock (@gucki) - Remove color escape sequences when displaying man pages (@bgreenlee) - Fix creating GEM_HOME on both JRuby 1.5 and 1.6 (@nickseiger) - Fix gems without a gemspec and directories in bin/ (@epall) - Fix --no-prune option for `bundle install` (@cmeiklejohn) ## 1.0.11 (April 1, 2011) Features: - Compatibility with Rubygems 1.6 and 1.7 - Better error messages when a git command fails Bugfixes: - Don't always update gemspec gems (@carllerche) - Remove ivar warnings (@jackdempsey) - Fix occasional git failures in zsh (@jonah-carbonfive) - Consistent lock for gems with double deps like Cap (@akahn) ## 1.0.10 (February 1, 2011) Bugfixes: - Fix a regression loading YAML gemspecs from :git and :path gems - Requires, namespaces, etc. to work with changes in Rubygems 1.5 ## 1.0.9 (January 19, 2011) Bugfixes: - Fix a bug where Bundler.require could remove gems from the load path. In Rails apps with a default application.rb, this removed all gems in groups other than :default and Rails.env ## 1.0.8 (January 18, 2011) Features: - Allow overriding gemspec() deps with :git deps - Add --local option to `bundle update` - Ignore Gemfile.lock in newly generated gems - Use `less` as help pager instead of `more` - Run `bundle exec rake` instead of `rake` in Capistrano tasks Bugfixes: - Fix --no-cache option for `bundle install` - Allow Vlad deploys to work without Capistrano gem installed - Fix group arguments to `bundle console` - Allow groups to be loaded even if other groups were loaded - Evaluate gemspec() gemspecs in their directory not the cwd - Count on Rake to chdir to the right place in GemHelper - Change Pathnames to Strings for MacRuby - Check git process exit status correctly - Fix some warnings in 1.9.3-trunk (thanks tenderlove) ## 1.0.7 (November 17, 2010) Bugfixes: - Remove Bundler version from the lockfile because it broke backwards compatibility with 1.0.0-1.0.5. Sorry. :( ## 1.0.6 (November 16, 2010) Bugfixes: - Fix regression in `update` that caused long/wrong results - Allow git gems on other platforms while installing (#579) Features: - Speed up `install` command using various optimizations - Significantly increase performance of resolver - Use upcoming Rubygems performance improvements (@tmm1) - Warn if the lockfile was generated by a newer version - Set generated gems' homepage to "", so Rubygems will warn ## 1.0.5 (November 13, 2010) Bugfixes: - Fix regression disabling all operations that employ sudo ## 1.0.4 (November 12, 2010) Bugfixes: - Expand relative :paths from Bundler.root (eg ./foogem) - Allow git gems in --without groups while --frozen - Allow gem :ref to be a symbol as well as a string - Fix exception when Gemfile needs a newer Bundler version - Explanation when the current Bundler version conflicts - Explicit error message if Gemfile needs newer Bundler - Ignore an empty string BUNDLE_GEMFILE - Skeleton gemspec now works with older versions of git - Fix shell quoting and ref fetching in GemHelper - Disable colored output in --deployment - Preserve line endings in lock file Features: - Add support for 'mingw32' platform (aka RubyInstaller) - Large speed increase when Gemfile.lock is already present - Huge speed increase when many (100+) system gems are present - Significant expansion of ISSUES, man pages, and docs site - Remove Open3 from GemHelper (now it works on Windows™®©) - Allow setting roles in built-in cap and vlad tasks ## 1.0.3 (October 15, 2010) Bugfixes: - Use bitwise or in #hash to reduce the chance of overflow - `bundle update` now works with :git + :tag updates - Record relative :path options in the Gemfile.lock - :groups option on gem method in Gemfile now works - Add #platform method and :platform option to Gemfile DSL - --without now accepts a quoted, space-separated list - Installing after --deployment with no lock is now possible - Binstubs can now be symlinked - Print warning if cache for --local install is missing gems - Improve output when installing to a path - The tests all pass! Yay! ## 1.0.2 (October 2, 2010) Bugfix: - Actually include the man pages in the gem, so help works ## 1.0.1 (October 1, 2010) Features: - Vlad deployment recipe, `require 'bundler/vlad'` - Prettier bundle graphs - Improved gem skeleton for `bundle gem` - Prompt on file clashes when generating a gem - Option to generate binary with gem skeleton - Allow subclassing of GemHelper for custom tasks - Chdir to gem directory during `bundle open` Bugfixes: - Allow gemspec requirements with a list of versions - Accept lockfiles with windows line endings - Respect BUNDLE_WITHOUT env var - Allow `gem "foo", :platform => :jruby` - Specify loaded_from path in fake gemspec - Flesh out gem_helper tasks, raise errors correctly - Respect RBConfig::CONFIG['ruby_install_name'] in binstubs ## 1.0.0 (August 29, 2010) Features: - You can now define `:bundle_cmd` in the capistrano task Bugfixes: - Various bugfixes to the built-in rake helpers - Fix a bug where shortrefs weren't unique enough and were therfore colliding - Fix a small bug involving checking whether a local git clone is up to date - Correctly handle explicit '=' dependencies with gems pinned to a git source - Fix an issue with Windows-generated lockfiles by reading and writing the lockfile in binary mode - Fix an issue with shelling out to git in Windows by using double quotes around paths - Detect new Rubygems sources in the Gemfile and update the lockfile ## 1.0.0.rc.6 (August 23, 2010) Features: - Much better documentation for most of the commands and Gemfile format Bugfixes: - Don't attempt to create directories if they already exist - Fix the capistrano task so that it actually runs - Update the Gemfile template to reference rubygems.org instead of :gemcutter - bundle exec should exit with a non zero exit code when the gem binary does not exist or the file is not executable. - Expand paths in Gemfile relative to the Gemfile and not the current working directory. ## 1.0.0.rc.5 (August 10, 2010) Features: - Make the Capistrano task more concise. Bugfixes: - Fix a regression with determining whether or not to use sudo - Allow using the --gemfile flag with the --deployment flag ## 1.0.0.rc.4 (August 9, 2010) Features: - `bundle gem NAME` command to generate a new gem with Gemfile - Bundle config file location can be specified by BUNDLE_APP_CONFIG - Add --frozen to disable updating the Gemfile.lock at runtime (default with --deployment) - Basic Capistrano task now added as 'bundler/capistrano' Bugfixes: - Multiple bundler process no longer share a tmp directory - `bundle update GEM` always updates dependencies of GEM as well - Deleting the cache directory no longer causes errors - Moving the bundle after installation no longer causes git errors - Bundle path is now correctly remembered on a read-only filesystem - Gem binaries are installed to Gem.bindir, not #{Gem.dir}/bin - Fetch gems from vendor/cache, even without --local - Sort lockfile by platform as well as spec ## 1.0.0.rc.3 (August 3, 2010) Features: - Deprecate --production flag for --deployment, since the former was causing confusion with the :production group - Add --gemfile option to `bundle check` - Reduce memory usage of `bundle install` by 2-4x - Improve message from `bundle check` under various conditions - Better error when a changed Gemfile conflicts with Gemfile.lock Bugfixes: - Create bin/ directory if it is missing, then install binstubs - Error nicely on the edge case of a pinned gem with no spec - Do not require gems for other platforms - Update git sources along with the gems they contain ## 1.0.0.rc.2 (July 29, 2010) - `bundle install path` was causing confusion, so we now print a clarifying warning. The preferred way to install to a path (which will not print the warning) is `bundle install --path path/to/install`. - `bundle install --system` installs to the default system location ($BUNDLE_PATH or $GEM_HOME) even if you previously used `bundle install --path` - completely remove `--disable-shared-gems`. If you install to system, you will not be isolated, while if you install to another path, you will be isolated from gems installed to the system. This was mostly an internal option whose naming and semantics were extremely confusing. - Add a `--production` option to `bundle install`: - by default, installs to `vendor/bundle`. This can be overridden with the `--path` option - uses `--local` if `vendor/cache` is found. This will guarantee that Bundler does not attempt to connect to Rubygems and will use the gems cached in `vendor/cache` instead - Raises an exception if a Gemfile.lock is not found - Raises an exception if you modify your Gemfile in development but do not check in an updated Gemfile.lock - Fixes a bug where switching a source from Rubygems to git would always say "the git source is not checked out" when running `bundle install` NOTE: We received several reports of "the git source has not been checked out. Please run bundle install". As far as we can tell, these problems have two possible causes: 1. `bundle install ~/.bundle` in one user, but actually running the application as another user. Never install gems to a directory scoped to a user (`~` or `$HOME`) in deployment. 2. A bug that happened when changing a gem to a git source. To mitigate several common causes of `(1)`, please use the new `--production` flag. This flag is simply a roll-up of the best practices we have been encouraging people to use for deployment. If you want to share gems across deployments, and you use Capistrano, symlink release_path/current/vendor/bundle to release_path/shared/bundle. This will keep deployments snappy while maintaining the benefits of clean, deploy-time isolation. ## 1.0.0.rc.1 (July 26, 2010) - Fixed a bug with `bundle install` on multiple machines and git ## 1.0.0.beta.10 (July 25, 2010) - Last release before 1.0.0.rc.1 - Added :mri as a valid platform (platforms :mri { gem "ruby-debug" }) - Fix `bundle install` immediately after modifying the :submodule option - Don't write to Gemfile.lock if nothing has changed, fixing situations where bundle install was run with a different user than the app itself - Fix a bug where other platforms were being wiped on `bundle update` - Don't ask for root password on `bundle install` if not needed - Avoid setting `$GEM_HOME` where not needed - First solid pass of `bundle config` - Add build options - `bundle config build.mysql --with-mysql-config=/path/to/config` ## 1.0.0.beta.9 (July 21, 2010) - Fix install failure when switching from a path to git source - Fix `bundle exec bundle *` in a bundle with --disable-shared-gems - Fix `bundle *` from inside a bundle with --disable-shared-gem - Shim Gem.refresh. This is used by Unicorn - Fix install failure when a path's dependencies changed ## 1.0.0.beta.8 (July 20, 2010) - Fix a Beta 7 bug involving Ruby 1.9 ## 1.0.0.beta.7 (July 20, 2010, yanked) - Running `bundle install` twice in a row with a git source always crashed ## 1.0.0.beta.6 (July 20, 2010, yanked) - Create executables with bundle install --binstubs - You can customize the location (default is app/bin) with --binstubs other/location - Fix a bug where the Gemfile.lock would be deleted even if the update was exited - Fix a bug where cached gems for other platforms were sometimes deleted - Clean up output when nothing was deleted from cache (it previously said "Removing outdated gems ...") - Improve performance of bundle install if the git gem was already checked out, and the revision being used already exists locally - Fix bundle show bundler in some cases - Fix bugs with bundle update - Don't ever run git commands at runtime (fixes a number of common passenger issues) - Fixes an obscure bug where switching the source of a gem could fail to correctly change the source of its dependencies - Support multiple version dependencies in the Gemfile (gem "rails", ">= 3.0.0.beta1", "<= 3.0.0") - Raise an exception for ambiguous uses of multiple declarations of the same gem (for instance, with different versions or sources). - Fix cases where the same dependency appeared several times in the Gemfile.lock - Fix a bug where require errors were being swallowed during Bundler.require ## 1.0.0.beta.1 - No `bundle lock` command. Locking happens automatically on install or update - No .bundle/environment.rb. Require 'bundler/setup' instead. - $BUNDLE_HOME defaults to $GEM_HOME instead of ~/.bundle - Remove lockfiles generated by 0.9 ## 0.9.26 Features: - error nicely on incompatible 0.10 lockfiles ## 0.9.25 (May 3, 2010) Bugfixes: - explicitly coerce Pathname objects to Strings for Ruby 1.9 - fix some newline weirdness in output from install command ## 0.9.24 (April 22, 2010) Features: - fetch submodules for git sources - limit the bundled version of bundler to the same as the one installing - force relative paths in git gemspecs to avoid raising Gem::NameTooLong - serialize GemCache sources correctly, so locking works - raise Bundler::GemNotFound instead of calling exit! inside library code - Rubygems 1.3.5 compatibility for the adventurous, not supported by me :) Bugfixes: - don't try to regenerate environment.rb if it is read-only - prune outdated gems with the platform "ruby" - prune cache without errors when there are directories or non-gem files - don't re-write environment.rb if running after it has been loaded - do not monkeypatch Specification#load_paths twice when inside a bundle ## 0.9.23 (April 20, 2010) Bugfixes: - cache command no longer prunes gems created by an older rubygems version - cache command no longer prunes gems that are for other platforms ## 0.9.22 (April 20, 2010) Features: - cache command now prunes stale .gem files from vendor/cache - init --gemspec command now generates development dependencies - handle Polyglot's changes to Kernel#require with Bundler::ENV_LOADED (#287) - remove .gem files generated after installing a gem from a :path (#286) - improve install/lock messaging (#284) Bugfixes: - ignore cached gems that are for another platform (#288) - install Windows gems that have no architecture set, like rcov (#277) - exec command while locked now includes the bundler lib in $LOAD_PATH (#293) - fix the `rake install` task - add GemspecError so it can be raised without (further) error (#292) - create a parent directory before cloning for git 1.5 compatibility (#285) ## 0.9.21 (April 16, 2010) Bugfixes: - don't raise 'omg wtf' when lockfile is outdated ## 0.9.20 (April 15, 2010) Features: - load YAML format gemspecs - no backtraces when calling Bundler.setup if gems are missing - no backtraces when trying to exec a file without the executable bit Bugfixes: - fix infinite recursion in Bundler.setup after loading a bundled Bundler gem - request install instead of lock when env.rb is out of sync with Gemfile.lock ## 0.9.19 (April 12, 2010) Features: - suggest `bundle install --relock` when the Gemfile has changed (#272) - source support for Rubygems servers without prerelease gem indexes (#262) Bugfixes: - don't set up all groups every time Bundler.setup is called while locked (#263) - fix #full_gem_path for git gems while locked (#268) - eval gemspecs at the top level, not inside the Bundler class (#269) ## 0.9.18 (April 8, 2010) Features: - console command that runs irb with bundle (and optional group) already loaded Bugfixes: - Bundler.setup now fully disables system gems, even when unlocked (#266, #246) - fixes Yard, which found plugins in Gem.source_index that it could not load - makes behaviour of `Bundler.require` consistent between locked and unlocked loads ## 0.9.17 (April 7, 2010) Features: - Bundler.require now calls Bundler.setup automatically - Gem::Specification#add_bundler_dependencies added for gemspecs Bugfixes: - Gem paths are not longer duplicated while loading bundler - exec no longer duplicates RUBYOPT if it is already set correctly ## 0.9.16 (April 3, 2010) Features: - exit gracefully on INT signal - resolver output now indicates whether remote sources were checked - print error instead of backtrace when exec cannot find a binary (#241) Bugfixes: - show, check, and open commands work again while locked (oops) - show command for git gems - outputs branch names other than master - gets the correct sha from the checkout - doesn't print sha twice if :ref is set - report errors from bundler/setup.rb without backtraces (#243) - fix Gem::Spec#git_version to not error on unloaded specs - improve deprecation, Gemfile, and command error messages (#242) ## 0.9.15 (April 1, 2010) Features: - use the env_file if possible instead of doing a runtime resolve - huge speedup when calling Bundler.setup while locked - ensures bundle exec is fast while locked - regenerates env_file if it was generated by an older version - update cached/packed gems when you update gems via bundle install Bugfixes: - prep for Rubygems 1.3.7 changes - install command now pulls git branches correctly (#211) - raise errors on invalid options in the Gemfile ## 0.9.14 (March 30, 2010) Features: - install command output vastly improved - installation message now accurate, with 'using' and 'installing' - bundler gems no longer listed as 'system gems' - show command output now includes sha and branch name for git gems - init command now takes --gemspec option for bootstrapping gem Gemfiles - Bundler.with_clean_env for shelling out to ruby scripts - show command now aliased as 'list' - VISUAL env var respected for GUI editors Bugfixes: - exec command now finds binaries from gems with no gemspec - note source of Gemfile resolver errors - don't blow up if git urls are changed ## 0.9.13 (March 23, 2010) Bugfixes: - exec command now finds binaries from gems installed via :path - gem dependencies are pulled in even if their type is nil - paths with spaces have double-quotes to work on Windows - set GEM_PATH in environment.rb so generators work with Rails 2 ## 0.9.12 (March 17, 2010) - refactoring, internal cleanup, more solid specs Features: - check command takes a --without option - check command exits 1 if the check fails Bugfixes: - perform a topological sort on resolved gems (#191) - gems from git work even when paths or repos have spaces (#196) - Specification#loaded_from returns a String, like Gem::Specification (#197) - specs eval from inside the gem directory, even when locked - virtual gemspecs are now saved in environment.rb for use when loading - unify the Installer's local index and the runtime index (#204) ## 0.9.11 (March 9, 2010) - added roadmap with future development plans Features: - install command can take the path to the gemfile with --gemfile (#125) - unknown command line options are now rejected (#163) - exec command hugely sped up while locked (#177) - show command prints the install path if you pass it a gem name (#148) - open command edits an installed gem with $EDITOR (#148) - Gemfile allows assigning an array of groups to a gem (#114) - Gemfile allows :tag option on :git sources - improve backtraces when a gemspec is invalid - improve performance by installing gems from the cache if present Bugfixes: - normalize parameters to Bundler.require (#153) - check now checks installed gems rather than cached gems (#162) - don't update the gem index when installing after locking (#169) - bundle parenthesises arguments for 1.8.6 (#179) - gems can now be assigned to multiple groups without problems (#135) - fix the warning when building extensions for a gem from git with Rubygems 1.3.6 - fix a Dependency.to_yaml error due to accidentally including sources and groups - don't reinstall packed gems - fix gems with git sources that are private repositories ## 0.9.10 (March 1, 2010) - depends on Rubygems 1.3.6 Bugfixes: - support locking after install --without - don't reinstall gems from the cache if they're already in the bundle - fixes for Ruby 1.8.7 and 1.9 ## 0.9.9 (February 25, 2010) Bugfixes: - don't die if GEM_HOME is an empty string - fixes for Ruby 1.8.6 and 1.9 ## 0.9.8 (February 23, 2010) Features: - pack command which both caches and locks - descriptive error if a cached gem is missing - remember the --without option after installing - expand paths given in the Gemfile via the :path option - add block syntax to the git and group options in the Gemfile - support gems with extensions that don't admit they depend on rake - generate gems using gem build gemspec so git gems can have native extensions - print a useful warning if building a gem fails - allow manual configuration via BUNDLE_PATH Bugfixes: - eval gemspecs in the gem directory so relative paths work - make default spec for git sources valid - don't reinstall gems that are already packed ## 0.9.7 (February 17, 2010) Bugfixes: - don't say that a gem from an excluded group is "installing" - improve crippling rubygems in locked scenarios ## 0.9.6 (February 16, 2010) Features: - allow String group names - a number of improvements in the documentation and error messages Bugfixes: - set SourceIndex#spec_dirs to solve a problem involving Rails 2.3 in unlocked mode - ensure Rubygems is fully loaded in Ruby 1.9 before patching it - fix `bundle install` for a locked app without a .bundle directory - require gems in the order that the resolver determines - make the tests platform agnostic so we can confirm that they're green on JRuby - fixes for Ruby 1.9 ## 0.9.5 (February 12, 2010) Features: - added support for :path => "relative/path" - added support for older versions of git - added `bundle install --disable-shared-gems` - Bundler.require fails silently if a library does not have a file on the load path with its name - Basic support for multiple rubies by namespacing the default bundle path using the version and engine Bugfixes: - if the bundle is locked and .bundle/environment.rb is not present when Bundler.setup is called, generate it - same if it's not present with `bundle check` - same if it's not present with `bundle install` bundler-1.16.1/bundler.gemspec0000644000175000017500000000422313217261023017005 0ustar samuelophsamueloph# coding: utf-8 # frozen_string_literal: true require File.expand_path("../lib/bundler/version", __FILE__) require "shellwords" Gem::Specification.new do |s| s.name = "bundler" s.version = Bundler::VERSION s.license = "MIT" s.authors = [ "André Arko", "Samuel Giddins", "Chris Morris", "James Wen", "Tim Moore", "André Medeiros", "Jessica Lynn Suttles", "Terence Lee", "Carl Lerche", "Yehuda Katz" ] s.email = ["team@bundler.io"] s.homepage = "http://bundler.io" s.summary = "The best way to manage your application's dependencies" s.description = "Bundler manages an application's dependencies through its entire life, across many machines, systematically and repeatably" if s.respond_to?(:metadata=) s.metadata = { "bug_tracker_uri" => "http://github.com/bundler/bundler/issues", "changelog_uri" => "https://github.com/bundler/bundler/blob/master/CHANGELOG.md", "homepage_uri" => "https://bundler.io/", "source_code_uri" => "http://github.com/bundler/bundler/", } end if s.version >= Gem::Version.new("2.a".dup) s.required_ruby_version = ">= 2.3.0" s.required_rubygems_version = ">= 2.5.0" else s.required_ruby_version = ">= 1.8.7" s.required_rubygems_version = ">= 1.3.6" end s.add_development_dependency "automatiek", "~> 0.1.0" s.add_development_dependency "mustache", "0.99.6" s.add_development_dependency "rake", "~> 10.0" s.add_development_dependency "rdiscount", "~> 2.2" s.add_development_dependency "ronn", "~> 0.7.3" s.add_development_dependency "rspec", "~> 3.6" s.files = `git ls-files -z`.split("\x0").select {|f| f.match(%r{^(lib|exe)/}) } # we don't check in man pages, but we need to ship them because # we use them to generate the long-form help for each command. s.files += Dir.glob("man/**/*") # Include the CHANGELOG.md, LICENSE.md, README.md manually s.files += %w[CHANGELOG.md LICENSE.md README.md] # include the gemspec itself because warbler breaks w/o it s.files += %w[bundler.gemspec] s.bindir = "exe" s.executables = %w[bundle bundler] s.require_paths = ["lib"] end bundler-1.16.1/lib/0000755000175000017500000000000013217261023014552 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/0000755000175000017500000000000013217261023016205 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/dsl.rb0000644000175000017500000005125413217261023017323 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/dependency" require "bundler/ruby_dsl" module Bundler class Dsl include RubyDsl def self.evaluate(gemfile, lockfile, unlock) builder = new builder.eval_gemfile(gemfile) builder.to_definition(lockfile, unlock) end VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules platform platforms type source install_if].freeze attr_reader :gemspecs attr_accessor :dependencies def initialize @source = nil @sources = SourceList.new @git_sources = {} @dependencies = [] @groups = [] @install_conditionals = [] @optional_groups = [] @platforms = [] @env = nil @ruby_version = nil @gemspecs = [] @gemfile = nil @gemfiles = [] add_git_sources end def eval_gemfile(gemfile, contents = nil) expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile && @gemfile.parent) original_gemfile = @gemfile @gemfile = expanded_gemfile_path @gemfiles << expanded_gemfile_path contents ||= Bundler.read_file(@gemfile.to_s) instance_eval(contents.dup.untaint, gemfile.to_s, 1) rescue Exception => e message = "There was an error " \ "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ "`#{File.basename gemfile.to_s}`: #{e.message}" raise DSLError.new(message, gemfile, e.backtrace, contents) ensure @gemfile = original_gemfile end def gemspec(opts = nil) opts ||= {} path = opts[:path] || "." glob = opts[:glob] name = opts[:name] development_group = opts[:development_group] || :development expanded_path = gemfile_root.join(path) gemspecs = Dir[File.join(expanded_path, "{,*}.gemspec")].map {|g| Bundler.load_gemspec(g) }.compact gemspecs.reject! {|s| s.name != name } if name Index.sort_specs(gemspecs) specs_by_name_and_version = gemspecs.group_by {|s| [s.name, s.version] } case specs_by_name_and_version.size when 1 specs = specs_by_name_and_version.values.first spec = specs.find {|s| s.match_platform(Bundler.local_platform) } || specs.first @gemspecs << spec gem_platforms = Bundler::Dependency::REVERSE_PLATFORM_MAP[Bundler::GemHelpers.generic_local_platform] gem spec.name, :name => spec.name, :path => path, :glob => glob, :platforms => gem_platforms group(development_group) do spec.development_dependencies.each do |dep| gem dep.name, *(dep.requirement.as_list + [:type => :development]) end end when 0 raise InvalidOption, "There are no gemspecs at #{expanded_path}" else raise InvalidOption, "There are multiple gemspecs at #{expanded_path}. " \ "Please use the :name option to specify which one should be used" end end def gem(name, *args) options = args.last.is_a?(Hash) ? args.pop.dup : {} version = args || [">= 0"] normalize_options(name, version, options) dep = Dependency.new(name, version, options) # if there's already a dependency with this name we try to prefer one if current = @dependencies.find {|d| d.name == dep.name } deleted_dep = @dependencies.delete(current) if current.type == :development if current.requirement != dep.requirement unless deleted_dep return if dep.type == :development raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \ "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" end else Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \ "You should probably keep only one of them.\n" \ "While it's not a problem now, it could cause errors if you change the version of one of them later." end if current.source != dep.source unless deleted_dep return if dep.type == :development raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \ "You specified that #{dep.name} (#{dep.requirement}) should come from " \ "#{current.source || "an unspecified source"} and #{dep.source}\n" end end end @dependencies << dep end def source(source, *args, &blk) options = args.last.is_a?(Hash) ? args.pop.dup : {} options = normalize_hash(options) source = normalize_source(source) if options.key?("type") options["type"] = options["type"].to_s unless Plugin.source?(options["type"]) raise InvalidOption, "No plugin sources available for #{options["type"]}" end unless block_given? raise InvalidOption, "You need to pass a block to #source with :type option" end source_opts = options.merge("uri" => source) with_source(@sources.add_plugin_source(options["type"], source_opts), &blk) elsif block_given? with_source(@sources.add_rubygems_source("remotes" => source), &blk) else check_primary_source_safety(@sources) @sources.global_rubygems_source = source end end def git_source(name, &block) unless block_given? raise InvalidOption, "You need to pass a block to #git_source" end if valid_keys.include?(name.to_s) raise InvalidOption, "You cannot use #{name} as a git source. It " \ "is a reserved key. Reserved keys are: #{valid_keys.join(", ")}" end @git_sources[name.to_s] = block end def path(path, options = {}, &blk) unless block_given? msg = "You can no longer specify a path source by itself. Instead, \n" \ "either use the :path option on a gem, or specify the gems that \n" \ "bundler should find in the path source by passing a block to \n" \ "the path method, like: \n\n" \ " path 'dir/containing/rails' do\n" \ " gem 'rails'\n" \ " end\n\n" raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource? SharedHelpers.major_deprecation(2, msg.strip) end source_options = normalize_hash(options).merge( "path" => Pathname.new(path), "root_path" => gemfile_root, "gemspec" => gemspecs.find {|g| g.name == options["name"] } ) source = @sources.add_path_source(source_options) with_source(source, &blk) end def git(uri, options = {}, &blk) unless block_given? msg = "You can no longer specify a git source by itself. Instead, \n" \ "either use the :git option on a gem, or specify the gems that \n" \ "bundler should find in the git source by passing a block to \n" \ "the git method, like: \n\n" \ " git 'git://github.com/rails/rails.git' do\n" \ " gem 'rails'\n" \ " end" raise DeprecatedError, msg end with_source(@sources.add_git_source(normalize_hash(options).merge("uri" => uri)), &blk) end def github(repo, options = {}) raise ArgumentError, "GitHub sources require a block" unless block_given? raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources? github_uri = @git_sources["github"].call(repo) git_options = normalize_hash(options).merge("uri" => github_uri) git_source = @sources.add_git_source(git_options) with_source(git_source) { yield } end def to_definition(lockfile, unlock) Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles) end def group(*args, &blk) options = args.last.is_a?(Hash) ? args.pop.dup : {} normalize_group_options(options, args) @groups.concat args if options["optional"] optional_groups = args - @optional_groups @optional_groups.concat optional_groups end yield ensure args.each { @groups.pop } end def install_if(*args) @install_conditionals.concat args yield ensure args.each { @install_conditionals.pop } end def platforms(*platforms) @platforms.concat platforms yield ensure platforms.each { @platforms.pop } end alias_method :platform, :platforms def env(name) old = @env @env = name yield ensure @env = old end def plugin(*args) # Pass on end def method_missing(name, *args) raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile" end private def add_git_sources return if Bundler.feature_flag.skip_default_git_sources? git_source(:github) do |repo_name| warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".') "https://github.com/#{repo_name}.git" RUBY # It would be better to use https instead of the git protocol, but this # can break deployment of existing locked bundles when switching between # different versions of Bundler. The change will be made in 2.0, which # does not guarantee compatibility with the 1.x series. # # See https://github.com/bundler/bundler/pull/2569 for discussion # # This can be overridden by adding this code to your Gemfiles: # # git_source(:github) do |repo_name| # repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") # "https://github.com/#{repo_name}.git" # end repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") # TODO: 2.0 upgrade this setting to the default if Bundler.settings["github.https"] Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed" "https://github.com/#{repo_name}.git" else "git://github.com/#{repo_name}.git" end end # TODO: 2.0 remove this deprecated git source git_source(:gist) do |repo_name| warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"') "https://gist.github.com/#{repo_name}.git" end # TODO: 2.0 remove this deprecated git source git_source(:bitbucket) do |repo_name| warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip) user_name, repo_name = repo_name.split("/") repo_name ||= user_name "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git" RUBY user_name, repo_name = repo_name.split("/") repo_name ||= user_name "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git" end end def with_source(source) old_source = @source if block_given? @source = source yield end source ensure @source = old_source end def normalize_hash(opts) opts.keys.each do |k| opts[k.to_s] = opts.delete(k) unless k.is_a?(String) end opts end def valid_keys @valid_keys ||= VALID_KEYS end def normalize_options(name, version, opts) if name.is_a?(Symbol) raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead) end if name =~ /\s/ raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace) end if name.empty? raise GemfileError, %(an empty gem name is not valid) end normalize_hash(opts) git_names = @git_sources.keys.map(&:to_s) validate_keys("gem '#{name}'", opts, valid_keys + git_names) groups = @groups.dup opts["group"] = opts.delete("groups") || opts["group"] groups.concat Array(opts.delete("group")) groups = [:default] if groups.empty? install_if = @install_conditionals.dup install_if.concat Array(opts.delete("install_if")) install_if = install_if.reduce(true) do |memo, val| memo && (val.respond_to?(:call) ? val.call : val) end platforms = @platforms.dup opts["platforms"] = opts["platform"] || opts["platforms"] platforms.concat Array(opts.delete("platforms")) platforms.map!(&:to_sym) platforms.each do |p| next if VALID_PLATFORMS.include?(p) raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}" end # Save sources passed in a key if opts.key?("source") source = normalize_source(opts["source"]) opts["source"] = @sources.add_rubygems_source("remotes" => source) end git_name = (git_names & opts.keys).last if @git_sources[git_name] opts["git"] = @git_sources[git_name].call(opts[git_name]) end %w[git path].each do |type| next unless param = opts[type] if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/ options = opts.merge("name" => name, "version" => $1) else options = opts.dup end source = send(type, param, options) {} opts["source"] = source end opts["source"] ||= @source opts["env"] ||= @env opts["platforms"] = platforms.dup opts["group"] = groups opts["should_include"] = install_if end def normalize_group_options(opts, groups) normalize_hash(opts) groups = groups.map {|group| ":#{group}" }.join(", ") validate_keys("group #{groups}", opts, %w[optional]) opts["optional"] ||= false end def validate_keys(command, opts, valid_keys) invalid_keys = opts.keys - valid_keys git_source = opts.keys & @git_sources.keys.map(&:to_s) if opts["branch"] && !(opts["git"] || opts["github"] || git_source.any?) raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch) end return true unless invalid_keys.any? message = String.new message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} " message << if invalid_keys.size > 1 "as options for #{command}, but they are invalid." else "as an option for #{command}, but it is invalid." end message << " Valid options are: #{valid_keys.join(", ")}." message << " You may be able to resolve this by upgrading Bundler to the newest version." raise InvalidOption, message end def normalize_source(source) case source when :gemcutter, :rubygems, :rubyforge Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \ "requests are insecure.\nPlease change your source to 'https://" \ "rubygems.org' if possible, or 'http://rubygems.org' if not." "http://rubygems.org" when String source else raise GemfileError, "Unknown source '#{source}'" end end def check_primary_source_safety(source_list) return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil? if Bundler.feature_flag.disable_multisource? msg = "This Gemfile contains multiple primary sources. " \ "Each source after the first must include a block to indicate which gems " \ "should come from that source" unless Bundler.feature_flag.bundler_2_mode? msg += ". To downgrade this error to a warning, run " \ "`bundle config --delete disable_multisource`" end raise GemfileEvalError, msg else Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \ "Using `source` more than once without a block is a security risk, and " \ "may result in installing unexpected gems. To resolve this warning, use " \ "a block to indicate which gems should come from the secondary source. " \ "To upgrade this warning to an error, run `bundle config " \ "disable_multisource true`." end end def warn_deprecated_git_source(name, replacement, additional_message = nil) # TODO: 2.0 remove deprecation additional_message &&= " #{additional_message}" replacement = if replacement.count("\n").zero? "{|repo_name| #{replacement} }" else "do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end" end Bundler::SharedHelpers.major_deprecation 2, <<-EOS The :#{name} git source is deprecated, and will be removed in Bundler 2.0.#{additional_message} Add this code to the top of your Gemfile to ensure it continues to work: git_source(:#{name}) #{replacement} EOS end class DSLError < GemfileError # @return [String] the description that should be presented to the user. # attr_reader :description # @return [String] the path of the dsl file that raised the exception. # attr_reader :dsl_path # @return [Exception] the backtrace of the exception raised by the # evaluation of the dsl file. # attr_reader :backtrace # @param [Exception] backtrace @see backtrace # @param [String] dsl_path @see dsl_path # def initialize(description, dsl_path, backtrace, contents = nil) @status_code = $!.respond_to?(:status_code) && $!.status_code @description = description @dsl_path = dsl_path @backtrace = backtrace @contents = contents end def status_code @status_code || super end # @return [String] the contents of the DSL that cause the exception to # be raised. # def contents @contents ||= begin dsl_path && File.exist?(dsl_path) && File.read(dsl_path) end end # The message of the exception reports the content of podspec for the # line that generated the original exception. # # @example Output # # Invalid podspec at `RestKit.podspec` - undefined method # `exclude_header_search_paths=' for # # # from spec-repos/master/RestKit/0.9.3/RestKit.podspec:36 # ------------------------------------------- # # because it would break: #import # > ns.exclude_header_search_paths = 'Code/RestKit.h' # end # ------------------------------------------- # # @return [String] the message of the exception. # def to_s @to_s ||= begin trace_line, description = parse_line_number_from_description m = String.new("\n[!] ") m << description m << ". Bundler cannot continue.\n" return m unless backtrace && dsl_path && contents trace_line = backtrace.find {|l| l.include?(dsl_path.to_s) } || trace_line return m unless trace_line line_numer = trace_line.split(":")[1].to_i - 1 return m unless line_numer lines = contents.lines.to_a indent = " # " indicator = indent.tr("#", ">") first_line = line_numer.zero? last_line = (line_numer == (lines.count - 1)) m << "\n" m << "#{indent}from #{trace_line.gsub(/:in.*$/, "")}\n" m << "#{indent}-------------------------------------------\n" m << "#{indent}#{lines[line_numer - 1]}" unless first_line m << "#{indicator}#{lines[line_numer]}" m << "#{indent}#{lines[line_numer + 1]}" unless last_line m << "\n" unless m.end_with?("\n") m << "#{indent}-------------------------------------------\n" end end private def parse_line_number_from_description description = self.description if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path.to_s}):\d+)/ trace_line = Regexp.last_match[1] description = description.sub(/#{Regexp.quote trace_line}:\s*/, "").sub("\n", " - ") end [trace_line, description] end end def gemfile_root @gemfile ||= Bundler.default_gemfile @gemfile.dirname end end end bundler-1.16.1/lib/bundler/dependency.rb0000644000175000017500000001055313217261023020654 0ustar samuelophsamueloph# frozen_string_literal: true require "rubygems/dependency" require "bundler/shared_helpers" require "bundler/rubygems_ext" module Bundler class Dependency < Gem::Dependency attr_reader :autorequire attr_reader :groups attr_reader :platforms PLATFORM_MAP = { :ruby => Gem::Platform::RUBY, :ruby_18 => Gem::Platform::RUBY, :ruby_19 => Gem::Platform::RUBY, :ruby_20 => Gem::Platform::RUBY, :ruby_21 => Gem::Platform::RUBY, :ruby_22 => Gem::Platform::RUBY, :ruby_23 => Gem::Platform::RUBY, :ruby_24 => Gem::Platform::RUBY, :ruby_25 => Gem::Platform::RUBY, :mri => Gem::Platform::RUBY, :mri_18 => Gem::Platform::RUBY, :mri_19 => Gem::Platform::RUBY, :mri_20 => Gem::Platform::RUBY, :mri_21 => Gem::Platform::RUBY, :mri_22 => Gem::Platform::RUBY, :mri_23 => Gem::Platform::RUBY, :mri_24 => Gem::Platform::RUBY, :mri_25 => Gem::Platform::RUBY, :rbx => Gem::Platform::RUBY, :jruby => Gem::Platform::JAVA, :jruby_18 => Gem::Platform::JAVA, :jruby_19 => Gem::Platform::JAVA, :mswin => Gem::Platform::MSWIN, :mswin_18 => Gem::Platform::MSWIN, :mswin_19 => Gem::Platform::MSWIN, :mswin_20 => Gem::Platform::MSWIN, :mswin_21 => Gem::Platform::MSWIN, :mswin_22 => Gem::Platform::MSWIN, :mswin_23 => Gem::Platform::MSWIN, :mswin_24 => Gem::Platform::MSWIN, :mswin_25 => Gem::Platform::MSWIN, :mswin64 => Gem::Platform::MSWIN64, :mswin64_19 => Gem::Platform::MSWIN64, :mswin64_20 => Gem::Platform::MSWIN64, :mswin64_21 => Gem::Platform::MSWIN64, :mswin64_22 => Gem::Platform::MSWIN64, :mswin64_23 => Gem::Platform::MSWIN64, :mswin64_24 => Gem::Platform::MSWIN64, :mswin64_25 => Gem::Platform::MSWIN64, :mingw => Gem::Platform::MINGW, :mingw_18 => Gem::Platform::MINGW, :mingw_19 => Gem::Platform::MINGW, :mingw_20 => Gem::Platform::MINGW, :mingw_21 => Gem::Platform::MINGW, :mingw_22 => Gem::Platform::MINGW, :mingw_23 => Gem::Platform::MINGW, :mingw_24 => Gem::Platform::MINGW, :mingw_25 => Gem::Platform::MINGW, :x64_mingw => Gem::Platform::X64_MINGW, :x64_mingw_20 => Gem::Platform::X64_MINGW, :x64_mingw_21 => Gem::Platform::X64_MINGW, :x64_mingw_22 => Gem::Platform::X64_MINGW, :x64_mingw_23 => Gem::Platform::X64_MINGW, :x64_mingw_24 => Gem::Platform::X64_MINGW, :x64_mingw_25 => Gem::Platform::X64_MINGW, }.freeze REVERSE_PLATFORM_MAP = {}.tap do |reverse_platform_map| PLATFORM_MAP.each do |key, value| reverse_platform_map[value] ||= [] reverse_platform_map[value] << key end reverse_platform_map.each {|_, platforms| platforms.freeze } end.freeze def initialize(name, version, options = {}, &blk) type = options["type"] || :runtime super(name, version, type) @autorequire = nil @groups = Array(options["group"] || :default).map(&:to_sym) @source = options["source"] @platforms = Array(options["platforms"]) @env = options["env"] @should_include = options.fetch("should_include", true) @autorequire = Array(options["require"] || []) if options.key?("require") end # Returns the platforms this dependency is valid for, in the same order as # passed in the `valid_platforms` parameter def gem_platforms(valid_platforms) return valid_platforms if @platforms.empty? @gem_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.uniq valid_platforms & @gem_platforms end def should_include? @should_include && current_env? && current_platform? end def current_env? return true unless @env if @env.is_a?(Hash) @env.all? do |key, val| ENV[key.to_s] && (val.is_a?(String) ? ENV[key.to_s] == val : ENV[key.to_s] =~ val) end else ENV[@env.to_s] end end def current_platform? return true if @platforms.empty? @platforms.any? do |p| Bundler.current_ruby.send("#{p}?") end end def to_lock out = super out << "!" if source out << "\n" end def specific? super rescue NoMethodError requirement != ">= 0" end end end bundler-1.16.1/lib/bundler/deprecate.rb0000644000175000017500000000141113217261023020463 0ustar samuelophsamueloph# frozen_string_literal: true begin require "rubygems/deprecate" rescue LoadError # it's fine if it doesn't exist on the current RubyGems... nil end module Bundler if defined? Bundler::Deprecate # nothing to do! elsif defined? ::Deprecate Deprecate = ::Deprecate elsif defined? Gem::Deprecate Deprecate = Gem::Deprecate else class Deprecate end end unless Deprecate.respond_to?(:skip_during) def Deprecate.skip_during original = skip self.skip = true yield ensure self.skip = original end end unless Deprecate.respond_to?(:skip) def Deprecate.skip @skip ||= false end end unless Deprecate.respond_to?(:skip=) def Deprecate.skip=(skip) @skip = skip end end end bundler-1.16.1/lib/bundler/graph.rb0000644000175000017500000001177713217261023017650 0ustar samuelophsamueloph# frozen_string_literal: true require "set" module Bundler class Graph GRAPH_NAME = :Gemfile def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = []) @env = env @output_file = output_file @show_version = show_version @show_requirements = show_requirements @output_format = output_format @without_groups = without.map(&:to_sym) @groups = [] @relations = Hash.new {|h, k| h[k] = Set.new } @node_options = {} @edge_options = {} _populate_relations end attr_reader :groups, :relations, :node_options, :edge_options, :output_file, :output_format def viz GraphVizClient.new(self).run end private def _populate_relations parent_dependencies = _groups.values.to_set.flatten loop do break if parent_dependencies.empty? tmp = Set.new parent_dependencies.each do |dependency| child_dependencies = spec_for_dependency(dependency).runtime_dependencies.to_set @relations[dependency.name] += child_dependencies.map(&:name).to_set tmp += child_dependencies @node_options[dependency.name] = _make_label(dependency, :node) child_dependencies.each do |c_dependency| @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge) end end parent_dependencies = tmp end end def _groups relations = Hash.new {|h, k| h[k] = Set.new } @env.current_dependencies.each do |dependency| dependency.groups.each do |group| next if @without_groups.include?(group) relations[group.to_s].add(dependency) @relations[group.to_s].add(dependency.name) @node_options[group.to_s] ||= _make_label(group, :node) @edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge) end end @groups = relations.keys relations end def _make_label(symbol_or_string_or_dependency, element_type) case element_type.to_sym when :node if symbol_or_string_or_dependency.is_a?(Gem::Dependency) label = symbol_or_string_or_dependency.name.dup label << "\n#{spec_for_dependency(symbol_or_string_or_dependency).version}" if @show_version else label = symbol_or_string_or_dependency.to_s end when :edge label = nil if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements tmp = symbol_or_string_or_dependency.requirements_list.join(", ") label = tmp if tmp != ">= 0" end else raise ArgumentError, "2nd argument is invalid" end label.nil? ? {} : { :label => label } end def spec_for_dependency(dependency) @env.requested_specs.find {|s| s.name == dependency.name } end class GraphVizClient def initialize(graph_instance) @graph_name = graph_instance.class::GRAPH_NAME @groups = graph_instance.groups @relations = graph_instance.relations @node_options = graph_instance.node_options @edge_options = graph_instance.edge_options @output_file = graph_instance.output_file @output_format = graph_instance.output_format end def g @g ||= ::GraphViz.digraph(@graph_name, :concentrate => true, :normalize => true, :nodesep => 0.55) do |g| g.edge[:weight] = 2 g.edge[:fontname] = g.node[:fontname] = "Arial, Helvetica, SansSerif" g.edge[:fontsize] = 12 end end def run @groups.each do |group| g.add_nodes( group, { :style => "filled", :fillcolor => "#B9B9D5", :shape => "box3d", :fontsize => 16 }.merge(@node_options[group]) ) end @relations.each do |parent, children| children.each do |child| if @groups.include?(parent) g.add_nodes(child, { :style => "filled", :fillcolor => "#B9B9D5" }.merge(@node_options[child])) g.add_edges(parent, child, { :constraint => false }.merge(@edge_options["#{parent}_#{child}"])) else g.add_nodes(child, @node_options[child]) g.add_edges(parent, child, @edge_options["#{parent}_#{child}"]) end end end if @output_format.to_s == "debug" $stdout.puts g.output :none => String Bundler.ui.info "debugging bundle viz..." else begin g.output @output_format.to_sym => "#{@output_file}.#{@output_format}" Bundler.ui.info "#{@output_file}.#{@output_format}" rescue ArgumentError => e $stderr.puts "Unsupported output format. See Ruby-Graphviz/lib/graphviz/constants.rb" raise e end end end end end end bundler-1.16.1/lib/bundler/plugin.rb0000644000175000017500000002137213217261023020035 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/plugin/api" module Bundler module Plugin autoload :DSL, "bundler/plugin/dsl" autoload :Index, "bundler/plugin/index" autoload :Installer, "bundler/plugin/installer" autoload :SourceList, "bundler/plugin/source_list" class MalformattedPlugin < PluginError; end class UndefinedCommandError < PluginError; end class UnknownSourceError < PluginError; end PLUGIN_FILE_NAME = "plugins.rb".freeze module_function def reset! instance_variables.each {|i| remove_instance_variable(i) } @sources = {} @commands = {} @hooks_by_event = Hash.new {|h, k| h[k] = [] } @loaded_plugin_names = [] end reset! # Installs a new plugin by the given name # # @param [Array] names the name of plugin to be installed # @param [Hash] options various parameters as described in description. # Refer to cli/plugin for available options def install(names, options) specs = Installer.new.install(names, options) save_plugins names, specs rescue PluginError => e if specs specs_to_delete = Hash[specs.select {|k, _v| names.include?(k) && !index.commands.values.include?(k) }] specs_to_delete.values.each {|spec| Bundler.rm_rf(spec.full_gem_path) } end Bundler.ui.error "Failed to install plugin #{name}: #{e.message}\n #{e.backtrace.join("\n ")}" end # Evaluates the Gemfile with a limited DSL and installs the plugins # specified by plugin method # # @param [Pathname] gemfile path # @param [Proc] block that can be evaluated for (inline) Gemfile def gemfile_install(gemfile = nil, &inline) builder = DSL.new if block_given? builder.instance_eval(&inline) else builder.eval_gemfile(gemfile) end definition = builder.to_definition(nil, true) return if definition.dependencies.empty? plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p } installed_specs = Installer.new.install_definition(definition) save_plugins plugins, installed_specs, builder.inferred_plugins rescue => e unless e.is_a?(GemfileError) Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}" end raise end # The index object used to store the details about the plugin def index @index ||= Index.new end # The directory root for all plugin related data # # Points to root in app_config_path if ran in an app else points to the one # in user_bundle_path def root @root ||= if SharedHelpers.in_bundle? local_root else global_root end end def local_root Bundler.app_config_path.join("plugin") end # The global directory root for all plugin related data def global_root Bundler.user_bundle_path.join("plugin") end # The cache directory for plugin stuffs def cache @cache ||= root.join("cache") end # To be called via the API to register to handle a command def add_command(command, cls) @commands[command] = cls end # Checks if any plugin handles the command def command?(command) !index.command_plugin(command).nil? end # To be called from Cli class to pass the command and argument to # approriate plugin class def exec_command(command, args) raise UndefinedCommandError, "Command `#{command}` not found" unless command? command load_plugin index.command_plugin(command) unless @commands.key? command @commands[command].new.exec(command, args) end # To be called via the API to register to handle a source plugin def add_source(source, cls) @sources[source] = cls end # Checks if any plugin declares the source def source?(name) !index.source_plugin(name.to_s).nil? end # @return [Class] that handles the source. The calss includes API::Source def source(name) raise UnknownSourceError, "Source #{name} not found" unless source? name load_plugin(index.source_plugin(name)) unless @sources.key? name @sources[name] end # @param [Hash] The options that are present in the lock file # @return [API::Source] the instance of the class that handles the source # type passed in locked_opts def source_from_lock(locked_opts) src = source(locked_opts["type"]) src.new(locked_opts.merge("uri" => locked_opts["remote"])) end # To be called via the API to register a hooks and corresponding block that # will be called to handle the hook def add_hook(event, &block) @hooks_by_event[event.to_s] << block end # Runs all the hooks that are registered for the passed event # # It passes the passed arguments and block to the block registered with # the api. # # @param [String] event def hook(event, *args, &arg_blk) return unless Bundler.feature_flag.plugins? plugins = index.hook_plugins(event) return unless plugins.any? (plugins - @loaded_plugin_names).each {|name| load_plugin(name) } @hooks_by_event[event].each {|blk| blk.call(*args, &arg_blk) } end # currently only intended for specs # # @return [String, nil] installed path def installed?(plugin) Index.new.installed?(plugin) end # Post installation processing and registering with index # # @param [Array] plugins list to be installed # @param [Hash] specs of plugins mapped to installation path (currently they # contain all the installed specs, including plugins) # @param [Array] names of inferred source plugins that can be ignored def save_plugins(plugins, specs, optional_plugins = []) plugins.each do |name| spec = specs[name] validate_plugin! Pathname.new(spec.full_gem_path) installed = register_plugin(name, spec, optional_plugins.include?(name)) Bundler.ui.info "Installed plugin #{name}" if installed end end # Checks if the gem is good to be a plugin # # At present it only checks whether it contains plugins.rb file # # @param [Pathname] plugin_path the path plugin is installed at # @raise [MalformattedPlugin] if plugins.rb file is not found def validate_plugin!(plugin_path) plugin_file = plugin_path.join(PLUGIN_FILE_NAME) raise MalformattedPlugin, "#{PLUGIN_FILE_NAME} was not found in the plugin." unless plugin_file.file? end # Runs the plugins.rb file in an isolated namespace, records the plugin # actions it registers for and then passes the data to index to be stored. # # @param [String] name the name of the plugin # @param [Specification] spec of installed plugin # @param [Boolean] optional_plugin, removed if there is conflict with any # other plugin (used for default source plugins) # # @raise [MalformattedPlugin] if plugins.rb raises any error def register_plugin(name, spec, optional_plugin = false) commands = @commands sources = @sources hooks = @hooks_by_event @commands = {} @sources = {} @hooks_by_event = Hash.new {|h, k| h[k] = [] } load_paths = spec.load_paths add_to_load_path(load_paths) path = Pathname.new spec.full_gem_path begin load path.join(PLUGIN_FILE_NAME), true rescue StandardError => e raise MalformattedPlugin, "#{e.class}: #{e.message}" end if optional_plugin && @sources.keys.any? {|s| source? s } Bundler.rm_rf(path) false else index.register_plugin(name, path.to_s, load_paths, @commands.keys, @sources.keys, @hooks_by_event.keys) true end ensure @commands = commands @sources = sources @hooks_by_event = hooks end # Executes the plugins.rb file # # @param [String] name of the plugin def load_plugin(name) # Need to ensure before this that plugin root where the rest of gems # are installed to be on load path to support plugin deps. Currently not # done to avoid conflicts path = index.plugin_path(name) add_to_load_path(index.load_paths(name)) load path.join(PLUGIN_FILE_NAME) @loaded_plugin_names << name rescue => e Bundler.ui.error "Failed loading plugin #{name}: #{e.message}" raise end def add_to_load_path(load_paths) if insert_index = Bundler.rubygems.load_path_insert_index $LOAD_PATH.insert(insert_index, *load_paths) else $LOAD_PATH.unshift(*load_paths) end end class << self private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!, :add_to_load_path end end end bundler-1.16.1/lib/bundler/vendored_thor.rb0000644000175000017500000000030113217261023021366 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler def self.require_thor_actions Kernel.send(:require, "bundler/vendor/thor/lib/thor/actions") end end require "bundler/vendor/thor/lib/thor" bundler-1.16.1/lib/bundler/uri_credentials_filter.rb0000644000175000017500000000232113217261023023251 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module URICredentialsFilter module_function def credential_filtered_uri(uri_to_anonymize) return uri_to_anonymize if uri_to_anonymize.nil? uri = uri_to_anonymize.dup uri = URI(uri.to_s) unless uri.is_a?(URI) if uri.userinfo # oauth authentication if uri.password == "x-oauth-basic" || uri.password == "x" # URI as string does not display with password if no user is set oauth_designation = uri.password uri.user = oauth_designation end uri.password = nil end return uri if uri_to_anonymize.is_a?(URI) return uri.to_s if uri_to_anonymize.is_a?(String) rescue URI::InvalidURIError # uri is not canonical uri scheme uri end def credential_filtered_string(str_to_filter, uri) return str_to_filter if uri.nil? || str_to_filter.nil? str_with_no_credentials = str_to_filter.dup anonymous_uri_str = credential_filtered_uri(uri).to_s uri_str = uri.to_s if anonymous_uri_str != uri_str str_with_no_credentials = str_with_no_credentials.gsub(uri_str, anonymous_uri_str) end str_with_no_credentials end end end bundler-1.16.1/lib/bundler/stub_specification.rb0000644000175000017500000000543413217261023022415 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/remote_specification" module Bundler class StubSpecification < RemoteSpecification def self.from_stub(stub) return stub if stub.is_a?(Bundler::StubSpecification) spec = new(stub.name, stub.version, stub.platform, nil) spec.stub = stub spec end attr_accessor :stub, :ignored # Pre 2.2.0 did not include extension_dir # https://github.com/rubygems/rubygems/commit/9485ca2d101b82a946d6f327f4bdcdea6d4946ea if Bundler.rubygems.provides?(">= 2.2.0") def source=(source) super # Stub has no concept of source, which means that extension_dir may be wrong # This is the case for git-based gems. So, instead manually assign the extension dir return unless source.respond_to?(:extension_dir_name) path = File.join(stub.extensions_dir, source.extension_dir_name) stub.extension_dir = File.expand_path(path) end end def to_yaml _remote_specification.to_yaml end # @!group Stub Delegates if Bundler.rubygems.provides?(">= 2.3") # This is defined directly to avoid having to load every installed spec def missing_extensions? stub.missing_extensions? end end def activated stub.activated end def activated=(activated) stub.instance_variable_set(:@activated, activated) end def default_gem stub.default_gem end def full_gem_path # deleted gems can have their stubs return nil, so in that case grab the # expired path from the full spec stub.full_gem_path || method_missing(:full_gem_path) end if Bundler.rubygems.provides?(">= 2.2.0") def full_require_paths stub.full_require_paths end # This is what we do in bundler/rubygems_ext # full_require_paths is always implemented in >= 2.2.0 def load_paths full_require_paths end end def loaded_from stub.loaded_from end if Bundler.rubygems.stubs_provide_full_functionality? def matches_for_glob(glob) stub.matches_for_glob(glob) end end def raw_require_paths stub.raw_require_paths end private def _remote_specification @_remote_specification ||= begin rs = stub.to_spec if rs.equal?(self) # happens when to_spec gets the spec from Gem.loaded_specs rs = Gem::Specification.load(loaded_from) Bundler.rubygems.stub_set_spec(stub, rs) end unless rs raise GemspecError, "The gemspec for #{full_name} at #{loaded_from}" \ " was missing or broken. Try running `gem pristine #{name} -v #{version}`" \ " to fix the cached spec." end rs.source = source rs end end end end bundler-1.16.1/lib/bundler/injector.rb0000644000175000017500000000574013217261023020355 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Injector def self.inject(new_deps, options = {}) injector = new(new_deps, options) injector.inject(Bundler.default_gemfile, Bundler.default_lockfile) end def initialize(new_deps, options = {}) @new_deps = new_deps @options = options end def inject(gemfile_path, lockfile_path) if Bundler.frozen? # ensure the lock and Gemfile are synced Bundler.definition.ensure_equivalent_gemfile_and_lockfile(true) end # temporarily unfreeze Bundler.settings.temporary(:deployment => false, :frozen => false) do # evaluate the Gemfile we have now builder = Dsl.new builder.eval_gemfile(gemfile_path) # don't inject any gems that are already in the Gemfile @new_deps -= builder.dependencies # add new deps to the end of the in-memory Gemfile # Set conservative versioning to false because we want to let the resolver resolve the version first builder.eval_gemfile("injected gems", build_gem_lines(false)) if @new_deps.any? # resolve to see if the new deps broke anything @definition = builder.to_definition(lockfile_path, {}) @definition.resolve_remotely! # since nothing broke, we can add those gems to the gemfile append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @new_deps.any? # since we resolved successfully, write out the lockfile @definition.lock(Bundler.default_lockfile) # invalidate the cached Bundler.definition Bundler.reset_paths! # return an array of the deps that we added @new_deps end end private def conservative_version(spec) version = spec.version return ">= 0" if version.nil? segments = version.segments seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2 prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease? "~> #{segments[0..seg_end_index].join(".")}#{prerelease_suffix}" end def build_gem_lines(conservative_versioning) @new_deps.map do |d| name = d.name.dump requirement = if conservative_versioning ", \"#{conservative_version(@definition.specs[d.name][0])}\"" else ", #{d.requirement.as_list.map(&:dump).join(", ")}" end if d.groups != Array(:default) group = d.groups.size == 1 ? ", :group => #{d.groups.inspect}" : ", :groups => #{d.groups.inspect}" end source = ", :source => \"#{d.source}\"" unless d.source.nil? %(gem #{name}#{requirement}#{group}#{source}) end.join("\n") end def append_to(gemfile_path, new_gem_lines) gemfile_path.open("a") do |f| f.puts if @options["timestamp"] || @options["timestamp"].nil? f.puts "# Added at #{Time.now} by #{`whoami`.chomp}:" end f.puts new_gem_lines end end end end bundler-1.16.1/lib/bundler/installer.rb0000644000175000017500000002605713217261023020541 0ustar samuelophsamueloph# frozen_string_literal: true require "erb" require "rubygems/dependency_installer" require "bundler/worker" require "bundler/installer/parallel_installer" require "bundler/installer/standalone" require "bundler/installer/gem_installer" module Bundler class Installer class << self attr_accessor :ambiguous_gems Installer.ambiguous_gems = [] end attr_reader :post_install_messages # Begins the installation process for Bundler. # For more information see the #run method on this class. def self.install(root, definition, options = {}) installer = new(root, definition) Plugin.hook("before-install-all", definition.dependencies) installer.run(options) installer end def initialize(root, definition) @root = root @definition = definition @post_install_messages = {} end # Runs the install procedures for a specific Gemfile. # # Firstly, this method will check to see if `Bundler.bundle_path` exists # and if not then Bundler will create the directory. This is usually the same # location as RubyGems which typically is the `~/.gem` directory # unless other specified. # # Secondly, it checks if Bundler has been configured to be "frozen". # Frozen ensures that the Gemfile and the Gemfile.lock file are matching. # This stops a situation where a developer may update the Gemfile but may not run # `bundle install`, which leads to the Gemfile.lock file not being correctly updated. # If this file is not correctly updated then any other developer running # `bundle install` will potentially not install the correct gems. # # Thirdly, Bundler checks if there are any dependencies specified in the Gemfile. # If there are no dependencies specified then Bundler returns a warning message stating # so and this method returns. # # Fourthly, Bundler checks if the Gemfile.lock exists, and if so # then proceeds to set up a definition based on the Gemfile and the Gemfile.lock. # During this step Bundler will also download information about any new gems # that are not in the Gemfile.lock and resolve any dependencies if needed. # # Fifthly, Bundler resolves the dependencies either through a cache of gems or by remote. # This then leads into the gems being installed, along with stubs for their executables, # but only if the --binstubs option has been passed or Bundler.options[:bin] has been set # earlier. # # Sixthly, a new Gemfile.lock is created from the installed gems to ensure that the next time # that a user runs `bundle install` they will receive any updates from this process. # # Finally, if the user has specified the standalone flag, Bundler will generate the needed # require paths and save them in a `setup.rb` file. See `bundle standalone --help` for more # information. def run(options) create_bundle_path ProcessLock.lock do if Bundler.frozen? @definition.ensure_equivalent_gemfile_and_lockfile(options[:deployment]) end if @definition.dependencies.empty? Bundler.ui.warn "The Gemfile specifies no dependencies" lock return end if resolve_if_needed(options) ensure_specs_are_compatible! warn_on_incompatible_bundler_deps load_plugins options.delete(:jobs) else options[:jobs] = 1 # to avoid the overhead of Bundler::Worker end install(options) lock unless Bundler.frozen? Standalone.new(options[:standalone], @definition).generate if options[:standalone] end end def generate_bundler_executable_stubs(spec, options = {}) if options[:binstubs_cmd] && spec.executables.empty? options = {} spec.runtime_dependencies.each do |dep| bins = @definition.specs[dep].first.executables options[dep.name] = bins unless bins.empty? end if options.any? Bundler.ui.warn "#{spec.name} has no executables, but you may want " \ "one from a gem it depends on." options.each {|name, bins| Bundler.ui.warn " #{name} has: #{bins.join(", ")}" } else Bundler.ui.warn "There are no executables for the gem #{spec.name}." end return end # double-assignment to avoid warnings about variables that will be used by ERB bin_path = Bundler.bin_path bin_path = bin_path relative_gemfile_path = Bundler.default_gemfile.relative_path_from(bin_path) relative_gemfile_path = relative_gemfile_path ruby_command = Thor::Util.ruby_command ruby_command = ruby_command template_path = File.expand_path("../templates/Executable", __FILE__) if spec.name == "bundler" template_path += ".bundler" spec.executables = %(bundle) end template = File.read(template_path) exists = [] spec.executables.each do |executable| binstub_path = "#{bin_path}/#{executable}" if File.exist?(binstub_path) && !options[:force] exists << executable next end File.open(binstub_path, "w", 0o777 & ~File.umask) do |f| f.puts ERB.new(template, nil, "-").result(binding) end end if options[:binstubs_cmd] && exists.any? case exists.size when 1 Bundler.ui.warn "Skipped #{exists[0]} since it already exists." when 2 Bundler.ui.warn "Skipped #{exists.join(" and ")} since they already exist." else items = exists[0...-1].empty? ? nil : exists[0...-1].join(", ") skipped = [items, exists[-1]].compact.join(" and ") Bundler.ui.warn "Skipped #{skipped} since they already exist." end Bundler.ui.warn "If you want to overwrite skipped stubs, use --force." end end def generate_standalone_bundler_executable_stubs(spec) # double-assignment to avoid warnings about variables that will be used by ERB bin_path = Bundler.bin_path unless path = Bundler.settings[:path] raise "Can't standalone without an explicit path set" end standalone_path = Bundler.root.join(path).relative_path_from(bin_path) standalone_path = standalone_path template = File.read(File.expand_path("../templates/Executable.standalone", __FILE__)) ruby_command = Thor::Util.ruby_command ruby_command = ruby_command spec.executables.each do |executable| next if executable == "bundle" executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path) executable_path = executable_path File.open "#{bin_path}/#{executable}", "w", 0o755 do |f| f.puts ERB.new(template, nil, "-").result(binding) end end end private # the order that the resolver provides is significant, since # dependencies might affect the installation of a gem. # that said, it's a rare situation (other than rake), and parallel # installation is SO MUCH FASTER. so we let people opt in. def install(options) force = options["force"] jobs = options.delete(:jobs) do if can_install_in_parallel? [Bundler.settings[:jobs].to_i - 1, 1].max else 1 end end install_in_parallel jobs, options[:standalone], force end def load_plugins Bundler.rubygems.load_plugins requested_path_gems = @definition.requested_specs.select {|s| s.source.is_a?(Source::Path) } path_plugin_files = requested_path_gems.map do |spec| begin Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}") rescue TypeError error_message = "#{spec.name} #{spec.version} has an invalid gemspec" raise Gem::InvalidSpecificationException, error_message end end.flatten Bundler.rubygems.load_plugin_files(path_plugin_files) end def ensure_specs_are_compatible! system_ruby = Bundler::RubyVersion.system rubygems_version = Gem::Version.create(Gem::VERSION) @definition.specs.each do |spec| if required_ruby_version = spec.required_ruby_version unless required_ruby_version.satisfied_by?(system_ruby.gem_version) raise InstallError, "#{spec.full_name} requires ruby version #{required_ruby_version}, " \ "which is incompatible with the current version, #{system_ruby}" end end next unless required_rubygems_version = spec.required_rubygems_version unless required_rubygems_version.satisfied_by?(rubygems_version) raise InstallError, "#{spec.full_name} requires rubygems version #{required_rubygems_version}, " \ "which is incompatible with the current version, #{rubygems_version}" end end end def warn_on_incompatible_bundler_deps bundler_version = Gem::Version.create(Bundler::VERSION) @definition.specs.each do |spec| spec.dependencies.each do |dep| next if dep.type == :development next unless dep.name == "bundler".freeze next if dep.requirement.satisfied_by?(bundler_version) Bundler.ui.warn "#{spec.name} (#{spec.version}) has dependency" \ " #{SharedHelpers.pretty_dependency(dep)}" \ ", which is unsatisfied by the current bundler version #{VERSION}" \ ", so the dependency is being ignored" end end end def can_install_in_parallel? if Bundler.rubygems.provides?(">= 2.1.0") true else Bundler.ui.warn "RubyGems #{Gem::VERSION} is not threadsafe, so your "\ "gems will be installed one at a time. Upgrade to RubyGems 2.1.0 " \ "or higher to enable parallel gem installation." false end end def install_in_parallel(size, standalone, force = false) spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force) spec_installations.each do |installation| post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message? end end def create_bundle_path SharedHelpers.filesystem_access(Bundler.bundle_path.to_s) do |p| Bundler.mkdir_p(p) end unless Bundler.bundle_path.exist? rescue Errno::EEXIST raise PathError, "Could not install to path `#{Bundler.bundle_path}` " \ "because a file already exists at that path. Either remove or rename the file so the directory can be created." end # returns whether or not a re-resolve was needed def resolve_if_needed(options) if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file? return false if @definition.nothing_changed? && !@definition.missing_specs? end options["local"] ? @definition.resolve_with_cache! : @definition.resolve_remotely! true end def lock(opts = {}) @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections]) end end end bundler-1.16.1/lib/bundler/retry.rb0000644000175000017500000000315113217261023017677 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # General purpose class for retrying code that may fail class Retry attr_accessor :name, :total_runs, :current_run class << self def default_attempts default_retries + 1 end alias_method :attempts, :default_attempts def default_retries Bundler.settings[:retry] end end def initialize(name, exceptions = nil, retries = self.class.default_retries) @name = name @retries = retries @exceptions = Array(exceptions) || [] @total_runs = @retries + 1 # will run once, then upto attempts.times end def attempt(&block) @current_run = 0 @failed = false @error = nil run(&block) while keep_trying? @result end alias_method :attempts, :attempt private def run(&block) @failed = false @current_run += 1 @result = block.call rescue => e fail_attempt(e) end def fail_attempt(e) @failed = true if last_attempt? || @exceptions.any? {|k| e.is_a?(k) } Bundler.ui.info "" unless Bundler.ui.debug? raise e end return true unless name Bundler.ui.info "" unless Bundler.ui.debug? # Add new line incase dots preceded this Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug? end def keep_trying? return true if current_run.zero? return false if last_attempt? return true if @failed end def last_attempt? current_run >= total_runs end end end bundler-1.16.1/lib/bundler/source/0000755000175000017500000000000013217261023017505 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/source/rubygems/0000755000175000017500000000000013217261023021342 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/source/rubygems/remote.rb0000644000175000017500000000332513217261023023165 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source class Rubygems class Remote attr_reader :uri, :anonymized_uri, :original_uri def initialize(uri) orig_uri = uri uri = Bundler.settings.mirror_for(uri) @original_uri = orig_uri if orig_uri != uri fallback_auth = Bundler.settings.credentials_for(uri) @uri = apply_auth(uri, fallback_auth).freeze @anonymized_uri = remove_auth(@uri).freeze end # @return [String] A slug suitable for use as a cache key for this # remote. # def cache_slug @cache_slug ||= begin return nil unless SharedHelpers.md5_available? cache_uri = original_uri || uri uri_parts = [cache_uri.host, cache_uri.user, cache_uri.port, cache_uri.path] uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join(".")) uri_parts[-1] = uri_digest uri_parts.compact.join(".") end end def to_s "rubygems remote at #{anonymized_uri}" end private def apply_auth(uri, auth) if auth && uri.userinfo.nil? uri = uri.dup uri.userinfo = auth end uri rescue URI::InvalidComponentError error_message = "Please CGI escape your usernames and passwords before " \ "setting them for authentication." raise HTTPError.new(error_message) end def remove_auth(uri) if uri.userinfo uri = uri.dup uri.user = uri.password = nil end uri end end end end end bundler-1.16.1/lib/bundler/source/git.rb0000644000175000017500000002315713217261023020625 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_fileutils" require "uri" module Bundler class Source class Git < Path autoload :GitProxy, "bundler/source/git/git_proxy" attr_reader :uri, :ref, :branch, :options, :submodules def initialize(options) @options = options @glob = options["glob"] || DEFAULT_GLOB @allow_cached = false @allow_remote = false # Stringify options that could be set as symbols %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] } @uri = options["uri"] || "" @branch = options["branch"] @ref = options["ref"] || options["branch"] || options["tag"] || "master" @submodules = options["submodules"] @name = options["name"] @version = options["version"].to_s.strip.gsub("-", ".pre.") @copied = false @local = false end def self.from_lock(options) new(options.merge("uri" => options.delete("remote"))) end def to_lock out = String.new("GIT\n") out << " remote: #{@uri}\n" out << " revision: #{revision}\n" %w[ref branch tag submodules].each do |opt| out << " #{opt}: #{options[opt]}\n" if options[opt] end out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB out << " specs:\n" end def hash [self.class, uri, ref, branch, name, version, submodules].hash end def eql?(other) other.is_a?(Git) && uri == other.uri && ref == other.ref && branch == other.branch && name == other.name && version == other.version && submodules == other.submodules end alias_method :==, :eql? def to_s at = if local? path elsif user_ref = options["ref"] if ref =~ /\A[a-z0-9]{4,}\z/i shortref_for_display(user_ref) else user_ref end else ref end rev = begin "@#{shortref_for_display(revision)}" rescue GitError nil end "#{uri} (at #{at}#{rev})" end def name File.basename(@uri, ".git") end # This is the path which is going to contain a specific # checkout of the git repository. When using local git # repos, this is set to the local repo. def install_path @install_path ||= begin git_scope = "#{base_name}-#{shortref_for_path(revision)}" path = Bundler.install_path.join(git_scope) if !path.exist? && Bundler.requires_sudo? Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope) else path end end end alias_method :path, :install_path def extension_dir_name "#{base_name}-#{shortref_for_path(revision)}" end def unlock! git_proxy.revision = nil options["revision"] = nil @unlocked = true end def local_override!(path) return false if local? path = Pathname.new(path) path = path.expand_path(Bundler.root) unless path.relative? unless options["branch"] || Bundler.settings[:disable_local_branch_check] raise GitError, "Cannot use local override for #{name} at #{path} because " \ ":branch is not specified in Gemfile. Specify a branch or use " \ "`bundle config --delete` to remove the local override" end unless path.exist? raise GitError, "Cannot use local override for #{name} because #{path} " \ "does not exist. Check `bundle config --delete` to remove the local override" end set_local!(path) # Create a new git proxy without the cached revision # so the Gemfile.lock always picks up the new revision. @git_proxy = GitProxy.new(path, uri, ref) if git_proxy.branch != options["branch"] && !Bundler.settings[:disable_local_branch_check] raise GitError, "Local override for #{name} at #{path} is using branch " \ "#{git_proxy.branch} but Gemfile specifies #{options["branch"]}" end changed = cached_revision && cached_revision != git_proxy.revision if changed && !@unlocked && !git_proxy.contains?(cached_revision) raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(cached_revision)} " \ "but the current branch in your local override for #{name} does not contain such commit. " \ "Please make sure your branch is up to date." end changed end def specs(*) set_local!(app_cache_path) if has_app_cache? && !local? if requires_checkout? && !@copied fetch git_proxy.copy_to(install_path, submodules) serialize_gemspecs_in(install_path) @copied = true end local_specs end def install(spec, options = {}) force = options[:force] print_using_message "Using #{version_message(spec)} from #{self}" if (requires_checkout? && !@copied) || force Bundler.ui.debug " * Checking out revision: #{ref}" git_proxy.copy_to(install_path, submodules) serialize_gemspecs_in(install_path) @copied = true end generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] } generate_bin(spec, generate_bin_options) requires_checkout? ? spec.post_install_message : nil end def cache(spec, custom_path = nil) app_cache_path = app_cache_path(custom_path) return unless Bundler.feature_flag.cache_all? return if path == app_cache_path cached! FileUtils.rm_rf(app_cache_path) git_proxy.checkout if requires_checkout? git_proxy.copy_to(app_cache_path, @submodules) serialize_gemspecs_in(app_cache_path) end def load_spec_files super rescue PathError => e Bundler.ui.trace e raise GitError, "#{self} is not yet checked out. Run `bundle install` first." end # This is the path which is going to contain a cache # of the git repository. When using the same git repository # across different projects, this cache will be shared. # When using local git repos, this is set to the local repo. def cache_path @cache_path ||= begin if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache? Bundler.user_cache else Bundler.bundle_path.join("cache", "bundler") end.join("git", git_scope) end end def app_cache_dirname "#{base_name}-#{shortref_for_path(cached_revision || revision)}" end def revision git_proxy.revision end def allow_git_ops? @allow_remote || @allow_cached end private def serialize_gemspecs_in(destination) destination = destination.expand_path(Bundler.root) if destination.relative? Dir["#{destination}/#{@glob}"].each do |spec_path| # Evaluate gemspecs and cache the result. Gemspecs # in git might require git or other dependencies. # The gemspecs we cache should already be evaluated. spec = Bundler.load_gemspec(spec_path) next unless spec Bundler.rubygems.set_installed_by_version(spec) Bundler.rubygems.validate(spec) File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) } end end def set_local!(path) @local = true @local_specs = @git_proxy = nil @cache_path = @install_path = path end def has_app_cache? cached_revision && super end def local? @local end def requires_checkout? allow_git_ops? && !local? end def base_name File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git") end def shortref_for_display(ref) ref[0..6] end def shortref_for_path(ref) ref[0..11] end def uri_hash if uri =~ %r{^\w+://(\w+@)?} # Downcase the domain component of the URI # and strip off a trailing slash, if one is present input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "") else # If there is no URI scheme, assume it is an ssh/git URI input = uri end SharedHelpers.digest(:SHA1).hexdigest(input) end def cached_revision options["revision"] end def cached? cache_path.exist? end def git_proxy @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision, self) end def fetch git_proxy.checkout rescue GitError => e raise unless Bundler.feature_flag.allow_offline_install? Bundler.ui.warn "Using cached git data because of network errors:\n#{e}" end # no-op, since we validate when re-serializing the gemspec def validate_spec(_spec); end if Bundler.rubygems.stubs_provide_full_functionality? def load_gemspec(file) stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent) stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint StubSpecification.from_stub(stub) end end def git_scope "#{base_name}-#{uri_hash}" end def extension_cache_slug(_) extension_dir_name end end end end bundler-1.16.1/lib/bundler/source/path.rb0000644000175000017500000001647313217261023021001 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source class Path < Source autoload :Installer, "bundler/source/path/installer" attr_reader :path, :options, :root_path, :original_path attr_writer :name attr_accessor :version protected :original_path DEFAULT_GLOB = "{,*,*/*}.gemspec".freeze def initialize(options) @options = options.dup @glob = options["glob"] || DEFAULT_GLOB @allow_cached = false @allow_remote = false @root_path = options["root_path"] || Bundler.root if options["path"] @path = Pathname.new(options["path"]) @path = expand(@path) unless @path.relative? end @name = options["name"] @version = options["version"] # Stores the original path. If at any point we move to the # cached directory, we still have the original path to copy from. @original_path = @path end def remote! @local_specs = nil @allow_remote = true end def cached! @local_specs = nil @allow_cached = true end def self.from_lock(options) new(options.merge("path" => options.delete("remote"))) end def to_lock out = String.new("PATH\n") out << " remote: #{lockfile_path}\n" out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB out << " specs:\n" end def to_s "source at `#{@path}`" end def hash [self.class, expanded_path, version].hash end def eql?(other) return unless other.class == self.class expanded_original_path == other.expanded_original_path && version == other.version end alias_method :==, :eql? def name File.basename(expanded_path.to_s) end def install(spec, options = {}) print_using_message "Using #{version_message(spec)} from #{self}" generate_bin(spec, :disable_extensions => true) nil # no post-install message end def cache(spec, custom_path = nil) app_cache_path = app_cache_path(custom_path) return unless Bundler.feature_flag.cache_all? return if expand(@original_path).to_s.index(root_path.to_s + "/") == 0 unless @original_path.exist? raise GemNotFound, "Can't cache gem #{version_message(spec)} because #{self} is missing!" end FileUtils.rm_rf(app_cache_path) FileUtils.cp_r("#{@original_path}/.", app_cache_path) FileUtils.touch(app_cache_path.join(".bundlecache")) end def local_specs(*) @local_specs ||= load_spec_files end def specs if has_app_cache? @path = app_cache_path @expanded_path = nil # Invalidate end local_specs end def app_cache_dirname name end def root Bundler.root end def expanded_original_path @expanded_original_path ||= expand(original_path) end private def expanded_path @expanded_path ||= expand(path) end def expand(somepath) somepath.expand_path(root_path) rescue ArgumentError => e Bundler.ui.debug(e) raise PathError, "There was an error while trying to use the path " \ "`#{somepath}`.\nThe error message was: #{e.message}." end def lockfile_path return relative_path(original_path) if original_path.absolute? expand(original_path).relative_path_from(Bundler.root) end def app_cache_path(custom_path = nil) @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname) end def has_app_cache? SharedHelpers.in_bundle? && app_cache_path.exist? end def load_gemspec(file) return unless spec = Bundler.load_gemspec(file) Bundler.rubygems.set_installed_by_version(spec) spec end def validate_spec(spec) Bundler.rubygems.validate(spec) end def load_spec_files index = Index.new if File.directory?(expanded_path) # We sort depth-first since `<<` will override the earlier-found specs Dir["#{expanded_path}/#{@glob}"].sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file| next unless spec = load_gemspec(file) spec.source = self # Validation causes extension_dir to be calculated, which depends # on #source, so we validate here instead of load_gemspec validate_spec(spec) index << spec end if index.empty? && @name && @version index << Gem::Specification.new do |s| s.name = @name s.source = self s.version = Gem::Version.new(@version) s.platform = Gem::Platform::RUBY s.summary = "Fake gemspec for #{@name}" s.relative_loaded_from = "#{@name}.gemspec" s.authors = ["no one"] if expanded_path.join("bin").exist? executables = expanded_path.join("bin").children executables.reject! {|p| File.directory?(p) } s.executables = executables.map {|c| c.basename.to_s } end end end else message = String.new("The path `#{expanded_path}` ") message << if File.exist?(expanded_path) "is not a directory." else "does not exist." end raise PathError, message end index end def relative_path(path = self.path) if path.to_s.start_with?(root_path.to_s) return path.relative_path_from(root_path) end path end def generate_bin(spec, options = {}) gem_dir = Pathname.new(spec.full_gem_path) # Some gem authors put absolute paths in their gemspec # and we have to save them from themselves spec.files = spec.files.map do |p| next p unless p =~ /\A#{Pathname::SEPARATOR_PAT}/ next if File.directory?(p) begin Pathname.new(p).relative_path_from(gem_dir).to_s rescue ArgumentError p end end.compact installer = Path::Installer.new( spec, :env_shebang => false, :disable_extensions => options[:disable_extensions], :build_args => options[:build_args], :bundler_extension_cache_path => extension_cache_path(spec) ) installer.post_install rescue Gem::InvalidSpecificationException => e Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \ "This prevents bundler from installing bins or native extensions, but " \ "that may not affect its functionality." if !spec.extensions.empty? && !spec.email.empty? Bundler.ui.warn "If you need to use this package without installing it from a gem " \ "repository, please contact #{spec.email} and ask them " \ "to modify their .gemspec so it can work with `gem build`." end Bundler.ui.warn "The validation message from RubyGems was:\n #{e.message}" end end end end bundler-1.16.1/lib/bundler/source/gemspec.rb0000644000175000017500000000043613217261023021460 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source class Gemspec < Path attr_reader :gemspec def initialize(options) super @gemspec = options["gemspec"] end def as_path_source Path.new(options) end end end end bundler-1.16.1/lib/bundler/source/rubygems.rb0000644000175000017500000004153313217261023021675 0ustar samuelophsamueloph# frozen_string_literal: true require "uri" require "rubygems/user_interaction" module Bundler class Source class Rubygems < Source autoload :Remote, "bundler/source/rubygems/remote" # Use the API when installing less than X gems API_REQUEST_LIMIT = 500 # Ask for X gems per API request API_REQUEST_SIZE = 50 attr_reader :remotes, :caches def initialize(options = {}) @options = options @remotes = [] @dependency_names = [] @allow_remote = false @allow_cached = false @caches = [cache_path, *Bundler.rubygems.gem_cache] Array(options["remotes"] || []).reverse_each {|r| add_remote(r) } end def remote! @specs = nil @allow_remote = true end def cached! @specs = nil @allow_cached = true end def hash @remotes.hash end def eql?(other) other.is_a?(Rubygems) && other.credless_remotes == credless_remotes end alias_method :==, :eql? def include?(o) o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty? end def can_lock?(spec) return super if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? spec.source.is_a?(Rubygems) end def options { "remotes" => @remotes.map(&:to_s) } end def self.from_lock(options) new(options) end def to_lock out = String.new("GEM\n") remotes.reverse_each do |remote| out << " remote: #{suppress_configured_credentials remote}\n" end out << " specs:\n" end def to_s if remotes.empty? "locally installed gems" else remote_names = remotes.map(&:to_s).join(", ") "rubygems repository #{remote_names} or installed locally" end end alias_method :name, :to_s def specs @specs ||= begin # remote_specs usually generates a way larger Index than the other # sources, and large_idx.use small_idx is way faster than # small_idx.use large_idx. idx = @allow_remote ? remote_specs.dup : Index.new idx.use(cached_specs, :override_dupes) if @allow_cached || @allow_remote idx.use(installed_specs, :override_dupes) idx end end def install(spec, opts = {}) force = opts[:force] ensure_builtin_gems_cached = opts[:ensure_builtin_gems_cached] if ensure_builtin_gems_cached && builtin_gem?(spec) if !cached_path(spec) cached_built_in_gem(spec) unless spec.remote force = true else spec.loaded_from = loaded_from(spec) end end if installed?(spec) && !force print_using_message "Using #{version_message(spec)}" return nil # no post-install message end # Download the gem to get the spec, because some specs that are returned # by rubygems.org are broken and wrong. if spec.remote # Check for this spec from other sources uris = [spec.remote.anonymized_uri] uris += remotes_for_spec(spec).map(&:anonymized_uri) uris.uniq! Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1 s = Bundler.rubygems.spec_from_gem(fetch_gem(spec), Bundler.settings["trust-policy"]) spec.__swap__(s) end unless Bundler.settings[:no_install] message = "Installing #{version_message(spec)}" message += " with native extensions" if spec.extensions.any? Bundler.ui.confirm message path = cached_gem(spec) if requires_sudo? install_path = Bundler.tmp(spec.full_name) bin_path = install_path.join("bin") else install_path = rubygems_dir bin_path = Bundler.system_bindir end installed_spec = nil Bundler.rubygems.preserve_paths do installed_spec = Bundler::RubyGemsGemInstaller.at( path, :install_dir => install_path.to_s, :bin_dir => bin_path.to_s, :ignore_dependencies => true, :wrappers => true, :env_shebang => true, :build_args => opts[:build_args], :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum, :bundler_extension_cache_path => extension_cache_path(spec) ).install end spec.full_gem_path = installed_spec.full_gem_path # SUDO HAX if requires_sudo? Bundler.rubygems.repository_subdirectories.each do |name| src = File.join(install_path, name, "*") dst = File.join(rubygems_dir, name) if name == "extensions" && Dir.glob(src).any? src = File.join(src, "*/*") ext_src = Dir.glob(src).first ext_src.gsub!(src[0..-6], "") dst = File.dirname(File.join(dst, ext_src)) end SharedHelpers.filesystem_access(dst) do |p| Bundler.mkdir_p(p) end Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any? end spec.executables.each do |exe| SharedHelpers.filesystem_access(Bundler.system_bindir) do |p| Bundler.mkdir_p(p) end Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/" end end installed_spec.loaded_from = loaded_from(spec) end spec.loaded_from = loaded_from(spec) spec.post_install_message ensure Bundler.rm_rf(install_path) if requires_sudo? end def cache(spec, custom_path = nil) if builtin_gem?(spec) cached_path = cached_built_in_gem(spec) else cached_path = cached_gem(spec) end raise GemNotFound, "Missing gem file '#{spec.full_name}.gem'." unless cached_path return if File.dirname(cached_path) == Bundler.app_cache.to_s Bundler.ui.info " * #{File.basename(cached_path)}" FileUtils.cp(cached_path, Bundler.app_cache(custom_path)) rescue Errno::EACCES => e Bundler.ui.debug(e) raise InstallError, e.message end def cached_built_in_gem(spec) cached_path = cached_path(spec) if cached_path.nil? remote_spec = remote_specs.search(spec).first if remote_spec cached_path = fetch_gem(remote_spec) else Bundler.ui.warn "#{spec.full_name} is built in to Ruby, and can't be cached because your Gemfile doesn't have any sources that contain it." end end cached_path end def add_remote(source) uri = normalize_uri(source) @remotes.unshift(uri) unless @remotes.include?(uri) end def equivalent_remotes?(other_remotes) other_remotes.map(&method(:remove_auth)) == @remotes.map(&method(:remove_auth)) end def replace_remotes(other_remotes, allow_equivalent = false) return false if other_remotes == @remotes equivalent = allow_equivalent && equivalent_remotes?(other_remotes) @remotes = [] other_remotes.reverse_each do |r| add_remote r.to_s end !equivalent end def unmet_deps if @allow_remote && api_fetchers.any? remote_specs.unmet_dependency_names else [] end end def fetchers @fetchers ||= remotes.map do |uri| remote = Source::Rubygems::Remote.new(uri) Bundler::Fetcher.new(remote) end end def double_check_for(unmet_dependency_names) return unless @allow_remote return unless api_fetchers.any? unmet_dependency_names = unmet_dependency_names.call unless unmet_dependency_names.nil? if api_fetchers.size <= 1 # can't do this when there are multiple fetchers because then we might not fetch from _all_ # of them unmet_dependency_names -= remote_specs.spec_names # avoid re-fetching things we've already gotten end return if unmet_dependency_names.empty? end Bundler.ui.debug "Double checking for #{unmet_dependency_names || "all specs (due to the size of the request)"} in #{self}" fetch_names(api_fetchers, unmet_dependency_names, specs, false) end def dependency_names_to_double_check names = [] remote_specs.each do |spec| case spec when EndpointSpecification, Gem::Specification, StubSpecification, LazySpecification names.concat(spec.runtime_dependencies) when RemoteSpecification # from the full index return nil else raise "unhandled spec type (#{spec.inspect})" end end names.map!(&:name) if names names end protected def credless_remotes remotes.map(&method(:suppress_configured_credentials)) end def remotes_for_spec(spec) specs.search_all(spec.name).inject([]) do |uris, s| uris << s.remote if s.remote uris end end def loaded_from(spec) "#{rubygems_dir}/specifications/#{spec.full_name}.gemspec" end def cached_gem(spec) cached_gem = cached_path(spec) unless cached_gem raise Bundler::GemNotFound, "Could not find #{spec.file_name} for installation" end cached_gem end def cached_path(spec) possibilities = @caches.map {|p| "#{p}/#{spec.file_name}" } possibilities.find {|p| File.exist?(p) } end def normalize_uri(uri) uri = uri.to_s uri = "#{uri}/" unless uri =~ %r{/$} uri = URI(uri) raise ArgumentError, "The source must be an absolute URI. For example:\n" \ "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(URI::HTTP) && uri.host.nil?) uri end def suppress_configured_credentials(remote) remote_nouser = remove_auth(remote) if remote.userinfo && remote.userinfo == Bundler.settings[remote_nouser] remote_nouser else remote end end def remove_auth(remote) remote.dup.tap {|uri| uri.user = uri.password = nil }.to_s end def installed_specs @installed_specs ||= Index.build do |idx| Bundler.rubygems.all_specs.reverse_each do |spec| next if spec.name == "bundler" spec.source = self if Bundler.rubygems.spec_missing_extensions?(spec, false) Bundler.ui.debug "Source #{self} is ignoring #{spec} because it is missing extensions" next end idx << spec end end end def cached_specs @cached_specs ||= begin idx = installed_specs.dup Dir["#{cache_path}/*.gem"].each do |gemfile| next if gemfile =~ /^bundler\-[\d\.]+?\.gem/ s ||= Bundler.rubygems.spec_from_gem(gemfile) s.source = self if Bundler.rubygems.spec_missing_extensions?(s, false) Bundler.ui.debug "Source #{self} is ignoring #{s} because it is missing extensions" next end idx << s end idx end end def api_fetchers fetchers.select {|f| f.use_api && f.fetchers.first.api_fetcher? } end def remote_specs @remote_specs ||= Index.build do |idx| index_fetchers = fetchers - api_fetchers # gather lists from non-api sites fetch_names(index_fetchers, nil, idx, false) # because ensuring we have all the gems we need involves downloading # the gemspecs of those gems, if the non-api sites contain more than # about 500 gems, we treat all sites as non-api for speed. allow_api = idx.size < API_REQUEST_LIMIT && dependency_names.size < API_REQUEST_LIMIT Bundler.ui.debug "Need to query more than #{API_REQUEST_LIMIT} gems." \ " Downloading full index instead..." unless allow_api fetch_names(api_fetchers, allow_api && dependency_names, idx, false) end end def fetch_names(fetchers, dependency_names, index, override_dupes) fetchers.each do |f| if dependency_names Bundler.ui.info "Fetching gem metadata from #{f.uri}", Bundler.ui.debug? index.use f.specs_with_retry(dependency_names, self), override_dupes Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over else Bundler.ui.info "Fetching source index from #{f.uri}" index.use f.specs_with_retry(nil, self), override_dupes end end end def fetch_gem(spec) return false unless spec.remote spec.fetch_platform download_path = requires_sudo? ? Bundler.tmp(spec.full_name) : rubygems_dir gem_path = "#{rubygems_dir}/cache/#{spec.full_name}.gem" SharedHelpers.filesystem_access("#{download_path}/cache") do |p| FileUtils.mkdir_p(p) end download_gem(spec, download_path) if requires_sudo? SharedHelpers.filesystem_access("#{rubygems_dir}/cache") do |p| Bundler.mkdir_p(p) end Bundler.sudo "mv #{download_path}/cache/#{spec.full_name}.gem #{gem_path}" end gem_path ensure Bundler.rm_rf(download_path) if requires_sudo? end def builtin_gem?(spec) # Ruby 2.1, where all included gems have this summary return true if spec.summary =~ /is bundled with Ruby/ # Ruby 2.0, where gemspecs are stored in specifications/default/ spec.loaded_from && spec.loaded_from.include?("specifications/default/") end def installed?(spec) installed_specs[spec].any? end def requires_sudo? Bundler.requires_sudo? end def rubygems_dir Bundler.rubygems.gem_dir end def cache_path Bundler.app_cache end private # Checks if the requested spec exists in the global cache. If it does, # we copy it to the download path, and if it does not, we download it. # # @param [Specification] spec # the spec we want to download or retrieve from the cache. # # @param [String] download_path # the local directory the .gem will end up in. # def download_gem(spec, download_path) local_path = File.join(download_path, "cache/#{spec.full_name}.gem") if (cache_path = download_cache_path(spec)) && cache_path.file? SharedHelpers.filesystem_access(local_path) do FileUtils.cp(cache_path, local_path) end else uri = spec.remote.uri Bundler.ui.confirm("Fetching #{version_message(spec)}") Bundler.rubygems.download_gem(spec, uri, download_path) cache_globally(spec, local_path) end end # Checks if the requested spec exists in the global cache. If it does # not, we create the relevant global cache subdirectory if it does not # exist and copy the spec from the local cache to the global cache. # # @param [Specification] spec # the spec we want to copy to the global cache. # # @param [String] local_cache_path # the local directory from which we want to copy the .gem. # def cache_globally(spec, local_cache_path) return unless cache_path = download_cache_path(spec) return if cache_path.exist? SharedHelpers.filesystem_access(cache_path.dirname, &:mkpath) SharedHelpers.filesystem_access(cache_path) do FileUtils.cp(local_cache_path, cache_path) end end # Returns the global cache path of the calling Rubygems::Source object. # # Note that the Source determines the path's subdirectory. We use this # subdirectory in the global cache path so that gems with the same name # -- and possibly different versions -- from different sources are saved # to their respective subdirectories and do not override one another. # # @param [Gem::Specification] specification # # @return [Pathname] The global cache path. # def download_cache_path(spec) return unless Bundler.feature_flag.global_gem_cache? return unless remote = spec.remote return unless cache_slug = remote.cache_slug Bundler.user_cache.join("gems", cache_slug, spec.file_name) end def extension_cache_slug(spec) return unless remote = spec.remote remote.cache_slug end end end end bundler-1.16.1/lib/bundler/source/git/0000755000175000017500000000000013217261023020270 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/source/git/git_proxy.rb0000644000175000017500000002205213217261023022642 0ustar samuelophsamueloph# frozen_string_literal: true require "shellwords" require "tempfile" module Bundler class Source class Git class GitNotInstalledError < GitError def initialize msg = String.new msg << "You need to install git to be able to use gems from git repositories. " msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git" super msg end end class GitNotAllowedError < GitError def initialize(command) msg = String.new msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, " msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues " msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}" super msg end end class GitCommandError < GitError def initialize(command, path = nil, extra_info = nil) msg = String.new msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed." msg << "\n#{extra_info}" if extra_info msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist? super msg end end class MissingGitRevisionError < GitError def initialize(ref, repo) msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?" super msg end end # The GitProxy is responsible to interact with git repositories. # All actions required by the Git source is encapsulated in this # object. class GitProxy attr_accessor :path, :uri, :ref attr_writer :revision def initialize(path, uri, ref, revision = nil, git = nil) @path = path @uri = uri @ref = ref @revision = revision @git = git raise GitNotInstalledError.new if allow? && !Bundler.git_present? end def revision return @revision if @revision begin @revision ||= find_local_revision rescue GitCommandError raise MissingGitRevisionError.new(ref, URICredentialsFilter.credential_filtered_uri(uri)) end @revision end def branch @branch ||= allowed_in_path do git("rev-parse --abbrev-ref HEAD").strip end end def contains?(commit) allowed_in_path do result = git_null("branch --contains #{commit}") $? == 0 && result =~ /^\* (.*)$/ end end def version git("--version").match(/(git version\s*)?((\.?\d+)+).*/)[2] end def full_version git("--version").sub("git version", "").strip end def checkout return if path.exist? && has_revision_cached? extra_ref = "#{Shellwords.shellescape(ref)}:#{Shellwords.shellescape(ref)}" if ref && ref.start_with?("refs/") Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}" unless path.exist? SharedHelpers.filesystem_access(path.dirname) do |p| FileUtils.mkdir_p(p) end git_retry %(clone #{uri_escaped_with_configured_credentials} "#{path}" --bare --no-hardlinks --quiet) return unless extra_ref end in_path do git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref}) end end def copy_to(destination, submodules = false) # method 1 unless File.exist?(destination.join(".git")) begin SharedHelpers.filesystem_access(destination.dirname) do |p| FileUtils.mkdir_p(p) end SharedHelpers.filesystem_access(destination) do |p| FileUtils.rm_rf(p) end git_retry %(clone --no-checkout --quiet "#{path}" "#{destination}") File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination) rescue Errno::EEXIST => e file_path = e.message[%r{.*?(/.*)}, 1] raise GitError, "Bundler could not install a gem because it needs to " \ "create a directory, but a file exists - #{file_path}. Please delete " \ "this file and try again." end end # method 2 SharedHelpers.chdir(destination) do git_retry %(fetch --force --quiet --tags "#{path}") git "reset --hard #{@revision}" if submodules git_retry "submodule update --init --recursive" elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0") git_retry "submodule deinit --all --force" end end end private # TODO: Do not rely on /dev/null. # Given that open3 is not cross platform until Ruby 1.9.3, # the best solution is to pipe to /dev/null if it exists. # If it doesn't, everything will work fine, but the user # will get the $stderr messages as well. def git_null(command) git("#{command} 2>#{Bundler::NULL}", false) end def git_retry(command) Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do git(command) end end def git(command, check_errors = true, error_msg = nil) command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri) raise GitNotAllowedError.new(command_with_no_credentials) unless allow? out = SharedHelpers.with_clean_git_env do capture_and_filter_stderr(uri) { `git #{command}` } end stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri) raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success? stdout_with_no_credentials end def has_revision_cached? return unless @revision in_path { git("cat-file -e #{@revision}") } true rescue GitError false end def remove_cache FileUtils.rm_rf(path) end def find_local_revision allowed_in_path do git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip end end # Escape the URI for git commands def uri_escaped_with_configured_credentials remote = configured_uri_for(uri) if Bundler::WINDOWS # Windows quoting requires double quotes only, with double quotes # inside the string escaped by being doubled. '"' + remote.gsub('"') { '""' } + '"' else # Bash requires single quoted strings, with the single quotes escaped # by ending the string, escaping the quote, and restarting the string. "'" + remote.gsub("'") { "'\\''" } + "'" end end # Adds credentials to the URI as Fetcher#configured_uri_for does def configured_uri_for(uri) if /https?:/ =~ uri remote = URI(uri) config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host] remote.userinfo ||= config_auth remote.to_s else uri end end def allow? @git ? @git.allow_git_ops? : true end def in_path(&blk) checkout unless path.exist? _ = URICredentialsFilter # load it before we chdir SharedHelpers.chdir(path, &blk) end def allowed_in_path return in_path { yield } if allow? raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application" end # TODO: Replace this with Open3 when upgrading to bundler 2 # Similar to #git_null, as Open3 is not cross-platform, # a temporary way is to use Tempfile to capture the stderr. # When replacing this using Open3, make sure git_null is # also replaced by Open3, so stdout and stderr all got handled properly. def capture_and_filter_stderr(uri) return_value, captured_err = "" backup_stderr = STDERR.dup begin Tempfile.open("captured_stderr") do |f| STDERR.reopen(f) return_value = yield f.rewind captured_err = f.read end ensure STDERR.reopen backup_stderr end $stderr.puts URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty? return_value end end end end end bundler-1.16.1/lib/bundler/source/path/0000755000175000017500000000000013217261023020441 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/source/path/installer.rb0000644000175000017500000000424513217261023022770 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source class Path class Installer < Bundler::RubyGemsGemInstaller attr_reader :spec def initialize(spec, options = {}) @options = options @spec = spec @gem_dir = Bundler.rubygems.path(spec.full_gem_path) @wrappers = true @env_shebang = true @format_executable = options[:format_executable] || false @build_args = options[:build_args] || Bundler.rubygems.build_args @gem_bin_dir = "#{Bundler.rubygems.gem_dir}/bin" @disable_extensions = options[:disable_extensions] if Bundler.requires_sudo? @tmp_dir = Bundler.tmp(spec.full_name).to_s @bin_dir = "#{@tmp_dir}/bin" else @bin_dir = @gem_bin_dir end end def post_install SharedHelpers.chdir(@gem_dir) do run_hooks(:pre_install) unless @disable_extensions build_extensions run_hooks(:post_build) end generate_bin unless spec.executables.nil? || spec.executables.empty? run_hooks(:post_install) end ensure Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo? end private def generate_bin super if Bundler.requires_sudo? SharedHelpers.filesystem_access(@gem_bin_dir) do |p| Bundler.mkdir_p(p) end spec.executables.each do |exe| Bundler.sudo "cp -R #{@bin_dir}/#{exe} #{@gem_bin_dir}" end end end def run_hooks(type) hooks_meth = "#{type}_hooks" return unless Gem.respond_to?(hooks_meth) Gem.send(hooks_meth).each do |hook| result = hook.call(self) next unless result == false location = " at #{$1}" if hook.inspect =~ /@(.*:\d+)/ message = "#{type} hook#{location} failed for #{spec.full_name}" raise InstallHookError, message end end end end end end bundler-1.16.1/lib/bundler/source/metadata.rb0000644000175000017500000000321313217261023021611 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source class Metadata < Source def specs @specs ||= Index.build do |idx| idx << Gem::Specification.new("ruby\0", RubyVersion.system.to_gem_version_with_patchlevel) idx << Gem::Specification.new("rubygems\0", Gem::VERSION) idx << Gem::Specification.new do |s| s.name = "bundler" s.version = VERSION s.platform = Gem::Platform::RUBY s.source = self s.authors = ["bundler team"] s.bindir = "exe" s.executables = %w[bundle] # can't point to the actual gemspec or else the require paths will be wrong s.loaded_from = File.expand_path("..", __FILE__) end if loaded_spec = nil && Bundler.rubygems.loaded_specs("bundler") idx << loaded_spec # this has to come after the fake gemspec, to override it elsif local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION } idx << local_spec end idx.each {|s| s.source = self } end end def cached!; end def remote!; end def options {} end def install(spec, _opts = {}) print_using_message "Using #{version_message(spec)}" nil end def to_s "the local ruby installation" end def ==(other) self.class == other.class end alias_method :eql?, :== def hash self.class.hash end def version_message(spec) "#{spec.name} #{spec.version}" end end end end bundler-1.16.1/lib/bundler/current_ruby.rb0000644000175000017500000000403713217261023021261 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # Returns current version of Ruby # # @return [CurrentRuby] Current version of Ruby def self.current_ruby @current_ruby ||= CurrentRuby.new end class CurrentRuby KNOWN_MINOR_VERSIONS = %w[ 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 ].freeze KNOWN_MAJOR_VERSIONS = KNOWN_MINOR_VERSIONS.map {|v| v.split(".", 2).first }.uniq.freeze KNOWN_PLATFORMS = %w[ jruby maglev mingw mri mswin mswin64 rbx ruby x64_mingw ].freeze def ruby? !mswin? && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby" || RUBY_ENGINE == "rbx" || RUBY_ENGINE == "maglev") end def mri? !mswin? && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby") end def rbx? ruby? && defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" end def jruby? defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" end def maglev? defined?(RUBY_ENGINE) && RUBY_ENGINE == "maglev" end def mswin? Bundler::WINDOWS end def mswin64? Bundler::WINDOWS && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mswin64" && Bundler.local_platform.cpu == "x64" end def mingw? Bundler::WINDOWS && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mingw32" && Bundler.local_platform.cpu != "x64" end def x64_mingw? Bundler::WINDOWS && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mingw32" && Bundler.local_platform.cpu == "x64" end (KNOWN_MINOR_VERSIONS + KNOWN_MAJOR_VERSIONS).each do |version| trimmed_version = version.tr(".", "") define_method(:"on_#{trimmed_version}?") do RUBY_VERSION.start_with?("#{version}.") end KNOWN_PLATFORMS.each do |platform| define_method(:"#{platform}_#{trimmed_version}?") do send(:"#{platform}?") && send(:"on_#{trimmed_version}?") end end end end end bundler-1.16.1/lib/bundler/match_platform.rb0000644000175000017500000000122313217261023021530 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/gem_helpers" module Bundler module MatchPlatform include GemHelpers def match_platform(p) MatchPlatform.platforms_match?(platform, p) end def self.platforms_match?(gemspec_platform, local_platform) return true if gemspec_platform.nil? return true if Gem::Platform::RUBY == gemspec_platform return true if local_platform == gemspec_platform gemspec_platform = Gem::Platform.new(gemspec_platform) return true if GemHelpers.generic(gemspec_platform) === local_platform return true if gemspec_platform === local_platform false end end end bundler-1.16.1/lib/bundler/vlad.rb0000644000175000017500000000072213217261023017461 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/shared_helpers" Bundler::SharedHelpers.major_deprecation 2, "The Bundler task for Vlad" # Vlad task for Bundler. # # Add "require 'bundler/vlad'" in your Vlad deploy.rb, and # include the vlad:bundle:install task in your vlad:deploy task. require "bundler/deployment" include Rake::DSL if defined? Rake::DSL namespace :vlad do Bundler::Deployment.define_task(Rake::RemoteTask, :remote_task, :roles => :app) end bundler-1.16.1/lib/bundler/templates/0000755000175000017500000000000013217261023020203 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/Executable0000755000175000017500000000162113217261023022212 0ustar samuelophsamueloph#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # frozen_string_literal: true # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../<%= relative_gemfile_path %>", Pathname.new(__FILE__).realpath) bundle_binstub = File.expand_path("../bundle", __FILE__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("<%= spec.name %>", "<%= executable %>") bundler-1.16.1/lib/bundler/templates/Gemfile0000644000175000017500000000022213217261023021472 0ustar samuelophsamueloph# frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails" bundler-1.16.1/lib/bundler/templates/Executable.bundler0000644000175000017500000000562013217261023023644 0ustar samuelophsamueloph#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # frozen_string_literal: true # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # require "rubygems" m = Module.new do module_function def invoked_as_script? File.expand_path($0) == File.expand_path(__FILE__) end def env_var_version ENV["BUNDLER_VERSION"] end def cli_arg_version return unless invoked_as_script? # don't want to hijack other binstubs return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` bundler_version = nil update_index = nil ARGV.each_with_index do |a, i| if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN bundler_version = a end next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ bundler_version = $1 || ">= 0.a" update_index = i end bundler_version end def gemfile gemfile = ENV["BUNDLE_GEMFILE"] return gemfile if gemfile && !gemfile.empty? File.expand_path("../<%= relative_gemfile_path %>", __FILE__) end def lockfile lockfile = case File.basename(gemfile) when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) else "#{gemfile}.lock" end File.expand_path(lockfile) end def lockfile_version return unless File.file?(lockfile) lockfile_contents = File.read(lockfile) return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ Regexp.last_match(1) end def bundler_version @bundler_version ||= begin env_var_version || cli_arg_version || lockfile_version || "#{Gem::Requirement.default}.a" end end def load_bundler! ENV["BUNDLE_GEMFILE"] ||= gemfile # must dup string for RG < 1.8 compatibility activate_bundler(bundler_version.dup) end def activate_bundler(bundler_version) if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0") bundler_version = "< 2" end gem_error = activation_error_handling do gem "bundler", bundler_version end return if gem_error.nil? require_error = activation_error_handling do require "bundler/version" end return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION)) warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`" exit 42 end def activation_error_handling yield nil rescue StandardError, LoadError => e e end end m.load_bundler! if m.invoked_as_script? load Gem.bin_path("<%= spec.name %>", "<%= executable %>") end bundler-1.16.1/lib/bundler/templates/.document0000644000175000017500000000004513217261023022021 0ustar samuelophsamueloph# Ignore all files in this directory bundler-1.16.1/lib/bundler/templates/gems.rb0000644000175000017500000000024513217261023021464 0ustar samuelophsamueloph# frozen_string_literal: true # A sample gems.rb source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails" bundler-1.16.1/lib/bundler/templates/Executable.standalone0000644000175000017500000000072013217261023024335 0ustar samuelophsamueloph#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" path = Pathname.new(__FILE__) $:.unshift File.expand_path "../<%= standalone_path %>", path.realpath require "bundler/setup" load File.expand_path "../<%= executable_path %>", path.realpath bundler-1.16.1/lib/bundler/templates/newgem/0000755000175000017500000000000013217261023021465 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/bin/0000755000175000017500000000000013217261023022235 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/bin/console.tt0000644000175000017500000000055613217261023024256 0ustar samuelophsamueloph#!/usr/bin/env ruby require "bundler/setup" require "<%= config[:namespaced_path] %>" # You can add fixtures and/or initialization code here to make experimenting # with your gem easier. You can also use a different console, if you like. # (If you use this, don't forget to add pry to your Gemfile!) # require "pry" # Pry.start require "irb" IRB.start(__FILE__) bundler-1.16.1/lib/bundler/templates/newgem/bin/setup.tt0000644000175000017500000000020313217261023023741 0ustar samuelophsamueloph#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' set -vx bundle install # Do any other automated setup that you need to do here bundler-1.16.1/lib/bundler/templates/newgem/spec/0000755000175000017500000000000013217261023022417 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/spec/spec_helper.rb.tt0000644000175000017500000000060313217261023025662 0ustar samuelophsamuelophrequire "bundler/setup" require "<%= config[:namespaced_path] %>" RSpec.configure do |config| # Enable flags like --only-failures and --next-failure config.example_status_persistence_file_path = ".rspec_status" # Disable RSpec exposing methods globally on `Module` and `main` config.disable_monkey_patching! config.expect_with :rspec do |c| c.syntax = :expect end end bundler-1.16.1/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt0000644000175000017500000000033713217261023025671 0ustar samuelophsamuelophRSpec.describe <%= config[:constant_name] %> do it "has a version number" do expect(<%= config[:constant_name] %>::VERSION).not_to be nil end it "does something useful" do expect(false).to eq(true) end end bundler-1.16.1/lib/bundler/templates/newgem/rspec.tt0000644000175000017500000000006513217261023023153 0ustar samuelophsamueloph--format documentation --color --require spec_helper bundler-1.16.1/lib/bundler/templates/newgem/README.md.tt0000644000175000017500000000431713217261023023377 0ustar samuelophsamueloph# <%= config[:constant_name] %> Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/<%= config[:namespaced_path] %>`. To experiment with that code, run `bin/console` for an interactive prompt. TODO: Delete this and the text above, and describe your gem ## Installation Add this line to your application's Gemfile: ```ruby gem '<%= config[:name] %>' ``` And then execute: $ bundle Or install it yourself as: $ gem install <%= config[:name] %> ## Usage TODO: Write usage instructions here ## Development After checking out the repo, run `bin/setup` to install dependencies.<% if config[:test] %> Then, run `rake <%= config[:test].sub('mini', '').sub('rspec', 'spec') %>` to run the tests.<% end %> You can also run `bin/console` for an interactive prompt that will allow you to experiment.<% if config[:bin] %> Run `bundle exec <%= config[:name] %>` to use the gem in this directory, ignoring other installed copies of this gem.<% end %> To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/<%= config[:github_username] %>/<%= config[:name] %>.<% if config[:coc] %> This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.<% end %> <% if config[:mit] -%> ## License The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). <% end -%> <% if config[:coc] -%> ## Code of Conduct Everyone interacting in the <%= config[:constant_name] %> project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/<%= config[:github_username] %>/<%= config[:name] %>/blob/master/CODE_OF_CONDUCT.md). <% end -%> bundler-1.16.1/lib/bundler/templates/newgem/newgem.gemspec.tt0000644000175000017500000000360013217261023024741 0ustar samuelophsamueloph<%- if RUBY_VERSION < "2.0.0" -%> # coding: utf-8 <%- end -%> lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "<%= config[:namespaced_path] %>/version" Gem::Specification.new do |spec| spec.name = <%= config[:name].inspect %> spec.version = <%= config[:constant_name] %>::VERSION spec.authors = [<%= config[:author].inspect %>] spec.email = [<%= config[:email].inspect %>] spec.summary = %q{TODO: Write a short summary, because RubyGems requires one.} spec.description = %q{TODO: Write a longer description or delete this line.} spec.homepage = "TODO: Put your gem's website or public repo URL here." <%- if config[:mit] -%> spec.license = "MIT" <%- end -%> # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' # to allow pushing to a single host or delete this section to allow pushing to any host. if spec.respond_to?(:metadata) spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'" else raise "RubyGems 2.0 or newer is required to protect against " \ "public gem pushes." end spec.files = `git ls-files -z`.split("\x0").reject do |f| f.match(%r{^(test|spec|features)/}) end spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] <%- if config[:ext] -%> spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"] <%- end -%> spec.add_development_dependency "bundler", "~> <%= config[:bundler_version] %>" spec.add_development_dependency "rake", "~> 10.0" <%- if config[:ext] -%> spec.add_development_dependency "rake-compiler" <%- end -%> <%- if config[:test] -%> spec.add_development_dependency "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>" <%- end -%> end bundler-1.16.1/lib/bundler/templates/newgem/travis.yml.tt0000644000175000017500000000016713217261023024152 0ustar samuelophsamuelophsudo: false language: ruby rvm: - <%= RUBY_VERSION %> before_install: gem install bundler -v <%= Bundler::VERSION %> bundler-1.16.1/lib/bundler/templates/newgem/LICENSE.txt.tt0000644000175000017500000000212113217261023023732 0ustar samuelophsamuelophThe MIT License (MIT) Copyright (c) <%= Time.now.year %> <%= config[:author] %> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. bundler-1.16.1/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt0000644000175000017500000000623513217261023024720 0ustar samuelophsamueloph# 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 <%= config[:email] %>. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and 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 [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ bundler-1.16.1/lib/bundler/templates/newgem/Rakefile.tt0000644000175000017500000000123313217261023023557 0ustar samuelophsamuelophrequire "bundler/gem_tasks" <% if config[:test] == "minitest" -%> require "rake/testtask" Rake::TestTask.new(:test) do |t| t.libs << "test" t.libs << "lib" t.test_files = FileList["test/**/*_test.rb"] end <% elsif config[:test] == "rspec" -%> require "rspec/core/rake_task" RSpec::Core::RakeTask.new(:spec) <% end -%> <% if config[:ext] -%> require "rake/extensiontask" task :build => :compile Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext| ext.lib_dir = "lib/<%= config[:namespaced_path] %>" end task :default => [:clobber, :compile, :<%= config[:test_task] %>] <% else -%> task :default => :<%= config[:test_task] %> <% end -%> bundler-1.16.1/lib/bundler/templates/newgem/Gemfile.tt0000644000175000017500000000025713217261023023412 0ustar samuelophsamuelophsource "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # Specify your gem's dependencies in <%= config[:name] %>.gemspec gemspec bundler-1.16.1/lib/bundler/templates/newgem/test/0000755000175000017500000000000013217261023022444 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/test/newgem_test.rb.tt0000644000175000017500000000036613217261023025745 0ustar samuelophsamuelophrequire "test_helper" class <%= config[:constant_name] %>Test < Minitest::Test def test_that_it_has_a_version_number refute_nil ::<%= config[:constant_name] %>::VERSION end def test_it_does_something_useful assert false end end bundler-1.16.1/lib/bundler/templates/newgem/test/test_helper.rb.tt0000644000175000017500000000020113217261023025726 0ustar samuelophsamueloph$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__) require "<%= config[:namespaced_path] %>" require "minitest/autorun" bundler-1.16.1/lib/bundler/templates/newgem/ext/0000755000175000017500000000000013217261023022265 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/ext/newgem/0000755000175000017500000000000013217261023023547 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt0000644000175000017500000000037113217261023025624 0ustar samuelophsamueloph#include "<%= config[:underscored_name] %>.h" VALUE rb_m<%= config[:constant_array].join %>; void Init_<%= config[:underscored_name] %>(void) { rb_m<%= config[:constant_array].join %> = rb_define_module(<%= config[:constant_name].inspect %>); } bundler-1.16.1/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt0000644000175000017500000000010713217261023026166 0ustar samuelophsamuelophrequire "mkmf" create_makefile(<%= config[:makefile_path].inspect %>) bundler-1.16.1/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt0000644000175000017500000000026113217261023025627 0ustar samuelophsamueloph#ifndef <%= config[:underscored_name].upcase %>_H #define <%= config[:underscored_name].upcase %>_H 1 #include "ruby.h" #endif /* <%= config[:underscored_name].upcase %>_H */ bundler-1.16.1/lib/bundler/templates/newgem/exe/0000755000175000017500000000000013217261023022246 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/exe/newgem.tt0000644000175000017500000000007713217261023024105 0ustar samuelophsamueloph#!/usr/bin/env ruby require "<%= config[:namespaced_path] %>" bundler-1.16.1/lib/bundler/templates/newgem/gitignore.tt0000644000175000017500000000034413217261023024026 0ustar samuelophsamueloph/.bundle/ /.yardoc /_yardoc/ /coverage/ /doc/ /pkg/ /spec/reports/ /tmp/ <%- if config[:ext] -%> *.bundle *.so *.o *.a mkmf.log <%- end -%> <%- if config[:test] == "rspec" -%> # rspec failure tracking .rspec_status <%- end -%> bundler-1.16.1/lib/bundler/templates/newgem/lib/0000755000175000017500000000000013217261023022233 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/lib/newgem.rb.tt0000644000175000017500000000064313217261023024473 0ustar samuelophsamuelophrequire "<%= config[:namespaced_path] %>/version" <%- if config[:ext] -%> require "<%= config[:namespaced_path] %>/<%= config[:underscored_name] %>" <%- end -%> <%- config[:constant_array].each_with_index do |c, i| -%> <%= " " * i %>module <%= c %> <%- end -%> <%= " " * config[:constant_array].size %># Your code goes here... <%- (config[:constant_array].size-1).downto(0) do |i| -%> <%= " " * i %>end <%- end -%> bundler-1.16.1/lib/bundler/templates/newgem/lib/newgem/0000755000175000017500000000000013217261023023515 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/templates/newgem/lib/newgem/version.rb.tt0000644000175000017500000000037213217261023026157 0ustar samuelophsamueloph<%- config[:constant_array].each_with_index do |c, i| -%> <%= " " * i %>module <%= c %> <%- end -%> <%= " " * config[:constant_array].size %>VERSION = "0.1.0" <%- (config[:constant_array].size-1).downto(0) do |i| -%> <%= " " * i %>end <%- end -%> bundler-1.16.1/lib/bundler/source.rb0000644000175000017500000000523713217261023020041 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Source autoload :Gemspec, "bundler/source/gemspec" autoload :Git, "bundler/source/git" autoload :Metadata, "bundler/source/metadata" autoload :Path, "bundler/source/path" autoload :Rubygems, "bundler/source/rubygems" attr_accessor :dependency_names def unmet_deps specs.unmet_dependency_names end def version_message(spec) message = "#{spec.name} #{spec.version}" message += " (#{spec.platform})" if spec.platform != Gem::Platform::RUBY && !spec.platform.nil? if Bundler.locked_gems locked_spec = Bundler.locked_gems.specs.find {|s| s.name == spec.name } locked_spec_version = locked_spec.version if locked_spec if locked_spec_version && spec.version != locked_spec_version message += Bundler.ui.add_color(" (was #{locked_spec_version})", version_color(spec.version, locked_spec_version)) end end message end def can_lock?(spec) spec.source == self end # it's possible that gems from one source depend on gems from some # other source, so now we download gemspecs and iterate over those # dependencies, looking for gems we don't have info on yet. def double_check_for(*); end def dependency_names_to_double_check specs.dependency_names end def include?(other) other == self end def inspect "#<#{self.class}:0x#{object_id} #{self}>" end def path? instance_of?(Bundler::Source::Path) end private def version_color(spec_version, locked_spec_version) if Gem::Version.correct?(spec_version) && Gem::Version.correct?(locked_spec_version) # display yellow if there appears to be a regression earlier_version?(spec_version, locked_spec_version) ? :yellow : :green else # default to green if the versions cannot be directly compared :green end end def earlier_version?(spec_version, locked_spec_version) Gem::Version.new(spec_version) < Gem::Version.new(locked_spec_version) end def print_using_message(message) if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages? Bundler.ui.debug message else Bundler.ui.info message end end def extension_cache_path(spec) return unless Bundler.feature_flag.global_gem_cache? return unless source_slug = extension_cache_slug(spec) Bundler.user_cache.join( "extensions", Gem::Platform.local.to_s, Bundler.ruby_scope, source_slug, spec.full_name ) end def extension_cache_slug(_) nil end end end bundler-1.16.1/lib/bundler/rubygems_ext.rb0000644000175000017500000001360313217261023021252 0ustar samuelophsamueloph# frozen_string_literal: true require "pathname" if defined?(Gem::QuickLoader) # Gem Prelude makes me a sad panda :'( Gem::QuickLoader.load_full_rubygems_library end require "rubygems" require "rubygems/specification" begin # Possible use in Gem::Specification#source below and require # shouldn't be deferred. require "rubygems/source" rescue LoadError # Not available before RubyGems 2.0.0, ignore nil end require "bundler/match_platform" module Gem @loaded_stacks = Hash.new {|h, k| h[k] = [] } class Specification attr_accessor :remote, :location, :relative_loaded_from if instance_methods(false).map(&:to_sym).include?(:source) remove_method :source attr_writer :source def source (defined?(@source) && @source) || Gem::Source::Installed.new end else attr_accessor :source end alias_method :rg_full_gem_path, :full_gem_path alias_method :rg_loaded_from, :loaded_from attr_writer :full_gem_path unless instance_methods.include?(:full_gem_path=) def full_gem_path # this cannot check source.is_a?(Bundler::Plugin::API::Source) # because that _could_ trip the autoload, and if there are unresolved # gems at that time, this method could be called inside another require, # thus raising with that constant being undefined. Better to check a method if source.respond_to?(:path) || (source.respond_to?(:bundler_plugin_api_source?) && source.bundler_plugin_api_source?) Pathname.new(loaded_from).dirname.expand_path(source.root).to_s.untaint else rg_full_gem_path end end def loaded_from if relative_loaded_from source.path.join(relative_loaded_from).to_s else rg_loaded_from end end def load_paths return full_require_paths if respond_to?(:full_require_paths) require_paths.map do |require_path| if require_path.include?(full_gem_path) require_path else File.join(full_gem_path, require_path) end end end if method_defined?(:extension_dir) alias_method :rg_extension_dir, :extension_dir def extension_dir @bundler_extension_dir ||= if source.respond_to?(:extension_dir_name) File.expand_path(File.join(extensions_dir, source.extension_dir_name)) else rg_extension_dir end end end # RubyGems 1.8+ used only. methods = instance_methods(false) gem_dir = methods.first.is_a?(String) ? "gem_dir" : :gem_dir remove_method :gem_dir if methods.include?(gem_dir) def gem_dir full_gem_path end def groups @groups ||= [] end def git_version return unless loaded_from && source.is_a?(Bundler::Source::Git) " #{source.revision[0..6]}" end def to_gemfile(path = nil) gemfile = String.new("source 'https://rubygems.org'\n") gemfile << dependencies_to_gemfile(nondevelopment_dependencies) unless development_dependencies.empty? gemfile << "\n" gemfile << dependencies_to_gemfile(development_dependencies, :development) end gemfile end def nondevelopment_dependencies dependencies - development_dependencies end private def dependencies_to_gemfile(dependencies, group = nil) gemfile = String.new if dependencies.any? gemfile << "group :#{group} do\n" if group dependencies.each do |dependency| gemfile << " " if group gemfile << %(gem "#{dependency.name}") req = dependency.requirements_list.first gemfile << %(, "#{req}") if req gemfile << "\n" end gemfile << "end\n" if group end gemfile end end class Dependency attr_accessor :source, :groups, :all_sources alias_method :eql?, :== def encode_with(coder) to_yaml_properties.each do |ivar| coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar) end end def to_yaml_properties instance_variables.reject {|p| ["@source", "@groups", "@all_sources"].include?(p.to_s) } end def to_lock out = String.new(" #{name}") unless requirement.none? reqs = requirement.requirements.map {|o, v| "#{o} #{v}" }.sort.reverse out << " (#{reqs.join(", ")})" end out end # Backport of performance enhancement added to RubyGems 1.4 def matches_spec?(spec) # name can be a Regexp, so use === return false unless name === spec.name return true if requirement.none? requirement.satisfied_by?(spec.version) end unless allocate.respond_to?(:matches_spec?) end class Requirement # Backport of performance enhancement added to RubyGems 1.4 def none? # note that it might be tempting to replace with with RubyGems 2.0's # improved implementation. Don't. It requires `DefaultRequirement` to be # defined, and more importantantly, these overrides are not used when the # running RubyGems defines these methods to_s == ">= 0" end unless allocate.respond_to?(:none?) # Backport of performance enhancement added to RubyGems 2.2 def exact? return false unless @requirements.size == 1 @requirements[0][0] == "=" end unless allocate.respond_to?(:exact?) end class Platform JAVA = Gem::Platform.new("java") unless defined?(JAVA) MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN) MSWIN64 = Gem::Platform.new("mswin64") unless defined?(MSWIN64) MINGW = Gem::Platform.new("x86-mingw32") unless defined?(MINGW) X64_MINGW = Gem::Platform.new("x64-mingw32") unless defined?(X64_MINGW) undef_method :hash if method_defined? :hash def hash @cpu.hash ^ @os.hash ^ @version.hash end undef_method :eql? if method_defined? :eql? alias_method :eql?, :== end end module Gem class Specification include ::Bundler::MatchPlatform end end bundler-1.16.1/lib/bundler/vendored_fileutils.rb0000644000175000017500000000030013217261023022411 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler; end if RUBY_VERSION >= "2.4" require "bundler/vendor/fileutils/lib/fileutils" else # the version we vendor is 2.4+ require "fileutils" end bundler-1.16.1/lib/bundler/vendor/0000755000175000017500000000000013217261023017502 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/fileutils/0000755000175000017500000000000013217261023021502 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/fileutils/lib/0000755000175000017500000000000013217261023022250 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/fileutils/lib/fileutils.rb0000644000175000017500000013252213217261023024602 0ustar samuelophsamueloph# frozen_string_literal: true # # = fileutils.rb # # Copyright (c) 2000-2007 Minero Aoki # # This program is free software. # You can distribute/modify this program under the same terms of ruby. # # == module Bundler::FileUtils # # Namespace for several file utility methods for copying, moving, removing, etc. # # === Module Functions # # require 'bundler/vendor/fileutils/lib/fileutils' # # Bundler::FileUtils.cd(dir, options) # Bundler::FileUtils.cd(dir, options) {|dir| block } # Bundler::FileUtils.pwd() # Bundler::FileUtils.mkdir(dir, options) # Bundler::FileUtils.mkdir(list, options) # Bundler::FileUtils.mkdir_p(dir, options) # Bundler::FileUtils.mkdir_p(list, options) # Bundler::FileUtils.rmdir(dir, options) # Bundler::FileUtils.rmdir(list, options) # Bundler::FileUtils.ln(target, link, options) # Bundler::FileUtils.ln(targets, dir, options) # Bundler::FileUtils.ln_s(target, link, options) # Bundler::FileUtils.ln_s(targets, dir, options) # Bundler::FileUtils.ln_sf(target, link, options) # Bundler::FileUtils.cp(src, dest, options) # Bundler::FileUtils.cp(list, dir, options) # Bundler::FileUtils.cp_r(src, dest, options) # Bundler::FileUtils.cp_r(list, dir, options) # Bundler::FileUtils.mv(src, dest, options) # Bundler::FileUtils.mv(list, dir, options) # Bundler::FileUtils.rm(list, options) # Bundler::FileUtils.rm_r(list, options) # Bundler::FileUtils.rm_rf(list, options) # Bundler::FileUtils.install(src, dest, options) # Bundler::FileUtils.chmod(mode, list, options) # Bundler::FileUtils.chmod_R(mode, list, options) # Bundler::FileUtils.chown(user, group, list, options) # Bundler::FileUtils.chown_R(user, group, list, options) # Bundler::FileUtils.touch(list, options) # # The options parameter is a hash of options, taken from the list # :force, :noop, :preserve, and :verbose. # :noop means that no changes are made. The other three are obvious. # Each method documents the options that it honours. # # All methods that have the concept of a "source" file or directory can take # either one file or a list of files in that argument. See the method # documentation for examples. # # There are some `low level' methods, which do not accept any option: # # Bundler::FileUtils.copy_entry(src, dest, preserve = false, dereference = false) # Bundler::FileUtils.copy_file(src, dest, preserve = false, dereference = true) # Bundler::FileUtils.copy_stream(srcstream, deststream) # Bundler::FileUtils.remove_entry(path, force = false) # Bundler::FileUtils.remove_entry_secure(path, force = false) # Bundler::FileUtils.remove_file(path, force = false) # Bundler::FileUtils.compare_file(path_a, path_b) # Bundler::FileUtils.compare_stream(stream_a, stream_b) # Bundler::FileUtils.uptodate?(file, cmp_list) # # == module Bundler::FileUtils::Verbose # # This module has all methods of Bundler::FileUtils module, but it outputs messages # before acting. This equates to passing the :verbose flag to methods # in Bundler::FileUtils. # # == module Bundler::FileUtils::NoWrite # # This module has all methods of Bundler::FileUtils module, but never changes # files/directories. This equates to passing the :noop flag to methods # in Bundler::FileUtils. # # == module Bundler::FileUtils::DryRun # # This module has all methods of Bundler::FileUtils module, but never changes # files/directories. This equates to passing the :noop and # :verbose flags to methods in Bundler::FileUtils. # module Bundler::FileUtils def self.private_module_function(name) #:nodoc: module_function name private_class_method name end # # Returns the name of the current directory. # def pwd Dir.pwd end module_function :pwd alias getwd pwd module_function :getwd # # Changes the current directory to the directory +dir+. # # If this method is called with block, resumes to the old # working directory after the block execution finished. # # Bundler::FileUtils.cd('/', :verbose => true) # chdir and report it # # Bundler::FileUtils.cd('/') do # chdir # # ... # do something # end # return to original directory # def cd(dir, verbose: nil, &block) # :yield: dir fu_output_message "cd #{dir}" if verbose Dir.chdir(dir, &block) fu_output_message 'cd -' if verbose and block end module_function :cd alias chdir cd module_function :chdir # # Returns true if +new+ is newer than all +old_list+. # Non-existent files are older than any file. # # Bundler::FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \ # system 'make hello.o' # def uptodate?(new, old_list) return false unless File.exist?(new) new_time = File.mtime(new) old_list.each do |old| if File.exist?(old) return false unless new_time > File.mtime(old) end end true end module_function :uptodate? def remove_trailing_slash(dir) #:nodoc: dir == '/' ? dir : dir.chomp(?/) end private_module_function :remove_trailing_slash # # Creates one or more directories. # # Bundler::FileUtils.mkdir 'test' # Bundler::FileUtils.mkdir %w( tmp data ) # Bundler::FileUtils.mkdir 'notexist', :noop => true # Does not really create. # Bundler::FileUtils.mkdir 'tmp', :mode => 0700 # def mkdir(list, mode: nil, noop: nil, verbose: nil) list = fu_list(list) fu_output_message "mkdir #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose return if noop list.each do |dir| fu_mkdir dir, mode end end module_function :mkdir # # Creates a directory and all its parent directories. # For example, # # Bundler::FileUtils.mkdir_p '/usr/local/lib/ruby' # # causes to make following directories, if it does not exist. # # * /usr # * /usr/local # * /usr/local/lib # * /usr/local/lib/ruby # # You can pass several directories at a time in a list. # def mkdir_p(list, mode: nil, noop: nil, verbose: nil) list = fu_list(list) fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose return *list if noop list.map {|path| remove_trailing_slash(path)}.each do |path| # optimize for the most common case begin fu_mkdir path, mode next rescue SystemCallError next if File.directory?(path) end stack = [] until path == stack.last # dirname("/")=="/", dirname("C:/")=="C:/" stack.push path path = File.dirname(path) end stack.pop # root directory should exist stack.reverse_each do |dir| begin fu_mkdir dir, mode rescue SystemCallError raise unless File.directory?(dir) end end end return *list end module_function :mkdir_p alias mkpath mkdir_p alias makedirs mkdir_p module_function :mkpath module_function :makedirs def fu_mkdir(path, mode) #:nodoc: path = remove_trailing_slash(path) if mode Dir.mkdir path, mode File.chmod mode, path else Dir.mkdir path end end private_module_function :fu_mkdir # # Removes one or more directories. # # Bundler::FileUtils.rmdir 'somedir' # Bundler::FileUtils.rmdir %w(somedir anydir otherdir) # # Does not really remove directory; outputs message. # Bundler::FileUtils.rmdir 'somedir', :verbose => true, :noop => true # def rmdir(list, parents: nil, noop: nil, verbose: nil) list = fu_list(list) fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if verbose return if noop list.each do |dir| begin Dir.rmdir(dir = remove_trailing_slash(dir)) if parents until (parent = File.dirname(dir)) == '.' or parent == dir dir = parent Dir.rmdir(dir) end end rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT end end end module_function :rmdir # # :call-seq: # Bundler::FileUtils.ln(target, link, force: nil, noop: nil, verbose: nil) # Bundler::FileUtils.ln(target, dir, force: nil, noop: nil, verbose: nil) # Bundler::FileUtils.ln(targets, dir, force: nil, noop: nil, verbose: nil) # # In the first form, creates a hard link +link+ which points to +target+. # If +link+ already exists, raises Errno::EEXIST. # But if the :force option is set, overwrites +link+. # # Bundler::FileUtils.ln 'gcc', 'cc', verbose: true # Bundler::FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs' # # In the second form, creates a link +dir/target+ pointing to +target+. # In the third form, creates several hard links in the directory +dir+, # pointing to each item in +targets+. # If +dir+ is not a directory, raises Errno::ENOTDIR. # # Bundler::FileUtils.cd '/sbin' # Bundler::FileUtils.ln %w(cp mv mkdir), '/bin' # Now /sbin/cp and /bin/cp are linked. # def ln(src, dest, force: nil, noop: nil, verbose: nil) fu_output_message "ln#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose return if noop fu_each_src_dest0(src, dest) do |s,d| remove_file d, true if force File.link s, d end end module_function :ln alias link ln module_function :link # # :call-seq: # Bundler::FileUtils.ln_s(target, link, force: nil, noop: nil, verbose: nil) # Bundler::FileUtils.ln_s(target, dir, force: nil, noop: nil, verbose: nil) # Bundler::FileUtils.ln_s(targets, dir, force: nil, noop: nil, verbose: nil) # # In the first form, creates a symbolic link +link+ which points to +target+. # If +link+ already exists, raises Errno::EEXIST. # But if the :force option is set, overwrites +link+. # # Bundler::FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby' # Bundler::FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true # # In the second form, creates a link +dir/target+ pointing to +target+. # In the third form, creates several symbolic links in the directory +dir+, # pointing to each item in +targets+. # If +dir+ is not a directory, raises Errno::ENOTDIR. # # Bundler::FileUtils.ln_s Dir.glob('/bin/*.rb'), '/home/foo/bin' # def ln_s(src, dest, force: nil, noop: nil, verbose: nil) fu_output_message "ln -s#{force ? 'f' : ''} #{[src,dest].flatten.join ' '}" if verbose return if noop fu_each_src_dest0(src, dest) do |s,d| remove_file d, true if force File.symlink s, d end end module_function :ln_s alias symlink ln_s module_function :symlink # # :call-seq: # Bundler::FileUtils.ln_sf(*args) # # Same as # # Bundler::FileUtils.ln_s(*args, force: true) # def ln_sf(src, dest, noop: nil, verbose: nil) ln_s src, dest, force: true, noop: noop, verbose: verbose end module_function :ln_sf # # Copies a file content +src+ to +dest+. If +dest+ is a directory, # copies +src+ to +dest/src+. # # If +src+ is a list of files, then +dest+ must be a directory. # # Bundler::FileUtils.cp 'eval.c', 'eval.c.org' # Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6' # Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose => true # Bundler::FileUtils.cp 'symlink', 'dest' # copy content, "dest" is not a symlink # def cp(src, dest, preserve: nil, noop: nil, verbose: nil) fu_output_message "cp#{preserve ? ' -p' : ''} #{[src,dest].flatten.join ' '}" if verbose return if noop fu_each_src_dest(src, dest) do |s, d| copy_file s, d, preserve end end module_function :cp alias copy cp module_function :copy # # Copies +src+ to +dest+. If +src+ is a directory, this method copies # all its contents recursively. If +dest+ is a directory, copies # +src+ to +dest/src+. # # +src+ can be a list of files. # # # Installing Ruby library "mylib" under the site_ruby # Bundler::FileUtils.rm_r site_ruby + '/mylib', :force # Bundler::FileUtils.cp_r 'lib/', site_ruby + '/mylib' # # # Examples of copying several files to target directory. # Bundler::FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail' # Bundler::FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', :noop => true, :verbose => true # # # If you want to copy all contents of a directory instead of the # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y, # # use following code. # Bundler::FileUtils.cp_r 'src/.', 'dest' # cp_r('src', 'dest') makes dest/src, # # but this doesn't. # def cp_r(src, dest, preserve: nil, noop: nil, verbose: nil, dereference_root: true, remove_destination: nil) fu_output_message "cp -r#{preserve ? 'p' : ''}#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose return if noop fu_each_src_dest(src, dest) do |s, d| copy_entry s, d, preserve, dereference_root, remove_destination end end module_function :cp_r # # Copies a file system entry +src+ to +dest+. # If +src+ is a directory, this method copies its contents recursively. # This method preserves file types, c.f. symlink, directory... # (FIFO, device files and etc. are not supported yet) # # Both of +src+ and +dest+ must be a path name. # +src+ must exist, +dest+ must not exist. # # If +preserve+ is true, this method preserves owner, group, and # modified time. Permissions are copied regardless +preserve+. # # If +dereference_root+ is true, this method dereference tree root. # # If +remove_destination+ is true, this method removes each destination file before copy. # def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false) Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent| destent = Entry_.new(dest, ent.rel, false) File.unlink destent.path if remove_destination && File.file?(destent.path) ent.copy destent.path end, proc do |ent| destent = Entry_.new(dest, ent.rel, false) ent.copy_metadata destent.path if preserve end) end module_function :copy_entry # # Copies file contents of +src+ to +dest+. # Both of +src+ and +dest+ must be a path name. # def copy_file(src, dest, preserve = false, dereference = true) ent = Entry_.new(src, nil, dereference) ent.copy_file dest ent.copy_metadata dest if preserve end module_function :copy_file # # Copies stream +src+ to +dest+. # +src+ must respond to #read(n) and # +dest+ must respond to #write(str). # def copy_stream(src, dest) IO.copy_stream(src, dest) end module_function :copy_stream # # Moves file(s) +src+ to +dest+. If +file+ and +dest+ exist on the different # disk partition, the file is copied then the original file is removed. # # Bundler::FileUtils.mv 'badname.rb', 'goodname.rb' # Bundler::FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force => true # no error # # Bundler::FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/' # Bundler::FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true # def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil) fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose return if noop fu_each_src_dest(src, dest) do |s, d| destent = Entry_.new(d, nil, true) begin if destent.exist? if destent.directory? raise Errno::EEXIST, d else destent.remove_file if rename_cannot_overwrite_file? end end begin File.rename s, d rescue Errno::EXDEV copy_entry s, d, true if secure remove_entry_secure s, force else remove_entry s, force end end rescue SystemCallError raise unless force end end end module_function :mv alias move mv module_function :move def rename_cannot_overwrite_file? #:nodoc: /emx/ =~ RUBY_PLATFORM end private_module_function :rename_cannot_overwrite_file? # # Remove file(s) specified in +list+. This method cannot remove directories. # All StandardErrors are ignored when the :force option is set. # # Bundler::FileUtils.rm %w( junk.txt dust.txt ) # Bundler::FileUtils.rm Dir.glob('*.so') # Bundler::FileUtils.rm 'NotExistFile', :force => true # never raises exception # def rm(list, force: nil, noop: nil, verbose: nil) list = fu_list(list) fu_output_message "rm#{force ? ' -f' : ''} #{list.join ' '}" if verbose return if noop list.each do |path| remove_file path, force end end module_function :rm alias remove rm module_function :remove # # Equivalent to # # Bundler::FileUtils.rm(list, :force => true) # def rm_f(list, noop: nil, verbose: nil) rm list, force: true, noop: noop, verbose: verbose end module_function :rm_f alias safe_unlink rm_f module_function :safe_unlink # # remove files +list+[0] +list+[1]... If +list+[n] is a directory, # removes its all contents recursively. This method ignores # StandardError when :force option is set. # # Bundler::FileUtils.rm_r Dir.glob('/tmp/*') # Bundler::FileUtils.rm_r 'some_dir', :force => true # # WARNING: This method causes local vulnerability # if one of parent directories or removing directory tree are world # writable (including /tmp, whose permission is 1777), and the current # process has strong privilege such as Unix super user (root), and the # system has symbolic link. For secure removing, read the documentation # of #remove_entry_secure carefully, and set :secure option to true. # Default is :secure=>false. # # NOTE: This method calls #remove_entry_secure if :secure option is set. # See also #remove_entry_secure. # def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil) list = fu_list(list) fu_output_message "rm -r#{force ? 'f' : ''} #{list.join ' '}" if verbose return if noop list.each do |path| if secure remove_entry_secure path, force else remove_entry path, force end end end module_function :rm_r # # Equivalent to # # Bundler::FileUtils.rm_r(list, :force => true) # # WARNING: This method causes local vulnerability. # Read the documentation of #rm_r first. # def rm_rf(list, noop: nil, verbose: nil, secure: nil) rm_r list, force: true, noop: noop, verbose: verbose, secure: secure end module_function :rm_rf alias rmtree rm_rf module_function :rmtree # # This method removes a file system entry +path+. +path+ shall be a # regular file, a directory, or something. If +path+ is a directory, # remove it recursively. This method is required to avoid TOCTTOU # (time-of-check-to-time-of-use) local security vulnerability of #rm_r. # #rm_r causes security hole when: # # * Parent directory is world writable (including /tmp). # * Removing directory tree includes world writable directory. # * The system has symbolic link. # # To avoid this security hole, this method applies special preprocess. # If +path+ is a directory, this method chown(2) and chmod(2) all # removing directories. This requires the current process is the # owner of the removing whole directory tree, or is the super user (root). # # WARNING: You must ensure that *ALL* parent directories cannot be # moved by other untrusted users. For example, parent directories # should not be owned by untrusted users, and should not be world # writable except when the sticky bit set. # # WARNING: Only the owner of the removing directory tree, or Unix super # user (root) should invoke this method. Otherwise this method does not # work. # # For details of this security vulnerability, see Perl's case: # # * http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448 # * http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452 # # For fileutils.rb, this vulnerability is reported in [ruby-dev:26100]. # def remove_entry_secure(path, force = false) unless fu_have_symlink? remove_entry path, force return end fullpath = File.expand_path(path) st = File.lstat(fullpath) unless st.directory? File.unlink fullpath return end # is a directory. parent_st = File.stat(File.dirname(fullpath)) unless parent_st.world_writable? remove_entry path, force return end unless parent_st.sticky? raise ArgumentError, "parent directory is world writable, Bundler::FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})" end # freeze tree root euid = Process.euid File.open(fullpath + '/.') {|f| unless fu_stat_identical_entry?(st, f.stat) # symlink (TOC-to-TOU attack?) File.unlink fullpath return end f.chown euid, -1 f.chmod 0700 unless fu_stat_identical_entry?(st, File.lstat(fullpath)) # TOC-to-TOU attack? File.unlink fullpath return end } # ---- tree root is frozen ---- root = Entry_.new(path) root.preorder_traverse do |ent| if ent.directory? ent.chown euid, -1 ent.chmod 0700 end end root.postorder_traverse do |ent| begin ent.remove rescue raise unless force end end rescue raise unless force end module_function :remove_entry_secure def fu_have_symlink? #:nodoc: File.symlink nil, nil rescue NotImplementedError return false rescue TypeError return true end private_module_function :fu_have_symlink? def fu_stat_identical_entry?(a, b) #:nodoc: a.dev == b.dev and a.ino == b.ino end private_module_function :fu_stat_identical_entry? # # This method removes a file system entry +path+. # +path+ might be a regular file, a directory, or something. # If +path+ is a directory, remove it recursively. # # See also #remove_entry_secure. # def remove_entry(path, force = false) Entry_.new(path).postorder_traverse do |ent| begin ent.remove rescue raise unless force end end rescue raise unless force end module_function :remove_entry # # Removes a file +path+. # This method ignores StandardError if +force+ is true. # def remove_file(path, force = false) Entry_.new(path).remove_file rescue raise unless force end module_function :remove_file # # Removes a directory +dir+ and its contents recursively. # This method ignores StandardError if +force+ is true. # def remove_dir(path, force = false) remove_entry path, force # FIXME?? check if it is a directory end module_function :remove_dir # # Returns true if the contents of a file +a+ and a file +b+ are identical. # # Bundler::FileUtils.compare_file('somefile', 'somefile') #=> true # Bundler::FileUtils.compare_file('/dev/null', '/dev/urandom') #=> false # def compare_file(a, b) return false unless File.size(a) == File.size(b) File.open(a, 'rb') {|fa| File.open(b, 'rb') {|fb| return compare_stream(fa, fb) } } end module_function :compare_file alias identical? compare_file alias cmp compare_file module_function :identical? module_function :cmp # # Returns true if the contents of a stream +a+ and +b+ are identical. # def compare_stream(a, b) bsize = fu_stream_blksize(a, b) sa = String.new(capacity: bsize) sb = String.new(capacity: bsize) begin a.read(bsize, sa) b.read(bsize, sb) return true if sa.empty? && sb.empty? end while sa == sb false end module_function :compare_stream # # If +src+ is not same as +dest+, copies it and changes the permission # mode to +mode+. If +dest+ is a directory, destination is +dest+/+src+. # This method removes destination before copy. # # Bundler::FileUtils.install 'ruby', '/usr/local/bin/ruby', :mode => 0755, :verbose => true # Bundler::FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose => true # def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil, noop: nil, verbose: nil) if verbose msg = +"install -c" msg << ' -p' if preserve msg << ' -m ' << mode_to_s(mode) if mode msg << " -o #{owner}" if owner msg << " -g #{group}" if group msg << ' ' << [src,dest].flatten.join(' ') fu_output_message msg end return if noop uid = fu_get_uid(owner) gid = fu_get_gid(group) fu_each_src_dest(src, dest) do |s, d| st = File.stat(s) unless File.exist?(d) and compare_file(s, d) remove_file d, true copy_file s, d File.utime st.atime, st.mtime, d if preserve File.chmod fu_mode(mode, st), d if mode File.chown uid, gid, d if uid or gid end end end module_function :install def user_mask(target) #:nodoc: target.each_char.inject(0) do |mask, chr| case chr when "u" mask | 04700 when "g" mask | 02070 when "o" mask | 01007 when "a" mask | 07777 else raise ArgumentError, "invalid `who' symbol in file mode: #{chr}" end end end private_module_function :user_mask def apply_mask(mode, user_mask, op, mode_mask) #:nodoc: case op when '=' (mode & ~user_mask) | (user_mask & mode_mask) when '+' mode | (user_mask & mode_mask) when '-' mode & ~(user_mask & mode_mask) end end private_module_function :apply_mask def symbolic_modes_to_i(mode_sym, path) #:nodoc: mode = if File::Stat === path path.mode else File.stat(path).mode end mode_sym.split(/,/).inject(mode & 07777) do |current_mode, clause| target, *actions = clause.split(/([=+-])/) raise ArgumentError, "invalid file mode: #{mode_sym}" if actions.empty? target = 'a' if target.empty? user_mask = user_mask(target) actions.each_slice(2) do |op, perm| need_apply = op == '=' mode_mask = (perm || '').each_char.inject(0) do |mask, chr| case chr when "r" mask | 0444 when "w" mask | 0222 when "x" mask | 0111 when "X" if FileTest.directory? path mask | 0111 else mask end when "s" mask | 06000 when "t" mask | 01000 when "u", "g", "o" if mask.nonzero? current_mode = apply_mask(current_mode, user_mask, op, mask) end need_apply = false copy_mask = user_mask(chr) (current_mode & copy_mask) / (copy_mask & 0111) * (user_mask & 0111) else raise ArgumentError, "invalid `perm' symbol in file mode: #{chr}" end end if mode_mask.nonzero? || need_apply current_mode = apply_mask(current_mode, user_mask, op, mode_mask) end end current_mode end end private_module_function :symbolic_modes_to_i def fu_mode(mode, path) #:nodoc: mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode end private_module_function :fu_mode def mode_to_s(mode) #:nodoc: mode.is_a?(String) ? mode : "%o" % mode end private_module_function :mode_to_s # # Changes permission bits on the named files (in +list+) to the bit pattern # represented by +mode+. # # +mode+ is the symbolic and absolute mode can be used. # # Absolute mode is # Bundler::FileUtils.chmod 0755, 'somecommand' # Bundler::FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb) # Bundler::FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true # # Symbolic mode is # Bundler::FileUtils.chmod "u=wrx,go=rx", 'somecommand' # Bundler::FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb) # Bundler::FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true # # "a" :: is user, group, other mask. # "u" :: is user's mask. # "g" :: is group's mask. # "o" :: is other's mask. # "w" :: is write permission. # "r" :: is read permission. # "x" :: is execute permission. # "X" :: # is execute permission for directories only, must be used in conjunction with "+" # "s" :: is uid, gid. # "t" :: is sticky bit. # "+" :: is added to a class given the specified mode. # "-" :: Is removed from a given class given mode. # "=" :: Is the exact nature of the class will be given a specified mode. def chmod(mode, list, noop: nil, verbose: nil) list = fu_list(list) fu_output_message sprintf('chmod %s %s', mode_to_s(mode), list.join(' ')) if verbose return if noop list.each do |path| Entry_.new(path).chmod(fu_mode(mode, path)) end end module_function :chmod # # Changes permission bits on the named files (in +list+) # to the bit pattern represented by +mode+. # # Bundler::FileUtils.chmod_R 0700, "/tmp/app.#{$$}" # Bundler::FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}" # def chmod_R(mode, list, noop: nil, verbose: nil, force: nil) list = fu_list(list) fu_output_message sprintf('chmod -R%s %s %s', (force ? 'f' : ''), mode_to_s(mode), list.join(' ')) if verbose return if noop list.each do |root| Entry_.new(root).traverse do |ent| begin ent.chmod(fu_mode(mode, ent.path)) rescue raise unless force end end end end module_function :chmod_R # # Changes owner and group on the named files (in +list+) # to the user +user+ and the group +group+. +user+ and +group+ # may be an ID (Integer/String) or a name (String). # If +user+ or +group+ is nil, this method does not change # the attribute. # # Bundler::FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby' # Bundler::FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), :verbose => true # def chown(user, group, list, noop: nil, verbose: nil) list = fu_list(list) fu_output_message sprintf('chown %s %s', (group ? "#{user}:#{group}" : user || ':'), list.join(' ')) if verbose return if noop uid = fu_get_uid(user) gid = fu_get_gid(group) list.each do |path| Entry_.new(path).chown uid, gid end end module_function :chown # # Changes owner and group on the named files (in +list+) # to the user +user+ and the group +group+ recursively. # +user+ and +group+ may be an ID (Integer/String) or # a name (String). If +user+ or +group+ is nil, this # method does not change the attribute. # # Bundler::FileUtils.chown_R 'www', 'www', '/var/www/htdocs' # Bundler::FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', :verbose => true # def chown_R(user, group, list, noop: nil, verbose: nil, force: nil) list = fu_list(list) fu_output_message sprintf('chown -R%s %s %s', (force ? 'f' : ''), (group ? "#{user}:#{group}" : user || ':'), list.join(' ')) if verbose return if noop uid = fu_get_uid(user) gid = fu_get_gid(group) list.each do |root| Entry_.new(root).traverse do |ent| begin ent.chown uid, gid rescue raise unless force end end end end module_function :chown_R begin require 'etc' rescue LoadError # rescue LoadError for miniruby end def fu_get_uid(user) #:nodoc: return nil unless user case user when Integer user when /\A\d+\z/ user.to_i else Etc.getpwnam(user) ? Etc.getpwnam(user).uid : nil end end private_module_function :fu_get_uid def fu_get_gid(group) #:nodoc: return nil unless group case group when Integer group when /\A\d+\z/ group.to_i else Etc.getgrnam(group) ? Etc.getgrnam(group).gid : nil end end private_module_function :fu_get_gid # # Updates modification time (mtime) and access time (atime) of file(s) in # +list+. Files are created if they don't exist. # # Bundler::FileUtils.touch 'timestamp' # Bundler::FileUtils.touch Dir.glob('*.c'); system 'make' # def touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil) list = fu_list(list) t = mtime if verbose fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}" end return if noop list.each do |path| created = nocreate begin File.utime(t, t, path) rescue Errno::ENOENT raise if created File.open(path, 'a') { ; } created = true retry if t end end end module_function :touch private module StreamUtils_ private def fu_windows? /mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM end def fu_copy_stream0(src, dest, blksize = nil) #:nodoc: IO.copy_stream(src, dest) end def fu_stream_blksize(*streams) streams.each do |s| next unless s.respond_to?(:stat) size = fu_blksize(s.stat) return size if size end fu_default_blksize() end def fu_blksize(st) s = st.blksize return nil unless s return nil if s == 0 s end def fu_default_blksize 1024 end end include StreamUtils_ extend StreamUtils_ class Entry_ #:nodoc: internal use only include StreamUtils_ def initialize(a, b = nil, deref = false) @prefix = @rel = @path = nil if b @prefix = a @rel = b else @path = a end @deref = deref @stat = nil @lstat = nil end def inspect "\#<#{self.class} #{path()}>" end def path if @path File.path(@path) else join(@prefix, @rel) end end def prefix @prefix || @path end def rel @rel end def dereference? @deref end def exist? begin lstat true rescue Errno::ENOENT false end end def file? s = lstat! s and s.file? end def directory? s = lstat! s and s.directory? end def symlink? s = lstat! s and s.symlink? end def chardev? s = lstat! s and s.chardev? end def blockdev? s = lstat! s and s.blockdev? end def socket? s = lstat! s and s.socket? end def pipe? s = lstat! s and s.pipe? end S_IF_DOOR = 0xD000 def door? s = lstat! s and (s.mode & 0xF000 == S_IF_DOOR) end def entries opts = {} opts[:encoding] = ::Encoding::UTF_8 if fu_windows? Dir.entries(path(), opts)\ .reject {|n| n == '.' or n == '..' }\ .map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) } end def stat return @stat if @stat if lstat() and lstat().symlink? @stat = File.stat(path()) else @stat = lstat() end @stat end def stat! return @stat if @stat if lstat! and lstat!.symlink? @stat = File.stat(path()) else @stat = lstat! end @stat rescue SystemCallError nil end def lstat if dereference? @lstat ||= File.stat(path()) else @lstat ||= File.lstat(path()) end end def lstat! lstat() rescue SystemCallError nil end def chmod(mode) if symlink? File.lchmod mode, path() if have_lchmod? else File.chmod mode, path() end end def chown(uid, gid) if symlink? File.lchown uid, gid, path() if have_lchown? else File.chown uid, gid, path() end end def copy(dest) lstat case when file? copy_file dest when directory? if !File.exist?(dest) and descendant_directory?(dest, path) raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest] end begin Dir.mkdir dest rescue raise unless File.directory?(dest) end when symlink? File.symlink File.readlink(path()), dest when chardev? raise "cannot handle device file" unless File.respond_to?(:mknod) mknod dest, ?c, 0666, lstat().rdev when blockdev? raise "cannot handle device file" unless File.respond_to?(:mknod) mknod dest, ?b, 0666, lstat().rdev when socket? raise "cannot handle socket" unless File.respond_to?(:mknod) mknod dest, nil, lstat().mode, 0 when pipe? raise "cannot handle FIFO" unless File.respond_to?(:mkfifo) mkfifo dest, 0666 when door? raise "cannot handle door: #{path()}" else raise "unknown file type: #{path()}" end end def copy_file(dest) File.open(path()) do |s| File.open(dest, 'wb', s.stat.mode) do |f| IO.copy_stream(s, f) end end end def copy_metadata(path) st = lstat() if !st.symlink? File.utime st.atime, st.mtime, path end mode = st.mode begin if st.symlink? begin File.lchown st.uid, st.gid, path rescue NotImplementedError end else File.chown st.uid, st.gid, path end rescue Errno::EPERM, Errno::EACCES # clear setuid/setgid mode &= 01777 end if st.symlink? begin File.lchmod mode, path rescue NotImplementedError end else File.chmod mode, path end end def remove if directory? remove_dir1 else remove_file end end def remove_dir1 platform_support { Dir.rmdir path().chomp(?/) } end def remove_file platform_support { File.unlink path } end def platform_support return yield unless fu_windows? first_time_p = true begin yield rescue Errno::ENOENT raise rescue => err if first_time_p first_time_p = false begin File.chmod 0700, path() # Windows does not have symlink retry rescue SystemCallError end end raise err end end def preorder_traverse stack = [self] while ent = stack.pop yield ent stack.concat ent.entries.reverse if ent.directory? end end alias traverse preorder_traverse def postorder_traverse if directory? entries().each do |ent| ent.postorder_traverse do |e| yield e end end end ensure yield self end def wrap_traverse(pre, post) pre.call self if directory? entries.each do |ent| ent.wrap_traverse pre, post end end post.call self end private $fileutils_rb_have_lchmod = nil def have_lchmod? # This is not MT-safe, but it does not matter. if $fileutils_rb_have_lchmod == nil $fileutils_rb_have_lchmod = check_have_lchmod? end $fileutils_rb_have_lchmod end def check_have_lchmod? return false unless File.respond_to?(:lchmod) File.lchmod 0 return true rescue NotImplementedError return false end $fileutils_rb_have_lchown = nil def have_lchown? # This is not MT-safe, but it does not matter. if $fileutils_rb_have_lchown == nil $fileutils_rb_have_lchown = check_have_lchown? end $fileutils_rb_have_lchown end def check_have_lchown? return false unless File.respond_to?(:lchown) File.lchown nil, nil return true rescue NotImplementedError return false end def join(dir, base) return File.path(dir) if not base or base == '.' return File.path(base) if not dir or dir == '.' File.join(dir, base) end if File::ALT_SEPARATOR DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)" else DIRECTORY_TERM = "(?=/|\\z)" end SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : "" def descendant_directory?(descendant, ascendant) /\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant) end end # class Entry_ def fu_list(arg) #:nodoc: [arg].flatten.map {|path| File.path(path) } end private_module_function :fu_list def fu_each_src_dest(src, dest) #:nodoc: fu_each_src_dest0(src, dest) do |s, d| raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d) yield s, d end end private_module_function :fu_each_src_dest def fu_each_src_dest0(src, dest) #:nodoc: if tmp = Array.try_convert(src) tmp.each do |s| s = File.path(s) yield s, File.join(dest, File.basename(s)) end else src = File.path(src) if File.directory?(dest) yield src, File.join(dest, File.basename(src)) else yield src, File.path(dest) end end end private_module_function :fu_each_src_dest0 def fu_same?(a, b) #:nodoc: File.identical?(a, b) end private_module_function :fu_same? @fileutils_output = $stderr @fileutils_label = '' def fu_output_message(msg) #:nodoc: @fileutils_output ||= $stderr @fileutils_label ||= '' @fileutils_output.puts @fileutils_label + msg end private_module_function :fu_output_message # This hash table holds command options. OPT_TABLE = {} #:nodoc: internal use only (private_instance_methods & methods(false)).inject(OPT_TABLE) {|tbl, name| (tbl[name.to_s] = instance_method(name).parameters).map! {|t, n| n if t == :key}.compact! tbl } # # Returns an Array of method names which have any options. # # p Bundler::FileUtils.commands #=> ["chmod", "cp", "cp_r", "install", ...] # def self.commands OPT_TABLE.keys end # # Returns an Array of option names. # # p Bundler::FileUtils.options #=> ["noop", "force", "verbose", "preserve", "mode"] # def self.options OPT_TABLE.values.flatten.uniq.map {|sym| sym.to_s } end # # Returns true if the method +mid+ have an option +opt+. # # p Bundler::FileUtils.have_option?(:cp, :noop) #=> true # p Bundler::FileUtils.have_option?(:rm, :force) #=> true # p Bundler::FileUtils.have_option?(:rm, :preserve) #=> false # def self.have_option?(mid, opt) li = OPT_TABLE[mid.to_s] or raise ArgumentError, "no such method: #{mid}" li.include?(opt) end # # Returns an Array of option names of the method +mid+. # # p Bundler::FileUtils.options_of(:rm) #=> ["noop", "verbose", "force"] # def self.options_of(mid) OPT_TABLE[mid.to_s].map {|sym| sym.to_s } end # # Returns an Array of method names which have the option +opt+. # # p Bundler::FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"] # def self.collect_method(opt) OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) } end LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) module LowMethods private def _do_nothing(*)end ::Bundler::FileUtils::LOW_METHODS.map {|name| alias_method name, :_do_nothing} end METHODS = singleton_methods() - [:private_module_function, :commands, :options, :have_option?, :options_of, :collect_method] # # This module has all methods of Bundler::FileUtils module, but it outputs messages # before acting. This equates to passing the :verbose flag to # methods in Bundler::FileUtils. # module Verbose include Bundler::FileUtils @fileutils_output = $stderr @fileutils_label = '' names = ::Bundler::FileUtils.collect_method(:verbose) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) def #{name}(*args, **options) super(*args, **options, verbose: true) end EOS end private(*names) extend self class << self public(*::Bundler::FileUtils::METHODS) end end # # This module has all methods of Bundler::FileUtils module, but never changes # files/directories. This equates to passing the :noop flag # to methods in Bundler::FileUtils. # module NoWrite include Bundler::FileUtils include LowMethods @fileutils_output = $stderr @fileutils_label = '' names = ::Bundler::FileUtils.collect_method(:noop) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) def #{name}(*args, **options) super(*args, **options, noop: true) end EOS end private(*names) extend self class << self public(*::Bundler::FileUtils::METHODS) end end # # This module has all methods of Bundler::FileUtils module, but never changes # files/directories, with printing message before acting. # This equates to passing the :noop and :verbose flag # to methods in Bundler::FileUtils. # module DryRun include Bundler::FileUtils include LowMethods @fileutils_output = $stderr @fileutils_label = '' names = ::Bundler::FileUtils.collect_method(:noop) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) def #{name}(*args, **options) super(*args, **options, noop: true, verbose: true) end EOS end private(*names) extend self class << self public(*::Bundler::FileUtils::METHODS) end end end bundler-1.16.1/lib/bundler/vendor/net-http-persistent/0000755000175000017500000000000013217261023023443 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/0000755000175000017500000000000013217261023024211 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/0000755000175000017500000000000013217261023024777 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/0000755000175000017500000000000013217261023025756 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb0000644000175000017500000010167213217261023030512 0ustar samuelophsamuelophrequire 'net/http' begin require 'net/https' rescue LoadError # net/https or openssl end if RUBY_VERSION < '1.9' # but only for 1.8 require 'bundler/vendor/net-http-persistent/lib/net/http/faster' require 'uri' require 'cgi' # for escaping begin require 'net/http/pipeline' rescue LoadError end autoload :OpenSSL, 'openssl' ## # Persistent connections for Net::HTTP # # Bundler::Persistent::Net::HTTP::Persistent maintains persistent connections across all the # servers you wish to talk to. For each host:port you communicate with a # single persistent connection is created. # # Multiple Bundler::Persistent::Net::HTTP::Persistent objects will share the same set of # connections. # # For each thread you start a new connection will be created. A # Bundler::Persistent::Net::HTTP::Persistent connection will not be shared across threads. # # You can shut down the HTTP connections when done by calling #shutdown. You # should name your Bundler::Persistent::Net::HTTP::Persistent object if you intend to call this # method. # # Example: # # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent' # # uri = URI 'http://example.com/awesome/web/service' # # http = Bundler::Persistent::Net::HTTP::Persistent.new 'my_app_name' # # # perform a GET # response = http.request uri # # # or # # get = Net::HTTP::Get.new uri.request_uri # response = http.request get # # # create a POST # post_uri = uri + 'create' # post = Net::HTTP::Post.new post_uri.path # post.set_form_data 'some' => 'cool data' # # # perform the POST, the URI is always required # response http.request post_uri, post # # Note that for GET, HEAD and other requests that do not have a body you want # to use URI#request_uri not URI#path. The request_uri contains the query # params which are sent in the body for other requests. # # == SSL # # SSL connections are automatically created depending upon the scheme of the # URI. SSL connections are automatically verified against the default # certificate store for your computer. You can override this by changing # verify_mode or by specifying an alternate cert_store. # # Here are the SSL settings, see the individual methods for documentation: # # #certificate :: This client's certificate # #ca_file :: The certificate-authority # #cert_store :: An SSL certificate store # #private_key :: The client's SSL private key # #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new # connection # #ssl_version :: Which specific SSL version to use # #verify_callback :: For server certificate verification # #verify_mode :: How connections should be verified # # == Proxies # # A proxy can be set through #proxy= or at initialization time by providing a # second argument to ::new. The proxy may be the URI of the proxy server or # :ENV which will consult environment variables. # # See #proxy= and #proxy_from_env for details. # # == Headers # # Headers may be specified for use in every request. #headers are appended to # any headers on the request. #override_headers replace existing headers on # the request. # # The difference between the two can be seen in setting the User-Agent. Using # http.headers['User-Agent'] = 'MyUserAgent' will send "Ruby, # MyUserAgent" while http.override_headers['User-Agent'] = # 'MyUserAgent' will send "MyUserAgent". # # == Tuning # # === Segregation # # By providing an application name to ::new you can separate your connections # from the connections of other applications. # # === Idle Timeout # # If a connection hasn't been used for this number of seconds it will automatically be # reset upon the next use to avoid attempting to send to a closed connection. # The default value is 5 seconds. nil means no timeout. Set through #idle_timeout. # # Reducing this value may help avoid the "too many connection resets" error # when sending non-idempotent requests while increasing this value will cause # fewer round-trips. # # === Read Timeout # # The amount of time allowed between reading two chunks from the socket. Set # through #read_timeout # # === Max Requests # # The number of requests that should be made before opening a new connection. # Typically many keep-alive capable servers tune this to 100 or less, so the # 101st request will fail with ECONNRESET. If unset (default), this value has no # effect, if set, connections will be reset on the request after max_requests. # # === Open Timeout # # The amount of time to wait for a connection to be opened. Set through # #open_timeout. # # === Socket Options # # Socket options may be set on newly-created connections. See #socket_options # for details. # # === Non-Idempotent Requests # # By default non-idempotent requests will not be retried per RFC 2616. By # setting retry_change_requests to true requests will automatically be retried # once. # # Only do this when you know that retrying a POST or other non-idempotent # request is safe for your application and will not create duplicate # resources. # # The recommended way to handle non-idempotent requests is the following: # # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent' # # uri = URI 'http://example.com/awesome/web/service' # post_uri = uri + 'create' # # http = Bundler::Persistent::Net::HTTP::Persistent.new 'my_app_name' # # post = Net::HTTP::Post.new post_uri.path # # ... fill in POST request # # begin # response = http.request post_uri, post # rescue Bundler::Persistent::Net::HTTP::Persistent::Error # # # POST failed, make a new request to verify the server did not process # # the request # exists_uri = uri + '...' # response = http.get exists_uri # # # Retry if it failed # retry if response.code == '404' # end # # The method of determining if the resource was created or not is unique to # the particular service you are using. Of course, you will want to add # protection from infinite looping. # # === Connection Termination # # If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down # all the connections in the current thread with #shutdown. This is not # recommended for normal use, it should only be used when it will be several # minutes before you make another HTTP request. # # If you are using multiple threads, call #shutdown in each thread when the # thread is done making requests. If you don't call shutdown, that's OK. # Ruby will automatically garbage collect and shutdown your HTTP connections # when the thread terminates. class Bundler::Persistent::Net::HTTP::Persistent ## # The beginning of Time EPOCH = Time.at 0 # :nodoc: ## # Is OpenSSL available? This test works with autoload HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc: ## # The version of Bundler::Persistent::Net::HTTP::Persistent you are using VERSION = '2.9.4' ## # Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with # the exception list for ruby 1.x. RETRIED_EXCEPTIONS = [ # :nodoc: (Net::ReadTimeout if Net.const_defined? :ReadTimeout), IOError, EOFError, Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, (OpenSSL::SSL::SSLError if HAVE_OPENSSL), Timeout::Error, ].compact ## # Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various # SystemCallErrors are re-raised with a human-readable message under this # class. class Error < StandardError; end ## # Use this method to detect the idle timeout of the host at +uri+. The # value returned can be used to configure #idle_timeout. +max+ controls the # maximum idle timeout to detect. # # After # # Idle timeout detection is performed by creating a connection then # performing a HEAD request in a loop until the connection terminates # waiting one additional second per loop. # # NOTE: This may not work on ruby > 1.9. def self.detect_idle_timeout uri, max = 10 uri = URI uri unless URI::Generic === uri uri += '/' req = Net::HTTP::Head.new uri.request_uri http = new 'net-http-persistent detect_idle_timeout' connection = http.connection_for uri sleep_time = 0 loop do response = connection.request req $stderr.puts "HEAD #{uri} => #{response.code}" if $DEBUG unless Net::HTTPOK === response then raise Error, "bad response code #{response.code} detecting idle timeout" end break if sleep_time >= max sleep_time += 1 $stderr.puts "sleeping #{sleep_time}" if $DEBUG sleep sleep_time end rescue # ignore StandardErrors, we've probably found the idle timeout. ensure http.shutdown return sleep_time unless $! end ## # This client's OpenSSL::X509::Certificate attr_reader :certificate # For Net::HTTP parity alias cert certificate ## # An SSL certificate authority. Setting this will set verify_mode to # VERIFY_PEER. attr_reader :ca_file ## # An SSL certificate store. Setting this will override the default # certificate store. See verify_mode for more information. attr_reader :cert_store ## # Sends debug_output to this IO via Net::HTTP#set_debug_output. # # Never use this method in production code, it causes a serious security # hole. attr_accessor :debug_output ## # Current connection generation attr_reader :generation # :nodoc: ## # Where this instance's connections live in the thread local variables attr_reader :generation_key # :nodoc: ## # Headers that are added to every request using Net::HTTP#add_field attr_reader :headers ## # Maps host:port to an HTTP version. This allows us to enable version # specific features. attr_reader :http_versions ## # Maximum time an unused connection can remain idle before being # automatically closed. attr_accessor :idle_timeout ## # Maximum number of requests on a connection before it is considered expired # and automatically closed. attr_accessor :max_requests ## # The value sent in the Keep-Alive header. Defaults to 30. Not needed for # HTTP/1.1 servers. # # This may not work correctly for HTTP/1.0 servers # # This method may be removed in a future version as RFC 2616 does not # require this header. attr_accessor :keep_alive ## # A name for this connection. Allows you to keep your connections apart # from everybody else's. attr_reader :name ## # Seconds to wait until a connection is opened. See Net::HTTP#open_timeout attr_accessor :open_timeout ## # Headers that are added to every request using Net::HTTP#[]= attr_reader :override_headers ## # This client's SSL private key attr_reader :private_key # For Net::HTTP parity alias key private_key ## # The URL through which requests will be proxied attr_reader :proxy_uri ## # List of host suffixes which will not be proxied attr_reader :no_proxy ## # Seconds to wait until reading one block. See Net::HTTP#read_timeout attr_accessor :read_timeout ## # Where this instance's request counts live in the thread local variables attr_reader :request_key # :nodoc: ## # By default SSL sessions are reused to avoid extra SSL handshakes. Set # this to false if you have problems communicating with an HTTPS server # like: # # SSL_connect [...] read finished A: unexpected message (OpenSSL::SSL::SSLError) attr_accessor :reuse_ssl_sessions ## # An array of options for Socket#setsockopt. # # By default the TCP_NODELAY option is set on sockets. # # To set additional options append them to this array: # # http.socket_options << [Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1] attr_reader :socket_options ## # Current SSL connection generation attr_reader :ssl_generation # :nodoc: ## # Where this instance's SSL connections live in the thread local variables attr_reader :ssl_generation_key # :nodoc: ## # SSL version to use. # # By default, the version will be negotiated automatically between client # and server. Ruby 1.9 and newer only. attr_reader :ssl_version if RUBY_VERSION > '1.9' ## # Where this instance's last-use times live in the thread local variables attr_reader :timeout_key # :nodoc: ## # SSL verification callback. Used when ca_file is set. attr_reader :verify_callback ## # HTTPS verify mode. Defaults to OpenSSL::SSL::VERIFY_PEER which verifies # the server certificate. # # If no ca_file or cert_store is set the default system certificate store is # used. # # You can use +verify_mode+ to override any default values. attr_reader :verify_mode ## # Enable retries of non-idempotent requests that change data (e.g. POST # requests) when the server has disconnected. # # This will in the worst case lead to multiple requests with the same data, # but it may be useful for some applications. Take care when enabling # this option to ensure it is safe to POST or perform other non-idempotent # requests to the server. attr_accessor :retry_change_requests ## # Creates a new Bundler::Persistent::Net::HTTP::Persistent. # # Set +name+ to keep your connections apart from everybody else's. Not # required currently, but highly recommended. Your library name should be # good enough. This parameter will be required in a future version. # # +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from # the environment. See proxy_from_env for details. # # In order to use a URI for the proxy you may need to do some extra work # beyond URI parsing if the proxy requires a password: # # proxy = URI 'http://proxy.example' # proxy.user = 'AzureDiamond' # proxy.password = 'hunter2' def initialize name = nil, proxy = nil @name = name @debug_output = nil @proxy_uri = nil @no_proxy = [] @headers = {} @override_headers = {} @http_versions = {} @keep_alive = 30 @open_timeout = nil @read_timeout = nil @idle_timeout = 5 @max_requests = nil @socket_options = [] @socket_options << [Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1] if Socket.const_defined? :TCP_NODELAY key = ['net_http_persistent', name].compact @generation_key = [key, 'generations' ].join('_').intern @ssl_generation_key = [key, 'ssl_generations'].join('_').intern @request_key = [key, 'requests' ].join('_').intern @timeout_key = [key, 'timeouts' ].join('_').intern @certificate = nil @ca_file = nil @private_key = nil @ssl_version = nil @verify_callback = nil @verify_mode = nil @cert_store = nil @generation = 0 # incremented when proxy URI changes @ssl_generation = 0 # incremented when SSL session variables change if HAVE_OPENSSL then @verify_mode = OpenSSL::SSL::VERIFY_PEER @reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session end @retry_change_requests = false @ruby_1 = RUBY_VERSION < '2' @retried_on_ruby_2 = !@ruby_1 self.proxy = proxy if proxy end ## # Sets this client's OpenSSL::X509::Certificate def certificate= certificate @certificate = certificate reconnect_ssl end # For Net::HTTP parity alias cert= certificate= ## # Sets the SSL certificate authority file. def ca_file= file @ca_file = file reconnect_ssl end ## # Overrides the default SSL certificate store used for verifying # connections. def cert_store= store @cert_store = store reconnect_ssl end ## # Finishes all connections on the given +thread+ that were created before # the given +generation+ in the threads +generation_key+ list. # # See #shutdown for a bunch of scary warning about misusing this method. def cleanup(generation, thread = Thread.current, generation_key = @generation_key) # :nodoc: timeouts = thread[@timeout_key] (0...generation).each do |old_generation| next unless thread[generation_key] conns = thread[generation_key].delete old_generation conns.each_value do |conn| finish conn, thread timeouts.delete conn.object_id if timeouts end if conns end end ## # Creates a new connection for +uri+ def connection_for uri Thread.current[@generation_key] ||= Hash.new { |h,k| h[k] = {} } Thread.current[@ssl_generation_key] ||= Hash.new { |h,k| h[k] = {} } Thread.current[@request_key] ||= Hash.new 0 Thread.current[@timeout_key] ||= Hash.new EPOCH use_ssl = uri.scheme.downcase == 'https' if use_ssl then raise Bundler::Persistent::Net::HTTP::Persistent::Error, 'OpenSSL is not available' unless HAVE_OPENSSL ssl_generation = @ssl_generation ssl_cleanup ssl_generation connections = Thread.current[@ssl_generation_key][ssl_generation] else generation = @generation cleanup generation connections = Thread.current[@generation_key][generation] end net_http_args = [uri.host, uri.port] connection_id = net_http_args.join ':' if @proxy_uri and not proxy_bypass? uri.host, uri.port then connection_id << @proxy_connection_id net_http_args.concat @proxy_args else net_http_args.concat [nil, nil, nil, nil] end connection = connections[connection_id] unless connection = connections[connection_id] then connections[connection_id] = http_class.new(*net_http_args) connection = connections[connection_id] ssl connection if use_ssl else reset connection if expired? connection end start connection unless connection.started? connection.read_timeout = @read_timeout if @read_timeout connection.keep_alive_timeout = @idle_timeout if @idle_timeout && connection.respond_to?(:keep_alive_timeout=) connection rescue Errno::ECONNREFUSED address = connection.proxy_address || connection.address port = connection.proxy_port || connection.port raise Error, "connection refused: #{address}:#{port}" rescue Errno::EHOSTDOWN address = connection.proxy_address || connection.address port = connection.proxy_port || connection.port raise Error, "host down: #{address}:#{port}" end ## # Returns an error message containing the number of requests performed on # this connection def error_message connection requests = Thread.current[@request_key][connection.object_id] - 1 # fixup last_use = Thread.current[@timeout_key][connection.object_id] age = Time.now - last_use "after #{requests} requests on #{connection.object_id}, " \ "last used #{age} seconds ago" end ## # URI::escape wrapper def escape str CGI.escape str if str end ## # URI::unescape wrapper def unescape str CGI.unescape str if str end ## # Returns true if the connection should be reset due to an idle timeout, or # maximum request count, false otherwise. def expired? connection requests = Thread.current[@request_key][connection.object_id] return true if @max_requests && requests >= @max_requests return false unless @idle_timeout return true if @idle_timeout.zero? last_used = Thread.current[@timeout_key][connection.object_id] Time.now - last_used > @idle_timeout end ## # Starts the Net::HTTP +connection+ def start connection connection.set_debug_output @debug_output if @debug_output connection.open_timeout = @open_timeout if @open_timeout connection.start socket = connection.instance_variable_get :@socket if socket then # for fakeweb @socket_options.each do |option| socket.io.setsockopt(*option) end end end ## # Finishes the Net::HTTP +connection+ def finish connection, thread = Thread.current if requests = thread[@request_key] then requests.delete connection.object_id end connection.finish rescue IOError end def http_class # :nodoc: if RUBY_VERSION > '2.0' then Net::HTTP elsif [:Artifice, :FakeWeb, :WebMock].any? { |klass| Object.const_defined?(klass) } or not @reuse_ssl_sessions then Net::HTTP else Bundler::Persistent::Net::HTTP::Persistent::SSLReuse end end ## # Returns the HTTP protocol version for +uri+ def http_version uri @http_versions["#{uri.host}:#{uri.port}"] end ## # Is +req+ idempotent according to RFC 2616? def idempotent? req case req when Net::HTTP::Delete, Net::HTTP::Get, Net::HTTP::Head, Net::HTTP::Options, Net::HTTP::Put, Net::HTTP::Trace then true end end ## # Is the request +req+ idempotent or is retry_change_requests allowed. # # If +retried_on_ruby_2+ is true, true will be returned if we are on ruby, # retry_change_requests is allowed and the request is not idempotent. def can_retry? req, retried_on_ruby_2 = false return @retry_change_requests && !idempotent?(req) if retried_on_ruby_2 @retry_change_requests || idempotent?(req) end if RUBY_VERSION > '1.9' then ## # Workaround for missing Net::HTTPHeader#connection_close? on Ruby 1.8 def connection_close? header header.connection_close? end ## # Workaround for missing Net::HTTPHeader#connection_keep_alive? on Ruby 1.8 def connection_keep_alive? header header.connection_keep_alive? end else ## # Workaround for missing Net::HTTPRequest#connection_close? on Ruby 1.8 def connection_close? header header['connection'] =~ /close/ or header['proxy-connection'] =~ /close/ end ## # Workaround for missing Net::HTTPRequest#connection_keep_alive? on Ruby # 1.8 def connection_keep_alive? header header['connection'] =~ /keep-alive/ or header['proxy-connection'] =~ /keep-alive/ end end ## # Deprecated in favor of #expired? def max_age # :nodoc: return Time.now + 1 unless @idle_timeout Time.now - @idle_timeout end ## # Adds "http://" to the String +uri+ if it is missing. def normalize_uri uri (uri =~ /^https?:/) ? uri : "http://#{uri}" end ## # Pipelines +requests+ to the HTTP server at +uri+ yielding responses if a # block is given. Returns all responses received. # # See # Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html] # for further details. # # Only if net-http-pipeline was required before # net-http-persistent #pipeline will be present. def pipeline uri, requests, &block # :yields: responses connection = connection_for uri connection.pipeline requests, &block end ## # Sets this client's SSL private key def private_key= key @private_key = key reconnect_ssl end # For Net::HTTP parity alias key= private_key= ## # Sets the proxy server. The +proxy+ may be the URI of the proxy server, # the symbol +:ENV+ which will read the proxy from the environment or nil to # disable use of a proxy. See #proxy_from_env for details on setting the # proxy from the environment. # # If the proxy URI is set after requests have been made, the next request # will shut-down and re-open all connections. # # The +no_proxy+ query parameter can be used to specify hosts which shouldn't # be reached via proxy; if set it should be a comma separated list of # hostname suffixes, optionally with +:port+ appended, for example # example.com,some.host:8080. def proxy= proxy @proxy_uri = case proxy when :ENV then proxy_from_env when URI::HTTP then proxy when nil then # ignore else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP' end @no_proxy.clear if @proxy_uri then @proxy_args = [ @proxy_uri.host, @proxy_uri.port, unescape(@proxy_uri.user), unescape(@proxy_uri.password), ] @proxy_connection_id = [nil, *@proxy_args].join ':' if @proxy_uri.query then @no_proxy = CGI.parse(@proxy_uri.query)['no_proxy'].join(',').downcase.split(',').map { |x| x.strip }.reject { |x| x.empty? } end end reconnect reconnect_ssl end ## # Creates a URI for an HTTP proxy server from ENV variables. # # If +HTTP_PROXY+ is set a proxy will be returned. # # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the URI is given the # indicated user and password unless HTTP_PROXY contains either of these in # the URI. # # The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't # be reached via proxy; if set it should be a comma separated list of # hostname suffixes, optionally with +:port+ appended, for example # example.com,some.host:8080. When set to * no proxy will # be returned. # # For Windows users, lowercase ENV variables are preferred over uppercase ENV # variables. def proxy_from_env env_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY'] return nil if env_proxy.nil? or env_proxy.empty? uri = URI normalize_uri env_proxy env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY'] # '*' is special case for always bypass return nil if env_no_proxy == '*' if env_no_proxy then uri.query = "no_proxy=#{escape(env_no_proxy)}" end unless uri.user or uri.password then uri.user = escape ENV['http_proxy_user'] || ENV['HTTP_PROXY_USER'] uri.password = escape ENV['http_proxy_pass'] || ENV['HTTP_PROXY_PASS'] end uri end ## # Returns true when proxy should by bypassed for host. def proxy_bypass? host, port host = host.downcase host_port = [host, port].join ':' @no_proxy.each do |name| return true if host[-name.length, name.length] == name or host_port[-name.length, name.length] == name end false end ## # Forces reconnection of HTTP connections. def reconnect @generation += 1 end ## # Forces reconnection of SSL connections. def reconnect_ssl @ssl_generation += 1 end ## # Finishes then restarts the Net::HTTP +connection+ def reset connection Thread.current[@request_key].delete connection.object_id Thread.current[@timeout_key].delete connection.object_id finish connection start connection rescue Errno::ECONNREFUSED e = Error.new "connection refused: #{connection.address}:#{connection.port}" e.set_backtrace $@ raise e rescue Errno::EHOSTDOWN e = Error.new "host down: #{connection.address}:#{connection.port}" e.set_backtrace $@ raise e end ## # Makes a request on +uri+. If +req+ is nil a Net::HTTP::Get is performed # against +uri+. # # If a block is passed #request behaves like Net::HTTP#request (the body of # the response will not have been read). # # +req+ must be a Net::HTTPRequest subclass (see Net::HTTP for a list). # # If there is an error and the request is idempotent according to RFC 2616 # it will be retried automatically. def request uri, req = nil, &block retried = false bad_response = false req = request_setup req || uri connection = connection_for uri connection_id = connection.object_id begin Thread.current[@request_key][connection_id] += 1 response = connection.request req, &block if connection_close?(req) or (response.http_version <= '1.0' and not connection_keep_alive?(response)) or connection_close?(response) then connection.finish end rescue Net::HTTPBadResponse => e message = error_message connection finish connection raise Error, "too many bad responses #{message}" if bad_response or not can_retry? req bad_response = true retry rescue *RETRIED_EXCEPTIONS => e # retried on ruby 2 request_failed e, req, connection if retried or not can_retry? req, @retried_on_ruby_2 reset connection retried = true retry rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2 request_failed e, req, connection if retried or not can_retry? req reset connection retried = true retry rescue Exception => e finish connection raise ensure Thread.current[@timeout_key][connection_id] = Time.now end @http_versions["#{uri.host}:#{uri.port}"] ||= response.http_version response end ## # Raises an Error for +exception+ which resulted from attempting the request # +req+ on the +connection+. # # Finishes the +connection+. def request_failed exception, req, connection # :nodoc: due_to = "(due to #{exception.message} - #{exception.class})" message = "too many connection resets #{due_to} #{error_message connection}" finish connection raise Error, message, exception.backtrace end ## # Creates a GET request if +req_or_uri+ is a URI and adds headers to the # request. # # Returns the request. def request_setup req_or_uri # :nodoc: req = if URI === req_or_uri then Net::HTTP::Get.new req_or_uri.request_uri else req_or_uri end @headers.each do |pair| req.add_field(*pair) end @override_headers.each do |name, value| req[name] = value end unless req['Connection'] then req.add_field 'Connection', 'keep-alive' req.add_field 'Keep-Alive', @keep_alive end req end ## # Shuts down all connections for +thread+. # # Uses the current thread by default. # # If you've used Bundler::Persistent::Net::HTTP::Persistent across multiple threads you should # call this in each thread when you're done making HTTP requests. # # *NOTE*: Calling shutdown for another thread can be dangerous! # # If the thread is still using the connection it may cause an error! It is # best to call #shutdown in the thread at the appropriate time instead! def shutdown thread = Thread.current generation = reconnect cleanup generation, thread, @generation_key ssl_generation = reconnect_ssl cleanup ssl_generation, thread, @ssl_generation_key thread[@request_key] = nil thread[@timeout_key] = nil end ## # Shuts down all connections in all threads # # *NOTE*: THIS METHOD IS VERY DANGEROUS! # # Do not call this method if other threads are still using their # connections! Call #shutdown at the appropriate time instead! # # Use this method only as a last resort! def shutdown_in_all_threads Thread.list.each do |thread| shutdown thread end nil end ## # Enables SSL on +connection+ def ssl connection connection.use_ssl = true connection.ssl_version = @ssl_version if @ssl_version connection.verify_mode = @verify_mode if OpenSSL::SSL::VERIFY_PEER == OpenSSL::SSL::VERIFY_NONE and not Object.const_defined?(:I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG) then warn <<-WARNING !!!SECURITY WARNING!!! The SSL HTTP connection to: #{connection.address}:#{connection.port} !!!MAY NOT BE VERIFIED!!! On your platform your OpenSSL implementation is broken. There is no difference between the values of VERIFY_NONE and VERIFY_PEER. This means that attempting to verify the security of SSL connections may not work. This exposes you to man-in-the-middle exploits, snooping on the contents of your connection and other dangers to the security of your data. To disable this warning define the following constant at top-level in your application: I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG = nil WARNING end if @ca_file then connection.ca_file = @ca_file connection.verify_mode = OpenSSL::SSL::VERIFY_PEER connection.verify_callback = @verify_callback if @verify_callback end if @certificate and @private_key then connection.cert = @certificate connection.key = @private_key end connection.cert_store = if @cert_store then @cert_store else store = OpenSSL::X509::Store.new store.set_default_paths store end end ## # Finishes all connections that existed before the given SSL parameter # +generation+. def ssl_cleanup generation # :nodoc: cleanup generation, Thread.current, @ssl_generation_key end ## # SSL version to use def ssl_version= ssl_version @ssl_version = ssl_version reconnect_ssl end if RUBY_VERSION > '1.9' ## # Sets the HTTPS verify mode. Defaults to OpenSSL::SSL::VERIFY_PEER. # # Setting this to VERIFY_NONE is a VERY BAD IDEA and should NEVER be used. # Securely transfer the correct certificate and update the default # certificate store or set the ca file instead. def verify_mode= verify_mode @verify_mode = verify_mode reconnect_ssl end ## # SSL verification callback. def verify_callback= callback @verify_callback = callback reconnect_ssl end end require 'bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse' bundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/0000755000175000017500000000000013217261023030156 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb0000644000175000017500000001001013217261023032477 0ustar samuelophsamueloph## # This Net::HTTP subclass adds SSL session reuse and Server Name Indication # (SNI) RFC 3546. # # DO NOT DEPEND UPON THIS CLASS # # This class is an implementation detail and is subject to change or removal # at any time. class Bundler::Persistent::Net::HTTP::Persistent::SSLReuse < Net::HTTP @is_proxy_class = false @proxy_addr = nil @proxy_port = nil @proxy_user = nil @proxy_pass = nil def initialize address, port = nil # :nodoc: super @ssl_session = nil end ## # From ruby trunk r33086 including http://redmine.ruby-lang.org/issues/5341 def connect # :nodoc: D "opening connection to #{conn_address()}..." s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) } D "opened" if use_ssl? ssl_parameters = Hash.new iv_list = instance_variables SSL_ATTRIBUTES.each do |name| ivname = "@#{name}".intern if iv_list.include?(ivname) and value = instance_variable_get(ivname) ssl_parameters[name] = value end end unless @ssl_context then @ssl_context = OpenSSL::SSL::SSLContext.new @ssl_context.set_params(ssl_parameters) end s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context) s.sync_close = true end @socket = Net::BufferedIO.new(s) @socket.read_timeout = @read_timeout @socket.continue_timeout = @continue_timeout if @socket.respond_to? :continue_timeout @socket.debug_output = @debug_output if use_ssl? begin if proxy? @socket.writeline sprintf('CONNECT %s:%s HTTP/%s', @address, @port, HTTPVersion) @socket.writeline "Host: #{@address}:#{@port}" if proxy_user credential = ["#{proxy_user}:#{proxy_pass}"].pack('m') credential.delete!("\r\n") @socket.writeline "Proxy-Authorization: Basic #{credential}" end @socket.writeline '' Net::HTTPResponse.read_new(@socket).value end s.session = @ssl_session if @ssl_session # Server Name Indication (SNI) RFC 3546 s.hostname = @address if s.respond_to? :hostname= timeout(@open_timeout) { s.connect } if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE s.post_connection_check(@address) end @ssl_session = s.session rescue => exception D "Conn close because of connect error #{exception}" @socket.close if @socket and not @socket.closed? raise exception end end on_connect end if RUBY_VERSION > '1.9' ## # From ruby_1_8_7 branch r29865 including a modified # http://redmine.ruby-lang.org/issues/5341 def connect # :nodoc: D "opening connection to #{conn_address()}..." s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) } D "opened" if use_ssl? unless @ssl_context.verify_mode warn "warning: peer certificate won't be verified in this SSL session" @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE end s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context) s.sync_close = true end @socket = Net::BufferedIO.new(s) @socket.read_timeout = @read_timeout @socket.debug_output = @debug_output if use_ssl? if proxy? @socket.writeline sprintf('CONNECT %s:%s HTTP/%s', @address, @port, HTTPVersion) @socket.writeline "Host: #{@address}:#{@port}" if proxy_user credential = ["#{proxy_user}:#{proxy_pass}"].pack('m') credential.delete!("\r\n") @socket.writeline "Proxy-Authorization: Basic #{credential}" end @socket.writeline '' Net::HTTPResponse.read_new(@socket).value end s.session = @ssl_session if @ssl_session s.connect if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE s.post_connection_check(@address) end @ssl_session = s.session end on_connect end if RUBY_VERSION < '1.9' private :connect end bundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb0000644000175000017500000000122513217261023027567 0ustar samuelophsamuelophrequire 'net/protocol' ## # Aaron Patterson's monkeypatch (accepted into 1.9.1) to fix Net::HTTP's speed # problems. # # http://gist.github.com/251244 class Net::BufferedIO #:nodoc: alias :old_rbuf_fill :rbuf_fill def rbuf_fill if @io.respond_to? :read_nonblock then begin @rbuf << @io.read_nonblock(65536) rescue Errno::EWOULDBLOCK, Errno::EAGAIN => e retry if IO.select [@io], nil, nil, @read_timeout raise Timeout::Error, e.message end else # SSL sockets do not have read_nonblock timeout @read_timeout do @rbuf << @io.sysread(65536) end end end end if RUBY_VERSION < '1.9' bundler-1.16.1/lib/bundler/vendor/thor/0000755000175000017500000000000013217261023020456 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/vendor/molinillo/0000755000175000017500000000000013217261023021500 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/build_metadata.rb0000644000175000017500000000171313217261023021473 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # Represents metadata from when the Bundler gem was built. module BuildMetadata # begin ivars @built_at = "2017-12-21".freeze @git_commit_sha = "0034ef341".freeze @release = true # end ivars # A hash representation of the build metadata. def self.to_h { "Built At" => built_at, "Git SHA" => git_commit_sha, "Released Version" => release?, } end # A string representing the date the bundler gem was built. def self.built_at @built_at ||= Time.now.utc.strftime("%Y-%m-%d").freeze end # The SHA for the git commit the bundler gem was built from. def self.git_commit_sha @git_commit_sha ||= Dir.chdir(File.expand_path("..", __FILE__)) do `git rev-parse --short HEAD`.strip.freeze end end # Whether this is an official release build of Bundler. def self.release? @release end end end bundler-1.16.1/lib/bundler/cli/0000755000175000017500000000000013217261023016754 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/cli/package.rb0000644000175000017500000000270613217261023020701 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Package attr_reader :options def initialize(options) @options = options end def run Bundler.ui.level = "error" if options[:quiet] Bundler.settings.set_command_option_if_given :path, options[:path] Bundler.settings.set_command_option_if_given :cache_all_platforms, options["all-platforms"] Bundler.settings.set_command_option_if_given :cache_path, options["cache-path"] setup_cache_all install # TODO: move cache contents here now that all bundles are locked custom_path = Bundler.settings[:path] if options[:path] Bundler.load.cache(custom_path) end private def install require "bundler/cli/install" options = self.options.dup if Bundler.settings[:cache_all_platforms] options["local"] = false options["update"] = true end Bundler::CLI::Install.new(options).run end def setup_cache_all all = options.fetch(:all, Bundler.feature_flag.cache_command_is_package? || nil) Bundler.settings.set_command_option_if_given :cache_all, all if Bundler.definition.has_local_dependencies? && !Bundler.feature_flag.cache_all? Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want " \ "to package them as well, please pass the --all flag. This will be the default " \ "on Bundler 2.0." end end end end bundler-1.16.1/lib/bundler/cli/plugin.rb0000644000175000017500000000203613217261023020600 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_thor" module Bundler class CLI::Plugin < Thor desc "install PLUGINS", "Install the plugin from the source" long_desc <<-D Install plugins either from the rubygems source provided (with --source option) or from a git source provided with (--git option). If no sources are provided, it uses Gem.sources D method_option "source", :type => :string, :default => nil, :banner => "URL of the RubyGems source to fetch the plugin from" method_option "version", :type => :string, :default => nil, :banner => "The version of the plugin to fetch" method_option "git", :type => :string, :default => nil, :banner => "URL of the git repo to fetch from" method_option "branch", :type => :string, :default => nil, :banner => "The git branch to checkout" method_option "ref", :type => :string, :default => nil, :banner => "The git revision to check out" def install(*plugins) Bundler::Plugin.install(plugins, options) end end end bundler-1.16.1/lib/bundler/cli/check.rb0000644000175000017500000000235713217261023020365 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Check attr_reader :options def initialize(options) @options = options end def run Bundler.settings.set_command_option_if_given :path, options[:path] begin definition = Bundler.definition definition.validate_runtime! not_installed = definition.missing_specs rescue GemNotFound, VersionConflict Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies." Bundler.ui.warn "Install missing gems with `bundle install`." exit 1 end if not_installed.any? Bundler.ui.error "The following gems are missing" not_installed.each {|s| Bundler.ui.error " * #{s.name} (#{s.version})" } Bundler.ui.warn "Install missing gems with `bundle install`" exit 1 elsif !Bundler.default_lockfile.file? && Bundler.frozen? Bundler.ui.error "This bundle has been frozen, but there is no #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} present" exit 1 else Bundler.load.lock(:preserve_unknown_sections => true) unless options[:"dry-run"] Bundler.ui.info "The Gemfile's dependencies are satisfied" end end end end bundler-1.16.1/lib/bundler/cli/viz.rb0000644000175000017500000000207613217261023020116 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Viz attr_reader :options, :gem_name def initialize(options) @options = options end def run # make sure we get the right `graphviz`. There is also a `graphviz` # gem we're not built to support gem "ruby-graphviz" require "graphviz" options[:without] = options[:without].join(":").tr(" ", ":").split(":") output_file = File.expand_path(options[:file]) graph = Graph.new(Bundler.load, output_file, options[:version], options[:requirements], options[:format], options[:without]) graph.viz rescue LoadError => e Bundler.ui.error e.inspect Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:" Bundler.ui.warn "`gem install ruby-graphviz`" rescue StandardError => e raise unless e.message =~ /GraphViz not installed or dot not in PATH/ Bundler.ui.error e.message Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`." end end end bundler-1.16.1/lib/bundler/cli/lock.rb0000644000175000017500000000342313217261023020233 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Lock attr_reader :options def initialize(options) @options = options end def run unless Bundler.default_gemfile Bundler.ui.error "Unable to find a Gemfile to lock" exit 1 end print = options[:print] ui = Bundler.ui Bundler.ui = UI::Silent.new if print Bundler::Fetcher.disable_endpoint = options["full-index"] update = options[:update] if update.is_a?(Array) # unlocking specific gems Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update) update = { :gems => update, :lock_shared_dependencies => options[:conservative] } end definition = Bundler.definition(update) Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options) if options[:update] options["remove-platform"].each do |platform| definition.remove_platform(platform) end options["add-platform"].each do |platform_string| platform = Gem::Platform.new(platform_string) if platform.to_s == "unknown" Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \ "and adding it will likely lead to resolution errors" end definition.add_platform(platform) end if definition.platforms.empty? raise InvalidOption, "Removing all platforms from the bundle is not allowed" end definition.resolve_remotely! unless options[:local] if print puts definition.to_lock else file = options[:lockfile] file = file ? File.expand_path(file) : Bundler.default_lockfile puts "Writing lockfile to #{file}" definition.lock(file) end Bundler.ui = ui end end end bundler-1.16.1/lib/bundler/cli/common.rb0000644000175000017500000000666513217261023020606 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module CLI::Common def self.output_post_install_messages(messages) return if Bundler.settings["ignore_messages"] messages.to_a.each do |name, msg| print_post_install_message(name, msg) unless Bundler.settings["ignore_messages.#{name}"] end end def self.print_post_install_message(name, msg) Bundler.ui.confirm "Post-install message from #{name}:" Bundler.ui.info msg end def self.output_without_groups_message return if Bundler.settings[:without].empty? Bundler.ui.confirm without_groups_message end def self.without_groups_message groups = Bundler.settings[:without] group_list = [groups[0...-1].join(", "), groups[-1..-1]]. reject {|s| s.to_s.empty? }.join(" and ") group_str = (groups.size == 1) ? "group" : "groups" "Gems in the #{group_str} #{group_list} were not installed." end def self.select_spec(name, regex_match = nil) specs = [] regexp = Regexp.new(name) if regex_match Bundler.definition.specs.each do |spec| return spec if spec.name == name specs << spec if regexp && spec.name =~ regexp end case specs.count when 0 raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies) when 1 specs.first else ask_for_spec_from(specs) end rescue RegexpError raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies) end def self.ask_for_spec_from(specs) if !$stdout.tty? && ENV["BUNDLE_SPEC_RUN"].nil? raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies) end specs.each_with_index do |spec, index| Bundler.ui.info "#{index.succ} : #{spec.name}", true end Bundler.ui.info "0 : - exit -", true num = Bundler.ui.ask("> ").to_i num > 0 ? specs[num - 1] : nil end def self.gem_not_found_message(missing_gem_name, alternatives) require "bundler/similarity_detector" message = "Could not find gem '#{missing_gem_name}'." alternate_names = alternatives.map {|a| a.respond_to?(:name) ? a.name : a } suggestions = SimilarityDetector.new(alternate_names).similar_word_list(missing_gem_name) message += "\nDid you mean #{suggestions}?" if suggestions message end def self.ensure_all_gems_in_lockfile!(names, locked_gems = Bundler.locked_gems) locked_names = locked_gems.specs.map(&:name) names.-(locked_names).each do |g| raise GemNotFound, gem_not_found_message(g, locked_names) end end def self.configure_gem_version_promoter(definition, options) patch_level = patch_level_options(options) raise InvalidOption, "Provide only one of the following options: #{patch_level.join(", ")}" unless patch_level.length <= 1 definition.gem_version_promoter.tap do |gvp| gvp.level = patch_level.first || :major gvp.strict = options[:strict] || options["update-strict"] end end def self.patch_level_options(options) [:major, :minor, :patch].select {|v| options.keys.include?(v.to_s) } end def self.clean_after_install? clean = Bundler.settings[:clean] return clean unless clean.nil? clean ||= Bundler.feature_flag.auto_clean_without_path? && Bundler.settings[:path].nil? clean &&= !Bundler.use_system_gems? clean end end end bundler-1.16.1/lib/bundler/cli/outdated.rb0000644000175000017500000002102013217261023021105 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Outdated attr_reader :options, :gems def initialize(options, gems) @options = options @gems = gems end def run check_for_deployment_mode sources = Array(options[:source]) gems.each do |gem_name| Bundler::CLI::Common.select_spec(gem_name) end Bundler.definition.validate_runtime! current_specs = Bundler.ui.silence { Bundler.definition.resolve } current_dependencies = {} Bundler.ui.silence do Bundler.load.dependencies.each do |dep| current_dependencies[dep.name] = dep end end definition = if gems.empty? && sources.empty? # We're doing a full update Bundler.definition(true) else Bundler.definition(:gems => gems, :sources => sources) end Bundler::CLI::Common.configure_gem_version_promoter( Bundler.definition, options ) # the patch level options imply strict is also true. It wouldn't make # sense otherwise. strict = options[:strict] || Bundler::CLI::Common.patch_level_options(options).any? filter_options_patch = options.keys & %w[filter-major filter-minor filter-patch] definition_resolution = proc do options[:local] ? definition.resolve_with_cache! : definition.resolve_remotely! end if options[:parseable] Bundler.ui.silence(&definition_resolution) else definition_resolution.call end Bundler.ui.info "" outdated_gems_by_groups = {} outdated_gems_list = [] # Loop through the current specs gemfile_specs, dependency_specs = current_specs.partition do |spec| current_dependencies.key? spec.name end (gemfile_specs + dependency_specs).sort_by(&:name).each do |current_spec| next if !gems.empty? && !gems.include?(current_spec.name) dependency = current_dependencies[current_spec.name] active_spec = retrieve_active_spec(strict, definition, current_spec) next if active_spec.nil? if filter_options_patch.any? update_present = update_present_via_semver_portions(current_spec, active_spec, options) next unless update_present end gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version) next unless gem_outdated || (current_spec.git_version != active_spec.git_version) groups = nil if dependency && !options[:parseable] groups = dependency.groups.join(", ") end outdated_gems_list << { :active_spec => active_spec, :current_spec => current_spec, :dependency => dependency, :groups => groups } outdated_gems_by_groups[groups] ||= [] outdated_gems_by_groups[groups] << { :active_spec => active_spec, :current_spec => current_spec, :dependency => dependency, :groups => groups } end if outdated_gems_list.empty? display_nothing_outdated_message(filter_options_patch) else unless options[:parseable] if options[:pre] Bundler.ui.info "Outdated gems included in the bundle (including " \ "pre-releases):" else Bundler.ui.info "Outdated gems included in the bundle:" end end options_include_groups = [:group, :groups].select do |v| options.keys.include?(v.to_s) end if options_include_groups.any? ordered_groups = outdated_gems_by_groups.keys.compact.sort [nil, ordered_groups].flatten.each do |groups| gems = outdated_gems_by_groups[groups] contains_group = if groups groups.split(",").include?(options[:group]) else options[:group] == "group" end next if (!options[:groups] && !contains_group) || gems.nil? unless options[:parseable] if groups Bundler.ui.info "===== Group #{groups} =====" else Bundler.ui.info "===== Without group =====" end end gems.each do |gem| print_gem( gem[:current_spec], gem[:active_spec], gem[:dependency], groups, options_include_groups.any? ) end end else outdated_gems_list.each do |gem| print_gem( gem[:current_spec], gem[:active_spec], gem[:dependency], gem[:groups], options_include_groups.any? ) end end exit 1 end end private def retrieve_active_spec(strict, definition, current_spec) if strict active_spec = definition.find_resolved_spec(current_spec) else active_specs = definition.find_indexed_specs(current_spec) if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1 active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? } end active_spec = active_specs.last end active_spec end def display_nothing_outdated_message(filter_options_patch) unless options[:parseable] if filter_options_patch.any? display = filter_options_patch.map do |o| o.sub("filter-", "") end.join(" or ") Bundler.ui.info "No #{display} updates to display.\n" else Bundler.ui.info "Bundle up to date!\n" end end end def print_gem(current_spec, active_spec, dependency, groups, options_include_groups) spec_version = "#{active_spec.version}#{active_spec.git_version}" spec_version += " (from #{active_spec.loaded_from})" if Bundler.ui.debug? && active_spec.loaded_from current_version = "#{current_spec.version}#{current_spec.git_version}" if dependency && dependency.specific? dependency_version = %(, requested #{dependency.requirement}) end spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, " \ "installed #{current_version}#{dependency_version})" output_message = if options[:parseable] spec_outdated_info.to_s elsif options_include_groups || !groups " * #{spec_outdated_info}" else " * #{spec_outdated_info} in groups \"#{groups}\"" end Bundler.ui.info output_message.rstrip end def check_for_deployment_mode return unless Bundler.frozen? suggested_command = if Bundler.settings.locations("frozen")[:global] "bundle config --delete frozen" elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any? "bundle config --delete deployment" else "bundle install --no-deployment" end raise ProductionError, "You are trying to check outdated gems in " \ "deployment mode. Run `bundle outdated` elsewhere.\n" \ "\nIf this is a development machine, remove the " \ "#{Bundler.default_gemfile} freeze" \ "\nby running `#{suggested_command}`." end def update_present_via_semver_portions(current_spec, active_spec, options) current_major = current_spec.version.segments.first active_major = active_spec.version.segments.first update_present = false update_present = active_major > current_major if options["filter-major"] if !update_present && (options["filter-minor"] || options["filter-patch"]) && current_major == active_major current_minor = get_version_semver_portion_value(current_spec, 1) active_minor = get_version_semver_portion_value(active_spec, 1) update_present = active_minor > current_minor if options["filter-minor"] if !update_present && options["filter-patch"] && current_minor == active_minor current_patch = get_version_semver_portion_value(current_spec, 2) active_patch = get_version_semver_portion_value(active_spec, 2) update_present = active_patch > current_patch end end update_present end def get_version_semver_portion_value(spec, version_portion_index) version_section = spec.version.segments[version_portion_index, 1] version_section.nil? ? 0 : (version_section.first || 0) end end end bundler-1.16.1/lib/bundler/cli/issue.rb0000644000175000017500000000237713217261023020442 0ustar samuelophsamueloph# frozen_string_literal: true require "rbconfig" module Bundler class CLI::Issue def run Bundler.ui.info <<-EOS.gsub(/^ {8}/, "") Did you find an issue with Bundler? Before filing a new issue, be sure to check out these resources: 1. Check out our troubleshooting guide for quick fixes to common issues: https://github.com/bundler/bundler/blob/master/doc/TROUBLESHOOTING.md 2. Instructions for common Bundler uses can be found on the documentation site: http://bundler.io/ 3. Information about each Bundler command can be found in the Bundler man pages: http://bundler.io/man/bundle.1.html Hopefully the troubleshooting steps above resolved your problem! If things still aren't working the way you expect them to, please let us know so that we can diagnose and help fix the problem you're having. Please view the Filing Issues guide for more information: https://github.com/bundler/bundler/blob/master/doc/contributing/ISSUES.md EOS Bundler.ui.info Bundler::Env.report Bundler.ui.info "\n## Bundle Doctor" doctor end def doctor require "bundler/cli/doctor" Bundler::CLI::Doctor.new({}).run end end end bundler-1.16.1/lib/bundler/cli/init.rb0000644000175000017500000000200613217261023020242 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Init attr_reader :options def initialize(options) @options = options end def run if File.exist?(gemfile) Bundler.ui.error "#{gemfile} already exists at #{File.expand_path(gemfile)}" exit 1 end if options[:gemspec] gemspec = File.expand_path(options[:gemspec]) unless File.exist?(gemspec) Bundler.ui.error "Gem specification #{gemspec} doesn't exist" exit 1 end spec = Bundler.load_gemspec_uncached(gemspec) File.open(gemfile, "wb") do |file| file << "# Generated from #{gemspec}\n" file << spec.to_gemfile end else FileUtils.cp(File.expand_path("../../templates/#{gemfile}", __FILE__), gemfile) end puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}" end private def gemfile @gemfile ||= Bundler.feature_flag.init_gems_rb? ? "gems.rb" : "Gemfile" end end end bundler-1.16.1/lib/bundler/cli/install.rb0000644000175000017500000002106013217261023020746 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Install attr_reader :options def initialize(options) @options = options end def run Bundler.ui.level = "error" if options[:quiet] warn_if_root normalize_groups Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD # Disable color in deployment mode Bundler.ui.shell = Thor::Shell::Basic.new if options[:deployment] check_for_options_conflicts check_trust_policy if options[:deployment] || options[:frozen] || Bundler.frozen? unless Bundler.default_lockfile.exist? flag = "--deployment flag" if options[:deployment] flag ||= "--frozen flag" if options[:frozen] flag ||= "deployment setting" raise ProductionError, "The #{flag} requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \ "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \ "before deploying." end options[:local] = true if Bundler.app_cache.exist? if Bundler.feature_flag.deployment_means_frozen? Bundler.settings.set_command_option :deployment, true else Bundler.settings.set_command_option :frozen, true end end # When install is called with --no-deployment, disable deployment mode if options[:deployment] == false Bundler.settings.set_command_option :frozen, nil options[:system] = true end normalize_settings Bundler::Fetcher.disable_endpoint = options["full-index"] if options["binstubs"] Bundler::SharedHelpers.major_deprecation 2, "The --binstubs option will be removed in favor of `bundle binstubs`" end Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins? definition = Bundler.definition definition.validate_runtime! installer = Installer.install(Bundler.root, definition, options) Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen? Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}." Bundler::CLI::Common.output_without_groups_message if Bundler.use_system_gems? Bundler.ui.confirm "Use `bundle info [gemname]` to see where a bundled gem is installed." else absolute_path = File.expand_path(Bundler.configured_bundle_path.base_path) relative_path = absolute_path.sub(File.expand_path(".") + File::SEPARATOR, "." + File::SEPARATOR) Bundler.ui.confirm "Bundled gems are installed into `#{relative_path}`" end Bundler::CLI::Common.output_post_install_messages installer.post_install_messages warn_ambiguous_gems if CLI::Common.clean_after_install? require "bundler/cli/clean" Bundler::CLI::Clean.new(options).run end rescue GemNotFound, VersionConflict => e if options[:local] && Bundler.app_cache.exist? Bundler.ui.warn "Some gems seem to be missing from your #{Bundler.settings.app_cache_path} directory." end unless Bundler.definition.has_rubygems_remotes? Bundler.ui.warn <<-WARN, :wrap => true Your Gemfile has no gem server sources. If you need gems that are \ not already on your machine, add a line like this to your Gemfile: source 'https://rubygems.org' WARN end raise e rescue Gem::InvalidSpecificationException => e Bundler.ui.warn "You have one or more invalid gemspecs that need to be fixed." raise e end private def warn_if_root return if Bundler.settings[:silence_root_warning] || Bundler::WINDOWS || !Process.uid.zero? Bundler.ui.warn "Don't run Bundler as root. Bundler can ask for sudo " \ "if it is needed, and installing your bundle as root will break this " \ "application for all non-root users on this machine.", :wrap => true end def dependencies_count_for(definition) count = definition.dependencies.count "#{count} Gemfile #{count == 1 ? "dependency" : "dependencies"}" end def gems_installed_for(definition) count = definition.specs.count "#{count} #{count == 1 ? "gem" : "gems"} now installed" end def check_for_group_conflicts_in_cli_options conflicting_groups = Array(options[:without]) & Array(options[:with]) return if conflicting_groups.empty? raise InvalidOption, "You can't list a group in both with and without." \ " The offending groups are: #{conflicting_groups.join(", ")}." end def check_for_options_conflicts if (options[:path] || options[:deployment]) && options[:system] error_message = String.new error_message << "You have specified both --path as well as --system. Please choose only one option.\n" if options[:path] error_message << "You have specified both --deployment as well as --system. Please choose only one option.\n" if options[:deployment] raise InvalidOption.new(error_message) end end def check_trust_policy trust_policy = options["trust-policy"] unless Bundler.rubygems.security_policies.keys.unshift(nil).include?(trust_policy) raise InvalidOption, "RubyGems doesn't know about trust policy '#{trust_policy}'. " \ "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}." end Bundler.settings.set_command_option_if_given :"trust-policy", trust_policy end def normalize_groups options[:with] &&= options[:with].join(":").tr(" ", ":").split(":") options[:without] &&= options[:without].join(":").tr(" ", ":").split(":") check_for_group_conflicts_in_cli_options Bundler.settings.set_command_option :with, nil if options[:with] == [] Bundler.settings.set_command_option :without, nil if options[:without] == [] with = options.fetch(:with, []) with |= Bundler.settings[:with].map(&:to_s) with -= options[:without] if options[:without] without = options.fetch(:without, []) without |= Bundler.settings[:without].map(&:to_s) without -= options[:with] if options[:with] options[:with] = with options[:without] = without end def normalize_settings Bundler.settings.set_command_option :path, nil if options[:system] Bundler.settings.set_command_option :path, "vendor/bundle" if options[:deployment] Bundler.settings.set_command_option_if_given :path, options["path"] Bundler.settings.set_command_option :path, "bundle" if options["standalone"] && Bundler.settings[:path].nil? bin_option = options["binstubs"] bin_option = nil if bin_option && bin_option.empty? Bundler.settings.set_command_option :bin, bin_option if options["binstubs"] Bundler.settings.set_command_option_if_given :shebang, options["shebang"] Bundler.settings.set_command_option_if_given :jobs, options["jobs"] Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"] Bundler.settings.set_command_option_if_given :no_install, options["no-install"] Bundler.settings.set_command_option_if_given :clean, options["clean"] unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with] # need to nil them out first to get around validation for backwards compatibility Bundler.settings.set_command_option :without, nil Bundler.settings.set_command_option :with, nil Bundler.settings.set_command_option :without, options[:without] - options[:with] Bundler.settings.set_command_option :with, options[:with] end options[:force] = options[:redownload] end def warn_ambiguous_gems Installer.ambiguous_gems.to_a.each do |name, installed_from_uri, *also_found_in_uris| Bundler.ui.error "Warning: the gem '#{name}' was found in multiple sources." Bundler.ui.error "Installed from: #{installed_from_uri}" Bundler.ui.error "Also found in:" also_found_in_uris.each {|uri| Bundler.ui.error " * #{uri}" } Bundler.ui.error "You should add a source requirement to restrict this gem to your preferred source." Bundler.ui.error "For example:" Bundler.ui.error " gem '#{name}', :source => '#{installed_from_uri}'" Bundler.ui.error "Then uninstall the gem '#{name}' (or delete all bundled gems) and then install again." end end end end bundler-1.16.1/lib/bundler/cli/config.rb0000644000175000017500000000643213217261023020553 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Config attr_reader :name, :options, :scope, :thor attr_accessor :args def initialize(options, args, thor) @options = options @args = args @thor = thor @name = peek = args.shift @scope = "global" return unless peek && peek.start_with?("--") @name = args.shift @scope = peek[2..-1] end def run unless name confirm_all return end unless valid_scope?(scope) Bundler.ui.error "Invalid scope --#{scope} given. Please use --local or --global." exit 1 end if scope == "delete" Bundler.settings.set_local(name, nil) Bundler.settings.set_global(name, nil) return end if args.empty? if options[:parseable] if value = Bundler.settings[name] Bundler.ui.info("#{name}=#{value}") end return end confirm(name) return end Bundler.ui.info(message) if message Bundler.settings.send("set_#{scope}", name, new_value) end private def confirm_all if @options[:parseable] thor.with_padding do Bundler.settings.all.each do |setting| val = Bundler.settings[setting] Bundler.ui.info "#{setting}=#{val}" end end else Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n" Bundler.settings.all.each do |setting| Bundler.ui.confirm "#{setting}" show_pretty_values_for(setting) Bundler.ui.confirm "" end end end def confirm(name) Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used" show_pretty_values_for(name) end def new_value pathname = Pathname.new(args.join(" ")) if name.start_with?("local.") && pathname.directory? pathname.expand_path.to_s else args.join(" ") end end def message locations = Bundler.settings.locations(name) if @options[:parseable] "#{name}=#{new_value}" if new_value elsif scope == "global" if locations[:local] "Your application has set #{name} to #{locations[:local].inspect}. " \ "This will override the global value you are currently setting" elsif locations[:env] "You have a bundler environment variable for #{name} set to " \ "#{locations[:env].inspect}. This will take precedence over the global value you are setting" elsif locations[:global] && locations[:global] != args.join(" ") "You are replacing the current global value of #{name}, which is currently " \ "#{locations[:global].inspect}" end elsif scope == "local" && locations[:local] != args.join(" ") "You are replacing the current local value of #{name}, which is currently " \ "#{locations[:local].inspect}" end end def show_pretty_values_for(setting) thor.with_padding do Bundler.settings.pretty_values_for(setting).each do |line| Bundler.ui.info line end end end def valid_scope?(scope) %w[delete local global].include?(scope) end end end bundler-1.16.1/lib/bundler/cli/add.rb0000644000175000017500000000156513217261023020040 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Add def initialize(options, gem_name) @gem_name = gem_name @options = options @options[:group] = @options[:group].split(",").map(&:strip) if !@options[:group].nil? && !@options[:group].empty? end def run version = @options[:version].nil? ? nil : @options[:version].split(",").map(&:strip) unless version.nil? version.each do |v| raise InvalidOption, "Invalid gem requirement pattern '#{v}'" unless Gem::Requirement::PATTERN =~ v.to_s end end dependency = Bundler::Dependency.new(@gem_name, version, @options) Injector.inject([dependency], :conservative_versioning => @options[:version].nil?) # Perform conservative versioning only when version is not specified Installer.install(Bundler.root, Bundler.definition) end end end bundler-1.16.1/lib/bundler/cli/cache.rb0000644000175000017500000000211413217261023020342 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Cache attr_reader :options def initialize(options) @options = options end def run Bundler.definition.validate_runtime! Bundler.definition.resolve_with_cache! setup_cache_all Bundler.settings.set_command_option_if_given :cache_all_platforms, options["all-platforms"] Bundler.load.cache Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"] Bundler.load.lock rescue GemNotFound => e Bundler.ui.error(e.message) Bundler.ui.warn "Run `bundle install` to install missing gems." exit 1 end private def setup_cache_all Bundler.settings.set_command_option_if_given :cache_all, options[:all] if Bundler.definition.has_local_dependencies? && !Bundler.feature_flag.cache_all? Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want " \ "to package them as well, please pass the --all flag. This will be the default " \ "on Bundler 2.0." end end end end bundler-1.16.1/lib/bundler/cli/gem.rb0000644000175000017500000002061113217261023020051 0ustar samuelophsamueloph# frozen_string_literal: true require "pathname" module Bundler class CLI Bundler.require_thor_actions include Thor::Actions end class CLI::Gem TEST_FRAMEWORK_VERSIONS = { "rspec" => "3.0", "minitest" => "5.0" }.freeze attr_reader :options, :gem_name, :thor, :name, :target def initialize(options, gem_name, thor) @options = options @gem_name = resolve_name(gem_name) @thor = thor thor.behavior = :invoke thor.destination_root = nil @name = @gem_name @target = SharedHelpers.pwd.join(gem_name) validate_ext_name if options[:ext] end def run Bundler.ui.confirm "Creating gem '#{name}'..." underscored_name = name.tr("-", "_") namespaced_path = name.tr("-", "/") constant_name = name.gsub(/-[_-]*(?![_-]|$)/) { "::" }.gsub(/([_-]+|(::)|^)(.|$)/) { $2.to_s + $3.upcase } constant_array = constant_name.split("::") git_installed = Bundler.git_present? git_author_name = git_installed ? `git config user.name`.chomp : "" github_username = git_installed ? `git config github.user`.chomp : "" git_user_email = git_installed ? `git config user.email`.chomp : "" config = { :name => name, :underscored_name => underscored_name, :namespaced_path => namespaced_path, :makefile_path => "#{underscored_name}/#{underscored_name}", :constant_name => constant_name, :constant_array => constant_array, :author => git_author_name.empty? ? "TODO: Write your name" : git_author_name, :email => git_user_email.empty? ? "TODO: Write your email address" : git_user_email, :test => options[:test], :ext => options[:ext], :exe => options[:exe], :bundler_version => bundler_dependency_version, :github_username => github_username.empty? ? "[USERNAME]" : github_username } ensure_safe_gem_name(name, constant_array) templates = { "Gemfile.tt" => "Gemfile", "lib/newgem.rb.tt" => "lib/#{namespaced_path}.rb", "lib/newgem/version.rb.tt" => "lib/#{namespaced_path}/version.rb", "newgem.gemspec.tt" => "#{name}.gemspec", "Rakefile.tt" => "Rakefile", "README.md.tt" => "README.md", "bin/console.tt" => "bin/console", "bin/setup.tt" => "bin/setup" } executables = %w[ bin/console bin/setup ] templates.merge!("gitignore.tt" => ".gitignore") if Bundler.git_present? if test_framework = ask_and_set_test_framework config[:test] = test_framework config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework] templates.merge!("travis.yml.tt" => ".travis.yml") case test_framework when "rspec" templates.merge!( "rspec.tt" => ".rspec", "spec/spec_helper.rb.tt" => "spec/spec_helper.rb", "spec/newgem_spec.rb.tt" => "spec/#{namespaced_path}_spec.rb" ) when "minitest" templates.merge!( "test/test_helper.rb.tt" => "test/test_helper.rb", "test/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb" ) end end config[:test_task] = config[:test] == "minitest" ? "test" : "spec" if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?", "This means that any other developer or company will be legally allowed to use your code " \ "for free as long as they admit you created it. You can read more about the MIT license " \ "at http://choosealicense.com/licenses/mit.") config[:mit] = true Bundler.ui.info "MIT License enabled in config" templates.merge!("LICENSE.txt.tt" => "LICENSE.txt") end if ask_and_set(:coc, "Do you want to include a code of conduct in gems you generate?", "Codes of conduct can increase contributions to your project by contributors who " \ "prefer collaborative, safe spaces. You can read more about the code of conduct at " \ "contributor-covenant.org. Having a code of conduct means agreeing to the responsibility " \ "of enforcing it, so be sure that you are prepared to do that. Be sure that your email " \ "address is specified as a contact in the generated code of conduct so that people know " \ "who to contact in case of a violation. For suggestions about " \ "how to enforce codes of conduct, see http://bit.ly/coc-enforcement.") config[:coc] = true Bundler.ui.info "Code of conduct enabled in config" templates.merge!("CODE_OF_CONDUCT.md.tt" => "CODE_OF_CONDUCT.md") end templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe] if options[:ext] templates.merge!( "ext/newgem/extconf.rb.tt" => "ext/#{name}/extconf.rb", "ext/newgem/newgem.h.tt" => "ext/#{name}/#{underscored_name}.h", "ext/newgem/newgem.c.tt" => "ext/#{name}/#{underscored_name}.c" ) end templates.each do |src, dst| destination = target.join(dst) SharedHelpers.filesystem_access(destination) do thor.template("newgem/#{src}", destination, config) end end executables.each do |file| SharedHelpers.filesystem_access(target.join(file)) do |path| executable = (path.stat.mode | 0o111) path.chmod(executable) end end if Bundler.git_present? Bundler.ui.info "Initializing git repo in #{target}" Dir.chdir(target) do `git init` `git add .` end end # Open gemspec in editor open_editor(options["edit"], target.join("#{name}.gemspec")) if options[:edit] rescue Errno::EEXIST => e raise GenericSystemCallError.new(e, "There was a conflict while creating the new gem.") end private def resolve_name(name) SharedHelpers.pwd.join(name).basename.to_s end def ask_and_set(key, header, message) choice = options[key] choice = Bundler.settings["gem.#{key}"] if choice.nil? if choice.nil? Bundler.ui.confirm header choice = Bundler.ui.yes? "#{message} y/(n):" Bundler.settings.set_global("gem.#{key}", choice) end choice end def validate_ext_name return unless gem_name.index("-") Bundler.ui.error "You have specified a gem name which does not conform to the \n" \ "naming guidelines for C extensions. For more information, \n" \ "see the 'Extension Naming' section at the following URL:\n" \ "http://guides.rubygems.org/gems-with-extensions/\n" exit 1 end def ask_and_set_test_framework test_framework = options[:test] || Bundler.settings["gem.test"] if test_framework.nil? Bundler.ui.confirm "Do you want to generate tests with your gem?" result = Bundler.ui.ask "Type 'rspec' or 'minitest' to generate those test files now and " \ "in the future. rspec/minitest/(none):" if result =~ /rspec|minitest/ test_framework = result else test_framework = false end end if Bundler.settings["gem.test"].nil? Bundler.settings.set_global("gem.test", test_framework) end test_framework end def bundler_dependency_version v = Gem::Version.new(Bundler::VERSION) req = v.segments[0..1] req << "a" if v.prerelease? req.join(".") end def ensure_safe_gem_name(name, constant_array) if name =~ /^\d/ Bundler.ui.error "Invalid gem name #{name} Please give a name which does not start with numbers." exit 1 end constant_name = constant_array.join("::") existing_constant = constant_array.inject(Object) do |c, s| defined = begin c.const_defined?(s) rescue NameError Bundler.ui.error "Invalid gem name #{name} -- `#{constant_name}` is an invalid constant name" exit 1 end (defined && c.const_get(s)) || break end return unless existing_constant Bundler.ui.error "Invalid gem name #{name} constant #{constant_name} is already in use. Please choose another gem name." exit 1 end def open_editor(editor, file) thor.run(%(#{editor} "#{file}")) end end end bundler-1.16.1/lib/bundler/cli/show.rb0000644000175000017500000000432713217261023020267 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Show attr_reader :options, :gem_name, :latest_specs def initialize(options, gem_name) @options = options @gem_name = gem_name @verbose = options[:verbose] || options[:outdated] @latest_specs = fetch_latest_specs if @verbose end def run Bundler.ui.silence do Bundler.definition.validate_runtime! Bundler.load.lock end if gem_name if gem_name == "bundler" path = File.expand_path("../../../..", __FILE__) else spec = Bundler::CLI::Common.select_spec(gem_name, :regex_match) return unless spec path = spec.full_gem_path unless File.directory?(path) Bundler.ui.warn "The gem #{gem_name} has been deleted. It was installed at:" end end return Bundler.ui.info(path) end if options[:paths] Bundler.load.specs.sort_by(&:name).map do |s| Bundler.ui.info s.full_gem_path end else Bundler.ui.info "Gems included by the bundle:" Bundler.load.specs.sort_by(&:name).each do |s| desc = " * #{s.name} (#{s.version}#{s.git_version})" if @verbose latest = latest_specs.find {|l| l.name == s.name } Bundler.ui.info <<-END.gsub(/^ +/, "") #{desc} \tSummary: #{s.summary || "No description available."} \tHomepage: #{s.homepage || "No website available."} \tStatus: #{outdated?(s, latest) ? "Outdated - #{s.version} < #{latest.version}" : "Up to date"} END else Bundler.ui.info desc end end end end private def fetch_latest_specs definition = Bundler.definition(true) if options[:outdated] Bundler.ui.info "Fetching remote specs for outdated check...\n\n" Bundler.ui.silence { definition.resolve_remotely! } else definition.resolve_with_cache! end Bundler.reset! definition.specs end def outdated?(current, latest) return false unless latest Gem::Version.new(current.version) < Gem::Version.new(latest.version) end end end bundler-1.16.1/lib/bundler/cli/list.rb0000644000175000017500000000117513217261023020260 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::List def initialize(options) @options = options end def run specs = Bundler.load.specs.reject {|s| s.name == "bundler" }.sort_by(&:name) return specs.each {|s| Bundler.ui.info s.name } if @options["name-only"] return Bundler.ui.info "No gems in the Gemfile" if specs.empty? Bundler.ui.info "Gems included by the bundle:" specs.each do |s| Bundler.ui.info " * #{s.name} (#{s.version}#{s.git_version})" end Bundler.ui.info "Use `bundle info` to print more detailed information about a gem" end end end bundler-1.16.1/lib/bundler/cli/update.rb0000644000175000017500000000645413217261023020574 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Update attr_reader :options, :gems def initialize(options, gems) @options = options @gems = gems end def run Bundler.ui.level = "error" if options[:quiet] Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins? sources = Array(options[:source]) groups = Array(options[:group]).map(&:to_sym) full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !options[:bundler] if full_update && !options[:all] if Bundler.feature_flag.update_requires_all_flag? raise InvalidOption, "To update everything, pass the `--all` flag." end SharedHelpers.major_deprecation 2, "Pass --all to `bundle update` to update everything" elsif !full_update && options[:all] raise InvalidOption, "Cannot specify --all along with specific options." end if full_update # We're doing a full update Bundler.definition(true) else unless Bundler.default_lockfile.exist? raise GemfileLockNotFound, "This Bundle hasn't been installed yet. " \ "Run `bundle install` to update and install the bundled gems." end Bundler::CLI::Common.ensure_all_gems_in_lockfile!(gems) if groups.any? specs = Bundler.definition.specs_for groups gems.concat(specs.map(&:name)) end Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby], :lock_shared_dependencies => options[:conservative], :bundler => options[:bundler]) end Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options) Bundler::Fetcher.disable_endpoint = options["full-index"] opts = options.dup opts["update"] = true opts["local"] = options[:local] Bundler.settings.set_command_option_if_given :jobs, opts["jobs"] Bundler.definition.validate_runtime! installer = Installer.install Bundler.root, Bundler.definition, opts Bundler.load.cache if Bundler.app_cache.exist? if CLI::Common.clean_after_install? require "bundler/cli/clean" Bundler::CLI::Clean.new(options).run end if locked_gems = Bundler.definition.locked_gems gems.each do |name| locked_version = locked_gems.specs.find {|s| s.name == name } locked_version &&= locked_version.version next unless locked_version new_version = Bundler.definition.specs[name].first new_version &&= new_version.version if !new_version Bundler.ui.warn "Bundler attempted to update #{name} but it was removed from the bundle" elsif new_version < locked_version Bundler.ui.warn "Bundler attempted to update #{name} but its version regressed from #{locked_version} to #{new_version}" elsif new_version == locked_version Bundler.ui.warn "Bundler attempted to update #{name} but its version stayed the same" end end end Bundler.ui.confirm "Bundle updated!" Bundler::CLI::Common.output_without_groups_message Bundler::CLI::Common.output_post_install_messages installer.post_install_messages end end end bundler-1.16.1/lib/bundler/cli/info.rb0000644000175000017500000000275313217261023020243 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Info attr_reader :gem_name, :options def initialize(options, gem_name) @options = options @gem_name = gem_name end def run spec = spec_for_gem(gem_name) spec_not_found(gem_name) unless spec return print_gem_path(spec) if @options[:path] print_gem_info(spec) end private def spec_for_gem(gem_name) spec = Bundler.definition.specs.find {|s| s.name == gem_name } spec || default_gem_spec(gem_name) end def default_gem_spec(gem_name) return unless Gem::Specification.respond_to?(:find_all_by_name) gem_spec = Gem::Specification.find_all_by_name(gem_name).last return gem_spec if gem_spec && gem_spec.respond_to?(:default_gem?) && gem_spec.default_gem? end def spec_not_found(gem_name) raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(gem_name, Bundler.definition.dependencies) end def print_gem_path(spec) Bundler.ui.info spec.full_gem_path end def print_gem_info(spec) gem_info = String.new gem_info << " * #{spec.name} (#{spec.version}#{spec.git_version})\n" gem_info << "\tSummary: #{spec.summary}\n" if spec.summary gem_info << "\tHomepage: #{spec.homepage}\n" if spec.homepage gem_info << "\tPath: #{spec.full_gem_path}\n" gem_info << "\tDefault Gem: yes" if spec.respond_to?(:default_gem?) && spec.default_gem? Bundler.ui.info gem_info end end end bundler-1.16.1/lib/bundler/cli/open.rb0000644000175000017500000000140313217261023020240 0ustar samuelophsamueloph# frozen_string_literal: true require "shellwords" module Bundler class CLI::Open attr_reader :options, :name def initialize(options, name) @options = options @name = name end def run editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? } return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match) path = spec.full_gem_path Dir.chdir(path) do command = Shellwords.split(editor) + [path] Bundler.with_original_env do system(*command) end || Bundler.ui.info("Could not run '#{command.join(" ")}'") end end end end bundler-1.16.1/lib/bundler/cli/inject.rb0000644000175000017500000000416513217261023020563 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Inject attr_reader :options, :name, :version, :group, :source, :gems def initialize(options, name, version) @options = options @name = name @version = version || last_version_number @group = options[:group].split(",") unless options[:group].nil? @source = options[:source] @gems = [] end def run # The required arguments allow Thor to give useful feedback when the arguments # are incorrect. This adds those first two arguments onto the list as a whole. gems.unshift(source).unshift(group).unshift(version).unshift(name) # Build an array of Dependency objects out of the arguments deps = [] # when `inject` support addition of more than one gem, then this loop will # help. Currently this loop is running once. gems.each_slice(4) do |gem_name, gem_version, gem_group, gem_source| ops = Gem::Requirement::OPS.map {|key, _val| key } has_op = ops.any? {|op| gem_version.start_with? op } gem_version = "~> #{gem_version}" unless has_op deps << Bundler::Dependency.new(gem_name, gem_version, "group" => gem_group, "source" => gem_source) end added = Injector.inject(deps, options) if added.any? Bundler.ui.confirm "Added to Gemfile:" Bundler.ui.confirm(added.map do |d| name = "'#{d.name}'" requirement = ", '#{d.requirement}'" group = ", :group => #{d.groups.inspect}" if d.groups != Array(:default) source = ", :source => '#{d.source}'" unless d.source.nil? %(gem #{name}#{requirement}#{group}#{source}) end.join("\n")) else Bundler.ui.confirm "All gems were already present in the Gemfile" end end private def last_version_number definition = Bundler.definition(true) definition.resolve_remotely! specs = definition.index[name].sort_by(&:version) unless options[:pre] specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? } end spec = specs.last spec.version.to_s end end end bundler-1.16.1/lib/bundler/cli/exec.rb0000644000175000017500000000576313217261023020240 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/current_ruby" module Bundler class CLI::Exec attr_reader :options, :args, :cmd RESERVED_SIGNALS = %w[SEGV BUS ILL FPE VTALRM KILL STOP].freeze def initialize(options, args) @options = options @cmd = args.shift @args = args if Bundler.current_ruby.ruby_2? && !Bundler.current_ruby.jruby? @args << { :close_others => !options.keep_file_descriptors? } elsif options.keep_file_descriptors? Bundler.ui.warn "Ruby version #{RUBY_VERSION} defaults to keeping non-standard file descriptors on Kernel#exec." end end def run validate_cmd! SharedHelpers.set_bundle_environment if bin_path = Bundler.which(cmd) if !Bundler.settings[:disable_exec_load] && ruby_shebang?(bin_path) return kernel_load(bin_path, *args) end # First, try to exec directly to something in PATH if Bundler.current_ruby.jruby_18? kernel_exec(bin_path, *args) else kernel_exec([bin_path, cmd], *args) end else # exec using the given command kernel_exec(cmd, *args) end end private def validate_cmd! return unless cmd.nil? Bundler.ui.error "bundler: exec needs a command to run" exit 128 end def kernel_exec(*args) ui = Bundler.ui Bundler.ui = nil Kernel.exec(*args) rescue Errno::EACCES, Errno::ENOEXEC Bundler.ui = ui Bundler.ui.error "bundler: not executable: #{cmd}" exit 126 rescue Errno::ENOENT Bundler.ui = ui Bundler.ui.error "bundler: command not found: #{cmd}" Bundler.ui.warn "Install missing gem executables with `bundle install`" exit 127 end def kernel_load(file, *args) args.pop if args.last.is_a?(Hash) ARGV.replace(args) $0 = file Process.setproctitle(process_title(file, args)) if Process.respond_to?(:setproctitle) ui = Bundler.ui Bundler.ui = nil require "bundler/setup" signals = Signal.list.keys - RESERVED_SIGNALS signals.each {|s| trap(s, "DEFAULT") } Kernel.load(file) rescue SystemExit, SignalException raise rescue Exception => e # rubocop:disable Lint/RescueException Bundler.ui = ui Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})" backtrace = e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) } abort "#{e.class}: #{e.message}\n #{backtrace.join("\n ")}" end def process_title(file, args) "#{file} #{args.join(" ")}".strip end def ruby_shebang?(file) possibilities = [ "#!/usr/bin/env ruby\n", "#!/usr/bin/env jruby\n", "#!#{Gem.ruby}\n", ] if File.zero?(file) Bundler.ui.warn "#{file} is empty" return false end first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) } possibilities.any? {|shebang| first_line.start_with?(shebang) } end end end bundler-1.16.1/lib/bundler/cli/platform.rb0000644000175000017500000000260713217261023021132 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Platform attr_reader :options def initialize(options) @options = options end def run platforms, ruby_version = Bundler.ui.silence do locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string [Bundler.definition.platforms.map {|p| "* #{p}" }, locked_ruby_version || gemfile_ruby_version] end output = [] if options[:ruby] if ruby_version output << ruby_version else output << "No ruby version specified" end else output << "Your platform is: #{RUBY_PLATFORM}" output << "Your app has gems that work on these platforms:\n#{platforms.join("\n")}" if ruby_version output << "Your Gemfile specifies a Ruby version requirement:\n* #{ruby_version}" begin Bundler.definition.validate_runtime! output << "Your current platform satisfies the Ruby version requirement." rescue RubyVersionMismatch => e output << e.message end else output << "Your Gemfile does not specify a Ruby version requirement." end end Bundler.ui.info output.join("\n\n") end end end bundler-1.16.1/lib/bundler/cli/clean.rb0000644000175000017500000000113613217261023020364 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Clean attr_reader :options def initialize(options) @options = options end def run require_path_or_force unless options[:"dry-run"] Bundler.load.clean(options[:"dry-run"]) end protected def require_path_or_force return unless Bundler.use_system_gems? && !options[:force] raise InvalidOption, "Cleaning all the gems on your system is dangerous! " \ "If you're sure you want to remove every system gem not in this " \ "bundle, run `bundle clean --force`." end end end bundler-1.16.1/lib/bundler/cli/doctor.rb0000644000175000017500000000445213217261023020600 0ustar samuelophsamueloph# frozen_string_literal: true require "rbconfig" module Bundler class CLI::Doctor DARWIN_REGEX = /\s+(.+) \(compatibility / LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/ attr_reader :options def initialize(options) @options = options end def otool_available? Bundler.which("otool") end def ldd_available? Bundler.which("ldd") end def dylibs_darwin(path) output = `/usr/bin/otool -L "#{path}"`.chomp dylibs = output.split("\n")[1..-1].map {|l| l.match(DARWIN_REGEX).captures[0] }.uniq # ignore @rpath and friends dylibs.reject {|dylib| dylib.start_with? "@" } end def dylibs_ldd(path) output = `/usr/bin/ldd "#{path}"`.chomp output.split("\n").map do |l| match = l.match(LDD_REGEX) next if match.nil? match.captures[0] end.compact end def dylibs(path) case RbConfig::CONFIG["host_os"] when /darwin/ return [] unless otool_available? dylibs_darwin(path) when /(linux|solaris|bsd)/ return [] unless ldd_available? dylibs_ldd(path) else # Windows, etc. Bundler.ui.warn("Dynamic library check not supported on this platform.") [] end end def bundles_for_gem(spec) Dir.glob("#{spec.full_gem_path}/**/*.bundle") end def check! require "bundler/cli/check" Bundler::CLI::Check.new({}).run end def run Bundler.ui.level = "error" if options[:quiet] Bundler.settings.validate! check! definition = Bundler.definition broken_links = {} definition.specs.each do |spec| bundles_for_gem(spec).each do |bundle| bad_paths = dylibs(bundle).select {|f| !File.exist?(f) } if bad_paths.any? broken_links[spec] ||= [] broken_links[spec].concat(bad_paths) end end end if broken_links.any? message = "The following gems are missing OS dependencies:" broken_links.map do |spec, paths| paths.uniq.map do |path| "\n * #{spec.name}: #{path}" end end.flatten.sort.each {|m| message += m } raise ProductionError, message else Bundler.ui.info "No issues found with the installed bundle" end end end end bundler-1.16.1/lib/bundler/cli/console.rb0000644000175000017500000000206513217261023020746 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Console attr_reader :options, :group def initialize(options, group) @options = options @group = group end def run Bundler::SharedHelpers.major_deprecation 2, "bundle console will be replaced " \ "by `bin/console` generated by `bundle gem `" group ? Bundler.require(:default, *(group.split.map!(&:to_sym))) : Bundler.require ARGV.clear console = get_console(Bundler.settings[:console] || "irb") console.start end def get_console(name) require name get_constant(name) rescue LoadError Bundler.ui.error "Couldn't load console #{name}, falling back to irb" require "irb" get_constant("irb") end def get_constant(name) const_name = { "pry" => :Pry, "ripl" => :Ripl, "irb" => :IRB, }[name] Object.const_get(const_name) rescue NameError Bundler.ui.error "Could not find constant #{const_name}" exit 1 end end end bundler-1.16.1/lib/bundler/cli/pristine.rb0000644000175000017500000000251113217261023021135 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Pristine def initialize(gems) @gems = gems end def run CLI::Common.ensure_all_gems_in_lockfile!(@gems) definition = Bundler.definition definition.validate_runtime! installer = Bundler::Installer.new(Bundler.root, definition) Bundler.load.specs.each do |spec| next if spec.name == "bundler" # Source::Rubygems doesn't install bundler next if !@gems.empty? && !@gems.include?(spec.name) gem_name = "#{spec.name} (#{spec.version}#{spec.git_version})" gem_name += " (#{spec.platform})" if !spec.platform.nil? && spec.platform != Gem::Platform::RUBY case source = spec.source when Source::Rubygems cached_gem = spec.cache_file unless File.exist?(cached_gem) Bundler.ui.error("Failed to pristine #{gem_name}. Cached gem #{cached_gem} does not exist.") next end FileUtils.rm_rf spec.full_gem_path when Source::Git source.remote! FileUtils.rm_rf spec.full_gem_path else Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is sourced from local path.") next end Bundler::GemInstaller.new(spec, installer, false, 0, true).install_from_spec end end end end bundler-1.16.1/lib/bundler/cli/binstubs.rb0000644000175000017500000000263013217261023021133 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CLI::Binstubs attr_reader :options, :gems def initialize(options, gems) @options = options @gems = gems end def run Bundler.definition.validate_runtime! path_option = options["path"] path_option = nil if path_option && path_option.empty? Bundler.settings.set_command_option :bin, path_option if options["path"] Bundler.settings.set_command_option_if_given :shebang, options["shebang"] installer = Installer.new(Bundler.root, Bundler.definition) if gems.empty? Bundler.ui.error "`bundle binstubs` needs at least one gem to run." exit 1 end gems.each do |gem_name| spec = Bundler.definition.specs.find {|s| s.name == gem_name } unless spec raise GemNotFound, Bundler::CLI::Common.gem_not_found_message( gem_name, Bundler.definition.specs ) end if options[:standalone] next Bundler.ui.warn("Sorry, Bundler can only be run via RubyGems.") if gem_name == "bundler" Bundler.settings.temporary(:path => (Bundler.settings[:path] || Bundler.root)) do installer.generate_standalone_bundler_executable_stubs(spec) end else installer.generate_bundler_executable_stubs(spec, :force => options[:force], :binstubs_cmd => true) end end end end end bundler-1.16.1/lib/bundler/gem_version_promoter.rb0000644000175000017500000001437013217261023023003 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # This class contains all of the logic for determining the next version of a # Gem to update to based on the requested level (patch, minor, major). # Primarily designed to work with Resolver which will provide it the list of # available dependency versions as found in its index, before returning it to # to the resolution engine to select the best version. class GemVersionPromoter attr_reader :level, :locked_specs, :unlock_gems # By default, strict is false, meaning every available version of a gem # is returned from sort_versions. The order gives preference to the # requested level (:patch, :minor, :major) but in complicated requirement # cases some gems will by necessity by promoted past the requested level, # or even reverted to older versions. # # If strict is set to true, the results from sort_versions will be # truncated, eliminating any version outside the current level scope. # This can lead to unexpected outcomes or even VersionConflict exceptions # that report a version of a gem not existing for versions that indeed do # existing in the referenced source. attr_accessor :strict # Given a list of locked_specs and a list of gems to unlock creates a # GemVersionPromoter instance. # # @param locked_specs [SpecSet] All current locked specs. Unlike Definition # where this list is empty if all gems are being updated, this should # always be populated for all gems so this class can properly function. # @param unlock_gems [String] List of gem names being unlocked. If empty, # all gems will be considered unlocked. # @return [GemVersionPromoter] def initialize(locked_specs = SpecSet.new([]), unlock_gems = []) @level = :major @strict = false @locked_specs = locked_specs @unlock_gems = unlock_gems @sort_versions = {} end # @param value [Symbol] One of three Symbols: :major, :minor or :patch. def level=(value) v = case value when String, Symbol value.to_sym end raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v) @level = v end # Given a Dependency and an Array of SpecGroups of available versions for a # gem, this method will return the Array of SpecGroups sorted (and possibly # truncated if strict is true) in an order to give preference to the current # level (:major, :minor or :patch) when resolution is deciding what versions # best resolve all dependencies in the bundle. # @param dep [Dependency] The Dependency of the gem. # @param spec_groups [SpecGroup] An array of SpecGroups for the same gem # named in the @dep param. # @return [SpecGroup] A new instance of the SpecGroup Array sorted and # possibly filtered. def sort_versions(dep, spec_groups) before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if ENV["DEBUG_RESOLVER"] @sort_versions[dep] ||= begin gem_name = dep.name # An Array per version returned, different entries for different platforms. # We only need the version here so it's ok to hard code this to the first instance. locked_spec = locked_specs[gem_name].first if strict filter_dep_specs(spec_groups, locked_spec) else sort_dep_specs(spec_groups, locked_spec) end.tap do |specs| if ENV["DEBUG_RESOLVER"] STDERR.puts before_result STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}" end end end end # @return [bool] Convenience method for testing value of level variable. def major? level == :major end # @return [bool] Convenience method for testing value of level variable. def minor? level == :minor end private def filter_dep_specs(spec_groups, locked_spec) res = spec_groups.select do |spec_group| if locked_spec && !major? gsv = spec_group.version lsv = locked_spec.version must_match = minor? ? [0] : [0, 1] matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] } (matches.uniq == [true]) ? (gsv >= lsv) : false else true end end sort_dep_specs(res, locked_spec) end def sort_dep_specs(spec_groups, locked_spec) return spec_groups unless locked_spec @gem_name = locked_spec.name @locked_version = locked_spec.version result = spec_groups.sort do |a, b| @a_ver = a.version @b_ver = b.version if major? @a_ver <=> @b_ver elsif either_version_older_than_locked @a_ver <=> @b_ver elsif segments_do_not_match(:major) @b_ver <=> @a_ver elsif !minor? && segments_do_not_match(:minor) @b_ver <=> @a_ver else @a_ver <=> @b_ver end end post_sort(result) end def either_version_older_than_locked @a_ver < @locked_version || @b_ver < @locked_version end def segments_do_not_match(level) index = [:major, :minor].index(level) @a_ver.segments[index] != @b_ver.segments[index] end def unlocking_gem? unlock_gems.empty? || unlock_gems.include?(@gem_name) end # Specific version moves can't always reliably be done during sorting # as not all elements are compared against each other. def post_sort(result) # default :major behavior in Bundler does not do this return result if major? if unlocking_gem? result else move_version_to_end(result, @locked_version) end end def move_version_to_end(result, version) move, keep = result.partition {|s| s.version.to_s == version.to_s } keep.concat(move) end def debug_format_result(dep, spec_groups) a = [dep.to_s, spec_groups.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }] last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] } [a.first, last_map, level, strict ? :strict : :not_strict] end end end bundler-1.16.1/lib/bundler/lockfile_parser.rb0000644000175000017500000002117513217261023021704 0ustar samuelophsamueloph# frozen_string_literal: true # Some versions of the Bundler 1.1 RC series introduced corrupted # lockfiles. There were two major problems: # # * multiple copies of the same GIT section appeared in the lockfile # * when this happened, those sections got multiple copies of gems # in those sections. # # As a result, Bundler 1.1 contains code that fixes the earlier # corruption. We will remove this fix-up code in Bundler 1.2. module Bundler class LockfileParser attr_reader :sources, :dependencies, :specs, :platforms, :bundler_version, :ruby_version BUNDLED = "BUNDLED WITH".freeze DEPENDENCIES = "DEPENDENCIES".freeze PLATFORMS = "PLATFORMS".freeze RUBY = "RUBY VERSION".freeze GIT = "GIT".freeze GEM = "GEM".freeze PATH = "PATH".freeze PLUGIN = "PLUGIN SOURCE".freeze SPECS = " specs:".freeze OPTIONS = /^ ([a-z]+): (.*)$/i SOURCE = [GIT, GEM, PATH, PLUGIN].freeze SECTIONS_BY_VERSION_INTRODUCED = { # The strings have to be dup'ed for old RG on Ruby 2.3+ # TODO: remove dup in Bundler 2.0 Gem::Version.create("1.0".dup) => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze, Gem::Version.create("1.10".dup) => [BUNDLED].freeze, Gem::Version.create("1.12".dup) => [RUBY].freeze, Gem::Version.create("1.13".dup) => [PLUGIN].freeze, }.freeze KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze ENVIRONMENT_VERSION_SECTIONS = [BUNDLED, RUBY].freeze def self.sections_in_lockfile(lockfile_contents) lockfile_contents.scan(/^\w[\w ]*$/).uniq end def self.unknown_sections_in_lockfile(lockfile_contents) sections_in_lockfile(lockfile_contents) - KNOWN_SECTIONS end def self.sections_to_ignore(base_version = nil) base_version &&= base_version.release base_version ||= Gem::Version.create("1.0".dup) attributes = [] SECTIONS_BY_VERSION_INTRODUCED.each do |version, introduced| next if version <= base_version attributes += introduced end attributes end def initialize(lockfile) @platforms = [] @sources = [] @dependencies = {} @state = nil @specs = {} @rubygems_aggregate = Source::Rubygems.new if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/) raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \ "Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock." end lockfile.split(/(?:\r?\n)+/).each do |line| if SOURCE.include?(line) @state = :source parse_source(line) elsif line == DEPENDENCIES @state = :dependency elsif line == PLATFORMS @state = :platform elsif line == RUBY @state = :ruby elsif line == BUNDLED @state = :bundled_with elsif line =~ /^[^\s]/ @state = nil elsif @state send("parse_#{@state}", line) end end @sources << @rubygems_aggregate unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? @specs = @specs.values.sort_by(&:identifier) warn_for_outdated_bundler_version rescue ArgumentError => e Bundler.ui.debug(e) raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \ "and then `bundle install` to generate a new lockfile." end def warn_for_outdated_bundler_version return unless bundler_version prerelease_text = bundler_version.prerelease? ? " --pre" : "" current_version = Gem::Version.create(Bundler::VERSION) case current_version.segments.first <=> bundler_version.segments.first when -1 raise LockfileError, "You must use Bundler #{bundler_version.segments.first} or greater with this lockfile." when 0 if current_version < bundler_version Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \ "than the version that created the lockfile (#{bundler_version}). We suggest you " \ "upgrade to the latest version of Bundler by running `gem " \ "install bundler#{prerelease_text}`.\n" end end end private TYPES = { GIT => Bundler::Source::Git, GEM => Bundler::Source::Rubygems, PATH => Bundler::Source::Path, PLUGIN => Bundler::Plugin, }.freeze def parse_source(line) case line when SPECS case @type when PATH @current_source = TYPES[@type].from_lock(@opts) @sources << @current_source when GIT @current_source = TYPES[@type].from_lock(@opts) # Strip out duplicate GIT sections if @sources.include?(@current_source) @current_source = @sources.find {|s| s == @current_source } else @sources << @current_source end when GEM if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? @opts["remotes"] = @opts.delete("remote") @current_source = TYPES[@type].from_lock(@opts) @sources << @current_source else Array(@opts["remote"]).each do |url| @rubygems_aggregate.add_remote(url) end @current_source = @rubygems_aggregate end when PLUGIN @current_source = Plugin.source_from_lock(@opts) @sources << @current_source end when OPTIONS value = $2 value = true if value == "true" value = false if value == "false" key = $1 if @opts[key] @opts[key] = Array(@opts[key]) @opts[key] << value else @opts[key] = value end when *SOURCE @current_source = nil @opts = {} @type = line else parse_spec(line) end end space = / / NAME_VERSION = / ^(#{space}{2}|#{space}{4}|#{space}{6})(?!#{space}) # Exactly 2, 4, or 6 spaces at the start of the line (.*?) # Name (?:#{space}\(([^-]*) # Space, followed by version (?:-(.*))?\))? # Optional platform (!)? # Optional pinned marker $ # Line end /xo def parse_dependency(line) return unless line =~ NAME_VERSION spaces = $1 return unless spaces.size == 2 name = $2 version = $3 pinned = $5 version = version.split(",").map(&:strip) if version dep = Bundler::Dependency.new(name, version) if pinned && dep.name != "bundler" spec = @specs.find {|_, v| v.name == dep.name } dep.source = spec.last.source if spec # Path sources need to know what the default name / version # to use in the case that there are no gemspecs present. A fake # gemspec is created based on the version set on the dependency # TODO: Use the version from the spec instead of from the dependency if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path) dep.source.name = name dep.source.version = $1 end end @dependencies[dep.name] = dep end def parse_spec(line) return unless line =~ NAME_VERSION spaces = $1 name = $2 version = $3 platform = $4 if spaces.size == 4 version = Gem::Version.new(version) platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY @current_spec = LazySpecification.new(name, version, platform) @current_spec.source = @current_source # Avoid introducing multiple copies of the same spec (caused by # duplicate GIT sections) @specs[@current_spec.identifier] ||= @current_spec elsif spaces.size == 6 version = version.split(",").map(&:strip) if version dep = Gem::Dependency.new(name, version) @current_spec.dependencies << dep end end def parse_platform(line) @platforms << Gem::Platform.new($1) if line =~ /^ (.*)$/ end def parse_bundled_with(line) line = line.strip return unless Gem::Version.correct?(line) @bundler_version = Gem::Version.create(line) end def parse_ruby(line) @ruby_version = line.strip end end end bundler-1.16.1/lib/bundler/ui/0000755000175000017500000000000013217261023016622 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/ui/rg_proxy.rb0000644000175000017500000000046213217261023021022 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/ui" require "rubygems/user_interaction" module Bundler module UI class RGProxy < ::Gem::SilentUI def initialize(ui) @ui = ui super() end def say(message) @ui && @ui.debug(message) end end end end bundler-1.16.1/lib/bundler/ui/shell.rb0000644000175000017500000000677013217261023020270 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_thor" module Bundler module UI class Shell LEVELS = %w[silent error warn confirm info debug].freeze attr_writer :shell def initialize(options = {}) if options["no-color"] || !$stdout.tty? Thor::Base.shell = Thor::Shell::Basic end @shell = Thor::Base.shell.new @level = ENV["DEBUG"] ? "debug" : "info" @warning_history = [] end def add_color(string, *color) @shell.set_color(string, *color) end def info(msg, newline = nil) tell_me(msg, nil, newline) if level("info") end def confirm(msg, newline = nil) tell_me(msg, :green, newline) if level("confirm") end def warn(msg, newline = nil) return unless level("warn") return if @warning_history.include? msg @warning_history << msg return tell_err(msg, :yellow, newline) if Bundler.feature_flag.error_on_stderr? tell_me(msg, :yellow, newline) end def error(msg, newline = nil) return unless level("error") return tell_err(msg, :red, newline) if Bundler.feature_flag.error_on_stderr? tell_me(msg, :red, newline) end def debug(msg, newline = nil) tell_me(msg, nil, newline) if debug? end def debug? level("debug") end def quiet? level("quiet") end def ask(msg) @shell.ask(msg) end def yes?(msg) @shell.yes?(msg) end def no? @shell.no?(msg) end def level=(level) raise ArgumentError unless LEVELS.include?(level.to_s) @level = level.to_s end def level(name = nil) return @level unless name unless index = LEVELS.index(name) raise "#{name.inspect} is not a valid level" end index <= LEVELS.index(@level) end def trace(e, newline = nil, force = false) return unless debug? || force msg = "#{e.class}: #{e.message}\n#{e.backtrace.join("\n ")}" tell_me(msg, nil, newline) end def silence(&blk) with_level("silent", &blk) end def unprinted_warnings [] end private # valimism def tell_me(msg, color = nil, newline = nil) msg = word_wrap(msg) if newline.is_a?(Hash) && newline[:wrap] if newline.nil? @shell.say(msg, color) else @shell.say(msg, color, newline) end end def tell_err(message, color = nil, newline = nil) newline = message.to_s !~ /( |\t)\Z/ unless newline message = word_wrap(message) if newline.is_a?(Hash) && newline[:wrap] color = nil if color && !$stderr.tty? buffer = @shell.send(:prepare_message, message, *color) buffer << "\n" if newline && !message.to_s.end_with?("\n") @shell.send(:stderr).print(buffer) @shell.send(:stderr).flush end def strip_leading_spaces(text) spaces = text[/\A\s+/, 0] spaces ? text.gsub(/#{spaces}/, "") : text end def word_wrap(text, line_width = @shell.terminal_width) strip_leading_spaces(text).split("\n").collect do |line| line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line end * "\n" end def with_level(level) original = @level @level = level yield ensure @level = original end end end end bundler-1.16.1/lib/bundler/ui/silent.rb0000644000175000017500000000201513217261023020443 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module UI class Silent attr_writer :shell def initialize @warnings = [] end def add_color(string, color) string end def info(message, newline = nil) end def confirm(message, newline = nil) end def warn(message, newline = nil) @warnings |= [message] end def error(message, newline = nil) end def debug(message, newline = nil) end def debug? false end def quiet? false end def ask(message) end def yes?(msg) raise "Cannot ask yes? with a silent shell" end def no? raise "Cannot ask no? with a silent shell" end def level=(name) end def level(name = nil) end def trace(message, newline = nil, force = false) end def silence yield end def unprinted_warnings @warnings end end end end bundler-1.16.1/lib/bundler/compact_index_client.rb0000644000175000017500000000642613217261023022715 0ustar samuelophsamueloph# frozen_string_literal: true require "pathname" require "set" module Bundler class CompactIndexClient DEBUG_MUTEX = Mutex.new def self.debug return unless ENV["DEBUG_COMPACT_INDEX"] DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") } end class Error < StandardError; end require "bundler/compact_index_client/cache" require "bundler/compact_index_client/updater" attr_reader :directory # @return [Lambda] A lambda that takes an array of inputs and a block, and # maps the inputs with the block in parallel. # attr_accessor :in_parallel def initialize(directory, fetcher) @directory = Pathname.new(directory) @updater = Updater.new(fetcher) @cache = Cache.new(@directory) @endpoints = Set.new @info_checksums_by_name = {} @parsed_checksums = false @mutex = Mutex.new @in_parallel = lambda do |inputs, &blk| inputs.map(&blk) end end def names Bundler::CompactIndexClient.debug { "/names" } update(@cache.names_path, "names") @cache.names end def versions Bundler::CompactIndexClient.debug { "/versions" } update(@cache.versions_path, "versions") versions, @info_checksums_by_name = @cache.versions versions end def dependencies(names) Bundler::CompactIndexClient.debug { "dependencies(#{names})" } in_parallel.call(names) do |name| update_info(name) @cache.dependencies(name).map {|d| d.unshift(name) } end.flatten(1) end def spec(name, version, platform = nil) Bundler::CompactIndexClient.debug { "spec(name = #{name}, version = #{version}, platform = #{platform})" } update_info(name) @cache.specific_dependency(name, version, platform) end def update_and_parse_checksums! Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" } return @info_checksums_by_name if @parsed_checksums update(@cache.versions_path, "versions") @info_checksums_by_name = @cache.checksums @parsed_checksums = true end private def update(local_path, remote_path) Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" } unless synchronize { @endpoints.add?(remote_path) } Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" } return end @updater.update(local_path, url(remote_path)) end def update_info(name) Bundler::CompactIndexClient.debug { "update_info(#{name})" } path = @cache.info_path(name) checksum = @updater.checksum_for_file(path) unless existing = @info_checksums_by_name[name] Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since it is missing from versions" } return end if checksum == existing Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since the versions checksum matches the local checksum" } return end Bundler::CompactIndexClient.debug { "updating info for #{name} since the versions checksum #{existing} != the local checksum #{checksum}" } update(path, "info/#{name}") end def url(path) path end def synchronize @mutex.synchronize { yield } end end end bundler-1.16.1/lib/bundler/gemdeps.rb0000644000175000017500000000064713217261023020165 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Gemdeps def initialize(runtime) @runtime = runtime end def requested_specs @runtime.requested_specs end def specs @runtime.specs end def dependencies @runtime.dependencies end def current_dependencies @runtime.current_dependencies end def requires @runtime.requires end end end bundler-1.16.1/lib/bundler/gem_helper.rb0000644000175000017500000001356413217261023020652 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_thor" unless defined?(Thor) require "bundler" module Bundler class GemHelper include Rake::DSL if defined? Rake::DSL class << self # set when install'd. attr_accessor :instance def install_tasks(opts = {}) new(opts[:dir], opts[:name]).install end def gemspec(&block) gemspec = instance.gemspec block.call(gemspec) if block gemspec end end attr_reader :spec_path, :base, :gemspec def initialize(base = nil, name = nil) Bundler.ui = UI::Shell.new @base = (base ||= SharedHelpers.pwd) gemspecs = name ? [File.join(base, "#{name}.gemspec")] : Dir[File.join(base, "{,*}.gemspec")] raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1 @spec_path = gemspecs.first @gemspec = Bundler.load_gemspec(@spec_path) end def install built_gem_path = nil desc "Build #{name}-#{version}.gem into the pkg directory." task "build" do built_gem_path = build_gem end desc "Build and install #{name}-#{version}.gem into system gems." task "install" => "build" do install_gem(built_gem_path) end desc "Build and install #{name}-#{version}.gem into system gems without network access." task "install:local" => "build" do install_gem(built_gem_path, :local) end desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to #{gem_push_host}\n" \ "To prevent publishing in RubyGems use `gem_push=no rake release`" task "release", [:remote] => ["build", "release:guard_clean", "release:source_control_push", "release:rubygem_push"] do end task "release:guard_clean" do guard_clean end task "release:source_control_push", [:remote] do |_, args| tag_version { git_push(args[:remote]) } unless already_tagged? end task "release:rubygem_push" do rubygem_push(built_gem_path) if gem_push? end GemHelper.instance = self end def build_gem file_name = nil sh("gem build -V '#{spec_path}'") do file_name = File.basename(built_gem_path) SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) } FileUtils.mv(built_gem_path, "pkg") Bundler.ui.confirm "#{name} #{version} built to pkg/#{file_name}." end File.join(base, "pkg", file_name) end def install_gem(built_gem_path = nil, local = false) built_gem_path ||= build_gem out, _ = sh_with_code("gem install '#{built_gem_path}'#{" --local" if local}") raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/] Bundler.ui.confirm "#{name} (#{version}) installed." end protected def rubygem_push(path) gem_command = "gem push '#{path}'" gem_command += " --key #{gem_key}" if gem_key gem_command += " --host #{allowed_push_host}" if allowed_push_host unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file? raise "Your rubygems.org credentials aren't set. Run `gem push` to set them." end sh(gem_command) Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}" end def built_gem_path Dir[File.join(base, "#{name}-*.gem")].sort_by {|f| File.mtime(f) }.last end def git_push(remote = "") perform_git_push remote perform_git_push "#{remote} --tags" Bundler.ui.confirm "Pushed git commits and tags." end def allowed_push_host @gemspec.metadata["allowed_push_host"] if @gemspec.respond_to?(:metadata) end def gem_push_host env_rubygems_host = ENV["RUBYGEMS_HOST"] env_rubygems_host = nil if env_rubygems_host && env_rubygems_host.empty? allowed_push_host || env_rubygems_host || "rubygems.org" end def perform_git_push(options = "") cmd = "git push #{options}" out, code = sh_with_code(cmd) raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0 end def already_tagged? return false unless sh("git tag").split(/\n/).include?(version_tag) Bundler.ui.confirm "Tag #{version_tag} has already been created." true end def guard_clean clean? && committed? || raise("There are files that need to be committed first.") end def clean? sh_with_code("git diff --exit-code")[1] == 0 end def committed? sh_with_code("git diff-index --quiet --cached HEAD")[1] == 0 end def tag_version sh "git tag -m \"Version #{version}\" #{version_tag}" Bundler.ui.confirm "Tagged #{version_tag}." yield if block_given? rescue Bundler.ui.error "Untagging #{version_tag} due to error." sh_with_code "git tag -d #{version_tag}" raise end def version gemspec.version end def version_tag "v#{version}" end def name gemspec.name end def sh(cmd, &block) out, code = sh_with_code(cmd, &block) unless code.zero? raise(out.empty? ? "Running `#{cmd}` failed. Run this command directly for more detailed output." : out) end out end def sh_with_code(cmd, &block) cmd += " 2>&1" outbuf = String.new Bundler.ui.debug(cmd) SharedHelpers.chdir(base) do outbuf = `#{cmd}` status = $?.exitstatus block.call(outbuf) if status.zero? && block [outbuf, status] end end def gem_key Bundler.settings["gem.push_key"].to_s.downcase if Bundler.settings["gem.push_key"] end def gem_push? !%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase) end end end bundler-1.16.1/lib/bundler/fetcher/0000755000175000017500000000000013217261023017625 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/fetcher/dependency.rb0000644000175000017500000000523513217261023022275 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/fetcher/base" require "cgi" module Bundler class Fetcher class Dependency < Base def available? @available ||= fetch_uri.scheme != "file" && downloader.fetch(dependency_api_uri) rescue NetworkDownError => e raise HTTPError, e.message rescue AuthenticationRequiredError # Fail since we got a 401 from the server. raise rescue HTTPError false end def api_fetcher? true end def specs(gem_names, full_dependency_list = [], last_spec_list = []) query_list = gem_names.uniq - full_dependency_list log_specs "Query List: #{query_list.inspect}" return last_spec_list if query_list.empty? spec_list, deps_list = Bundler::Retry.new("dependency api", FAIL_ERRORS).attempts do dependency_specs(query_list) end returned_gems = spec_list.map(&:first).uniq specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list) rescue MarshalError Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over Bundler.ui.debug "could not fetch from the dependency API, trying the full index" nil rescue HTTPError, GemspecError Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over Bundler.ui.debug "could not fetch from the dependency API\nit's suggested to retry using the full index via `bundle install --full-index`" nil end def dependency_specs(gem_names) Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(",")}" gem_list = unmarshalled_dep_gems(gem_names) get_formatted_specs_and_deps(gem_list) end def unmarshalled_dep_gems(gem_names) gem_list = [] gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names| marshalled_deps = downloader.fetch(dependency_api_uri(names)).body gem_list.concat(Bundler.load_marshal(marshalled_deps)) end gem_list end def get_formatted_specs_and_deps(gem_list) deps_list = [] spec_list = [] gem_list.each do |s| deps_list.concat(s[:dependencies].map(&:first)) deps = s[:dependencies].map {|n, d| [n, d.split(", ")] } spec_list.push([s[:name], s[:number], s[:platform], deps]) end [spec_list, deps_list] end def dependency_api_uri(gem_names = []) uri = fetch_uri + "api/v1/dependencies" uri.query = "gems=#{CGI.escape(gem_names.sort.join(","))}" if gem_names.any? uri end end end end bundler-1.16.1/lib/bundler/fetcher/downloader.rb0000644000175000017500000000516313217261023022315 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Fetcher class Downloader attr_reader :connection attr_reader :redirect_limit def initialize(connection, redirect_limit) @connection = connection @redirect_limit = redirect_limit end def fetch(uri, options = {}, counter = 0) raise HTTPError, "Too many redirects" if counter >= redirect_limit response = request(uri, options) Bundler.ui.debug("HTTP #{response.code} #{response.message} #{uri}") case response when Net::HTTPSuccess, Net::HTTPNotModified response when Net::HTTPRedirection new_uri = URI.parse(response["location"]) if new_uri.host == uri.host new_uri.user = uri.user new_uri.password = uri.password end fetch(new_uri, options, counter + 1) when Net::HTTPRequestEntityTooLarge raise FallbackError, response.body when Net::HTTPUnauthorized raise AuthenticationRequiredError, uri.host when Net::HTTPNotFound raise FallbackError, "Net::HTTPNotFound" else raise HTTPError, "#{response.class}#{": #{response.body}" unless response.body.empty?}" end end def request(uri, options) validate_uri_scheme!(uri) Bundler.ui.debug "HTTP GET #{uri}" req = Net::HTTP::Get.new uri.request_uri, options if uri.user user = CGI.unescape(uri.user) password = uri.password ? CGI.unescape(uri.password) : nil req.basic_auth(user, password) end connection.request(uri, req) rescue NoMethodError => e raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet } raise LoadError.new("cannot load such file -- openssl") rescue OpenSSL::SSL::SSLError raise CertificateFailureError.new(uri) rescue *HTTP_ERRORS => e Bundler.ui.trace e case e.message when /host down:/, /getaddrinfo: nodename nor servname provided/ raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \ "connection and try again." else raise HTTPError, "Network error while fetching #{URICredentialsFilter.credential_filtered_uri(uri)}" \ " (#{e})" end end private def validate_uri_scheme!(uri) return if uri.scheme =~ /\Ahttps?\z/ raise InvalidOption, "The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \ "Did you mean `http` or `https`?" end end end end bundler-1.16.1/lib/bundler/fetcher/index.rb0000644000175000017500000000340013217261023021256 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/fetcher/base" require "rubygems/remote_fetcher" module Bundler class Fetcher class Index < Base def specs(_gem_names) Bundler.rubygems.fetch_all_remote_specs(remote) rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError, Net::HTTPFatalError => e case e.message when /certificate verify failed/ raise CertificateFailureError.new(display_uri) when /401/ raise AuthenticationRequiredError, remote_uri when /403/ raise BadAuthenticationError, remote_uri if remote_uri.userinfo raise AuthenticationRequiredError, remote_uri else Bundler.ui.trace e raise HTTPError, "Could not fetch specs from #{display_uri}" end end def fetch_spec(spec) spec -= [nil, "ruby", ""] spec_file_name = "#{spec.join "-"}.gemspec" uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") if uri.scheme == "file" Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path)) elsif cached_spec_path = gemspec_cached_path(spec_file_name) Bundler.load_gemspec(cached_spec_path) else Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body) end rescue MarshalError raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \ "Your network or your gem server is probably having issues right now." end private # cached gem specification path, if one exists def gemspec_cached_path(spec_file_name) paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) } paths.find {|path| File.file? path } end end end end bundler-1.16.1/lib/bundler/fetcher/compact_index.rb0000644000175000017500000000776013217261023023001 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/fetcher/base" require "bundler/worker" module Bundler autoload :CompactIndexClient, "bundler/compact_index_client" class Fetcher class CompactIndex < Base def self.compact_index_request(method_name) method = instance_method(method_name) undef_method(method_name) define_method(method_name) do |*args, &blk| begin method.bind(self).call(*args, &blk) rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e raise HTTPError, e.message rescue AuthenticationRequiredError # Fail since we got a 401 from the server. raise rescue HTTPError => e Bundler.ui.trace(e) nil end end end def specs(gem_names) specs_for_names(gem_names) end compact_index_request :specs def specs_for_names(gem_names) gem_info = [] complete_gems = [] remaining_gems = gem_names.dup until remaining_gems.empty? log_specs "Looking up gems #{remaining_gems.inspect}" deps = compact_index_client.dependencies(remaining_gems) next_gems = deps.map {|d| d[3].map(&:first).flatten(1) }.flatten(1).uniq deps.each {|dep| gem_info << dep } complete_gems.concat(deps.map(&:first)).uniq! remaining_gems = next_gems - complete_gems end @bundle_worker.stop if @bundle_worker @bundle_worker = nil # reset it. Not sure if necessary gem_info end def fetch_spec(spec) spec -= [nil, "ruby", ""] contents = compact_index_client.spec(*spec) return nil if contents.nil? contents.unshift(spec.first) contents[3].map! {|d| Gem::Dependency.new(*d) } EndpointSpecification.new(*contents) end compact_index_request :fetch_spec def available? return nil unless SharedHelpers.md5_available? user_home = Bundler.user_home return nil unless user_home.directory? && user_home.writable? # Read info file checksums out of /versions, so we can know if gems are up to date fetch_uri.scheme != "file" && compact_index_client.update_and_parse_checksums! rescue CompactIndexClient::Updater::MisMatchedChecksumError => e Bundler.ui.debug(e.message) nil end compact_index_request :available? def api_fetcher? true end private def compact_index_client @compact_index_client ||= begin SharedHelpers.filesystem_access(cache_path) do CompactIndexClient.new(cache_path, client_fetcher) end.tap do |client| client.in_parallel = lambda do |inputs, &blk| func = lambda {|object, _index| blk.call(object) } worker = bundle_worker(func) inputs.each {|input| worker.enq(input) } inputs.map { worker.deq } end end end end def bundle_worker(func = nil) @bundle_worker ||= begin worker_name = "Compact Index (#{display_uri.host})" Bundler::Worker.new(Bundler.current_ruby.rbx? ? 1 : 25, worker_name, func) end @bundle_worker.tap do |worker| worker.instance_variable_set(:@func, func) if func end end def cache_path Bundler.user_cache.join("compact_index", remote.cache_slug) end def client_fetcher ClientFetcher.new(self, Bundler.ui) end ClientFetcher = Struct.new(:fetcher, :ui) do def call(path, headers) fetcher.downloader.fetch(fetcher.fetch_uri + path, headers) rescue NetworkDownError => e raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"] ui.warn "Using the cached data for the new index because of a network error: #{e}" Net::HTTPNotModified.new(nil, nil, nil) end end end end end bundler-1.16.1/lib/bundler/fetcher/base.rb0000644000175000017500000000173113217261023021066 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Fetcher class Base attr_reader :downloader attr_reader :display_uri attr_reader :remote def initialize(downloader, remote, display_uri) raise "Abstract class" if self.class == Base @downloader = downloader @remote = remote @display_uri = display_uri end def remote_uri @remote.uri end def fetch_uri @fetch_uri ||= begin if remote_uri.host == "rubygems.org" uri = remote_uri.dup uri.host = "index.rubygems.org" uri else remote_uri end end end def available? true end def api_fetcher? false end private def log_specs(debug_msg) if Bundler.ui.debug? Bundler.ui.debug debug_msg else Bundler.ui.info ".", false end end end end end bundler-1.16.1/lib/bundler/lockfile_generator.rb0000644000175000017500000000426713217261023022401 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class LockfileGenerator attr_reader :definition attr_reader :out # @private def initialize(definition) @definition = definition @out = String.new end def self.generate(definition) new(definition).generate! end def generate! add_sources add_platforms add_dependencies add_locked_ruby_version add_bundled_with out end private def add_sources definition.send(:sources).lock_sources.each_with_index do |source, idx| out << "\n" unless idx.zero? # Add the source header out << source.to_lock # Find all specs for this source specs = definition.resolve.select {|s| source.can_lock?(s) } add_specs(specs) end end def add_specs(specs) # This needs to be sorted by full name so that # gems with the same name, but different platform # are ordered consistently specs.sort_by(&:full_name).each do |spec| next if spec.name == "bundler".freeze out << spec.to_lock end end def add_platforms add_section("PLATFORMS", definition.platforms) end def add_dependencies out << "\nDEPENDENCIES\n" handled = [] definition.dependencies.sort_by(&:to_s).each do |dep| next if handled.include?(dep.name) out << dep.to_lock handled << dep.name end end def add_locked_ruby_version return unless locked_ruby_version = definition.locked_ruby_version add_section("RUBY VERSION", locked_ruby_version.to_s) end def add_bundled_with add_section("BUNDLED WITH", definition.locked_bundler_version.to_s) end def add_section(name, value) out << "\n#{name}\n" case value when Array value.map(&:to_s).sort.each do |val| out << " #{val}\n" end when Hash value.to_a.sort_by {|k, _| k.to_s }.each do |key, val| out << " #{key}: #{val}\n" end when String out << " #{value}\n" else raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile" end end end end bundler-1.16.1/lib/bundler/friendly_errors.rb0000644000175000017500000001046513217261023021750 0ustar samuelophsamueloph# encoding: utf-8 # frozen_string_literal: true require "cgi" require "bundler/vendored_thor" module Bundler module FriendlyErrors module_function def log_error(error) case error when YamlSyntaxError Bundler.ui.error error.message Bundler.ui.trace error.orig_exception when Dsl::DSLError, GemspecError Bundler.ui.error error.message when GemRequireError Bundler.ui.error error.message Bundler.ui.trace error.orig_exception, nil, true when BundlerError Bundler.ui.error error.message, :wrap => true Bundler.ui.trace error when Thor::Error Bundler.ui.error error.message when LoadError raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/ Bundler.ui.error "\nCould not load OpenSSL." Bundler.ui.warn <<-WARN, :wrap => true You must recompile Ruby with OpenSSL support or change the sources in your \ Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \ using RVM are available at http://rvm.io/packages/openssl. WARN Bundler.ui.trace error when Interrupt Bundler.ui.error "\nQuitting..." Bundler.ui.trace error when Gem::InvalidSpecificationException Bundler.ui.error error.message, :wrap => true when SystemExit when *[defined?(Java::JavaLang::OutOfMemoryError) && Java::JavaLang::OutOfMemoryError].compact Bundler.ui.error "\nYour JVM has run out of memory, and Bundler cannot continue. " \ "You can decrease the amount of memory Bundler needs by removing gems from your Gemfile, " \ "especially large gems. (Gems can be as large as hundreds of megabytes, and Bundler has to read those files!). " \ "Alternatively, you can increase the amount of memory the JVM is able to use by running Bundler with jruby -J-Xmx1024m -S bundle (JRuby defaults to 500MB)." else request_issue_report_for(error) end end def exit_status(error) case error when BundlerError then error.status_code when Thor::Error then 15 when SystemExit then error.status else 1 end end def request_issue_report_for(e) Bundler.ui.info <<-EOS.gsub(/^ {8}/, "") --- ERROR REPORT TEMPLATE ------------------------------------------------------- # Error Report ## Questions Please fill out answers to these questions, it'll help us figure out why things are going wrong. - **What did you do?** I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}` - **What did you expect to happen?** I expected Bundler to... - **What happened instead?** Instead, what happened was... - **Have you tried any solutions posted on similar issues in our issue tracker, stack overflow, or google?** I tried... - **Have you read our issues document, https://github.com/bundler/bundler/blob/master/doc/contributing/ISSUES.md?** ... ## Backtrace ``` #{e.class}: #{e.message} #{e.backtrace && e.backtrace.join("\n ").chomp} ``` #{Bundler::Env.report} --- TEMPLATE END ---------------------------------------------------------------- EOS Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue." Bundler.ui.warn <<-EOS.gsub(/^ {8}/, "") First, try this link to see if there are any existing issue reports for this error: #{issues_url(e)} If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at: https://github.com/bundler/bundler/issues/new EOS end def issues_url(exception) message = exception.message.lines.first.tr(":", " ").chomp message = message.split("-").first if exception.is_a?(Errno) "https://github.com/bundler/bundler/search?q=" \ "#{CGI.escape(message)}&type=Issues" end end def self.with_friendly_errors yield rescue SignalException raise rescue Exception => e FriendlyErrors.log_error(e) exit FriendlyErrors.exit_status(e) end end bundler-1.16.1/lib/bundler/lazy_specification.rb0000644000175000017500000000715213217261023022416 0ustar samuelophsamueloph# frozen_string_literal: true require "uri" require "bundler/match_platform" module Bundler class LazySpecification Identifier = Struct.new(:name, :version, :source, :platform, :dependencies) class Identifier include Comparable def <=>(other) return unless other.is_a?(Identifier) [name, version, platform_string] <=> [other.name, other.version, other.platform_string] end protected def platform_string platform_string = platform.to_s platform_string == Index::RUBY ? Index::NULL : platform_string end end include MatchPlatform attr_reader :name, :version, :dependencies, :platform attr_accessor :source, :remote def initialize(name, version, platform, source = nil) @name = name @version = version @dependencies = [] @platform = platform || Gem::Platform::RUBY @source = source @specification = nil end def full_name if platform == Gem::Platform::RUBY || platform.nil? "#{@name}-#{@version}" else "#{@name}-#{@version}-#{platform}" end end def ==(other) identifier == other.identifier end def satisfies?(dependency) @name == dependency.name && dependency.requirement.satisfied_by?(Gem::Version.new(@version)) end def to_lock out = String.new if platform == Gem::Platform::RUBY || platform.nil? out << " #{name} (#{version})\n" else out << " #{name} (#{version}-#{platform})\n" end dependencies.sort_by(&:to_s).uniq.each do |dep| next if dep.type == :development out << " #{dep.to_lock}\n" end out end def __materialize__ search_object = Bundler.feature_flag.specific_platform? || Bundler.settings[:force_ruby_platform] ? self : Dependency.new(name, version) @specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name source.gemspec.tap {|s| s.source = source } else search = source.specs.search(search_object).last if search && Gem::Platform.new(search.platform) != Gem::Platform.new(platform) && !search.runtime_dependencies.-(dependencies.reject {|d| d.type == :development }).empty? Bundler.ui.warn "Unable to use the platform-specific (#{search.platform}) version of #{name} (#{version}) " \ "because it has different dependencies from the #{platform} version. " \ "To use the platform-specific version of the gem, run `bundle config specific_platform true` and install again." search = source.specs.search(self).last end search.dependencies = dependencies if search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification) search end end def respond_to?(*args) super || @specification ? @specification.respond_to?(*args) : nil end def to_s @__to_s ||= if platform == Gem::Platform::RUBY || platform.nil? "#{name} (#{version})" else "#{name} (#{version}-#{platform})" end end def identifier @__identifier ||= Identifier.new(name, version, source, platform, dependencies) end def git_version return unless source.is_a?(Bundler::Source::Git) " #{source.revision[0..6]}" end private def to_ary nil end def method_missing(method, *args, &blk) raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification return super unless respond_to?(method) @specification.send(method, *args, &blk) end end end bundler-1.16.1/lib/bundler/ssl_certs/0000755000175000017500000000000013217261023020206 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/ssl_certs/.document0000644000175000017500000000004513217261023022024 0ustar samuelophsamueloph# Ignore all files in this directory bundler-1.16.1/lib/bundler/ssl_certs/rubygems.org/0000755000175000017500000000000013217261023022631 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem0000644000175000017500000000276113217261023027647 0ustar samuelophsamueloph-----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- bundler-1.16.1/lib/bundler/ssl_certs/index.rubygems.org/0000755000175000017500000000000013217261023023737 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem0000644000175000017500000000235513217261023027540 0ustar samuelophsamueloph-----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- bundler-1.16.1/lib/bundler/ssl_certs/certificate_manager.rb0000644000175000017500000000307413217261023024513 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_fileutils" require "net/https" require "openssl" module Bundler module SSLCerts class CertificateManager attr_reader :bundler_cert_path, :bundler_certs, :rubygems_certs def self.update_from!(rubygems_path) new(rubygems_path).update! end def initialize(rubygems_path = nil) if rubygems_path rubygems_cert_path = File.join(rubygems_path, "lib/rubygems/ssl_certs") @rubygems_certs = certificates_in(rubygems_cert_path) end @bundler_cert_path = File.expand_path("..", __FILE__) @bundler_certs = certificates_in(bundler_cert_path) end def up_to_date? rubygems_certs.all? do |rc| bundler_certs.find do |bc| File.basename(bc) == File.basename(rc) && FileUtils.compare_file(bc, rc) end end end def update! return if up_to_date? FileUtils.rm bundler_certs FileUtils.cp rubygems_certs, bundler_cert_path end def connect_to(host) http = Net::HTTP.new(host, 443) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER http.cert_store = store http.head("/") end private def certificates_in(path) Dir[File.join(path, "**/*.pem")].sort end def store @store ||= begin store = OpenSSL::X509::Store.new bundler_certs.each do |cert| store.add_file cert end store end end end end end bundler-1.16.1/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/0000755000175000017500000000000013217261023026170 5ustar samuelophsamueloph././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootbundler-1.16.1/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pembundler-1.16.1/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pe0000644000175000017500000000252713217261023034166 0ustar samuelophsamueloph-----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- bundler-1.16.1/lib/bundler/deployment.rb0000644000175000017500000000630413217261023020715 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/shared_helpers" Bundler::SharedHelpers.major_deprecation 2, "Bundler no longer integrates with " \ "Capistrano, but Capistrano provides its own integration with " \ "Bundler via the capistrano-bundler gem. Use it instead." module Bundler class Deployment def self.define_task(context, task_method = :task, opts = {}) if defined?(Capistrano) && context.is_a?(Capistrano::Configuration) context_name = "capistrano" role_default = "{:except => {:no_release => true}}" error_type = ::Capistrano::CommandError else context_name = "vlad" role_default = "[:app]" error_type = ::Rake::CommandFailedError end roles = context.fetch(:bundle_roles, false) opts[:roles] = roles if roles context.send :namespace, :bundle do send :desc, <<-DESC Install the current Bundler environment. By default, gems will be \ installed to the shared/bundle path. Gems in the development and \ test group will not be installed. The install command is executed \ with the --deployment and --quiet flags. If the bundle cmd cannot \ be found then you can override the bundle_cmd variable to specify \ which one it should use. The base path to the app is fetched from \ the :latest_release variable. Set it for custom deploy layouts. You can override any of these defaults by setting the variables shown below. N.B. bundle_roles must be defined before you require 'bundler/#{context_name}' \ in your deploy.rb file. set :bundle_gemfile, "Gemfile" set :bundle_dir, File.join(fetch(:shared_path), 'bundle') set :bundle_flags, "--deployment --quiet" set :bundle_without, [:development, :test] set :bundle_with, [:mysql] set :bundle_cmd, "bundle" # e.g. "/opt/ruby/bin/bundle" set :bundle_roles, #{role_default} # e.g. [:app, :batch] DESC send task_method, :install, opts do bundle_cmd = context.fetch(:bundle_cmd, "bundle") bundle_flags = context.fetch(:bundle_flags, "--deployment --quiet") bundle_dir = context.fetch(:bundle_dir, File.join(context.fetch(:shared_path), "bundle")) bundle_gemfile = context.fetch(:bundle_gemfile, "Gemfile") bundle_without = [*context.fetch(:bundle_without, [:development, :test])].compact bundle_with = [*context.fetch(:bundle_with, [])].compact app_path = context.fetch(:latest_release) if app_path.to_s.empty? raise error_type.new("Cannot detect current release path - make sure you have deployed at least once.") end args = ["--gemfile #{File.join(app_path, bundle_gemfile)}"] args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty? args << bundle_flags.to_s args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty? args << "--with #{bundle_with.join(" ")}" unless bundle_with.empty? run "cd #{app_path} && #{bundle_cmd} install #{args.join(" ")}" end end end end end bundler-1.16.1/lib/bundler/cli.rb0000644000175000017500000010127513217261023017307 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler" require "bundler/vendored_thor" module Bundler class CLI < Thor require "bundler/cli/common" package_name "Bundler" AUTO_INSTALL_CMDS = %w[show binstubs outdated exec open console licenses clean].freeze PARSEABLE_COMMANDS = %w[ check config help exec platform show version ].freeze def self.start(*) super rescue Exception => e Bundler.ui = UI::Shell.new raise e ensure Bundler::SharedHelpers.print_major_deprecations! end def self.dispatch(*) super do |i| i.send(:print_command) i.send(:warn_on_outdated_bundler) end end def initialize(*args) super custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile] if custom_gemfile && !custom_gemfile.empty? Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile) Bundler.reset_paths! end Bundler.settings.set_command_option_if_given :retry, options[:retry] current_cmd = args.last[:current_command].name auto_install if AUTO_INSTALL_CMDS.include?(current_cmd) rescue UnknownArgumentError => e raise InvalidOption, e.message ensure self.options ||= {} unprinted_warnings = Bundler.ui.unprinted_warnings Bundler.ui = UI::Shell.new(options) Bundler.ui.level = "debug" if options["verbose"] unprinted_warnings.each {|w| Bundler.ui.warn(w) } if ENV["RUBYGEMS_GEMDEPS"] && !ENV["RUBYGEMS_GEMDEPS"].empty? Bundler.ui.warn( "The RUBYGEMS_GEMDEPS environment variable is set. This enables RubyGems' " \ "experimental Gemfile mode, which may conflict with Bundler and cause unexpected errors. " \ "To remove this warning, unset RUBYGEMS_GEMDEPS.", :wrap => true ) end end def self.deprecated_option(*args, &blk) return if Bundler.feature_flag.forget_cli_options? method_option(*args, &blk) end check_unknown_options!(:except => [:config, :exec]) stop_on_unknown_option! :exec desc "cli_help", "Prints a summary of bundler commands", :hide => true def cli_help version Bundler.ui.info "\n" primary_commands = ["install", "update", Bundler.feature_flag.cache_command_is_package? ? "cache" : "package", "exec", "config", "help"] list = self.class.printable_commands(true) by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] } utilities = by_name.keys.sort - primary_commands primary_commands.map! {|name| (by_name[name] || raise("no primary command #{name}")).first } utilities.map! {|name| by_name[name].first } shell.say "Bundler commands:\n\n" shell.say " Primary commands:\n" shell.print_table(primary_commands, :indent => 4, :truncate => true) shell.say shell.say " Utilities:\n" shell.print_table(utilities, :indent => 4, :truncate => true) shell.say self.class.send(:class_options_help, shell) end default_task(Bundler.feature_flag.default_cli_command) class_option "no-color", :type => :boolean, :desc => "Disable colorization in output" class_option "retry", :type => :numeric, :aliases => "-r", :banner => "NUM", :desc => "Specify the number of times you wish to attempt network commands" class_option "verbose", :type => :boolean, :desc => "Enable verbose output mode", :aliases => "-V" def help(cli = nil) case cli when "gemfile" then command = "gemfile" when nil then command = "bundle" else command = "bundle-#{cli}" end man_path = File.expand_path("../../../man", __FILE__) man_pages = Hash[Dir.glob(File.join(man_path, "*")).grep(/.*\.\d*\Z/).collect do |f| [File.basename(f, ".*"), f] end] if man_pages.include?(command) if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+} Kernel.exec "man #{man_pages[command]}" else puts File.read("#{man_path}/#{File.basename(man_pages[command])}.txt") end elsif command_path = Bundler.which("bundler-#{cli}") Kernel.exec(command_path, "--help") else super end end def self.handle_no_command_error(command, has_namespace = $thor_runner) if Bundler.feature_flag.plugins? && Bundler::Plugin.command?(command) return Bundler::Plugin.exec_command(command, ARGV[1..-1]) end return super unless command_path = Bundler.which("bundler-#{command}") Kernel.exec(command_path, *ARGV[1..-1]) end desc "init [OPTIONS]", "Generates a Gemfile into the current working directory" long_desc <<-D Init generates a default Gemfile in the current working directory. When adding a Gemfile to a gem with a gemspec, the --gemspec option will automatically add each dependency listed in the gemspec file to the newly created Gemfile. D deprecated_option "gemspec", :type => :string, :banner => "Use the specified .gemspec to create the Gemfile" def init require "bundler/cli/init" Init.new(options.dup).run end desc "check [OPTIONS]", "Checks if the dependencies listed in Gemfile are satisfied by currently installed gems" long_desc <<-D Check searches the local machine for each of the gems requested in the Gemfile. If all gems are found, Bundler prints a success message and exits with a status of 0. If not, the first missing gem is listed and Bundler exits status 1. D method_option "dry-run", :type => :boolean, :default => false, :banner => "Lock the Gemfile" method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile" method_option "path", :type => :string, :banner => "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}" map "c" => "check" def check require "bundler/cli/check" Check.new(options).run end desc "install [OPTIONS]", "Install the current environment to the system" long_desc <<-D Install will install all of the gems in the current bundle, making them available for use. In a freshly checked out repository, this command will give you the same gem versions as the last person who updated the Gemfile and ran `bundle update`. Passing [DIR] to install (e.g. vendor) will cause the unpacked gems to be installed into the [DIR] directory rather than into system gems. If the bundle has already been installed, bundler will tell you so and then exit. D deprecated_option "binstubs", :type => :string, :lazy_default => "bin", :banner => "Generate bin stubs for bundled gems to ./bin" deprecated_option "clean", :type => :boolean, :banner => "Run bundle clean automatically after install" deprecated_option "deployment", :type => :boolean, :banner => "Install using defaults tuned for deployment environments" deprecated_option "frozen", :type => :boolean, :banner => "Do not allow the Gemfile.lock to be updated after this install" method_option "full-index", :type => :boolean, :banner => "Fall back to using the single-file index of all gems" method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile" method_option "jobs", :aliases => "-j", :type => :numeric, :banner => "Specify the number of jobs to run in parallel" method_option "local", :type => :boolean, :banner => "Do not attempt to fetch gems remotely and use the gem cache instead" deprecated_option "no-cache", :type => :boolean, :banner => "Don't update the existing gem cache." method_option "redownload", :type => :boolean, :aliases => [Bundler.feature_flag.forget_cli_options? ? nil : "--force"].compact, :banner => "Force downloading every gem." deprecated_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache." deprecated_option "path", :type => :string, :banner => "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine" method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors." deprecated_option "shebang", :type => :string, :banner => "Specify a different shebang executable name than the default (usually 'ruby')" method_option "standalone", :type => :array, :lazy_default => [], :banner => "Make a bundle that can work without the Bundler runtime" deprecated_option "system", :type => :boolean, :banner => "Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application" method_option "trust-policy", :alias => "P", :type => :string, :banner => "Gem trust policy (like gem install -P). Must be one of " + Bundler.rubygems.security_policy_keys.join("|") deprecated_option "without", :type => :array, :banner => "Exclude gems that are part of the specified named group." deprecated_option "with", :type => :array, :banner => "Include gems that are part of the specified named group." map "i" => "install" def install require "bundler/cli/install" Bundler.settings.temporary(:no_install => false) do Install.new(options.dup).run end end desc "update [OPTIONS]", "Update the current environment" long_desc <<-D Update will install the newest versions of the gems listed in the Gemfile. Use update when you have changed the Gemfile, or if you want to get the newest possible versions of the gems in the bundle. D method_option "full-index", :type => :boolean, :banner => "Fall back to using the single-file index of all gems" method_option "group", :aliases => "-g", :type => :array, :banner => "Update a specific group" method_option "jobs", :aliases => "-j", :type => :numeric, :banner => "Specify the number of jobs to run in parallel" method_option "local", :type => :boolean, :banner => "Do not attempt to fetch gems remotely and use the gem cache instead" method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors." method_option "source", :type => :array, :banner => "Update a specific source (and all gems associated with it)" method_option "force", :type => :boolean, :banner => "Force downloading every gem." method_option "ruby", :type => :boolean, :banner => "Update ruby specified in Gemfile.lock" method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner => "Update the locked version of bundler" method_option "patch", :type => :boolean, :banner => "Prefer updating only to next patch version" method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version" method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)" method_option "strict", :type => :boolean, :banner => "Do not allow any gem to be updated past latest --patch | --minor | --major" method_option "conservative", :type => :boolean, :banner => "Use bundle install conservative update behavior and do not allow shared dependencies to be updated." method_option "all", :type => :boolean, :banner => "Update everything." def update(*gems) require "bundler/cli/update" Update.new(options, gems).run end desc "show GEM [OPTIONS]", "Shows all gems that are part of the bundle, or the path to a given gem" long_desc <<-D Show lists the names and versions of all gems that are required by your Gemfile. Calling show with [GEM] will list the exact location of that gem on your machine. D method_option "paths", :type => :boolean, :banner => "List the paths of all gems that are required by your Gemfile." method_option "outdated", :type => :boolean, :banner => "Show verbose output including whether gems are outdated." def show(gem_name = nil) Bundler::SharedHelpers.major_deprecation(2, "use `bundle list` instead of `bundle show`") if ARGV[0] == "show" require "bundler/cli/show" Show.new(options, gem_name).run end # TODO: 2.0 remove `bundle show` if Bundler.feature_flag.list_command? desc "list", "List all gems in the bundle" method_option "name-only", :type => :boolean, :banner => "print only the gem names" def list require "bundler/cli/list" List.new(options).run end map %w[ls] => "list" else map %w[list] => "show" end desc "info GEM [OPTIONS]", "Show information for the given gem" method_option "path", :type => :boolean, :banner => "Print full path to gem" def info(gem_name) require "bundler/cli/info" Info.new(options, gem_name).run end desc "binstubs GEM [OPTIONS]", "Install the binstubs of the listed gem" long_desc <<-D Generate binstubs for executables in [GEM]. Binstubs are put into bin, or the --binstubs directory if one has been set. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems. D method_option "force", :type => :boolean, :default => false, :banner => "Overwrite existing binstubs if they exist" method_option "path", :type => :string, :lazy_default => "bin", :banner => "Binstub destination directory (default bin)" method_option "shebang", :type => :string, :banner => "Specify a different shebang executable name than the default (usually 'ruby')" method_option "standalone", :type => :boolean, :banner => "Make binstubs that can work without the Bundler runtime" def binstubs(*gems) require "bundler/cli/binstubs" Binstubs.new(options, gems).run end desc "add GEM VERSION", "Add gem to Gemfile and run bundle install" long_desc <<-D Adds the specified gem to Gemfile (if valid) and run 'bundle install' in one step. D method_option "version", :aliases => "-v", :type => :string method_option "group", :aliases => "-g", :type => :string method_option "source", :aliases => "-s", :type => :string def add(gem_name) require "bundler/cli/add" Add.new(options.dup, gem_name).run end desc "outdated GEM [OPTIONS]", "List installed gems with newer versions available" long_desc <<-D Outdated lists the names and versions of gems that have a newer version available in the given source. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems. Prerelease gems are ignored by default. If your gems are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1. For more information on patch level options (--major, --minor, --patch, --update-strict) see documentation on the same options on the update command. D method_option "group", :type => :string, :banner => "List gems from a specific group" method_option "groups", :type => :boolean, :banner => "List gems organized by groups" method_option "local", :type => :boolean, :banner => "Do not attempt to fetch gems remotely and use the gem cache instead" method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems" method_option "source", :type => :array, :banner => "Check against a specific source" method_option "strict", :type => :boolean, :banner => "Only list newer versions allowed by your Gemfile requirements" method_option "update-strict", :type => :boolean, :banner => "Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor | --major" method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version" method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)" method_option "patch", :type => :boolean, :banner => "Prefer updating only to next patch version" method_option "filter-major", :type => :boolean, :banner => "Only list major newer versions" method_option "filter-minor", :type => :boolean, :banner => "Only list minor newer versions" method_option "filter-patch", :type => :boolean, :banner => "Only list patch newer versions" method_option "parseable", :aliases => "--porcelain", :type => :boolean, :banner => "Use minimal formatting for more parseable output" def outdated(*gems) require "bundler/cli/outdated" Outdated.new(options, gems).run end if Bundler.feature_flag.cache_command_is_package? map %w[cache] => :package else desc "cache [OPTIONS]", "Cache all the gems to vendor/cache", :hide => true unless Bundler.feature_flag.cache_command_is_package? method_option "all", :type => :boolean, :banner => "Include all sources (including path and git)." end method_option "all-platforms", :type => :boolean, :banner => "Include gems for all platforms present in the lockfile, not only the current one" method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache." def cache require "bundler/cli/cache" Cache.new(options).run end end desc "#{Bundler.feature_flag.cache_command_is_package? ? :cache : :package} [OPTIONS]", "Locks and then caches all of the gems into vendor/cache" unless Bundler.feature_flag.cache_command_is_package? method_option "all", :type => :boolean, :banner => "Include all sources (including path and git)." end method_option "all-platforms", :type => :boolean, :banner => "Include gems for all platforms present in the lockfile, not only the current one" method_option "cache-path", :type => :string, :banner => "Specify a different cache path than the default (vendor/cache)." method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile" method_option "no-install", :type => :boolean, :banner => "Don't install the gems, only the package." method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache." method_option "path", :type => :string, :banner => "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine" method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors." method_option "frozen", :type => :boolean, :banner => "Do not allow the Gemfile.lock to be updated after this package operation's install" long_desc <<-D The package command will copy the .gem files for every gem in the bundle into the directory ./vendor/cache. If you then check that directory into your source control repository, others who check out your source will be able to install the bundle without having to download any additional gems. D def package require "bundler/cli/package" Package.new(options).run end map %w[pack] => :package desc "exec [OPTIONS]", "Run the command in context of the bundle" method_option :keep_file_descriptors, :type => :boolean, :default => false long_desc <<-D Exec runs a command, providing it access to the gems in the bundle. While using bundle exec you can require and call the bundled gems as if they were installed into the system wide RubyGems repository. D map "e" => "exec" def exec(*args) require "bundler/cli/exec" Exec.new(options, args).run end desc "config NAME [VALUE]", "Retrieve or set a configuration value" long_desc <<-D Retrieves or sets a configuration value. If only one parameter is provided, retrieve the value. If two parameters are provided, replace the existing value with the newly provided one. By default, setting a configuration value sets it for all projects on the machine. If a global setting is superceded by local configuration, this command will show the current value, as well as any superceded values and where they were specified. D method_option "parseable", :type => :boolean, :banner => "Use minimal formatting for more parseable output" def config(*args) require "bundler/cli/config" Config.new(options, args, self).run end desc "open GEM", "Opens the source directory of the given bundled gem" def open(name) require "bundler/cli/open" Open.new(options, name).run end if Bundler.feature_flag.console_command? desc "console [GROUP]", "Opens an IRB session with the bundle pre-loaded" def console(group = nil) require "bundler/cli/console" Console.new(options, group).run end end desc "version", "Prints the bundler's version information" def version cli_help = current_command.name == "cli_help" if cli_help || ARGV.include?("version") build_info = " (#{BuildMetadata.built_at} commit #{BuildMetadata.git_commit_sha})" end if !cli_help && Bundler.feature_flag.print_only_version_number? Bundler.ui.info "#{Bundler::VERSION}#{build_info}" else Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}" end end map %w[-v --version] => :version desc "licenses", "Prints the license of all gems in the bundle" def licenses Bundler.load.specs.sort_by {|s| s.license.to_s }.reverse_each do |s| gem_name = s.name license = s.license || s.licenses if license.empty? Bundler.ui.warn "#{gem_name}: Unknown" else Bundler.ui.info "#{gem_name}: #{license}" end end end desc "viz [OPTIONS]", "Generates a visual dependency graph", :hide => true long_desc <<-D Viz generates a PNG file of the current Gemfile as a dependency graph. Viz requires the ruby-graphviz gem (and its dependencies). The associated gems must also be installed via 'bundle install'. D method_option :file, :type => :string, :default => "gem_graph", :aliases => "-f", :desc => "The name to use for the generated file. see format option" method_option :format, :type => :string, :default => "png", :aliases => "-F", :desc => "This is output format option. Supported format is png, jpg, svg, dot ..." method_option :requirements, :type => :boolean, :default => false, :aliases => "-R", :desc => "Set to show the version of each required dependency." method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version." method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group." def viz require "bundler/cli/viz" Viz.new(options.dup).run end old_gem = instance_method(:gem) desc "gem NAME [OPTIONS]", "Creates a skeleton for creating a rubygem" method_option :exe, :type => :boolean, :default => false, :aliases => ["--bin", "-b"], :desc => "Generate a binary executable for your library." method_option :coc, :type => :boolean, :desc => "Generate a code of conduct file. Set a default with `bundle config gem.coc true`." method_option :edit, :type => :string, :aliases => "-e", :required => false, :banner => "EDITOR", :lazy_default => [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }, :desc => "Open generated gemspec in the specified editor (defaults to $EDITOR or $BUNDLER_EDITOR)" method_option :ext, :type => :boolean, :default => false, :desc => "Generate the boilerplate for C extension code" method_option :mit, :type => :boolean, :desc => "Generate an MIT license file. Set a default with `bundle config gem.mit true`." method_option :test, :type => :string, :lazy_default => "rspec", :aliases => "-t", :banner => "rspec", :desc => "Generate a test directory for your library, either rspec or minitest. Set a default with `bundle config gem.test rspec`." def gem(name) end commands["gem"].tap do |gem_command| def gem_command.run(instance, args = []) arity = 1 # name require "bundler/cli/gem" cmd_args = args + [instance] cmd_args.unshift(instance.options) cmd = begin Gem.new(*cmd_args) rescue ArgumentError => e instance.class.handle_argument_error(self, e, args, arity) end cmd.run end end undef_method(:gem) define_method(:gem, old_gem) private :gem def self.source_root File.expand_path(File.join(File.dirname(__FILE__), "templates")) end desc "clean [OPTIONS]", "Cleans up unused gems in your bundler directory", :hide => true method_option "dry-run", :type => :boolean, :default => false, :banner => "Only print out changes, do not clean gems" method_option "force", :type => :boolean, :default => false, :banner => "Forces clean even if --path is not set" def clean require "bundler/cli/clean" Clean.new(options.dup).run end desc "platform [OPTIONS]", "Displays platform compatibility information" method_option "ruby", :type => :boolean, :default => false, :banner => "only display ruby related platform information" def platform require "bundler/cli/platform" Platform.new(options).run end desc "inject GEM VERSION", "Add the named gem, with version requirements, to the resolved Gemfile", :hide => true method_option "source", :type => :string, :banner => "Install gem from the given source" method_option "group", :type => :string, :banner => "Install gem into a bundler group" def inject(name, version) SharedHelpers.major_deprecation 2, "The `inject` command has been replaced by the `add` command" require "bundler/cli/inject" Inject.new(options.dup, name, version).run end desc "lock", "Creates a lockfile without installing" method_option "update", :type => :array, :lazy_default => true, :banner => "ignore the existing lockfile, update all gems by default, or update list of given gems" method_option "local", :type => :boolean, :default => false, :banner => "do not attempt to fetch remote gemspecs and use the local gem cache only" method_option "print", :type => :boolean, :default => false, :banner => "print the lockfile to STDOUT instead of writing to the file system" method_option "lockfile", :type => :string, :default => nil, :banner => "the path the lockfile should be written to" method_option "full-index", :type => :boolean, :default => false, :banner => "Fall back to using the single-file index of all gems" method_option "add-platform", :type => :array, :default => [], :banner => "Add a new platform to the lockfile" method_option "remove-platform", :type => :array, :default => [], :banner => "Remove a platform from the lockfile" method_option "patch", :type => :boolean, :banner => "If updating, prefer updating only to next patch version" method_option "minor", :type => :boolean, :banner => "If updating, prefer updating only to next minor version" method_option "major", :type => :boolean, :banner => "If updating, prefer updating to next major version (default)" method_option "strict", :type => :boolean, :banner => "If updating, do not allow any gem to be updated past latest --patch | --minor | --major" method_option "conservative", :type => :boolean, :banner => "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated" def lock require "bundler/cli/lock" Lock.new(options).run end desc "env", "Print information about the environment Bundler is running under" def env Env.write($stdout) end desc "doctor [OPTIONS]", "Checks the bundle for common problems" long_desc <<-D Doctor scans the OS dependencies of each of the gems requested in the Gemfile. If missing dependencies are detected, Bundler prints them and exits status 1. Otherwise, Bundler prints a success message and exits with a status of 0. D method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile" method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors." def doctor require "bundler/cli/doctor" Doctor.new(options).run end desc "issue", "Learn how to report an issue in Bundler" def issue require "bundler/cli/issue" Issue.new.run end desc "pristine [GEMS...]", "Restores installed gems to pristine condition" long_desc <<-D Restores installed gems to pristine condition from files located in the gem cache. Gems installed from a git repository will be issued `git checkout --force`. D def pristine(*gems) require "bundler/cli/pristine" Pristine.new(gems).run end if Bundler.feature_flag.plugins? require "bundler/cli/plugin" desc "plugin", "Manage the bundler plugins" subcommand "plugin", Plugin end # Reformat the arguments passed to bundle that include a --help flag # into the corresponding `bundle help #{command}` call def self.reformatted_help_args(args) bundler_commands = all_commands.keys help_flags = %w[--help -h] exec_commands = %w[e ex exe exec] help_used = args.index {|a| help_flags.include? a } exec_used = args.index {|a| exec_commands.include? a } command = args.find {|a| bundler_commands.include? a } if exec_used && help_used if exec_used + help_used == 1 %w[help exec] else args end elsif help_used args = args.dup args.delete_at(help_used) ["help", command || args].flatten.compact else args end end private # Automatically invoke `bundle install` and resume if # Bundler.settings[:auto_install] exists. This is set through config cmd # `bundle config auto_install 1`. # # Note that this method `nil`s out the global Definition object, so it # should be called first, before you instantiate anything like an # `Installer` that'll keep a reference to the old one instead. def auto_install return unless Bundler.settings[:auto_install] begin Bundler.definition.specs rescue GemNotFound Bundler.ui.info "Automatically installing missing gems." Bundler.reset! invoke :install, [] Bundler.reset! end end def current_command _, _, config = @_initializer config[:current_command] end def print_command return unless Bundler.ui.debug? cmd = current_command command_name = cmd.name return if PARSEABLE_COMMANDS.include?(command_name) command = ["bundle", command_name] + args options_to_print = options.dup options_to_print.delete_if do |k, v| next unless o = cmd.options[k] o.default == v end command << Thor::Options.to_switches(options_to_print.sort_by(&:first)).strip command.reject!(&:empty?) Bundler.ui.info "Running `#{command * " "}` with bundler #{Bundler::VERSION}" end def warn_on_outdated_bundler return if Bundler.settings[:disable_version_check] command_name = current_command.name return if PARSEABLE_COMMANDS.include?(command_name) latest = Fetcher::CompactIndex. new(nil, Source::Rubygems::Remote.new(URI("https://rubygems.org")), nil). send(:compact_index_client). instance_variable_get(:@cache). dependencies("bundler"). map {|d| Gem::Version.new(d.first) }. max return unless latest current = Gem::Version.new(VERSION) return if current >= latest latest_installed = Bundler.rubygems.find_name("bundler").map(&:version).max installation = "To install the latest version, run `gem install bundler#{" --pre" if latest.prerelease?}`" if latest_installed && latest_installed > current suggestion = "To update to the most recent installed version (#{latest_installed}), run `bundle update --bundler`" suggestion = "#{installation}\n#{suggestion}" if latest_installed < latest else suggestion = installation end Bundler.ui.warn "The latest bundler is #{latest}, but you are currently running #{current}.\n#{suggestion}" rescue nil end end end bundler-1.16.1/lib/bundler/remote_specification.rb0000644000175000017500000000672413217261023022736 0ustar samuelophsamueloph# frozen_string_literal: true require "uri" module Bundler # Represents a lazily loaded gem specification, where the full specification # is on the source server in rubygems' "quick" index. The proxy object is to # be seeded with what we're given from the source's abbreviated index - the # full specification will only be fetched when necessary. class RemoteSpecification include MatchPlatform include Comparable attr_reader :name, :version, :platform attr_writer :dependencies attr_accessor :source, :remote def initialize(name, version, platform, spec_fetcher) @name = name @version = Gem::Version.create version @platform = platform @spec_fetcher = spec_fetcher @dependencies = nil end # Needed before installs, since the arch matters then and quick # specs don't bother to include the arch in the platform string def fetch_platform @platform = _remote_specification.platform end def full_name if platform == Gem::Platform::RUBY || platform.nil? "#{@name}-#{@version}" else "#{@name}-#{@version}-#{platform}" end end # Compare this specification against another object. Using sort_obj # is compatible with Gem::Specification and other Bundler or RubyGems # objects. Otherwise, use the default Object comparison. def <=>(other) if other.respond_to?(:sort_obj) sort_obj <=> other.sort_obj else super end end # Because Rubyforge cannot be trusted to provide valid specifications # once the remote gem is downloaded, the backend specification will # be swapped out. def __swap__(spec) SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies) @_remote_specification = spec end # Create a delegate used for sorting. This strategy is copied from # RubyGems 2.23 and ensures that Bundler's specifications can be # compared and sorted with RubyGems' own specifications. # # @see #<=> # @see Gem::Specification#sort_obj # # @return [Array] an object you can use to compare and sort this # specification against other specifications def sort_obj [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1] end def to_s "#<#{self.class} name=#{name} version=#{version} platform=#{platform}>" end def dependencies @dependencies ||= begin deps = method_missing(:dependencies) # allow us to handle when the specs dependencies are an array of array of string # see https://github.com/bundler/bundler/issues/5797 deps = deps.map {|d| d.is_a?(Gem::Dependency) ? d : Gem::Dependency.new(*d) } deps end end def git_version return unless loaded_from && source.is_a?(Bundler::Source::Git) " #{source.revision[0..6]}" end private def to_ary nil end def _remote_specification @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform]) @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \ " missing from the server! Try installing with `--full-index` as a workaround.") end def method_missing(method, *args, &blk) _remote_specification.send(method, *args, &blk) end def respond_to?(method, include_all = false) super || _remote_specification.respond_to?(method, include_all) end public :respond_to? end end bundler-1.16.1/lib/bundler/psyched_yaml.rb0000644000175000017500000000152513217261023021216 0ustar samuelophsamueloph# frozen_string_literal: true # Psych could be a gem, so try to ask for it begin gem "psych" rescue LoadError end if defined?(gem) # Psych could be in the stdlib # but it's too late if Syck is already loaded begin require "psych" unless defined?(Syck) rescue LoadError # Apparently Psych wasn't available. Oh well. end # At least load the YAML stdlib, whatever that may be require "yaml" unless defined?(YAML.dump) module Bundler # On encountering invalid YAML, # Psych raises Psych::SyntaxError if defined?(::Psych::SyntaxError) YamlLibrarySyntaxError = ::Psych::SyntaxError else # Syck raises ArgumentError YamlLibrarySyntaxError = ::ArgumentError end end require "bundler/deprecate" begin Bundler::Deprecate.skip_during do require "rubygems/safe_yaml" end rescue LoadError # it's OK if the file isn't there end bundler-1.16.1/lib/bundler/plugin/0000755000175000017500000000000013217261023017503 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/plugin/dsl.rb0000644000175000017500000000332013217261023020610 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module Plugin # Dsl to parse the Gemfile looking for plugins to install class DSL < Bundler::Dsl class PluginGemfileError < PluginError; end alias_method :_gem, :gem # To use for plugin installation as gem # So that we don't have to override all there methods to dummy ones # explicitly. # They will be handled by method_missing [:gemspec, :gem, :path, :install_if, :platforms, :env].each {|m| undef_method m } # This lists the plugins that was added automatically and not specified by # the user. # # When we encounter :type attribute with a source block, we add a plugin # by name bundler-source- to list of plugins to be installed. # # These plugins are optional and are not installed when there is conflict # with any other plugin. attr_reader :inferred_plugins def initialize super @sources = Plugin::SourceList.new @inferred_plugins = [] # The source plugins inferred from :type end def plugin(name, *args) _gem(name, *args) end def method_missing(name, *args) raise PluginGemfileError, "Undefined local variable or method `#{name}' for Gemfile" unless Bundler::Dsl.method_defined? name end def source(source, *args, &blk) options = args.last.is_a?(Hash) ? args.pop.dup : {} options = normalize_hash(options) return super unless options.key?("type") plugin_name = "bundler-source-#{options["type"]}" return if @dependencies.any? {|d| d.name == plugin_name } plugin(plugin_name) @inferred_plugins << plugin_name end end end end bundler-1.16.1/lib/bundler/plugin/installer.rb0000644000175000017500000000600213217261023022023 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # Handles the installation of plugin in appropriate directories. # # This class is supposed to be wrapper over the existing gem installation infra # but currently it itself handles everything as the Source's subclasses (e.g. Source::RubyGems) # are heavily dependent on the Gemfile. module Plugin class Installer autoload :Rubygems, "bundler/plugin/installer/rubygems" autoload :Git, "bundler/plugin/installer/git" def install(names, options) version = options[:version] || [">= 0"] Bundler.settings.temporary(:lockfile_uses_separate_rubygems_sources => false, :disable_multisource => false) do if options[:git] install_git(names, version, options) else sources = options[:source] || Bundler.rubygems.sources install_rubygems(names, version, sources) end end end # Installs the plugin from Definition object created by limited parsing of # Gemfile searching for plugins to be installed # # @param [Definition] definition object # @return [Hash] map of names to their specs they are installed with def install_definition(definition) def definition.lock(*); end definition.resolve_remotely! specs = definition.specs install_from_specs specs end private def install_git(names, version, options) uri = options.delete(:git) options["uri"] = uri source_list = SourceList.new source_list.add_git_source(options) # To support both sources if options[:source] source_list.add_rubygems_source("remotes" => options[:source]) end deps = names.map {|name| Dependency.new name, version } definition = Definition.new(nil, deps, source_list, true) install_definition(definition) end # Installs the plugin from rubygems source and returns the path where the # plugin was installed # # @param [String] name of the plugin gem to search in the source # @param [Array] version of the gem to install # @param [String, Array] source(s) to resolve the gem # # @return [Hash] map of names to the specs of plugins installed def install_rubygems(names, version, sources) deps = names.map {|name| Dependency.new name, version } source_list = SourceList.new source_list.add_rubygems_source("remotes" => sources) definition = Definition.new(nil, deps, source_list, true) install_definition(definition) end # Installs the plugins and deps from the provided specs and returns map of # gems to their paths # # @param specs to install # # @return [Hash] map of names to the specs def install_from_specs(specs) paths = {} specs.each do |spec| spec.source.install spec paths[spec.name] = spec end paths end end end end bundler-1.16.1/lib/bundler/plugin/index.rb0000644000175000017500000001122313217261023021136 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # Manages which plugins are installed and their sources. This also is supposed to map # which plugin does what (currently the features are not implemented so this class is # now a stub class). module Plugin class Index class CommandConflict < PluginError def initialize(plugin, commands) msg = "Command(s) `#{commands.join("`, `")}` declared by #{plugin} are already registered." super msg end end class SourceConflict < PluginError def initialize(plugin, sources) msg = "Source(s) `#{sources.join("`, `")}` declared by #{plugin} are already registered." super msg end end attr_reader :commands def initialize @plugin_paths = {} @commands = {} @sources = {} @hooks = {} @load_paths = {} load_index(global_index_file, true) load_index(local_index_file) if SharedHelpers.in_bundle? end # This function is to be called when a new plugin is installed. This # function shall add the functions of the plugin to existing maps and also # the name to source location. # # @param [String] name of the plugin to be registered # @param [String] path where the plugin is installed # @param [Array] load_paths for the plugin # @param [Array] commands that are handled by the plugin # @param [Array] sources that are handled by the plugin def register_plugin(name, path, load_paths, commands, sources, hooks) old_commands = @commands.dup common = commands & @commands.keys raise CommandConflict.new(name, common) unless common.empty? commands.each {|c| @commands[c] = name } common = sources & @sources.keys raise SourceConflict.new(name, common) unless common.empty? sources.each {|k| @sources[k] = name } hooks.each {|e| (@hooks[e] ||= []) << name } @plugin_paths[name] = path @load_paths[name] = load_paths save_index rescue @commands = old_commands raise end # Path of default index file def index_file Plugin.root.join("index") end # Path where the global index file is stored def global_index_file Plugin.global_root.join("index") end # Path where the local index file is stored def local_index_file Plugin.local_root.join("index") end def plugin_path(name) Pathname.new @plugin_paths[name] end def load_paths(name) @load_paths[name] end # Fetch the name of plugin handling the command def command_plugin(command) @commands[command] end def installed?(name) @plugin_paths[name] end def source?(source) @sources.key? source end def source_plugin(name) @sources[name] end # Returns the list of plugin names handling the passed event def hook_plugins(event) @hooks[event] || [] end private # Reads the index file from the directory and initializes the instance # variables. # # It skips the sources if the second param is true # @param [Pathname] index file path # @param [Boolean] is the index file global index def load_index(index_file, global = false) SharedHelpers.filesystem_access(index_file, :read) do |index_f| valid_file = index_f && index_f.exist? && !index_f.size.zero? break unless valid_file data = index_f.read require "bundler/yaml_serializer" index = YAMLSerializer.load(data) @commands.merge!(index["commands"]) @hooks.merge!(index["hooks"]) @load_paths.merge!(index["load_paths"]) @plugin_paths.merge!(index["plugin_paths"]) @sources.merge!(index["sources"]) unless global end end # Should be called when any of the instance variables change. Stores the # instance variables in YAML format. (The instance variables are supposed # to be only String key value pairs) def save_index index = { "commands" => @commands, "hooks" => @hooks, "load_paths" => @load_paths, "plugin_paths" => @plugin_paths, "sources" => @sources, } require "bundler/yaml_serializer" SharedHelpers.filesystem_access(index_file) do |index_f| FileUtils.mkdir_p(index_f.dirname) File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) } end end end end end bundler-1.16.1/lib/bundler/plugin/api/0000755000175000017500000000000013217261023020254 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/plugin/api/source.rb0000644000175000017500000002623413217261023022110 0ustar samuelophsamueloph# frozen_string_literal: true require "uri" module Bundler module Plugin class API # This class provides the base to build source plugins # All the method here are required to build a source plugin (except # `uri_hash`, `gem_install_dir`; they are helpers). # # Defaults for methods, where ever possible are provided which is # expected to work. But, all source plugins have to override # `fetch_gemspec_files` and `install`. Defaults are also not provided for # `remote!`, `cache!` and `unlock!`. # # The defaults shall work for most situations but nevertheless they can # be (preferably should be) overridden as per the plugins' needs safely # (as long as they behave as expected). # On overriding `initialize` you should call super first. # # If required plugin should override `hash`, `==` and `eql?` methods to be # able to match objects representing same sources, but may be created in # different situation (like form gemfile and lockfile). The default ones # checks only for class and uri, but elaborate source plugins may need # more comparisons (e.g. git checking on branch or tag). # # @!attribute [r] uri # @return [String] the remote specified with `source` block in Gemfile # # @!attribute [r] options # @return [String] options passed during initialization (either from # lockfile or Gemfile) # # @!attribute [r] name # @return [String] name that can be used to uniquely identify a source # # @!attribute [rw] dependency_names # @return [Array] Names of dependencies that the source should # try to resolve. It is not necessary to use this list intenally. This # is present to be compatible with `Definition` and is used by # rubygems source. module Source attr_reader :uri, :options, :name attr_accessor :dependency_names def initialize(opts) @options = opts @dependency_names = [] @uri = opts["uri"] @type = opts["type"] @name = opts["name"] || "#{@type} at #{@uri}" end # This is used by the default `spec` method to constructs the # Specification objects for the gems and versions that can be installed # by this source plugin. # # Note: If the spec method is overridden, this function is not necessary # # @return [Array] paths of the gemspec files for gems that can # be installed def fetch_gemspec_files [] end # Options to be saved in the lockfile so that the source plugin is able # to check out same version of gem later. # # There options are passed when the source plugin is created from the # lock file. # # @return [Hash] def options_to_lock {} end # Install the gem specified by the spec at appropriate path. # `install_path` provides a sufficient default, if the source can only # satisfy one gem, but is not binding. # # @return [String] post installation message (if any) def install(spec, opts) raise MalformattedPlugin, "Source plugins need to override the install method." end # It builds extensions, generates bins and installs them for the spec # provided. # # It depends on `spec.loaded_from` to get full_gem_path. The source # plugins should set that. # # It should be called in `install` after the plugin is done placing the # gem at correct install location. # # It also runs Gem hooks `pre_install`, `post_build` and `post_install` # # Note: Do not override if you don't know what you are doing. def post_install(spec, disable_exts = false) opts = { :env_shebang => false, :disable_extensions => disable_exts } installer = Bundler::Source::Path::Installer.new(spec, opts) installer.post_install end # A default installation path to install a single gem. If the source # servers multiple gems, it's not of much use and the source should one # of its own. def install_path @install_path ||= begin base_name = File.basename(URI.parse(uri).normalize.path) gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}") end end # Parses the gemspec files to find the specs for the gems that can be # satisfied by the source. # # Few important points to keep in mind: # - If the gems are not installed then it shall return specs for all # the gems it can satisfy # - If gem is installed (that is to be detected by the plugin itself) # then it shall return at least the specs that are installed. # - The `loaded_from` for each of the specs shall be correct (it is # used to find the load path) # # @return [Bundler::Index] index containing the specs def specs files = fetch_gemspec_files Bundler::Index.build do |index| files.each do |file| next unless spec = Bundler.load_gemspec(file) Bundler.rubygems.set_installed_by_version(spec) spec.source = self Bundler.rubygems.validate(spec) index << spec end end end # Set internal representation to fetch the gems/specs from remote. # # When this is called, the source should try to fetch the specs and # install from remote path. def remote! end # Set internal representation to fetch the gems/specs from app cache. # # When this is called, the source should try to fetch the specs and # install from the path provided by `app_cache_path`. def cached! end # This is called to update the spec and installation. # # If the source plugin is loaded from lockfile or otherwise, it shall # refresh the cache/specs (e.g. git sources can make a fresh clone). def unlock! end # Name of directory where plugin the is expected to cache the gems when # #cache is called. # # Also this name is matched against the directories in cache for pruning # # This is used by `app_cache_path` def app_cache_dirname base_name = File.basename(URI.parse(uri).normalize.path) "#{base_name}-#{uri_hash}" end # This method is called while caching to save copy of the gems that the # source can resolve to path provided by `app_cache_app`so that they can # be reinstalled from the cache without querying the remote (i.e. an # alternative to remote) # # This is stored with the app and source plugins should try to provide # specs and install only from this cache when `cached!` is called. # # This cache is different from the internal caching that can be done # at sub paths of `cache_path` (from API). This can be though as caching # by bundler. def cache(spec, custom_path = nil) new_cache_path = app_cache_path(custom_path) FileUtils.rm_rf(new_cache_path) FileUtils.cp_r(install_path, new_cache_path) FileUtils.touch(app_cache_path.join(".bundlecache")) end # This shall check if two source object represent the same source. # # The comparison shall take place only on the attribute that can be # inferred from the options passed from Gemfile and not on attibutes # that are used to pin down the gem to specific version (e.g. Git # sources should compare on branch and tag but not on commit hash) # # The sources objects are constructed from Gemfile as well as from # lockfile. To converge the sources, it is necessary that they match. # # The same applies for `eql?` and `hash` def ==(other) other.is_a?(self.class) && uri == other.uri end # When overriding `eql?` please preserve the behaviour as mentioned in # docstring for `==` method. alias_method :eql?, :== # When overriding `hash` please preserve the behaviour as mentioned in # docstring for `==` method, i.e. two methods equal by above comparison # should have same hash. def hash [self.class, uri].hash end # A helper method, not necessary if not used internally. def installed? File.directory?(install_path) end # The full path where the plugin should cache the gem so that it can be # installed latter. # # Note: Do not override if you don't know what you are doing. def app_cache_path(custom_path = nil) @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname) end # Used by definition. # # Note: Do not override if you don't know what you are doing. def unmet_deps specs.unmet_dependency_names end # Note: Do not override if you don't know what you are doing. def can_lock?(spec) spec.source == self end # Generates the content to be entered into the lockfile. # Saves type and remote and also calls to `options_to_lock`. # # Plugin should use `options_to_lock` to save information in lockfile # and not override this. # # Note: Do not override if you don't know what you are doing. def to_lock out = String.new("#{LockfileParser::PLUGIN}\n") out << " remote: #{@uri}\n" out << " type: #{@type}\n" options_to_lock.each do |opt, value| out << " #{opt}: #{value}\n" end out << " specs:\n" end def to_s "plugin source for #{options[:type]} with uri #{uri}" end # Note: Do not override if you don't know what you are doing. def include?(other) other == self end def uri_hash SharedHelpers.digest(:SHA1).hexdigest(uri) end # Note: Do not override if you don't know what you are doing. def gem_install_dir Bundler.install_path end # It is used to obtain the full_gem_path. # # spec's loaded_from path is expanded against this to get full_gem_path # # Note: Do not override if you don't know what you are doing. def root Bundler.root end # @private # Returns true def bundler_plugin_api_source? true end # @private # This API on source might not be stable, and for now we expect plugins # to download all specs in `#specs`, so we implement the method for # compatibility purposes and leave it undocumented (and don't support) # overriding it) def double_check_for(*); end end end end end bundler-1.16.1/lib/bundler/plugin/api.rb0000644000175000017500000000550413217261023020605 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # This is the interfacing class represents the API that we intend to provide # the plugins to use. # # For plugins to be independent of the Bundler internals they shall limit their # interactions to methods of this class only. This will save them from breaking # when some internal change. # # Currently we are delegating the methods defined in Bundler class to # itself. So, this class acts as a buffer. # # If there is some change in the Bundler class that is incompatible to its # previous behavior or if otherwise desired, we can reimplement(or implement) # the method to preserve compatibility. # # To use this, either the class can inherit this class or use it directly. # For example of both types of use, refer the file `spec/plugins/command.rb` # # To use it without inheriting, you will have to create an object of this # to use the functions (except for declaration functions like command, source, # and hooks). module Plugin class API autoload :Source, "bundler/plugin/api/source" # The plugins should declare that they handle a command through this helper. # # @param [String] command being handled by them # @param [Class] (optional) class that handles the command. If not # provided, the `self` class will be used. def self.command(command, cls = self) Plugin.add_command command, cls end # The plugins should declare that they provide a installation source # through this helper. # # @param [String] the source type they provide # @param [Class] (optional) class that handles the source. If not # provided, the `self` class will be used. def self.source(source, cls = self) cls.send :include, Bundler::Plugin::API::Source Plugin.add_source source, cls end def self.hook(event, &block) Plugin.add_hook(event, &block) end # The cache dir to be used by the plugins for storage # # @return [Pathname] path of the cache dir def cache_dir Plugin.cache.join("plugins") end # A tmp dir to be used by plugins # Accepts names that get concatenated as suffix # # @return [Pathname] object for the new directory created def tmp(*names) Bundler.tmp(["plugin", *names].join("-")) end def method_missing(name, *args, &blk) return Bundler.send(name, *args, &blk) if Bundler.respond_to?(name) return SharedHelpers.send(name, *args, &blk) if SharedHelpers.respond_to?(name) super end def respond_to_missing?(name, include_private = false) SharedHelpers.respond_to?(name, include_private) || Bundler.respond_to?(name, include_private) || super end end end end bundler-1.16.1/lib/bundler/plugin/installer/0000755000175000017500000000000013217261023021500 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/plugin/installer/git.rb0000644000175000017500000000154113217261023022611 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module Plugin class Installer class Git < Bundler::Source::Git def cache_path @cache_path ||= begin git_scope = "#{base_name}-#{uri_hash}" Plugin.cache.join("bundler", "git", git_scope) end end def install_path @install_path ||= begin git_scope = "#{base_name}-#{shortref_for_path(revision)}" Plugin.root.join("bundler", "gems", git_scope) end end def version_message(spec) "#{spec.name} #{spec.version}" end def root Plugin.root end def generate_bin(spec, disable_extensions = false) # Need to find a way without code duplication # For now, we can ignore this end end end end end bundler-1.16.1/lib/bundler/plugin/installer/rubygems.rb0000644000175000017500000000075513217261023023671 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module Plugin class Installer class Rubygems < Bundler::Source::Rubygems def version_message(spec) "#{spec.name} #{spec.version}" end private def requires_sudo? false # Will change on implementation of project level plugins end def rubygems_dir Plugin.root end def cache_path Plugin.cache end end end end end bundler-1.16.1/lib/bundler/plugin/source_list.rb0000644000175000017500000000134713217261023022370 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # SourceList object to be used while parsing the Gemfile, setting the # approptiate options to be used with Source classes for plugin installation module Plugin class SourceList < Bundler::SourceList def add_git_source(options = {}) add_source_to_list Plugin::Installer::Git.new(options), git_sources end def add_rubygems_source(options = {}) add_source_to_list Plugin::Installer::Rubygems.new(options), @rubygems_sources end def all_sources path_sources + git_sources + rubygems_sources + [metadata_source] end private def rubygems_aggregate_class Plugin::Installer::Rubygems end end end end bundler-1.16.1/lib/bundler/index.rb0000644000175000017500000001237013217261023017644 0ustar samuelophsamueloph# frozen_string_literal: true require "set" module Bundler class Index include Enumerable def self.build i = new yield i i end attr_reader :specs, :all_specs, :sources protected :specs, :all_specs RUBY = "ruby".freeze NULL = "\0".freeze def initialize @sources = [] @cache = {} @specs = Hash.new {|h, k| h[k] = {} } @all_specs = Hash.new {|h, k| h[k] = EMPTY_SEARCH } end def initialize_copy(o) @sources = o.sources.dup @cache = {} @specs = Hash.new {|h, k| h[k] = {} } @all_specs = Hash.new {|h, k| h[k] = EMPTY_SEARCH } o.specs.each do |name, hash| @specs[name] = hash.dup end o.all_specs.each do |name, array| @all_specs[name] = array.dup end end def inspect "#<#{self.class}:0x#{object_id} sources=#{sources.map(&:inspect)} specs.size=#{specs.size}>" end def empty? each { return false } true end def search_all(name) all_matches = local_search(name) + @all_specs[name] @sources.each do |source| all_matches.concat(source.search_all(name)) end all_matches end # Search this index's specs, and any source indexes that this index knows # about, returning all of the results. def search(query, base = nil) sort_specs(unsorted_search(query, base)) end def unsorted_search(query, base) results = local_search(query, base) seen = results.map(&:full_name).to_set unless @sources.empty? @sources.each do |source| source.unsorted_search(query, base).each do |spec| results << spec if seen.add?(spec.full_name) end end results end protected :unsorted_search def self.sort_specs(specs) specs.sort_by do |s| platform_string = s.platform.to_s [s.version, platform_string == RUBY ? NULL : platform_string] end end def sort_specs(specs) self.class.sort_specs(specs) end def local_search(query, base = nil) case query when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query) when String then specs_by_name(query) when Gem::Dependency then search_by_dependency(query, base) when DepProxy then search_by_dependency(query.dep, base) else raise "You can't search for a #{query.inspect}." end end alias_method :[], :search def <<(spec) @specs[spec.name][spec.full_name] = spec spec end def each(&blk) return enum_for(:each) unless blk specs.values.each do |spec_sets| spec_sets.values.each(&blk) end sources.each {|s| s.each(&blk) } self end def spec_names names = specs.keys + sources.map(&:spec_names) names.uniq! names end # returns a list of the dependencies def unmet_dependency_names dependency_names.select do |name| name != "bundler" && search(name).empty? end end def dependency_names names = [] each do |spec| spec.dependencies.each do |dep| next if dep.type == :development names << dep.name end end names.uniq end def use(other, override_dupes = false) return unless other other.each do |s| if (dupes = search_by_spec(s)) && !dupes.empty? # safe to << since it's a new array when it has contents @all_specs[s.name] = dupes << s next unless override_dupes end self << s end self end def size @sources.inject(@specs.size) do |size, source| size += source.size end end # Whether all the specs in self are in other # TODO: rename to #include? def ==(other) all? do |spec| other_spec = other[spec].first other_spec && dependencies_eql?(spec, other_spec) && spec.source == other_spec.source end end def dependencies_eql?(spec, other_spec) deps = spec.dependencies.select {|d| d.type != :development } other_deps = other_spec.dependencies.select {|d| d.type != :development } Set.new(deps) == Set.new(other_deps) end def add_source(index) raise ArgumentError, "Source must be an index, not #{index.class}" unless index.is_a?(Index) @sources << index @sources.uniq! # need to use uniq! here instead of checking for the item before adding end private def specs_by_name(name) @specs[name].values end def search_by_dependency(dependency, base = nil) @cache[base || false] ||= {} @cache[base || false][dependency] ||= begin specs = specs_by_name(dependency.name) specs += base if base found = specs.select do |spec| next true if spec.source.is_a?(Source::Gemspec) if base # allow all platforms when searching from a lockfile dependency.matches_spec?(spec) else dependency.matches_spec?(spec) && Gem::Platform.match(spec.platform) end end found end end EMPTY_SEARCH = [].freeze def search_by_spec(spec) spec = @specs[spec.name][spec.full_name] spec ? [spec] : EMPTY_SEARCH end end end bundler-1.16.1/lib/bundler/version.rb0000644000175000017500000000146513217261023020225 0ustar samuelophsamueloph# frozen_string_literal: false # Ruby 1.9.3 and old RubyGems don't play nice with frozen version strings # rubocop:disable MutableConstant module Bundler # We're doing this because we might write tests that deal # with other versions of bundler and we are unsure how to # handle this better. VERSION = "1.16.1" unless defined?(::Bundler::VERSION) def self.overwrite_loaded_gem_version begin require "rubygems" rescue LoadError return end return unless bundler_spec = Gem.loaded_specs["bundler"] return if bundler_spec.version == VERSION bundler_spec.version = Bundler::VERSION end private_class_method :overwrite_loaded_gem_version overwrite_loaded_gem_version def self.bundler_major_version @bundler_major_version ||= VERSION.split(".").first.to_i end end bundler-1.16.1/lib/bundler/similarity_detector.rb0000644000175000017500000000353013217261023022612 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class SimilarityDetector SimilarityScore = Struct.new(:string, :distance) # initialize with an array of words to be matched against def initialize(corpus) @corpus = corpus end # return an array of words similar to 'word' from the corpus def similar_words(word, limit = 3) words_by_similarity = @corpus.map {|w| SimilarityScore.new(w, levenshtein_distance(word, w)) } words_by_similarity.select {|s| s.distance <= limit }.sort_by(&:distance).map(&:string) end # return the result of 'similar_words', concatenated into a list # (eg "a, b, or c") def similar_word_list(word, limit = 3) words = similar_words(word, limit) if words.length == 1 words[0] elsif words.length > 1 [words[0..-2].join(", "), words[-1]].join(" or ") end end protected # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36 def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1) # ins, del, sub are weighted costs return nil if this.nil? return nil if that.nil? dm = [] # distance matrix # Initialize first row values dm[0] = (0..this.length).collect {|i| i * ins } fill = [0] * (this.length - 1) # Initialize first column values (1..that.length).each do |i| dm[i] = [i * del, fill.flatten] end # populate matrix (1..that.length).each do |i| (1..this.length).each do |j| # critical comparison dm[i][j] = [ dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub), dm[i][j - 1] + ins, dm[i - 1][j] + del ].min end end # The last value in matrix is the Levenshtein distance between the strings dm[that.length][this.length] end end end bundler-1.16.1/lib/bundler/settings.rb0000644000175000017500000002720713217261023020402 0ustar samuelophsamueloph# frozen_string_literal: true require "uri" module Bundler class Settings autoload :Mirror, "bundler/mirror" autoload :Mirrors, "bundler/mirror" autoload :Validator, "bundler/settings/validator" BOOL_KEYS = %w[ allow_bundler_dependency_conflicts allow_deployment_source_credential_changes allow_offline_install auto_clean_without_path auto_install cache_all cache_all_platforms cache_command_is_package console_command default_install_uses_path deployment deployment_means_frozen disable_checksum_validation disable_exec_load disable_local_branch_check disable_multisource disable_shared_gems disable_version_check error_on_stderr force_ruby_platform forget_cli_options frozen gem.coc gem.mit global_gem_cache ignore_messages init_gems_rb list_command lockfile_uses_separate_rubygems_sources major_deprecations no_install no_prune only_update_to_newer_versions path.system plugins prefer_gems_rb print_only_version_number setup_makes_kernel_gem_public silence_root_warning skip_default_git_sources specific_platform suppress_install_using_messages unlock_source_unlocks_spec update_requires_all_flag ].freeze NUMBER_KEYS = %w[ redirect retry ssl_verify_mode timeout ].freeze ARRAY_KEYS = %w[ with without ].freeze DEFAULT_CONFIG = { :disable_version_check => true, :redirect => 5, :retry => 3, :timeout => 10, }.freeze def initialize(root = nil) @root = root @local_config = load_config(local_config_file) @global_config = load_config(global_config_file) @temporary = {} end def [](name) key = key_for(name) value = @temporary.fetch(key) do @local_config.fetch(key) do ENV.fetch(key) do @global_config.fetch(key) do DEFAULT_CONFIG.fetch(name) do nil end end end end end converted_value(value, name) end def set_command_option(key, value) if Bundler.feature_flag.forget_cli_options? temporary(key => value) value else command = if value.nil? "bundle config --delete #{key}" else "bundle config #{key} #{Array(value).join(":")}" end Bundler::SharedHelpers.major_deprecation 2,\ "flags passed to commands " \ "will no longer be automatically remembered. Instead please set flags " \ "you want remembered between commands using `bundle config " \ " `, i.e. `#{command}`" set_local(key, value) end end def set_command_option_if_given(key, value) return if value.nil? set_command_option(key, value) end def set_local(key, value) local_config_file || raise(GemfileNotFound, "Could not locate Gemfile") set_key(key, value, @local_config, local_config_file) end def temporary(update) existing = Hash[update.map {|k, _| [k, @temporary[key_for(k)]] }] update.each do |k, v| set_key(k, v, @temporary, nil) end return unless block_given? begin yield ensure existing.each {|k, v| set_key(k, v, @temporary, nil) } end end def set_global(key, value) set_key(key, value, @global_config, global_config_file) end def all env_keys = ENV.keys.grep(/\ABUNDLE_.+/) keys = @temporary.keys | @global_config.keys | @local_config.keys | env_keys keys.map do |key| key.sub(/^BUNDLE_/, "").gsub(/__/, ".").downcase end end def local_overrides repos = {} all.each do |k| repos[$'] = self[k] if k =~ /^local\./ end repos end def mirror_for(uri) uri = URI(uri.to_s) unless uri.is_a?(URI) gem_mirrors.for(uri.to_s).uri end def credentials_for(uri) self[uri.to_s] || self[uri.host] end def gem_mirrors all.inject(Mirrors.new) do |mirrors, k| mirrors.parse(k, self[k]) if k.start_with?("mirror.") mirrors end end def locations(key) key = key_for(key) locations = {} locations[:temporary] = @temporary[key] if @temporary.key?(key) locations[:local] = @local_config[key] if @local_config.key?(key) locations[:env] = ENV[key] if ENV[key] locations[:global] = @global_config[key] if @global_config.key?(key) locations[:default] = DEFAULT_CONFIG[key] if DEFAULT_CONFIG.key?(key) locations end def pretty_values_for(exposed_key) key = key_for(exposed_key) locations = [] if @temporary.key?(key) locations << "Set for the current command: #{converted_value(@temporary[key], exposed_key).inspect}" end if @local_config.key?(key) locations << "Set for your local app (#{local_config_file}): #{converted_value(@local_config[key], exposed_key).inspect}" end if value = ENV[key] locations << "Set via #{key}: #{converted_value(value, exposed_key).inspect}" end if @global_config.key?(key) locations << "Set for the current user (#{global_config_file}): #{converted_value(@global_config[key], exposed_key).inspect}" end return ["You have not configured a value for `#{exposed_key}`"] if locations.empty? locations end # for legacy reasons, the ruby scope isnt appended when the setting comes from ENV or the global config, # nor do we respect :disable_shared_gems def path key = key_for(:path) path = ENV[key] || @global_config[key] if path && !@temporary.key?(key) && !@local_config.key?(key) return Path.new(path, false, false, false) end system_path = self["path.system"] || (self[:disable_shared_gems] == false) Path.new(self[:path], true, system_path, Bundler.feature_flag.default_install_uses_path?) end Path = Struct.new(:explicit_path, :append_ruby_scope, :system_path, :default_install_uses_path) do def path path = base_path path = File.join(path, Bundler.ruby_scope) if append_ruby_scope && !use_system_gems? path end def use_system_gems? return true if system_path return false if explicit_path !default_install_uses_path end def base_path path = explicit_path path ||= ".bundle" unless use_system_gems? path ||= Bundler.rubygems.gem_dir path end def validate! return unless explicit_path && system_path path = Bundler.settings.pretty_values_for(:path) path.unshift(nil, "path:") unless path.empty? system_path = Bundler.settings.pretty_values_for("path.system") system_path.unshift(nil, "path.system:") unless system_path.empty? disable_shared_gems = Bundler.settings.pretty_values_for(:disable_shared_gems) disable_shared_gems.unshift(nil, "disable_shared_gems:") unless disable_shared_gems.empty? raise InvalidOption, "Using a custom path while using system gems is unsupported.\n#{path.join("\n")}\n#{system_path.join("\n")}\n#{disable_shared_gems.join("\n")}" end end def allow_sudo? key = key_for(:path) path_configured = @temporary.key?(key) || @local_config.key?(key) !path_configured end def ignore_config? ENV["BUNDLE_IGNORE_CONFIG"] end def app_cache_path @app_cache_path ||= self[:cache_path] || "vendor/cache" end def validate! all.each do |raw_key| [@local_config, ENV, @global_config].each do |settings| value = converted_value(settings[key_for(raw_key)], raw_key) Validator.validate!(raw_key, value, settings.to_hash.dup) end end end def key_for(key) key = Settings.normalize_uri(key).to_s if key.is_a?(String) && /https?:/ =~ key key = key.to_s.gsub(".", "__").upcase "BUNDLE_#{key}" end private def parent_setting_for(name) split_specific_setting_for(name)[0] end def specific_gem_for(name) split_specific_setting_for(name)[1] end def split_specific_setting_for(name) name.split(".") end def is_bool(name) BOOL_KEYS.include?(name.to_s) || BOOL_KEYS.include?(parent_setting_for(name.to_s)) end def to_bool(value) case value when nil, /\A(false|f|no|n|0|)\z/i, false false else true end end def is_num(key) NUMBER_KEYS.include?(key.to_s) end def is_array(key) ARRAY_KEYS.include?(key.to_s) end def to_array(value) return [] unless value value.split(":").map(&:to_sym) end def array_to_s(array) array = Array(array) return nil if array.empty? array.join(":").tr(" ", ":") end def set_key(raw_key, value, hash, file) raw_key = raw_key.to_s value = array_to_s(value) if is_array(raw_key) key = key_for(raw_key) return if hash[key] == value hash[key] = value hash.delete(key) if value.nil? Validator.validate!(raw_key, converted_value(value, raw_key), hash) return unless file SharedHelpers.filesystem_access(file) do |p| FileUtils.mkdir_p(p.dirname) require "bundler/yaml_serializer" p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) } end end def converted_value(value, key) if is_array(key) to_array(value) elsif value.nil? nil elsif is_bool(key) || value == "false" to_bool(value) elsif is_num(key) value.to_i else value.to_s end end def global_config_file if ENV["BUNDLE_CONFIG"] && !ENV["BUNDLE_CONFIG"].empty? Pathname.new(ENV["BUNDLE_CONFIG"]) else begin Bundler.user_bundle_path.join("config") rescue PermissionError, GenericSystemCallError nil end end end def local_config_file Pathname.new(@root).join("config") if @root end CONFIG_REGEX = %r{ # rubocop:disable Style/RegexpLiteral ^ (BUNDLE_.+):\s # the key (?: !\s)? # optional exclamation mark found with ruby 1.9.3 (['"]?) # optional opening quote (.* # contents of the value (?: # optionally, up until the next key (\n(?!BUNDLE).+)* ) ) \2 # matching closing quote $ }xo def load_config(config_file) return {} if !config_file || ignore_config? SharedHelpers.filesystem_access(config_file, :read) do |file| valid_file = file.exist? && !file.size.zero? return {} unless valid_file require "bundler/yaml_serializer" YAMLSerializer.load file.read end end PER_URI_OPTIONS = %w[ fallback_timeout ].freeze NORMALIZE_URI_OPTIONS_PATTERN = / \A (\w+\.)? # optional prefix key (https?.*?) # URI (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key \z /ix # TODO: duplicates Rubygems#normalize_uri # TODO: is this the correct place to validate mirror URIs? def self.normalize_uri(uri) uri = uri.to_s if uri =~ NORMALIZE_URI_OPTIONS_PATTERN prefix = $1 uri = $2 suffix = $3 end uri = "#{uri}/" unless uri.end_with?("/") uri = URI(uri) unless uri.absolute? raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri) end "#{prefix}#{uri}#{suffix}" end end end bundler-1.16.1/lib/bundler/yaml_serializer.rb0000644000175000017500000000464013217261023021731 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # A stub yaml serializer that can handle only hashes and strings (as of now). module YAMLSerializer module_function def dump(hash) yaml = String.new("---") yaml << dump_hash(hash) end def dump_hash(hash) yaml = String.new("\n") hash.each do |k, v| yaml << k << ":" if v.is_a?(Hash) yaml << dump_hash(v).gsub(/^(?!$)/, " ") # indent all non-empty lines elsif v.is_a?(Array) # Expected to be array of strings yaml << "\n- " << v.map {|s| s.to_s.gsub(/\s+/, " ").inspect }.join("\n- ") << "\n" else yaml << " " << v.to_s.gsub(/\s+/, " ").inspect << "\n" end end yaml end ARRAY_REGEX = / ^ (?:[ ]*-[ ]) # '- ' before array items (['"]?) # optional opening quote (.*) # value \1 # matching closing quote $ /xo HASH_REGEX = / ^ ([ ]*) # indentations (.+) # key (?::(?=(?:\s|$))) # : (without the lookahead the #key includes this when : is present in value) [ ]? (?: !\s)? # optional exclamation mark found with ruby 1.9.3 (['"]?) # optional opening quote (.*) # value \3 # matching closing quote $ /xo def load(str) res = {} stack = [res] last_hash = nil last_empty_key = nil str.split(/\r?\n/).each do |line| if match = HASH_REGEX.match(line) indent, key, quote, val = match.captures key = convert_to_backward_compatible_key(key) depth = indent.scan(/ /).length if quote.empty? && val.empty? new_hash = {} stack[depth][key] = new_hash stack[depth + 1] = new_hash last_empty_key = key last_hash = stack[depth] else stack[depth][key] = val end elsif match = ARRAY_REGEX.match(line) _, val = match.captures last_hash[last_empty_key] = [] unless last_hash[last_empty_key].is_a?(Array) last_hash[last_empty_key].push(val) end end res end # for settings' keys def convert_to_backward_compatible_key(key) key = "#{key}/" if key =~ /https?:/i && key !~ %r{/\Z} key = key.gsub(".", "__") if key.include?(".") key end class << self private :dump_hash, :convert_to_backward_compatible_key end end end bundler-1.16.1/lib/bundler/worker.rb0000644000175000017500000000510613217261023020045 0ustar samuelophsamueloph# frozen_string_literal: true require "thread" module Bundler class Worker POISON = Object.new class WrappedException < StandardError attr_reader :exception def initialize(exn) @exception = exn end end # @return [String] the name of the worker attr_reader :name # Creates a worker pool of specified size # # @param size [Integer] Size of pool # @param name [String] name the name of the worker # @param func [Proc] job to run in inside the worker pool def initialize(size, name, func) @name = name @request_queue = Queue.new @response_queue = Queue.new @func = func @size = size @threads = nil SharedHelpers.trap("INT") { abort_threads } end # Enqueue a request to be executed in the worker pool # # @param obj [String] mostly it is name of spec that should be downloaded def enq(obj) create_threads unless @threads @request_queue.enq obj end # Retrieves results of job function being executed in worker pool def deq result = @response_queue.deq raise result.exception if result.is_a?(WrappedException) result end def stop stop_threads end private def process_queue(i) loop do obj = @request_queue.deq break if obj.equal? POISON @response_queue.enq apply_func(obj, i) end end def apply_func(obj, i) @func.call(obj, i) rescue Exception => e WrappedException.new(e) end # Stop the worker threads by sending a poison object down the request queue # so as worker threads after retrieving it, shut themselves down def stop_threads return unless @threads @threads.each { @request_queue.enq POISON } @threads.each(&:join) @threads = nil end def abort_threads return unless @threads Bundler.ui.debug("\n#{caller.join("\n")}") @threads.each(&:exit) exit 1 end def create_threads creation_errors = [] @threads = Array.new(@size) do |i| begin Thread.start { process_queue(i) }.tap do |thread| thread.name = "#{name} Worker ##{i}" if thread.respond_to?(:name=) end rescue ThreadError => e creation_errors << e nil end end.compact return if creation_errors.empty? message = "Failed to create threads for the #{name} worker: #{creation_errors.map(&:to_s).uniq.join(", ")}" raise ThreadCreationError, message if @threads.empty? Bundler.ui.info message end end end bundler-1.16.1/lib/bundler/feature_flag.rb0000644000175000017500000000526613217261023021167 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class FeatureFlag def self.settings_flag(flag, &default) unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s) raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key" end settings_method("#{flag}?", flag, &default) end private_class_method :settings_flag def self.settings_option(key, &default) settings_method(key, key, &default) end private_class_method :settings_option def self.settings_method(name, key, &default) define_method(name) do value = Bundler.settings[key] value = instance_eval(&default) if value.nil? && !default.nil? value end end private_class_method :settings_method (1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } } settings_flag(:allow_bundler_dependency_conflicts) { bundler_2_mode? } settings_flag(:allow_offline_install) { bundler_2_mode? } settings_flag(:auto_clean_without_path) { bundler_2_mode? } settings_flag(:cache_all) { bundler_2_mode? } settings_flag(:cache_command_is_package) { bundler_2_mode? } settings_flag(:console_command) { !bundler_2_mode? } settings_flag(:default_install_uses_path) { bundler_2_mode? } settings_flag(:deployment_means_frozen) { bundler_2_mode? } settings_flag(:disable_multisource) { bundler_2_mode? } settings_flag(:error_on_stderr) { bundler_2_mode? } settings_flag(:forget_cli_options) { bundler_2_mode? } settings_flag(:global_gem_cache) { bundler_2_mode? } settings_flag(:init_gems_rb) { bundler_2_mode? } settings_flag(:list_command) { bundler_2_mode? } settings_flag(:lockfile_uses_separate_rubygems_sources) { bundler_2_mode? } settings_flag(:only_update_to_newer_versions) { bundler_2_mode? } settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") } settings_flag(:prefer_gems_rb) { bundler_2_mode? } settings_flag(:print_only_version_number) { bundler_2_mode? } settings_flag(:setup_makes_kernel_gem_public) { !bundler_2_mode? } settings_flag(:skip_default_git_sources) { bundler_2_mode? } settings_flag(:specific_platform) { bundler_2_mode? } settings_flag(:suppress_install_using_messages) { bundler_2_mode? } settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? } settings_flag(:update_requires_all_flag) { bundler_2_mode? } settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install } def initialize(bundler_version) @bundler_version = Gem::Version.create(bundler_version) end def major_version @bundler_version.segments.first end private :major_version end end bundler-1.16.1/lib/bundler/version_ranges.rb0000644000175000017500000000556513217261023021571 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module VersionRanges NEq = Struct.new(:version) ReqR = Struct.new(:left, :right) class ReqR Endpoint = Struct.new(:version, :inclusive) def to_s "#{left.inclusive ? "[" : "("}#{left.version}, #{right.version}#{right.inclusive ? "]" : ")"}" end INFINITY = Object.new.freeze ZERO = Gem::Version.new("0.a") def cover?(v) return false if left.inclusive && left.version > v return false if !left.inclusive && left.version >= v if right.version != INFINITY return false if right.inclusive && right.version < v return false if !right.inclusive && right.version <= v end true end def empty? left.version == right.version && !(left.inclusive && right.inclusive) end def single? left.version == right.version end UNIVERSAL = ReqR.new(ReqR::Endpoint.new(Gem::Version.new("0.a"), true), ReqR::Endpoint.new(ReqR::INFINITY, false)).freeze end def self.for_many(requirements) requirements = requirements.map(&:requirements).flatten(1).map {|r| r.join(" ") } requirements << ">= 0.a" if requirements.empty? requirement = Gem::Requirement.new(requirements) self.for(requirement) end def self.for(requirement) ranges = requirement.requirements.map do |op, v| case op when "=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v, true)) when "!=" then NEq.new(v) when ">=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(ReqR::INFINITY, false)) when ">" then ReqR.new(ReqR::Endpoint.new(v, false), ReqR::Endpoint.new(ReqR::INFINITY, false)) when "<" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, false)) when "<=" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, true)) when "~>" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v.bump, false)) else raise "unknown version op #{op} in requirement #{requirement}" end end.uniq ranges, neqs = ranges.partition {|r| !r.is_a?(NEq) } [ranges.sort_by {|range| [range.left.version, range.left.inclusive ? 0 : 1] }, neqs.map(&:version)] end def self.empty?(ranges, neqs) !ranges.reduce(ReqR::UNIVERSAL) do |last_range, curr_range| next false unless last_range next false if curr_range.single? && neqs.include?(curr_range.left.version) next curr_range if last_range.right.version == ReqR::INFINITY case last_range.right.version <=> curr_range.left.version when 1 then next curr_range when 0 then next(last_range.right.inclusive && curr_range.left.inclusive && !neqs.include?(curr_range.left.version) && curr_range) when -1 then next false end end end end end bundler-1.16.1/lib/bundler/settings/0000755000175000017500000000000013217261023020045 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/settings/validator.rb0000644000175000017500000000465313217261023022367 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Settings class Validator class Rule attr_reader :description def initialize(keys, description, &validate) @keys = keys @description = description @validate = validate end def validate!(key, value, settings) instance_exec(key, value, settings, &@validate) end def fail!(key, value, *reasons) reasons.unshift @description raise InvalidOption, "Setting `#{key}` to #{value.inspect} failed:\n#{reasons.map {|r| " - #{r}" }.join("\n")}" end def set(settings, key, value, *reasons) hash_key = k(key) return if settings[hash_key] == value reasons.unshift @description Bundler.ui.info "Setting `#{key}` to #{value.inspect}, since #{reasons.join(", ")}" if value.nil? settings.delete(hash_key) else settings[hash_key] = value end end def k(key) Bundler.settings.key_for(key) end end def self.rules @rules ||= Hash.new {|h, k| h[k] = [] } end private_class_method :rules def self.rule(keys, description, &blk) rule = Rule.new(keys, description, &blk) keys.each {|k| rules[k] << rule } end private_class_method :rule def self.validate!(key, value, settings) rules_to_validate = rules[key] rules_to_validate.each {|rule| rule.validate!(key, value, settings) } end rule %w[path path.system], "path and path.system are mutually exclusive" do |key, value, settings| if key == "path" && value set(settings, "path.system", nil) elsif key == "path.system" && value set(settings, :path, nil) end end rule %w[with without], "a group cannot be in both `with` & `without` simultaneously" do |key, value, settings| with = settings.fetch(k(:with), "").split(":").map(&:to_sym) without = settings.fetch(k(:without), "").split(":").map(&:to_sym) other_key = key == "with" ? :without : :with other_setting = key == "with" ? without : with conflicting = with & without if conflicting.any? fail!(key, value, "`#{other_key}` is current set to #{other_setting.inspect}", "the `#{conflicting.join("`, `")}` groups conflict") end end end end end bundler-1.16.1/lib/bundler/setup.rb0000644000175000017500000000132013217261023017666 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/shared_helpers" if Bundler::SharedHelpers.in_bundle? require "bundler" if STDOUT.tty? || ENV["BUNDLER_FORCE_TTY"] begin Bundler.setup rescue Bundler::BundlerError => e puts "\e[31m#{e.message}\e[0m" puts e.backtrace.join("\n") if ENV["DEBUG"] if e.is_a?(Bundler::GemNotFound) puts "\e[33mRun `bundle install` to install missing gems.\e[0m" end exit e.status_code end else Bundler.setup end # Add bundler to the load path after disabling system gems bundler_lib = File.expand_path("../..", __FILE__) $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib) Bundler.ui = nil end bundler-1.16.1/lib/bundler/runtime.rb0000644000175000017500000002521013217261023020215 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Runtime include SharedHelpers def initialize(root, definition) @root = root @definition = definition end def setup(*groups) @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen? groups.map!(&:to_sym) # Has to happen first clean_load_path specs = groups.any? ? @definition.specs_for(groups) : requested_specs SharedHelpers.set_bundle_environment Bundler.rubygems.replace_entrypoints(specs) # Activate the specs load_paths = specs.map do |spec| unless spec.loaded_from raise GemNotFound, "#{spec.full_name} is missing. Run `bundle install` to get it." end check_for_activated_spec!(spec) Bundler.rubygems.mark_loaded(spec) spec.load_paths.reject {|path| $LOAD_PATH.include?(path) } end.reverse.flatten # See Gem::Specification#add_self_to_load_path (since RubyGems 1.8) if insert_index = Bundler.rubygems.load_path_insert_index # Gem directories must come after -I and ENV['RUBYLIB'] $LOAD_PATH.insert(insert_index, *load_paths) else # We are probably testing in core, -I and RUBYLIB don't apply $LOAD_PATH.unshift(*load_paths) end setup_manpath lock(:preserve_unknown_sections => true) self end REQUIRE_ERRORS = [ /^no such file to load -- (.+)$/i, /^Missing \w+ (?:file\s*)?([^\s]+.rb)$/i, /^Missing API definition file in (.+)$/i, /^cannot load such file -- (.+)$/i, /^dlopen\([^)]*\): Library not loaded: (.+)$/i, ].freeze def require(*groups) groups.map!(&:to_sym) groups = [:default] if groups.empty? @definition.dependencies.each do |dep| # Skip the dependency if it is not in any of the requested groups, or # not for the current platform, or doesn't match the gem constraints. next unless (dep.groups & groups).any? && dep.should_include? required_file = nil begin # Loop through all the specified autorequires for the # dependency. If there are none, use the dependency's name # as the autorequire. Array(dep.autorequire || dep.name).each do |file| # Allow `require: true` as an alias for `require: ` file = dep.name if file == true required_file = file begin Kernel.require file rescue => e raise e if e.is_a?(LoadError) # we handle this a little later raise Bundler::GemRequireError.new e, "There was an error while trying to load the gem '#{file}'." end end rescue LoadError => e REQUIRE_ERRORS.find {|r| r =~ e.message } raise if dep.autorequire || $1 != required_file if dep.autorequire.nil? && dep.name.include?("-") begin namespaced_file = dep.name.tr("-", "/") Kernel.require namespaced_file rescue LoadError => e REQUIRE_ERRORS.find {|r| r =~ e.message } raise if $1 != namespaced_file end end end end end def self.definition_method(meth) define_method(meth) do raise ArgumentError, "no definition when calling Runtime##{meth}" unless @definition @definition.send(meth) end end private_class_method :definition_method definition_method :requested_specs definition_method :specs definition_method :dependencies definition_method :current_dependencies definition_method :requires def lock(opts = {}) return if @definition.nothing_changed? && !@definition.unlocking? @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections]) end alias_method :gems, :specs def cache(custom_path = nil) cache_path = Bundler.app_cache(custom_path) SharedHelpers.filesystem_access(cache_path) do |p| FileUtils.mkdir_p(p) end unless File.exist?(cache_path) Bundler.ui.info "Updating files in #{Bundler.settings.app_cache_path}" specs_to_cache = Bundler.settings[:cache_all_platforms] ? @definition.resolve.materialized_for_all_platforms : specs specs_to_cache.each do |spec| next if spec.name == "bundler" next if spec.source.is_a?(Source::Gemspec) spec.source.send(:fetch_gem, spec) if Bundler.settings[:cache_all_platforms] && spec.source.respond_to?(:fetch_gem, true) spec.source.cache(spec, custom_path) if spec.source.respond_to?(:cache) end Dir[cache_path.join("*/.git")].each do |git_dir| FileUtils.rm_rf(git_dir) FileUtils.touch(File.expand_path("../.bundlecache", git_dir)) end prune_cache(cache_path) unless Bundler.settings[:no_prune] end def prune_cache(cache_path) SharedHelpers.filesystem_access(cache_path) do |p| FileUtils.mkdir_p(p) end unless File.exist?(cache_path) resolve = @definition.resolve prune_gem_cache(resolve, cache_path) prune_git_and_path_cache(resolve, cache_path) end def clean(dry_run = false) gem_bins = Dir["#{Gem.dir}/bin/*"] git_dirs = Dir["#{Gem.dir}/bundler/gems/*"] git_cache_dirs = Dir["#{Gem.dir}/cache/bundler/git/*"] gem_dirs = Dir["#{Gem.dir}/gems/*"] gem_files = Dir["#{Gem.dir}/cache/*.gem"] gemspec_files = Dir["#{Gem.dir}/specifications/*.gemspec"] spec_gem_paths = [] # need to keep git sources around spec_git_paths = @definition.spec_git_paths spec_git_cache_dirs = [] spec_gem_executables = [] spec_cache_paths = [] spec_gemspec_paths = [] specs.each do |spec| spec_gem_paths << spec.full_gem_path # need to check here in case gems are nested like for the rails git repo md = %r{(.+bundler/gems/.+-[a-f0-9]{7,12})}.match(spec.full_gem_path) spec_git_paths << md[1] if md spec_gem_executables << spec.executables.collect do |executable| e = "#{Bundler.rubygems.gem_bindir}/#{executable}" [e, "#{e}.bat"] end spec_cache_paths << spec.cache_file spec_gemspec_paths << spec.spec_file spec_git_cache_dirs << spec.source.cache_path.to_s if spec.source.is_a?(Bundler::Source::Git) end spec_gem_paths.uniq! spec_gem_executables.flatten! stale_gem_bins = gem_bins - spec_gem_executables stale_git_dirs = git_dirs - spec_git_paths - ["#{Gem.dir}/bundler/gems/extensions"] stale_git_cache_dirs = git_cache_dirs - spec_git_cache_dirs stale_gem_dirs = gem_dirs - spec_gem_paths stale_gem_files = gem_files - spec_cache_paths stale_gemspec_files = gemspec_files - spec_gemspec_paths removed_stale_gem_dirs = stale_gem_dirs.collect {|dir| remove_dir(dir, dry_run) } removed_stale_git_dirs = stale_git_dirs.collect {|dir| remove_dir(dir, dry_run) } output = removed_stale_gem_dirs + removed_stale_git_dirs unless dry_run stale_files = stale_gem_bins + stale_gem_files + stale_gemspec_files stale_files.each do |file| SharedHelpers.filesystem_access(File.dirname(file)) do |_p| FileUtils.rm(file) if File.exist?(file) end end stale_git_cache_dirs.each do |cache_dir| SharedHelpers.filesystem_access(cache_dir) do |dir| FileUtils.rm_rf(dir) if File.exist?(dir) end end end output end private def prune_gem_cache(resolve, cache_path) cached = Dir["#{cache_path}/*.gem"] cached = cached.delete_if do |path| spec = Bundler.rubygems.spec_from_gem path resolve.any? do |s| s.name == spec.name && s.version == spec.version && !s.source.is_a?(Bundler::Source::Git) end end if cached.any? Bundler.ui.info "Removing outdated .gem files from #{Bundler.settings.app_cache_path}" cached.each do |path| Bundler.ui.info " * #{File.basename(path)}" File.delete(path) end end end def prune_git_and_path_cache(resolve, cache_path) cached = Dir["#{cache_path}/*/.bundlecache"] cached = cached.delete_if do |path| name = File.basename(File.dirname(path)) resolve.any? do |s| source = s.source source.respond_to?(:app_cache_dirname) && source.app_cache_dirname == name end end if cached.any? Bundler.ui.info "Removing outdated git and path gems from #{Bundler.settings.app_cache_path}" cached.each do |path| path = File.dirname(path) Bundler.ui.info " * #{File.basename(path)}" FileUtils.rm_rf(path) end end end def setup_manpath # Add man/ subdirectories from activated bundles to MANPATH for man(1) manuals = $LOAD_PATH.map do |path| man_subdir = path.sub(/lib$/, "man") man_subdir unless Dir[man_subdir + "/man?/"].empty? end.compact return if manuals.empty? Bundler::SharedHelpers.set_env "MANPATH", manuals.concat( ENV["MANPATH"].to_s.split(File::PATH_SEPARATOR) ).uniq.join(File::PATH_SEPARATOR) end def remove_dir(dir, dry_run) full_name = Pathname.new(dir).basename.to_s parts = full_name.split("-") name = parts[0..-2].join("-") version = parts.last output = "#{name} (#{version})" if dry_run Bundler.ui.info "Would have removed #{output}" else Bundler.ui.info "Removing #{output}" FileUtils.rm_rf(dir) end output end def check_for_activated_spec!(spec) return unless activated_spec = Bundler.rubygems.loaded_specs(spec.name) return if activated_spec.version == spec.version suggestion = if Bundler.rubygems.spec_default_gem?(activated_spec) "Since #{spec.name} is a default gem, you can either remove your dependency on it" \ " or try updating to a newer version of bundler that supports #{spec.name} as a default gem." else "Prepending `bundle exec` to your command may solve this." end e = Gem::LoadError.new "You have already activated #{activated_spec.name} #{activated_spec.version}, " \ "but your Gemfile requires #{spec.name} #{spec.version}. #{suggestion}" e.name = spec.name if e.respond_to?(:requirement=) e.requirement = Gem::Requirement.new(spec.version.to_s) else e.version_requirement = Gem::Requirement.new(spec.version.to_s) end raise e end end end bundler-1.16.1/lib/bundler/ui.rb0000644000175000017500000000030613217261023017146 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module UI autoload :RGProxy, "bundler/ui/rg_proxy" autoload :Shell, "bundler/ui/shell" autoload :Silent, "bundler/ui/silent" end end bundler-1.16.1/lib/bundler/ruby_version.rb0000644000175000017500000001201313217261023021255 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class RubyVersion attr_reader :versions, :patchlevel, :engine, :engine_versions, :gem_version, :engine_gem_version def initialize(versions, patchlevel, engine, engine_version) # The parameters to this method must satisfy the # following constraints, which are verified in # the DSL: # # * If an engine is specified, an engine version # must also be specified # * If an engine version is specified, an engine # must also be specified # * If the engine is "ruby", the engine version # must not be specified, or the engine version # specified must match the version. @versions = Array(versions).map do |v| op, v = Gem::Requirement.parse(v) op == "=" ? v.to_s : "#{op} #{v}" end @gem_version = Gem::Requirement.create(@versions.first).requirements.first.last @input_engine = engine && engine.to_s @engine = engine && engine.to_s || "ruby" @engine_versions = (engine_version && Array(engine_version)) || @versions @engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last @patchlevel = patchlevel end def to_s(versions = self.versions) output = String.new("ruby #{versions_string(versions)}") output << "p#{patchlevel}" if patchlevel output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby" output end # @private PATTERN = / ruby\s ([\d.]+) # ruby version (?:p(-?\d+))? # optional patchlevel (?:\s\((\S+)\s(.+)\))? # optional engine info /xo # Returns a RubyVersion from the given string. # @param [String] the version string to match. # @return [RubyVersion,Nil] The version if the string is a valid RubyVersion # description, and nil otherwise. def self.from_string(string) new($1, $2, $3, $4) if string =~ PATTERN end def single_version_string to_s(gem_version) end def ==(other) versions == other.versions && engine == other.engine && engine_versions == other.engine_versions && patchlevel == other.patchlevel end def host @host ||= [ RbConfig::CONFIG["host_cpu"], RbConfig::CONFIG["host_vendor"], RbConfig::CONFIG["host_os"] ].join("-") end # Returns a tuple of these things: # [diff, this, other] # The priority of attributes are # 1. engine # 2. ruby_version # 3. engine_version def diff(other) raise ArgumentError, "Can only diff with a RubyVersion, not a #{other.class}" unless other.is_a?(RubyVersion) if engine != other.engine && @input_engine [:engine, engine, other.engine] elsif versions.empty? || !matches?(versions, other.gem_version) [:version, versions_string(versions), versions_string(other.versions)] elsif @input_engine && !matches?(engine_versions, other.engine_gem_version) [:engine_version, versions_string(engine_versions), versions_string(other.engine_versions)] elsif patchlevel && (!patchlevel.is_a?(String) || !other.patchlevel.is_a?(String) || !matches?(patchlevel, other.patchlevel)) [:patchlevel, patchlevel, other.patchlevel] end end def versions_string(versions) Array(versions).join(", ") end def self.system ruby_engine = if defined?(RUBY_ENGINE) && !RUBY_ENGINE.nil? RUBY_ENGINE.dup else # not defined in ruby 1.8.7 "ruby" end # :sob: mocking RUBY_VERSION breaks stuff on 1.8.7 ruby_version = ENV.fetch("BUNDLER_SPEC_RUBY_VERSION") { RUBY_VERSION }.dup ruby_engine_version = case ruby_engine when "ruby" ruby_version when "rbx" Rubinius::VERSION.dup when "jruby" JRUBY_VERSION.dup else raise BundlerError, "RUBY_ENGINE value #{RUBY_ENGINE} is not recognized" end patchlevel = RUBY_PATCHLEVEL.to_s @ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version) end def to_gem_version_with_patchlevel @gem_version_with_patch ||= begin Gem::Version.create("#{@gem_version}.#{@patchlevel}") rescue ArgumentError @gem_version end end def exact? return @exact if defined?(@exact) @exact = versions.all? {|v| Gem::Requirement.create(v).exact? } end private def matches?(requirements, version) # Handles RUBY_PATCHLEVEL of -1 for instances like ruby-head return requirements == version if requirements.to_s == "-1" || version.to_s == "-1" Array(requirements).all? do |requirement| Gem::Requirement.create(requirement).satisfied_by?(Gem::Version.create(version)) end end end end bundler-1.16.1/lib/bundler/spec_set.rb0000644000175000017500000001220113217261023020333 0ustar samuelophsamueloph# frozen_string_literal: true require "tsort" require "forwardable" require "set" module Bundler class SpecSet extend Forwardable include TSort, Enumerable def_delegators :@specs, :<<, :length, :add, :remove, :size, :empty? def_delegators :sorted, :each def initialize(specs) @specs = specs end def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true) handled = Set.new deps = dependencies.dup specs = [] skip += ["bundler"] loop do break unless dep = deps.shift next if !handled.add?(dep) || skip.include?(dep.name) if spec = spec_for_dependency(dep, match_current_platform) specs << spec spec.dependencies.each do |d| next if d.type == :development d = DepProxy.new(d, dep.__platform) unless match_current_platform deps << d end elsif check return false elsif raise_on_missing raise "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?" end end if spec = lookup["bundler"].first specs << spec end check ? true : SpecSet.new(specs) end def valid_for?(deps) self.for(deps, [], true) end def [](key) key = key.name if key.respond_to?(:name) lookup[key].reverse end def []=(key, value) @specs << value @lookup = nil @sorted = nil value end def sort! self end def to_a sorted.dup end def to_hash lookup.dup end def materialize(deps, missing_specs = nil) materialized = self.for(deps, [], false, true, !missing_specs).to_a deps = materialized.map(&:name).uniq materialized.map! do |s| next s unless s.is_a?(LazySpecification) s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=) spec = s.__materialize__ unless spec unless missing_specs raise GemNotFound, "Could not find #{s.full_name} in any of the sources" end missing_specs << s end spec end SpecSet.new(missing_specs ? materialized.compact : materialized) end # Materialize for all the specs in the spec set, regardless of what platform they're for # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform) # @return [Array] def materialized_for_all_platforms names = @specs.map(&:name).uniq @specs.map do |s| next s unless s.is_a?(LazySpecification) s.source.dependency_names = names if s.source.respond_to?(:dependency_names=) spec = s.__materialize__ raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec spec end end def merge(set) arr = sorted.dup set.each do |set_spec| full_name = set_spec.full_name next if arr.any? {|spec| spec.full_name == full_name } arr << set_spec end SpecSet.new(arr) end def find_by_name_and_platform(name, platform) @specs.detect {|spec| spec.name == name && spec.match_platform(platform) } end def what_required(spec) unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } } return [spec] end what_required(req) << spec end private def sorted rake = @specs.find {|s| s.name == "rake" } begin @sorted ||= ([rake] + tsort).compact.uniq rescue TSort::Cyclic => error cgems = extract_circular_gems(error) raise CyclicDependencyError, "Your bundle requires gems that depend" \ " on each other, creating an infinite loop. Please remove either" \ " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again." end end def extract_circular_gems(error) if Bundler.current_ruby.mri? && Bundler.current_ruby.on_19? error.message.scan(/(\w+) \([^)]/).flatten else error.message.scan(/@name="(.*?)"/).flatten end end def lookup @lookup ||= begin lookup = Hash.new {|h, k| h[k] = [] } Index.sort_specs(@specs).reverse_each do |s| lookup[s.name] << s end lookup end end def tsort_each_node # MUST sort by name for backwards compatibility @specs.sort_by(&:name).each {|s| yield s } end def spec_for_dependency(dep, match_current_platform) specs_for_platforms = lookup[dep.name] if match_current_platform Bundler.rubygems.platforms.reverse_each do |pl| match = GemHelpers.select_best_platform_match(specs_for_platforms, pl) return match if match end nil else GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform) end end def tsort_each_child(s) s.dependencies.sort_by(&:name).each do |d| next if d.type == :development lookup[d.name].each {|s2| yield s2 } end end end end bundler-1.16.1/lib/bundler/rubygems_integration.rb0000644000175000017500000006143713217261023023005 0ustar samuelophsamueloph# frozen_string_literal: true require "monitor" require "rubygems" require "rubygems/config_file" module Bundler class RubygemsIntegration if defined?(Gem::Ext::Builder::CHDIR_MONITOR) EXT_LOCK = Gem::Ext::Builder::CHDIR_MONITOR else EXT_LOCK = Monitor.new end def self.version @version ||= Gem::Version.new(Gem::VERSION) end def self.provides?(req_str) Gem::Requirement.new(req_str).satisfied_by?(version) end def initialize @replaced_methods = {} end def version self.class.version end def provides?(req_str) self.class.provides?(req_str) end def build_args Gem::Command.build_args end def build_args=(args) Gem::Command.build_args = args end def load_path_insert_index Gem.load_path_insert_index end def loaded_specs(name) Gem.loaded_specs[name] end def mark_loaded(spec) if spec.respond_to?(:activated=) current = Gem.loaded_specs[spec.name] current.activated = false if current spec.activated = true end Gem.loaded_specs[spec.name] = spec end def validate(spec) Bundler.ui.silence { spec.validate(false) } rescue Gem::InvalidSpecificationException => e error_message = "The gemspec at #{spec.loaded_from} is not valid. Please fix this gemspec.\n" \ "The validation error was '#{e.message}'\n" raise Gem::InvalidSpecificationException.new(error_message) rescue Errno::ENOENT nil end def set_installed_by_version(spec, installed_by_version = Gem::VERSION) return unless spec.respond_to?(:installed_by_version=) spec.installed_by_version = Gem::Version.create(installed_by_version) end def spec_missing_extensions?(spec, default = true) return spec.missing_extensions? if spec.respond_to?(:missing_extensions?) return false if spec_default_gem?(spec) return false if spec.extensions.empty? default end def spec_default_gem?(spec) spec.respond_to?(:default_gem?) && spec.default_gem? end def spec_matches_for_glob(spec, glob) return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob) spec.load_paths.map do |lp| Dir["#{lp}/#{glob}#{suffix_pattern}"] end.flatten(1) end def spec_extension_dir(spec) return unless spec.respond_to?(:extension_dir) spec.extension_dir end def stub_set_spec(stub, spec) stub.instance_variable_set(:@spec, spec) end def path(obj) obj.to_s end def platforms return [Gem::Platform::RUBY] if Bundler.settings[:force_ruby_platform] Gem.platforms end def configuration require "bundler/psyched_yaml" Gem.configuration rescue Gem::SystemExitException, LoadError => e Bundler.ui.error "#{e.class}: #{e.message}" Bundler.ui.trace e raise rescue YamlLibrarySyntaxError => e raise YamlSyntaxError.new(e, "Your RubyGems configuration, which is " \ "usually located in ~/.gemrc, contains invalid YAML syntax.") end def ruby_engine Gem.ruby_engine end def read_binary(path) Gem.read_binary(path) end def inflate(obj) Gem.inflate(obj) end def sources=(val) # Gem.configuration creates a new Gem::ConfigFile, which by default will read ~/.gemrc # If that file exists, its settings (including sources) will overwrite the values we # are about to set here. In order to avoid that, we force memoizing the config file now. configuration Gem.sources = val end def sources Gem.sources end def gem_dir Gem.dir end def gem_bindir Gem.bindir end def user_home Gem.user_home end def gem_path Gem.path end def reset Gem::Specification.reset end def post_reset_hooks Gem.post_reset_hooks end def suffix_pattern Gem.suffix_pattern end def gem_cache gem_path.map {|p| File.expand_path("cache", p) } end def spec_cache_dirs @spec_cache_dirs ||= begin dirs = gem_path.map {|dir| File.join(dir, "specifications") } dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir) # Not in RubyGems 2.0.3 or earlier dirs.uniq.select {|dir| File.directory? dir } end end def marshal_spec_dir Gem::MARSHAL_SPEC_DIR end def config_map Gem::ConfigMap end def repository_subdirectories %w[cache doc gems specifications] end def clear_paths Gem.clear_paths end def bin_path(gem, bin, ver) Gem.bin_path(gem, bin, ver) end def path_separator File::PATH_SEPARATOR end def preserve_paths # this is a no-op outside of RubyGems 1.8 yield end def loaded_gem_paths # RubyGems 2.2+ can put binary extension into dedicated folders, # therefore use RubyGems facilities to obtain their load paths. if Gem::Specification.method_defined? :full_require_paths loaded_gem_paths = Gem.loaded_specs.map {|_, s| s.full_require_paths } loaded_gem_paths.flatten else $LOAD_PATH.select do |p| Bundler.rubygems.gem_path.any? {|gp| p =~ /^#{Regexp.escape(gp)}/ } end end end def load_plugins Gem.load_plugins if Gem.respond_to?(:load_plugins) end def load_plugin_files(files) Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files) end def ui=(obj) Gem::DefaultUserInteraction.ui = obj end def ext_lock EXT_LOCK end def fetch_specs(all, pre, &blk) require "rubygems/spec_fetcher" specs = Gem::SpecFetcher.new.list(all, pre) specs.each { yield } if block_given? specs end def fetch_prerelease_specs fetch_specs(false, true) rescue Gem::RemoteFetcher::FetchError {} # if we can't download them, there aren't any end # TODO: This is for older versions of RubyGems... should we support the # X-Gemfile-Source header on these old versions? # Maybe the newer implementation will work on older RubyGems? # It seems difficult to keep this implementation and still send the header. def fetch_all_remote_specs(remote) old_sources = Bundler.rubygems.sources Bundler.rubygems.sources = [remote.uri.to_s] # Fetch all specs, minus prerelease specs spec_list = fetch_specs(true, false) # Then fetch the prerelease specs fetch_prerelease_specs.each {|k, v| spec_list[k].concat(v) } spec_list.values.first ensure Bundler.rubygems.sources = old_sources end def with_build_args(args) ext_lock.synchronize do old_args = build_args begin self.build_args = args yield ensure self.build_args = old_args end end end def install_with_build_args(args) with_build_args(args) { yield } end def gem_from_path(path, policy = nil) require "rubygems/format" Gem::Format.from_file_by_path(path, policy) end def spec_from_gem(path, policy = nil) require "rubygems/security" require "bundler/psyched_yaml" gem_from_path(path, security_policies[policy]).spec rescue Gem::Package::FormatError raise GemspecError, "Could not read gem at #{path}. It may be corrupted." rescue Exception, Gem::Exception, Gem::Security::Exception => e if e.is_a?(Gem::Security::Exception) || e.message =~ /unknown trust policy|unsigned gem/i || e.message =~ /couldn't verify (meta)?data signature/i raise SecurityError, "The gem #{File.basename(path, ".gem")} can't be installed because " \ "the security policy didn't allow it, with the message: #{e.message}" else raise e end end def build(spec, skip_validation = false) require "rubygems/builder" Gem::Builder.new(spec).build end def build_gem(gem_dir, spec) build(spec) end def download_gem(spec, uri, path) uri = Bundler.settings.mirror_for(uri) fetcher = Gem::RemoteFetcher.new(configuration[:http_proxy]) Bundler::Retry.new("download gem from #{uri}").attempts do fetcher.download(spec, uri, path) end end def security_policy_keys %w[High Medium Low AlmostNo No].map {|level| "#{level}Security" } end def security_policies @security_policies ||= begin require "rubygems/security" Gem::Security::Policies rescue LoadError, NameError {} end end def reverse_rubygems_kernel_mixin # Disable rubygems' gem activation system kernel = (class << ::Kernel; self; end) [kernel, ::Kernel].each do |k| if k.private_method_defined?(:gem_original_require) redefine_method(k, :require, k.instance_method(:gem_original_require)) end end end def binstubs_call_gem? true end def stubs_provide_full_functionality? false end def replace_gem(specs, specs_by_name) reverse_rubygems_kernel_mixin executables = nil kernel = (class << ::Kernel; self; end) [kernel, ::Kernel].each do |kernel_class| redefine_method(kernel_class, :gem) do |dep, *reqs| executables ||= specs.map(&:executables).flatten if ::Bundler.rubygems.binstubs_call_gem? if executables && executables.include?(File.basename(caller.first.split(":").first)) break end reqs.pop if reqs.last.is_a?(Hash) unless dep.respond_to?(:name) && dep.respond_to?(:requirement) dep = Gem::Dependency.new(dep, reqs) end if spec = specs_by_name[dep.name] return true if dep.matches_spec?(spec) end message = if spec.nil? "#{dep.name} is not part of the bundle." \ " Add it to your #{Bundler.default_gemfile.basename}." else "can't activate #{dep}, already activated #{spec.full_name}. " \ "Make sure all dependencies are added to Gemfile." end e = Gem::LoadError.new(message) e.name = dep.name if e.respond_to?(:requirement=) e.requirement = dep.requirement elsif e.respond_to?(:version_requirement=) e.version_requirement = dep.requirement end raise e end # backwards compatibility shim, see https://github.com/bundler/bundler/issues/5102 kernel_class.send(:public, :gem) if Bundler.feature_flag.setup_makes_kernel_gem_public? end end def stub_source_index(specs) Gem::SourceIndex.send(:alias_method, :old_initialize, :initialize) redefine_method(Gem::SourceIndex, :initialize) do |*args| @gems = {} # You're looking at this thinking: Oh! This is how I make those # rubygems deprecations go away! # # You'd be correct BUT using of this method in production code # must be approved by the rubygems team itself! # # This is your warning. If you use this and don't have approval # we can't protect you. # Deprecate.skip_during do self.spec_dirs = *args add_specs(*specs) end end end # Used to make bin stubs that are not created by bundler work # under bundler. The new Gem.bin_path only considers gems in # +specs+ def replace_bin_path(specs, specs_by_name) gem_class = (class << Gem; self; end) redefine_method(gem_class, :find_spec_for_exe) do |gem_name, *args| exec_name = args.first spec_with_name = specs_by_name[gem_name] spec = if exec_name if spec_with_name && spec_with_name.executables.include?(exec_name) spec_with_name else specs.find {|s| s.executables.include?(exec_name) } end else spec_with_name end unless spec message = "can't find executable #{exec_name} for gem #{gem_name}" if !exec_name || spec_with_name.nil? message += ". #{gem_name} is not currently included in the bundle, " \ "perhaps you meant to add it to your #{Bundler.default_gemfile.basename}?" end raise Gem::Exception, message end raise Gem::Exception, "no default executable for #{spec.full_name}" unless exec_name ||= spec.default_executable unless spec.name == gem_name Bundler::SharedHelpers.major_deprecation 2, "Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \ "You should run `bundle binstub #{gem_name}` " \ "to work around a system/bundle conflict." end spec end redefine_method(gem_class, :activate_bin_path) do |name, *args| exec_name = args.first return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle" # Copy of Rubygems activate_bin_path impl requirement = args.last spec = find_spec_for_exe name, exec_name, [requirement] gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name) gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name) File.exist?(gem_bin) ? gem_bin : gem_from_path_bin end redefine_method(gem_class, :bin_path) do |name, *args| exec_name = args.first return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle" spec = find_spec_for_exe(name, *args) exec_name ||= spec.default_executable gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name) gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name) File.exist?(gem_bin) ? gem_bin : gem_from_path_bin end end # Because Bundler has a static view of what specs are available, # we don't #refresh, so stub it out. def replace_refresh gem_class = (class << Gem; self; end) redefine_method(gem_class, :refresh) {} end # Replace or hook into RubyGems to provide a bundlerized view # of the world. def replace_entrypoints(specs) specs_by_name = specs.reduce({}) do |h, s| h[s.name] = s h end replace_gem(specs, specs_by_name) stub_rubygems(specs) replace_bin_path(specs, specs_by_name) replace_refresh Gem.clear_paths end # This backports the correct segment generation code from RubyGems 1.4+ # by monkeypatching it into the method in RubyGems 1.3.6 and 1.3.7. def backport_segment_generation redefine_method(Gem::Version, :segments) do @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s| /^\d+$/ =~ s ? s.to_i : s end end end # This backport fixes the marshaling of @segments. def backport_yaml_initialize redefine_method(Gem::Version, :yaml_initialize) do |_, map| @version = map["version"] @segments = nil @hash = nil end end # This backports base_dir which replaces installation path # RubyGems 1.8+ def backport_base_dir redefine_method(Gem::Specification, :base_dir) do return Gem.dir unless loaded_from File.dirname File.dirname loaded_from end end def backport_cache_file redefine_method(Gem::Specification, :cache_dir) do @cache_dir ||= File.join base_dir, "cache" end redefine_method(Gem::Specification, :cache_file) do @cache_file ||= File.join cache_dir, "#{full_name}.gem" end end def backport_spec_file redefine_method(Gem::Specification, :spec_dir) do @spec_dir ||= File.join base_dir, "specifications" end redefine_method(Gem::Specification, :spec_file) do @spec_file ||= File.join spec_dir, "#{full_name}.gemspec" end end def undo_replacements @replaced_methods.each do |(sym, klass), method| redefine_method(klass, sym, method) end post_reset_hooks.reject! do |proc| proc.binding.eval("__FILE__") == __FILE__ end @replaced_methods.clear end def redefine_method(klass, method, unbound_method = nil, &block) visibility = method_visibility(klass, method) begin if (instance_method = klass.instance_method(method)) && method != :initialize # doing this to ensure we also get private methods klass.send(:remove_method, method) end rescue NameError # method isn't defined nil end @replaced_methods[[method, klass]] = instance_method if unbound_method klass.send(:define_method, method, unbound_method) klass.send(visibility, method) elsif block klass.send(:define_method, method, &block) klass.send(visibility, method) end end def method_visibility(klass, method) if klass.private_method_defined?(method) :private elsif klass.protected_method_defined?(method) :protected else :public end end # RubyGems 1.4 through 1.6 class Legacy < RubygemsIntegration def initialize super backport_base_dir backport_cache_file backport_spec_file backport_yaml_initialize end def stub_rubygems(specs) # RubyGems versions lower than 1.7 use SourceIndex#from_gems_in source_index_class = (class << Gem::SourceIndex; self; end) redefine_method(source_index_class, :from_gems_in) do |*args| Gem::SourceIndex.new.tap do |source_index| source_index.spec_dirs = *args source_index.add_specs(*specs) end end end def all_specs Gem.source_index.gems.values end def find_name(name) Gem.source_index.find_name(name) end def validate(spec) # These versions of RubyGems always validate in "packaging" mode, # which is too strict for the kinds of checks we care about. As a # result, validation is disabled on versions of RubyGems below 1.7. end def post_reset_hooks [] end def reset end end # RubyGems versions 1.3.6 and 1.3.7 class Ancient < Legacy def initialize super backport_segment_generation end end # RubyGems 1.7 class Transitional < Legacy def stub_rubygems(specs) stub_source_index(specs) end def validate(spec) # Missing summary is downgraded to a warning in later versions, # so we set it to an empty string to prevent an exception here. spec.summary ||= "" RubygemsIntegration.instance_method(:validate).bind(self).call(spec) end end # RubyGems 1.8.5-1.8.19 class Modern < RubygemsIntegration def stub_rubygems(specs) Gem::Specification.all = specs Gem.post_reset do Gem::Specification.all = specs end stub_source_index(specs) end def all_specs Gem::Specification.to_a end def find_name(name) Gem::Specification.find_all_by_name name end end # RubyGems 1.8.0 to 1.8.4 class AlmostModern < Modern # RubyGems [>= 1.8.0, < 1.8.5] has a bug that changes Gem.dir whenever # you call Gem::Installer#install with an :install_dir set. We have to # change it back for our sudo mode to work. def preserve_paths old_dir = gem_dir old_path = gem_path yield Gem.use_paths(old_dir, old_path) end end # RubyGems 1.8.20+ class MoreModern < Modern # RubyGems 1.8.20 and adds the skip_validation parameter, so that's # when we start passing it through. def build(spec, skip_validation = false) require "rubygems/builder" Gem::Builder.new(spec).build(skip_validation) end end # RubyGems 2.0 class Future < RubygemsIntegration def stub_rubygems(specs) Gem::Specification.all = specs Gem.post_reset do Gem::Specification.all = specs end redefine_method((class << Gem; self; end), :finish_resolve) do |*| [] end end def all_specs Gem::Specification.to_a end def find_name(name) Gem::Specification.find_all_by_name name end def fetch_specs(source, remote, name) path = source + "#{name}.#{Gem.marshal_version}.gz" fetcher = gem_remote_fetcher fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri string = fetcher.fetch_path(path) Bundler.load_marshal(string) rescue Gem::RemoteFetcher::FetchError => e # it's okay for prerelease to fail raise e unless name == "prerelease_specs" end def fetch_all_remote_specs(remote) source = remote.uri.is_a?(URI) ? remote.uri : URI.parse(source.to_s) specs = fetch_specs(source, remote, "specs") pres = fetch_specs(source, remote, "prerelease_specs") || [] specs.concat(pres) end def download_gem(spec, uri, path) uri = Bundler.settings.mirror_for(uri) fetcher = gem_remote_fetcher fetcher.headers = { "X-Gemfile-Source" => spec.remote.original_uri.to_s } if spec.remote.original_uri Bundler::Retry.new("download gem from #{uri}").attempts do fetcher.download(spec, uri, path) end end def gem_remote_fetcher require "resolv" proxy = configuration[:http_proxy] dns = Resolv::DNS.new Bundler::GemRemoteFetcher.new(proxy, dns) end def gem_from_path(path, policy = nil) require "rubygems/package" p = Gem::Package.new(path) p.security_policy = policy if policy p end def build(spec, skip_validation = false) require "rubygems/package" Gem::Package.build(spec, skip_validation) end def repository_subdirectories Gem::REPOSITORY_SUBDIRECTORIES end def install_with_build_args(args) yield end def path_separator Gem.path_separator end end # RubyGems 2.1.0 class MoreFuture < Future def initialize super backport_ext_builder_monitor end def all_specs require "bundler/remote_specification" Gem::Specification.stubs.map do |stub| StubSpecification.from_stub(stub) end end def backport_ext_builder_monitor # So we can avoid requiring "rubygems/ext" in its entirety Gem.module_eval <<-RB, __FILE__, __LINE__ + 1 module Ext end RB require "rubygems/ext/builder" Gem::Ext::Builder.class_eval do unless const_defined?(:CHDIR_MONITOR) const_set(:CHDIR_MONITOR, EXT_LOCK) end remove_const(:CHDIR_MUTEX) if const_defined?(:CHDIR_MUTEX) const_set(:CHDIR_MUTEX, const_get(:CHDIR_MONITOR)) end end if Gem::Specification.respond_to?(:stubs_for) def find_name(name) Gem::Specification.stubs_for(name).map(&:to_spec) end else def find_name(name) Gem::Specification.stubs.find_all do |spec| spec.name == name end.map(&:to_spec) end end def use_gemdeps(gemfile) ENV["BUNDLE_GEMFILE"] ||= File.expand_path(gemfile) require "bundler/gemdeps" runtime = Bundler.setup Bundler.ui = nil activated_spec_names = runtime.requested_specs.map(&:to_spec).sort_by(&:name) [Gemdeps.new(runtime), activated_spec_names] end if provides?(">= 2.5.2") # RubyGems-generated binstubs call Kernel#gem def binstubs_call_gem? false end # only 2.5.2+ has all of the stub methods we want to use, and since this # is a performance optimization _only_, # we'll restrict ourselves to the most # recent RG versions instead of all versions that have stubs def stubs_provide_full_functionality? true end end end end def self.rubygems @rubygems ||= if RubygemsIntegration.provides?(">= 2.1.0") RubygemsIntegration::MoreFuture.new elsif RubygemsIntegration.provides?(">= 1.99.99") RubygemsIntegration::Future.new elsif RubygemsIntegration.provides?(">= 1.8.20") RubygemsIntegration::MoreModern.new elsif RubygemsIntegration.provides?(">= 1.8.5") RubygemsIntegration::Modern.new elsif RubygemsIntegration.provides?(">= 1.8.0") RubygemsIntegration::AlmostModern.new elsif RubygemsIntegration.provides?(">= 1.7.0") RubygemsIntegration::Transitional.new elsif RubygemsIntegration.provides?(">= 1.4.0") RubygemsIntegration::Legacy.new else # RubyGems 1.3.6 and 1.3.7 RubygemsIntegration::Ancient.new end end end bundler-1.16.1/lib/bundler/resolver/0000755000175000017500000000000013217261023020046 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/resolver/spec_group.rb0000644000175000017500000000673213217261023022551 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Resolver class SpecGroup include GemHelpers attr_accessor :name, :version, :source attr_accessor :ignores_bundler_dependencies def initialize(all_specs) raise ArgumentError, "cannot initialize with an empty value" unless exemplary_spec = all_specs.first @name = exemplary_spec.name @version = exemplary_spec.version @source = exemplary_spec.source @required_by = [] @activated_platforms = [] @dependencies = nil @specs = Hash.new do |specs, platform| specs[platform] = select_best_platform_match(all_specs, platform) end @ignores_bundler_dependencies = true end def to_specs @activated_platforms.map do |p| next unless s = @specs[p] lazy_spec = LazySpecification.new(name, version, s.platform, source) lazy_spec.dependencies.replace s.dependencies lazy_spec end.compact end def activate_platform!(platform) return unless for?(platform) return if @activated_platforms.include?(platform) @activated_platforms << platform end def for?(platform) spec = @specs[platform] !spec.nil? end def to_s @to_s ||= "#{name} (#{version})" end def dependencies_for_activated_platforms dependencies = @activated_platforms.map {|p| __dependencies[p] } metadata_dependencies = @activated_platforms.map do |platform| metadata_dependencies(@specs[platform], platform) end dependencies.concat(metadata_dependencies).flatten end def platforms_for_dependency_named(dependency) __dependencies.select {|_, deps| deps.map(&:name).include? dependency }.keys end def ==(other) return unless other.is_a?(SpecGroup) name == other.name && version == other.version && source == other.source end def eql?(other) name.eql?(other.name) && version.eql?(other.version) && source.eql?(other.source) end def hash to_s.hash ^ source.hash end private def __dependencies @dependencies = Hash.new do |dependencies, platform| dependencies[platform] = [] if spec = @specs[platform] spec.dependencies.each do |dep| next if dep.type == :development next if @ignores_bundler_dependencies && dep.name == "bundler".freeze dependencies[platform] << DepProxy.new(dep, platform) end end dependencies[platform] end end def metadata_dependencies(spec, platform) return [] unless spec # Only allow endpoint specifications since they won't hit the network to # fetch the full gemspec when calling required_ruby_version return [] if !spec.is_a?(EndpointSpecification) && !spec.is_a?(Gem::Specification) dependencies = [] if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none? dependencies << DepProxy.new(Gem::Dependency.new("ruby\0", spec.required_ruby_version), platform) end if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none? dependencies << DepProxy.new(Gem::Dependency.new("rubygems\0", spec.required_rubygems_version), platform) end dependencies end end end end bundler-1.16.1/lib/bundler/gem_remote_fetcher.rb0000644000175000017500000000272613217261023022364 0ustar samuelophsamueloph# frozen_string_literal: true require "rubygems/remote_fetcher" module Bundler # Adds support for setting custom HTTP headers when fetching gems from the # server. # # TODO: Get rid of this when and if gemstash only supports RubyGems versions # that contain https://github.com/rubygems/rubygems/commit/3db265cc20b2f813. class GemRemoteFetcher < Gem::RemoteFetcher attr_accessor :headers # Extracted from RubyGems 2.4. def fetch_http(uri, last_modified = nil, head = false, depth = 0) fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get # beginning of change response = request uri, fetch_type, last_modified do |req| headers.each {|k, v| req.add_field(k, v) } if headers end # end of change case response when Net::HTTPOK, Net::HTTPNotModified then response.uri = uri if response.respond_to? :uri head ? response : response.body when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther, Net::HTTPTemporaryRedirect then raise FetchError.new("too many redirects", uri) if depth > 10 location = URI.parse response["Location"] if https?(uri) && !https?(location) raise FetchError.new("redirecting to non-https resource: #{location}", uri) end fetch_http(location, last_modified, head, depth + 1) else raise FetchError.new("bad response #{response.message} #{response.code}", uri) end end end end bundler-1.16.1/lib/bundler/vendored_molinillo.rb0000644000175000017500000000014413217261023022415 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler; end require "bundler/vendor/molinillo/lib/molinillo" bundler-1.16.1/lib/bundler/compatibility_guard.rb0000644000175000017500000000100613217261023022562 0ustar samuelophsamueloph# frozen_string_literal: false require "rubygems" require "bundler/version" if Bundler::VERSION.split(".").first.to_i >= 2 if Gem::Version.new(Object::RUBY_VERSION.dup) < Gem::Version.new("2.3") abort "Bundler 2 requires Ruby 2.3 or later. Either install bundler 1 or update to a supported Ruby version." end if Gem::Version.new(Gem::VERSION.dup) < Gem::Version.new("2.5") abort "Bundler 2 requires RubyGems 2.5 or later. Either install bundler 1 or update to a supported RubyGems version." end end bundler-1.16.1/lib/bundler/environment_preserver.rb0000644000175000017500000000247113217261023023177 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class EnvironmentPreserver INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL".freeze BUNDLER_KEYS = %w[ BUNDLE_BIN_PATH BUNDLE_GEMFILE BUNDLER_ORIG_MANPATH BUNDLER_VERSION GEM_HOME GEM_PATH MANPATH PATH RB_USER_INSTALL RUBYLIB RUBYOPT ].map(&:freeze).freeze BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze # @param env [ENV] # @param keys [Array] def initialize(env, keys) @original = env.to_hash @keys = keys @prefix = BUNDLER_PREFIX end # @return [Hash] def backup env = @original.clone @keys.each do |key| value = env[key] if !value.nil? && !value.empty? env[@prefix + key] ||= value elsif value.nil? env[@prefix + key] ||= INTENTIONALLY_NIL end end env end # @return [Hash] def restore env = @original.clone @keys.each do |key| value_original = env[@prefix + key] next if value_original.nil? || value_original.empty? if value_original == INTENTIONALLY_NIL env.delete(key) else env[key] = value_original end env.delete(@prefix + key) end env end end end bundler-1.16.1/lib/bundler/resolver.rb0000644000175000017500000003411513217261023020377 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Resolver require "bundler/vendored_molinillo" require "bundler/resolver/spec_group" # Figures out the best possible configuration of gems that satisfies # the list of passed dependencies and any child dependencies without # causing any gem activation errors. # # ==== Parameters # *dependencies:: The list of dependencies to resolve # # ==== Returns # ,nil:: If the list of dependencies can be resolved, a # collection of gemspecs is returned. Otherwise, nil is returned. def self.resolve(requirements, index, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil) platforms = Set.new(platforms) if platforms base = SpecSet.new(base) unless base.is_a?(SpecSet) resolver = new(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) result = resolver.start(requirements) SpecSet.new(result) end def initialize(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms) @index = index @source_requirements = source_requirements @base = base @resolver = Molinillo::Resolver.new(self, self) @search_for = {} @base_dg = Molinillo::DependencyGraph.new @base.each do |ls| dep = Dependency.new(ls.name, ls.version) @base_dg.add_vertex(ls.name, DepProxy.new(dep, ls.platform), true) end additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) } @platforms = platforms @gem_version_promoter = gem_version_promoter @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts? @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? end def start(requirements) @prerelease_specified = {} requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? } verify_gemfile_dependencies_are_found!(requirements) dg = @resolver.resolve(requirements, @base_dg) dg.map(&:payload). reject {|sg| sg.name.end_with?("\0") }. map(&:to_specs).flatten rescue Molinillo::VersionConflict => e message = version_conflict_message(e) raise VersionConflict.new(e.conflicts.keys.uniq, message) rescue Molinillo::CircularDependencyError => e names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" } raise CyclicDependencyError, "Your bundle requires gems that depend" \ " on each other, creating an infinite loop. Please remove" \ " #{names.count > 1 ? "either " : ""}#{names.join(" or ")}" \ " and try again." end include Molinillo::UI # Conveys debug information to the user. # # @param [Integer] depth the current depth of the resolution process. # @return [void] def debug(depth = 0) return unless debug? debug_info = yield debug_info = debug_info.inspect unless debug_info.is_a?(String) STDERR.puts debug_info.split("\n").map {|s| " " * depth + s } end def debug? return @debug_mode if defined?(@debug_mode) @debug_mode = ENV["DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER_TREE"] || false end def before_resolution Bundler.ui.info "Resolving dependencies...", debug? end def after_resolution Bundler.ui.info "" end def indicate_progress Bundler.ui.info ".", false unless debug? end include Molinillo::SpecificationProvider def dependencies_for(specification) specification.dependencies_for_activated_platforms end def search_for(dependency) platform = dependency.__platform dependency = dependency.dep unless dependency.is_a? Gem::Dependency search = @search_for[dependency] ||= begin index = index_for(dependency) results = index.search(dependency, @base[dependency.name]) unless @prerelease_specified[dependency.name] # Move prereleases to the beginning of the list, so they're considered # last during resolution. pre, results = results.partition {|spec| spec.version.prerelease? } results = pre + results end if vertex = @base_dg.vertex_named(dependency.name) locked_requirement = vertex.payload.requirement end spec_groups = if results.any? nested = [] results.each do |spec| version, specs = nested.last if version == spec.version specs << spec else nested << [spec.version, [spec]] end end nested.reduce([]) do |groups, (version, specs)| next groups if locked_requirement && !locked_requirement.satisfied_by?(version) spec_group = SpecGroup.new(specs) spec_group.ignores_bundler_dependencies = @allow_bundler_dependency_conflicts groups << spec_group end else [] end # GVP handles major itself, but it's still a bit risky to trust it with it # until we get it settled with new behavior. For 2.x it can take over all cases. if @gem_version_promoter.major? spec_groups else @gem_version_promoter.sort_versions(dependency, spec_groups) end end search.select {|sg| sg.for?(platform) }.each {|sg| sg.activate_platform!(platform) } end def index_for(dependency) source = @source_requirements[dependency.name] if source source.specs elsif @lockfile_uses_separate_rubygems_sources Index.build do |idx| if dependency.all_sources dependency.all_sources.each {|s| idx.add_source(s.specs) if s } else idx.add_source @source_requirements[:default].specs end end else @index end end def name_for(dependency) dependency.name end def name_for_explicit_dependency_source Bundler.default_gemfile.basename.to_s rescue "Gemfile" end def name_for_locking_dependency_source Bundler.default_lockfile.basename.to_s rescue "Gemfile.lock" end def requirement_satisfied_by?(requirement, activated, spec) return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec) if spec.version.prerelease? && !requirement.prerelease? && search_for(requirement).any? {|sg| !sg.version.prerelease? } vertex = activated.vertex_named(spec.name) return false if vertex.requirements.none?(&:prerelease?) end spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform) true end def relevant_sources_for_vertex(vertex) if vertex.root? [@source_requirements[vertex.name]] elsif @lockfile_uses_separate_rubygems_sources vertex.recursive_predecessors.map do |v| @source_requirements[v.name] end << @source_requirements[:default] end end def sort_dependencies(dependencies, activated, conflicts) dependencies.sort_by do |dependency| dependency.all_sources = relevant_sources_for_vertex(activated.vertex_named(dependency.name)) name = name_for(dependency) vertex = activated.vertex_named(name) [ @base_dg.vertex_named(name) ? 0 : 1, vertex.payload ? 0 : 1, vertex.root? ? 0 : 1, amount_constrained(dependency), conflicts[name] ? 0 : 1, vertex.payload ? 0 : search_for(dependency).count, self.class.platform_sort_key(dependency.__platform), ] end end # Sort platforms from most general to most specific def self.sort_platforms(platforms) platforms.sort_by do |platform| platform_sort_key(platform) end end def self.platform_sort_key(platform) return ["", "", ""] if Gem::Platform::RUBY == platform platform.to_a.map {|part| part || "" } end private # returns an integer \in (-\infty, 0] # a number closer to 0 means the dependency is less constraining # # dependencies w/ 0 or 1 possibilities (ignoring version requirements) # are given very negative values, so they _always_ sort first, # before dependencies that are unconstrained def amount_constrained(dependency) @amount_constrained ||= {} @amount_constrained[dependency.name] ||= begin if (base = @base[dependency.name]) && !base.empty? dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1 else all = index_for(dependency).search(dependency.name).size if all <= 1 all - 1_000_000 else search = search_for(dependency) search = @prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? } search - all end end end end def verify_gemfile_dependencies_are_found!(requirements) requirements.each do |requirement| name = requirement.name next if name == "bundler" next unless search_for(requirement).empty? cache_message = begin " or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist? rescue GemfileNotFound nil end if (base = @base[name]) && !base.empty? version = base.first.version message = "You have requested:\n" \ " #{name} #{requirement.requirement}\n\n" \ "The bundle currently has #{name} locked at #{version}.\n" \ "Try running `bundle update #{name}`\n\n" \ "If you are updating multiple gems in your Gemfile at once,\n" \ "try passing them all to `bundle update`" elsif source = @source_requirements[name] specs = source.specs[name] versions_with_platforms = specs.map {|s| [s.version, s.platform] } message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n") message << if versions_with_platforms.any? "The source contains '#{name}' at: #{formatted_versions_with_platforms(versions_with_platforms)}" else "The source does not contain any versions of '#{name}'" end else message = "Could not find gem '#{requirement}' in any of the gem sources " \ "listed in your Gemfile#{cache_message}." end raise GemNotFound, message end end def formatted_versions_with_platforms(versions_with_platforms) version_platform_strs = versions_with_platforms.map do |vwp| version = vwp.first platform = vwp.last version_platform_str = String.new(version.to_s) version_platform_str << " #{platform}" unless platform.nil? || platform == Gem::Platform::RUBY version_platform_str end version_platform_strs.join(", ") end def version_conflict_message(e) e.message_with_trees( :solver_name => "Bundler", :possibility_type => "gem", :reduce_trees => lambda do |trees| # bail out if tree size is too big for Array#combination to make any sense return trees if trees.size > 15 maximal = 1.upto(trees.size).map do |size| trees.map(&:last).flatten(1).combination(size).to_a end.flatten(1).select do |deps| Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement))) end.min_by(&:size) trees.reject! {|t| !maximal.include?(t.last) } if maximal trees = trees.sort_by {|t| t.flatten.map(&:to_s) } trees.uniq! {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } } trees.sort_by {|t| t.reverse.map(&:name) } end, :printable_requirement => lambda {|req| SharedHelpers.pretty_dependency(req) }, :additional_message_for_conflict => lambda do |o, name, conflict| if name == "bundler" o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION})) other_bundler_required = !conflict.requirement.requirement.satisfied_by?(Gem::Version.new Bundler::VERSION) end if name == "bundler" && other_bundler_required o << "\n" o << "This Gemfile requires a different version of Bundler.\n" o << "Perhaps you need to update Bundler by running `gem install bundler`?\n" end if conflict.locked_requirement o << "\n" o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n) o << %(the gems in your Gemfile, which may resolve the conflict.\n) elsif !conflict.existing o << "\n" relevant_sources = if conflict.requirement.source [conflict.requirement.source] elsif conflict.requirement.all_sources conflict.requirement.all_sources elsif @lockfile_uses_separate_rubygems_sources # every conflict should have an explicit group of sources when we # enforce strict pinning raise "no source set for #{conflict}" else [] end.compact.map(&:to_s).uniq.sort o << "Could not find gem '#{SharedHelpers.pretty_dependency(conflict.requirement)}'" if conflict.requirement_trees.first.size > 1 o << ", which is required by " o << "gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}'," end o << " " o << if relevant_sources.empty? "in any of the sources.\n" else "in any of the relevant sources:\n #{relevant_sources * "\n "}\n" end end end, :version_for_spec => lambda {|spec| spec.version } ) end end end bundler-1.16.1/lib/bundler/env.rb0000644000175000017500000001225513217261023017327 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/rubygems_integration" require "bundler/source/git/git_proxy" module Bundler class Env def self.write(io) io.write report end def self.report(options = {}) print_gemfile = options.delete(:print_gemfile) { true } print_gemspecs = options.delete(:print_gemspecs) { true } out = String.new append_formatted_table("Environment", environment, out) append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out) unless Bundler.settings.all.empty? out << "\n## Bundler settings\n\n```\n" Bundler.settings.all.each do |setting| out << setting << "\n" Bundler.settings.pretty_values_for(setting).each do |line| out << " " << line << "\n" end end out << "```\n" end return out unless SharedHelpers.in_bundle? if print_gemfile gemfiles = [Bundler.default_gemfile] begin gemfiles = Bundler.definition.gemfiles rescue GemfileNotFound nil end out << "\n## Gemfile\n" gemfiles.each do |gemfile| out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n" out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n" end out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n" out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n" end if print_gemspecs dsl = Dsl.new.tap {|d| d.eval_gemfile(Bundler.default_gemfile) } out << "\n## Gemspecs\n" unless dsl.gemspecs.empty? dsl.gemspecs.each do |gs| out << "\n### #{File.basename(gs.loaded_from)}" out << "\n\n```ruby\n" << read_file(gs.loaded_from).chomp << "\n```\n" end end out end def self.read_file(filename) File.read(filename.to_s).strip rescue Errno::ENOENT "" rescue => e "#{e.class}: #{e.message}" end def self.ruby_version str = String.new("#{RUBY_VERSION}") if RUBY_VERSION < "1.9" str << " (#{RUBY_RELEASE_DATE}" str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL str << ") [#{RUBY_PLATFORM}]" else str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]" end end def self.git_version Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version rescue Bundler::Source::Git::GitNotInstalledError "not installed" end def self.version_of(script) return "not installed" unless Bundler.which(script) `#{script} --version` end def self.chruby_version return "not installed" unless Bundler.which("chruby-exec") `chruby-exec -- chruby --version`. sub(/.*^chruby: (#{Gem::Version::VERSION_PATTERN}).*/m, '\1') end def self.environment out = [] out << ["Bundler", Bundler::VERSION] out << [" Platforms", Gem.platforms.join(", ")] out << ["Ruby", ruby_version] out << [" Full Path", Gem.ruby] out << [" Config Dir", Pathname.new(Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE).dirname] out << ["RubyGems", Gem::VERSION] out << [" Gem Home", ENV.fetch("GEM_HOME") { Gem.dir }] out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }] out << [" User Path", Gem.user_dir] out << [" Bin Dir", Gem.bindir] out << ["OpenSSL"] if defined?(OpenSSL) out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION) out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION) out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE) out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR) out << ["Tools"] out << [" Git", git_version] out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }] out << [" rbenv", version_of("rbenv")] out << [" chruby", chruby_version] %w[rubygems-bundler open_gem].each do |name| specs = Bundler.rubygems.find_name(name) out << [" #{name}", "(#{specs.map(&:version).join(",")})"] unless specs.empty? end if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z} shebang = File.read(exe).lines.first shebang.sub!(/^#!\s*/, "") unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby") out << ["Gem.ruby", Gem.ruby] out << ["bundle #!", shebang] end end out end def self.append_formatted_table(title, pairs, out) return if pairs.empty? out << "\n" unless out.empty? out << "## #{title}\n\n```\n" ljust = pairs.map {|k, _v| k.to_s.length }.max pairs.each do |k, v| out << "#{k.to_s.ljust(ljust)} #{v}\n" end out << "```\n" end private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table, :version_of, :chruby_version end end bundler-1.16.1/lib/bundler/capistrano.rb0000644000175000017500000000155713217261023020705 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/shared_helpers" Bundler::SharedHelpers.major_deprecation 2, "The Bundler task for Capistrano. Please use http://github.com/capistrano/bundler" # Capistrano task for Bundler. # # Add "require 'bundler/capistrano'" in your Capistrano deploy.rb, and # Bundler will be activated after each new deployment. require "bundler/deployment" require "capistrano/version" if defined?(Capistrano::Version) && Gem::Version.new(Capistrano::Version).release >= Gem::Version.new("3.0") raise "For Capistrano 3.x integration, please use http://github.com/capistrano/bundler" end Capistrano::Configuration.instance(:must_exist).load do before "deploy:finalize_update", "bundle:install" Bundler::Deployment.define_task(self, :task, :except => { :no_release => true }) set :rake, lambda { "#{fetch(:bundle_cmd, "bundle")} exec rake" } end bundler-1.16.1/lib/bundler/installer/0000755000175000017500000000000013217261023020202 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/installer/standalone.rb0000644000175000017500000000333313217261023022661 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class Standalone def initialize(groups, definition) @specs = groups.empty? ? definition.requested_specs : definition.specs_for(groups.map(&:to_sym)) end def generate SharedHelpers.filesystem_access(bundler_path) do |p| FileUtils.mkdir_p(p) end File.open File.join(bundler_path, "setup.rb"), "w" do |file| file.puts "require 'rbconfig'" file.puts "# ruby 1.8.7 doesn't define RUBY_ENGINE" file.puts "ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'" file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]" file.puts "path = File.expand_path('..', __FILE__)" paths.each do |path| file.puts %($:.unshift "\#{path}/#{path}") end end end private def paths @specs.map do |spec| next if spec.name == "bundler" Array(spec.require_paths).map do |path| gem_path(path, spec).sub(version_dir, '#{ruby_engine}/#{ruby_version}') # This is a static string intentionally. It's interpolated at a later time. end end.flatten end def version_dir "#{Bundler::RubyVersion.system.engine}/#{RbConfig::CONFIG["ruby_version"]}" end def bundler_path Bundler.root.join(Bundler.settings[:path], "bundler") end def gem_path(path, spec) full_path = Pathname.new(path).absolute? ? path : File.join(spec.full_gem_path, path) Pathname.new(full_path).relative_path_from(Bundler.root.join(bundler_path)).to_s rescue TypeError error_message = "#{spec.name} #{spec.version} has an invalid gemspec" raise Gem::InvalidSpecificationException.new(error_message) end end end bundler-1.16.1/lib/bundler/installer/gem_installer.rb0000644000175000017500000000505613217261023023362 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class GemInstaller attr_reader :spec, :standalone, :worker, :force, :installer def initialize(spec, installer, standalone = false, worker = 0, force = false) @spec = spec @installer = installer @standalone = standalone @worker = worker @force = force end def install_from_spec post_install_message = spec_settings ? install_with_settings : install Bundler.ui.debug "#{worker}: #{spec.name} (#{spec.version}) from #{spec.loaded_from}" generate_executable_stubs return true, post_install_message rescue Bundler::InstallHookError, Bundler::SecurityError, APIResponseMismatchError raise rescue Errno::ENOSPC return false, out_of_space_message rescue => e return false, specific_failure_message(e) end private def specific_failure_message(e) message = "#{e.class}: #{e.message}\n" message += " " + e.backtrace.join("\n ") + "\n\n" if Bundler.ui.debug? message = message.lines.first + Bundler.ui.add_color(message.lines.drop(1).join, :clear) message + Bundler.ui.add_color(failure_message, :red) end def failure_message return install_error_message if spec.source.options["git"] "#{install_error_message}\n#{gem_install_message}" end def install_error_message "An error occurred while installing #{spec.name} (#{spec.version}), and Bundler cannot continue." end def gem_install_message "Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling." end def spec_settings # Fetch the build settings, if there are any Bundler.settings["build.#{spec.name}"] end def install spec.source.install(spec, :force => force, :ensure_builtin_gems_cached => standalone, :build_args => Array(spec_settings)) end def install_with_settings # Build arguments are global, so this is mutexed Bundler.rubygems.install_with_build_args([spec_settings]) { install } end def out_of_space_message "#{install_error_message}\nYour disk is out of space. Free some space to be able to install your bundle." end def generate_executable_stubs return if Bundler.feature_flag.forget_cli_options? return if Bundler.settings[:inline] if Bundler.settings[:bin] && standalone installer.generate_standalone_bundler_executable_stubs(spec) elsif Bundler.settings[:bin] installer.generate_bundler_executable_stubs(spec, :force => true) end end end end bundler-1.16.1/lib/bundler/installer/parallel_installer.rb0000644000175000017500000001465313217261023024411 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/worker" require "bundler/installer/gem_installer" module Bundler class ParallelInstaller class SpecInstallation attr_accessor :spec, :name, :post_install_message, :state, :error def initialize(spec) @spec = spec @name = spec.name @state = :none @post_install_message = "" @error = nil end def installed? state == :installed end def enqueued? state == :enqueued end def failed? state == :failed end def installation_attempted? installed? || failed? end # Only true when spec in neither installed nor already enqueued def ready_to_enqueue? !enqueued? && !installation_attempted? end def has_post_install_message? !post_install_message.empty? end def ignorable_dependency?(dep) dep.type == :development || dep.name == @name end # Checks installed dependencies against spec's dependencies to make # sure needed dependencies have been installed. def dependencies_installed?(all_specs) installed_specs = all_specs.select(&:installed?).map(&:name) dependencies.all? {|d| installed_specs.include? d.name } end # Represents only the non-development dependencies, the ones that are # itself and are in the total list. def dependencies @dependencies ||= begin all_dependencies.reject {|dep| ignorable_dependency? dep } end end def missing_lockfile_dependencies(all_spec_names) deps = all_dependencies.reject {|dep| ignorable_dependency? dep } deps.reject {|dep| all_spec_names.include? dep.name } end # Represents all dependencies def all_dependencies @spec.dependencies end def to_s "#<#{self.class} #{@spec.full_name} (#{state})>" end end def self.call(*args) new(*args).call end attr_reader :size def initialize(installer, all_specs, size, standalone, force) @installer = installer @size = size @standalone = standalone @force = force @specs = all_specs.map {|s| SpecInstallation.new(s) } @spec_set = all_specs end def call # Since `autoload` has the potential for threading issues on 1.8.7 # TODO: remove in bundler 2.0 require "bundler/gem_remote_fetcher" if RUBY_VERSION < "1.9" check_for_corrupt_lockfile if @size > 1 install_with_worker else install_serially end handle_error if @specs.any?(&:failed?) @specs ensure worker_pool && worker_pool.stop end def check_for_corrupt_lockfile missing_dependencies = @specs.map do |s| [ s, s.missing_lockfile_dependencies(@specs.map(&:name)), ] end.reject { |a| a.last.empty? } return if missing_dependencies.empty? warning = [] warning << "Your lockfile was created by an old Bundler that left some things out." if @size != 1 warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time." @size = 1 end warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile." warning << "The missing gems are:" missing_dependencies.each do |spec, missing| warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}" end Bundler.ui.warn(warning.join("\n")) end private def install_with_worker enqueue_specs process_specs until finished_installing? end def install_serially until finished_installing? raise "failed to find a spec to enqueue while installing serially" unless spec_install = @specs.find(&:ready_to_enqueue?) spec_install.state = :enqueued do_install(spec_install, 0) end end def worker_pool @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda { |spec_install, worker_num| do_install(spec_install, worker_num) } end def do_install(spec_install, worker_num) gem_installer = Bundler::GemInstaller.new( spec_install.spec, @installer, @standalone, worker_num, @force ) success, message = begin gem_installer.install_from_spec rescue => e raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}" end if success spec_install.state = :installed spec_install.post_install_message = message unless message.nil? else spec_install.state = :failed spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}" end spec_install end # Dequeue a spec and save its post-install message and then enqueue the # remaining specs. # Some specs might've had to wait til this spec was installed to be # processed so the call to `enqueue_specs` is important after every # dequeue. def process_specs worker_pool.deq enqueue_specs end def finished_installing? @specs.all? do |spec| return true if spec.failed? spec.installed? end end def handle_error errors = @specs.select(&:failed?).map(&:error) if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) } raise exception end raise Bundler::InstallError, errors.map(&:to_s).join("\n\n") end def require_tree_for_spec(spec) tree = @spec_set.what_required(spec) t = String.new("In #{File.basename(SharedHelpers.default_gemfile)}:\n") tree.each_with_index do |s, depth| t << " " * depth.succ << s.name unless tree.last == s t << %( was resolved to #{s.version}, which depends on) end t << %(\n) end t end # Keys in the remains hash represent uninstalled gems specs. # We enqueue all gem specs that do not have any dependencies. # Later we call this lambda again to install specs that depended on # previously installed specifications. We continue until all specs # are installed. def enqueue_specs @specs.select(&:ready_to_enqueue?).each do |spec| if spec.dependencies_installed? @specs spec.state = :enqueued worker_pool.enq spec end end end end end bundler-1.16.1/lib/bundler/shared_helpers.rb0000644000175000017500000002610313217261023021524 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/compatibility_guard" require "pathname" require "rubygems" require "bundler/version" require "bundler/constants" require "bundler/rubygems_integration" require "bundler/current_ruby" module Gem class Dependency # This is only needed for RubyGems < 1.4 unless method_defined? :requirement def requirement version_requirements end end end end module Bundler module SharedHelpers def root gemfile = find_gemfile raise GemfileNotFound, "Could not locate Gemfile" unless gemfile Pathname.new(gemfile).untaint.expand_path.parent end def default_gemfile gemfile = find_gemfile(:order_matters) raise GemfileNotFound, "Could not locate Gemfile" unless gemfile Pathname.new(gemfile).untaint.expand_path end def default_lockfile gemfile = default_gemfile case gemfile.basename.to_s when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked")) else Pathname.new("#{gemfile}.lock") end.untaint end def default_bundle_dir bundle_dir = find_directory(".bundle") return nil unless bundle_dir bundle_dir = Pathname.new(bundle_dir) global_bundle_dir = Bundler.user_home.join(".bundle") return nil if bundle_dir == global_bundle_dir bundle_dir end def in_bundle? find_gemfile end def chdir(dir, &blk) Bundler.rubygems.ext_lock.synchronize do Dir.chdir dir, &blk end end def pwd Bundler.rubygems.ext_lock.synchronize do Pathname.pwd end end def with_clean_git_env(&block) keys = %w[GIT_DIR GIT_WORK_TREE] old_env = keys.inject({}) do |h, k| h.update(k => ENV[k]) end keys.each {|key| ENV.delete(key) } block.call ensure keys.each {|key| ENV[key] = old_env[key] } end def set_bundle_environment set_bundle_variables set_path set_rubyopt set_rubylib end # Rescues permissions errors raised by file system operations # (ie. Errno:EACCESS, Errno::EAGAIN) and raises more friendly errors instead. # # @param path [String] the path that the action will be attempted to # @param action [Symbol, #to_s] the type of operation that will be # performed. For example: :write, :read, :exec # # @yield path # # @raise [Bundler::PermissionError] if Errno:EACCES is raised in the # given block # @raise [Bundler::TemporaryResourceError] if Errno:EAGAIN is raised in the # given block # # @example # filesystem_access("vendor/cache", :write) do # FileUtils.mkdir_p("vendor/cache") # end # # @see {Bundler::PermissionError} def filesystem_access(path, action = :write, &block) # Use block.call instead of yield because of a bug in Ruby 2.2.2 # See https://github.com/bundler/bundler/issues/5341 for details block.call(path.dup.untaint) rescue Errno::EACCES raise PermissionError.new(path, action) rescue Errno::EAGAIN raise TemporaryResourceError.new(path, action) rescue Errno::EPROTO raise VirtualProtocolError.new rescue Errno::ENOSPC raise NoSpaceOnDeviceError.new(path, action) rescue *[const_get_safely(:ENOTSUP, Errno)].compact raise OperationNotSupportedError.new(path, action) rescue Errno::EEXIST, Errno::ENOENT raise rescue SystemCallError => e raise GenericSystemCallError.new(e, "There was an error accessing `#{path}`.") end def const_get_safely(constant_name, namespace) const_in_namespace = namespace.constants.include?(constant_name.to_s) || namespace.constants.include?(constant_name.to_sym) return nil unless const_in_namespace namespace.const_get(constant_name) end def major_deprecation(major_version, message) if Bundler.bundler_major_version >= major_version require "bundler/errors" raise DeprecatedError, "[REMOVED FROM #{major_version}.0] #{message}" end return unless prints_major_deprecations? @major_deprecation_ui ||= Bundler::UI::Shell.new("no-color" => true) ui = Bundler.ui.is_a?(@major_deprecation_ui.class) ? Bundler.ui : @major_deprecation_ui ui.warn("[DEPRECATED FOR #{major_version}.0] #{message}") end def print_major_deprecations! multiple_gemfiles = search_up(".") do |dir| gemfiles = gemfile_names.select {|gf| File.file? File.expand_path(gf, dir) } next if gemfiles.empty? break false if gemfiles.size == 1 end if multiple_gemfiles && Bundler.bundler_major_version == 1 Bundler::SharedHelpers.major_deprecation 2, \ "gems.rb and gems.locked will be preferred to Gemfile and Gemfile.lock." end if RUBY_VERSION < "2" major_deprecation(2, "Bundler will only support ruby >= 2.0, you are running #{RUBY_VERSION}") end return if Bundler.rubygems.provides?(">= 2") major_deprecation(2, "Bundler will only support rubygems >= 2.0, you are running #{Bundler.rubygems.version}") end def trap(signal, override = false, &block) prior = Signal.trap(signal) do block.call prior.call unless override end end def ensure_same_dependencies(spec, old_deps, new_deps) new_deps = new_deps.reject {|d| d.type == :development } old_deps = old_deps.reject {|d| d.type == :development } without_type = proc {|d| Gem::Dependency.new(d.name, d.requirements_list.sort) } new_deps.map!(&without_type) old_deps.map!(&without_type) extra_deps = new_deps - old_deps return if extra_deps.empty? Bundler.ui.debug "#{spec.full_name} from #{spec.remote} has either corrupted API or lockfile dependencies" \ " (was expecting #{old_deps.map(&:to_s)}, but the real spec has #{new_deps.map(&:to_s)})" raise APIResponseMismatchError, "Downloading #{spec.full_name} revealed dependencies not in the API or the lockfile (#{extra_deps.join(", ")})." \ "\nEither installing with `--full-index` or running `bundle update #{spec.name}` should fix the problem." end def pretty_dependency(dep, print_source = false) msg = String.new(dep.name) msg << " (#{dep.requirement})" unless dep.requirement == Gem::Requirement.default if dep.is_a?(Bundler::Dependency) platform_string = dep.platforms.join(", ") msg << " " << platform_string if !platform_string.empty? && platform_string != Gem::Platform::RUBY end msg << " from the `#{dep.source}` source" if print_source && dep.source msg end def md5_available? return @md5_available if defined?(@md5_available) @md5_available = begin require "openssl" OpenSSL::Digest::MD5.digest("") true rescue LoadError true rescue OpenSSL::Digest::DigestError false end end def digest(name) require "digest" Digest(name) end private def validate_bundle_path path_separator = Bundler.rubygems.path_separator return unless Bundler.bundle_path.to_s.split(path_separator).size > 1 message = "Your bundle path contains text matching #{path_separator.inspect}, " \ "which is the path separator for your system. Bundler cannot " \ "function correctly when the Bundle path contains the " \ "system's PATH separator. Please change your " \ "bundle path to not match #{path_separator.inspect}." \ "\nYour current bundle path is '#{Bundler.bundle_path}'." raise Bundler::PathError, message end def find_gemfile(order_matters = false) given = ENV["BUNDLE_GEMFILE"] return given if given && !given.empty? names = gemfile_names names.reverse! if order_matters && Bundler.feature_flag.prefer_gems_rb? find_file(*names) end def gemfile_names ["Gemfile", "gems.rb"] end def find_file(*names) search_up(*names) do |filename| return filename if File.file?(filename) end end def find_directory(*names) search_up(*names) do |dirname| return dirname if File.directory?(dirname) end end def search_up(*names) previous = nil current = File.expand_path(SharedHelpers.pwd).untaint until !File.directory?(current) || current == previous if ENV["BUNDLE_SPEC_RUN"] # avoid stepping above the tmp directory when testing return nil if File.file?(File.join(current, "bundler.gemspec")) end names.each do |name| filename = File.join(current, name) yield filename end previous = current current = File.expand_path("..", current) end end def set_env(key, value) raise ArgumentError, "new key #{key}" unless EnvironmentPreserver::BUNDLER_KEYS.include?(key) orig_key = "#{EnvironmentPreserver::BUNDLER_PREFIX}#{key}" orig = ENV[key] orig ||= EnvironmentPreserver::INTENTIONALLY_NIL ENV[orig_key] ||= orig ENV[key] = value end public :set_env def set_bundle_variables begin Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", Bundler.rubygems.bin_path("bundler", "bundle", VERSION) rescue Gem::GemNotFoundException Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", File.expand_path("../../../exe/bundle", __FILE__) end # Set BUNDLE_GEMFILE Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile(:order_matters).to_s Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION end def set_path validate_bundle_path paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR) paths.unshift "#{Bundler.bundle_path}/bin" Bundler::SharedHelpers.set_env "PATH", paths.uniq.join(File::PATH_SEPARATOR) end def set_rubyopt rubyopt = [ENV["RUBYOPT"]].compact return if !rubyopt.empty? && rubyopt.first =~ %r{-rbundler/setup} rubyopt.unshift %(-rbundler/setup) Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ") end def set_rubylib rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR) rubylib.unshift bundler_ruby_lib Bundler::SharedHelpers.set_env "RUBYLIB", rubylib.uniq.join(File::PATH_SEPARATOR) end def bundler_ruby_lib File.expand_path("../..", __FILE__) end def clean_load_path # handle 1.9 where system gems are always on the load path return unless defined?(::Gem) bundler_lib = bundler_ruby_lib loaded_gem_paths = Bundler.rubygems.loaded_gem_paths $LOAD_PATH.reject! do |p| next if File.expand_path(p).start_with?(bundler_lib) loaded_gem_paths.delete(p) end $LOAD_PATH.uniq! end def prints_major_deprecations? require "bundler" deprecation_release = Bundler::VERSION.split(".").drop(1).include?("99") return false if !deprecation_release && !Bundler.settings[:major_deprecations] require "bundler/deprecate" return false if Bundler::Deprecate.skip true end extend self end end bundler-1.16.1/lib/bundler/process_lock.rb0000644000175000017500000000120213217261023021213 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class ProcessLock def self.lock(bundle_path = Bundler.bundle_path) lock_file_path = File.join(bundle_path, "bundler.lock") has_lock = false File.open(lock_file_path, "w") do |f| f.flock(File::LOCK_EX) has_lock = true yield f.flock(File::LOCK_UN) end rescue Errno::EACCES, Errno::ENOLCK # In the case the user does not have access to # create the lock file or is using NFS where # locks are not available we skip locking. yield ensure FileUtils.rm_f(lock_file_path) if has_lock end end end bundler-1.16.1/lib/bundler/compact_index_client/0000755000175000017500000000000013217261023022360 5ustar samuelophsamuelophbundler-1.16.1/lib/bundler/compact_index_client/cache.rb0000644000175000017500000000630613217261023023755 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class CompactIndexClient class Cache attr_reader :directory def initialize(directory) @directory = Pathname.new(directory).expand_path info_roots.each do |dir| SharedHelpers.filesystem_access(dir) do FileUtils.mkdir_p(dir) end end end def names lines(names_path) end def names_path directory.join("names") end def versions versions_by_name = Hash.new {|hash, key| hash[key] = [] } info_checksums_by_name = {} lines(versions_path).each do |line| name, versions_string, info_checksum = line.split(" ", 3) info_checksums_by_name[name] = info_checksum || "" versions_string.split(",").each do |version| if version.start_with?("-") version = version[1..-1].split("-", 2).unshift(name) versions_by_name[name].delete(version) else version = version.split("-", 2).unshift(name) versions_by_name[name] << version end end end [versions_by_name, info_checksums_by_name] end def versions_path directory.join("versions") end def checksums checksums = {} lines(versions_path).each do |line| name, _, checksum = line.split(" ", 3) checksums[name] = checksum end checksums end def dependencies(name) lines(info_path(name)).map do |line| parse_gem(line) end end def info_path(name) name = name.to_s if name =~ /[^a-z0-9_-]/ name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}" info_roots.last.join(name) else info_roots.first.join(name) end end def specific_dependency(name, version, platform) pattern = [version, platform].compact.join("-") return nil if pattern.empty? gem_lines = info_path(name).read gem_line = gem_lines[/^#{Regexp.escape(pattern)}\b.*/, 0] gem_line ? parse_gem(gem_line) : nil end private def lines(path) return [] unless path.file? lines = SharedHelpers.filesystem_access(path, :read, &:read).split("\n") header = lines.index("---") header ? lines[header + 1..-1] : lines end def parse_gem(string) version_and_platform, rest = string.split(" ", 2) version, platform = version_and_platform.split("-", 2) dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : [] requirements = requirements ? requirements.map {|r| parse_dependency(r) } : [] [version, platform, dependencies, requirements] end def parse_dependency(string) dependency = string.split(":") dependency[-1] = dependency[-1].split("&") if dependency.size > 1 dependency end def info_roots [ directory.join("info"), directory.join("info-special-characters"), ] end end end end bundler-1.16.1/lib/bundler/compact_index_client/updater.rb0000644000175000017500000000676013217261023024362 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_fileutils" require "stringio" require "zlib" module Bundler class CompactIndexClient class Updater class MisMatchedChecksumError < Error def initialize(path, server_checksum, local_checksum) @path = path @server_checksum = server_checksum @local_checksum = local_checksum end def message "The checksum of /#{@path} does not match the checksum provided by the server! Something is wrong " \ "(local checksum is #{@local_checksum.inspect}, was expecting #{@server_checksum.inspect})." end end def initialize(fetcher) @fetcher = fetcher require "tmpdir" end def update(local_path, remote_path, retrying = nil) headers = {} Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir| local_temp_path = Pathname.new(local_temp_dir).join(local_path.basename) # first try to fetch any new bytes on the existing file if retrying.nil? && local_path.file? FileUtils.cp local_path, local_temp_path headers["If-None-Match"] = etag_for(local_temp_path) headers["Range"] = if local_temp_path.size.nonzero? # Subtract a byte to ensure the range won't be empty. # Avoids 416 (Range Not Satisfiable) responses. "bytes=#{local_temp_path.size - 1}-" else "bytes=#{local_temp_path.size}-" end else # Fastly ignores Range when Accept-Encoding: gzip is set headers["Accept-Encoding"] = "gzip" end response = @fetcher.call(remote_path, headers) return nil if response.is_a?(Net::HTTPNotModified) content = response.body if response["Content-Encoding"] == "gzip" content = Zlib::GzipReader.new(StringIO.new(content)).read end SharedHelpers.filesystem_access(local_temp_path) do if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero? local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) } else local_temp_path.open("w") {|f| f << content } end end response_etag = (response["ETag"] || "").gsub(%r{\AW/}, "") if etag_for(local_temp_path) == response_etag SharedHelpers.filesystem_access(local_path) do FileUtils.mv(local_temp_path, local_path) end return nil end if retrying raise MisMatchedChecksumError.new(remote_path, response_etag, etag_for(local_temp_path)) end update(local_path, remote_path, :retrying) end end def etag_for(path) sum = checksum_for_file(path) sum ? %("#{sum}") : nil end def slice_body(body, range) if body.respond_to?(:byteslice) body.byteslice(range) else # pre-1.9.3 body.unpack("@#{range.first}a#{range.end + 1}").first end end def checksum_for_file(path) return nil unless path.file? # This must use IO.read instead of Digest.file().hexdigest # because we need to preserve \n line endings on windows when calculating # the checksum SharedHelpers.filesystem_access(path, :read) do SharedHelpers.digest(:MD5).hexdigest(IO.read(path)) end end end end end bundler-1.16.1/lib/bundler/definition.rb0000644000175000017500000010736113217261023020672 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/lockfile_parser" require "set" module Bundler class Definition include GemHelpers attr_reader( :dependencies, :gem_version_promoter, :locked_deps, :locked_gems, :platforms, :requires, :ruby_version, :lockfile, :gemfiles ) # Given a gemfile and lockfile creates a Bundler definition # # @param gemfile [Pathname] Path to Gemfile # @param lockfile [Pathname,nil] Path to Gemfile.lock # @param unlock [Hash, Boolean, nil] Gems that have been requested # to be updated or true if all gems should be updated # @return [Bundler::Definition] def self.build(gemfile, lockfile, unlock) unlock ||= {} gemfile = Pathname.new(gemfile).expand_path raise GemfileNotFound, "#{gemfile} not found" unless gemfile.file? Dsl.evaluate(gemfile, lockfile, unlock) end # # How does the new system work? # # * Load information from Gemfile and Lockfile # * Invalidate stale locked specs # * All specs from stale source are stale # * All specs that are reachable only through a stale # dependency are stale. # * If all fresh dependencies are satisfied by the locked # specs, then we can try to resolve locally. # # @param lockfile [Pathname] Path to Gemfile.lock # @param dependencies [Array(Bundler::Dependency)] array of dependencies from Gemfile # @param sources [Bundler::SourceList] # @param unlock [Hash, Boolean, nil] Gems that have been requested # to be updated or true if all gems should be updated # @param ruby_version [Bundler::RubyVersion, nil] Requested Ruby Version # @param optional_groups [Array(String)] A list of optional groups def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, optional_groups = [], gemfiles = []) if [true, false].include?(unlock) @unlocking_bundler = false @unlocking = unlock else unlock = unlock.dup @unlocking_bundler = unlock.delete(:bundler) unlock.delete_if {|_k, v| Array(v).empty? } @unlocking = !unlock.empty? end @dependencies = dependencies @sources = sources @unlock = unlock @optional_groups = optional_groups @remote = false @specs = nil @ruby_version = ruby_version @gemfiles = gemfiles @lockfile = lockfile @lockfile_contents = String.new @locked_bundler_version = nil @locked_ruby_version = nil if lockfile && File.exist?(lockfile) @lockfile_contents = Bundler.read_file(lockfile) @locked_gems = LockfileParser.new(@lockfile_contents) @locked_platforms = @locked_gems.platforms @platforms = @locked_platforms.dup @locked_bundler_version = @locked_gems.bundler_version @locked_ruby_version = @locked_gems.ruby_version if unlock != true @locked_deps = @locked_gems.dependencies @locked_specs = SpecSet.new(@locked_gems.specs) @locked_sources = @locked_gems.sources else @unlock = {} @locked_deps = {} @locked_specs = SpecSet.new([]) @locked_sources = [] end else @unlock = {} @platforms = [] @locked_gems = nil @locked_deps = {} @locked_specs = SpecSet.new([]) @locked_sources = [] @locked_platforms = [] end @unlock[:gems] ||= [] @unlock[:sources] ||= [] @unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object @ruby_version.diff(locked_ruby_version_object) end @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version) add_current_platform unless Bundler.frozen? converge_path_sources_to_gemspec_sources @path_changes = converge_paths @source_changes = converge_sources unless @unlock[:lock_shared_dependencies] eager_unlock = expand_dependencies(@unlock[:gems]) @unlock[:gems] = @locked_specs.for(eager_unlock).map(&:name) end @gem_version_promoter = create_gem_version_promoter @dependency_changes = converge_dependencies @local_changes = converge_locals @requires = compute_requires end def create_gem_version_promoter locked_specs = if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty? # Definition uses an empty set of locked_specs to indicate all gems # are unlocked, but GemVersionPromoter needs the locked_specs # for conservative comparison. Bundler::SpecSet.new(@locked_gems.specs) else @locked_specs end GemVersionPromoter.new(locked_specs, @unlock[:gems]) end def resolve_with_cache! raise "Specs already loaded" if @specs sources.cached! specs end def resolve_remotely! raise "Specs already loaded" if @specs @remote = true sources.remote! specs end # For given dependency list returns a SpecSet with Gemspec of all the required # dependencies. # 1. The method first resolves the dependencies specified in Gemfile # 2. After that it tries and fetches gemspec of resolved dependencies # # @return [Bundler::SpecSet] def specs @specs ||= begin begin specs = resolve.materialize(Bundler.settings[:cache_all_platforms] ? dependencies : requested_dependencies) rescue GemNotFound => e # Handle yanked gem gem_name, gem_version = extract_gem_info(e) locked_gem = @locked_specs[gem_name].last raise if locked_gem.nil? || locked_gem.version.to_s != gem_version || !@remote raise GemNotFound, "Your bundle is locked to #{locked_gem}, but that version could not " \ "be found in any of the sources listed in your Gemfile. If you haven't changed sources, " \ "that means the author of #{locked_gem} has removed it. You'll need to update your bundle " \ "to a different version of #{locked_gem} that hasn't been removed in order to install." end unless specs["bundler"].any? bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last specs["bundler"] = bundler end specs end end def new_specs specs - @locked_specs end def removed_specs @locked_specs - specs end def new_platform? @new_platform end def missing_specs missing = [] resolve.materialize(requested_dependencies, missing) missing end def missing_specs? missing = missing_specs return false if missing.empty? Bundler.ui.debug "The definition is missing #{missing.map(&:full_name)}" true rescue BundlerError => e @index = nil @resolve = nil @specs = nil @gem_version_promoter = create_gem_version_promoter Bundler.ui.debug "The definition is missing dependencies, failed to resolve & materialize locally (#{e})" true end def requested_specs @requested_specs ||= begin groups = requested_groups groups.map!(&:to_sym) specs_for(groups) end end def current_dependencies dependencies.select(&:should_include?) end def specs_for(groups) deps = dependencies.select {|d| (d.groups & groups).any? } deps.delete_if {|d| !d.should_include? } specs.for(expand_dependencies(deps)) end # Resolve all the dependencies specified in Gemfile. It ensures that # dependencies that have been already resolved via locked file and are fresh # are reused when resolving dependencies # # @return [SpecSet] resolved dependencies def resolve @resolve ||= begin last_resolve = converge_locked_specs if Bundler.frozen? Bundler.ui.debug "Frozen, using resolution from the lockfile" last_resolve elsif !unlocking? && nothing_changed? Bundler.ui.debug("Found no changes, using resolution from the lockfile") last_resolve else # Run a resolve against the locally available gems Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}") last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms) end end end def index @index ||= Index.build do |idx| dependency_names = @dependencies.map(&:name) sources.all_sources.each do |source| source.dependency_names = dependency_names - pinned_spec_names(source) idx.add_source source.specs dependency_names.concat(source.unmet_deps).uniq! end double_check_for_index(idx, dependency_names) end end # Suppose the gem Foo depends on the gem Bar. Foo exists in Source A. Bar has some versions that exist in both # sources A and B. At this point, the API request will have found all the versions of Bar in source A, # but will not have found any versions of Bar from source B, which is a problem if the requested version # of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for # each spec we found, we add all possible versions from all sources to the index. def double_check_for_index(idx, dependency_names) pinned_names = pinned_spec_names loop do idxcount = idx.size names = :names # do this so we only have to traverse to get dependency_names from the index once unmet_dependency_names = lambda do return names unless names == :names new_names = sources.all_sources.map(&:dependency_names_to_double_check) return names = nil if new_names.compact! names = new_names.flatten(1).concat(dependency_names) names.uniq! names -= pinned_names names end sources.all_sources.each do |source| source.double_check_for(unmet_dependency_names) end break if idxcount == idx.size end end private :double_check_for_index def has_rubygems_remotes? sources.rubygems_sources.any? {|s| s.remotes.any? } end def has_local_dependencies? !sources.path_sources.empty? || !sources.git_sources.empty? end def spec_git_paths sources.git_sources.map {|s| s.path.to_s } end def groups dependencies.map(&:groups).flatten.uniq end def lock(file, preserve_unknown_sections = false) contents = to_lock # Convert to \r\n if the existing lock has them # i.e., Windows with `git config core.autocrlf=true` contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n") if @locked_bundler_version locked_major = @locked_bundler_version.segments.first current_major = Gem::Version.create(Bundler::VERSION).segments.first if updating_major = locked_major < current_major Bundler.ui.warn "Warning: the lockfile is being updated to Bundler #{current_major}, " \ "after which you will be unable to return to Bundler #{@locked_bundler_version.segments.first}." end end preserve_unknown_sections ||= !updating_major && (Bundler.frozen? || !(unlocking? || @unlocking_bundler)) return if lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections) if Bundler.frozen? Bundler.ui.error "Cannot write a changed lockfile while frozen." return end SharedHelpers.filesystem_access(file) do |p| File.open(p, "wb") {|f| f.puts(contents) } end end def locked_bundler_version if @locked_bundler_version && @locked_bundler_version < Gem::Version.new(Bundler::VERSION) new_version = Bundler::VERSION end new_version || @locked_bundler_version || Bundler::VERSION end def locked_ruby_version return unless ruby_version if @unlock[:ruby] || !@locked_ruby_version Bundler::RubyVersion.system else @locked_ruby_version end end def locked_ruby_version_object return unless @locked_ruby_version @locked_ruby_version_object ||= begin unless version = RubyVersion.from_string(@locked_ruby_version) raise LockfileError, "The Ruby version #{@locked_ruby_version} from " \ "#{@lockfile} could not be parsed. " \ "Try running bundle update --ruby to resolve this." end version end end def to_lock require "bundler/lockfile_generator" LockfileGenerator.generate(self) end def ensure_equivalent_gemfile_and_lockfile(explicit_flag = false) msg = String.new msg << "You are trying to install in deployment mode after changing\n" \ "your Gemfile. Run `bundle install` elsewhere and add the\n" \ "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control." unless explicit_flag suggested_command = if Bundler.settings.locations("frozen")[:global] "bundle config --delete frozen" elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any? "bundle config --delete deployment" else "bundle install --no-deployment" end msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \ "freeze \nby running `#{suggested_command}`." end added = [] deleted = [] changed = [] new_platforms = @platforms - @locked_platforms deleted_platforms = @locked_platforms - @platforms added.concat new_platforms.map {|p| "* platform: #{p}" } deleted.concat deleted_platforms.map {|p| "* platform: #{p}" } gemfile_sources = sources.lock_sources new_sources = gemfile_sources - @locked_sources deleted_sources = @locked_sources - gemfile_sources new_deps = @dependencies - @locked_deps.values deleted_deps = @locked_deps.values - @dependencies # Check if it is possible that the source is only changed thing if (new_deps.empty? && deleted_deps.empty?) && (!new_sources.empty? && !deleted_sources.empty?) new_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) } deleted_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) } end if @locked_sources != gemfile_sources if new_sources.any? added.concat new_sources.map {|source| "* source: #{source}" } end if deleted_sources.any? deleted.concat deleted_sources.map {|source| "* source: #{source}" } end end added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any? if deleted_deps.any? deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } end both_sources = Hash.new {|h, k| h[k] = [] } @dependencies.each {|d| both_sources[d.name][0] = d } @locked_deps.each {|name, d| both_sources[name][1] = d.source } both_sources.each do |name, (dep, lock_source)| next unless (dep.nil? && !lock_source.nil?) || (!dep.nil? && !lock_source.nil? && !lock_source.can_lock?(dep)) gemfile_source_name = (dep && dep.source) || "no specified source" lockfile_source_name = lock_source || "no specified source" changed << "* #{name} from `#{gemfile_source_name}` to `#{lockfile_source_name}`" end reason = change_reason msg << "\n\n#{reason.split(", ").map(&:capitalize).join("\n")}" unless reason.strip.empty? msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any? msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any? msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any? msg << "\n" raise ProductionError, msg if added.any? || deleted.any? || changed.any? || !nothing_changed? end def validate_runtime! validate_ruby! validate_platforms! end def validate_ruby! return unless ruby_version if diff = ruby_version.diff(Bundler::RubyVersion.system) problem, expected, actual = diff msg = case problem when :engine "Your Ruby engine is #{actual}, but your Gemfile specified #{expected}" when :version "Your Ruby version is #{actual}, but your Gemfile specified #{expected}" when :engine_version "Your #{Bundler::RubyVersion.system.engine} version is #{actual}, but your Gemfile specified #{ruby_version.engine} #{expected}" when :patchlevel if !expected.is_a?(String) "The Ruby patchlevel in your Gemfile must be a string" else "Your Ruby patchlevel is #{actual}, but your Gemfile specified #{expected}" end end raise RubyVersionMismatch, msg end end def validate_platforms! return if @platforms.any? do |bundle_platform| Bundler.rubygems.platforms.any? do |local_platform| MatchPlatform.platforms_match?(bundle_platform, local_platform) end end raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \ "but your local platforms are #{Bundler.rubygems.platforms.map(&:to_s)}, and " \ "there's no compatible match between those two lists." end def add_platform(platform) @new_platform ||= !@platforms.include?(platform) @platforms |= [platform] end def remove_platform(platform) return if @platforms.delete(Gem::Platform.new(platform)) raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}" end def add_current_platform current_platform = Bundler.local_platform add_platform(current_platform) if Bundler.feature_flag.specific_platform? add_platform(generic(current_platform)) end def find_resolved_spec(current_spec) specs.find_by_name_and_platform(current_spec.name, current_spec.platform) end def find_indexed_specs(current_spec) index[current_spec.name].select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version) end attr_reader :sources private :sources def nothing_changed? !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes end def unlocking? @unlocking end private def change_reason if unlocking? unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v| if v == true k.to_s else v = Array(v) "#{k}: (#{v.join(", ")})" end end.join(", ") return "bundler is unlocking #{unlock_reason}" end [ [@source_changes, "the list of sources changed"], [@dependency_changes, "the dependencies in your gemfile changed"], [@new_platform, "you added a new platform to your gemfile"], [@path_changes, "the gemspecs for path gems changed"], [@local_changes, "the gemspecs for git local gems changed"], ].select(&:first).map(&:last).join(", ") end def pretty_dep(dep, source = false) SharedHelpers.pretty_dependency(dep, source) end # Check if the specs of the given source changed # according to the locked source. def specs_changed?(source) locked = @locked_sources.find {|s| s == source } !locked || dependencies_for_source_changed?(source, locked) || specs_for_source_changed?(source) end def dependencies_for_source_changed?(source, locked_source = source) deps_for_source = @dependencies.select {|s| s.source == source } locked_deps_for_source = @locked_deps.values.select {|dep| dep.source == locked_source } Set.new(deps_for_source) != Set.new(locked_deps_for_source) end def specs_for_source_changed?(source) locked_index = Index.new locked_index.use(@locked_specs.select {|s| source.can_lock?(s) }) # order here matters, since Index#== is checking source.specs.include?(locked_index) locked_index != source.specs rescue PathError, GitError => e Bundler.ui.debug "Assuming that #{source} has not changed since fetching its specs errored (#{e})" false end # Get all locals and override their matching sources. # Return true if any of the locals changed (for example, # they point to a new revision) or depend on new specs. def converge_locals locals = [] Bundler.settings.local_overrides.map do |k, v| spec = @dependencies.find {|s| s.name == k } source = spec && spec.source if source && source.respond_to?(:local_override!) source.unlock! if @unlock[:gems].include?(spec.name) locals << [source, source.local_override!(v)] end end sources_with_changes = locals.select do |source, changed| changed || specs_changed?(source) end.map(&:first) !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty? end def converge_paths sources.path_sources.any? do |source| specs_changed?(source) end end def converge_path_source_to_gemspec_source(source) return source unless source.instance_of?(Source::Path) gemspec_source = sources.path_sources.find {|s| s.is_a?(Source::Gemspec) && s.as_path_source == source } gemspec_source || source end def converge_path_sources_to_gemspec_sources @locked_sources.map! do |source| converge_path_source_to_gemspec_source(source) end @locked_specs.each do |spec| spec.source &&= converge_path_source_to_gemspec_source(spec.source) end @locked_deps.each do |_, dep| dep.source &&= converge_path_source_to_gemspec_source(dep.source) end end def converge_rubygems_sources return false if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? changes = false # Get the RubyGems sources from the Gemfile.lock locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) } # Get the RubyGems remotes from the Gemfile actual_remotes = sources.rubygems_remotes # If there is a RubyGems source in both if !locked_gem_sources.empty? && !actual_remotes.empty? locked_gem_sources.each do |locked_gem| # Merge the remotes from the Gemfile into the Gemfile.lock changes |= locked_gem.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes]) end end changes end def converge_sources changes = false changes |= converge_rubygems_sources # Replace the sources from the Gemfile with the sources from the Gemfile.lock, # if they exist in the Gemfile.lock and are `==`. If you can't find an equivalent # source in the Gemfile.lock, use the one from the Gemfile. changes |= sources.replace_sources!(@locked_sources) sources.all_sources.each do |source| # If the source is unlockable and the current command allows an unlock of # the source (for example, you are doing a `bundle update ` of a git-pinned # gem), unlock it. For git sources, this means to unlock the revision, which # will cause the `ref` used to be the most recent for the branch (or master) if # an explicit `ref` is not used. if source.respond_to?(:unlock!) && @unlock[:sources].include?(source.name) source.unlock! changes = true end end changes end def converge_dependencies frozen = Bundler.frozen? (@dependencies + @locked_deps.values).each do |dep| locked_source = @locked_deps[dep.name] # This is to make sure that if bundler is installing in deployment mode and # after locked_source and sources don't match, we still use locked_source. if frozen && !locked_source.nil? && locked_source.respond_to?(:source) && locked_source.source.instance_of?(Source::Path) && locked_source.source.path.exist? dep.source = locked_source.source elsif dep.source dep.source = sources.get(dep.source) end if dep.source.is_a?(Source::Gemspec) dep.platforms.concat(@platforms.map {|p| Dependency::REVERSE_PLATFORM_MAP[p] }.flatten(1)).uniq! end end changes = false # We want to know if all match, but don't want to check all entries # This means we need to return false if any dependency doesn't match # the lock or doesn't exist in the lock. @dependencies.each do |dependency| unless locked_dep = @locked_deps[dependency.name] changes = true next end # Gem::Dependency#== matches Gem::Dependency#type. As the lockfile # doesn't carry a notion of the dependency type, if you use # add_development_dependency in a gemspec that's loaded with the gemspec # directive, the lockfile dependencies and resolved dependencies end up # with a mismatch on #type. Work around that by setting the type on the # dep from the lockfile. locked_dep.instance_variable_set(:@type, dependency.type) # We already know the name matches from the hash lookup # so we only need to check the requirement now changes ||= dependency.requirement != locked_dep.requirement end changes end # Remove elements from the locked specs that are expired. This will most # commonly happen if the Gemfile has changed since the lockfile was last # generated def converge_locked_specs deps = [] # Build a list of dependencies that are the same in the Gemfile # and Gemfile.lock. If the Gemfile modified a dependency, but # the gem in the Gemfile.lock still satisfies it, this is fine # too. @dependencies.each do |dep| locked_dep = @locked_deps[dep.name] # If the locked_dep doesn't match the dependency we're looking for then we ignore the locked_dep locked_dep = nil unless locked_dep == dep if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep) deps << dep elsif dep.source.is_a?(Source::Path) && dep.current_platform? && (!locked_dep || dep.source != locked_dep.source) @locked_specs.each do |s| @unlock[:gems] << s.name if s.source == dep.source end dep.source.unlock! if dep.source.respond_to?(:unlock!) dep.source.specs.each {|s| @unlock[:gems] << s.name } end end unlock_source_unlocks_spec = Bundler.feature_flag.unlock_source_unlocks_spec? converged = [] @locked_specs.each do |s| # Replace the locked dependency's source with the equivalent source from the Gemfile dep = @dependencies.find {|d| s.satisfies?(d) } s.source = (dep && dep.source) || sources.get(s.source) # Don't add a spec to the list if its source is expired. For example, # if you change a Git gem to RubyGems. next if s.source.nil? next if @unlock[:sources].include?(s.source.name) # XXX This is a backwards-compatibility fix to preserve the ability to # unlock a single gem by passing its name via `--source`. See issue #3759 # TODO: delete in Bundler 2 next if unlock_source_unlocks_spec && @unlock[:sources].include?(s.name) # If the spec is from a path source and it doesn't exist anymore # then we unlock it. # Path sources have special logic if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec) other_sources_specs = begin s.source.specs rescue PathError, GitError # if we won't need the source (according to the lockfile), # don't error if the path/git source isn't available next if @locked_specs. for(requested_dependencies, [], false, true, false). none? {|locked_spec| locked_spec.source == s.source } raise end other = other_sources_specs[s].first # If the spec is no longer in the path source, unlock it. This # commonly happens if the version changed in the gemspec next unless other deps2 = other.dependencies.select {|d| d.type != :development } runtime_dependencies = s.dependencies.select {|d| d.type != :development } # If the dependencies of the path source have changed, unlock it next unless runtime_dependencies.sort == deps2.sort end converged << s end resolve = SpecSet.new(converged) resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems], false, false, false) diff = nil # Now, we unlock any sources that do not have anymore gems pinned to it sources.all_sources.each do |source| next unless source.respond_to?(:unlock!) unless resolve.any? {|s| s.source == source } diff ||= @locked_specs.to_a - resolve.to_a source.unlock! if diff.any? {|s| s.source == source } end end resolve end def in_locked_deps?(dep, locked_dep) # Because the lockfile can't link a dep to a specific remote, we need to # treat sources as equivalent anytime the locked dep has all the remotes # that the Gemfile dep does. locked_dep && locked_dep.source && dep.source && locked_dep.source.include?(dep.source) end def satisfies_locked_spec?(dep) @locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) } end # This list of dependencies is only used in #resolve, so it's OK to add # the metadata dependencies here def expanded_dependencies @expanded_dependencies ||= begin expand_dependencies(dependencies + metadata_dependencies, @remote) end end def metadata_dependencies @metadata_dependencies ||= begin ruby_versions = concat_ruby_version_requirements(@ruby_version) if ruby_versions.empty? || !@ruby_version.exact? concat_ruby_version_requirements(RubyVersion.system) concat_ruby_version_requirements(locked_ruby_version_object) unless @unlock[:ruby] end [ Dependency.new("ruby\0", ruby_versions), Dependency.new("rubygems\0", Gem::VERSION), ] end end def concat_ruby_version_requirements(ruby_version, ruby_versions = []) return ruby_versions unless ruby_version if ruby_version.patchlevel ruby_versions << ruby_version.to_gem_version_with_patchlevel else ruby_versions.concat(ruby_version.versions.map do |version| requirement = Gem::Requirement.new(version) if requirement.exact? "~> #{version}.0" else requirement end end) end end def expand_dependencies(dependencies, remote = false) sorted_platforms = Resolver.sort_platforms(@platforms) deps = [] dependencies.each do |dep| dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name) next if !remote && !dep.current_platform? platforms = dep.gem_platforms(sorted_platforms) if platforms.empty? mapped_platforms = dep.platforms.map {|p| Dependency::PLATFORM_MAP[p] } Bundler.ui.warn \ "The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \ "Bundler is installing for #{@platforms.join ", "} but the dependency " \ "is only for #{mapped_platforms.join ", "}. " \ "To add those platforms to the bundle, " \ "run `bundle lock --add-platform #{mapped_platforms.join " "}`." end platforms.each do |p| deps << DepProxy.new(dep, p) if remote || p == generic_local_platform end end deps end def requested_dependencies groups = requested_groups groups.map!(&:to_sym) dependencies.reject {|d| !d.should_include? || (d.groups & groups).empty? } end def source_requirements # Load all specs from remote sources index # Record the specs available in each gem's source, so that those # specs will be available later when the resolver knows where to # look for that gemspec (or its dependencies) default = sources.default_source source_requirements = { :default => default } default = nil unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? dependencies.each do |dep| next unless source = dep.source || default source_requirements[dep.name] = source end metadata_dependencies.each do |dep| source_requirements[dep.name] = sources.metadata_source end source_requirements["bundler"] = sources.metadata_source # needs to come last to override source_requirements end def pinned_spec_names(skip = nil) pinned_names = [] default = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? && sources.default_source @dependencies.each do |dep| next unless dep_source = dep.source || default next if dep_source == skip pinned_names << dep.name end pinned_names end def requested_groups groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with] end def lockfiles_equal?(current, proposed, preserve_unknown_sections) if preserve_unknown_sections sections_to_ignore = LockfileParser.sections_to_ignore(@locked_bundler_version) sections_to_ignore += LockfileParser.unknown_sections_in_lockfile(current) sections_to_ignore += LockfileParser::ENVIRONMENT_VERSION_SECTIONS pattern = /#{Regexp.union(sections_to_ignore)}\n(\s{2,}.*\n)+/ whitespace_cleanup = /\n{2,}/ current = current.gsub(pattern, "\n").gsub(whitespace_cleanup, "\n\n").strip proposed = proposed.gsub(pattern, "\n").gsub(whitespace_cleanup, "\n\n").strip end current == proposed end def extract_gem_info(error) # This method will extract the error message like "Could not find foo-1.2.3 in any of the sources" # to an array. The first element will be the gem name (e.g. foo), the second will be the version number. error.message.scan(/Could not find (\w+)-(\d+(?:\.\d+)+)/).flatten end def compute_requires dependencies.reduce({}) do |requires, dep| next requires unless dep.should_include? requires[dep.name] = Array(dep.autorequire || dep.name).map do |file| # Allow `require: true` as an alias for `require: ` file == true ? dep.name : file end requires end end def additional_base_requirements_for_resolve return [] unless @locked_gems && Bundler.feature_flag.only_update_to_newer_versions? dependencies_by_name = dependencies.group_by(&:name) @locked_gems.specs.reduce({}) do |requirements, locked_spec| name = locked_spec.name next requirements if @locked_deps[name] != dependencies_by_name[name] dep = Gem::Dependency.new(name, ">= #{locked_spec.version}") requirements[name] = DepProxy.new(dep, locked_spec.platform) requirements end.values end def equivalent_rubygems_remotes?(source) return false unless source.is_a?(Source::Rubygems) Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes) end end end bundler-1.16.1/lib/bundler/fetcher.rb0000644000175000017500000002545413217261023020164 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/vendored_persistent" require "cgi" require "securerandom" require "zlib" module Bundler # Handles all the fetching with the rubygems server class Fetcher autoload :CompactIndex, "bundler/fetcher/compact_index" autoload :Downloader, "bundler/fetcher/downloader" autoload :Dependency, "bundler/fetcher/dependency" autoload :Index, "bundler/fetcher/index" # This error is raised when it looks like the network is down class NetworkDownError < HTTPError; end # This error is raised if the API returns a 413 (only printed in verbose) class FallbackError < HTTPError; end # This is the error raised if OpenSSL fails the cert verification class CertificateFailureError < HTTPError def initialize(remote_uri) remote_uri = filter_uri(remote_uri) super "Could not verify the SSL certificate for #{remote_uri}.\nThere" \ " is a chance you are experiencing a man-in-the-middle attack, but" \ " most likely your system doesn't have the CA certificates needed" \ " for verification. For information about OpenSSL certificates, see" \ " http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile" \ " sources and change 'https' to 'http'." end end # This is the error raised when a source is HTTPS and OpenSSL didn't load class SSLError < HTTPError def initialize(msg = nil) super msg || "Could not load OpenSSL.\n" \ "You must recompile Ruby with OpenSSL support or change the sources in your " \ "Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \ "using RVM are available at rvm.io/packages/openssl." end end # This error is raised if HTTP authentication is required, but not provided. class AuthenticationRequiredError < HTTPError def initialize(remote_uri) remote_uri = filter_uri(remote_uri) super "Authentication is required for #{remote_uri}.\n" \ "Please supply credentials for this source. You can do this by running:\n" \ " bundle config #{remote_uri} username:password" end end # This error is raised if HTTP authentication is provided, but incorrect. class BadAuthenticationError < HTTPError def initialize(remote_uri) remote_uri = filter_uri(remote_uri) super "Bad username or password for #{remote_uri}.\n" \ "Please double-check your credentials and correct them." end end # Exceptions classes that should bypass retry attempts. If your password didn't work the # first time, it's not going to the third time. NET_ERRORS = [:HTTPBadGateway, :HTTPBadRequest, :HTTPFailedDependency, :HTTPForbidden, :HTTPInsufficientStorage, :HTTPMethodNotAllowed, :HTTPMovedPermanently, :HTTPNoContent, :HTTPNotFound, :HTTPNotImplemented, :HTTPPreconditionFailed, :HTTPRequestEntityTooLarge, :HTTPRequestURITooLong, :HTTPUnauthorized, :HTTPUnprocessableEntity, :HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze FAIL_ERRORS = begin fail_errors = [AuthenticationRequiredError, BadAuthenticationError, FallbackError] fail_errors << Gem::Requirement::BadRequirementError if defined?(Gem::Requirement::BadRequirementError) fail_errors.concat(NET_ERRORS.map {|e| SharedHelpers.const_get_safely(e, Net) }.compact) end.freeze class << self attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries end self.redirect_limit = Bundler.settings[:redirect] # How many redirects to allow in one request self.api_timeout = Bundler.settings[:timeout] # How long to wait for each API call self.max_retries = Bundler.settings[:retry] # How many retries for the API call def initialize(remote) @remote = remote Socket.do_not_reverse_lookup = true connection # create persistent connection end def uri @remote.anonymized_uri end # fetch a gem specification def fetch_spec(spec) spec -= [nil, "ruby", ""] spec_file_name = "#{spec.join "-"}.gemspec" uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") if uri.scheme == "file" Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path)) elsif cached_spec_path = gemspec_cached_path(spec_file_name) Bundler.load_gemspec(cached_spec_path) else Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body) end rescue MarshalError raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \ "Your network or your gem server is probably having issues right now." end # return the specs in the bundler format as an index with retries def specs_with_retry(gem_names, source) Bundler::Retry.new("fetcher", FAIL_ERRORS).attempts do specs(gem_names, source) end end # return the specs in the bundler format as an index def specs(gem_names, source) old = Bundler.rubygems.sources index = Bundler::Index.new if Bundler::Fetcher.disable_endpoint @use_api = false specs = fetchers.last.specs(gem_names) else specs = [] fetchers.shift until fetchers.first.available? || fetchers.empty? fetchers.dup.each do |f| break unless f.api_fetcher? && !gem_names || !specs = f.specs(gem_names) fetchers.delete(f) end @use_api = false if fetchers.none?(&:api_fetcher?) end specs.each do |name, version, platform, dependencies, metadata| next if name == "bundler" spec = if dependencies EndpointSpecification.new(name, version, platform, dependencies, metadata) else RemoteSpecification.new(name, version, platform, self) end spec.source = source spec.remote = @remote index << spec end index rescue CertificateFailureError Bundler.ui.info "" if gem_names && use_api # newline after dots raise ensure Bundler.rubygems.sources = old end def use_api return @use_api if defined?(@use_api) fetchers.shift until fetchers.first.available? @use_api = if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint false else fetchers.first.api_fetcher? end end def user_agent @user_agent ||= begin ruby = Bundler::RubyVersion.system agent = String.new("bundler/#{Bundler::VERSION}") agent << " rubygems/#{Gem::VERSION}" agent << " ruby/#{ruby.versions_string(ruby.versions)}" agent << " (#{ruby.host})" agent << " command/#{ARGV.first}" if ruby.engine != "ruby" # engine_version raises on unknown engines engine_version = begin ruby.engine_versions rescue "???" end agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}" end agent << " options/#{Bundler.settings.all.join(",")}" agent << " ci/#{cis.join(",")}" if cis.any? # add a random ID so we can consolidate runs server-side agent << " " << SecureRandom.hex(8) # add any user agent strings set in the config extra_ua = Bundler.settings[:user_agent] agent << " " << extra_ua if extra_ua agent end end def fetchers @fetchers ||= FETCHERS.map {|f| f.new(downloader, @remote, uri) } end def http_proxy return unless uri = connection.proxy_uri uri.to_s end def inspect "#<#{self.class}:0x#{object_id} uri=#{uri}>" end private FETCHERS = [CompactIndex, Dependency, Index].freeze def cis env_cis = { "TRAVIS" => "travis", "CIRCLECI" => "circle", "SEMAPHORE" => "semaphore", "JENKINS_URL" => "jenkins", "BUILDBOX" => "buildbox", "GO_SERVER_URL" => "go", "SNAP_CI" => "snap", "CI_NAME" => ENV["CI_NAME"], "CI" => "ci" } env_cis.find_all {|env, _| ENV[env] }.map {|_, ci| ci } end def connection @connection ||= begin needs_ssl = remote_uri.scheme == "https" || Bundler.settings[:ssl_verify_mode] || Bundler.settings[:ssl_client_cert] raise SSLError if needs_ssl && !defined?(OpenSSL::SSL) con = PersistentHTTP.new "bundler", :ENV if gem_proxy = Bundler.rubygems.configuration[:http_proxy] con.proxy = URI.parse(gem_proxy) if gem_proxy != :no_proxy end if remote_uri.scheme == "https" con.verify_mode = (Bundler.settings[:ssl_verify_mode] || OpenSSL::SSL::VERIFY_PEER) con.cert_store = bundler_cert_store end ssl_client_cert = Bundler.settings[:ssl_client_cert] || (Bundler.rubygems.configuration.ssl_client_cert if Bundler.rubygems.configuration.respond_to?(:ssl_client_cert)) if ssl_client_cert pem = File.read(ssl_client_cert) con.cert = OpenSSL::X509::Certificate.new(pem) con.key = OpenSSL::PKey::RSA.new(pem) end con.read_timeout = Fetcher.api_timeout con.open_timeout = Fetcher.api_timeout con.override_headers["User-Agent"] = user_agent con.override_headers["X-Gemfile-Source"] = @remote.original_uri.to_s if @remote.original_uri con end end # cached gem specification path, if one exists def gemspec_cached_path(spec_file_name) paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) } paths = paths.select {|path| File.file? path } paths.first end HTTP_ERRORS = [ Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH, Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError, PersistentHTTP::Error, Zlib::BufError, Errno::EHOSTUNREACH ].freeze def bundler_cert_store store = OpenSSL::X509::Store.new ssl_ca_cert = Bundler.settings[:ssl_ca_cert] || (Bundler.rubygems.configuration.ssl_ca_cert if Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert)) if ssl_ca_cert if File.directory? ssl_ca_cert store.add_path ssl_ca_cert else store.add_file ssl_ca_cert end else store.set_default_paths certs = File.expand_path("../ssl_certs/*/*.pem", __FILE__) Dir.glob(certs).each {|c| store.add_file c } end store end private def remote_uri @remote.uri end def downloader @downloader ||= Downloader.new(connection, self.class.redirect_limit) end end end bundler-1.16.1/lib/bundler/rubygems_gem_installer.rb0000644000175000017500000000676213217261023023307 0ustar samuelophsamueloph# frozen_string_literal: true require "rubygems/installer" module Bundler class RubyGemsGemInstaller < Gem::Installer unless respond_to?(:at) def self.at(*args) new(*args) end end def check_executable_overwrite(filename) # Bundler needs to install gems regardless of binstub overwriting end def pre_install_checks super && validate_bundler_checksum(options[:bundler_expected_checksum]) end def build_extensions extension_cache_path = options[:bundler_extension_cache_path] return super unless extension_cache_path && extension_dir = Bundler.rubygems.spec_extension_dir(spec) extension_dir = Pathname.new(extension_dir) build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?) if build_complete && !options[:force] SharedHelpers.filesystem_access(extension_dir.parent, &:mkpath) SharedHelpers.filesystem_access(extension_cache_path) do FileUtils.cp_r extension_cache_path, spec.extension_dir end else super if extension_dir.directory? # not made for gems without extensions SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath) SharedHelpers.filesystem_access(extension_cache_path) do FileUtils.cp_r extension_dir, extension_cache_path end end end end private def validate_bundler_checksum(checksum) return true if Bundler.settings[:disable_checksum_validation] return true unless checksum return true unless source = @package.instance_variable_get(:@gem) return true unless source.respond_to?(:with_read_io) digest = source.with_read_io do |io| digest = SharedHelpers.digest(:SHA256).new digest << io.read(16_384) until io.eof? io.rewind send(checksum_type(checksum), digest) end unless digest == checksum raise SecurityError, <<-MESSAGE Bundler cannot continue installing #{spec.name} (#{spec.version}). The checksum for the downloaded `#{spec.full_name}.gem` does not match \ the checksum given by the server. This means the contents of the downloaded \ gem is different from what was uploaded to the server, and could be a potential security issue. To resolve this issue: 1. delete the downloaded gem located at: `#{spec.gem_dir}/#{spec.full_name}.gem` 2. run `bundle install` If you wish to continue installing the downloaded gem, and are certain it does not pose a \ security issue despite the mismatching checksum, do the following: 1. run `bundle config disable_checksum_validation true` to turn off checksum verification 2. run `bundle install` (More info: The expected SHA256 checksum was #{checksum.inspect}, but the \ checksum for the downloaded gem was #{digest.inspect}.) MESSAGE end true end def checksum_type(checksum) case checksum.length when 64 then :hexdigest! when 44 then :base64digest! else raise InstallError, "The given checksum for #{spec.full_name} (#{checksum.inspect}) is not a valid SHA256 hexdigest nor base64digest" end end def hexdigest!(digest) digest.hexdigest! end def base64digest!(digest) if digest.respond_to?(:base64digest!) digest.base64digest! else [digest.digest!].pack("m0") end end end end bundler-1.16.1/lib/bundler/dep_proxy.rb0000644000175000017500000000143013217261023020541 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class DepProxy attr_reader :__platform, :dep def initialize(dep, platform) @dep = dep @__platform = platform end def hash @hash ||= dep.hash end def ==(other) return if other.nil? dep == other.dep && __platform == other.__platform end alias_method :eql?, :== def type @dep.type end def name @dep.name end def requirement @dep.requirement end def to_s s = name.dup s << " (#{requirement})" unless requirement == Gem::Requirement.default s << " #{__platform}" unless __platform == Gem::Platform::RUBY s end private def method_missing(*args, &blk) @dep.send(*args, &blk) end end end bundler-1.16.1/lib/bundler/ruby_dsl.rb0000644000175000017500000000137113217261023020357 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module RubyDsl def ruby(*ruby_version) options = ruby_version.last.is_a?(Hash) ? ruby_version.pop : {} ruby_version.flatten! raise GemfileError, "Please define :engine_version" if options[:engine] && options[:engine_version].nil? raise GemfileError, "Please define :engine" if options[:engine_version] && options[:engine].nil? if options[:engine] == "ruby" && options[:engine_version] && ruby_version != Array(options[:engine_version]) raise GemfileEvalError, "ruby_version must match the :engine_version for MRI" end @ruby_version = RubyVersion.new(ruby_version, options[:patchlevel], options[:engine], options[:engine_version]) end end end bundler-1.16.1/lib/bundler/mirror.rb0000644000175000017500000001341613217261023020051 0ustar samuelophsamueloph# frozen_string_literal: true require "socket" module Bundler class Settings # Class used to build the mirror set and then find a mirror for a given URI # # @param prober [Prober object, nil] by default a TCPSocketProbe, this object # will be used to probe the mirror address to validate that the mirror replies. class Mirrors def initialize(prober = nil) @all = Mirror.new @prober = prober || TCPSocketProbe.new @mirrors = {} end # Returns a mirror for the given uri. # # Depending on the uri having a valid mirror or not, it may be a # mirror that points to the provided uri def for(uri) if @all.validate!(@prober).valid? @all else fetch_valid_mirror_for(Settings.normalize_uri(uri)) end end def each @mirrors.each do |k, v| yield k, v.uri.to_s end end def parse(key, value) config = MirrorConfig.new(key, value) mirror = if config.all? @all else @mirrors[config.uri] ||= Mirror.new end config.update_mirror(mirror) end private def fetch_valid_mirror_for(uri) downcased = uri.to_s.downcase mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri) mirror.validate!(@prober) mirror = Mirror.new(uri) unless mirror.valid? mirror end end # A mirror # # Contains both the uri that should be used as a mirror and the # fallback timeout which will be used for probing if the mirror # replies on time or not. class Mirror DEFAULT_FALLBACK_TIMEOUT = 0.1 attr_reader :uri, :fallback_timeout def initialize(uri = nil, fallback_timeout = 0) self.uri = uri self.fallback_timeout = fallback_timeout @valid = nil end def uri=(uri) @uri = if uri.nil? nil else URI(uri.to_s) end @valid = nil end def fallback_timeout=(timeout) case timeout when true, "true" @fallback_timeout = DEFAULT_FALLBACK_TIMEOUT when false, "false" @fallback_timeout = 0 else @fallback_timeout = timeout.to_i end @valid = nil end def ==(other) !other.nil? && uri == other.uri && fallback_timeout == other.fallback_timeout end def valid? return false if @uri.nil? return @valid unless @valid.nil? false end def validate!(probe = nil) @valid = false if uri.nil? if @valid.nil? @valid = fallback_timeout == 0 || (probe || TCPSocketProbe.new).replies?(self) end self end end # Class used to parse one configuration line # # Gets the configuration line and the value. # This object provides a `update_mirror` method # used to setup the given mirror value. class MirrorConfig attr_accessor :uri, :value def initialize(config_line, value) uri, fallback = config_line.match(%r{\Amirror\.(all|.+?)(\.fallback_timeout)?\/?\z}).captures @fallback = !fallback.nil? @all = false if uri == "all" @all = true else @uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri end @value = value end def all? @all end def update_mirror(mirror) if @fallback mirror.fallback_timeout = @value else mirror.uri = Settings.normalize_uri(@value) end end end # Class used for probing TCP availability for a given mirror. class TCPSocketProbe def replies?(mirror) MirrorSockets.new(mirror).any? do |socket, address, timeout| begin socket.connect_nonblock(address) rescue Errno::EINPROGRESS wait_for_writtable_socket(socket, address, timeout) rescue # Connection failed somehow, again false end end end private def wait_for_writtable_socket(socket, address, timeout) if IO.select(nil, [socket], nil, timeout) probe_writtable_socket(socket, address) else # TCP Handshake timed out, or there is something dropping packets false end end def probe_writtable_socket(socket, address) socket.connect_nonblock(address) rescue Errno::EISCONN true rescue # Connection failed false end end end # Class used to build the list of sockets that correspond to # a given mirror. # # One mirror may correspond to many different addresses, both # because of it having many dns entries or because # the network interface is both ipv4 and ipv5 class MirrorSockets def initialize(mirror) @timeout = mirror.fallback_timeout @addresses = Socket.getaddrinfo(mirror.uri.host, mirror.uri.port).map do |address| SocketAddress.new(address[0], address[3], address[1]) end end def any? @addresses.any? do |address| socket = Socket.new(Socket.const_get(address.type), Socket::SOCK_STREAM, 0) socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) value = yield socket, address.to_socket_address, @timeout socket.close unless socket.closed? value end end end # Socket address builder. # # Given a socket type, a host and a port, # provides a method to build sockaddr string class SocketAddress attr_reader :type, :host, :port def initialize(type, host, port) @type = type @host = host @port = port end def to_socket_address Socket.pack_sockaddr_in(@port, @host) end end end bundler-1.16.1/lib/bundler/gem_tasks.rb0000644000175000017500000000021113217261023020501 0ustar samuelophsamueloph# frozen_string_literal: true require "rake/clean" CLOBBER.include "pkg" require "bundler/gem_helper" Bundler::GemHelper.install_tasks bundler-1.16.1/lib/bundler/endpoint_specification.rb0000644000175000017500000000762413217261023023263 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler # used for Creating Specifications from the Gemcutter Endpoint class EndpointSpecification < Gem::Specification ILLFORMED_MESSAGE = 'Ill-formed requirement ["# e raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}" end def build_dependency(name, requirements) Gem::Dependency.new(name, requirements) rescue ArgumentError => e raise unless e.message.include?(ILLFORMED_MESSAGE) puts # we shouldn't print the error message on the "fetching info" status line raise GemspecError, "Unfortunately, the gem #{name} (#{version}) has an invalid " \ "gemspec.\nPlease ask the gem author to yank the bad version to fix " \ "this issue. For more information, see http://bit.ly/syck-defaultkey." end end end bundler-1.16.1/lib/bundler/errors.rb0000644000175000017500000001113413217261023020046 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class BundlerError < StandardError def self.status_code(code) define_method(:status_code) { code } if match = BundlerError.all_errors.find {|_k, v| v == code } error, _ = match raise ArgumentError, "Trying to register #{self} for status code #{code} but #{error} is already registered" end BundlerError.all_errors[self] = code end def self.all_errors @all_errors ||= {} end end class GemfileError < BundlerError; status_code(4); end class InstallError < BundlerError; status_code(5); end # Internal error, should be rescued class VersionConflict < BundlerError attr_reader :conflicts def initialize(conflicts, msg = nil) super(msg) @conflicts = conflicts end status_code(6) end class GemNotFound < BundlerError; status_code(7); end class InstallHookError < BundlerError; status_code(8); end class GemfileNotFound < BundlerError; status_code(10); end class GitError < BundlerError; status_code(11); end class DeprecatedError < BundlerError; status_code(12); end class PathError < BundlerError; status_code(13); end class GemspecError < BundlerError; status_code(14); end class InvalidOption < BundlerError; status_code(15); end class ProductionError < BundlerError; status_code(16); end class HTTPError < BundlerError status_code(17) def filter_uri(uri) URICredentialsFilter.credential_filtered_uri(uri) end end class RubyVersionMismatch < BundlerError; status_code(18); end class SecurityError < BundlerError; status_code(19); end class LockfileError < BundlerError; status_code(20); end class CyclicDependencyError < BundlerError; status_code(21); end class GemfileLockNotFound < BundlerError; status_code(22); end class PluginError < BundlerError; status_code(29); end class SudoNotPermittedError < BundlerError; status_code(30); end class ThreadCreationError < BundlerError; status_code(33); end class APIResponseMismatchError < BundlerError; status_code(34); end class GemfileEvalError < GemfileError; end class MarshalError < StandardError; end class PermissionError < BundlerError def initialize(path, permission_type = :write) @path = path @permission_type = permission_type end def action case @permission_type when :read then "read from" when :write then "write to" when :executable, :exec then "execute" else @permission_type.to_s end end def message "There was an error while trying to #{action} `#{@path}`. " \ "It is likely that you need to grant #{@permission_type} permissions " \ "for that path." end status_code(23) end class GemRequireError < BundlerError attr_reader :orig_exception def initialize(orig_exception, msg) full_message = msg + "\nGem Load Error is: #{orig_exception.message}\n"\ "Backtrace for gem load error is:\n"\ "#{orig_exception.backtrace.join("\n")}\n"\ "Bundler Error Backtrace:\n" super(full_message) @orig_exception = orig_exception end status_code(24) end class YamlSyntaxError < BundlerError attr_reader :orig_exception def initialize(orig_exception, msg) super(msg) @orig_exception = orig_exception end status_code(25) end class TemporaryResourceError < PermissionError def message "There was an error while trying to #{action} `#{@path}`. " \ "Some resource was temporarily unavailable. It's suggested that you try" \ "the operation again." end status_code(26) end class VirtualProtocolError < BundlerError def message "There was an error relating to virtualization and file access." \ "It is likely that you need to grant access to or mount some file system correctly." end status_code(27) end class OperationNotSupportedError < PermissionError def message "Attempting to #{action} `#{@path}` is unsupported by your OS." end status_code(28) end class NoSpaceOnDeviceError < PermissionError def message "There was an error while trying to #{action} `#{@path}`. " \ "There was insufficient space remaining on the device." end status_code(31) end class GenericSystemCallError < BundlerError attr_reader :underlying_error def initialize(underlying_error, message) @underlying_error = underlying_error super("#{message}\nThe underlying system error is #{@underlying_error.class}: #{@underlying_error}") end status_code(32) end end bundler-1.16.1/lib/bundler/gem_helpers.rb0000644000175000017500000000627613217261023021037 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler module GemHelpers GENERIC_CACHE = {} # rubocop:disable MutableConstant GENERICS = [ [Gem::Platform.new("java"), Gem::Platform.new("java")], [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")], [Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")], [Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")], [Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")], [Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")], [Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")] ].freeze def generic(p) return p if p == Gem::Platform::RUBY GENERIC_CACHE[p] ||= begin _, found = GENERICS.find do |match, _generic| p.os == match.os && (!match.cpu || p.cpu == match.cpu) end found || Gem::Platform::RUBY end end module_function :generic def generic_local_platform generic(Bundler.local_platform) end module_function :generic_local_platform def platform_specificity_match(spec_platform, user_platform) spec_platform = Gem::Platform.new(spec_platform) return PlatformMatch::EXACT_MATCH if spec_platform == user_platform return PlatformMatch::WORST_MATCH if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY PlatformMatch.new( PlatformMatch.os_match(spec_platform, user_platform), PlatformMatch.cpu_match(spec_platform, user_platform), PlatformMatch.platform_version_match(spec_platform, user_platform) ) end module_function :platform_specificity_match def select_best_platform_match(specs, platform) specs.select {|spec| spec.match_platform(platform) }. min_by {|spec| platform_specificity_match(spec.platform, platform) } end module_function :select_best_platform_match PlatformMatch = Struct.new(:os_match, :cpu_match, :platform_version_match) class PlatformMatch def <=>(other) return nil unless other.is_a?(PlatformMatch) m = os_match <=> other.os_match return m unless m.zero? m = cpu_match <=> other.cpu_match return m unless m.zero? m = platform_version_match <=> other.platform_version_match m end EXACT_MATCH = new(-1, -1, -1).freeze WORST_MATCH = new(1_000_000, 1_000_000, 1_000_000).freeze def self.os_match(spec_platform, user_platform) if spec_platform.os == user_platform.os 0 else 1 end end def self.cpu_match(spec_platform, user_platform) if spec_platform.cpu == user_platform.cpu 0 elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm") 0 elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal" 1 else 2 end end def self.platform_version_match(spec_platform, user_platform) if spec_platform.version == user_platform.version 0 elsif spec_platform.version.nil? 1 else 2 end end end end end bundler-1.16.1/lib/bundler/source_list.rb0000644000175000017500000001357113217261023021074 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler class SourceList attr_reader :path_sources, :git_sources, :plugin_sources, :global_rubygems_source, :metadata_source def initialize @path_sources = [] @git_sources = [] @plugin_sources = [] @global_rubygems_source = nil @rubygems_aggregate = rubygems_aggregate_class.new @rubygems_sources = [] @metadata_source = Source::Metadata.new end def add_path_source(options = {}) if options["gemspec"] add_source_to_list Source::Gemspec.new(options), path_sources else add_source_to_list Source::Path.new(options), path_sources end end def add_git_source(options = {}) add_source_to_list(Source::Git.new(options), git_sources).tap do |source| warn_on_git_protocol(source) end end def add_rubygems_source(options = {}) add_source_to_list Source::Rubygems.new(options), @rubygems_sources end def add_plugin_source(source, options = {}) add_source_to_list Plugin.source(source).new(options), @plugin_sources end def global_rubygems_source=(uri) if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? @global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri) end add_rubygems_remote(uri) end def add_rubygems_remote(uri) if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? return if Bundler.feature_flag.disable_multisource? raise InvalidOption, "`lockfile_uses_separate_rubygems_sources` cannot be set without `disable_multisource` being set" end @rubygems_aggregate.add_remote(uri) @rubygems_aggregate end def default_source global_rubygems_source || @rubygems_aggregate end def rubygems_sources @rubygems_sources + [default_source] end def rubygems_remotes rubygems_sources.map(&:remotes).flatten.uniq end def all_sources path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source] end def get(source) source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) } end def lock_sources if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? [[default_source], @rubygems_sources, git_sources, path_sources, plugin_sources].map do |sources| sources.sort_by(&:to_s) end.flatten(1) else lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s) lock_sources << combine_rubygems_sources end end # Returns true if there are changes def replace_sources!(replacement_sources) return true if replacement_sources.empty? [path_sources, git_sources, plugin_sources].each do |source_list| source_list.map! do |source| replacement_sources.find {|s| s == source } || source end end replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? && replacement_sources.detect {|s| s.is_a?(Source::Rubygems) } @rubygems_aggregate = replacement_rubygems if replacement_rubygems return true if !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources) return true if replacement_rubygems && rubygems_remotes.to_set != replacement_rubygems.remotes.to_set false end def cached! all_sources.each(&:cached!) end def remote! all_sources.each(&:remote!) end def rubygems_primary_remotes @rubygems_aggregate.remotes end private def rubygems_aggregate_class Source::Rubygems end def add_source_to_list(source, list) list.unshift(source).uniq! source end def source_list_for(source) case source when Source::Git then git_sources when Source::Path then path_sources when Source::Rubygems then rubygems_sources when Plugin::API::Source then plugin_sources else raise ArgumentError, "Invalid source: #{source.inspect}" end end def combine_rubygems_sources Source::Rubygems.new("remotes" => rubygems_remotes) end def warn_on_git_protocol(source) return if Bundler.settings["git.allow_insecure"] if source.uri =~ /^git\:/ Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \ "which transmits data without encryption. Disable this warning with " \ "`bundle config git.allow_insecure true`, or switch to the `https` " \ "protocol to keep your data secure." end end def equal_sources?(lock_sources, replacement_sources) lock_sources.to_set == replacement_sources.to_set end def equal_source?(source, other_source) source == other_source end def equivalent_source?(source, other_source) return false unless Bundler.settings[:allow_deployment_source_credential_changes] && source.is_a?(Source::Rubygems) equivalent_rubygems_sources?([source], [other_source]) end def equivalent_sources?(lock_sources, replacement_sources) return false unless Bundler.settings[:allow_deployment_source_credential_changes] lock_rubygems_sources, lock_other_sources = lock_sources.partition {|s| s.is_a?(Source::Rubygems) } replacement_rubygems_sources, replacement_other_sources = replacement_sources.partition {|s| s.is_a?(Source::Rubygems) } equivalent_rubygems_sources?(lock_rubygems_sources, replacement_rubygems_sources) && equal_sources?(lock_other_sources, replacement_other_sources) end def equivalent_rubygems_sources?(lock_sources, replacement_sources) actual_remotes = replacement_sources.map(&:remotes).flatten.uniq lock_sources.all? {|s| s.equivalent_remotes?(actual_remotes) } end end end bundler-1.16.1/lib/bundler/vendored_persistent.rb0000644000175000017500000000316113217261023022621 0ustar samuelophsamueloph# frozen_string_literal: true # We forcibly require OpenSSL, because net/http/persistent will only autoload # it. On some Rubies, autoload fails but explicit require succeeds. begin require "openssl" rescue LoadError # some Ruby builds don't have OpenSSL end module Bundler module Persistent module Net module HTTP end end end end require "bundler/vendor/net-http-persistent/lib/net/http/persistent" module Bundler class PersistentHTTP < Persistent::Net::HTTP::Persistent def connection_for(uri) connection = super warn_old_tls_version_rubygems_connection(uri, connection) connection end def warn_old_tls_version_rubygems_connection(uri, connection) return unless connection.use_ssl? return unless (uri.host || "").end_with?("rubygems.org") socket = connection.instance_variable_get(:@socket) return unless socket socket_io = socket.io return unless socket_io.respond_to?(:ssl_version) ssl_version = socket_io.ssl_version case ssl_version when /TLSv([\d\.]+)/ version = Gem::Version.new($1) if version < Gem::Version.new("1.2") Bundler.ui.warn \ "Warning: Your Ruby version is compiled against a copy of OpenSSL that is very old. " \ "Starting in January 2018, RubyGems.org will refuse connection requests from these " \ "very old versions of OpenSSL. If you will need to continue installing gems after " \ "January 2018, please follow this guide to upgrade: http://ruby.to/tls-outdated.", :wrap => true end end end end end bundler-1.16.1/lib/bundler/constants.rb0000644000175000017500000000032413217261023020545 0ustar samuelophsamueloph# frozen_string_literal: true module Bundler WINDOWS = RbConfig::CONFIG["host_os"] =~ /(msdos|mswin|djgpp|mingw)/ FREEBSD = RbConfig::CONFIG["host_os"] =~ /bsd/ NULL = WINDOWS ? "NUL" : "/dev/null" end bundler-1.16.1/lib/bundler/inline.rb0000644000175000017500000000452213217261023020013 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/compatibility_guard" # Allows for declaring a Gemfile inline in a ruby script, optionally installing # any gems that aren't already installed on the user's system. # # @note Every gem that is specified in this 'Gemfile' will be `require`d, as if # the user had manually called `Bundler.require`. To avoid a requested gem # being automatically required, add the `:require => false` option to the # `gem` dependency declaration. # # @param install [Boolean] whether gems that aren't already installed on the # user's system should be installed. # Defaults to `false`. # # @param gemfile [Proc] a block that is evaluated as a `Gemfile`. # # @example Using an inline Gemfile # # #!/usr/bin/env ruby # # require 'bundler/inline' # # gemfile do # source 'https://rubygems.org' # gem 'json', require: false # gem 'nap', require: 'rest' # gem 'cocoapods', '~> 0.34.1' # end # # puts Pod::VERSION # => "0.34.4" # def gemfile(install = false, options = {}, &gemfile) require "bundler" opts = options.dup ui = opts.delete(:ui) { Bundler::UI::Shell.new } raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty? old_root = Bundler.method(:root) def Bundler.root Bundler::SharedHelpers.pwd.expand_path end Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile" Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins? builder = Bundler::Dsl.new builder.instance_eval(&gemfile) definition = builder.to_definition(nil, true) def definition.lock(*); end definition.validate_runtime! missing_specs = proc do definition.missing_specs? end Bundler.ui = ui if install if install || missing_specs.call Bundler.settings.temporary(:inline => true) do installer = Bundler::Installer.install(Bundler.root, definition, :system => true) installer.post_install_messages.each do |name, message| Bundler.ui.info "Post-install message from #{name}:\n#{message}" end end end runtime = Bundler::Runtime.new(nil, definition) runtime.setup.require ensure bundler_module = class << Bundler; self; end bundler_module.send(:define_method, :root, old_root) if old_root end bundler-1.16.1/lib/bundler.rb0000644000175000017500000004103413217261023016534 0ustar samuelophsamueloph# frozen_string_literal: true require "bundler/compatibility_guard" require "bundler/vendored_fileutils" require "pathname" require "rbconfig" require "thread" require "bundler/errors" require "bundler/environment_preserver" require "bundler/plugin" require "bundler/rubygems_ext" require "bundler/rubygems_integration" require "bundler/version" require "bundler/constants" require "bundler/current_ruby" require "bundler/build_metadata" module Bundler environment_preserver = EnvironmentPreserver.new(ENV, EnvironmentPreserver::BUNDLER_KEYS) ORIGINAL_ENV = environment_preserver.restore ENV.replace(environment_preserver.backup) SUDO_MUTEX = Mutex.new autoload :Definition, "bundler/definition" autoload :Dependency, "bundler/dependency" autoload :DepProxy, "bundler/dep_proxy" autoload :Deprecate, "bundler/deprecate" autoload :Dsl, "bundler/dsl" autoload :EndpointSpecification, "bundler/endpoint_specification" autoload :Env, "bundler/env" autoload :Fetcher, "bundler/fetcher" autoload :FeatureFlag, "bundler/feature_flag" autoload :GemHelper, "bundler/gem_helper" autoload :GemHelpers, "bundler/gem_helpers" autoload :GemRemoteFetcher, "bundler/gem_remote_fetcher" autoload :GemVersionPromoter, "bundler/gem_version_promoter" autoload :Graph, "bundler/graph" autoload :Index, "bundler/index" autoload :Injector, "bundler/injector" autoload :Installer, "bundler/installer" autoload :LazySpecification, "bundler/lazy_specification" autoload :LockfileParser, "bundler/lockfile_parser" autoload :MatchPlatform, "bundler/match_platform" autoload :ProcessLock, "bundler/process_lock" autoload :RemoteSpecification, "bundler/remote_specification" autoload :Resolver, "bundler/resolver" autoload :Retry, "bundler/retry" autoload :RubyDsl, "bundler/ruby_dsl" autoload :RubyGemsGemInstaller, "bundler/rubygems_gem_installer" autoload :RubyVersion, "bundler/ruby_version" autoload :Runtime, "bundler/runtime" autoload :Settings, "bundler/settings" autoload :SharedHelpers, "bundler/shared_helpers" autoload :Source, "bundler/source" autoload :SourceList, "bundler/source_list" autoload :SpecSet, "bundler/spec_set" autoload :StubSpecification, "bundler/stub_specification" autoload :UI, "bundler/ui" autoload :URICredentialsFilter, "bundler/uri_credentials_filter" autoload :VersionRanges, "bundler/version_ranges" class << self def configure @configured ||= configure_gem_home_and_path end def ui (defined?(@ui) && @ui) || (self.ui = UI::Silent.new) end def ui=(ui) Bundler.rubygems.ui = ui ? UI::RGProxy.new(ui) : nil @ui = ui end # Returns absolute path of where gems are installed on the filesystem. def bundle_path @bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root) end def configured_bundle_path @configured_bundle_path ||= settings.path.tap(&:validate!) end # Returns absolute location of where binstubs are installed to. def bin_path @bin_path ||= begin path = settings[:bin] || "bin" path = Pathname.new(path).expand_path(root).expand_path SharedHelpers.filesystem_access(path) {|p| FileUtils.mkdir_p(p) } path end end def setup(*groups) # Return if all groups are already loaded return @setup if defined?(@setup) && @setup definition.validate_runtime! SharedHelpers.print_major_deprecations! if groups.empty? # Load all groups, but only once @setup = load.setup else load.setup(*groups) end end def require(*groups) setup(*groups).require(*groups) end def load @load ||= Runtime.new(root, definition) end def environment SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load" load end # Returns an instance of Bundler::Definition for given Gemfile and lockfile # # @param unlock [Hash, Boolean, nil] Gems that have been requested # to be updated or true if all gems should be updated # @return [Bundler::Definition] def definition(unlock = nil) @definition = nil if unlock @definition ||= begin configure Definition.build(default_gemfile, default_lockfile, unlock) end end def frozen? frozen = settings[:deployment] frozen ||= settings[:frozen] unless feature_flag.deployment_means_frozen? frozen end def locked_gems @locked_gems ||= if defined?(@definition) && @definition definition.locked_gems elsif Bundler.default_lockfile.file? lock = Bundler.read_file(Bundler.default_lockfile) LockfileParser.new(lock) end end def ruby_scope "#{Bundler.rubygems.ruby_engine}/#{Bundler.rubygems.config_map[:ruby_version]}" end def user_home @user_home ||= begin home = Bundler.rubygems.user_home warning = if home.nil? "Your home directory is not set." elsif !File.directory?(home) "`#{home}` is not a directory." elsif !File.writable?(home) "`#{home}` is not writable." end if warning user_home = tmp_home_path(Etc.getlogin, warning) Bundler.ui.warn "#{warning}\nBundler will use `#{user_home}' as your home directory temporarily.\n" user_home else Pathname.new(home) end end end def tmp_home_path(login, warning) login ||= "unknown" Kernel.send(:require, "tmpdir") path = Pathname.new(Dir.tmpdir).join("bundler", "home") SharedHelpers.filesystem_access(path) do |tmp_home_path| unless tmp_home_path.exist? tmp_home_path.mkpath tmp_home_path.chmod(0o777) end tmp_home_path.join(login).tap(&:mkpath) end rescue => e raise e.exception("#{warning}\nBundler also failed to create a temporary home directory at `#{path}':\n#{e}") end def user_bundle_path Pathname.new(user_home).join(".bundle") end def home bundle_path.join("bundler") end def install_path home.join("gems") end def specs_path bundle_path.join("specifications") end def user_cache user_bundle_path.join("cache") end def root @root ||= begin SharedHelpers.root rescue GemfileNotFound bundle_dir = default_bundle_dir raise GemfileNotFound, "Could not locate Gemfile or .bundle/ directory" unless bundle_dir Pathname.new(File.expand_path("..", bundle_dir)) end end def app_config_path if app_config = ENV["BUNDLE_APP_CONFIG"] Pathname.new(app_config).expand_path(root) else root.join(".bundle") end end def app_cache(custom_path = nil) path = custom_path || root Pathname.new(path).join(settings.app_cache_path) end def tmp(name = Process.pid.to_s) Kernel.send(:require, "tmpdir") Pathname.new(Dir.mktmpdir(["bundler", name])) end def rm_rf(path) FileUtils.remove_entry_secure(path) if path && File.exist?(path) rescue ArgumentError message = < e raise MarshalError, "#{e.class}: #{e.message}" end def load_gemspec(file, validate = false) @gemspec_cache ||= {} key = File.expand_path(file) @gemspec_cache[key] ||= load_gemspec_uncached(file, validate) # Protect against caching side-effected gemspecs by returning a # new instance each time. @gemspec_cache[key].dup if @gemspec_cache[key] end def load_gemspec_uncached(file, validate = false) path = Pathname.new(file) contents = path.read spec = if contents.start_with?("---") # YAML header eval_yaml_gemspec(path, contents) else # Eval the gemspec from its parent directory, because some gemspecs # depend on "./" relative paths. SharedHelpers.chdir(path.dirname.to_s) do eval_gemspec(path, contents) end end return unless spec spec.loaded_from = path.expand_path.to_s Bundler.rubygems.validate(spec) if validate spec end def clear_gemspec_cache @gemspec_cache = {} end def git_present? return @git_present if defined?(@git_present) @git_present = Bundler.which("git") || Bundler.which("git.exe") end def feature_flag @feature_flag ||= FeatureFlag.new(VERSION) end def reset! reset_paths! Plugin.reset! reset_rubygems! end def reset_paths! @bin_path = nil @bundler_major_version = nil @bundle_path = nil @configured = nil @configured_bundle_path = nil @definition = nil @load = nil @locked_gems = nil @root = nil @settings = nil @setup = nil @user_home = nil end def reset_rubygems! return unless defined?(@rubygems) && @rubygems rubygems.undo_replacements rubygems.reset @rubygems = nil end private def eval_yaml_gemspec(path, contents) Kernel.send(:require, "bundler/psyched_yaml") # If the YAML is invalid, Syck raises an ArgumentError, and Psych # raises a Psych::SyntaxError. See psyched_yaml.rb for more info. Gem::Specification.from_yaml(contents) rescue YamlLibrarySyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception eval_gemspec(path, contents) end def eval_gemspec(path, contents) eval(contents, TOPLEVEL_BINDING.dup, path.expand_path.to_s) rescue ScriptError, StandardError => e msg = "There was an error while loading `#{path.basename}`: #{e.message}" if e.is_a?(LoadError) && RUBY_VERSION >= "1.9" msg += "\nDoes it try to require a relative path? That's been removed in Ruby 1.9" end raise GemspecError, Dsl::DSLError.new(msg, path, e.backtrace, contents) end def configure_gem_home_and_path configure_gem_path configure_gem_home bundle_path end def configure_gem_path(env = ENV) blank_home = env["GEM_HOME"].nil? || env["GEM_HOME"].empty? if !use_system_gems? # this needs to be empty string to cause # PathSupport.split_gem_path to only load up the # Bundler --path setting as the GEM_PATH. env["GEM_PATH"] = "" elsif blank_home possibles = [Bundler.rubygems.gem_dir, Bundler.rubygems.gem_path] paths = possibles.flatten.compact.uniq.reject(&:empty?) env["GEM_PATH"] = paths.join(File::PATH_SEPARATOR) end end def configure_gem_home Bundler::SharedHelpers.set_env "GEM_HOME", File.expand_path(bundle_path, root) Bundler.rubygems.clear_paths end # @param env [Hash] def with_env(env) backup = ENV.to_hash ENV.replace(env) yield ensure ENV.replace(backup) end end end