tree.rb 0.3.6 → 0.3.7
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/bin/rjson.rb +9 -0
- data/bin/rtree +0 -0
- data/bin/tree_rb +0 -0
- data/examples/d3_treemap/d3.js +4149 -0
- data/examples/d3_treemap/d3.layout.js +1890 -0
- data/examples/d3_treemap/d3_tree_rb_output.json +380 -0
- data/examples/d3_treemap/d3_treemap.html +177 -0
- data/examples/d3_treemap/prova.html +84 -0
- data/examples/d3_treemap/style.css +89 -0
- data/examples/prova/flare.js +381 -0
- data/examples/prova/prova.html +99 -0
- data/lib/tree_rb/cli/cli_json.rb +320 -0
- data/lib/tree_rb/cli/cli_tree.rb +72 -49
- data/lib/tree_rb/directory_walker.rb +9 -4
- data/lib/tree_rb/version.rb +1 -1
- data/lib/tree_rb/visitors/directory_to_hash2_visitor.rb +414 -0
- data/lib/tree_rb_cli.rb +1 -0
- data/spec/fixtures/test_json/1.json +1 -0
- data/spec/tree_rb/cli/cli_json_spec.rb +40 -0
- data/spec/tree_rb/tree_dsl_with_derived_class_spec.rb +1 -1
- data/spec/tree_rb/util/dir_processor_spec.rb +1 -1
- data/tasks/tree_rb.rake +22 -0
- metadata +25 -2
@@ -0,0 +1,99 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<script type="text/javascript" src="http://mbostock.github.com/d3/d3.js"></script>
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
|
8
|
+
|
9
|
+
<div id="viz"></div>
|
10
|
+
|
11
|
+
<div id="#chart"></div>
|
12
|
+
|
13
|
+
<script type="text/javascript">
|
14
|
+
|
15
|
+
var sampleSVG = d3.select("#viz")
|
16
|
+
.append("svg")
|
17
|
+
.attr("width", 100)
|
18
|
+
.attr("height", 100);
|
19
|
+
|
20
|
+
sampleSVG.append("circle")
|
21
|
+
.style("stroke", "gray")
|
22
|
+
.style("fill", "white")
|
23
|
+
.attr("r", 40)
|
24
|
+
.attr("cx", 50)
|
25
|
+
.attr("cy", 50)
|
26
|
+
.on("mouseover", function () {d3.select(this).style("fill", "aliceblue");})
|
27
|
+
.on("mouseout", function () {d3.select(this).style("fill", "white");});
|
28
|
+
|
29
|
+
</script>
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
<script type="text/javascript" src="flare.js">
|
34
|
+
|
35
|
+
</script>
|
36
|
+
|
37
|
+
|
38
|
+
<script type="text/javascript">
|
39
|
+
|
40
|
+
|
41
|
+
var width = 960,
|
42
|
+
height = 500,
|
43
|
+
color = d3.scale.category20c();
|
44
|
+
|
45
|
+
var treemap = d3.layout.treemap()
|
46
|
+
.size([width, height])
|
47
|
+
.sticky(true)
|
48
|
+
.value(function (d) { return d.size; });
|
49
|
+
|
50
|
+
var div = d3.select("#chart").append("div")
|
51
|
+
.style("position", "relative")
|
52
|
+
.style("width", width + "px")
|
53
|
+
.style("height", height + "px");
|
54
|
+
|
55
|
+
|
56
|
+
d3.json("flare.json", function (json) {
|
57
|
+
div.data([json]).selectAll("div")
|
58
|
+
.data(treemap.nodes)
|
59
|
+
.enter().append("div")
|
60
|
+
.attr("class", "cell")
|
61
|
+
.style("background", function (d) { return d.children ? color(d.name) : null; })
|
62
|
+
.call(cell)
|
63
|
+
.text(function (d) { return d.children ? null : d.name; });
|
64
|
+
|
65
|
+
d3.select("#size").on("click", function () {
|
66
|
+
div.selectAll("div")
|
67
|
+
.data(treemap.value(function (d) { return d.size; }))
|
68
|
+
.transition()
|
69
|
+
.duration(1500)
|
70
|
+
.call(cell);
|
71
|
+
|
72
|
+
d3.select("#size").classed("active", true);
|
73
|
+
d3.select("#count").classed("active", false);
|
74
|
+
});
|
75
|
+
|
76
|
+
d3.select("#count").on("click", function () {
|
77
|
+
div.selectAll("div")
|
78
|
+
.data(treemap.value(function (d) { return 1; }))
|
79
|
+
.transition()
|
80
|
+
.duration(1500)
|
81
|
+
.call(cell);
|
82
|
+
|
83
|
+
d3.select("#size").classed("active", false);
|
84
|
+
d3.select("#count").classed("active", true);
|
85
|
+
});
|
86
|
+
});
|
87
|
+
|
88
|
+
function cell() {
|
89
|
+
this
|
90
|
+
.style("left", function (d) { return d.x + "px"; })
|
91
|
+
.style("top", function (d) { return d.y + "px"; })
|
92
|
+
.style("width", function (d) { return Math.max(0, d.dx - 1) + "px"; })
|
93
|
+
.style("height", function (d) { return Math.max(0, d.dy - 1) + "px"; });
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
</script>
|
98
|
+
</body>
|
99
|
+
</html>
|
@@ -0,0 +1,320 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module TreeRb
|
3
|
+
|
4
|
+
#
|
5
|
+
#
|
6
|
+
#
|
7
|
+
class CliJson
|
8
|
+
|
9
|
+
SUCCESS=0
|
10
|
+
FAILURE=1
|
11
|
+
|
12
|
+
def self.run
|
13
|
+
self.new.parse_args(ARGV)
|
14
|
+
end
|
15
|
+
|
16
|
+
def options_parser(options)
|
17
|
+
parser = OptionParser.new
|
18
|
+
parser.banner = "Usage: rjson.rb [options] [directory]"
|
19
|
+
parser.separator "pretty format json file"
|
20
|
+
parser.separator "Code https://github.com/tokiro/treevisitor. Feedback to tokiro.oyama@gmail.com"
|
21
|
+
|
22
|
+
#parser.separator ""
|
23
|
+
#parser.separator "Generic options: "
|
24
|
+
#
|
25
|
+
#parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
26
|
+
# options[:verbose] = v
|
27
|
+
#end
|
28
|
+
#
|
29
|
+
#parser.on("-q", "--quiet", "quiet mode as --no-verbose") do
|
30
|
+
# options[:verbose] = false
|
31
|
+
#end
|
32
|
+
#
|
33
|
+
parser.on("-o [FILE]", "--output [FILE]", String) do |v|
|
34
|
+
if options[:output]
|
35
|
+
puts "only one file of output can be used"
|
36
|
+
options[:exit] = true
|
37
|
+
end
|
38
|
+
options[:output] = v
|
39
|
+
end
|
40
|
+
|
41
|
+
options[:force_overwrite_output] = false
|
42
|
+
parser.on("--force", "overwrite output") do
|
43
|
+
options[:force_overwrite_output] = true
|
44
|
+
end
|
45
|
+
#
|
46
|
+
#parser.separator ""
|
47
|
+
#parser.separator "Filter options: "
|
48
|
+
#
|
49
|
+
#parser.on("-a", "All file are listed i.e. include dot files") do
|
50
|
+
# options[:all_files] = true
|
51
|
+
#end
|
52
|
+
#
|
53
|
+
#parser.on("-d", "List directories only") do
|
54
|
+
# options[:only_directories] = true
|
55
|
+
#end
|
56
|
+
#
|
57
|
+
#options[:only_files] = false
|
58
|
+
#parser.on("--only-files", "show only file implies -i") do
|
59
|
+
# options[:only_files] = true
|
60
|
+
# options[:show_indentation] = false
|
61
|
+
#end
|
62
|
+
#
|
63
|
+
#algos = %w[build-dir print-dir json json2 yaml sqlite]
|
64
|
+
#algo_aliases = { "b" => "build-dir", "v" => "print-dir", "j" => "json", "y" => "yaml", "s" => "sqlite" }
|
65
|
+
#
|
66
|
+
#algo_list = (algo_aliases.keys + algos).join(',')
|
67
|
+
#parser.on("--format ALGO", algos, algo_aliases, "select an algo", " (#{algo_list})") do |algo|
|
68
|
+
# options[:algo] = algo
|
69
|
+
#end
|
70
|
+
#
|
71
|
+
#parser.separator ""
|
72
|
+
#parser.separator "print options:"
|
73
|
+
#
|
74
|
+
##
|
75
|
+
## begin colorize
|
76
|
+
##
|
77
|
+
## copied from tree man page
|
78
|
+
#parser.on("-n", "Turn colorization off always, over-ridden by the -C option.") do
|
79
|
+
# options[:colorize_force] = false
|
80
|
+
#end
|
81
|
+
#
|
82
|
+
## copied from tree man page
|
83
|
+
#parser.on("-C",
|
84
|
+
# "Turn colorization on always, using built-in color",
|
85
|
+
# " defaults if the LS_COLORS environment variable is not set.",
|
86
|
+
# " Useful to colorize output to a pipe.") do
|
87
|
+
# options[:colorize_force] = true
|
88
|
+
#end
|
89
|
+
#
|
90
|
+
##
|
91
|
+
## end colorize
|
92
|
+
##
|
93
|
+
#
|
94
|
+
#options[:max_level] = nil
|
95
|
+
#parser.on("-L [LEVEL]", Integer, "Max display depth of the directory tree.") do |l|
|
96
|
+
# options[:max_level] = l
|
97
|
+
#end
|
98
|
+
#
|
99
|
+
#options[:show_full_path] = false
|
100
|
+
#parser.on("-f", "Prints the full path prefix for each file.") do
|
101
|
+
# options[:show_full_path] = true
|
102
|
+
#end
|
103
|
+
#
|
104
|
+
#parser.on("-s", "Print the size of each file in bytes along with the name.") do
|
105
|
+
# options[:show_size] = true
|
106
|
+
#end
|
107
|
+
#
|
108
|
+
#parser.on("-h",
|
109
|
+
# "Print the size of each file but in a more human readable way,",
|
110
|
+
# " e.g. appending a size letter for kilobytes (K), megabytes (M),",
|
111
|
+
# " gigabytes (G), terrabytes (T), petabytes (P) and exabytes (E).") do
|
112
|
+
# options[:show_size_human] = true
|
113
|
+
#end
|
114
|
+
#
|
115
|
+
#options[:show_indentation] = true
|
116
|
+
#parser.on("-i",
|
117
|
+
# "Makes tree not print the indentation lines, ",
|
118
|
+
# " useful when used in conjunction with the -f option.") do
|
119
|
+
# options[:show_indentation] = false
|
120
|
+
#end
|
121
|
+
#
|
122
|
+
#options[:show_md5] = false
|
123
|
+
#parser.on("--md5", "show md5 of file") do
|
124
|
+
# options[:show_md5] = true
|
125
|
+
#end
|
126
|
+
#
|
127
|
+
#options[:show_sha1] = false
|
128
|
+
#parser.on("--sha1", "show sha1 of a file") do
|
129
|
+
# options[:show_sha1] = true
|
130
|
+
#end
|
131
|
+
#
|
132
|
+
#options[:show_report] = true
|
133
|
+
#parser.on("--noreport", "Omits printing of the file and directory report at the end of the tree listing.") do
|
134
|
+
# options[:show_report] = false
|
135
|
+
#end
|
136
|
+
#
|
137
|
+
#parser.separator ""
|
138
|
+
#parser.separator "shortcut options:"
|
139
|
+
#
|
140
|
+
#options[:show_md5sum] = false
|
141
|
+
#parser.on("--md5sum", "show ake md5sum implies -i and --only-files") do
|
142
|
+
# options[:only_files] = true
|
143
|
+
# options[:show_md5sum] = true
|
144
|
+
# options[:show_indentation] = false
|
145
|
+
# options[:show_report] = false
|
146
|
+
#end
|
147
|
+
#
|
148
|
+
#options[:show_sha1sum] = false
|
149
|
+
#parser.on("--sha1sum", "show ake sha1sum output implies -i and --only-files") do
|
150
|
+
# options[:only_files] = true
|
151
|
+
# options[:show_sha1sum] = true
|
152
|
+
# options[:show_indentation] = false
|
153
|
+
# options[:show_report] = false
|
154
|
+
#end
|
155
|
+
#
|
156
|
+
#parser.separator ""
|
157
|
+
#parser.separator "Other options:"
|
158
|
+
#
|
159
|
+
parser.on_tail("--help", "Show this message") do
|
160
|
+
puts parser
|
161
|
+
options[:exit] = SUCCESS
|
162
|
+
end
|
163
|
+
|
164
|
+
parser.on_tail("--version", "Show the version") do
|
165
|
+
puts "tree.rb version #{TreeRb::VERSION}"
|
166
|
+
options[:exit] = SUCCESS
|
167
|
+
end
|
168
|
+
|
169
|
+
parser
|
170
|
+
end
|
171
|
+
|
172
|
+
def parse_args(argv)
|
173
|
+
options = { :verbose => true, :force => false, :algo => 'build-dir' }
|
174
|
+
parser = options_parser(options)
|
175
|
+
|
176
|
+
begin
|
177
|
+
rest = parser.parse(argv)
|
178
|
+
rescue OptionParser::InvalidOption => e
|
179
|
+
$stderr.puts e.to_s
|
180
|
+
$stderr.puts "try --help for help"
|
181
|
+
return FAILURE
|
182
|
+
rescue OptionParser::MissingArgument => e
|
183
|
+
$stderr.puts e.to_s
|
184
|
+
$stderr.puts "try --help for help"
|
185
|
+
return FAILURE
|
186
|
+
end
|
187
|
+
|
188
|
+
unless options[:exit].nil?
|
189
|
+
return options[:exit]
|
190
|
+
end
|
191
|
+
|
192
|
+
##
|
193
|
+
## option: output, force
|
194
|
+
##
|
195
|
+
output = $stdout
|
196
|
+
if options[:output]
|
197
|
+
filename = options[:output]
|
198
|
+
if File.exist?(filename) and not options[:force_overwrite_output]
|
199
|
+
$stderr.puts "catalog '#{filename}' exists use --force to overwrite"
|
200
|
+
return FAILURE
|
201
|
+
end
|
202
|
+
output = File.open(filename, "w")
|
203
|
+
$stderr.puts "Writing file '#{filename}'"
|
204
|
+
end
|
205
|
+
#
|
206
|
+
#if options[:colorize_force]
|
207
|
+
# options[:colorize] = options[:colorize_force]
|
208
|
+
#else
|
209
|
+
# options[:colorize] = output.isatty
|
210
|
+
#end
|
211
|
+
#
|
212
|
+
## TODO: capture CTRL^C to avoid show the stack trace
|
213
|
+
## http://ruby-doc.org/core-1.9.3/Kernel.html#method-i-trap
|
214
|
+
#Signal.trap('INT') { puts "intercepted ctr+c"; exit }
|
215
|
+
#
|
216
|
+
|
217
|
+
if rest.length < 1
|
218
|
+
$stderr.puts "missing arg"
|
219
|
+
return FAILURE
|
220
|
+
else
|
221
|
+
filename = rest[0]
|
222
|
+
end
|
223
|
+
|
224
|
+
#
|
225
|
+
##
|
226
|
+
## 1. build dir tree walker
|
227
|
+
##
|
228
|
+
#dirname = File.expand_path(dirname)
|
229
|
+
#dtw = DirTreeWalker.new(dirname, options)
|
230
|
+
#unless options[:all_files]
|
231
|
+
# dtw.ignore(/^\.[^.]+/) # ignore all file starting with "."
|
232
|
+
#end
|
233
|
+
#dtw.visit_file = !options[:only_directories]
|
234
|
+
#
|
235
|
+
#case options[:algo]
|
236
|
+
#
|
237
|
+
# when 'build-dir'
|
238
|
+
#
|
239
|
+
# visitor = BuildDirTreeVisitor.new(options)
|
240
|
+
# dtw.run(visitor)
|
241
|
+
#
|
242
|
+
# output.puts visitor.root.to_str('', options)
|
243
|
+
#
|
244
|
+
# if options[:show_report]
|
245
|
+
# output.puts
|
246
|
+
# output.puts "#{visitor.nr_directories} directories, #{visitor.nr_files} files"
|
247
|
+
# end
|
248
|
+
#
|
249
|
+
# when 'print-dir'
|
250
|
+
# visitor = PrintDirTreeVisitor.new
|
251
|
+
# dtw.run(visitor)
|
252
|
+
#
|
253
|
+
# when 'json'
|
254
|
+
# visitor = DirectoryToHashVisitor.new(dirname)
|
255
|
+
# root = dtw.run(visitor).root
|
256
|
+
# output.puts JSON.pretty_generate(root)
|
257
|
+
#
|
258
|
+
# when 'json2'
|
259
|
+
# visitor = DirectoryToHash2Visitor.new(dirname)
|
260
|
+
# root = dtw.run(visitor).root
|
261
|
+
# output.puts JSON.pretty_generate(root)
|
262
|
+
#
|
263
|
+
# when 'yaml'
|
264
|
+
# visitor = DirectoryToHashVisitor.new(dirname)
|
265
|
+
# root = dtw.run(visitor).root
|
266
|
+
# output.puts root.to_yaml
|
267
|
+
#
|
268
|
+
# when 'sqlite'
|
269
|
+
# begin
|
270
|
+
# require 'sqlite3'
|
271
|
+
# unless options[:output]
|
272
|
+
# $stderr.puts "need to specify the -o options"
|
273
|
+
# else
|
274
|
+
# output.close
|
275
|
+
# filename = options[:output]
|
276
|
+
# visitor = SqliteDirTreeVisitor.new(filename)
|
277
|
+
# #start = Time.now
|
278
|
+
# #me = self
|
279
|
+
# #bytes = 0
|
280
|
+
# dtw.run(visitor)
|
281
|
+
# end
|
282
|
+
#
|
283
|
+
# rescue LoadError
|
284
|
+
# puts 'You must gem install sqlite3 to use this output format'
|
285
|
+
# end
|
286
|
+
#
|
287
|
+
# else
|
288
|
+
# puts "unknown algo #{options[:algo]} specified"
|
289
|
+
#end
|
290
|
+
|
291
|
+
|
292
|
+
show_input = false
|
293
|
+
|
294
|
+
unless File.exists?(filename)
|
295
|
+
$stderr.puts "input file not exists '#{filename}'"
|
296
|
+
exit
|
297
|
+
end
|
298
|
+
|
299
|
+
my_json_str = File.read(filename)
|
300
|
+
|
301
|
+
if show_input
|
302
|
+
$stderr.puts "*************************"
|
303
|
+
$stderr.puts my_json_str
|
304
|
+
$stderr.puts "*************************"
|
305
|
+
end
|
306
|
+
|
307
|
+
begin
|
308
|
+
my_json = JSON(my_json_str)
|
309
|
+
rescue JSON::ParserError
|
310
|
+
$stderr.puts "json is malformed"
|
311
|
+
return FAILURE
|
312
|
+
end
|
313
|
+
|
314
|
+
output.puts JSON.pretty_generate(my_json)
|
315
|
+
|
316
|
+
return SUCCESS
|
317
|
+
end
|
318
|
+
|
319
|
+
end # end class
|
320
|
+
end # end module
|
data/lib/tree_rb/cli/cli_tree.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
module TreeRb
|
3
|
+
|
3
4
|
#
|
4
5
|
#
|
5
6
|
#
|
@@ -9,9 +10,7 @@ module TreeRb
|
|
9
10
|
self.new.parse_args(ARGV)
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
13
|
def options_parser(options)
|
14
|
-
|
15
14
|
parser = OptionParser.new
|
16
15
|
parser.banner = "Usage: tree.rb [options] [directory]"
|
17
16
|
parser.separator "list contents of directories in a tree-like format"
|
@@ -19,18 +18,32 @@ module TreeRb
|
|
19
18
|
parser.separator "Code https://github.com/tokiro/treevisitor. Feedback to tokiro.oyama@gmail.com"
|
20
19
|
|
21
20
|
parser.separator ""
|
22
|
-
parser.separator "options: "
|
21
|
+
parser.separator "Generic options: "
|
23
22
|
|
24
|
-
parser.on("--
|
25
|
-
|
26
|
-
options[:exit] = 1
|
23
|
+
parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
24
|
+
options[:verbose] = v
|
27
25
|
end
|
28
26
|
|
29
|
-
parser.on("--
|
30
|
-
|
31
|
-
|
27
|
+
parser.on("-q", "--quiet", "quiet mode as --no-verbose") do
|
28
|
+
options[:verbose] = false
|
29
|
+
end
|
30
|
+
|
31
|
+
parser.on("-o [FILE]", "--output [FILE]", String) do |v|
|
32
|
+
if options[:output]
|
33
|
+
puts "only one file of output can be used"
|
34
|
+
options[:exit] = true
|
35
|
+
end
|
36
|
+
options[:output] = v
|
32
37
|
end
|
33
38
|
|
39
|
+
options[:force_overwrite_output] = false
|
40
|
+
parser.on("--force", "overwrite output") do
|
41
|
+
options[:force_overwrite_output] = true
|
42
|
+
end
|
43
|
+
|
44
|
+
parser.separator ""
|
45
|
+
parser.separator "Filter options: "
|
46
|
+
|
34
47
|
parser.on("-a", "All file are listed i.e. include dot files") do
|
35
48
|
options[:all_files] = true
|
36
49
|
end
|
@@ -45,15 +58,7 @@ module TreeRb
|
|
45
58
|
options[:show_indentation] = false
|
46
59
|
end
|
47
60
|
|
48
|
-
|
49
|
-
options[:verbose] = v
|
50
|
-
end
|
51
|
-
|
52
|
-
parser.on("-q", "--quiet", "quiet mode as --no-verbose") do
|
53
|
-
options[:verbose] = false
|
54
|
-
end
|
55
|
-
|
56
|
-
algos = %w[build-dir print-dir json yaml sqlite]
|
61
|
+
algos = %w[build-dir print-dir json json2 yaml sqlite]
|
57
62
|
algo_aliases = { "b" => "build-dir", "v" => "print-dir", "j" => "json", "y" => "yaml", "s" => "sqlite" }
|
58
63
|
|
59
64
|
algo_list = (algo_aliases.keys + algos).join(',')
|
@@ -61,10 +66,8 @@ module TreeRb
|
|
61
66
|
options[:algo] = algo
|
62
67
|
end
|
63
68
|
|
64
|
-
|
65
|
-
parser.
|
66
|
-
options[:show_full_path] = true
|
67
|
-
end
|
69
|
+
parser.separator ""
|
70
|
+
parser.separator "print options:"
|
68
71
|
|
69
72
|
#
|
70
73
|
# begin colorize
|
@@ -75,7 +78,10 @@ module TreeRb
|
|
75
78
|
end
|
76
79
|
|
77
80
|
# copied from tree man page
|
78
|
-
parser.on("-C",
|
81
|
+
parser.on("-C",
|
82
|
+
"Turn colorization on always, using built-in color",
|
83
|
+
" defaults if the LS_COLORS environment variable is not set.",
|
84
|
+
" Useful to colorize output to a pipe.") do
|
79
85
|
options[:colorize_force] = true
|
80
86
|
end
|
81
87
|
|
@@ -83,21 +89,31 @@ module TreeRb
|
|
83
89
|
# end colorize
|
84
90
|
#
|
85
91
|
|
92
|
+
options[:max_level] = nil
|
93
|
+
parser.on("-L [LEVEL]", Integer, "Max display depth of the directory tree.") do |l|
|
94
|
+
options[:max_level] = l
|
95
|
+
end
|
96
|
+
|
97
|
+
options[:show_full_path] = false
|
98
|
+
parser.on("-f", "Prints the full path prefix for each file.") do
|
99
|
+
options[:show_full_path] = true
|
100
|
+
end
|
101
|
+
|
86
102
|
parser.on("-s", "Print the size of each file in bytes along with the name.") do
|
87
103
|
options[:show_size] = true
|
88
104
|
end
|
89
105
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
parser.on("-h", msg) do
|
106
|
+
parser.on("-h",
|
107
|
+
"Print the size of each file but in a more human readable way,",
|
108
|
+
" e.g. appending a size letter for kilobytes (K), megabytes (M),",
|
109
|
+
" gigabytes (G), terrabytes (T), petabytes (P) and exabytes (E).") do
|
96
110
|
options[:show_size_human] = true
|
97
111
|
end
|
98
112
|
|
99
113
|
options[:show_indentation] = true
|
100
|
-
parser.on("-i",
|
114
|
+
parser.on("-i",
|
115
|
+
"Makes tree not print the indentation lines, ",
|
116
|
+
" useful when used in conjunction with the -f option.") do
|
101
117
|
options[:show_indentation] = false
|
102
118
|
end
|
103
119
|
|
@@ -111,6 +127,14 @@ module TreeRb
|
|
111
127
|
options[:show_sha1] = true
|
112
128
|
end
|
113
129
|
|
130
|
+
options[:show_report] = true
|
131
|
+
parser.on("--noreport", "Omits printing of the file and directory report at the end of the tree listing.") do
|
132
|
+
options[:show_report] = false
|
133
|
+
end
|
134
|
+
|
135
|
+
parser.separator ""
|
136
|
+
parser.separator "shortcut options:"
|
137
|
+
|
114
138
|
options[:show_md5sum] = false
|
115
139
|
parser.on("--md5sum", "show ake md5sum implies -i and --only-files") do
|
116
140
|
options[:only_files] = true
|
@@ -127,29 +151,23 @@ module TreeRb
|
|
127
151
|
options[:show_report] = false
|
128
152
|
end
|
129
153
|
|
130
|
-
parser.
|
131
|
-
|
132
|
-
puts "only one file of output can be used"
|
133
|
-
options[:exit] = true
|
134
|
-
end
|
135
|
-
options[:output] = v
|
136
|
-
end
|
154
|
+
parser.separator ""
|
155
|
+
parser.separator "Other options:"
|
137
156
|
|
138
|
-
|
139
|
-
|
140
|
-
options[:
|
157
|
+
parser.on_tail("--help", "Show this message") do
|
158
|
+
puts parser
|
159
|
+
options[:exit] = 1
|
141
160
|
end
|
142
161
|
|
143
|
-
|
144
|
-
|
145
|
-
options[:
|
162
|
+
parser.on_tail("--version", "Show the version") do
|
163
|
+
puts "tree.rb version #{TreeRb::VERSION}"
|
164
|
+
options[:exit] = 1
|
146
165
|
end
|
147
166
|
|
148
167
|
parser
|
149
168
|
end
|
150
169
|
|
151
170
|
def parse_args(argv)
|
152
|
-
|
153
171
|
options = { :verbose => true, :force => false, :algo => 'build-dir' }
|
154
172
|
parser = options_parser(options)
|
155
173
|
|
@@ -189,6 +207,8 @@ module TreeRb
|
|
189
207
|
options[:colorize] = output.isatty
|
190
208
|
end
|
191
209
|
|
210
|
+
# TODO: capture CTRL^C to avoid show the stack trace
|
211
|
+
# http://ruby-doc.org/core-1.9.3/Kernel.html#method-i-trap
|
192
212
|
Signal.trap('INT') { puts "intercepted ctr+c"; exit }
|
193
213
|
|
194
214
|
if rest.length < 1
|
@@ -198,10 +218,10 @@ module TreeRb
|
|
198
218
|
end
|
199
219
|
|
200
220
|
#
|
201
|
-
# 1. build
|
221
|
+
# 1. build dir tree walker
|
202
222
|
#
|
203
223
|
dirname = File.expand_path(dirname)
|
204
|
-
dtw = DirTreeWalker.new(dirname)
|
224
|
+
dtw = DirTreeWalker.new(dirname, options)
|
205
225
|
unless options[:all_files]
|
206
226
|
dtw.ignore(/^\.[^.]+/) # ignore all file starting with "."
|
207
227
|
end
|
@@ -210,8 +230,6 @@ module TreeRb
|
|
210
230
|
case options[:algo]
|
211
231
|
|
212
232
|
when 'build-dir'
|
213
|
-
# TODO: capture CTRL^C to avoid show the stack trace
|
214
|
-
# http://ruby-doc.org/core-1.9.3/Kernel.html#method-i-trap
|
215
233
|
|
216
234
|
visitor = BuildDirTreeVisitor.new(options)
|
217
235
|
dtw.run(visitor)
|
@@ -232,6 +250,11 @@ module TreeRb
|
|
232
250
|
root = dtw.run(visitor).root
|
233
251
|
output.puts JSON.pretty_generate(root)
|
234
252
|
|
253
|
+
when 'json2'
|
254
|
+
visitor = DirectoryToHash2Visitor.new(dirname)
|
255
|
+
root = dtw.run(visitor).root
|
256
|
+
output.puts JSON.pretty_generate(root)
|
257
|
+
|
235
258
|
when 'yaml'
|
236
259
|
visitor = DirectoryToHashVisitor.new(dirname)
|
237
260
|
root = dtw.run(visitor).root
|
@@ -245,7 +268,7 @@ module TreeRb
|
|
245
268
|
else
|
246
269
|
output.close
|
247
270
|
filename = options[:output]
|
248
|
-
visitor
|
271
|
+
visitor = SqliteDirTreeVisitor.new(filename)
|
249
272
|
#start = Time.now
|
250
273
|
#me = self
|
251
274
|
#bytes = 0
|