milkode 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,12 @@
1
+ === 1.0.2 2013/06/08
2
+
3
+ * gmilk
4
+ * ファイル内検索を外部ツールと連携して高速化する機能を追加
5
+ * -m(--match-files) オプションを追加
6
+ * -e (-external-tool) オプションを追加
7
+ * 検索するレコード数が多い時は"-e grep"で検索するように
8
+ * --no-external オプションを追加
9
+
1
10
  === 1.0.0 2013/05/21
2
11
 
3
12
  * milk web
@@ -1,3 +1,12 @@
1
+ === 1.0.2 2013/06/08
2
+
3
+ * gmilk
4
+ * Add feature to accelerate search speed with an external tool file search
5
+ * Add -m(--match-files) option
6
+ * Add -e (-external-tool) option
7
+ * Search using "-e grep" when the number of records is large
8
+ * Add --no-external option
9
+
1
10
  === 1.0.0 2013/05/21
2
11
 
3
12
  * milk web
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.2
data/bin/gmilk CHANGED
@@ -6,5 +6,5 @@
6
6
  require 'rubygems'
7
7
  require 'milkode/grep/cli_grep'
8
8
 
9
- Version = "1.0.0"
9
+ Version = "1.0.2"
10
10
  Milkode::CLI_Grep.execute(STDOUT, ARGV)
data/bin/milk CHANGED
@@ -6,5 +6,5 @@
6
6
  require 'rubygems'
7
7
  require 'milkode/cli'
8
8
 
9
- Version = "1.0.0"
9
+ Version = "1.0.2"
10
10
  Milkode::CLI.start(ARGV)
@@ -29,7 +29,7 @@ set :haml, :format => :html5
29
29
  get '/' do
30
30
  if Database.validate?
31
31
  @setting = WebSetting.new
32
- @version = "1.0.0"
32
+ @version = "1.0.2"
33
33
 
34
34
  @package_num = Database.instance.yaml_package_num
35
35
  @file_num = Database.instance.totalRecords
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'fileutils'
5
5
  require 'pathname'
6
6
  require 'kconv'
7
+ require 'open3'
7
8
 
8
9
  module Milkode
9
10
  module Util
@@ -230,6 +231,15 @@ module Milkode
230
231
  table.sort(keys, options)
231
232
  end
232
233
  end
234
+
235
+ # 指定したコマンドが存在するか?
236
+ def exist_command?(command)
237
+ begin
238
+ Open3.capture3("type #{command}")[2].exited?
239
+ rescue Errno::ENOENT
240
+ false
241
+ end
242
+ end
233
243
  end
234
244
  end
235
245
 
@@ -7,9 +7,12 @@ require 'milkode/common/dbdir'
7
7
  require 'milkode/common/util'
8
8
  require 'milkode/grep/findgrep_option'
9
9
  require 'optparse'
10
+ require 'tempfile'
10
11
 
11
12
  module Milkode
12
13
  class CLI_Grep
14
+ AUTO_EXTERNAL_RECORD_NUM = 500
15
+
13
16
  def self.execute(stdout, arguments=[])
14
17
  # 引数の文字コードをUTF-8に変換
15
18
  if (Util::platform_win?)
@@ -63,15 +66,18 @@ Gotoline:
63
66
  Normal:
64
67
  EOF
65
68
  opt.on('-a', '--all', 'Search all package.') {|v| my_option[:all] = true }
66
- opt.on('-c', '--count', 'Disp count num.') {|v| my_option[:count] = true }
69
+ opt.on('-c', '--count', 'Display count num.') {|v| my_option[:count] = true }
67
70
  opt.on('--cache', 'Search only db.') {|v| option.groongaOnly = true }
68
71
  opt.on('--color', 'Color highlight.') {|v| option.colorHighlight = true}
69
72
  opt.on('--cs', '--case-sensitive', 'Case sensitivity.') {|v| option.caseSensitive = true }
70
73
  opt.on('-d DIR', '--directory DIR', 'Start directory. (deafult:".")') {|v| current_dir = File.expand_path(v); my_option[:find_mode] = true}
