rsense-core 0.5.6 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f14eab58a3824e82fd6ed4d0b6168e2465e73ce2
4
- data.tar.gz: b737028aaf80fb2c5cdf01aeb54c3400d15aec1b
3
+ metadata.gz: ea7d550cad6e3326f281dfe2d74b45490482a076
4
+ data.tar.gz: de4e8c69f48ae9d77e5348974c3c047e430eabd2
5
5
  SHA512:
6
- metadata.gz: c44f1b576c313106c3b96a8295039caae40cac4d00449de8ceb224fd327cf13916acbd93ba41589db4eb766d8433991c372d8b1664066ba8ddf5f05f34c566a7
7
- data.tar.gz: 43b6090789fff8fb57bbe829ffac37fb346e97d7b68fe79ecb97ed205e19a4b76e6a5f0cf61f3a8f0cffd140ee44231422dabb704c390737d91f3f04725cf7db
6
+ metadata.gz: d694a57f2ae66b9fa73a6a236caed7008b768816a7a1cbde5d0d9caa806af00a747b1e99f65c0981e38725703f731a9c7f42c3e0cf88b7501487e517d85e5846
7
+ data.tar.gz: 0a25325106b8d8cea07e02f2a87ffcd5c8ca5d399a1a63649bdcb6fc7109ce5045ed9b2d9de0a4f3874e8270592e85e09d590182aaefb986a220cd3094277d7a
data/lib/rsense.jar CHANGED
Binary file
@@ -1,5 +1,5 @@
1
1
  module Rsense
2
2
  module Core
3
- VERSION = "0.5.6"
3
+ VERSION = "0.5.8"
4
4
  end
5
5
  end
