Class: FileUtils::Entry_

Inherits:
Object show all
Includes:
StreamUtils_
Defined in:
lib/extensions/fileutils/fileutils.rb

Overview

:nodoc: internal use only

Constant Summary collapse

S_IF_DOOR =
0xD000

Instance Method Summary collapse

Constructor Details

#initialize(a, b = nil, deref = false) ⇒ Entry_

Returns a new instance of Entry_.



1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
# File 'lib/extensions/fileutils/fileutils.rb', line 1100

def initialize(a, b = nil, deref = false)
  @prefix = @rel = @path = nil
  if b
    @prefix = a
    @rel = b
  else
    @path = a
  end
  @deref = deref
  @stat = nil
  @lstat = nil
end

Instance Method Details

#blockdev?Boolean

Returns:

  • (Boolean)


1161
1162
1163
1164
# File 'lib/extensions/fileutils/fileutils.rb', line 1161

def blockdev?
  s = lstat!
  s and s.blockdev?
end

#chardev?Boolean

Returns:

  • (Boolean)


1156
1157
1158
1159
# File 'lib/extensions/fileutils/fileutils.rb', line 1156

def chardev?
  s = lstat!
  s and s.chardev?
end

#chmod(mode) ⇒ Object



1227
1228
1229
1230
1231
1232
1233
# File 'lib/extensions/fileutils/fileutils.rb', line 1227

def chmod(mode)
  if symlink?
    File.lchmod mode, path() if have_lchmod?
  else
    File.chmod mode, path()
  end
end

#chown(uid, gid) ⇒ Object



1235
1236
1237
1238
1239
1240
1241
# File 'lib/extensions/fileutils/fileutils.rb', line 1235

def chown(uid, gid)
  if symlink?
    File.lchown uid, gid, path() if have_lchown?
  else
    File.chown uid, gid, path()
  end
end

#copy(dest) ⇒ Object



1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
# File 'lib/extensions/fileutils/fileutils.rb', line 1243

def copy(dest)
  case
  when file?
    copy_file dest
  when directory?
    if !File.exist?(dest) and descendant_diretory?(dest, path)
      raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
    end
    begin
      Dir.mkdir dest
    rescue
      raise unless File.directory?(dest)
    end
  when symlink?
    File.symlink File.readlink(path()), dest
  when chardev?
    raise "cannot handle device file" unless File.respond_to?(:mknod)
    mknod dest, ?c, 0666, lstat().rdev
  when blockdev?
    raise "cannot handle device file" unless File.respond_to?(:mknod)
    mknod dest, ?b, 0666, lstat().rdev
  when socket?
    raise "cannot handle socket" unless File.respond_to?(:mknod)
    mknod dest, nil, lstat().mode, 0
  when pipe?
    raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
    mkfifo dest, 0666
  when door?
    raise "cannot handle door: #{path()}"
  else
    raise "unknown file type: #{path()}"
  end
end

#copy_file(dest) ⇒ Object



1277
1278
1279
1280
1281
1282
1283
# File 'lib/extensions/fileutils/fileutils.rb', line 1277

def copy_file(dest)
  File.open(path()) do |s|
    File.open(dest, 'wb') do |f|
      IO.copy_stream(s, f)
    end
  end
end

#copy_metadata(path) ⇒ Object



1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
# File 'lib/extensions/fileutils/fileutils.rb', line 1285

def (path)
  st = lstat()
  File.utime st.atime, st.mtime, path
  begin
    File.chown st.uid, st.gid, path
  rescue Errno::EPERM
    # clear setuid/setgid
    File.chmod st.mode & 01777, path
  else
    File.chmod st.mode, path
  end
end

#dereference?Boolean

Returns:

  • (Boolean)


1133
1134
1135
# File 'lib/extensions/fileutils/fileutils.rb', line 1133

def dereference?
  @deref
end

#directory?Boolean

Returns:

  • (Boolean)


1146
1147
1148
1149
# File 'lib/extensions/fileutils/fileutils.rb', line 1146

def directory?
  s = lstat!
  s and s.directory?
end

#door?Boolean

Returns:

  • (Boolean)


1178
1179
1180
1181
# File 'lib/extensions/fileutils/fileutils.rb', line 1178

def door?
  s = lstat!
  s and (s.mode & 0xF000 == S_IF_DOOR)
end

#entriesObject



1183
1184
1185
1186
1187
1188
1189
# File 'lib/extensions/fileutils/fileutils.rb', line 1183

def entries
  opts = {}
  opts[:encoding] = "UTF-8" if /mswin|mignw/ =~ RUBY_PLATFORM
  Dir.entries(path(), opts)\
      .reject {|n| n == '.' or n == '..' }\
      .map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) }