71
74
  opt.on('--db DB_DIR', "Specify dbdir. (Use often with '-a')") {|v| option.dbFile = Dbdir.groonga_path(v) }
75
+ opt.on('-e GREP', '--external-tool GREP', "Use external tool for file search. (e.g. grep, ag)") {|v| my_option[:external_tool] = v}
72
76
  opt.on('-f FILE_PATH', '--file-path FILE_PATH', 'File path. (Enable multiple call)') {|v| option.filePatterns << v; my_option[:find_mode] = true }
73
77
  opt.on('-i', '--ignore', 'Ignore case.') {|v| option.ignoreCase = true}
78
+ opt.on('-m', '--match-files', 'Display match files.') {|v| my_option[:match_files] = true}
74
79
  opt.on('-n NUM', 'Limits the number of match to show.') {|v| option.matchCountLimit = v.to_i }
80
+ opt.on('--no-external', 'Disable auto external.') {|v| my_option[:no_external] = true }
75
81
  opt.on('--no-snip', 'There being a long line, it does not snip.') {|v| option.noSnip = true }
76
82
  opt.on('-p PACKAGE', '--package PACKAGE', 'Specify search package.') {|v| setup_package(option, my_option, v) }
77
83
  opt.on('-r', '--root', 'Search from package root.') {|v| current_dir = package_root_dir(File.expand_path(".")); my_option[:find_mode] = true }
@@ -150,12 +156,31 @@ EOF
150
156
  require 'milkode/grep/findgrep'
151
157
 
152
158
  if (my_option[:count])
153
- # count mode
154
159
  option.isSilent = true
155
- findGrep = FindGrep.new(arguments, option)
156
- records = findGrep.pickupRecords
157
- # stdout.puts "#{records.size} records (#{findGrep.time_s})"
158
- stdout.puts "#{records.size} records"
160
+ stdout.puts "#{pickup_records(arguments, option).size} records"
161
+
162
+ elsif (my_option[:external_tool])
163
+ option.isSilent = true
164
+ records = pickup_records(arguments, option)
165
+
166
+ case my_option[:external_tool]
167
+ when 'grep'
168
+ search_external_tool(arguments, option, records, 'grep -n', 'grep')
169
+ when 'ag'
170
+ search_external_tool(arguments, option, records, 'ag', 'ag')
171
+ else
172
+ search_external_tool(arguments, option, records, my_option[:external_tool], my_option[:external_tool])
173
+ end
174
+
175
+ elsif (my_option[:match_files])
176
+ option.isSilent = true
177
+ records = pickup_records(arguments, option)
178
+ files = pickup_files(records, '\ ', option.matchCountLimit)
179
+
180
+ files.each do |filename|
181
+ stdout.puts filename
182
+ end
183
+
159
184
  elsif my_option[:gotoline_data]
160
185
  # gotoline mode
161
186
  basePatterns = option.filePatterns
@@ -176,9 +201,22 @@ EOF
176
201
  findGrep.searchAndPrint(stdout)
177
202
  end
178
203
  else
179
- # search mode
204
+ # normal search
180
205
  findGrep = FindGrep.new(arguments, option)
181
- findGrep.searchAndPrint(stdout)
206
+ records = findGrep.pickupRecords
207
+
208
+ if (my_option[:no_external] || records.length < AUTO_EXTERNAL_RECORD_NUM)
209
+ findGrep.searchAndPrint2(stdout, records)
210
+ else
211
+ # レコード数が多い時は"-e grep"で検索
212
+ if Util::exist_command?('grep') && Util::exist_command?('xargs')
213
+ $stderr.puts "Number of records is large. Use auto external tool (gmilk -e grep)"
214
+ search_external_tool(arguments, option, records, 'grep -n', 'grep')
215
+ else
216
+ findGrep.searchAndPrint2(stdout, records)
217
+ end
218
+ end
219
+
182
220
  end
183
221
  end
184
222
  else
@@ -188,6 +226,43 @@ EOF
188
226
 
