redcar 0.3.9 → 0.3.10.0dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/CHANGES +18 -2
  2. data/Rakefile +9 -1
  3. data/bin/redcar +1 -1
  4. data/lib/redcar.rb +26 -21
  5. data/lib/redcar/runner.rb +8 -4
  6. data/plugins/document_search/features/replace.feature +9 -0
  7. data/plugins/document_search/lib/document_search/search.rb +7 -5
  8. data/plugins/project/lib/project.rb +1 -1
  9. data/plugins/project/lib/project/adapters/remote.rb +0 -2
  10. data/plugins/project/lib/project/adapters/remote_protocols/ftp.rb +2 -2
  11. data/plugins/project/lib/project/adapters/remote_protocols/protocol.rb +0 -2
  12. data/plugins/project/lib/project/adapters/remote_protocols/sftp.rb +2 -2
  13. data/plugins/redcar/redcar.rb +4 -1
  14. data/plugins/runnables/lib/runnables.rb +27 -12
  15. data/plugins/runnables/lib/runnables/command_output_controller.rb +20 -3
  16. data/plugins/runnables/lib/runnables/output_processor.rb +63 -0
  17. data/plugins/runnables/spec/runnables/output_processor_spec.rb +57 -0
  18. data/plugins/runnables/spec/spec_helper.rb +5 -0
  19. data/plugins/runnables/vendor/session/LICENSE +3 -0
  20. data/plugins/runnables/vendor/{session-2.4.0/HISTORY → session/README} +96 -1
  21. data/plugins/runnables/vendor/session/Rakefile +233 -0
  22. data/plugins/runnables/vendor/session/gemspec.rb +62 -0
  23. data/plugins/runnables/vendor/{session-2.4.0 → session}/lib/session.rb +6 -103
  24. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/bash.rb +0 -0
  25. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/driver.rb +0 -0
  26. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/session_idl.rb +0 -0
  27. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/session_sh.rb +0 -0
  28. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/sh0.rb +0 -0
  29. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/stdin.rb +0 -0
  30. data/plugins/runnables/vendor/{session-2.4.0 → session}/sample/threadtest.rb +0 -0
  31. data/plugins/runnables/vendor/session/session.gemspec +27 -0
  32. data/plugins/runnables/vendor/{session-2.4.0 → session}/test/session.rb +3 -0
  33. data/plugins/runnables/views/basic_ansi.css +34 -0
  34. data/plugins/runnables/views/color_tester.html +50 -0
  35. data/plugins/runnables/views/command_output.html.erb +7 -1
  36. data/plugins/strip_trailing_spaces/CHANGELOG +12 -0
  37. data/plugins/strip_trailing_spaces/README.md +32 -0
  38. data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +53 -0
  39. data/plugins/strip_trailing_spaces/plugin.rb +8 -0
  40. metadata +4225 -4200
  41. data/plugins/runnables/vendor/session-2.4.0/README +0 -89
  42. data/plugins/runnables/vendor/session-2.4.0/TODO +0 -3
  43. data/plugins/runnables/vendor/session-2.4.0/VERSION +0 -1
  44. data/plugins/runnables/vendor/session-2.4.0/gemspec.rb +0 -22
  45. data/plugins/runnables/vendor/session-2.4.0/install.rb +0 -143
  46. data/plugins/runnables/vendor/session-2.4.0/session-2.4.0.gem +0 -0
data/CHANGES CHANGED
@@ -1,6 +1,22 @@
1
1
 
2
- Version 0.3.9 (TBA)
3
- ===================
2
+ Version 0.3.10 (TBA)
3
+ ====================
4
+
5
+ Enhancements:
6
+
7
+ * Colourful Runnables! (The output tab supports ANSI escape codes) (Mat Schaffer)
8
+ * Runnables scroll as the output gets longer (Delisa Mason)
9
+ * Option to save all tabs before running any Runnable (Delisa Mason)
10
+ * Strip trailing spaces on save option (Steven Hancock)
11
+ * Search and replace supports backreferences (\1 \2 etc) (Mat Schaffer)
12
+ * Uses client, 32bit jvm mode, for twice as fast startup. (Dan Lucraft)
13
+
14
+ Fixes:
15
+
16
+ * Fix for opening files with regex characters in. (Tom Murray)
17
+
18
+ Version 0.3.9 (12 Aug 2010)
19
+ ===========================
4
20
 
5
21
  * Clojure REPL (David Byrne)
