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
@@ -17,12 +17,18 @@ module Milkode
17
17
  :header_title => "Milkode",
18
18
  :header_icon => "/images/MilkodeIcon135.png",
19
19
 
20
+ :favicon => "/images/favicon.ico",
21
+
20
22
  :display_about_milkode => true
21
23
  }
22
24
 
23
25
  def self.hash_method(name)
24
26
  define_method(name) do
25
- @data[name]
27
+ if @data[name]
28
+ @data[name]
29
+ else
30
+ DEFAULT_SETTING[name]
31
+ end
26
32
  end
27
33
  end
28
34
 
@@ -43,6 +49,8 @@ module Milkode
43
49
  hash_method :header_title
44
50
  hash_method :header_icon
45
51
 
52
+ hash_method :favicon
53
+
46
54
  def about_milkode
47
55
  if (@data[:display_about_milkode])
48
56
  ', <a href="http://milkode.ongaeshi.me">milkodeについて</a>'
@@ -31,6 +31,11 @@ dt.result-file {
31
31
  font-size: 95%;
32
32
  }
33
33
 
34
+ #result-refinement {
35
+ font-size:80%;
36
+ font-weight:500;
37
+ }
38
+
34
39
  div.pagination {
35
40
  /* border-color: #e92926; */
36
41
  /* background-color:#FFF0F0; */
@@ -7,8 +7,7 @@ function escapeHTML(str) {
7
7
  return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
8
8
  }
9
9
 
10
- function replace_query_param(url, value)
11
- {
10
+ function replace_query_param(url, value) {
12
11
  var url_s = url.split("?");
13
12
 
14
13
  if (url_s.length <= 1) {
@@ -35,22 +34,19 @@ function replace_query_param(url, value)
35
34
  }
36
35
  }
37
36
 
38
- function topic_path(id)
39
- {
37
+ function topic_path(id) {
40
38
  var url = document.getElementById(id).href;
41
39
  url = replace_query_param(url, document.searchform.query.value);
42
40
  document.getElementById(id).href = url;
43
41
  }
44
42
 
45
- function repalce_package_name(url, package_name)
46
- {
43
+ function repalce_package_name(url, package_name) {
47
44
  var url_s = url.split("?");
48
45
  url = url_s[0].replace(/\/home(\/.*)?/, "/home/" + package_name); // home以下をパッケージ名に置き換え
49
46
  return url;
50
47
  }
51
48
 
52
- function select_package()
53
- {
49
+ function select_package() {
54
50
  var url = document.URL;
55
51
  var name = document.getElementById('package').value;
56
52
 
@@ -62,8 +58,7 @@ function select_package()
62
58
  document.location = url;
63
59
  }
64
60
 
65
- function select_package_home()
66
- {
61
+ function select_package_home() {
67
62
  var url = document.URL.replace(/\/$/, "");
68
63
  var name = document.getElementById('package_home').value;
69
64
 
@@ -74,40 +69,7 @@ function select_package_home()
74
69
  document.location = url + "/home/" + name;
75
70
  }
76
71
 
77
- $(document).ready(function(){
78
- $("select#package").multiselect({
79
- multiple: false,
80
- header: "",
81
- selectedList: 1,
82
- height: 450
83
- }).multiselectfilter();
84
-
85
- $("select#package_home").multiselect({
86
- multiple: false,
87
- header: "",
88
- selectedList: 1,
89
- height: 350
90
- }).multiselectfilter();
91
-
92
- $("#updateOk").click(function (e) {
93
- update_package($("#updateOk").attr("milkode-package-name"));
94
- return false;
95
- });
96
-
97
- var match = document.URL.match(/.+(#n\d+)$/);
98
- if ( match ) {
99
- $(match[1]).addClass("select-line");
100
- } else {
101
- $("#query").select();
102
- }
103
-
104
- $('#query').click(function(){
105
- $(this).select();
106
- });
107
- });
108
-
109
- function update_package(package_name)
110
- {
72
+ function update_package(package_name) {
111
73
  // click button
112
74
  $("#updateModal .modal-body").html("<h4>更新中... <img src='/images/waiting.gif'/></h4>");
113
75
  $("#updateCancel").addClass("hide");
@@ -127,8 +89,7 @@ function update_package(package_name)
127
89
  );
128
90
  }
129
91
 
130
- function clippy_text(text, bgcolor)
131
- {
92
+ function clippy_text(text, bgcolor) {
132
93
  return ' <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' +
133
94
  ' width="110"' +
134
95
  ' height="14"' +
@@ -153,8 +114,7 @@ function clippy_text(text, bgcolor)
153
114
  ' </object>';
154
115
  }
155
116
 
156
- function lineno_setup(path, lineno)
157
- {
117
+ function lineno_setup(path, lineno) {
158
118
  var n_lineno = "#n" + lineno;
159
119
 
160
120
  // scroll reset
@@ -176,3 +136,41 @@ function lineno_setup(path, lineno)
176
136
  $("#lineno-copyall").html("Lineno + Text" + clippy_text(directpath + " " + escapeHTML(n_lineno_dom.text()), '#F5F5F5'));
177
137
  }
178
138
 
139
+ $(document).ready(function() {
140
+ $("select#package").multiselect({
141
+ multiple: false,
142
+ header: "",
143
+ selectedList: 1,
144
+ height: 450
145
+ }).multiselectfilter();
146
+
147
+ $("select#package_home").multiselect({
148
+ multiple: false,
149
+ header: "",
150
+ selectedList: 1,
151
+ height: 350
152
+ }).multiselectfilter();
153
+
154
+ $("#updateOk").click(function (e) {
155
+ update_package($("#updateOk").attr("milkode-package-name"));
156
+ return false;
157
+ });
158
+
159
+ var match = document.URL.match(/.+(#n\d+)$/);
160
+ if ( match ) {
161
+ $(match[1]).addClass("select-line");
162
+ } else {
163
+ $("#query").select();
164
+ }
165
+
166
+ $('#query').click(function(){
167
+ $(this).select();
168
+ });
169
+
170
+ $('#shead').change(function(){
171
+ $('#search').click();
172
+ });
173
+ });
174
+
175
+
176
+
@@ -6,6 +6,7 @@
6
6
  %head
7
7
  %meta(charset='utf-8')
8
8
  %title= [@title, @setting.home_title].compact.join(' - ')
9
+ %link(rel="shortcut icon" href="#{@setting.favicon}")
9
10
  %link(rel="stylesheet" href="/css/bootstrap.min.css" type="text/css" media="all")
10
11
  %link(rel="stylesheet" href="/css/bootstrap-responsive.min.css" type="text/css" media="all")
11
12
  %link(rel="stylesheet" href="/css/milkode.css" type="text/css" media="all")
@@ -33,9 +33,12 @@ Samples:
33
33
  milk add http://example.com/urlfile.zip
34
34
  milk add git://github.com/ongaeshi/milkode.git
35
35
  EOF
36
- option :empty, :type => :boolean, :desc => 'Add empty package.'
37
- option :ignore, :type => :array, :aliases => '-i', :desc => 'Ignore path.'
38
- option :no_auto_ignore, :type => :boolean, :aliases => '-n', :desc => 'Disable auto ignore.'
36
+ option :empty, :type => :boolean, :desc => 'Add empty package.'
37
+ option :ignore, :type => :array, :aliases => '-i', :desc => 'Ignore path.'
38
+ option :name, :type => :string, :aliases => '-n', :desc => 'Rename package.'
39
+ option :no_auto_ignore, :type => :boolean, :aliases => '--ni', :desc => 'Disable auto ignore.'
40
+ option :protocol, :type => :string, :aliases => '-p', :desc => 'Specify protocol. (git, svn)'
41
+
39
42
  option :verbose, :type => :boolean, :aliases => '-v', :desc => 'Be verbose.'
40
43
 
41
44
  def add(*args)
@@ -116,6 +116,10 @@ module Milkode
116
116
  keyword =~ /\A\/.*:\d+\Z/
117
117
  end
118
118
 
119
+ def fuzzy_gotoline_keyword?(keyword)
120
+ keyword =~ /\A.*:\d+\Z/
121
+ end
122
+
119
123
  # parse_gotoline(['a', '123', 'b']) #=> [['a', 'b'], 123]]
120
124
  # parse_gotoline(['a', '123', 'b', 55]) #=> [['a', 'b', '123'], 55]]
121
125
  # parse_gotoline(['a:5']) #=> [['a'], 55]]
@@ -179,6 +183,10 @@ module Milkode
179
183
  (src =~ /^(:?git[:@])|(:?ssh:)/) != nil
180
184
  end
181
185
 
186
+ def svn_url?(src)
187
+ (src =~ /^(:?svn|svn\+ssh):\/\//) != nil
188
+ end
189
+
182
190
  # StringIO patch
183
191
  def pipe?(io)
184
192
  !io.instance_of?(IO) || !File.pipe?(io)
@@ -187,6 +195,17 @@ module Milkode
187
195
  def warning_alert(out, msg)
188
196
  out.puts "[warning] #{msg}"
189
197
  end
198
+
199
+ def load_content(out, filename)
200
+ str = File.read(filename)
201
+ begin
202
+ Kconv.kconv(str, Kconv::UTF8)
203
+ rescue ArgumentError
204
+ warning_alert(out, "skip kconv. file size too big (or negative string size) : #{filename}.")
205
+ str
206
+ end
207
+ end
208
+
190
209
  end
191
210
  end
192
211
 
@@ -33,6 +33,37 @@ module Milkode
33
33
  end
34
34
  end
35
35
  end
36
+
37
+ # レコードをまとめて削除する
38
+ # 検索結果にマッチしたレコード等をまとめて削除
39
+ # 削除前にインデックスを削除し、削除後にインデックスを再度追加してい
40
+ # 大量のレコードを削除する場合に高速に動作する
41
+ def remove_records(records, &block)
42
+ Groonga::Schema.define do |schema|
43
+ schema.change_table("terms") do |table|
44
+ table.remove_index("documents.path")
45
+ table.remove_index("documents.package")
46
+ table.remove_index("documents.restpath")
47
+ table.remove_index("documents.content")
48
+ table.remove_index("documents.suffix")
49
+ end
50
+ end
51
+
52
+ records.each do |record|
53
+ yield record if block
54
+ record.key.delete
55
+ end
56
+
57
+ Groonga::Schema.define do |schema|
58
+ schema.change_table("terms") do |table|
59
+ table.index("documents.path", :with_position => true)
60
+ table.index("documents.package", :with_position => true)
61
+ table.index("documents.restpath", :with_position => true)
62
+ table.index("documents.content", :with_position => true)
63
+ table.index("documents.suffix", :with_position => true)
64
+ end
65
+ end
66
+ end
36
67
 
37
68
  def initialize(table)
38
69
  @table = table
@@ -94,19 +125,12 @@ module Milkode
94
125
  @table[name].delete
95
126
  end
96
127
 
97
- def remove_match_path(path)
98
- result = search(:paths => [path])
99
-
100
- result.each do |r|
101
- yield r if block_given?
102
- r.record_id.delete
103
- end
128
+ def remove_match_path(path, &block)
129
+ remove_records(search(:paths => [path]), &block)
104
130
  end
105
131
 
106
- def remove_all
107
- self.each do |r|
108
- r.record_id.delete
109
- end
132
+ def remove_all(&block)
133
+ remove_records(@table.select, &block)
110
134
  end
111
135
 
112
136
  # shortpathの一致するレコードを取得
@@ -137,7 +161,7 @@ module Milkode
137
161
  unless File.exist? r.path
138
162
  yield r if block_given?
139
163
  # p r.restpath
140
- r.record_id.delete
164
+ remove(r.path)
141
165
  end
142
166
  end
143
167
  end
@@ -301,16 +325,16 @@ module Milkode
301
325
  end
302
326
 
303
327
  # 指定されたパッケージのクリーンアップ
304
- def cleanup_package_name(package)
328
+ def cleanup_package_name(package_name)
305
329
  # クリーンアップ対象のファイルを検索
306
- result = @table.select { |record| record.package == package }
330
+ result = @table.select { |record| record.package == package_name }
307
331
 
308
332
  # 存在しないファイルの削除
309
333
  result.each do |r|
310
334
  unless File.exist? r.path
311
335
  yield r if block_given?
312
336
  # p r.restpath
313
- r.record_id.delete
337
+ remove(r.path)
314
338
  end
315
339
  end
316
340
  end
@@ -334,13 +358,7 @@ module Milkode
334
358
  private
335
359
 
336
360
  def load_content(filename)
337
- str = File.read(filename)
338
- begin
339
- Kconv.kconv(str, Kconv::UTF8)
340
- rescue ArgumentError
341
- Util.warning_alert($stdout, "skip kconv. file size too big (or negative string size) : #{filename}.")
342
- str
343
- end
361
+ Util::load_content($stdout, filename)
344
362
  end
345
363
 
346
364
  def package_expression(record, packages)
@@ -44,7 +44,7 @@ module Milkode
44
44
 
45
45
  def remove_all
46
46
  self.each do |r|
47
- r.record_id.delete
47
+ remove(r.name)
48
48
  end
49
49
  end
50
50
 
@@ -30,6 +30,11 @@ module Milkode
30
30
  Dir.chdir(@package.directory) { system("git pull") }
31
31
  end
32
32
 
33
+ # svn update
34
+ if @options[:update_with_svn_update]
35
+ Dir.chdir(@package.directory) { system("svn update") }
36
+ end
37
+
33
38
  # cleanup
34
39
  unless @options[:no_clean]
35
40
  @grndb.documents.cleanup_package_name(@package_name)
@@ -62,6 +67,10 @@ module Milkode
62
67
  @options[:update_with_git_pull] = true
63
68
  end
64
69
 
70
+ def enable_update_with_svn_update
71
+ @options[:update_with_svn_update] = true
72
+ end
73
+
65
74
  def enable_no_clean
66
75
  @options[:no_clean] = true
67
76
  end
@@ -209,14 +218,12 @@ module Milkode
209
218
  end
210
219
 
211
220
  def add_current_gitignore(dirname, path)
212
- git_ignore = File.join(dirname, path, ".gitignore")
221
+ filename = File.join(dirname, path, ".gitignore")
213
222
 
214
- if File.exist? git_ignore
215
- alert_info("add_ignore", git_ignore)
216
-
217
- open(git_ignore) do |f|
218
- @current_ignore.add IgnoreSetting.create_from_gitignore(path, f.read)
219
- end
223
+ if File.exist? filename
224
+ alert_info("add_ignore", filename)
225
+ str = Util::load_content($stdout, filename)
226
+ @current_ignore.add IgnoreSetting.create_from_gitignore(path, str)
220
227
  end
221
228
  end
222
229
 
@@ -20,6 +20,7 @@ module FindGrep
20
20
  :directory,
21
21
  :depth,
22
22
  :ignoreCase,
23
+ :caseSensitive,
23
24
  :colorHighlight,
24
25
  :isSilent,
25
26
  :debugMode,
@@ -47,6 +48,7 @@ module FindGrep
47
48
  false,
48
49
  false,
49
50
  false,
51
+ false,
50
52
  [],
51
53
  [],
52
54
  [],
@@ -68,15 +70,15 @@ module FindGrep
68
70
  attr_reader :documents
69
71
 
70
72
  def initialize(patterns, option)
71
- @patterns = patterns
72
- @option = option
73
- @patternRegexps = strs2regs(patterns, @option.ignoreCase)
74
- @subRegexps = strs2regs(option.patternsNot, @option.ignoreCase)
75
- @orRegexps = strs2regs(option.patternsOr, @option.ignoreCase)
76
- @filePatterns = (!@option.dbFile) ? strs2regs(option.filePatterns) : []
77
- @ignoreFiles = strs2regs(option.ignoreFiles)
78
- @ignoreDirs = strs2regs(option.ignoreDirs)
79
- @result = Result.new(option.directory)
73
+ @patterns = patterns
74
+ @option = option
75
+ @patternRegexps = strs2regs(patterns)
76
+ @subRegexps = strs2regs(option.patternsNot)
77
+ @orRegexps = strs2regs(option.patternsOr)
78
+ @filePatterns = (!@option.dbFile) ? strs2regs_simple(option.filePatterns) : []
79
+ @ignoreFiles = strs2regs_simple(option.ignoreFiles)
80
+ @ignoreDirs = strs2regs_simple(option.ignoreDirs)
81
+ @result = Result.new(option.directory)
80
82
  open_database if (@option.dbFile)
81
83
  end
82
84
 
@@ -97,18 +99,28 @@ module FindGrep
97
99
  end
98
100
  end
99
101
 
100
- def strs2regs(strs, ignore = false)
102
+ def strs2regs(strs)
101
103
  regs = []
102
104
 
103
105
  strs.each do |v|
104
106
  option = 0
105
- option |= Regexp::IGNORECASE if (ignore)
107
+ option |= Regexp::IGNORECASE if (@option.ignoreCase || (!@option.caseSensitive && Milkode::Util::downcase?(v)))
106
108
  regs << Regexp.new(v, option)
107
109
  end
108
110
 
109
111
  regs
110
112
  end
111
113
 
114
+ def strs2regs_simple(strs)
115
+ regs = []
116
+
117
+ strs.each do |v|
118
+ regs << Regexp.new(v, 0)
119
+ end
120
+
121
+ regs
122
+ end
123
+
112
124
  def searchAndPrint(stdout)
113
125
  unless (@option.dbFile)
114
126
  searchFromDir(stdout, @option.directory, 0)