189
227
  private
190
228
 
229
+ def self.search_external_tool(arguments, option, records, first_command, second_command)
230
+ files = pickup_files(records, '\\\\ ', option.matchCountLimit)
231
+
232
+ unless files.empty?
233
+ cmd = []
234
+
235
+ tmpfile = Tempfile.open("gmilk_external_tool")
236
+ tmpfile.binmode
237
+ tmpfile.write(files.join("\n"))
238
+ tmpfile.close
239
+ tmpfile.open
240
+ cmd << "cat #{tmpfile.path}"
241
+
242
+ cmd << "xargs #{first_command} #{arguments[0]}"
243
+
244
+ (1...arguments.size).each do |index|
245
+ cmd << "#{second_command} #{arguments[index]}"
246
+ end
247
+
248
+ system(cmd.join(" | "))
249
+
250
+ tmpfile.close(true)
251
+ end
252
+ end
253
+
254
+ def self.pickup_records(arguments, option)
255
+ FindGrep.new(arguments, option).pickupRecords
256
+ end
257
+
258
+ def self.pickup_files(records, conv_space, length = -1)
259
+ files = []
260
+ records.each do |r|
261
+ files << r.path.gsub(' ', conv_space) if File.exist?(r.path)
262
+ end
263
+ (length > 0) ? files[0, length] : files
264
+ end
265
+
191
266
  def self.setup_package(option, my_option, keyword)
192
267
  # @memo package指定が簡単になった
193
268
  # dirs = yaml_load.contents.find_all {|p| p.name.include? keyword }.map{|p| p.directory}
@@ -109,10 +109,15 @@ module Milkode
109
109
  end
110
110
 
111
111
  def searchAndPrint(stdout)
112
+ records = searchDatabase
113
+ searchAndPrint2(stdout, records)
114
+ end
115
+
116
+ def searchAndPrint2(stdout, records)
112
117
  unless (@option.dbFile)
113
118
  searchFromDir(stdout, @option.directory, 0)
114
119
  else
115
- searchFromDB(stdout, @option.directory)
120
+ searchFromDB(stdout, records, @option.directory)
116
121
  end
117
122
 
118
123
  @result.time_stop
@@ -153,10 +158,7 @@ module Milkode
153
158
  Gren::Util::time_s(@result.time)
154
159
  end
155
160
 
156
- def searchFromDB(stdout, dir)
157
- # データベースを検索
158
- records = searchDatabase
159
-
161
+ def searchFromDB(stdout, records, dir)
160
162
  # ヒットしたレコード数
161
163
  stdout.puts "Found : #{records.size} records." if (!@option.dispHtml && !@option.isSilent)
162
164
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{milkode}
8
- s.version = "1.0.0"
8
+ s.version = "1.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["ongaeshi"]
12
- s.date = %q{2013-05-21}
12
+ s.date = %q{2013-06-08}
13
13
  s.description = %q{Line based local source code search engine & grep-command & web-app.}
14
14
  s.email = %q{ongaeshi0621@gmail.com}
15
15
  s.executables = ["gmilk", "milk"]
@@ -26,6 +26,7 @@ class TestCLI_Grep < Test::Unit::TestCase
26
26
  t_case_sensitive
27
27
  t_keyword
28
28
  t_db
29
+ t_match_files
29
30
  end
30
31
 
31
32
  def teardown
@@ -98,6 +99,12 @@ class TestCLI_Grep < Test::Unit::TestCase
98
99
  io = StringIO.new
99
100
  CLI_Grep.execute(io, "--db #{@work.path("db1")} -a db_dir_expand".split)
100
101
  end
102
+
103
+ def t_match_files
104
+ io = StringIO.new
105
+ CLI_Grep.execute(io, "-m -p a_project default".split)
106
+ assert_equal 1, io.string.split("\n").count
107
+ end
101
108
  end
102
109
 
103
110
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: milkode
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 2
10
+ version: 1.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - ongaeshi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-05-21 00:00:00 +09:00
18
+ date: 2013-06-08 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency