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