@@ -17,7 +17,7 @@ public class Ruby {
17
17
  private Context context;
18
18
  private ObjectAllocator allocator;
19
19
  private RubyModule kernelModule;
20
- private RubyClass objectClass, moduleClass, classClass,
20
+ private RubyClass basicObjectClass, objectClass, moduleClass, classClass,
21
21
  numericClass, integerClass, fixnumClass, bignumClass,
22
22
  floatClass, stringClass, symbolClass,
23
23
  booleanClass, trueClass, falseClass, nilClass,
@@ -32,20 +32,24 @@ public class Ruby {
32
32
  public Ruby() {
33
33
  allocator = new DefaultObjectAllocator();
34
34
 
35
- objectClass = RubyClass.newBootClass(this, "Object", null);
35
+ basicObjectClass = RubyClass.newBootClass(this, "BasicObject", null);
36
+ objectClass = RubyClass.newBootClass(this, "Object", basicObjectClass);
36
37
  moduleClass = RubyClass.newBootClass(this, "Module", objectClass);
37
38
  classClass = RubyClass.newBootClass(this, "Class", moduleClass);
38
39
 
40
+ basicObjectClass.setMetaClass(classClass);
39
41
  objectClass.setMetaClass(classClass);
40
42
  moduleClass.setMetaClass(classClass);
41
43
  classClass.setMetaClass(classClass);
42
44
 
43
45
  RubyClass metaClass;
46
+ metaClass = basicObjectClass.makeMetaClass(classClass);
44
47
  metaClass = objectClass.makeMetaClass(classClass);
45
48
  metaClass = moduleClass.makeMetaClass(metaClass);
46
49
  metaClass = classClass.makeMetaClass(metaClass);
47
50
 
48
51
  kernelModule = RubyModule.newModule(this, "Kernel", null);
52
+ basicObjectClass.includeModule(kernelModule);
49
53
  objectClass.includeModule(kernelModule);
50
54
  numericClass = RubyClass.newClass(this, "Numeric", objectClass);
51
55
  integerClass = RubyClass.newClass(this, "Integer", numericClass);
@@ -68,6 +72,7 @@ public class Ruby {
68
72
  fatalClass = RubyClass.newClass(this, "fatal", exceptionClass);
69
73
 
70
74
  objectClass.setConstant("Kernel", kernelModule);
75
+ objectClass.setConstant("BasicObject", basicObjectClass);
71
76
  objectClass.setConstant("Object", objectClass);
72
77
  objectClass.setConstant("Module", moduleClass);
73
78
  objectClass.setConstant("Class", classClass);
@@ -116,11 +121,11 @@ public class Ruby {
116
121
  public void setGlobalVar(String name, IRubyObject value) {
117
122
  globalVars.put(name, value);
118
123
  }
119
-
124
+
120
125
  public IRubyObject newInstance(RubyClass klass) {
121
126
  return allocator.allocate(this, klass);
122
127
  }
123
-
128
+
124
129
  public boolean isInstanceOf(IRubyObject object, RubyModule klass) {
125
130
  return object.getMetaClass() == klass;
126
131
  }
@@ -17,11 +17,11 @@ public class RubyClass extends RubyModule {
17
17
  public static RubyClass newClassWithLocation(Ruby runtime, String baseName, RubyClass superClass, SourceLocation location) {
18
18
  return newClassWithLocation(runtime, baseName, superClass, null, location);
19
19
  }
20
-
20
+
21
21
  public static RubyClass newClass(Ruby runtime, String baseName, RubyClass superClass, RubyModule parent) {
22
22
  return newClassWithLocation(runtime, baseName, superClass, parent, null);
23
23
  }
24
-
24
+
25
25
  public static RubyClass newClassWithLocation(Ruby runtime, String baseName, RubyClass superClass, RubyModule parent, SourceLocation location) {
26
26
  if (superClass == null) {
27
27
  superClass = runtime.getObject();
@@ -42,7 +42,7 @@ public class RubyClass extends RubyModule {
42
42
  protected RubyClass(Ruby runtime, RubyClass superClass) {
43
43
  this(runtime, superClass, null);
44
44
  }
45
-
45
+
46
46
  protected RubyClass(Ruby runtime, RubyClass superClass, RubyModule parent) {
47
47
  this(runtime, runtime.getClassClass(), superClass, parent, null);
48
48
  }
@@ -59,7 +59,7 @@ public class RubyClass extends RubyModule {
59
59
  public RubyClass getRealClass() {
60
60
  return this;
61
61
  }
62
-
62
+
63
63
  public RubyClass getSuperClass() {
64
64
  return superClass;
65
65
  }
@@ -1 +1 @@
1
- rsense.version = 0.5.6
1
+ rsense.version = 0.5.8
@@ -1920,6 +1920,52 @@ class Numeric
1920
1920
  def zero?() BOOLEAN end
1921
1921
  end
1922
1922
 
1923
+ class BasicObject
1924
+ ##% ==(a) -> Boolean
1925
+ def ==(other) BOOLEAN end
1926
+ ##% ===(a) -> Boolean
1927
+ def __id__() 0 end
1928
+ alias :object_id :__id__
1929
+
1930
+ ##% send(String or Symbol, *a) -> Object
1931
+ def send(name, *args) end
1932
+ ##% eql?(a) -> Boolean
1933
+ def eql?(other) BOOLEAN end
1934
+ ##% equal?(a) -> Boolean
1935
+ def equal?(other) BOOLEAN end
1936
+ ##% instance_eval(String, ?String, ?Integer) -> Object
1937
+ ##% instance_eval() {Object -> ?} -> Object
1938
+ def instance_eval(expr, filename = "(eval)", lineno = 1) Object.new end
1939
+ def method_missing(name, *args) end
1940
+ ##% singleton_methods(?Boolean) -> Array<String>
1941
+ def singleton_methods(inherited_too = true) [''] end
1942
+ def self.new()
1943
+ #This is a stub, used for indexing
1944
+ end
1945
+ def !=(other)
1946
+ self == other ? false : true
1947
+ end
1948
+
1949
+ def ! obj
1950
+ if obj
1951
+ true
1952
+ else
1953
+ false
1954
+ end
1955
+ end
1956
+
1957
+ def singleton_method_added(name) end
1958
+
1959
+ def singleton_method_removed(name) end
1960
+
1961
+ def singleton_method_undefined(name) end
1962
+
1963
+ def instance_exec(*args)
1964
+ Object.new
1965
+ end
1966
+ end
1967
+
1968
+
1923
1969
  class Object
1924
1970
  ##% ==(a) -> Boolean
1925
1971
  def ==(other) BOOLEAN end
@@ -0,0 +1,183 @@
1
+ class Delegator < BasicObject
2
+ kernel = ::Kernel.dup
3
+ kernel.class_eval do
4
+ alias __raise__ raise
5
+ [:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m|
6
+ undef_method m
7
+ end
8
+ private_instance_methods.each do |m|
9
+ if /\Ablock_given\?\z|iterator\?\z|\A__.*__\z/ =~ m
10
+ next
11
+ end
12
+ undef_method m
13
+ end
14
+ end
15
+ include kernel
16
+
17
+ # :stopdoc:
18
+ def self.const_missing(n)
19
+ ::Object.const_get(n)
20
+ end
21
+
22
+ def initialize(obj)
23
+ __setobj__(obj)
24
+ end
25
+
26
+ def method_missing(m, *args, &block)
27
+ r = true
28
+ target = self.__getobj__ {r = false}
29
+ begin
30
+ if r && target.respond_to?(m)
31
+ target.__send__(m, *args, &block)
32
+ elsif ::Kernel.respond_to?(m, true)
33
+ ::Kernel.instance_method(m).bind(self).(*args, &block)
34
+ else
35
+ super(m, *args, &block)
36
+ end
37
+ ensure
38
+ $@.delete_if {|t| %r"\A#{Regexp.quote(__FILE__)}:(?:#{[__LINE__-7, __LINE__-5, __LINE__-3].join('|')}):"o =~ t} if $@
39
+ end
40
+ end
41
+
42
+ def respond_to_missing?(m, include_private)
43
+ r = true
44
+ target = self.__getobj__ {r = false}
45
+ r &&= target.respond_to?(m, include_private)
46
+ if r && include_private && !target.respond_to?(m, false)
47
+ warn "#{caller(3)[0]}: delegator does not forward private method \##{m}"
48
+ return false
49
+ end
50
+ r
51
+ end
52
+
53
+ def methods(all=true)
54
+ __getobj__.methods(all) | super
55
+ end
56
+
57
+ def public_methods(all=true)
58
+ __getobj__.public_methods(all) | super
59
+ end
60
+
61
+ def protected_methods(all=true)
62
+ __getobj__.protected_methods(all) | super
63
+ end
64
+
65
+ def ==(obj)
66
+ return true if obj.equal?(self)
67
+ self.__getobj__ == obj
68
+ end
69
+
70
+ def !=(obj)
71
+ return false if obj.equal?(self)
72
+ __getobj__ != obj
73
+ end
74
+
75
+ def !
76
+ !__getobj__
77
+ end
78
+
79
+ def __getobj__
80
+ __raise__ ::NotImplementedError, "need to define `__getobj__'"
81
+ end
82
+
83
+ def __setobj__(obj)
84
+ __raise__ ::NotImplementedError, "need to define `__setobj__'"
85
+ end
86
+
87
+ def marshal_dump
88
+ ivars = instance_variables.reject {|var| /\A@delegate_/ =~ var}
89
+ [
90
+ :__v2__,
91
+ ivars, ivars.map{|var| instance_variable_get(var)},
92
+ __getobj__
93
+ ]
94
+ end
95
+
96
+ def marshal_load(data)
97
+ version, vars, values, obj = data
98
+ if version == :__v2__
99
+ vars.each_with_index{|var, i| instance_variable_set(var, values[i])}
100
+ __setobj__(obj)
101
+ else
102
+ __setobj__(data)
103
+ end
104
+ end
105
+
106
+ def initialize_clone(obj) # :nodoc:
107
+ self.__setobj__(obj.__getobj__.clone)
108
+ end
109
+ def initialize_dup(obj) # :nodoc:
110
+ self.__setobj__(obj.__getobj__.dup)
111
+ end
112
+ private :initialize_clone, :initialize_dup
113
+
114
+
115
+ [:trust, :untrust, :taint, :untaint, :freeze].each do |method|
116
+ define_method method do
117
+ __getobj__.send(method)
118
+ super()
119
+ end
120
+ end
121
+
122
+ @delegator_api = self.public_instance_methods
123
+ def self.public_api # :nodoc:
124
+ @delegator_api
125
+ end
126
+ end
127
+
128
+ class SimpleDelegator<Delegator
129
+
130
+ def __getobj__
131
+ unless defined?(@delegate_sd_obj)
132
+ return yield if block_given?
133
+ __raise__ ::ArgumentError, "not delegated"
134
+ end
135
+ @delegate_sd_obj
136
+ end
137
+
138
+ def __setobj__(obj)
139
+ __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
140
+ @delegate_sd_obj = obj
141
+ end
142
+ end
143
+
144
+ def Delegator.delegating_block(mid) # :nodoc:
145
+ lambda do |*args, &block|
146
+ target = self.__getobj__
147
+ begin
148
+ target.__send__(mid, *args, &block)
149
+ ensure
150
+ $@.delete_if {|t| /\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:/o =~ t} if $@
151
+ end
152
+ end
153
+ end
154
+
155
+ def DelegateClass(superclass)
156
+ klass = Class.new(Delegator)
157
+ methods = superclass.instance_methods
158
+ methods -= ::Delegator.public_api
159
+ methods -= [:to_s,:inspect,:=~,:!~,:===]
160
+ klass.module_eval do
161
+ def __getobj__ # :nodoc:
162
+ unless defined?(@delegate_dc_obj)
163
+ return yield if block_given?
164
+ __raise__ ::ArgumentError, "not delegated"
165
+ end
166
+ @delegate_dc_obj
167
+ end
168
+ def __setobj__(obj) # :nodoc:
169
+ __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
170
+ @delegate_dc_obj = obj
171
+ end
172
+ methods.each do |method|
173
+ define_method(method, Delegator.delegating_block(method))
174
+ end
175
+ end
176
+ klass.define_singleton_method :public_instance_methods do |all=true|
177
+ super(all) - superclass.protected_instance_methods
178
+ end
179
+ klass.define_singleton_method :protected_instance_methods do |all=true|
180
+ super(all) | superclass.protected_instance_methods
181
+ end
182
+ return klass
183
+ end
data/stubs/1.8/etc.rb ADDED
@@ -0,0 +1,41 @@
1
+ class Etc
2
+
3
+ Group = Struct.new(:name, :passwd, :gid, :mem)
4
+ Passwd = Struct.new(:name, :passwd, :uid, :gid, :dir, :shell)
5
+
6
+ @group = Group.new("foo", "bar", 1, ["foo", "bar"])
7
+ @passwd = Passwd.new("foo", "bar", 1, 1, "foo", "bar")
8
+
9
+ def endgrent(); end
10
+
11
+ def endpwent(); end
12
+
13
+ def getgrent(); return @group; end
14
+
15
+ def getgrgid(group_id); return @group; end
16
+
17
+ def getgrnam(name); return @group; end
18
+
19
+ def getlogin(); return "Bob"; end
20
+
21
+ def getpwent(); return @passwd; end
22
+
23
+ def getpwnam(name); return @passwd; end
24
+
25
+ def getpwuid(uid); return @passwd; end
26
+
27
+ def group(); @group; end
28
+
29
+ def passwd(); @passwd; end
30
+
31
+ def setgrent(); end
32
+
33
+ def setpwent(); end
34
+
35
+ def sysconfdir()
36
+ "/usr/local/etc"
37
+ end
38
+
39
+ def systmpdir(); "/tmp"; end
40
+
41
+ end
@@ -0,0 +1,834 @@
1
+ require_relative './etc'
2
+
3
+ module FileUtils
4
+ def self.private_module_function(name) #:nodoc:
5
+ module_function name
6
+ private_class_method name
7
+ end
8
+
9
+ OPT_TABLE = {}
10
+
11
+ def cd(dir, options);Dir.chdir(dir, &block);end
12
+ alias chdir cd
13
+ module_function :chdir
14
+
15
+ OPT_TABLE['cd'] =
16
+ OPT_TABLE['chdir'] = [:verbose]
17
+
18
+ def uptodate?(new, old_list)
19
+ return false unless File.exist?(new)
20
+ new_time = File.mtime(new)
21
+ old_list.each do |old|
22
+ if File.exist?(old)
23
+ return false unless new_time > File.mtime(old)
24
+ end
25
+ end
26
+ true
27
+ end
28
+ module_function :uptodate?
29
+
30
+ def pwd();""end
31
+ alias getwd pwd
32
+ module_function :getwd
33
+
34
+ def mkdir(dir, options);[""];end
35
+ def mkdir_p(dir, options);[""];end
36
+ alias mkpath mkdir_p
37
+ alias makedirs mkdir_p
38
+ module_function :mkpath
39
+ module_function :makedirs
40
+
41
+ OPT_TABLE['mkdir_p'] =
42
+ OPT_TABLE['mkpath'] =
43
+ OPT_TABLE['makedirs'] = [:mode, :noop, :verbose]
44
+
45
+ def rmdir(dir, options);[""];end
46
+ OPT_TABLE['rmdir'] = [:parents, :noop, :verbose]
47
+
48
+ def ln(list, destdir, options);0;end
49
+ alias link ln
50
+ module_function :link
51
+
52
+ OPT_TABLE['ln'] =
53
+ OPT_TABLE['link'] = [:force, :noop, :verbose]
54
+
55
+
56
+ def ln_s(list, destdir, options);0;end
57
+
58
+ alias symlink ln_s
59
+ module_function :symlink
60
+
61
+ OPT_TABLE['ln_s'] =
62
+ OPT_TABLE['symlink'] = [:force, :noop, :verbose]
63
+
64
+ def ln_sf(src, dest, options);0;end
65
+ OPT_TABLE['ln_sf'] = [:noop, :verbose]
66
+
67
+ def cp(list, dir, options);nil;end
68
+ def cp_r(src, dest, options);nil;end
69
+
70
+ alias copy cp
71
+ module_function :copy
72
+
73
+ OPT_TABLE['cp'] =
74
+ OPT_TABLE['copy'] = [:preserve, :noop, :verbose]
75
+
76
+ def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
77
+ Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent|
78
+ destent = Entry_.new(dest, ent.rel, false)
79
+ File.unlink destent.path if remove_destination && File.file?(destent.path)
80
+ ent.copy destent.path
81
+ end, proc do |ent|
82
+ destent = Entry_.new(dest, ent.rel, false)
83
+ ent.copy_metadata destent.path if preserve
84
+ end)
85
+ end
86
+ module_function :copy_entry
87
+
88
+ def copy_file(src, dest, preserve = false, dereference = true)
89
+ ent = Entry_.new(src, nil, dereference)
90
+ ent.copy_file dest
91
+ ent.copy_metadata dest if preserve
92
+ end
93
+ module_function :copy_file
94
+
95
+ def copy_stream(src, dest)
96
+ IO.copy_stream(src, dest)
97
+ end
98
+ module_function :copy_stream
99
+
100
+
101
+ def mv(src, dest, options);0;end
102
+ alias move mv
103
+ module_function :move
104
+
105
+ OPT_TABLE['mv'] =
106
+ OPT_TABLE['move'] = [:force, :noop, :verbose, :secure]
107
+
108
+ def rename_cannot_overwrite_file? #:nodoc:
109
+ /cygwin|mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
110
+ end
111
+ private_module_function :rename_cannot_overwrite_file?
112
+
113
+
114
+ def rm(list, options);[""];end
115
+ def rm_r(list, options);[""];end
116
+ def rm_rf(list, options);[""];end
117
+
118
+ alias remove rm
119
+ module_function :remove
120
+
121
+ OPT_TABLE['rm'] =
122
+ OPT_TABLE['remove'] = [:force, :noop, :verbose]
123
+
124
+ alias safe_unlink rm_f
125
+ module_function :safe_unlink
126
+
127
+ OPT_TABLE['rm_f'] =
128
+ OPT_TABLE['safe_unlink'] = [:noop, :verbose]
129
+
130
+ alias rmtree rm_rf
131
+ module_function :rmtree
132
+
133
+ OPT_TABLE['rm_rf'] =
134
+ OPT_TABLE['rmtree'] = [:noop, :verbose, :secure]
135
+
136
+ def remove_entry_secure(path, force = false);[""];end
137
+
138
+ def remove_entry(path, force = false)
139
+ Entry_.new(path).postorder_traverse do |ent|
140
+ begin
141
+ ent.remove
142
+ rescue
143
+ raise unless force
144
+ end
145
+ end
146
+ rescue
147
+ raise unless force
148
+ end
149
+ module_function :remove_entry
150
+
151
+ def remove_file(path, force = false)
152
+ Entry_.new(path).remove_file
153
+ rescue
154
+ raise unless force
155
+ end
156
+ module_function :remove_file
157
+
158
+ def remove_dir(path, force = false)
159
+ remove_entry path, force # FIXME?? check if it is a directory
160
+ end
161
+ module_function :remove_dir
162
+
163
+ def install(src, dest, options = {});nil;end
164
+
165
+ def compare_file(a, b)
166
+ return false unless File.size(a) == File.size(b)
167
+ File.open(a, 'rb') {|fa|
168
+ File.open(b, 'rb') {|fb|
169
+ return compare_stream(fa, fb)
170
+ }
171
+ }
172
+ end
173
+ module_function :compare_file
174
+
175
+ alias identical? compare_file
176
+ alias cmp compare_file
177
+ module_function :identical?
178
+ module_function :cmp
179
+
180
+ def compare_stream(a, b)
181
+ bsize = fu_stream_blksize(a, b)
182
+ sa = ""
183
+ sb = ""
184
+ begin
185
+ a.read(bsize, sa)
186
+ b.read(bsize, sb)
187
+ return true if sa.empty? && sb.empty?
188
+ end while sa == sb
189
+ false
190
+ end
191
+ module_function :compare_stream
192
+
193
+ def chmod(mode, list, options);[""];end
194
+ OPT_TABLE['chmod'] = [:noop, :verbose]
195
+
196
+ def chmod_R(mode, list, options);[""];end
197
+ OPT_TABLE['chmod_R'] = [:noop, :verbose, :force]
198
+
199
+ def chown(user, group, list, options);[""];end
200
+ OPT_TABLE['chown'] = [:noop, :verbose]
201
+
202
+ def chown_R(user, group, list, options);[""];end
203
+ OPT_TABLE['chown_R'] = [:noop, :verbose, :force]
204
+
205
+ def touch(list, options);[""];end
206
+ OPT_TABLE['touch'] = [:noop, :verbose, :mtime, :nocreate]
207
+
208
+ module_function :pwd
209
+ module_function :getwd
210
+ module_function :cd
211
+ module_function :mkdir
212
+ module_function :mkdir_p
213
+ module_function :rmdir
214
+ module_function :ln
215
+ module_function :ln_s
216
+ module_function :ln_sf
217
+ module_function :cp
218
+ module_function :cp_r
219
+ module_function :mv
220
+ module_function :rm
221
+ module_function :remove
222
+ module_function :rm_f
223
+ module_function :rm_r
224
+ module_function :rm_rf
225
+ module_function :chmod
226
+ module_function :chmod_R
227
+ module_function :chown
228
+ module_function :chown_R
229
+ module_function :touch
230
+
231
+ def remove_tailing_slash(dir)
232
+ dir == '/' ? dir : dir.chomp(?/)
233
+ end
234
+
235
+ private_module_function :remove_tailing_slash
236
+
237
+ def fu_mkdir(path, mode) #:nodoc:
238
+ path = remove_tailing_slash(path)
239
+ if mode
240
+ Dir.mkdir path, mode
241
+ File.chmod mode, path
242
+ else
243
+ Dir.mkdir path
244
+ end
245
+ end
246
+
247
+ private_module_function :fu_mkdir
248
+
249
+ def user_mask(target);1;end
250
+ private_module_function :user_mask
251
+
252
+ def apply_mask(mode, user_mask, op, mode_mask);1;end
253
+ private_module_function :apply_mask
254
+
255
+ def symbolic_modes_to_i(mode_sym, path);1;end
256
+ private_module_function :symbolic_modes_to_i
257
+
258
+ def fu_mode(mode, path);1;end
259
+ private_module_function :fu_mode
260
+
261
+ def mode_to_s(mode);"1";end
262
+ private_module_function :mode_to_s
263
+
264
+ def fu_get_uid(user);1;end
265
+ private_module_function :fu_get_uid
266
+
267
+ def fu_get_gid(group);1;end
268
+ private_module_function :fu_get_gid
269
+
270
+ def fu_list(arg)
271
+ [arg].flatten.map {|path| File.path(path) }
272
+ end
273
+
274
+ private_module_function :fu_list
275
+
276
+ def fu_each_src_dest(src, dest) #:nodoc:
277
+ fu_each_src_dest0(src, dest) do |s, d|
278
+ raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d)
279
+ yield s, d, File.stat(s)
280
+ end
281
+ end
282
+ private_module_function :fu_each_src_dest
283
+
284
+ def fu_each_src_dest0(src, dest) #:nodoc:
285
+ if tmp = Array.try_convert(src)
286
+ tmp.each do |s|
287
+ s = File.path(s)
288
+ yield s, File.join(dest, File.basename(s))
289
+ end
290
+ else
291
+ src = File.path(src)
292
+ if File.directory?(dest)
293
+ yield src, File.join(dest, File.basename(src))
294
+ else
295
+ yield src, File.path(dest)
296
+ end
297
+ end
298
+ end
299
+ private_module_function :fu_each_src_dest0
300
+
301
+ def fu_check_options(options, optdecl) #:nodoc:
302
+ h = options.dup
303
+ optdecl.each do |opt|
304
+ h.delete opt
305
+ end
306
+ raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless h.empty?
307
+ end
308
+ private_module_function :fu_check_options
309
+
310
+ def fu_have_symlink?
311
+ File.symlink nil, nil
312
+ rescue NotImplementedError
313
+ return false
314
+ rescue TypeError
315
+ return true
316
+ end
317
+ private_module_function :fu_have_symlink?
318
+
319
+ def fu_stat_identical_entry?(a, b)
320
+ a.dev == b.dev and a.ino == b.ino
321
+ end
322
+ private_module_function :fu_stat_identical_entry?
323
+
324
+
325
+ def fu_update_option(args, new)
326
+ if tmp = Hash.try_convert(args.last)
327
+ args[-1] = tmp.dup.update(new)
328
+ else
329
+ args.push new
330
+ end
331
+ args
332
+ end
333
+ private_module_function :fu_update_option
334
+
335
+ @fileutils_output = $stderr
336
+ @fileutils_label = ''
337
+
338
+ def fu_output_message(msg) #:nodoc:
339
+ @fileutils_output ||= $stderr
340
+ @fileutils_label ||= ''
341
+ @fileutils_output.puts @fileutils_label + msg
342
+ end
343
+
344
+ private_module_function :fu_output_message
345
+
346
+ module StreamUtils_
347
+ private
348
+
349
+ def fu_windows?
350
+ /mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
351
+ end
352
+
353
+ def fu_copy_stream0(src, dest, blksize = nil) #:nodoc:
354
+ IO.copy_stream(src, dest)
355
+ end
356
+
357
+ def fu_stream_blksize(*streams)
358
+ streams.each do |s|
359
+ next unless s.respond_to?(:stat)
360
+ size = fu_blksize(s.stat)
361
+ return size if size
362
+ end
363
+ fu_default_blksize()
364
+ end
365
+
366
+ def fu_blksize(st)
367
+ s = st.blksize
368
+ return nil unless s
369
+ return nil if s == 0
370
+ s
371
+ end
372
+
373
+ def fu_default_blksize
374
+ 1024
375
+ end
376
+ end
377
+
378
+ class Entry_ #:nodoc: internal use only
379
+ include StreamUtils_
380
+
381
+ def initialize(a, b = nil, deref = false)
382
+ @prefix = @rel = @path = nil
383
+ if b
384
+ @prefix = a
385
+ @rel = b
386
+ else
387
+ @path = a
388
+ end
389
+ @deref = deref
390
+ @stat = nil
391
+ @lstat = nil
392
+ end
393
+
394
+ def inspect
395
+ "\#<#{self.class} #{path()}>"
396
+ end
397
+
398
+ def path
399
+ if @path
400
+ File.path(@path)
401
+ else
402
+ join(@prefix, @rel)
403
+ end
404
+ end
405
+
406
+ def prefix
407
+ @prefix || @path
408
+ end
409
+
410
+ def rel
411
+ @rel
412
+ end
413
+
414
+ def dereference?
415
+ @deref
416
+ end
417
+
418
+ def exist?
419
+ lstat! ? true : false
420
+ end
421
+
422
+ def file?
423
+ s = lstat!
424
+ s and s.file?
425
+ end
426
+
427
+ def directory?
428
+ s = lstat!
429
+ s and s.directory?
430
+ end
431
+
432
+ def symlink?
433
+ s = lstat!
434
+ s and s.symlink?
435
+ end
436
+
437
+ def chardev?
438
+ s = lstat!
439
+ s and s.chardev?
440
+ end
441
+
442
+ def blockdev?
443
+ s = lstat!
444
+ s and s.blockdev?
445
+ end
446
+
447
+ def socket?
448
+ s = lstat!
449
+ s and s.socket?
450
+ end
451
+
452
+ def pipe?
453
+ s = lstat!
454
+ s and s.pipe?
455
+ end
456
+
457
+ S_IF_DOOR = 0xD000
458
+
459
+ def door?
460
+ s = lstat!
461
+ s and (s.mode & 0xF000 == S_IF_DOOR)
462
+ end
463
+
464
+ def entries
465
+ opts = {}
466
+ opts[:encoding] = ::Encoding::UTF_8 if fu_windows?
467
+ Dir.entries(path(), opts)\
468
+ .reject {|n| n == '.' or n == '..' }\
469
+ .map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) }
470
+ end
471
+
472
+ def stat
473
+ return @stat if @stat
474
+ if lstat() and lstat().symlink?
475
+ @stat = File.stat(path())
476
+ else
477
+ @stat = lstat()
478
+ end
479
+ @stat
480
+ end
481
+
482
+ def stat!
483
+ return @stat if @stat
484
+ if lstat! and lstat!.symlink?
485
+ @stat = File.stat(path())
486
+ else
487
+ @stat = lstat!
488
+ end
489
+ @stat
490
+ rescue SystemCallError
491
+ nil
492
+ end
493
+
494
+ def lstat
495
+ if dereference?
496
+ @lstat ||= File.stat(path())
497
+ else
498
+ @lstat ||= File.lstat(path())
499
+ end
500
+ end
501
+
502
+ def lstat!
503
+ lstat()
504
+ rescue SystemCallError
505
+ nil
506
+ end
507
+
508
+ def chmod(mode)
509
+ if symlink?
510
+ File.lchmod mode, path() if have_lchmod?
511
+ else
512
+ File.chmod mode, path()
513
+ end
514
+ end
515
+
516
+ def chown(uid, gid)
517
+ if symlink?
518
+ File.lchown uid, gid, path() if have_lchown?
519
+ else
520
+ File.chown uid, gid, path()
521
+ end
522
+ end
523
+
524
+ def copy(dest)
525
+ case
526
+ when file?
527
+ copy_file dest
528
+ when directory?
529
+ if !File.exist?(dest) and descendant_diretory?(dest, path)
530
+ raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
531
+ end
532
+ begin
533
+ Dir.mkdir dest
534
+ rescue
535
+ raise unless File.directory?(dest)
536
+ end
537
+ when symlink?
538
+ File.symlink File.readlink(path()), dest
539
+ when chardev?
540
+ raise "cannot handle device file" unless File.respond_to?(:mknod)
541
+ mknod dest, ?c, 0666, lstat().rdev
542
+ when blockdev?
543
+ raise "cannot handle device file" unless File.respond_to?(:mknod)
544
+ mknod dest, ?b, 0666, lstat().rdev
545
+ when socket?
546
+ raise "cannot handle socket" unless File.respond_to?(:mknod)
547
+ mknod dest, nil, lstat().mode, 0
548
+ when pipe?
549
+ raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
550
+ mkfifo dest, 0666
551
+ when door?
552
+ raise "cannot handle door: #{path()}"
553
+ else
554
+ raise "unknown file type: #{path()}"
555
+ end
556
+ end
557
+
558
+ def copy_file(dest)
559
+ File.open(path()) do |s|
560
+ File.open(dest, 'wb', s.stat.mode) do |f|
561
+ IO.copy_stream(s, f)
562
+ end
563
+ end
564
+ end
565
+
566
+ def copy_metadata(path)
567
+ st = lstat()
568
+ if !st.symlink?
569
+ File.utime st.atime, st.mtime, path
570
+ end
571
+ begin
572
+ if st.symlink?
573
+ begin
574
+ File.lchown st.uid, st.gid, path
575
+ rescue NotImplementedError
576
+ end
577
+ else
578
+ File.chown st.uid, st.gid, path
579
+ end
580
+ rescue Errno::EPERM
581
+ # clear setuid/setgid
582
+ if st.symlink?
583
+ begin
584
+ File.lchmod st.mode & 01777, path
585
+ rescue NotImplementedError
586
+ end
587
+ else
588
+ File.chmod st.mode & 01777, path
589
+ end
590
+ else
591
+ if st.symlink?
592
+ begin
593
+ File.lchmod st.mode, path
594
+ rescue NotImplementedError
595
+ end
596
+ else
597
+ File.chmod st.mode, path
598
+ end
599
+ end
600
+ end
601
+
602
+ def remove
603
+ if directory?
604
+ remove_dir1
605
+ else
606
+ remove_file
607
+ end
608
+ end
609
+
610
+ def remove_dir1
611
+ platform_support {
612
+ Dir.rmdir path().chomp(?/)
613
+ }
614
+ end
615
+
616
+ def remove_file
617
+ platform_support {
618
+ File.unlink path
619
+ }
620
+ end
621
+
622
+ def platform_support
623
+ return yield unless fu_windows?
624
+ first_time_p = true
625
+ begin
626
+ yield
627
+ rescue Errno::ENOENT
628
+ raise
629
+ rescue => err
630
+ if first_time_p
631
+ first_time_p = false
632
+ begin
633
+ File.chmod 0700, path() # Windows does not have symlink
634
+ retry
635
+ rescue SystemCallError
636
+ end
637
+ end
638
+ raise err
639
+ end
640
+ end
641
+
642
+ def preorder_traverse
643
+ stack = [self]
644
+ while ent = stack.pop
645
+ yield ent
646
+ stack.concat ent.entries.reverse if ent.directory?
647
+ end
648
+ end
649
+
650
+ alias traverse preorder_traverse
651
+
652
+ def postorder_traverse
653
+ if directory?
654
+ entries().each do |ent|
655
+ ent.postorder_traverse do |e|
656
+ yield e
657
+ end
658
+ end
659
+ end
660
+ yield self
661
+ end
662
+
663
+ def wrap_traverse(pre, post)
664
+ pre.call self
665
+ if directory?
666
+ entries.each do |ent|
667
+ ent.wrap_traverse pre, post
668
+ end
669
+ end
670
+ post.call self
671
+ end
672
+
673
+ private
674
+
675
+ $fileutils_rb_have_lchmod = nil
676
+
677
+ def have_lchmod?
678
+ # This is not MT-safe, but it does not matter.
679
+ if $fileutils_rb_have_lchmod == nil
680
+ $fileutils_rb_have_lchmod = check_have_lchmod?
681
+ end
682
+ $fileutils_rb_have_lchmod
683
+ end
684
+
685
+ def check_have_lchmod?
686
+ return false unless File.respond_to?(:lchmod)
687
+ File.lchmod 0
688
+ return true
689
+ rescue NotImplementedError
690
+ return false
691
+ end
692
+
693
+ $fileutils_rb_have_lchown = nil
694
+
695
+ def have_lchown?
696
+ # This is not MT-safe, but it does not matter.
697
+ if $fileutils_rb_have_lchown == nil
698
+ $fileutils_rb_have_lchown = check_have_lchown?
699
+ end
700
+ $fileutils_rb_have_lchown
701
+ end
702
+
703
+ def check_have_lchown?
704
+ return false unless File.respond_to?(:lchown)
705
+ File.lchown nil, nil
706
+ return true
707
+ rescue NotImplementedError
708
+ return false
709
+ end
710
+
711
+ def join(dir, base)
712
+ return File.path(dir) if not base or base == '.'
713
+ return File.path(base) if not dir or dir == '.'
714
+ File.join(dir, base)
715
+ end
716
+
717
+ if File::ALT_SEPARATOR
718
+ DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)".freeze
719
+ else
720
+ DIRECTORY_TERM = "(?=/|\\z)".freeze
721
+ end
722
+ SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
723
+
724
+ def descendant_diretory?(descendant, ascendant)
725
+ /\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
726
+ end
727
+ end # class Entry_
728
+
729
+ def fu_same?(a, b) #:nodoc:
730
+ File.identical?(a, b)
731
+ end
732
+ private_module_function :fu_same?
733
+
734
+ @fileutils_output = $stderr
735
+ @fileutils_label = ''
736
+
737
+ def FileUtils.commands
738
+ OPT_TABLE.keys
739
+ end
740
+
741
+ def FileUtils.options
742
+ OPT_TABLE.values.flatten.uniq.map {|sym| sym.to_s }
743
+ end
744
+
745
+ def FileUtils.have_option?(mid, opt)
746
+ li = OPT_TABLE[mid.to_s] or raise ArgumentError, "no such method: #{mid}"
747
+ li.include?(opt)
748
+ end
749
+
750
+ def FileUtils.options_of(mid)
751
+ OPT_TABLE[mid.to_s].map {|sym| sym.to_s }
752
+ end
753
+
754
+ def FileUtils.collect_method(opt)
755
+ OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
756
+ end
757
+
758
+ LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern)
759
+ module LowMethods
760
+ module_eval("private\n" + ::FileUtils::LOW_METHODS.map {|name| "def #{name}(*)end"}.join("\n"),
761
+ __FILE__, __LINE__)
762
+ end
763
+
764
+ METHODS = singleton_methods() - [:private_module_function,
765
+ :commands, :options, :have_option?, :options_of, :collect_method]
766
+
767
+ module Verbose
768
+ include FileUtils
769
+ @fileutils_output = $stderr
770
+ @fileutils_label = ''
771
+ ::FileUtils.collect_method(:verbose).each do |name|
772
+ module_eval(<<-EOS, __FILE__, __LINE__ + 1)
773
+ def #{name}(*args)
774
+ super(*fu_update_option(args, :verbose => true))
775
+ end
776
+ private :#{name}
777
+ EOS
778
+ end
779
+ extend self
780
+ class << self
781
+ ::FileUtils::METHODS.each do |m|
782
+ public m
783
+ end
784
+ end
785
+ end
786
+
787
+ module NoWrite
788
+ include FileUtils
789
+ include LowMethods
790
+ @fileutils_output = $stderr
791
+ @fileutils_label = ''
792
+ ::FileUtils.collect_method(:noop).each do |name|
793
+ module_eval(<<-EOS, __FILE__, __LINE__ + 1)
794
+ def #{name}(*args)
795
+ super(*fu_update_option(args, :noop => true))
796
+ end
797
+ private :#{name}
798
+ EOS
799
+ end
800
+ extend self
801
+ class << self
802
+ ::FileUtils::METHODS.each do |m|
803
+ public m
804
+ end
805
+ end
806
+ end
807
+
808
+ module DryRun
809
+ include FileUtils
810
+ include LowMethods
811
+ @fileutils_output = $stderr
812
+ @fileutils_label = ''
813
+ ::FileUtils.collect_method(:noop).each do |name|
814
+ module_eval(<<-EOS, __FILE__, __LINE__ + 1)
815
+ def #{name}(*args)
816
+ super(*fu_update_option(args, :noop => true, :verbose => true))
817
+ end
818
+ private :#{name}
819
+ EOS
820
+ end
821
+ extend self
822
+ class << self
823
+ ::FileUtils::METHODS.each do |m|
824
+ public m
825
+ end
826
+ end
827
+ end
828
+ end
829
+
830
+
831
+ module FileUtils
832
+ include StreamUtils_
833
+ extend StreamUtils_
834
+ end