end

#exist?Boolean

Returns:

  • (Boolean)


1137
1138
1139
# File 'lib/extensions/fileutils/fileutils.rb', line 1137

def exist?
  lstat! ? true : false
end

#file?Boolean

Returns:

  • (Boolean)


1141
1142
1143
1144
# File 'lib/extensions/fileutils/fileutils.rb', line 1141

def file?
  s = lstat!
  s and s.file?
end

#inspectObject



1113
1114
1115
# File 'lib/extensions/fileutils/fileutils.rb', line 1113

def inspect
  "\#<#{self.class} #{path()}>"
end

#lstatObject



1213
1214
1215
1216
1217
1218
1219
# File 'lib/extensions/fileutils/fileutils.rb', line 1213

def lstat
  if dereference?
    @lstat ||= File.stat(path())
  else
    @lstat ||= File.lstat(path())
  end
end

#lstat!Object



1221
1222
1223
1224
1225
# File 'lib/extensions/fileutils/fileutils.rb', line 1221

def lstat!
  lstat()
rescue SystemCallError
  nil
end

#pathObject



1117
1118
1119
1120
1121
1122
1123
# File 'lib/extensions/fileutils/fileutils.rb', line 1117

def path
  if @path
    File.path(@path)
  else
    join(@prefix, @rel)
  end
end

#pipe?Boolean

Returns:

  • (Boolean)


1171
1172
1173
1174
# File 'lib/extensions/fileutils/fileutils.rb', line 1171

def pipe?
  s = lstat!
  s and s.pipe?
end

#platform_supportObject



1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
# File 'lib/extensions/fileutils/fileutils.rb', line 1318

def platform_support
  return yield unless fu_windows?
  first_time_p = true
  begin
    yield
  rescue Errno::ENOENT
    raise
  rescue => err
    if first_time_p
      first_time_p = false
      begin
        File.chmod 0700, path()   # Windows does not have symlink
        retry
      rescue SystemCallError
      end
    end
    raise err
  end
end

#postorder_traverse {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
# File 'lib/extensions/fileutils/fileutils.rb', line 1348

def postorder_traverse
  if directory?
    entries().each do |ent|
      ent.postorder_traverse do |e|
        yield e
      end
    end
  end
  yield self
end

#prefixObject



1125
1126
1127
# File 'lib/extensions/fileutils/fileutils.rb', line 1125

def prefix
  @prefix || @path
end

#preorder_traverseObject Also known as: traverse



1338
1339
1340
1341
1342
1343
1344
# File 'lib/extensions/fileutils/fileutils.rb', line 1338

def preorder_traverse
  stack = [self]
  while ent = stack.pop
    yield ent
    stack.concat ent.entries.reverse if ent.directory?
  end
end

#relObject



1129
1130
1131
# File 'lib/extensions/fileutils/fileutils.rb', line 1129

def rel
  @rel
end

#removeObject



1298
1299
1300
1301
1302
1303
1304
# File 'lib/extensions/fileutils/fileutils.rb', line 1298

def remove
  if directory?
    remove_dir1
  else
    remove_file
  end
end

#remove_dir1Object



1306
1307
1308
1309
1310
# File 'lib/extensions/fileutils/fileutils.rb', line 1306

def remove_dir1
  platform_support {
    Dir.rmdir path().sub(%r</\z>, '')
  }
end

#remove_fileObject



1312
1313
1314
1315
1316
# File 'lib/extensions/fileutils/fileutils.rb', line 1312

def remove_file
  platform_support {
    File.unlink path
  }
end

#socket?Boolean

Returns:

  • (Boolean)


1166
1167
1168
1169
# File 'lib/extensions/fileutils/fileutils.rb', line 1166

def socket?
  s = lstat!
  s and s.socket?
end

#statObject



1191
1192
1193
1194
1195
1196
1197
1198
1199
# File 'lib/extensions/fileutils/fileutils.rb', line 1191

def stat
  return @stat if @stat
  if lstat() and lstat().symlink?
    @stat = File.stat(path())
  else
    @stat = lstat()
  end
  @stat
end

#stat!Object



1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
# File 'lib/extensions/fileutils/fileutils.rb', line 1201

def stat!
  return @stat if @stat
  if lstat! and lstat!.symlink?
    @stat = File.stat(path())
  else
    @stat = lstat!
  end
  @stat
rescue SystemCallError
  nil
end

#symlink?Boolean

Returns:

  • (Boolean)


1151
1152
1153
1154
# File 'lib/extensions/fileutils/fileutils.rb', line 1151

def symlink?
  s = lstat!
  s and s.symlink?
end