6
22
  * Remote edit files (Felipe Coury & Dan Lucraft)
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- REDCAR_VERSION = "0.3.9"
1
+ REDCAR_VERSION = "0.3.10.0dev"
2
2
  require 'rubygems'
3
3
  require 'fileutils'
4
4
  require 'spec/rake/spectask'
@@ -32,6 +32,14 @@ begin
32
32
  rescue LoadError
33
33
  end
34
34
 
35
+ desc "upload the docs to redcareditor.com"
36
+ task :release_docs do
37
+ port = YAML.load(File.read(".server.yaml"))["port"]
38
+ docs_dir = YAML.load(File.read(".server.yaml"))["dir"]
39
+ sh "rsync -e 'ssh -p #{port}' -avz doc/ danlucraft.com:#{docs_dir}/#{REDCAR_VERSION}/"
40
+ sh "rsync -e 'ssh -p #{port}' -avz doc/ danlucraft.com:#{docs_dir}/latest/"
41
+ end
42
+
35
43
  ### CI
36
44
  task :ci => [:specs_ci, :cucumber_ci]
37
45
 
data/bin/redcar CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
2
+ $redcar_process_start_time = Time.now
3
3
  $VERBOSE = true if ARGV.find{|arg| arg == '--verbose'}
4
4
  require File.join(File.dirname(__FILE__), %w(.. lib redcar_quick_start))
5
5
 
data/lib/redcar.rb CHANGED
@@ -41,10 +41,10 @@ require 'uri'
41
41
  #
42
42
  # and so on.
43
43
  module Redcar
44
- VERSION = '0.3.9'
44
+ VERSION = '0.3.10.0dev'
45
45
  VERSION_MAJOR = 0
46
46
  VERSION_MINOR = 3
47
- VERSION_RELEASE = 9
47
+ VERSION_RELEASE = 10
48
48
 
49
49
  ENVIRONMENTS = [:user, :debug, :test]
50
50
 
@@ -68,26 +68,31 @@ module Redcar
68
68
  jruby = Config::CONFIG["RUBY_INSTALL_NAME"] == "jruby"
69
69
  osx = ! [:linux, :windows].include?(platform)
70
70
 
71
- if forking and not jruby
72
- # jRuby doesn't support fork() because of the runtime stuff...
73
- forking = false
74
- puts 'Forking failed, attempting to start anyway...' if (pid = fork) == -1
75
- exit unless pid.nil?
76
-
77
- if pid.nil?
78
- # reopen the standard pipes to nothingness
79
- STDIN.reopen '/dev/null'
80
- STDOUT.reopen '/dev/null', 'a'
81
- STDERR.reopen STDOUT
71
+ begin
72
+ if forking and not jruby
73
+ # jRuby doesn't support fork() because of the runtime stuff...
74
+ forking = false
75
+ puts 'Forking failed, attempting to start anyway...' if (pid = fork) == -1
76
+ exit unless pid.nil? # kill the parent process
77
+
78
+ if pid.nil?
79
+ # reopen the standard pipes to nothingness
80
+ STDIN.reopen '/dev/null'
81
+ STDOUT.reopen '/dev/null', 'a'
82
+ STDERR.reopen STDOUT
83
+ end
84
+ elsif forking
85
+ # so we need to try something different...
86
+ # Need to work out the vendoring stuff here.
87
+ # for now just blow up and do what we'd normally do.
88
+ #require 'spoon'
89
+ raise NotImplementedError, 'Attempting to fork from inside jRuby. jRuby doesn\'t support this.'
90
+ #puts 'Continuing normally...'
91
+ #forking = false
82
92
  end
83
- elsif forking
84
- # so we need to try something different...
85
- # Need to work out the vendoring stuff here.
86
- # for now just blow up and do what we'd normally do.
87
- #require 'spoon'
88
- puts 'Attempting to fork from inside jRuby. jRuby doesn\'t support this.'
89
- puts 'Continuing normally...'
90
- forking = false
93
+ rescue NotImplementedError
94
+ puts "Forking isn't supported on this system. Sorry."
95
+ puts "Starting normally..."
91
96
  end
92
97
 
93
98
  return if no_runner
data/lib/redcar/runner.rb CHANGED
@@ -13,7 +13,7 @@ module Redcar
13
13
  exit 1
14
14
  end
15
15
  ENV['RUBYOPT'] = nil # disable other native args
16
- command = "java #{java_args} -Xmx500m -Xss1024k -Djruby.memory.max=500m -Djruby.stack.max=1024k -cp \"#{jruby_complete}\" org.jruby.Main #{"--debug" if debug_mode?} \"#{bin}\" #{cleaned_args} --no-sub-jruby --ignore-stdin"
16
+ command = "java -d32 -client #{java_args} -Xmx500m -Xss1024k -Djruby.memory.max=500m -Djruby.stack.max=1024k -cp \"#{jruby_complete}\" org.jruby.Main #{"--debug" if debug_mode?} \"#{bin}\" #{cleaned_args} --no-sub-jruby --ignore-stdin"
17
17
  puts command
18
18
  exec(command)
19
19
  end
@@ -34,11 +34,15 @@ module Redcar
34
34
  end
35
35
 
36
36
  def java_args
37
+ str = ""
37
38
  if Config::CONFIG["host_os"] =~ /darwin/
38
- "-XstartOnFirstThread"
39
- else
40
- ""
39
+ str <<"-XstartOnFirstThread"
41
40
  end
41
+
42
+ if ARGV.include?("--load-timings")
43
+ str << " -Djruby.debug.loadService.timing=true"
44
+ end
45
+ str
42
46
  end
43
47
  end
44
48
  end
@@ -111,4 +111,13 @@ Feature: Replace in file
111
111
  Then the contents should be "THE\n* Speedbars have access to THE properties of THE widgets in THEm."
112
112
  And the selection range should be from 64 to 67
113
113
 
114
+ Scenario: Replace regex with back-references
115
+ When I replace the contents with "Curry chicken"
116
+ And I move the cursor to 0
117
+ And I run the command DocumentSearch::SearchAndReplaceCommand
118
+ And I type "(\w+) chicken" into the "Search" field in the speedbar
119
+ And I type "\1 beef" into the "Replace" field in the speedbar
120
+ And I press "Replace" in the speedbar
121
+ Then the contents should be "Curry beef"
122
+
114
123
 
@@ -2,11 +2,13 @@ module DocumentSearch
2
2
  class Search
3
3
  # An instance of a search type method: Regular expression
4
4
  def self.regex_search_method(line, query, replace)
