summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rwxr-xr-xtool/redmine-backporter.rb93
2 files changed, 71 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 06974e4eb2..70eb93bcff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jan 27 15:58:23 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: added history feature for platforms which
+ lack readline.
+
Mon Jan 26 22:09:35 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* .gitignore: ignored temporary file with git.
diff --git a/tool/redmine-backporter.rb b/tool/redmine-backporter.rb
index 64078c0348..13a9ec8851 100755
--- a/tool/redmine-backporter.rb
+++ b/tool/redmine-backporter.rb
@@ -200,35 +200,74 @@ def more(sio)
end
end
-def Readline.readline(prompt = '')
- console = IO.console
- console.binmode
- ly, lx = console.winsize
- if /mswin|mingw/ =~ RUBY_PLATFORM or /^(?:vt\d\d\d|xterm)/i =~ ENV["TERM"]
- cls = "\r\e[2K"
- else
- cls = "\r" << (" " * lx)
+class << Readline
+ def readline(prompt = '')
+ console = IO.console
+ console.binmode
+ ly, lx = console.winsize
+ if /mswin|mingw/ =~ RUBY_PLATFORM or /^(?:vt\d\d\d|xterm)/i =~ ENV["TERM"]
+ cls = "\r\e[2K"
+ else
+ cls = "\r" << (" " * lx)
+ end
+ cls << "\r" << prompt
+ console.print prompt
+ console.flush
+ line = ''
+ while 1
+ case c = console.getch
+ when "\r", "\n"
+ puts
+ HISTORY << line
+ return line
+ when "\C-?", "\b" # DEL/BS
+ print "\b \b" if line.chop!
+ when "\C-u"
+ print cls
+ line.clear
+ when "\C-d"
+ return nil if line.empty?
+ line << c
+ when "\C-p"
+ HISTORY.pos -= 1
+ line = HISTORY.current
+ print cls
+ print line
+ when "\C-n"
+ HISTORY.pos += 1
+ line = HISTORY.current
+ print cls
+ print line
+ else
+ print c
+ line << c
+ end
+ end
end
- cls << "\r" << prompt
- console.print prompt
- console.flush
- line = ''
- while 1
- case c = console.getch
- when "\r", "\n"
- puts
- return line
- when "\C-?", "\b" # DEL/BS
- print "\b \b" if line.chop!
- when "\C-u"
- print cls
- line.clear
- when "\C-d"
- return nil if line.empty?
- line << c
+
+ HISTORY = []
+ def HISTORY.<<(val)
+ HISTORY.push(val)
+ @pos = self.size
+ self
+ end
+ def HISTORY.pos
+ @pos ||= 0
+ end
+ def HISTORY.pos=(val)
+ @pos = val
+ if @pos < 0
+ @pos = -1
+ elsif @pos >= self.size
+ @pos = self.size
+ end
+ end
+ def HISTORY.current
+ @pos ||= 0
+ if @pos < 0 || @pos >= self.size
+ ''
else
- print c
- line << c
+ self[@pos]
end
end
end unless defined?(Readline.readline)