file-find 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +4 -0
- data/README +30 -2
- data/lib/file/find.rb +36 -3
- data/test/tc_find.rb +39 -1
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 0.2.0 - 26-Apr-2007
|
2
|
+
* Fixed a bug where it was not traversing subdirectories.
|
3
|
+
* Added support for the perm and prune options.
|
4
|
+
|
1
5
|
== 0.1.1 - 25-Apr-2007
|
2
6
|
* The default for name is now '*', i.e. everything.
|
3
7
|
* Fixed a bug where directories were not matched. Thanks go to Leslie Viljoen
|
data/README
CHANGED
@@ -35,6 +35,8 @@ few options, hasn't been updated in over six years and isn't packaged properly.
|
|
35
35
|
* group
|
36
36
|
* name
|
37
37
|
* path
|
38
|
+
* perm
|
39
|
+
* prune
|
38
40
|
* size
|
39
41
|
* user
|
40
42
|
|
@@ -47,13 +49,39 @@ http://www.rubyforge.org/projects/shards.
|
|
47
49
|
|
48
50
|
Some specific things I plan on adding:
|
49
51
|
|
50
|
-
*
|
51
|
-
*
|
52
|
+
* exec
|
53
|
+
* links
|
54
|
+
|
55
|
+
= Options that I won't support
|
56
|
+
Generally speaking, anything that would require mucking around with C code
|
57
|
+
or is just too difficult to implement in a cross platform manner will not be
|
58
|
+
supported. These include the following options:
|
59
|
+
|
60
|
+
* acl/xattr - Way to difficult to implement in a cross platform manner, and a
|
61
|
+
rarely used option to boot.
|
62
|
+
|
63
|
+
* cpio/ncpio - You can shell out on your own if you want, but I'm not going to
|
64
|
+
do it for you. The same goes for any similar options that your particular
|
65
|
+
platform may support.
|
66
|
+
|
67
|
+
* ls/print - You can print file names as you see fit on your own. This isn't
|
68
|
+
a shell command replacement.
|
69
|
+
|
70
|
+
* ok - This is not interactive software.
|
71
|
+
|
72
|
+
= Options I may or may not support
|
73
|
+
|
74
|
+
* local/mount/xdev - This will probably not be added until I'm satisified with
|
75
|
+
the sys-filesystem package.
|
52
76
|
|
53
77
|
= Bugs
|
54
78
|
None that I'm aware of. Please log any bug reports on the project page at
|
55
79
|
http://www.rubyforge.org/projects/shards.
|
56
80
|
|
81
|
+
= Acknowledgements
|
82
|
+
* Richard Clamp's File::Find::Rule Perl module for additional ideas and
|
83
|
+
inspiration.
|
84
|
+
|
57
85
|
= License
|
58
86
|
Ruby's
|
59
87
|
|
data/lib/file/find.rb
CHANGED
@@ -2,7 +2,7 @@ require 'date'
|
|
2
2
|
|
3
3
|
class File::Find
|
4
4
|
# The version of this package
|
5
|
-
VERSION = '0.
|
5
|
+
VERSION = '0.2.0'
|
6
6
|
|
7
7
|
# :stopdoc:
|
8
8
|
VALID_OPTIONS = %w/
|
@@ -14,6 +14,8 @@ class File::Find
|
|
14
14
|
group
|
15
15
|
name
|
16
16
|
path
|
17
|
+
perm
|
18
|
+
prune
|
17
19
|
size
|
18
20
|
user
|
19
21
|
/
|
@@ -66,6 +68,17 @@ class File::Find
|
|
66
68
|
#
|
67
69
|
attr_accessor :name
|
68
70
|
|
71
|
+
# Limits searches to files which have permissions that match the octal
|
72
|
+
# value that you provide. For purposes of this comparison, only the user,
|
73
|
+
# group, and world settings are used. Do not use a leading 0 in the values
|
74
|
+
# that you supply, e.g. use 755 not 0755.
|
75
|
+
#
|
76
|
+
attr_accessor :perm
|
77
|
+
|
78
|
+
# Skips files or directories that match the string provided as an argument.
|
79
|
+
#
|
80
|
+
attr_accessor :prune
|
81
|
+
|
69
82
|
# If the value passed is an integer, this option limits searches to files
|
70
83
|
# that match the size, in bytes, exactly. If a string is passed, you can
|
71
84
|
# use the standard comparable operators to match files, e.g. ">= 200" would
|
@@ -92,6 +105,8 @@ class File::Find
|
|
92
105
|
@group = nil
|
93
106
|
@follow = true
|
94
107
|
@inum = nil
|
108
|
+
@perm = nil
|
109
|
+
@prune = nil
|
95
110
|
@size = nil
|
96
111
|
@user = nil
|
97
112
|
|
@@ -107,7 +122,13 @@ class File::Find
|
|
107
122
|
#
|
108
123
|
def find
|
109
124
|
results = [] unless block_given?
|
110
|
-
paths =
|
125
|
+
paths = @path.to_a
|
126
|
+
|
127
|
+
if @prune
|
128
|
+
prune_regex = Regexp.new(@prune)
|
129
|
+
else
|
130
|
+
prune_regex = nil
|
131
|
+
end
|
111
132
|
|
112
133
|
catch(:loop) do
|
113
134
|
paths.each{ |path|
|
@@ -115,6 +136,11 @@ class File::Find
|
|
115
136
|
next if file == '.'
|
116
137
|
next if file == '..'
|
117
138
|
|
139
|
+
if prune_regex
|
140
|
+
next if prune_regex.match(file)
|
141
|
+
end
|
142
|
+
|
143
|
+
orig = file.dup
|
118
144
|
file = File.join(path, file)
|
119
145
|
|
120
146
|
stat_method = @follow ? :lstat : :stat
|
@@ -130,17 +156,20 @@ class File::Find
|
|
130
156
|
end
|
131
157
|
|
132
158
|
glob = File.join(File.dirname(file), @name)
|
133
|
-
next unless Dir[glob].include?(file)
|
134
159
|
|
135
160
|
# Add directories back onto the list of paths to search unless
|
136
161
|
# they've already been added.
|
137
162
|
#
|
163
|
+
# TODO: Add max_depth support here
|
164
|
+
#
|
138
165
|
if stat_info.directory?
|
139
166
|
unless paths.include?(file)
|
140
167
|
paths << file
|
141
168
|
end
|
142
169
|
end
|
143
170
|
|
171
|
+
next unless Dir[glob].include?(file)
|
172
|
+
|
144
173
|
if @atime
|
145
174
|
date1 = Date.parse(Time.now.to_s)
|
146
175
|
date2 = Date.parse(stat_info.atime.to_s)
|
@@ -167,6 +196,10 @@ class File::Find
|
|
167
196
|
end
|
168
197
|
end
|
169
198
|
|
199
|
+
if @perm
|
200
|
+
next unless sprintf("%o", stat_info.mode & 07777) == @perm.to_s
|
201
|
+
end
|
202
|
+
|
170
203
|
# Allow plain numbers, or strings for comparison operators.
|
171
204
|
if @size
|
172
205
|
if @size.is_a?(String)
|
data/test/tc_find.rb
CHANGED
@@ -12,17 +12,27 @@ class TC_File_Find < Test::Unit::TestCase
|
|
12
12
|
def setup
|
13
13
|
@file1 = 'test1.rb'
|
14
14
|
@file2 = 'test1.txt'
|
15
|
+
@file3 = 'foo.txt'
|
15
16
|
@link1 = 'link1'
|
17
|
+
@dir1 = 'dir1'
|
18
|
+
@dir2 = 'dir2'
|
16
19
|
|
17
20
|
File.open(@file1, 'w'){}
|
18
21
|
File.open(@file2, 'w'){}
|
22
|
+
File.open(@file3, 'w'){}
|
19
23
|
File.symlink(@file1, @link1)
|
20
24
|
|
25
|
+
Dir.mkdir(@dir1) unless File.exists?(@dir1)
|
26
|
+
Dir.mkdir(@dir2) unless File.exists?(@dir2)
|
27
|
+
|
28
|
+
File.open(File.join(@dir1, 'bar.txt'), 'w'){}
|
29
|
+
File.open(File.join(@dir2, 'baz.txt'), 'w'){}
|
30
|
+
|
21
31
|
@rule1 = File::Find.new(:name => '*.rb')
|
22
32
|
end
|
23
33
|
|
24
34
|
def test_version
|
25
|
-
assert_equal('0.
|
35
|
+
assert_equal('0.2.0', File::Find::VERSION)
|
26
36
|
end
|
27
37
|
|
28
38
|
def test_path
|
@@ -103,6 +113,31 @@ class TC_File_Find < Test::Unit::TestCase
|
|
103
113
|
assert_equal('*.rb', @rule1.name)
|
104
114
|
end
|
105
115
|
|
116
|
+
def test_perm_basic
|
117
|
+
assert_respond_to(@rule1, :perm)
|
118
|
+
assert_respond_to(@rule1, :perm=)
|
119
|
+
assert_nil(@rule1.perm)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_perm
|
123
|
+
File.chmod(0666, @file1)
|
124
|
+
File.chmod(0644, @file2)
|
125
|
+
results = File::Find.new(:name => "test1*", :perm => 666).find
|
126
|
+
assert_equal(true, results.length == 1)
|
127
|
+
assert_equal('test1.rb', File.basename(results.first))
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_prune_basic
|
131
|
+
assert_respond_to(@rule1, :prune)
|
132
|
+
assert_respond_to(@rule1, :prune=)
|
133
|
+
assert_nil(@rule1.prune)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_prune
|
137
|
+
rule = File::Find.new(:name => "*.txt", :prune => 'foo')
|
138
|
+
assert_equal('test1.txt', File.basename(rule.find.first))
|
139
|
+
end
|
140
|
+
|
106
141
|
def test_size_basic
|
107
142
|
assert_respond_to(@rule1, :size)
|
108
143
|
assert_respond_to(@rule1, :size=)
|
@@ -122,6 +157,9 @@ class TC_File_Find < Test::Unit::TestCase
|
|
122
157
|
def teardown
|
123
158
|
FileUtils.rm_rf(@file1)
|
124
159
|
FileUtils.rm_rf(@file2)
|
160
|
+
FileUtils.rm_rf(@file3)
|
125
161
|
FileUtils.rm_rf(@link1)
|
162
|
+
FileUtils.rm_rf(@dir1)
|
163
|
+
FileUtils.rm_rf(@dir2)
|
126
164
|
end
|
127
165
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: file-find
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-04-
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2007-04-26 00:00:00 -06:00
|
8
8
|
summary: A better way to find files
|
9
9
|
require_paths:
|
10
10
|
- lib
|