| Class | FileUtils::CopyContext_ |
| In: |
lib/fileutils.rb
|
| Parent: | Object |
# File lib/fileutils.rb, line 448
448: def initialize(preserve = false, dereference = false, stat = nil)
449: @preserve = preserve
450: @dereference = dereference
451: @stat = stat
452: end
# File lib/fileutils.rb, line 460
460: def copy_content(src, dest)
461: preserve(src, dest) {
462: _copy_content src, dest
463: }
464: end
# File lib/fileutils.rb, line 454
454: def copy_entry(src, dest)
455: preserve(src, dest) {
456: _copy_entry src, dest
457: }
458: end
# File lib/fileutils.rb, line 500
500: def _copy_content(src, dest)
501: st = stat(src)
502: File.open(src, 'rb') {|r|
503: File.open(dest, 'wb', st.mode) {|w|
504: fu_copy_stream0 r, w, (fu_blksize(st) || fu_default_blksize())
505: }
506: }
507: end
# File lib/fileutils.rb, line 468
468: def _copy_entry(src, dest)
469: st = stat(src)
470: case
471: when st.file?
472: _copy_content src, dest
473: when st.directory?
474: begin
475: Dir.mkdir File.expand_path(dest)
476: rescue => err
477: raise unless File.directory?(dest)
478: end
479: when st.symlink?
480: File.symlink File.readlink(src), dest
481: when st.chardev?
482: raise "cannot handle device file" unless File.respond_to?(:mknod)
483: mknod dest, ?c, 0666, st.rdev
484: when st.blockdev?
485: raise "cannot handle device file" unless File.respond_to?(:mknod)
486: mknod dest, ?b, 0666, st.rdev
487: when st.socket?
488: raise "cannot handle socket" unless File.respond_to?(:mknod)
489: mknod dest, nil, st.mode, 0
490: when st.pipe?
491: raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
492: mkfifo dest, 0666
493: when (st.mode & 0xF000) == (_S_IF_DOOR = 0xD000) # door
494: raise "cannot handle door: #{src}"
495: else
496: raise "unknown file type: #{src}"
497: end
498: end
# File lib/fileutils.rb, line 528
528: def chmod(mode, path)
529: if @dereference
530: ::File.chmod mode, path
531: else
532: begin
533: ::File.lchmod mode, path
534: rescue NotImplementedError
535: # just ignore this because chmod(symlink) changes attributes of
536: # symlink target, which is not our intent.
537: end
538: end
539: end
# File lib/fileutils.rb, line 541
541: def chown(uid, gid, path)
542: if @dereference
543: ::File.chown uid, gid, path
544: else
545: begin
546: ::File.lchown uid, gid, path
547: rescue NotImplementedError
548: # just ignore this because chown(symlink) changes attributes of
549: # symlink target, which is not our intent.
550: end
551: end
552: end
# File lib/fileutils.rb, line 509
509: def preserve(src, dest)
510: return yield unless @preserve
511: st = stat(src)
512: yield
513: File.utime st.atime, st.mtime, dest
514: begin
515: chown st.uid, st.gid, dest
516: rescue Errno::EPERM
517: # clear setuid/setgid
518: chmod st.mode & 01777, dest
519: else
520: chmod st.mode, dest
521: end
522: end