You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by do...@apache.org on 2013/10/10 11:23:35 UTC
svn commit: r1530892 - in /buildr/trunk: buildr.gemspec
lib/buildr/core/console.rb
Author: donaldp
Date: Thu Oct 10 09:23:35 2013
New Revision: 1530892
URL: http://svn.apache.org/r1530892
Log:
Replace dependency on highline with custom console class
Modified:
buildr/trunk/buildr.gemspec
buildr/trunk/lib/buildr/core/console.rb
Modified: buildr/trunk/buildr.gemspec
URL: http://svn.apache.org/viewvc/buildr/trunk/buildr.gemspec?rev=1530892&r1=1530891&r2=1530892&view=diff
==============================================================================
--- buildr/trunk/buildr.gemspec (original)
+++ buildr/trunk/buildr.gemspec Thu Oct 10 09:23:35 2013
@@ -59,7 +59,6 @@ for those one-off tasks, with a language
spec.add_dependency 'net-ssh', '2.7.0'
spec.add_dependency 'net-sftp', '2.1.2'
spec.add_dependency 'rubyzip', '0.9.9'
- spec.add_dependency 'highline', '1.6.19'
spec.add_dependency 'json_pure', '1.8.0'
spec.add_dependency 'rubyforge', '2.0.4'
spec.add_dependency 'hoe', '3.7.1'
@@ -75,6 +74,7 @@ for those one-off tasks, with a language
spec.add_dependency 'jruby-openssl', '~> 0.8.2' if $platform.to_s == 'java'
spec.add_dependency 'bundler'
spec.add_dependency 'orderedhash'
+ spec.add_dependency 'win32console' '1.3.2' if $platform.to_s == 'x86-mswin32'
# Unable to get this consistently working under jruby on windows
unless $platform.to_s == 'java'
@@ -85,12 +85,6 @@ for those one-off tasks, with a language
end
spec.add_development_dependency 'ci_reporter', '1.9.0'
-
- # NOTE: Must update all-in-one.rake if this is updated
- # ffi-ncurses Fails on several varieties of Ubuntu due to being unable to locate ncursesw library
- # Should be able to just disable it
- #spec.add_development_dependency 'ffi-ncurses', '0.4.0' if $platform.to_s == 'java'
- spec.add_development_dependency 'win32console' if $platform.to_s == 'x86-mswin32'
# Ideally we would depend on psych when the platform has >= 1.9.2 support and jruby platform version > 1.6.6
#spec.add_development_dependency 'psych' if RUBY_VERSION >= '1.9.2'
spec.add_development_dependency 'pygmentize', '0.0.3'
Modified: buildr/trunk/lib/buildr/core/console.rb
URL: http://svn.apache.org/viewvc/buildr/trunk/lib/buildr/core/console.rb?rev=1530892&r1=1530891&r2=1530892&view=diff
==============================================================================
--- buildr/trunk/lib/buildr/core/console.rb (original)
+++ buildr/trunk/lib/buildr/core/console.rb Thu Oct 10 09:23:35 2013
@@ -23,52 +23,7 @@ module Buildr #nodoc
end
def use_color=(use_color)
- begin
- if Buildr::Util.win_os? && use_color
- if Buildr::Util.java_platform?
- require 'java'
- require 'readline'
- begin
- # Attempt jruby 1.7.0->1.7.4 code path
- java_import 'jline.console.ConsoleReader'
- input = $stdin.to_inputstream
- output = $stdout.to_outputstream
- @java_console = Java::JlineConsole::ConsoleReader.new(input, output)
- @java_console.set_history_enabled(false)
- @java_console.set_bell_enabled(true)
- @java_console.set_pagination_enabled(false)
- @java_terminal = @java_console.getTerminal
- rescue Error
- # Attempt jruby 1.6.* code path
-
- java_import 'java.io.OutputStreamWriter'
- java_import 'java.nio.channels.Channels'
- java_import 'jline.ConsoleReader'
- java_import 'jline.Terminal'
-
- @java_input = Channels.newInputStream($stdin.to_channel)
- @java_output = OutputStreamWriter.new(Channels.newOutputStream($stdout.to_channel))
- @java_terminal = Terminal.getTerminal
- @java_console = ConsoleReader.new(@java_input, @java_output)
- @java_console.setUseHistory(false)
- @java_console.setBellEnabled(true)
- @java_console.setUsePagination(false)
- end
- else
- require 'Win32/Console/ANSI'
- end
- end
- rescue Java::JavaLang::IncompatibleClassChangeError
- # Unfortunately we have multiple incompatible jline libraries
- # in the classpath. This is probably because we are using jruby
- # 1.7.5 with a library like scala and both use incompatible jline
- # implementations
- return
- rescue NameError
- return
- rescue LoadError
- return
- end
+ return if use_color && !setup_support
@use_color = use_color
end
@@ -77,11 +32,14 @@ module Buildr #nodoc
raise "Unknown color #{color.inspect}" unless [:green, :red, :blue].include?(color)
return message unless use_color
constants = {:green => "\e[32m", :red => "\e[31m", :blue => "\e[34m"}
+ @java_console.putString("#{constants[color]}#{message}\e[0m") if @java_console
"#{constants[color]}#{message}\e[0m"
end
# Return the [rows, columns] of a console or nil if unknown
def console_dimensions
+ return nil unless setup_support
+
begin
if Buildr::Util.win_os?
if Buildr::Util.java_platform?
@@ -115,21 +73,142 @@ module Buildr #nodoc
end
def agree?(message)
- agree(message)
+ puts "#{message} (Y or N)"
+ :agree == ask('Y' => :agree, 'N' => :disagree)
end
def ask_password(prompt)
- ask(prompt) { |q| q.echo = '*' }
+ puts prompt
+ begin
+ set_no_echo_mode
+ password = $stdin.readline
+ return password.chomp
+ ensure
+ reset_mode
+ end
end
def present_menu(header, options)
- choose do |menu|
- menu.header = header
- options.each_pair do |message, result|
- menu.choice(message) { result }
+ puts header
+ question_options = {}
+ count = 1
+ options.each_pair do |message, result|
+ puts "#{count}. #{message}"
+ question_options[count.to_s] = result
+ count += 1
+ end
+ ask(question_options)
+ end
+
+ private
+
+ def set_no_echo_mode
+ return unless setup_support
+ if Buildr::Util.win_os?
+ if Buildr::Util.java_platform?
+ if @java_console
+ @state = @java_console.getEchoCharacter
+ @java_console.setEchoCharacter 0
+ end
+ else
+ c = Win32::Console.new(Win32::Console::STD_OUTPUT_HANDLE)
+ c.Echo(false) rescue Exception
+ end
+ else
+ @state = `stty -g 2>/dev/null`
+ `stty -echo -icanon 2>/dev/null`
+ end
+ end
+
+ def reset_mode
+ return unless setup_support
+ if Buildr::Util.win_os?
+ if Buildr::Util.java_platform?
+ if @java_console
+ @java_console.setEchoCharacter @state
+ end
+ else
+ c = Win32::Console.new(Win32::Console::STD_OUTPUT_HANDLE)
+ c.Echo(true) rescue Exception
+ end
+ else
+ `stty #{@state} 2>/dev/null`
+ end
+ @state = nil
+ end
+
+ def ask(options)
+ keys = options.keys
+ keys_downcased = keys.collect { |k| k.downcase }
+ result = nil
+ show_prompt = false
+ until keys_downcased.include?(result)
+ puts "Invalid response. Valid responses include: #{keys.join(', ')}\n" if show_prompt
+ show_prompt = true
+ result = $stdin.readline
+ result = result.strip.downcase if result
+ end
+ options.each_pair do |key, value|
+ if key.downcase == result
+ return value.is_a?(Proc) ? value.call : value
+ end
+ end
+ return nil
+ end
+
+ def setup_support
+ return @initialized unless @initialized.nil?
+ @initialized = false
+ begin
+ if Buildr::Util.win_os?
+ if Buildr::Util.java_platform?
+ require 'java'
+ require 'readline'
+ begin
+ # Attempt jline1
+ java_import 'java.io.OutputStreamWriter'
+ java_import 'java.nio.channels.Channels'
+ java_import 'jline.ConsoleReader'
+ java_import 'jline.Terminal'
+
+ @java_input = Java::JavaNioChannels::Channels.newInputStream($stdin.to_channel)
+ @java_output = Java::JavaIo.OutputStreamWriter.new(Java::JavaNioChannels::Channels.newOutputStream($stdout.to_channel))
+ @java_terminal = Java::Jline::Terminal.getTerminal
+ @java_console = Java::Jline::ConsoleReader.new(@java_input, @java_output)
+ @java_console.setUseHistory(false)
+ @java_console.set_bell_enabled(true)
+ @java_console.setUsePagination(false)
+
+ rescue Exception
+ # attempt jline 2
+ java_import 'jline.console.ConsoleReader'
+
+ @java_console = ConsoleReader.new($stdin.to_inputstream, $stdout.to_outputstream)
+ @java_console.set_history_enabled(false)
+ @java_console.set_bell_enabled(true)
+ @java_console.set_pagination_enabled(false)
+ @java_terminal = @java_console.getTerminal
+ end
+ return false
+ else
+ require 'Win32/Console/ANSI'
+ end
end
+ rescue Java::JavaLang::IncompatibleClassChangeError
+ # Unfortunately we have multiple incompatible jline libraries
+ # in the classpath. This is probably because we are using jruby
+ # 1.7.5 with a library like scala and both use incompatible jline
+ # implementations
+ return false
+ rescue NameError
+ return false
+ rescue LoadError
+ return false
end
+ @initialized = true
+ return true
end
+
end
end
end