milkode 0.9.5 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/Gemfile +1 -1
  2. data/HISTORY.ja.rdoc +29 -0
  3. data/HISTORY.rdoc +14 -0
  4. data/VERSION +1 -1
  5. data/bin/gmilk +1 -1
  6. data/bin/milk +1 -1
  7. data/lib/milkode/cdstk/cdstk.rb +90 -38
  8. data/lib/milkode/cdstk/milkode_yaml.rb +6 -0
  9. data/lib/milkode/cdstk/yaml_file_wrapper.rb +4 -0
  10. data/lib/milkode/cdweb/app.rb +5 -5
  11. data/lib/milkode/cdweb/lib/command.rb +20 -4
  12. data/lib/milkode/cdweb/lib/database.rb +20 -16
  13. data/lib/milkode/cdweb/lib/grep.rb +6 -6
  14. data/lib/milkode/cdweb/lib/query.rb +36 -1
  15. data/lib/milkode/cdweb/lib/search_contents.rb +134 -19
  16. data/lib/milkode/cdweb/lib/search_fuzzy_gotoline.rb +162 -0
  17. data/lib/milkode/cdweb/lib/web_setting.rb +9 -1
  18. data/lib/milkode/cdweb/public/css/milkode.css +5 -0
  19. data/lib/milkode/cdweb/public/images/favicon.ico +0 -0
  20. data/lib/milkode/cdweb/public/js/milkode.js +46 -48
  21. data/lib/milkode/cdweb/views/index.haml +1 -0
  22. data/lib/milkode/cli.rb +6 -3
  23. data/lib/milkode/common/util.rb +19 -0
  24. data/lib/milkode/database/document_table.rb +40 -22
  25. data/lib/milkode/database/package_table.rb +1 -1
  26. data/lib/milkode/database/updater.rb +14 -7
  27. data/lib/milkode/findgrep/findgrep.rb +23 -11
  28. data/lib/milkode/grep/cli_grep.rb +1 -4
  29. data/milkode.gemspec +10 -5
  30. data/test/data/.gitignore.sjis +46 -0
  31. data/test/data/ignore_test_sjis/.gitignore +2 -0
  32. data/test/data/ignore_test_sjis/a.txt +1 -0
  33. data/test/test_cdstk.rb +2 -1
  34. data/test/test_ignore_setting.rb +9 -0
  35. data/test/test_query.rb +6 -0
  36. data/test/test_updater.rb +13 -1
  37. data/test/test_util.rb +10 -0
  38. metadata +17 -4
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ source "http://rubygems.org"
5
5
  # gem "activesupport", ">= 2.3.5"
6
6
  # gemspec
7
7
  gem 'termcolor','>= 1.2.0', '< 1.2.2'
8
- gem 'rroonga','>= 1.1.0'
8
+ gem 'rroonga','>= 1.1.0', '< 2.1.0'
9
9
  gem 'rack','>=1.3.4'
10
10
  gem 'sinatra', '>=1.2.6'
11
11
  gem 'launchy', '>=0.3.7'
