gonzui 1.2-x86-mswin32-60
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/AUTHORS.txt +9 -0
- data/History.txt +5539 -0
- data/Manifest.txt +115 -0
- data/PostInstall.txt +17 -0
- data/README.rdoc +149 -0
- data/Rakefile +28 -0
- data/bin/gonzui-db +167 -0
- data/bin/gonzui-import +177 -0
- data/bin/gonzui-remove +58 -0
- data/bin/gonzui-search +68 -0
- data/bin/gonzui-server +176 -0
- data/bin/gonzui-update +53 -0
- data/data/gonzui/catalog/catalog.ja +80 -0
- data/data/gonzui/doc/favicon.ico +0 -0
- data/data/gonzui/doc/folder.png +0 -0
- data/data/gonzui/doc/gonzui.css +279 -0
- data/data/gonzui/doc/gonzui.js +111 -0
- data/data/gonzui/doc/text.png +0 -0
- data/data/gonzuirc.sample +29 -0
- data/ext/autopack/autopack.c +88 -0
- data/ext/autopack/extconf.rb +3 -0
- data/ext/delta/delta.c +147 -0
- data/ext/delta/extconf.rb +5 -0
- data/ext/texttokenizer/extconf.rb +5 -0
- data/ext/texttokenizer/texttokenizer.c +93 -0
- data/ext/xmlformatter/extconf.rb +5 -0
- data/ext/xmlformatter/xmlformatter.c +207 -0
- data/lib/gonzui.rb +59 -0
- data/lib/gonzui/apt.rb +193 -0
- data/lib/gonzui/autopack.so +0 -0
- data/lib/gonzui/bdbdbm.rb +118 -0
- data/lib/gonzui/cmdapp.rb +14 -0
- data/lib/gonzui/cmdapp/app.rb +175 -0
- data/lib/gonzui/cmdapp/search.rb +134 -0
- data/lib/gonzui/config.rb +117 -0
- data/lib/gonzui/content.rb +19 -0
- data/lib/gonzui/dbm.rb +673 -0
- data/lib/gonzui/deindexer.rb +162 -0
- data/lib/gonzui/delta.rb +49 -0
- data/lib/gonzui/delta.so +0 -0
- data/lib/gonzui/extractor.rb +347 -0
- data/lib/gonzui/fetcher.rb +309 -0
- data/lib/gonzui/gettext.rb +144 -0
- data/lib/gonzui/importer.rb +84 -0
- data/lib/gonzui/indexer.rb +316 -0
- data/lib/gonzui/info.rb +80 -0
- data/lib/gonzui/license.rb +100 -0
- data/lib/gonzui/logger.rb +48 -0
- data/lib/gonzui/monitor.rb +177 -0
- data/lib/gonzui/progressbar.rb +235 -0
- data/lib/gonzui/remover.rb +38 -0
- data/lib/gonzui/searcher.rb +330 -0
- data/lib/gonzui/searchquery.rb +235 -0
- data/lib/gonzui/searchresult.rb +111 -0
- data/lib/gonzui/texttokenizer.so +0 -0
- data/lib/gonzui/updater.rb +254 -0
- data/lib/gonzui/util.rb +415 -0
- data/lib/gonzui/vcs.rb +128 -0
- data/lib/gonzui/webapp.rb +25 -0
- data/lib/gonzui/webapp/advsearch.rb +123 -0
- data/lib/gonzui/webapp/filehandler.rb +24 -0
- data/lib/gonzui/webapp/jsfeed.rb +61 -0
- data/lib/gonzui/webapp/markup.rb +445 -0
- data/lib/gonzui/webapp/search.rb +269 -0
- data/lib/gonzui/webapp/servlet.rb +319 -0
- data/lib/gonzui/webapp/snippet.rb +155 -0
- data/lib/gonzui/webapp/source.rb +37 -0
- data/lib/gonzui/webapp/stat.rb +137 -0
- data/lib/gonzui/webapp/top.rb +63 -0
- data/lib/gonzui/webapp/uri.rb +140 -0
- data/lib/gonzui/webapp/webrick.rb +48 -0
- data/lib/gonzui/webapp/xmlformatter.so +0 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/makemanifest.rb +21 -0
- data/tasks/extconf.rake +13 -0
- data/tasks/extconf/autopack.rake +43 -0
- data/tasks/extconf/delta.rake +43 -0
- data/tasks/extconf/texttokenizer.rake +43 -0
- data/tasks/extconf/xmlformatter.rake +43 -0
- data/test/_external_tools.rb +13 -0
- data/test/_test-util.rb +142 -0
- data/test/foo/Makefile.foo +66 -0
- data/test/foo/bar.c +5 -0
- data/test/foo/bar.h +6 -0
- data/test/foo/foo.c +25 -0
- data/test/foo/foo.spec +33 -0
- data/test/test_apt.rb +42 -0
- data/test/test_autopack_extn.rb +7 -0
- data/test/test_bdbdbm.rb +79 -0
- data/test/test_cmdapp-app.rb +35 -0
- data/test/test_cmdapp-search.rb +99 -0
- data/test/test_config.rb +28 -0
- data/test/test_content.rb +15 -0
- data/test/test_dbm.rb +171 -0
- data/test/test_deindexer.rb +50 -0
- data/test/test_delta.rb +66 -0
- data/test/test_extractor.rb +78 -0
- data/test/test_fetcher.rb +75 -0
- data/test/test_gettext.rb +50 -0
- data/test/test_gonzui.rb +11 -0
- data/test/test_helper.rb +10 -0
- data/test/test_importer.rb +56 -0
- data/test/test_indexer.rb +37 -0
- data/test/test_info.rb +82 -0
- data/test/test_license.rb +49 -0
- data/test/test_logger.rb +60 -0
- data/test/test_monitor.rb +23 -0
- data/test/test_searcher.rb +37 -0
- data/test/test_searchquery.rb +27 -0
- data/test/test_searchresult.rb +43 -0
- data/test/test_texttokenizer.rb +47 -0
- data/test/test_updater.rb +95 -0
- data/test/test_util.rb +149 -0
- data/test/test_vcs.rb +61 -0
- data/test/test_webapp-markup.rb +42 -0
- data/test/test_webapp-util.rb +19 -0
- data/test/test_webapp-xmlformatter.rb +19 -0
- metadata +292 -0
data/lib/gonzui.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
#
|
3
|
+
# gonzui - a source code search engine.
|
4
|
+
#
|
5
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
6
|
+
# All rights reserved.
|
7
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
8
|
+
#
|
9
|
+
# You can redistribute it and/or modify it under the terms of
|
10
|
+
# the GNU General Public License version 2.
|
11
|
+
#
|
12
|
+
#require 'rubygems'
|
13
|
+
|
14
|
+
$LOAD_PATH << "lib"
|
15
|
+
$LOAD_PATH << "ext"
|
16
|
+
|
17
|
+
module Gonzui
|
18
|
+
VERSION = "1.2"
|
19
|
+
SYSCONFDIR = "."
|
20
|
+
PKGDATADIR = File.join(__FILE__, "..", "..", "data", "gonzui")
|
21
|
+
GONZUI_URI = "http://gonzui.sourceforge.net"
|
22
|
+
HTTP_PORT = 46984
|
23
|
+
class GonzuiError < StandardError; end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "gonzui/util"
|
27
|
+
require "gonzui/gettext"
|
28
|
+
|
29
|
+
begin # for Rake task
|
30
|
+
require 'gonzui/autopack'
|
31
|
+
require 'gonzui/delta'
|
32
|
+
require "gonzui/texttokenizer"
|
33
|
+
rescue LoadError
|
34
|
+
end
|
35
|
+
|
36
|
+
require "gonzui/dbm"
|
37
|
+
require "gonzui/bdbdbm"
|
38
|
+
require "gonzui/monitor"
|
39
|
+
|
40
|
+
require "gonzui/content"
|
41
|
+
require "gonzui/fetcher"
|
42
|
+
require "gonzui/updater"
|
43
|
+
require "gonzui/importer"
|
44
|
+
require "gonzui/remover"
|
45
|
+
require "gonzui/vcs"
|
46
|
+
|
47
|
+
require "gonzui/apt"
|
48
|
+
require "gonzui/config"
|
49
|
+
require "gonzui/deindexer"
|
50
|
+
require "gonzui/extractor"
|
51
|
+
require "gonzui/indexer"
|
52
|
+
require "gonzui/info"
|
53
|
+
require "gonzui/license"
|
54
|
+
require "gonzui/logger"
|
55
|
+
require 'gonzui/searcher'
|
56
|
+
require 'gonzui/searchquery'
|
57
|
+
require 'gonzui/searchresult'
|
58
|
+
|
59
|
+
|
data/lib/gonzui/apt.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
#
|
2
|
+
# apt.rb - an interface library for apt
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
module Gonzui
|
13
|
+
class AptGetError < GonzuiError; end
|
14
|
+
|
15
|
+
module AptGet
|
16
|
+
extend Util
|
17
|
+
|
18
|
+
AptGetRegistry = {}
|
19
|
+
|
20
|
+
module_function
|
21
|
+
def available?
|
22
|
+
begin
|
23
|
+
require_command("apt-get")
|
24
|
+
return true
|
25
|
+
rescue CommandNotFoundError
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_apt_type
|
31
|
+
require_command("apt-get")
|
32
|
+
apt_type = :unknown
|
33
|
+
IO.popen("apt-get --version").each {|line|
|
34
|
+
if m = /^\*Ver: Standard \.(.*)$/.match(line)
|
35
|
+
apt_type = m[1].intern
|
36
|
+
end
|
37
|
+
}
|
38
|
+
return apt_type
|
39
|
+
end
|
40
|
+
|
41
|
+
def new(config, package_name)
|
42
|
+
apt_type = get_apt_type
|
43
|
+
if klass = AptGetRegistry[apt_type]
|
44
|
+
return klass.new(config, package_name)
|
45
|
+
else
|
46
|
+
raise AptGetError.new("#{apt_type}: unsupported apt type")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def register(klass)
|
51
|
+
assert(!AptGetRegistry.include?(klass.apt_type))
|
52
|
+
AptGetRegistry[klass.apt_type] = klass
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class AbstractAptGet
|
57
|
+
include Util
|
58
|
+
include TemporaryDirectoryUtil
|
59
|
+
|
60
|
+
def initialize(config, package_name)
|
61
|
+
@config = config
|
62
|
+
@package_name = package_name
|
63
|
+
@apt_options = ""
|
64
|
+
@cleaning_procs = []
|
65
|
+
set_temporary_directory(config.temporary_directory)
|
66
|
+
end
|
67
|
+
|
68
|
+
def run_apt_get
|
69
|
+
cd = "cd"
|
70
|
+
cd << " /d" if (/mswin|mingw|bccwin/ =~ RUBY_PLATFORM)
|
71
|
+
command_line = sprintf("#{cd} %s && apt-get -qq %s source %s >/dev/null 2>&1",
|
72
|
+
shell_escape(self.temporary_directory),
|
73
|
+
@apt_options,
|
74
|
+
shell_escape(@package_name))
|
75
|
+
status = system(command_line)
|
76
|
+
raise AptGetError.new("#{@package_name}: unable to get sources") if
|
77
|
+
status == false
|
78
|
+
end
|
79
|
+
|
80
|
+
def extract_package
|
81
|
+
NotImplementedError.new("should be implemented in a sub class")
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_cleaning_proc(proc)
|
85
|
+
@cleaning_procs.push(proc)
|
86
|
+
end
|
87
|
+
|
88
|
+
public
|
89
|
+
def extract
|
90
|
+
prepare_temporary_directory
|
91
|
+
run_apt_get
|
92
|
+
return extract_package
|
93
|
+
end
|
94
|
+
|
95
|
+
def clean
|
96
|
+
@cleaning_procs.each {|proc| proc.call }
|
97
|
+
clean_temporary_directory
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class DebAptGet < AbstractAptGet
|
102
|
+
def self.apt_type
|
103
|
+
:deb
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_archive(directory)
|
107
|
+
Dir.entries_without_dots(directory).map {|entry|
|
108
|
+
File.join(directory, entry)
|
109
|
+
}.find {|file_name|
|
110
|
+
Extractor.supported_file?(file_name)
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
def find_deb_source_directory
|
115
|
+
entries = Dir.entries_without_dots(self.temporary_directory)
|
116
|
+
directory = entries.map {|entry|
|
117
|
+
File.join(self.temporary_directory, entry)
|
118
|
+
}.find {|path|
|
119
|
+
File.directory?(path)
|
120
|
+
}
|
121
|
+
raise AptGetError.new("#{@package_name}: source directory not found") if
|
122
|
+
directory.nil?
|
123
|
+
return directory
|
124
|
+
end
|
125
|
+
|
126
|
+
def remove_deb_files
|
127
|
+
Dir.entries(self.temporary_directory).each {|entry|
|
128
|
+
file_name = File.join(self.temporary_directory, entry)
|
129
|
+
File.unlink(file_name) if File.file?(file_name)
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
def contains_single_tarball?(directory)
|
134
|
+
entries = Dir.entries_without_dots(directory)
|
135
|
+
entries.delete("debian")
|
136
|
+
entries.delete("CVS") # some packages have it
|
137
|
+
entries.length == 1 and Extractor.supported_file?(entries.first)
|
138
|
+
end
|
139
|
+
|
140
|
+
def extract_package
|
141
|
+
remove_deb_files
|
142
|
+
source_directory = find_deb_source_directory
|
143
|
+
if contains_single_tarball?(source_directory)
|
144
|
+
archive_file_name = find_archive(source_directory)
|
145
|
+
extractor = Extractor.new(@config, archive_file_name)
|
146
|
+
add_cleaning_proc(lambda{ extractor.clean_temporary_directory })
|
147
|
+
return extractor.extract
|
148
|
+
else
|
149
|
+
return source_directory
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
AptGet.register(self)
|
154
|
+
end
|
155
|
+
|
156
|
+
class RPMAptGet < AbstractAptGet
|
157
|
+
def self.apt_type
|
158
|
+
:rpm
|
159
|
+
end
|
160
|
+
|
161
|
+
def initialize(config, package_name)
|
162
|
+
super(config, package_name)
|
163
|
+
@apt_options = "-d"
|
164
|
+
end
|
165
|
+
|
166
|
+
def srpm_file?(file_name)
|
167
|
+
/\.src\.rpm$/.match(file_name)
|
168
|
+
end
|
169
|
+
|
170
|
+
def find_srpm_file
|
171
|
+
entries = Dir.entries_without_dots(self.temporary_directory)
|
172
|
+
raise AptGetError.new("#{@package_name}: download failed") if
|
173
|
+
entries.length != 1
|
174
|
+
|
175
|
+
candidate = entries.first
|
176
|
+
raise AptGetError.new("#{@package_name}: SRPM not found") unless
|
177
|
+
srpm_file?(candidate)
|
178
|
+
return File.join(self.temporary_directory, candidate)
|
179
|
+
end
|
180
|
+
|
181
|
+
# FIXME: It cannot handle multiple tar balls in a single
|
182
|
+
# package like FC2's emacs including emacs, Mule-UCS, .
|
183
|
+
private
|
184
|
+
def extract_package
|
185
|
+
srpm_file_name = find_srpm_file
|
186
|
+
extractor = Extractor.new(@config, srpm_file_name)
|
187
|
+
add_cleaning_proc(lambda{ extractor.clean_temporary_directory })
|
188
|
+
return extractor.extract
|
189
|
+
end
|
190
|
+
|
191
|
+
AptGet.register(self)
|
192
|
+
end
|
193
|
+
end
|
Binary file
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#
|
2
|
+
# bdbdbm.rb - bdb implementation of gonzui DB
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'bdb'
|
13
|
+
|
14
|
+
module Gonzui
|
15
|
+
class BDBDBM < AbstractDBM
|
16
|
+
def initialize(config, read_only = false)
|
17
|
+
retried = false
|
18
|
+
begin
|
19
|
+
@db_mode = if read_only then BDB::RDONLY else BDB::CREATE end
|
20
|
+
env_flags = BDB::CREATE | BDB::INIT_MPOOL | BDB::INIT_LOCK
|
21
|
+
options = {}
|
22
|
+
options["set_cachesize"] = config.db_cache_size
|
23
|
+
@db_env = BDB::Env.new(config.db_directory, env_flags, options)
|
24
|
+
super(config, read_only)
|
25
|
+
rescue BDB::Fatal => e
|
26
|
+
raise e if retried
|
27
|
+
retried = true
|
28
|
+
#
|
29
|
+
# "Lock table is out of available locker entries"
|
30
|
+
# error ocasionally occurs if a process using
|
31
|
+
# Gonzui::BDMDBM is killed by SIGKILL forcibly. In
|
32
|
+
# that case, we can remove Berkeley DB Environment
|
33
|
+
# to solve the error.
|
34
|
+
#
|
35
|
+
BDB::Env.remove(config.db_directory, BDB::FORCE)
|
36
|
+
retry
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def do_open_db(name, key_type, value_type, dupsort)
|
42
|
+
options = {}
|
43
|
+
options["env"] = @db_env
|
44
|
+
if key_type == AutoPack::ID && !dupsort
|
45
|
+
options["set_array_base"] = 0
|
46
|
+
options["set_store_value"] = value_type.store if value_type.store
|
47
|
+
options["set_fetch_value"] = value_type.fetch if value_type.fetch
|
48
|
+
db = BDB::Recno.open(name.to_s, nil, @db_mode, 0644, options)
|
49
|
+
else
|
50
|
+
options["set_flags"] = BDB::DUPSORT if dupsort
|
51
|
+
options["set_store_key"] = key_type.store if key_type.store
|
52
|
+
options["set_fetch_key"] = key_type.fetch if key_type.fetch
|
53
|
+
options["set_store_value"] = value_type.store if value_type.store
|
54
|
+
options["set_fetch_value"] = value_type.fetch if value_type.fetch
|
55
|
+
db = BDB::Btree.open(name.to_s, nil, @db_mode, 0644, options)
|
56
|
+
end
|
57
|
+
db.extend(BDBExtension)
|
58
|
+
return db
|
59
|
+
end
|
60
|
+
|
61
|
+
public
|
62
|
+
def close
|
63
|
+
super
|
64
|
+
@db_env.close
|
65
|
+
end
|
66
|
+
|
67
|
+
def find_all_by_prefix(pattern)
|
68
|
+
results = []
|
69
|
+
self.word_wordid.each_by_prefix(pattern) {|word, word_id|
|
70
|
+
results.concat(collect_all_results(word_id))
|
71
|
+
}
|
72
|
+
return results
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
module BDBExtension
|
77
|
+
def duplicates(key , assoc = false)
|
78
|
+
super(key, assoc) rescue super(key, 0) # hack for Windows
|
79
|
+
end
|
80
|
+
|
81
|
+
def each_by_prefix(prefix)
|
82
|
+
values = []
|
83
|
+
cursor = self.cursor
|
84
|
+
begin
|
85
|
+
if pair = cursor.set_range(prefix)
|
86
|
+
begin
|
87
|
+
k, v = pair
|
88
|
+
break unless k[0, prefix.length] == prefix
|
89
|
+
yield(k, v)
|
90
|
+
end while pair = cursor.next
|
91
|
+
end
|
92
|
+
return values
|
93
|
+
ensure
|
94
|
+
cursor.close
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def delete_both(key, value)
|
99
|
+
cursor = self.cursor
|
100
|
+
begin
|
101
|
+
pair = cursor.get(BDB::GET_BOTH, key, value)
|
102
|
+
cursor.delete unless pair.nil?
|
103
|
+
ensure
|
104
|
+
cursor.close
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def get_last_key
|
109
|
+
cursor = self.cursor
|
110
|
+
begin
|
111
|
+
k, v = cursor.last
|
112
|
+
return k
|
113
|
+
ensure
|
114
|
+
cursor.close
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#
|
2
|
+
# cmdapp.rb - a library for command line applications
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'gonzui/cmdapp/app.rb'
|
13
|
+
require 'gonzui/cmdapp/search.rb'
|
14
|
+
|
@@ -0,0 +1,175 @@
|
|
1
|
+
#
|
2
|
+
# app.rb - command line application framework
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'getoptlong'
|
13
|
+
|
14
|
+
# gonzui applications use UTF-8 for the internal encoding.
|
15
|
+
$KCODE = "u"
|
16
|
+
|
17
|
+
module Gonzui
|
18
|
+
class CommandLineApplication
|
19
|
+
include Util
|
20
|
+
extend Util
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@config = Config.new
|
24
|
+
|
25
|
+
# ~/.gonzuirc has precedence over /etc/gonzuirc
|
26
|
+
file_names = []
|
27
|
+
file_names.push(File.join(ENV['HOME'], ".gonzuirc")) if ENV['HOME']
|
28
|
+
file_names.push(File.join(SYSCONFDIR, "gonzuirc"))
|
29
|
+
file_names.each {|file_name|
|
30
|
+
if File.exist?(file_name)
|
31
|
+
@config.load(file_name)
|
32
|
+
break
|
33
|
+
end
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_options_to_hash(option_table)
|
38
|
+
begin
|
39
|
+
options = {}
|
40
|
+
parser = GetoptLong.new
|
41
|
+
parser.set_options(*option_table)
|
42
|
+
parser.quiet = true
|
43
|
+
parser.each_option {|name, arg|
|
44
|
+
options[name.sub(/^--/, "")] = arg
|
45
|
+
}
|
46
|
+
return options
|
47
|
+
rescue => e
|
48
|
+
eprintf("%s", e.message)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def show_version
|
53
|
+
printf("%s %s\n", program_name, Gonzui::VERSION)
|
54
|
+
exit
|
55
|
+
end
|
56
|
+
|
57
|
+
def dump_config
|
58
|
+
@config.dump
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
|
62
|
+
def be_quiet
|
63
|
+
devnull = if windows? then "NUL" else "/dev/null" end
|
64
|
+
STDOUT.reopen(devnull)
|
65
|
+
end
|
66
|
+
|
67
|
+
def ensure_db_directory_available
|
68
|
+
eprintf "#{@config.db_directory}: DB directory not found" unless
|
69
|
+
File.directory?(@config.db_directory)
|
70
|
+
end
|
71
|
+
|
72
|
+
def show_usage
|
73
|
+
do_show_usage
|
74
|
+
cache_size = @config.db_cache_size / 1024 ** 2
|
75
|
+
puts " --gonzuirc=FILE specify alternate run control file"
|
76
|
+
puts " --dump-config dump configuration"
|
77
|
+
puts " -d, --db-dir=DIR use DB directory DIR"
|
78
|
+
puts " --db-cache=NUM use NUM megabytes of DB cache [#{cache_size}]"
|
79
|
+
puts " --list-formats list all supported formats"
|
80
|
+
puts " --help show this help message"
|
81
|
+
puts " -q, --quiet suppress all normal output"
|
82
|
+
puts " -v, --verbose output progress and statistics"
|
83
|
+
puts " --version print version information and exit"
|
84
|
+
exit
|
85
|
+
end
|
86
|
+
|
87
|
+
def show_formats
|
88
|
+
max = LangScan::modules.sort_by {|m| m.name.length }.last.name.length
|
89
|
+
LangScan::modules.sort_by {|m| m.name }.each {|m|
|
90
|
+
printf("%-#{max}s %s\n", m.name, m.abbrev)
|
91
|
+
}
|
92
|
+
exit
|
93
|
+
end
|
94
|
+
|
95
|
+
def process_common_options(options)
|
96
|
+
show_version if options["version"]
|
97
|
+
show_usage if options["help"]
|
98
|
+
show_formats if options["list-formats"]
|
99
|
+
@config.quiet = true if options["quiet"]
|
100
|
+
@config.verbose = true if options["verbose"]
|
101
|
+
@config.load(File.expand_path(options["gonzuirc"])) if
|
102
|
+
options["gonzuirc"]
|
103
|
+
@config.db_directory = File.expand_path(options["db-dir"]) if
|
104
|
+
options["db-dir"]
|
105
|
+
@config.db_cache_size = (options["db-cache"].to_f * 1024 ** 2).to_i if
|
106
|
+
options["db-cache"]
|
107
|
+
|
108
|
+
UTF8.set_preference(@config.encoding_preference)
|
109
|
+
set_verbosity(@config.verbose)
|
110
|
+
be_quiet if @config.quiet
|
111
|
+
dump_config if options["dump-config"]
|
112
|
+
end
|
113
|
+
|
114
|
+
def parse_options
|
115
|
+
option_table = [
|
116
|
+
["--help", GetoptLong::NO_ARGUMENT],
|
117
|
+
["--version", GetoptLong::NO_ARGUMENT],
|
118
|
+
["--quiet", "-q", GetoptLong::NO_ARGUMENT],
|
119
|
+
["--verbose", "-v", GetoptLong::NO_ARGUMENT],
|
120
|
+
["--db-dir", "-d", GetoptLong::REQUIRED_ARGUMENT],
|
121
|
+
["--db-cache", GetoptLong::REQUIRED_ARGUMENT],
|
122
|
+
["--list-formats", GetoptLong::NO_ARGUMENT],
|
123
|
+
["--dump-config", GetoptLong::NO_ARGUMENT],
|
124
|
+
["--gonzuirc", GetoptLong::REQUIRED_ARGUMENT]
|
125
|
+
]
|
126
|
+
option_table.concat(do_get_option_table)
|
127
|
+
options = parse_options_to_hash(option_table)
|
128
|
+
process_common_options(options)
|
129
|
+
do_process_options(options)
|
130
|
+
end
|
131
|
+
|
132
|
+
def init_logger
|
133
|
+
@logger = Logger.new(@config.gonzui_log_file)
|
134
|
+
end
|
135
|
+
|
136
|
+
def init_logger_with_stderr
|
137
|
+
@logger = Logger.new(@config.gonzui_log_file)
|
138
|
+
@logger.attach(STDERR)
|
139
|
+
end
|
140
|
+
|
141
|
+
def start
|
142
|
+
begin
|
143
|
+
do_start
|
144
|
+
rescue Interrupt, Errno::EPIPE
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
# Hook methods
|
150
|
+
def do_show_usage
|
151
|
+
raise NotImplementedError.new
|
152
|
+
end
|
153
|
+
|
154
|
+
def do_start
|
155
|
+
raise NotImplementedError.new
|
156
|
+
end
|
157
|
+
|
158
|
+
def do_process_options(options)
|
159
|
+
raise NotImplementedError.new
|
160
|
+
end
|
161
|
+
|
162
|
+
def do_get_option_table
|
163
|
+
raise NotImplementedError.new
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.start
|
167
|
+
app = self.new
|
168
|
+
begin
|
169
|
+
app.start
|
170
|
+
rescue IncompatibleDBError => e
|
171
|
+
eprintf("%s", e.message)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|