You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by vb...@apache.org on 2008/09/24 21:17:47 UTC
svn commit: r698695 - in /incubator/buildr/trunk/lib/buildr:
core/application.rb core/util.rb packaging/gems.rb
Author: vborja
Date: Wed Sep 24 12:17:46 2008
New Revision: 698695
URL: http://svn.apache.org/viewvc?rev=698695&view=rev
Log:
Made Buildr::Application#load_* methods private, they should not be invoked by the user.
Moven gem runner logic into Util::Gem so that it can be reused by packaging/gems.rb
Modified:
incubator/buildr/trunk/lib/buildr/core/application.rb
incubator/buildr/trunk/lib/buildr/core/util.rb
incubator/buildr/trunk/lib/buildr/packaging/gems.rb
Modified: incubator/buildr/trunk/lib/buildr/core/application.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/buildr/core/application.rb?rev=698695&r1=698694&r2=698695&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/buildr/core/application.rb (original)
+++ incubator/buildr/trunk/lib/buildr/core/application.rb Wed Sep 24 12:17:46 2008
@@ -157,26 +157,15 @@
buildfile.prerequisites
end
- # Returns Gem::Specification for every listed and installed Gem, Gem::Dependency
- # for listed and uninstalled Gem, which is the installed before loading the buildfile.
- def listed_gems #:nodoc:
- Array(settings.build['gems']).map do |dep|
- name, trail = dep.scan(/^\s*(\S*)\s*(.*)\s*$/).first
- versions = trail.scan(/[=><~!]{0,2}\s*[\d\.]+/)
- versions = ['>= 0'] if versions.empty?
- dep = Gem::Dependency.new(name, versions)
- Gem::SourceIndex.from_installed_gems.search(dep).last || dep
- end
- end
- private :listed_gems
-
def run
standard_exception_handling do
+ load_requires
find_buildfile
load_gems
load_artifacts
load_tasks
load_buildfile
+ load_imports
task('buildr:initialize').invoke
top_level
end
@@ -184,6 +173,60 @@
@on_completion.each { |block| block.call(title, message) rescue nil }
end
+ # Yields to block on successful completion. Primarily used for notifications.
+ def on_completion(&block)
+ @on_completion << block
+ end
+
+ # Yields to block on failure with exception. Primarily used for notifications.
+ def on_failure(&block)
+ @on_failure << block
+ end
+
+ # Not for external consumption.
+ def switch_to_namespace(names) #:nodoc:
+ current, @scope = @scope, names
+ begin
+ yield
+ ensure
+ @scope = current
+ end
+ end
+
+ # :call-seq:
+ # deprecated(message)
+ #
+ # Use with deprecated methods and classes. This method automatically adds the file name and line number,
+ # and the text 'Deprecated' before the message, and eliminated duplicate warnings. It only warns when
+ # running in verbose mode.
+ #
+ # For example:
+ # deprecated 'Please use new_foo instead of foo.'
+ def deprecated(message) #:nodoc:
+ return unless verbose
+ "#{caller[1]}: Deprecated: #{message}".tap do |message|
+ @deprecated ||= {}
+ unless @deprecated[message]
+ @deprecated[message] = true
+ warn message
+ end
+ end
+ end
+
+ private
+
+ # Returns Gem::Specification for every listed and installed Gem, Gem::Dependency
+ # for listed and uninstalled Gem, which is the installed before loading the buildfile.
+ def listed_gems #:nodoc:
+ Array(settings.build['gems']).map do |dep|
+ name, trail = dep.scan(/^\s*(\S*)\s*(.*)\s*$/).first
+ versions = trail.scan(/[=><~!]{0,2}\s*[\d\.]+/)
+ versions = ['>= 0'] if versions.empty?
+ dep = Gem::Dependency.new(name, versions)
+ Gem::SourceIndex.from_installed_gems.search(dep).last || dep
+ end
+ end
+
# Load artifact specs from the build.yaml file, making them available
# by name ( ruby symbols ).
def load_artifacts #:nodoc:
@@ -198,35 +241,25 @@
def load_gems #:nodoc:
missing_deps, installed = listed_gems.partition { |gem| gem.is_a?(Gem::Dependency) }
unless missing_deps.empty?
- remote = missing_deps.map { |dep| Gem::SourceInfoCache.search(dep).last || dep }
- not_found_deps, install = remote.partition { |gem| gem.is_a?(Gem::Dependency) }
- fail Gem::LoadError, "Build requires the gems #{not_found_deps.join(', ')}, which cannot be found in local or remote repository." unless not_found_deps.empty?
- uses = "This build requires the gems #{install.map(&:full_name).join(', ')}:"
- fail Gem::LoadError, "#{uses} to install, run Buildr interactively." unless $stdout.isatty
- unless agree("#{uses} do you want me to install them? [Y/n]", true)
- fail Gem::LoadError, 'Cannot build without these gems.'
- end
- install.each do |spec|
- say "Installing #{spec.full_name} ... " if verbose
- Util.ruby 'install', spec.name, '-v', spec.version.to_s, :command => 'gem', :sudo => true, :verbose => false
- Gem.source_index.load_gems_in Gem::SourceIndex.installed_spec_directories
- end
- installed += install
+ newly_installed = Util::Gems.install(*missing_deps)
+ installed += newly_installed
end
-
installed.each do |spec|
if gem(spec.name, spec.version.to_s)
- # FileList[spec.require_paths.map { |path| File.expand_path("#{path}/*.rb", spec.full_gem_path) }].
- # map { |path| File.basename(path) }.each { |file| require file }
- # FileList[File.expand_path('tasks/*.rake', spec.full_gem_path)].each do |file|
- # Buildr.application.add_import file
- # end
+ # TODO: is this intended to load rake tasks from the installed gems?
+ # We should use a convention like .. if the gem has a _buildr.rb file, load it.
+
+ #FileList[spec.require_paths.map { |path| File.expand_path("#{path}/*.rb", spec.full_gem_path) }].
+ # map { |path| File.basename(path) }.each { |file| require file }
+ #FileList[File.expand_path('tasks/*.rake', spec.full_gem_path)].each do |file|
+ # Buildr.application.add_import file
+ #end
end
end
@gems = installed
end
- def find_buildfile
+ def find_buildfile #:nodoc:
here = original_dir
Dir.chdir(here) unless Dir.pwd == here
while ! have_rakefile
@@ -244,14 +277,16 @@
end
end
- def load_buildfile
- @requires.each { |name| require name }
+ def load_buildfile #:nodoc:
info "(in #{Dir.pwd}, #{environment})"
load File.expand_path(@rakefile) if @rakefile != ''
- load_imports
buildfile.enhance @requires.select { |f| File.file?(f) }.map{ |f| File.expand_path(f) }
end
+ def load_requires #:nodoc:
+ @requires.each { |name| require name }
+ end
+
# Loads buildr.rb files from users home directory and project directory.
# Loads custom tasks from .rake files in tasks directory.
def load_tasks #:nodoc:
@@ -269,7 +304,6 @@
buildfile.enhance files
true
end
- private :load_tasks
def display_prerequisites
invoke_task('buildr:initialize')
@@ -280,49 +314,7 @@
end
end
end
-
- # :call-seq:
- # deprecated(message)
- #
- # Use with deprecated methods and classes. This method automatically adds the file name and line number,
- # and the text 'Deprecated' before the message, and eliminated duplicate warnings. It only warns when
- # running in verbose mode.
- #
- # For example:
- # deprecated 'Please use new_foo instead of foo.'
- def deprecated(message) #:nodoc:
- return unless verbose
- "#{caller[1]}: Deprecated: #{message}".tap do |message|
- @deprecated ||= {}
- unless @deprecated[message]
- @deprecated[message] = true
- warn message
- end
- end
- end
-
- # Not for external consumption.
- def switch_to_namespace(names) #:nodoc:
- current, @scope = @scope, names
- begin
- yield
- ensure
- @scope = current
- end
- end
- # Yields to block on successful completion. Primarily used for notifications.
- def on_completion(&block)
- @on_completion << block
- end
-
- # Yields to block on failure with exception. Primarily used for notifications.
- def on_failure(&block)
- @on_failure << block
- end
-
- private
-
# Provide standard execption handling for the given block.
def standard_exception_handling
begin
Modified: incubator/buildr/trunk/lib/buildr/core/util.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/buildr/core/util.rb?rev=698695&r1=698694&r2=698695&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/buildr/core/util.rb (original)
+++ incubator/buildr/trunk/lib/buildr/core/util.rb Wed Sep 24 12:17:46 2008
@@ -108,7 +108,47 @@
FileList[dirs.map { |dir| File.join(dir, '/**/{*,.*}') }].reject { |file| File.basename(file) =~ /^[.]{1,2}$/ }
end
- end
+ # Utility methods for running gem commands
+ module Gems
+ extend self
+
+ # Install gems specified by each Gem::Dependency if they are missing. This method prompts the user
+ # for permission before installing anything.
+ #
+ # Returns the installed Gem::Dependency objects or fails if permission not granted or when buildr
+ # is not running interactively (on a tty)
+ def install(*dependencies)
+ raise ArgumentError, "Expected at least one argument" if dependencies.empty?
+ remote = dependencies.map { |dep| Gem::SourceInfoCache.search(dep).last || dep }
+ not_found_deps, to_install = remote.partition { |gem| gem.is_a?(Gem::Dependency) }
+ fail Gem::LoadError, "Build requires the gems #{not_found_deps.join(', ')}, which cannot be found in local or remote repository." unless not_found_deps.empty?
+ uses = "This build requires the gems #{to_install.map(&:full_name).join(', ')}:"
+ fail Gem::LoadError, "#{uses} to install, run Buildr interactively." unless $stdout.isatty
+ unless agree("#{uses} do you want me to install them? [Y/n]", true)
+ fail Gem::LoadError, 'Cannot build without these gems.'
+ end
+ to_install.each do |spec|
+ say "Installing #{spec.full_name} ... " if verbose
+ command 'install', spec.name, '-v', spec.version.to_s, :verbose => false
+ Gem.source_index.load_gems_in Gem::SourceIndex.installed_spec_directories
+ end
+ to_install
+ end
+
+ # Execute a GemRunner command
+ def command(cmd, *args)
+ options = Hash === args.last ? args.pop : {}
+ gem_home = ENV['GEM_HOME'] || Gem.path.find { |f| File.writable?(f) }
+ options[:sudo] = :root unless Util.win_os? || gem_home
+ options[:command] = 'gem'
+ args << options
+ args.unshift '-i', gem_home if cmd == 'install' && gem_home && !args.any?{ |a| a[/-i|--install-dir/] }
+ Util.ruby cmd, *args
+ end
+
+ end # Gems
+
+ end # Util
end
Modified: incubator/buildr/trunk/lib/buildr/packaging/gems.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/buildr/packaging/gems.rb?rev=698695&r1=698694&r2=698695&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/buildr/packaging/gems.rb (original)
+++ incubator/buildr/trunk/lib/buildr/packaging/gems.rb Wed Sep 24 12:17:46 2008
@@ -40,11 +40,11 @@
end
def install
- Util.ruby 'install', name, :command => 'gem', :sudo => true
+ Util::Gems.command 'install', name
end
def uninstall
- Util.ruby 'uninstall', spec.name, '-v', spec.version.to_s, :command => 'gem', :sudo => true
+ Util::Gems.command 'uninstall', spec.name, '-v', spec.version.to_s
end
def upload