5
- if line =~ /#{query}/
6
- startoff = $`.length
7
- endoff = (startoff + $&.length) - 1
8
- line[startoff..endoff] = replace
9
- return line, startoff, startoff + replace.length
5
+ new_line = line.sub(/#{query}/, replace)
6
+
7
+ if match = $~
8
+ startoff = match.pre_match.length
9
+ endoff = (startoff + match[0].length) - 1
10
+
11
+ return new_line, startoff, startoff + match[0].length
10
12
  end
11
13
  return nil
12
14
  end
@@ -88,7 +88,7 @@ module Redcar
88
88
  end
89
89
 
90
90
  def contains_path?(path)
91
- File.expand_path(path) =~ /^#{@path}($|\/|\\)/
91
+ File.expand_path(path) =~ /^#{Regexp.escape(@path)}($|\/|\\)/
92
92
  end
93
93
 
94
94
  # A list of files previously opened in this session for this project
@@ -1,5 +1,3 @@
1
- require 'net/ssh'
2
- require 'net/sftp'
3
1
 
4
2
  module Redcar
5
3
  class Project
@@ -1,5 +1,3 @@
1
- require 'net/ftp'
2
- require 'net/ftp/list'
3
1
 
4
2
  module Redcar
5
3
  class Project
@@ -13,6 +11,8 @@ module Redcar
13
11
  end
14
12
 
15
13
  def connection
14
+ require 'net/ftp'
15
+ require 'net/ftp/list'
16
16
  @connection ||= Net::FTP.open(host, user, password)
17
17
  end
18
18
 
@@ -1,5 +1,3 @@
1
- require 'net/ssh'
2
- require 'net/sftp'
3
1
 
4
2
  module Redcar
5
3
  class Project
@@ -1,5 +1,3 @@
1
- require 'net/ssh'
2
- require 'net/sftp'
3
1
 
4
2
  module Redcar
5
3
  class Project
@@ -13,6 +11,8 @@ module Redcar
13
11
  end
14
12
 
15
13
  def connection
14
+ require 'net/ssh'
15
+ require 'net/sftp'
16
16
  Redcar.timeout(10) do
17
17
  @connection ||= Net::SSH.start(host, user, :password => password, :keys => private_key_files)
18
18
  end
@@ -763,6 +763,7 @@ module Redcar
763
763
  link "Ctrl+Shift+[", MoveTabDownCommand
764
764
  link "Ctrl+Shift+]", MoveTabUpCommand
765
765
  link "Ctrl+R", Runnables::RunEditTabCommand
766
+ link "Cmd+Alt+I", ToggleInvisibles
766
767
 
767
768
  link "Ctrl+Shift+P", PrintScopeCommand
768
769
 
@@ -836,7 +837,8 @@ module Redcar
836
837
  link "Ctrl+Shift+Page Up", MoveTabDownCommand
837
838
  link "Ctrl+Shift+Page Down", MoveTabUpCommand
838
839
  link "Ctrl+Shift+R", PluginManagerUi::ReloadLastReloadedCommand
839
-
840
+ link "Ctrl+Alt+I", ToggleInvisibles
841
+
840
842
  link "Ctrl+Alt+S", Snippets::OpenSnippetExplorer
841
843
  #Textmate.attach_keybindings(self, :linux)
842
844
 
@@ -1013,6 +1015,7 @@ module Redcar
1013
1015
  Redcar::Project::Manager.start(args)
1014
1016
  puts "project start took #{Time.now - s}s"
1015
1017
  Redcar.app.make_sure_at_least_one_window_open
1018
+ puts "start time: #{Time.now - $redcar_process_start_time}"
1016
1019
  end
1017
1020
  end
1018
1021
  end
@@ -1,29 +1,39 @@
1
1
 
2
- require File.dirname(__FILE__) + "/../vendor/session-2.4.0/lib/session"
2
+ require File.dirname(__FILE__) + "/../vendor/session/lib/session"
3
3
  Session.use_open4 = true
4
4
 
5
5
  require 'runnables/command_output_controller'
6
6
  require 'runnables/running_process_checker'
7
+ require 'runnables/output_processor'
7
8
 
8
9
  module Redcar
9
10
  class Runnables
10
11
  TREE_TITLE = "Runnables"
11
-
12
- def self.run_process(path, command, title, output)
13
- controller = CommandOutputController.new(path, command, title)
14
- if output == "window"
15
- Project::Manager.open_project_for_path(".")
16
- output = "tab"
12
+
13
+ def self.run_process(path, command, title, output = "tab")
14
+ if Runnables.storage['save_project_before_running'] == true
15
+ Redcar.app.focussed_window.notebooks.each do |notebook|
16
+ notebook.tabs.each do |tab|
17
+ case tab
18
+ when EditTab
19
+ tab.edit_view.document.save!
20
+ end
21
+ end
22
+ end
17
23
  end
24
+ controller = CommandOutputController.new(path, command, title)
18
25
  if output == "none"
19
26
  controller.run
20
- else
27
+ else #default to new tab
28
+ if output == "window"
29
+ Project::Manager.open_project_for_path(".")
30
+ end
21
31
  tab = Redcar.app.focussed_window.new_tab(HtmlTab)
22
32
  tab.html_view.controller = controller
23
33
  tab.focus
24
34
  end
25
35
  end
26
-
36
+
27
37
  def self.menus
28
38
  Menu::Builder.build do
29
39
  sub_menu "Project", :priority => 15 do
@@ -69,6 +79,14 @@ module Redcar
69
79
  @top
70
80
  end
71
81
  end
82
+
83
+ def self.storage
84
+ @storage ||= begin
85
+ storage = Plugin::Storage.new('runnables')
86
+ storage.set_default('save_project_before_running', false)
87
+ storage
88
+ end
89
+ end
72
90
 
73
91
  class RunnableGroup
74
92
  include Redcar::Tree::Mirror::NodeMirror
@@ -220,6 +238,3 @@ module Redcar
220
238
  end
221
239
  end
222
240
  end
223
-
224
-
225
-
@@ -35,16 +35,30 @@ module Redcar
35
35
  end
36
36
  end
37
37
 
38
+ def stylesheet_link_tag(*files)
39
+ files.map do |file|
40
+ path = File.join(Redcar.root, %w(plugins runnables views) + [file.to_s + ".css"])
41
+ url = "file://" + File.expand_path(path)
42
+ %Q|<link href="#{url}" rel="stylesheet" type="text/css" />|
43
+ end.join("\n")
44
+ end
45
+
46
+ def process(text)
47
+ @processor ||= OutputProcessor.new
48
+ @processor.process(text)
49
+ end
50
+
38
51
  def run_windows
39
52
  @thread = Thread.new do
40
53
  output = `cd #{@path} & #{@cmd} 2>&1`
