milkode 1.1.0 → 1.2.0
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.
- 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
|