milkode 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.ja.rdoc +24 -0
- data/HISTORY.rdoc +24 -0
- data/VERSION +1 -1
- data/bin/gmilk +1 -1
- data/bin/milk +1 -1
- data/lib/milkode/cdstk/cdstk.rb +164 -56
- data/lib/milkode/cdstk/milkode_yaml.rb +15 -4
- data/lib/milkode/cdstk/yaml_file_wrapper.rb +8 -0
- data/lib/milkode/cdweb/app.rb +2 -2
- data/lib/milkode/cdweb/lib/database.rb +8 -0
- data/lib/milkode/cdweb/lib/search_contents.rb +31 -14
- data/lib/milkode/cdweb/lib/search_files.rb +4 -1
- data/lib/milkode/cdweb/views/milkode.js +3 -3
- data/lib/milkode/cdweb/views/milkode.scss +10 -0
- data/lib/milkode/cli.rb +24 -3
- data/lib/milkode/common/util.rb +23 -0
- data/lib/milkode/database/document_table.rb +30 -24
- data/lib/milkode/database/updater.rb +38 -3
- data/milkode.gemspec +2 -2
- data/test/test_cdstk.rb +3 -3
- data/test/test_milkode_yaml.rb +27 -0
- data/test/test_updater.rb +1 -2
- metadata +4 -4
data/HISTORY.ja.rdoc
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
=== 1.2.0 2013/08/07
|
2
|
+
|
3
|
+
* milk web
|
4
|
+
* Hightlight filename keywords
|
5
|
+
* Not show file infomation when same file name continue
|
6
|
+
* Delete auto search feature 'w:0' and 'fp:a b'
|
7
|
+
* Bugfix relative URL (clippy, 同名ファイルへのリンク) (thanks nicklegr)
|
8
|
+
|
9
|
+
* milk
|
10
|
+
* milk update
|
11
|
+
* Remove ignored files with update
|
12
|
+
* milk ignore
|
13
|
+
* Support global ignore. 'milk ignore --global ~/.gitignore'
|
14
|
+
* milk config
|
15
|
+
* Add 'milk config KEY VALUE' command.
|
16
|
+
* e.g. 'milk config update_with_ctags_e true'
|
17
|
+
* milk remove
|
18
|
+
* Faster DocumentTable#remove_records
|
19
|
+
* Not remove package non exist filename
|
20
|
+
* milk cleanup
|
21
|
+
* Add milk cleanup options. -p, -a
|
22
|
+
* milk add
|
23
|
+
* 'milk add' can't use already exist package
|
24
|
+
|
1
25
|
=== 1.1.0 2013/06/26
|
2
26
|
|
3
27
|
* milk web
|
data/HISTORY.rdoc
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
=== 1.2.0 2013/08/07
|
2
|
+
|
3
|
+
* milk web
|
4
|
+
* Hightlight filename keywords
|
5
|
+
* Not show file infomation when same file name continue
|
6
|
+
* Delete auto search feature 'w:0' and 'fp:a b'
|
7
|
+
* Bugfix relative URL (clippy, Link for same file name) (thanks nicklegr)
|
8
|
+
|
9
|
+
* milk
|
10
|
+
* milk update
|
11
|
+
* Remove ignored files with update
|
12
|
+
* milk ignore
|
13
|
+
* Support global ignore. 'milk ignore --global ~/.gitignore'
|
14
|
+
* milk config
|
15
|
+
* Add 'milk config KEY VALUE' command.
|
16
|
+
* e.g. 'milk config update_with_ctags_e true'
|
17
|
+
* milk remove
|
18
|
+
* Faster DocumentTable#remove_records
|
19
|
+
* Not remove package non exist filename
|
20
|
+
* milk cleanup
|
21
|
+
* Add milk cleanup options. -p, -a
|
22
|
+
* milk add
|
23
|
+
* 'milk add' can't use already exist package
|
24
|
+
|
1
25
|
=== 1.1.0 2013/06/26
|
2
26
|
|
3
27
|
* milk web
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/bin/gmilk
CHANGED
data/bin/milk
CHANGED
data/lib/milkode/cdstk/cdstk.rb
CHANGED
@@ -1,42 +1,38 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
require 'yaml'
|
4
|
-
require 'pathname'
|
5
|
-
require 'rubygems'
|
6
3
|
require 'fileutils'
|
7
|
-
require 'pathname'
|
8
|
-
require 'milkode/common/grenfiletest'
|
9
|
-
require 'milkode/common/util'
|
10
|
-
require 'milkode/common/dir'
|
11
|
-
include Milkode
|
12
4
|
require 'kconv'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'pathname'
|
7
|
+
require 'rubygems'
|
8
|
+
require 'yaml'
|
13
9
|
begin
|
14
10
|
require 'readline'
|
15
11
|
rescue LoadError
|
16
12
|
$no_readline = true
|
17
13
|
end
|
18
|
-
require 'open-uri'
|
19
14
|
require 'milkode/cdstk/cdstk_command'
|
20
|
-
require 'milkode/cdstk/yaml_file_wrapper'
|
21
15
|
require 'milkode/cdstk/package'
|
16
|
+
require 'milkode/cdstk/yaml_file_wrapper'
|
17
|
+
require 'milkode/common/array_diff'
|
18
|
+
require 'milkode/common/dir'
|
19
|
+
require 'milkode/common/grenfiletest'
|
22
20
|
require 'milkode/common/ignore_checker'
|
23
|
-
require 'milkode/
|
21
|
+
require 'milkode/common/plang_detector'
|
22
|
+
require 'milkode/common/util'
|
24
23
|
require 'milkode/database/document_record'
|
25
|
-
require 'milkode/
|
24
|
+
require 'milkode/database/groonga_database'
|
26
25
|
require 'milkode/database/updater'
|
27
|
-
require 'milkode/common/plang_detector'
|
28
26
|
|
29
27
|
module Milkode
|
30
28
|
class IgnoreError < RuntimeError ; end
|
31
29
|
class AddError < RuntimeError ; end
|
32
30
|
class ConvertError < RuntimeError ; end
|
33
31
|
|
32
|
+
|
34
33
|
class Cdstk
|
35
|
-
#
|
36
|
-
#
|
37
|
-
|
38
|
-
# 記号・アルファベット・数字もバイグラムでトークナイズする。
|
39
|
-
DEFAULT_TOKENIZER = "TokenBigramSplitSymbolAlphaDigit"
|
34
|
+
# Parameters
|
35
|
+
CONFIG_LJUST = 20 # Display parameter for 'milk config'
|
40
36
|
|
41
37
|
def initialize(io = $stdout, db_dir = ".")
|
42
38
|
@db_dir = db_dir
|
@@ -198,28 +194,23 @@ module Milkode
|
|
198
194
|
update_dir_in(dir)
|
199
195
|
end
|
200
196
|
|
201
|
-
# yamlにパッケージを追加
|
202
197
|
def add_yaml(package)
|
203
|
-
#
|
198
|
+
# Already exist package
|
204
199
|
if @yaml.find_name(package.name)
|
205
|
-
|
206
|
-
return
|
200
|
+
raise AddError, "package named '#{package.name}' already exist."
|
207
201
|
end
|
208
202
|
|
209
|
-
#
|
203
|
+
# File not exist
|
210
204
|
unless File.exist?(package.directory)
|
211
|
-
|
212
|
-
return
|
205
|
+
raise AddError, "not found '#{package.directory}'."
|
213
206
|
end
|
214
207
|
|
215
|
-
#
|
208
|
+
# Save yaml
|
216
209
|
@yaml.add(package)
|
217
210
|
@yaml.save
|
218
211
|
|
219
|
-
#
|
212
|
+
# Sync yaml -> db
|
220
213
|
db_open
|
221
|
-
|
222
|
-
# yamlファイルと同期する
|
223
214
|
@grndb.yaml_sync(@yaml.contents)
|
224
215
|
end
|
225
216
|
|
@@ -357,7 +348,7 @@ module Milkode
|
|
357
348
|
|
358
349
|
unless package
|
359
350
|
path = File.expand_path(arg)
|
360
|
-
package = @yaml.package_root(path)
|
351
|
+
package = @yaml.package_root(path) if File.exist?(path)
|
361
352
|
end
|
362
353
|
|
363
354
|
if (package)
|
@@ -520,25 +511,62 @@ module Milkode
|
|
520
511
|
end
|
521
512
|
end
|
522
513
|
|
523
|
-
def cleanup(options)
|
524
|
-
|
525
|
-
if (options[:force] or yes_or_no("cleanup contents? (yes/no)"))
|
526
|
-
print_result do
|
527
|
-
# yamlファイルのクリーンアップ
|
528
|
-
@yaml.contents.find_all {|v| !File.exist? v.directory }.each do |p|
|
529
|
-
@yaml.remove(p)
|
530
|
-
alert("rm_package", p.directory)
|
531
|
-
@package_count += 1
|
532
|
-
end
|
533
|
-
@yaml.save
|
514
|
+
def cleanup(args, options)
|
515
|
+
update_display_info(options)
|
534
516
|
|
535
|
-
|
517
|
+
if (options[:all])
|
518
|
+
cleanup_all(options)
|
519
|
+
elsif (options[:packages])
|
520
|
+
cleanup_packages
|
521
|
+
else
|
522
|
+
print_result do
|
536
523
|
db_open
|
524
|
+
args.each do |arg|
|
525
|
+
package = @yaml.find_name(arg) || @yaml.find_dir(arg)
|
537
526
|
|
538
|
-
|
539
|
-
|
527
|
+
unless package
|
528
|
+
path = File.expand_path(arg)
|
529
|
+
package = @yaml.package_root(path) if File.exist?(path)
|
530
|
+
end
|
531
|
+
|
532
|
+
if (package)
|
533
|
+
@documents.cleanup_package_name(package.name) # TODO: Support ignore_checker
|
534
|
+
else
|
535
|
+
@out.puts "Not found package '#{arg}'."
|
536
|
+
return
|
537
|
+
end
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
# Remove non exist pakcages
|
544
|
+
def cleanup_packages
|
545
|
+
print_result do
|
546
|
+
cleanup_packages_in
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
def cleanup_packages_in
|
551
|
+
@yaml.contents.find_all {|v| !File.exist? v.directory }.each do |p|
|
552
|
+
@yaml.remove(p)
|
553
|
+
alert("rm_package", p.directory)
|
554
|
+
@package_count += 1
|
555
|
+
end
|
556
|
+
@yaml.save
|
557
|
+
|
558
|
+
db_open
|
559
|
+
|
560
|
+
@grndb.yaml_sync(@yaml.contents)
|
561
|
+
end
|
562
|
+
|
563
|
+
def cleanup_all(options)
|
564
|
+
if (options[:force] or yes_or_no("cleanup contents? (yes/no)"))
|
565
|
+
print_result do
|
566
|
+
# Remove non exist packages
|
567
|
+
cleanup_packages_in
|
540
568
|
|
541
|
-
#
|
569
|
+
# @todo Remove ignore files
|
542
570
|
@documents.cleanup do |record|
|
543
571
|
alert("rm_record", record.path)
|
544
572
|
@file_count += 1
|
@@ -889,18 +917,32 @@ EOF
|
|
889
917
|
r
|
890
918
|
end
|
891
919
|
else
|
892
|
-
|
893
|
-
r = @yaml.package_root(dir)
|
894
|
-
if r.nil?
|
895
|
-
@out.puts "Not registered '#{dir}'."
|
896
|
-
[]
|
897
|
-
else
|
898
|
-
[r]
|
899
|
-
end
|
920
|
+
[find_package_current_dir].compact
|
900
921
|
end
|
901
922
|
end
|
902
923
|
|
924
|
+
def find_package_current_dir
|
925
|
+
dir = File.expand_path('.')
|
926
|
+
package = @yaml.package_root(dir)
|
927
|
+
@out.puts "Not registered '#{dir}'." if package.nil?
|
928
|
+
package
|
929
|
+
end
|
930
|
+
|
903
931
|
def ignore(args, options)
|
932
|
+
if options[:global]
|
933
|
+
if args.size > 0
|
934
|
+
@yaml.set_global_gitignore(args[0])
|
935
|
+
@yaml.save
|
936
|
+
@out.puts "Set '#{args[0]}'"
|
937
|
+
else
|
938
|
+
if @yaml.global_gitignore
|
939
|
+
@out.puts @yaml.global_gitignore
|
940
|
+
end
|
941
|
+
end
|
942
|
+
|
943
|
+
return
|
944
|
+
end
|
945
|
+
|
904
946
|
current_dir = File.expand_path('.')
|
905
947
|
|
906
948
|
if (options[:package])
|
@@ -978,6 +1020,65 @@ EOF
|
|
978
1020
|
end
|
979
1021
|
end
|
980
1022
|
|
1023
|
+
def config(args, options)
|
1024
|
+
if args.empty?
|
1025
|
+
config_print
|
1026
|
+
else
|
1027
|
+
config_set(args, options)
|
1028
|
+
end
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
def config_print
|
1032
|
+
package = find_package_current_dir
|
1033
|
+
|
1034
|
+
return if package.nil?
|
1035
|
+
|
1036
|
+
@out.puts "Ignore:"
|
1037
|
+
package.ignore.each do |v|
|
1038
|
+
@out.puts " #{v}"
|
1039
|
+
end
|
1040
|
+
|
1041
|
+
@out.puts "Options:"
|
1042
|
+
package.options.each do |key, value|
|
1043
|
+
@out.puts " #{(key.to_s + ':').ljust(CONFIG_LJUST)} #{value}"
|
1044
|
+
end
|
1045
|
+
end
|
1046
|
+
|
1047
|
+
def config_set(args, options)
|
1048
|
+
package = find_package_current_dir
|
1049
|
+
return if package.nil?
|
1050
|
+
|
1051
|
+
opt = package.options
|
1052
|
+
|
1053
|
+
if options[:delete]
|
1054
|
+
opt.delete(args[0].to_sym)
|
1055
|
+
else
|
1056
|
+
if args.size == 2
|
1057
|
+
opt[args[0].to_sym] = config_to_value(args[1])
|
1058
|
+
else
|
1059
|
+
@out.puts("[usage] milk config KEY VALUE")
|
1060
|
+
end
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
package.set_options(opt)
|
1064
|
+
|
1065
|
+
@yaml.save
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
# config_to_value('true') #=> true
|
1069
|
+
# config_to_value('false') #=> false
|
1070
|
+
# config_to_value('abc') #=> 'abc'
|
1071
|
+
def config_to_value(v)
|
1072
|
+
case v
|
1073
|
+
when 'true'
|
1074
|
+
true
|
1075
|
+
when 'false'
|
1076
|
+
false
|
1077
|
+
else
|
1078
|
+
v
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
981
1082
|
private
|
982
1083
|
|
983
1084
|
def git_protocol?(options, src)
|
@@ -1016,16 +1117,23 @@ EOF
|
|
1016
1117
|
end
|
1017
1118
|
|
1018
1119
|
def updater_exec(package, is_update_with_git_pull, is_update_with_svn_update, is_no_clean)
|
1019
|
-
alert("package", package.name
|
1120
|
+
alert("package", package.name)
|
1020
1121
|
|
1021
1122
|
updater = Updater.new(@grndb, package.name)
|
1123
|
+
|
1124
|
+
updater.set_global_gitignore(@yaml.global_gitignore) if @yaml.global_gitignore
|
1022
1125
|
updater.set_package_ignore IgnoreSetting.new("/", package.ignore)
|
1023
1126
|
updater.enable_no_auto_ignore if package.options[:no_auto_ignore]
|
1127
|
+
|
1024
1128
|
updater.enable_silent_mode if @is_silent
|
1025
1129
|
updater.enable_display_info if @is_display_info
|
1130
|
+
updater.enable_no_clean if is_no_clean
|
1131
|
+
|
1026
1132
|
updater.enable_update_with_git_pull if is_update_with_git_pull
|
1027
1133
|
updater.enable_update_with_svn_update if is_update_with_svn_update
|
1028
|
-
updater.
|
1134
|
+
updater.enable_update_with_ctags if package.options[:update_with_ctags]
|
1135
|
+
updater.enable_update_with_ctags_e if package.options[:update_with_ctags_e]
|
1136
|
+
|
1029
1137
|
updater.exec
|
1030
1138
|
|
1031
1139
|
@package_count += 1
|
@@ -1053,7 +1161,7 @@ EOF
|
|
1053
1161
|
# データベースからも削除
|
1054
1162
|
# dir = File.expand_path(dir)
|
1055
1163
|
|
1056
|
-
alert("rm_package",
|
1164
|
+
alert("rm_package", package.name)
|
1057
1165
|
@package_count += 1
|
1058
1166
|
|
1059
1167
|
@documents.remove_match_path(dir) do |record|
|
@@ -78,10 +78,13 @@ EOF
|
|
78
78
|
# 指定ディレクトリの所属するパッケージのルートディレクトリを得る。
|
79
79
|
# 見つからない場合はnilを返す。
|
80
80
|
def package_root(dir)
|
81
|
-
nd = Util::normalize_filename
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
nd = Util::normalize_filename(dir)
|
82
|
+
|
83
|
+
@contents.find_all {|v|
|
84
|
+
nd =~ /^#{Regexp.escape(v.directory)}(:?\/|\Z)/
|
85
|
+
}.max_by {|v|
|
86
|
+
v.directory.length
|
87
|
+
}
|
85
88
|
end
|
86
89
|
|
87
90
|
# マイグレーション
|
@@ -100,6 +103,14 @@ EOF
|
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
106
|
+
def global_gitignore
|
107
|
+
@data['global_gitignore']
|
108
|
+
end
|
109
|
+
|
110
|
+
def set_global_gitignore(filename)
|
111
|
+
@data['global_gitignore'] = filename
|
112
|
+
end
|
113
|
+
|
103
114
|
private
|
104
115
|
|
105
116
|
def parse_contents
|
data/lib/milkode/cdweb/app.rb
CHANGED
@@ -44,7 +44,7 @@ end
|
|
44
44
|
get '/' do
|
45
45
|
if Database.validate?
|
46
46
|
@setting = WebSetting.new
|
47
|
-
@version = "1.
|
47
|
+
@version = "1.2.0"
|
48
48
|
|
49
49
|
@package_num = Database.instance.yaml_package_num
|
50
50
|
@file_num = Database.instance.totalRecords
|
@@ -333,7 +333,7 @@ EOF
|
|
333
333
|
|
334
334
|
if (result)
|
335
335
|
path2 = path.gsub(/#{suffix}\Z/, result)
|
336
|
-
" (<a href='#{Mkurl.new(File.join('/home', path2), params).inherit_query_shead}'>#{result}</a>) "
|
336
|
+
" (<a href='#{url_for Mkurl.new(File.join('/home', path2), params).inherit_query_shead}'>#{result}</a>) "
|
337
337
|
else
|
338
338
|
''
|
339
339
|
end
|
@@ -218,10 +218,18 @@ module Milkode
|
|
218
218
|
|
219
219
|
def update_in(package)
|
220
220
|
updater = Updater.new(@grndb, package.name)
|
221
|
+
|
222
|
+
yaml = yaml_load
|
223
|
+
|
224
|
+
updater.set_global_gitignore(yaml.global_gitignore) if yaml.global_gitignore
|
221
225
|
updater.set_package_ignore IgnoreSetting.new("/", package.ignore)
|
222
226
|
updater.enable_no_auto_ignore if package.options[:no_auto_ignore]
|
227
|
+
|
223
228
|
updater.enable_update_with_git_pull if package.options[:update_with_git_pull]
|
224
229
|
updater.enable_update_with_svn_update if package.options[:update_with_svn_update]
|
230
|
+
updater.enable_update_with_ctags if package.options[:update_with_ctags]
|
231
|
+
updater.enable_update_with_ctags_e if package.options[:update_with_ctags_e]
|
232
|
+
|
225
233
|
updater.exec
|
226
234
|
updater.result
|
227
235
|
end
|
@@ -63,22 +63,23 @@ module Milkode
|
|
63
63
|
if @match_records.empty? && recommended_wide_match_range?
|
64
64
|
grep_contents(@q.keywords, DEFAULT_WIDE_MATCH_RANGE)
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
# 検索範囲0の自動マッチは混乱をまねくのでやめる
|
67
|
+
# if @match_records.empty?
|
68
|
+
# grep_contents(@q.keywords, 0)
|
69
|
+
# end
|
69
70
|
end
|
70
71
|
|
71
|
-
#
|
72
|
-
if @match_records.empty? && recommended_fpath_or_packages?
|
73
|
-
|
74
|
-
|
72
|
+
# 先頭をファイル名とみなす自動マッチは混乱をまねくのでやめる
|
73
|
+
# if @match_records.empty? && recommended_fpath_or_packages?
|
74
|
+
# # おすすめクエリーに変換
|
75
|
+
# q2 = @q.conv_head_keyword_to_fpath_or_packages
|
75
76
|
|
76
|
-
|
77
|
-
|
77
|
+
# # 検索
|
78
|
+
# @records, @total_records = Database.instance.search(q2.keywords, q2.multi_match_keywords, q2.packages, path, q2.fpaths, q2.suffixs, q2.fpath_or_packages, @offset, LIMIT_NUM)
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
end
|
80
|
+
# # 再grep
|
81
|
+
# grep_contents(q2.keywords, q2.wide_match_range)
|
82
|
+
# end
|
82
83
|
|
83
84
|
# 検索3 : マッチするファイル
|
84
85
|
@match_files = []
|
@@ -124,6 +125,8 @@ module Milkode
|
|
124
125
|
# 近接マッチ無効
|
125
126
|
# g << [m]
|
126
127
|
end
|
128
|
+
|
129
|
+
@prev = nil
|
127
130
|
|
128
131
|
<<EOF
|
129
132
|
#{recommended_contents}
|
@@ -311,9 +314,20 @@ EOF
|
|
311
314
|
coderay.set_range(first_index..last_index)
|
312
315
|
|
313
316
|
url = @homeurl + record_link(record)
|
317
|
+
|
318
|
+
path = Util::relative_path(record.shortpath, @path)
|
319
|
+
|
320
|
+
if path != @prev
|
321
|
+
dt = <<EOS
|
322
|
+
<dt class='result-record'><a href='#{url + "#n#{coderay.highlight_lines[0]}"}'>#{path}</a>#{result_refinement(record)}</dt>
|
323
|
+
EOS
|
324
|
+
@prev = path
|
325
|
+
else
|
326
|
+
dt = " <dt class='result-record-empty'></dt>"
|
327
|
+
end
|
314
328
|
|
315
329
|
<<EOS
|
316
|
-
|
330
|
+
#{dt}
|
317
331
|
<dd>
|
318
332
|
#{coderay.to_html_anchorlink(url)}
|
319
333
|
</dd>
|
@@ -333,8 +347,11 @@ EOS
|
|
333
347
|
end
|
334
348
|
|
335
349
|
def result_record(record)
|
350
|
+
filename = Util::relative_path(record.shortpath, @path).to_s
|
351
|
+
filename = Util::highlight_keywords(filename, @q.keywords, 'highlight-filename')
|
352
|
+
|
336
353
|
<<EOS
|
337
|
-
<dt class='result-file'>#{file_or_dirimg(true, @suburl)}<a href='#{@homeurl + record_link(record)}'>#{
|
354
|
+
<dt class='result-file'>#{file_or_dirimg(true, @suburl)}<a href='#{@homeurl + record_link(record)}'>#{filename}</a></dt>
|
338
355
|
EOS
|
339
356
|
end
|
340
357
|
|
@@ -78,8 +78,11 @@ EOF
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def result_record(record)
|
81
|
+
filename = Util::relative_path(record.shortpath, @path).to_s
|
82
|
+
filename = Util::highlight_keywords(filename, @q.fpaths + @q.fpath_or_packages, 'highlight-filename')
|
83
|
+
|
81
84
|
<<EOS
|
82
|
-
<dt class='result-file'>#{file_or_dirimg(true, @suburl)}<a href='#{@homeurl + record_link(record)}'>#{
|
85
|
+
<dt class='result-file'>#{file_or_dirimg(true, @suburl)}<a href='#{@homeurl + record_link(record)}'>#{filename}</a></dt>
|
83
86
|
EOS
|
84
87
|
end
|
85
88
|
|
@@ -100,13 +100,13 @@ function clippy_text(text, bgcolor) {
|
|
100
100
|
' width="110"' +
|
101
101
|
' height="14"' +
|
102
102
|
' id="clippy" >' +
|
103
|
-
' <param name="movie" value="/flash/clippy.swf"/>' +
|
103
|
+
' <param name="movie" value="<%= url_for "/flash/clippy.swf" %>"/>' +
|
104
104
|
' <param name="allowScriptAccess" value="always" />' +
|
105
105
|
' <param name="quality" value="high" />' +
|
106
106
|
' <param name="scale" value="noscale" />' +
|
107
107
|
' <param NAME="FlashVars" value="text=' + text + '">' +
|
108
108
|
' <param name="bgcolor" value="#FFFFFF">' +
|
109
|
-
' <embed src="/flash/clippy.swf"' +
|
109
|
+
' <embed src="<%= url_for "/flash/clippy.swf" %>"' +
|
110
110
|
' width="110"' +
|
111
111
|
' height="14"' +
|
112
112
|
' name="clippy"' +
|
@@ -139,7 +139,7 @@ function lineno_setup(path, lineno) {
|
|
139
139
|
// copy text button
|
140
140
|
$("#lineno-path").html(directpath + clippy_text(directpath, '#FFFFFF'));
|
141
141
|
$("#lineno-body").html(n_lineno_dom.html());
|
142
|
-
$("#lineno-copyall").html("
|
142
|
+
$("#lineno-copyall").html("Line No. + Text" + clippy_text(directpath + " " + escapeHTML(n_lineno_dom.text()), '#F5F5F5'));
|
143
143
|
}
|
144
144
|
|
145
145
|
function open_newtab() {
|
@@ -42,8 +42,12 @@ div.search-summary {
|
|
42
42
|
|
43
43
|
dt.result-record {
|
44
44
|
font-size: 105%;
|
45
|
+
margin-top: 5px;
|
45
46
|
}
|
46
47
|
|
48
|
+
dt.result-record-empty {
|
49
|
+
margin-top: 5px;
|
50
|
+
}
|
47
51
|
dt.result-file {
|
48
52
|
font-size: 95%;
|
49
53
|
}
|
@@ -264,3 +268,9 @@ label.ui-corner-all {
|
|
264
268
|
background-position: 0px;
|
265
269
|
}
|
266
270
|
|
271
|
+
/* */
|
272
|
+
|
273
|
+
.highlight-filename {
|
274
|
+
background-color: #d0ff9c;
|
275
|
+
}
|
276
|
+
|
data/lib/milkode/cli.rb
CHANGED
@@ -83,10 +83,13 @@ EOF
|
|
83
83
|
cdstk.pwd(options)
|
84
84
|
end
|
85
85
|
|
86
|
-
desc "cleanup", "
|
86
|
+
desc "cleanup keyword_or_path1 [keyword_or_path2 ...]", "Cleanup garbage records"
|
87
|
+
option :all, :type => :boolean, :aliases => '-a', :desc => 'Cleanup all.'
|
87
88
|
option :force, :type => :boolean, :aliases => '-f', :desc => 'Force cleanup.'
|
88
|
-
|
89
|
-
|
89
|
+
option :packages, :type => :boolean, :aliases => '-p', :desc => 'Cleanup non exist packages.'
|
90
|
+
option :verbose, :type => :boolean, :aliases => '-v', :desc => 'Be verbose.'
|
91
|
+
def cleanup(*args)
|
92
|
+
cdstk.cleanup(args, options)
|
90
93
|
end
|
91
94
|
|
92
95
|
desc "rebuild [keyword1 keyword2]", "Rebuild database"
|
@@ -135,6 +138,7 @@ EOF
|
|
135
138
|
option :delete, :type => :boolean, :aliases => '-d', :desc => "Delete ignore setting."
|
136
139
|
option :delete_all, :type => :boolean, :desc => "Delete all ignore setting."
|
137
140
|
option :dry_run, :type => :boolean, :aliases => '-n', :desc => "Ignore setting test."
|
141
|
+
option :global, :type => :boolean, :desc => "Set global .gitignore file."
|
138
142
|
def ignore(*paths)
|
139
143
|
begin
|
140
144
|
cdstk.ignore(paths, options)
|
@@ -203,6 +207,23 @@ EOF
|
|
203
207
|
cdstk.files(args, options)
|
204
208
|
end
|
205
209
|
|
210
|
+
desc "config [options] KEY VALUE", <<EOF
|
211
|
+
Config package settings.
|
212
|
+
|
213
|
+
$ milk coinfig no_auto_ignore true
|
214
|
+
|
215
|
+
Configs:
|
216
|
+
no_auto_ignore # Not add package's .gitignore
|
217
|
+
update_with_ctags # Update with 'ctags -R'
|
218
|
+
update_with_ctags_e # Update with 'ctags -R -e'
|
219
|
+
update_with_git_pull # Update with 'git pull'
|
220
|
+
update_with_svn_update # Update with 'svn update'
|
221
|
+
EOF
|
222
|
+
option :delete, :type => :boolean, :aliases => '-d', :desc => "Delete key."
|
223
|
+
def config(*args)
|
224
|
+
cdstk.config(args, options)
|
225
|
+
end
|
226
|
+
|
206
227
|
# --------------------------------------------------------------------------
|
207
228
|
|
208
229
|
no_tasks do
|
data/lib/milkode/common/util.rb
CHANGED
@@ -5,6 +5,7 @@ require 'fileutils'
|
|
5
5
|
require 'pathname'
|
6
6
|
require 'kconv'
|
7
7
|
require 'open3'
|
8
|
+
require 'strscan'
|
8
9
|
|
9
10
|
module Milkode
|
10
11
|
module Util
|
@@ -240,6 +241,28 @@ module Milkode
|
|
240
241
|
false
|
241
242
|
end
|
242
243
|
end
|
244
|
+
|
245
|
+
def highlight_keywords(src, keywords, css_class)
|
246
|
+
if keywords.empty?
|
247
|
+
src
|
248
|
+
else
|
249
|
+
highlight_keywords_sub(src, keywords, css_class, 0)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def highlight_keywords_sub(src, keywords, css_class, index)
|
254
|
+
keyword = keywords[index]
|
255
|
+
|
256
|
+
array = src.split(keyword)
|
257
|
+
|
258
|
+
if index + 1 <= keywords.size
|
259
|
+
array = array.map do |subsrc|
|
260
|
+
highlight_keywords_sub(subsrc, keywords, css_class, index + 1)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
array.join("<span class='#{css_class}'>#{keyword}</span>")
|
265
|
+
end
|
243
266
|
end
|
244
267
|
end
|
245
268
|
|
@@ -35,34 +35,40 @@ module Milkode
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# レコードをまとめて削除する
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# 過去の方法
|
39
|
+
# 検索結果にマッチしたレコード等をまとめて削除
|
40
|
+
# 削除前にインデックスを削除し、削除後にインデックスを再度追加してい
|
41
|
+
# 大量のレコードを削除する場合に高速に動作する
|
42
|
+
#
|
43
|
+
# 現在の方法
|
44
|
+
# 上記の方法がかえって遅くなったので元に戻す
|
45
|
+
# 普通に速くなった気がする
|
46
|
+
#
|
41
47
|
def remove_records(records, &block)
|
42
|
-
Groonga::Schema.define do |schema|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
48
|
+
# Groonga::Schema.define do |schema|
|
49
|
+
# schema.change_table("terms") do |table|
|
50
|
+
# table.remove_index("documents.path")
|
51
|
+
# table.remove_index("documents.package")
|
52
|
+
# table.remove_index("documents.restpath")
|
53
|
+
# table.remove_index("documents.content")
|
54
|
+
# table.remove_index("documents.suffix")
|
55
|
+
# end
|
56
|
+
# end
|
51
57
|
|
52
58
|
records.each do |record|
|
53
59
|
yield record if block
|
54
60
|
record.key.delete
|
55
61
|
end
|
56
62
|
|
57
|
-
Groonga::Schema.define do |schema|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
63
|
+
# Groonga::Schema.define do |schema|
|
64
|
+
# schema.change_table("terms") do |table|
|
65
|
+
# table.index("documents.path", :with_position => true)
|
66
|
+
# table.index("documents.package", :with_position => true)
|
67
|
+
# table.index("documents.restpath", :with_position => true)
|
68
|
+
# table.index("documents.content", :with_position => true)
|
69
|
+
# table.index("documents.suffix", :with_position => true)
|
70
|
+
# end
|
71
|
+
# end
|
66
72
|
end
|
67
73
|
|
68
74
|
def initialize(table)
|
@@ -326,13 +332,13 @@ module Milkode
|
|
326
332
|
end
|
327
333
|
|
328
334
|
# 指定されたパッケージのクリーンアップ
|
329
|
-
def cleanup_package_name(package_name)
|
335
|
+
def cleanup_package_name(package_name, ignore_checker = nil)
|
330
336
|
# クリーンアップ対象のファイルを検索
|
331
337
|
result = @table.select { |record| record.package == package_name }
|
332
338
|
|
333
|
-
#
|
339
|
+
# 存在しない&無視ファイルの削除
|
334
340
|
result.each do |r|
|
335
|
-
|
341
|
+
if !File.exist?(r.path) || (ignore_checker && ignore_checker.ignore?("/#{r.restpath}"))
|
336
342
|
yield r if block_given?
|
337
343
|
# p r.restpath
|
338
344
|
remove(r.path)
|
@@ -35,13 +35,28 @@ module Milkode
|
|
35
35
|
Dir.chdir(@package.directory) { system("svn update") }
|
36
36
|
end
|
37
37
|
|
38
|
+
# Add global .gitignore
|
39
|
+
if @options[:global_gitignore]
|
40
|
+
add_global_gitignore(@options[:global_gitignore])
|
41
|
+
end
|
42
|
+
|
43
|
+
# update
|
44
|
+
update_dir(@package.directory)
|
45
|
+
|
38
46
|
# cleanup
|
39
47
|
unless @options[:no_clean]
|
40
|
-
@grndb.documents.cleanup_package_name(@package_name)
|
48
|
+
@grndb.documents.cleanup_package_name(@package_name, @current_ignore)
|
41
49
|
end
|
42
50
|
|
43
|
-
#
|
44
|
-
|
51
|
+
# ctags
|
52
|
+
if @options[:update_with_ctags]
|
53
|
+
Dir.chdir(@package.directory) { system("ctags -R") }
|
54
|
+
end
|
55
|
+
|
56
|
+
# ctags -e
|
57
|
+
if @options[:update_with_ctags_e]
|
58
|
+
Dir.chdir(@package.directory) { system("ctags -R -e") }
|
59
|
+
end
|
45
60
|
|
46
61
|
# 更新時刻の更新
|
47
62
|
@grndb.packages.touch(@package_name, :updatetime)
|
@@ -71,10 +86,22 @@ module Milkode
|
|
71
86
|
@options[:update_with_svn_update] = true
|
72
87
|
end
|
73
88
|
|
89
|
+
def enable_update_with_ctags
|
90
|
+
@options[:update_with_ctags] = true
|
91
|
+
end
|
92
|
+
|
93
|
+
def enable_update_with_ctags_e
|
94
|
+
@options[:update_with_ctags_e] = true
|
95
|
+
end
|
96
|
+
|
74
97
|
def enable_no_clean
|
75
98
|
@options[:no_clean] = true
|
76
99
|
end
|
77
100
|
|
101
|
+
def set_global_gitignore(filename)
|
102
|
+
@options[:global_gitignore] = filename
|
103
|
+
end
|
104
|
+
|
78
105
|
class Result
|
79
106
|
attr_reader :file_count
|
80
107
|
attr_reader :add_count
|
@@ -227,6 +254,14 @@ module Milkode
|
|
227
254
|
end
|
228
255
|
end
|
229
256
|
|
257
|
+
def add_global_gitignore(filename)
|
258
|
+
if File.exist? filename
|
259
|
+
alert_info("add_ignore", filename)
|
260
|
+
str = Util::load_content($stdout, filename)
|
261
|
+
@current_ignore.add IgnoreSetting.create_from_gitignore("/", str)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
230
265
|
def alert_info(title, msg)
|
231
266
|
alert(title, msg) if @options[:display_info]
|
232
267
|
end
|
data/milkode.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{milkode}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
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-
|
12
|
+
s.date = %q{2013-08-07}
|
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"]
|
data/test/test_cdstk.rb
CHANGED
@@ -32,8 +32,8 @@ class TestCdstk < Test::Unit::TestCase
|
|
32
32
|
obj.init({})
|
33
33
|
|
34
34
|
io.puts('--- add ---')
|
35
|
-
obj.add(['../../lib/milkode/
|
36
|
-
obj.add(['../../lib/milkode/
|
35
|
+
obj.add(['../../lib/milkode/grep', '../../lib/milkode/common'], {})
|
36
|
+
obj.add(['../../lib/milkode/grep'], {})
|
37
37
|
obj.add(['../data/abc.zip'], {})
|
38
38
|
obj.add(['../data/nodir_abc.zip'], {})
|
39
39
|
obj.add(['../data/nodir_abc_xpi.xpi'], {})
|
@@ -80,7 +80,7 @@ class TestCdstk < Test::Unit::TestCase
|
|
80
80
|
obj.list(['com'], {:verbose => false})
|
81
81
|
|
82
82
|
io.puts('--- cleanup ---')
|
83
|
-
obj.cleanup({:force=>true})
|
83
|
+
obj.cleanup([], {:force=>true})
|
84
84
|
|
85
85
|
io.puts('--- rebuild ---')
|
86
86
|
obj.rebuild([], {:all => true})
|
data/test/test_milkode_yaml.rb
CHANGED
@@ -190,4 +190,31 @@ EOF
|
|
190
190
|
assert_equal nil , obj.package_root('/hoge/a/dir1/dir3')
|
191
191
|
assert_equal '/path/to/dir', obj.package_root('/path/to/dir').directory
|
192
192
|
end
|
193
|
+
|
194
|
+
def test_global_gitignore_empty
|
195
|
+
obj = MilkodeYaml.new(SRC)
|
196
|
+
assert_equal nil, obj.global_gitignore
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_global_gitignore_read
|
200
|
+
obj = MilkodeYaml.new(<<EOF)
|
201
|
+
---
|
202
|
+
version: '0.2'
|
203
|
+
global_gitignore: '/path/to/.gitignore'
|
204
|
+
contents:
|
205
|
+
- directory: /a/dir1
|
206
|
+
EOF
|
207
|
+
|
208
|
+
assert_equal '/path/to/.gitignore', obj.global_gitignore
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_global_gitignore_set
|
212
|
+
# set
|
213
|
+
obj = MilkodeYaml.new(SRC)
|
214
|
+
obj.set_global_gitignore('/path/to/.gitignore')
|
215
|
+
|
216
|
+
# reload
|
217
|
+
obj = MilkodeYaml.new(obj.dump)
|
218
|
+
assert_equal '/path/to/.gitignore', obj.global_gitignore
|
219
|
+
end
|
193
220
|
end
|
data/test/test_updater.rb
CHANGED
@@ -107,8 +107,7 @@ module Milkode
|
|
107
107
|
updater = Updater.new(@grndb, 'ignore_test')
|
108
108
|
updater.enable_no_auto_ignore
|
109
109
|
updater.exec
|
110
|
-
|
111
|
-
result_test updater.result, 5, 1, 0
|
110
|
+
result_test updater.result, 5, 4, 0
|
112
111
|
end
|
113
112
|
|
114
113
|
def t_silent_mode
|
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:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 1.
|
10
|
+
version: 1.2.0
|
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-
|
18
|
+
date: 2013-08-07 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|