From 7f0607d97cf5905f7cfb6e41e7deb6b429b51227 Mon Sep 17 00:00:00 2001 From: Eric Hodel Date: Thu, 2 Jun 2011 22:05:07 -0700 Subject: [PATCH] - Add post-installs hooks that runs after Gem::DependencyInstaller finishes installing a set of gems - Fix documentation for the various hooks collections --- lib/rubygems.rb | 30 ++++++++++++++----- lib/rubygems/defaults.rb | 1 + lib/rubygems/dependency_installer.rb | 4 +++ lib/rubygems/test_case.rb | 1 + test/rubygems/test_gem.rb | 8 +++++ .../rubygems/test_gem_dependency_installer.rb | 8 +++++ 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 38bd8f65827f..99b8618067ac 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -736,6 +736,14 @@ def self.post_install(&hook) @post_install_hooks << hook end + ## + # Adds a post-installs hook that will be passed a list of installed gem + # specifications when Gem::DependencyInstaller#install is complete + + def self.post_installs(&hook) + @post_installs_hooks << hook + end + ## # Adds a hook that will get run after Gem::Specification.reset is # run. @@ -1101,29 +1109,36 @@ class << self attr_reader :loaded_specs ## - # The list of hooks to be run before Gem::Install#install finishes - # installation + # The list of hooks to be run after Gem::Installer#install extracts files + # and builds extensions attr_reader :post_build_hooks ## - # The list of hooks to be run before Gem::Install#install does any work + # The list of hooks to be run after Gem::Installer#install completes + # installation attr_reader :post_install_hooks + ## + # The list of hooks to be run after Gem::DependencyInstaller installs a + # set of gems + + attr_reader :post_installs_hooks + ## # The list of hooks to be run after Gem::Specification.reset is run. attr_reader :post_reset_hooks ## - # The list of hooks to be run before Gem::Uninstall#uninstall does any - # work + # The list of hooks to be run after Gem::Uninstaller#uninstall completes + # installation attr_reader :post_uninstall_hooks ## - # The list of hooks to be run after Gem::Install#install is finished + # The list of hooks to be run before Gem::Installer#install does any work attr_reader :pre_install_hooks @@ -1133,7 +1148,8 @@ class << self attr_reader :pre_reset_hooks ## - # The list of hooks to be run after Gem::Uninstall#uninstall is finished + # The list of hooks to be run before Gem::Uninstaller#uninstall does any + # work attr_reader :pre_uninstall_hooks end diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb index 20b4198bfa21..46e8da969ed5 100644 --- a/lib/rubygems/defaults.rb +++ b/lib/rubygems/defaults.rb @@ -3,6 +3,7 @@ module Gem # TODO: move this whole file back into rubygems.rb @post_install_hooks ||= [] + @post_installs_hooks ||= [] @post_uninstall_hooks ||= [] @pre_uninstall_hooks ||= [] @pre_install_hooks ||= [] diff --git a/lib/rubygems/dependency_installer.rb b/lib/rubygems/dependency_installer.rb index 5733953f4138..6cf1f1570722 100644 --- a/lib/rubygems/dependency_installer.rb +++ b/lib/rubygems/dependency_installer.rb @@ -336,6 +336,10 @@ def install dep_or_name, version = Gem::Requirement.default @installed_gems << spec end + Gem.post_installs_hooks.each do |hook| + hook.call @installed_gems + end + @installed_gems end end diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index c87135227063..5f810862b75c 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -180,6 +180,7 @@ def setup # TODO: move to installer test cases Gem.post_build_hooks.clear Gem.post_install_hooks.clear + Gem.post_installs_hooks.clear Gem.post_reset_hooks.clear Gem.post_uninstall_hooks.clear Gem.pre_install_hooks.clear diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index 859715bbb45b..6342172aa397 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -944,6 +944,14 @@ def test_self_post_install assert_equal 2, Gem.post_install_hooks.length end + def test_self_post_installs + assert_empty Gem.post_installs_hooks + + Gem.post_installs do |gems| end + + assert_equal 1, Gem.post_installs_hooks.length + end + def test_self_post_reset assert_empty Gem.post_reset_hooks diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb index f68cecfa2550..8353028e3a9d 100644 --- a/test/rubygems/test_gem_dependency_installer.rb +++ b/test/rubygems/test_gem_dependency_installer.rb @@ -155,6 +155,12 @@ def test_install_dependencies_satisfied def test_install_dependency util_setup_gems + post_installs_ran = false + + Gem.post_installs do |gems| + post_installs_ran = true + assert_equal [@a1, @b1], gems + end FileUtils.mv @a1_gem, @tempdir FileUtils.mv @b1_gem, @tempdir @@ -166,6 +172,8 @@ def test_install_dependency end assert_equal %w[a-1 b-1], inst.installed_gems.map { |s| s.full_name } + + assert post_installs_ran, 'post installs hook was not run' end def test_install_dependency_development