41
54
  html=<<-HTML
42
55
  <div class="stdout">
43
- <pre>#{output}</pre>
56
+ #{process(output)}
44
57
  </div>
45
58
  HTML
46
59
  execute(<<-JAVASCRIPT)
47
60
  $("#output").append(#{html.inspect});
61
+ $("html, body").attr({ scrollTop: $("#output").attr("scrollHeight") });
48
62
  JAVASCRIPT
49
63
  end
50
64
  end
@@ -56,12 +70,13 @@ module Redcar
56
70
  @shell.outproc = lambda do |out|
57
71
  html=<<-HTML
58
72
  <div class="stdout">
59
- <pre>#{out}</pre>
73
+ #{process(out)}
60
74
  </div>
61
75
  HTML
62
76
  execute(<<-JAVASCRIPT)
63
77
  $("#output").append(#{html.inspect});
64
- JAVASCRIPT
78
+ $("html, body").attr({ scrollTop: $("#output").attr("scrollHeight") });
79
+ JAVASCRIPT
65
80
  end
66
81
  @shell.errproc = lambda do |err|
67
82
  html=<<-HTML
@@ -71,6 +86,7 @@ module Redcar
71
86
  HTML
72
87
  execute(<<-JAVASCRIPT)
73
88
  $("#output").append(#{html.inspect});
89
+ $("html, body").attr({ scrollTop: $("#output").attr("scrollHeight") });
74
90
  JAVASCRIPT
75
91
  end
76
92
  begin
@@ -86,6 +102,7 @@ module Redcar
86
102
  HTML
87
103
  execute(<<-JAVASCRIPT)
88
104
  $("#output").append(#{html.inspect});
105
+ $("html, body").attr({ scrollTop: $("#output").attr("scrollHeight") });
89
106
  JAVASCRIPT
90
107
  @shell = nil
91
108
  @thread = nil
@@ -0,0 +1,63 @@
1
+ module Redcar
2
+ class Runnables
3
+ class OutputProcessor
4
+ # From TextMate's Support/lib/escape.rb
5
+ # Make string suitable for display as HTML, preserve spaces. Set :no_newline_after_br => true
6
+ # to cause “\n” to be substituted by “<br>” instead of “<br>\n”
7
+ def process(str, opts = {})
8
+ str = str.to_s.gsub("&", "&amp;").gsub("<", "&lt;")
9
+ str = process_ansi(str)
10
+ str = str.gsub(/\t+/, '<span style="white-space:pre;">\0</span>')
11
+ str = str.reverse.gsub(/ (?= |$)/, ';psbn&').reverse
12
+ if opts[:no_newline_after_br].nil?
13
+ str.gsub("\n", "<br>\n")
14
+ else
15
+ str.gsub("\n", "<br>")
16
+ end
17
+ end
18
+
19
+ def initialize
20
+ @ansi_stack = []
21
+ @ansi_colors = %w(black red green yellow blue purple cyan gray)
22
+ end
23
+
24
+ def color(num)
25
+ @ansi_colors[num.to_i]
26
+ end
27
+
28
+ def close_ansi_spans(clear = false)
29
+ stack_length = @ansi_stack.size
30
+ @ansi_stack = [] if clear
31
+ "</span>" * stack_length
32
+ end
33
+
34
+ def ansi_span(style)
35
+ %Q|<span class="#{style}">|
36
+ end
37
+
38
+ def restart_ansi_spans
39
+ @ansi_stack.map do |style|
40
+ ansi_span(style)
41
+ end.join('')
42
+ end
43
+
44
+ def process_ansi(str)
45
+ restart_ansi_spans + str.gsub(/\e\[(([0,1]);?)?((\d)(\d))?m/) do |m|
46
+ match = $~
47
+ if match[2] == "0" && match[4].nil?
48
+ close_ansi_spans(:clear)
49
+ else
50
+ style = ""
51
+ style += "ansi-regular " if match[2] == "0"
52
+ style += "ansi-bold " if match[2] == "1"
53
+ style += "ansi-light " if match[4] == "9"
54
+ style += "ansi-on-#{color(match[5])} " if match[4] == "4"
55
+ style += "ansi-#{color(match[5])}" if match[4] == "3" || match[4] == "9"
56
+ @ansi_stack << style unless style.empty?
57
+ ansi_span(style)
58
+ end
59
+ end + close_ansi_spans
60
+ end
61
+ end
62
+ end
63
+ end