@@ -1,3 +1,32 @@
1
+ === 0.9.6 2012/12/28
2
+
3
+ * milk web
4
+ * 絞り込み検索
5
+ * 拡張子で絞り込み
6
+ * ディレクトリで絞り込み
7
+ * ファイル名 + キーワード検索
8
+ * 'path/to/file def kwd'で'path/to/dir'ファイル内の'def kwd'を含む行を検索可能に
9
+ * あいまいジャンプ
10
+ * 'a/filename:15' でマッチしたファイルの指定行に直接ジャンプ
11
+ * 検索マッチ数が1つの時はファイル本体を表示
12
+ * g:オプションを付けると確実にジャンプ
13
+ * おすすめ検索クエリ
14
+ * ファイル名+キーワード(fp:)、あいまいジャンプモード(g:) 等のクエリを示唆
15
+ * faviconに対応
16
+ * その他
17
+ * 'AName name'で検索した時、'name'は大文字/小文字どちらでもマッチするように
18
+ * 範囲セレクトボックスを切り替えた時に自動的に再検索
19
+ * milkode.js: コーディングスタイル変更
20
+ * バグ修正
21
+ * Windows環境にて、左上の範囲セレクトボックスが文字化けする問題を修正
22
+ * .gitignoreが非UTF-8でも読み込めるように
23
+
24
+ * milk
25
+ * svnに対応 (milk add -p svn http://svn/trunk -n a_proj)
26
+ * milk remove, rebuild の高速化
27
+ * 'タブを複製'ボタンを押すとアンカーが消えてしまう問題を修正
28
+ * データベースディレクトリで milk pwd した時は専用メッセージ (On database in XXX)
29
+
1
30
  === 0.9.5 2012/12/09
2
31
 
3
32
  * milk web
@@ -1,3 +1,17 @@
1
+ === 0.9.6 2012/12/28
2
+
3
+ * milk web
4
+ * Narrow down search
5
+ * filename + keyword search
6
+ * Fuzzy direct jump
7
+ * Recommended search query
8
+ * Support favicon
9
+ * Bug fix
10
+
11
+ * milk
12
+ * Support svn (milk add -p svn http://svn/trunk -n a_proj)
13
+ * Quickly milk remove & rebuild
14
+
1
15
  === 0.9.5 2012/12/09
2
16
 
3
17
  * milk web
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.5
1
+ 0.9.6
data/bin/gmilk CHANGED
@@ -6,5 +6,5 @@
6
6
  require 'rubygems'
7
7
  require 'milkode/grep/cli_grep'
8
8
 
9
- Version = "0.9.5"
9
+ Version = "0.9.6"
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 = "0.9.5"
9
+ Version = "0.9.6"
10
10
  Milkode::CLI.start(ARGV)
@@ -28,6 +28,8 @@ require 'milkode/common/plang_detector'
28
28
 
29
29
  module Milkode
30
30
  class IgnoreError < RuntimeError ; end
31
+ class AddError < RuntimeError ; end
32
+ class ConvertError < RuntimeError ; end
31
33
 
32
34
  class Cdstk
33
35
  # バイグラムでトークナイズする。連続する記号・アルファベット・数字は一語として扱う。
@@ -36,8 +38,6 @@ module Milkode
36
38
  # 記号・アルファベット・数字もバイグラムでトークナイズする。
37
39
  DEFAULT_TOKENIZER = "TokenBigramSplitSymbolAlphaDigit"
38
40
 
39
- class ConvetError < RuntimeError ; end
40
-
41
41
  def initialize(io = $stdout, db_dir = ".")
42
42
  @db_dir = db_dir
43
43
  @out = io
@@ -131,26 +131,30 @@ module Milkode
131
131
  begin
132
132
  dirs.each do |v|
133
133
  # コンテンツを読み込める形に変換
134
- dir = convert_content(v)
134
+ dir = convert_content(v, options)
135
135
 
136
136
  # YAMLに追加
137
137
  package = Package.create(dir, options[:ignore])
138
138
  add_yaml(package)
139
139
 
140
140
  # オプション設定
141
- is_update_with_git_pull = git_url?(v)
142
- set_yaml_options(package, options, is_update_with_git_pull)
141
+ is_update_with_git_pull = git_protocol?(options, v)
142
+ is_update_with_svn_update = svn_protocol?(options, v)
143
+ set_yaml_options(package, options, is_update_with_git_pull, is_update_with_svn_update)
143
144
 
144
145
  # アップデート
145
146
  update_dir_in(dir) unless options[:empty]
146
147
  end
147
- rescue ConvetError
148
+ rescue AddError => e
149
+ error_alert(e.message)
150
+ return
151
+ rescue ConvertError => e
148
152
  return
149
153
  end
150
154
  end
151
155
  end
152
156
 
153
- def set_yaml_options(package, options, is_update_with_git_pull)
157
+ def set_yaml_options(package, options, is_update_with_git_pull, is_update_with_svn_update)
154
158
  is_dirty = false
155
159
 
156
160
  if options[:no_auto_ignore]
@@ -160,16 +164,24 @@ module Milkode
160
164
  is_dirty = true
161
165
  end
162
166
 
163
- if options[:name]
167
+ # ローカルディレクトリの名前変更は後回し
168
+ # if options[:name]
169
+ # dst = package.options
170
+ # dst[:name] = src[:name]
171
+ # package.set_options(dst)
172
+ # is_dirty = true
173
+ # end
174
+
175
+ if is_update_with_git_pull
164
176
  dst = package.options
165
- dst[:name] = src[:name]
177
+ dst[:update_with_git_pull] = is_update_with_git_pull
166
178
  package.set_options(dst)
167
179
  is_dirty = true
168
180
  end
169
181
 
170
- if is_update_with_git_pull
182
+ if is_update_with_svn_update
171
183
  dst = package.options
172
- dst[:update_with_git_pull] = is_update_with_git_pull
184
+ dst[:update_with_svn_update] = is_update_with_svn_update
173
185
  package.set_options(dst)
174
186
  is_dirty = true
175
187
  end
@@ -211,10 +223,12 @@ module Milkode
211
223
  @grndb.yaml_sync(@yaml.contents)
212
224
  end
213
225
 
214
- def convert_content(src)
226
+ def convert_content(src, options)
215
227
  # httpファイルならダウンロード
216
228
  begin
217
- src = download_file(src)
229
+ src = download_file(src, options)
230
+ rescue AddError => e
231
+ raise e
218
232
  rescue => e
219
233
  error_alert("download failure '#{src}'.")
220
234
  raise e # そのまま上に持ち上げてスタックトレース表示
@@ -245,21 +259,19 @@ module Milkode
245
259
  end
246
260
  end
247
261
 
248
- def download_file(src)
249
- if (src =~ /^https?:/)
262
+ def download_file(src, options)
263
+ if git_protocol?(options, src)
264
+ git_clone_in(src, options)
265
+ elsif svn_protocol?(options, src)
266
+ svn_clone_in(src, options)
267
+ elsif src =~ /^https?:/
250
268
  download_file_in(src)
251
- elsif (git_url? src)
252
- git_clone_in(src)
253
269
  else
270
+ raise AddError, "'--name' option is not available in local directory." if options[:name]
254
271
  src
255
272
  end
256
273
  end
257
274
 
258
- def git_url?(src)
259
- Util::git_url?(src)
260
- end
261
- private :git_url?
262
-
263
275
  def download_file_in(url)
264
276
  alert("download", "#{url}")
265
277
 
@@ -277,13 +289,12 @@ module Milkode
277
289
  filename
278
290
  end
279
291
 
280
- def git_clone_in(url)
292
+ def git_clone_in(url, options)
281
293
  alert("git", url)
282
294
 
283
- dst_dir = File.join(@db_dir, "packages/git")
284
- # FileUtils.mkdir_p dst_dir
285
-
286
- filename = File.join(dst_dir, File.basename(url).sub(/\.git\Z/, ""))
295
+ dst_dir = File.join(@db_dir, "packages/git")
296
+ name = options[:name] || File.basename(url).sub(/\.git\Z/, "")
297
+ filename = File.join(dst_dir, name)
287
298
 
288
299
  # git output progress to stderr.
289
300
  # `git clone #{url} #{filename} 2>&1`
@@ -294,6 +305,19 @@ module Milkode
294
305
  filename
295
306
  end
296
307
 
308
+ def svn_clone_in(url, options)
309
+ alert("svn", url)
310
+
311
+ dst_dir = File.join(@db_dir, "packages/svn")
312
+ name = options[:name] || File.basename(url)
313
+ filename = File.join(dst_dir, name)
314
+
315
+ # with output
316
+ system("svn checkout #{url} #{filename}")
317
+
318
+ filename
319
+ end
320
+
297
321
  def remove_all
298
322
  print_result do
299
323
  list([], {:verbose => true})
@@ -301,9 +325,19 @@ module Milkode
301
325
  if yes_or_no("Remove #{@yaml.contents.size} contents? (yes/no)")
302
326
  db_open
303
327
 
304
- @yaml.contents.each do |package|
305
- remove_dir(package.directory)
328
+ # documents
329
+ @documents.remove_all do |record|
330
+ alert_info("rm_record", record.path)
331
+ @file_count += 1
306
332
  end
333
+
334
+ # packages
335
+ @grndb.packages.remove_all
336
+
337
+ # yaml
338
+ @package_count += @yaml.contents.size
339
+ @yaml.remove_all
340
+ @yaml.save
307
341
  else
308
342
  return
309
343
  end
@@ -453,7 +487,16 @@ module Milkode
453
487
  @out.puts dir
454
488
  else
455
489
  package = @yaml.package_root(File.expand_path('.'))
456
- name = package ? package.name : "'not_package_dir'"
490
+
491
+ name = ""
492
+ if package
493
+ name = package.name
494
+ elsif Dbdir.dbdir?
495
+ name = 'On database'
496
+ else
497
+ name = 'Not package dir'
498
+ end
499
+
457
500
  @out.puts "#{name} in #{dir}"
458
501
  end
459
502
  else
@@ -907,6 +950,14 @@ EOF
907
950
 
908
951
  private
909
952
 
953
+ def git_protocol?(options, src)
954
+ options[:protocol] == 'git' || Util::git_url?(src)
955
+ end
956
+
957
+ def svn_protocol?(options, src)
958
+ options[:protocol] == 'svn' || Util::svn_url?(src)
959
+ end
960
+
910
961
  def db_file
911
962
  Dbdir.expand_groonga_path(@db_dir)
912
963
  end
@@ -920,7 +971,7 @@ EOF
920
971
  end
921
972
 
922
973
  def update_package_in(package, options)
923
- updater_exec(package, package.options[:update_with_git_pull], options[:no_clean])
974
+ updater_exec(package, package.options[:update_with_git_pull], package.options[:update_with_svn_update], options[:no_clean])
924
975
  end
925
976
 
926
977
  def update_dir_in(dir)
@@ -930,20 +981,21 @@ EOF
930
981
  warning_alert("#{dir} (Not found, skip)")
931
982
  else
932
983
  package = @yaml.package_root(dir)
933
- updater_exec(package, false, false)
984
+ updater_exec(package, false, false, false)
934
985
  end
935
986
  end
936
987
 
937
- def updater_exec(package, is_update_with_git_pull, is_no_clean)
988
+ def updater_exec(package, is_update_with_git_pull, is_update_with_svn_update, is_no_clean)
938
989
  alert("package", package.name )
939
990
 
940
991
  updater = Updater.new(@grndb, package.name)
941
992
  updater.set_package_ignore IgnoreSetting.new("/", package.ignore)
942
- updater.enable_no_auto_ignore if package.options[:no_auto_ignore]
943
- updater.enable_silent_mode if @is_silent
944
- updater.enable_display_info if @is_display_info
945
- updater.enable_update_with_git_pull if is_update_with_git_pull
946
- updater.enable_no_clean if is_no_clean
993
+ updater.enable_no_auto_ignore if package.options[:no_auto_ignore]
994
+ updater.enable_silent_mode if @is_silent
995
+ updater.enable_display_info if @is_display_info
996
+ updater.enable_update_with_git_pull if is_update_with_git_pull
997
+ updater.enable_update_with_svn_update if is_update_with_svn_update
998
+ updater.enable_no_clean if is_no_clean
947
999
  updater.exec
948
1000
 
949
1001
  @package_count += 1
@@ -54,6 +54,12 @@ EOF
54
54
  update_contents
55
55
  end
56
56
 
57
+ # 全てのパッケージを削除
58
+ def remove_all
59
+ @contents = []
60
+ update_contents
61
+ end
62
+
57
63
  # 名前が同じパッケージを検索
58
64
  def find_name(name)
59
65
  @contents.find {|v| v.same_name?(name)}
@@ -76,6 +76,10 @@ module Milkode
76
76
  @data.remove package
77
77
  end
78
78
 
79
+ def remove_all
80
+ @data.remove_all
81
+ end
82
+
79
83
  def package_root(dir)
80
84
  @data.package_root(dir)
81
85
  end
@@ -22,7 +22,7 @@ set :haml, :format => :html5
22
22
 
23
23
  get '/' do
24
24
  @setting = WebSetting.new
25
- @version = "0.9.5"
25
+ @version = "0.9.6"
26
26
  @package_num = Database.instance.yaml_package_num
27
27
  @file_num = Database.instance.totalRecords
28
28
  @package_list = PackageList.new(Database.instance.grndb)
@@ -136,7 +136,7 @@ helpers do
136
136
 
137
137
  <<EOF
138
138
  <select name="shead" id="shead">
139
- #{data.map{|v| "<option value='#{v[0]}' #{v[0] == value ? 'selected' : ''}>#{v[1]}</option>"}}
139
+ #{data.map{|v| "<option value='#{v[0]}' #{v[0] == value ? 'selected' : ''}>#{v[1]}</option>"}.join}
140
140
  </select>
141
141
  EOF
142
142
  end
@@ -148,7 +148,7 @@ EOF
148
148
 
149
149
  <<EOF
150
150
  <select name="package" id="package" onchange="select_package()">
151
- #{data.map{|v| "<option value='#{v}' #{v == value ? 'selected' : ''}>#{v}</option>"}}
151
+ #{data.map{|v| "<option value='#{v}' #{v == value ? 'selected' : ''}>#{v}</option>"}.join}
152
152
  </select>
153
153
  EOF
154
154
  end
@@ -159,7 +159,7 @@ EOF
159
159
 
160
160
  <<EOF
161
161
  <select name="package" id="package_home" onchange="select_package_home()">
162
- #{data.map{|v| "<option value='#{v}' #{v == value ? 'selected' : ''}>#{v}</option>"}}
162
+ #{data.map{|v| "<option value='#{v}' #{v == value ? 'selected' : ''}>#{v}</option>"}.join}
163
163
  </select>
164
164
  EOF
165
165
  end
@@ -183,7 +183,7 @@ EOF
183
183
 
184
184
  <<EOF
185
185
  #{headicon('go-home-5.png')} <a href="/home" class="headmenu">ホーム</a>
186
- #{headicon('document-new-4.png')} <a href="#{href}" class="headmenu" onclick="window.open('#{href}'); return false;">タブを複製</a>
186
+ #{headicon('document-new-4.png')} <a href="#{href}" class="headmenu" onclick="window.open(document.URL); return false;">タブを複製</a>
187
187
  #{headicon('directory.png')} <a href="#{flist}" class="headmenu">ディレクトリ</a>
188
188
  #{headicon('view-refresh-4.png')} <a href="#updateModal" class="headmenu" data-toggle="modal">パッケージを更新</a>
189
189
  #{headicon('help.png')} <a href="/help" class="headmenu">ヘルプ</a>
@@ -10,6 +10,7 @@ require 'milkode/cdweb/lib/coderay_wrapper'
10
10
  require 'milkode/cdweb/lib/search_contents'
11
11
  require 'milkode/cdweb/lib/search_files'
12
12
  require 'milkode/cdweb/lib/search_gotoline'
13
+ require 'milkode/cdweb/lib/search_fuzzy_gotoline'
13
14
  require 'milkode/cdweb/lib/mkurl'
14
15
  require 'milkode/common/util'
15
16
 
@@ -52,11 +53,22 @@ module Milkode
52
53
  query = Query.new(params[:query])
53
54
  @title = "'#{query.query_string}' in #{path_title(path)}"
54
55
 
55
- if (query.keywords.size > 0)
56
- if Util::gotoline_keyword? query.keywords[0]
56
+ if (query.gotolines.size > 0)
57
+ searcher = SearchFuzzyGotoLine.new(path, params, query)
58
+
59
+ if searcher.directjump?
60
+ redirect searcher.directjump_url
61
+ end
62
+
63
+ elsif (query.keywords.size > 0)
64
+ if Util::gotoline_keyword?(query.keywords[0])
57
65
  searcher = SearchGotoLine.new(path, params, query)
58
66
  else
59
67
  searcher = SearchContents.new(path, params, query)
68
+
69
+ if searcher.directjump?
70
+ redirect searcher.directjump_url
71
+ end
60
72
  end
61
73
  else
62
74
  searcher = SearchFiles.new(path, params, query)
@@ -114,8 +126,12 @@ module Milkode
114
126
  private
115
127
 
116
128
  def file_or_dirimg(is_file)
117
- src = (is_file) ? '/images/file.png' : '/images/directory.png'
118
- "<img alt='' style='vertical-align:bottom; border: 0; margin: 1px;' src='#{src}'>"
129
+ src = (is_file) ? 'file.png' : 'directory.png'
130
+ img_icon(src)
131
+ end
132
+
133
+ def img_icon(srcfile)
134
+ "<img alt='' style='vertical-align:bottom; border: 0; margin: 1px;' src='/images/#{srcfile}'>"
119
135
  end
120
136
 
121
137
  def sort_change_content(current_value, text, sort_kind = nil)