lib/pa/cmd.rb in pa-1.2.3 vs lib/pa/cmd.rb in pa-1.3.0

- old
+ new

@@ -7,10 +7,27 @@ * rm_r _rm recurive, both file and directory_ * rm_if _with condition, use rm_r_ === Example rm path # it's clear: remove a file rmdir path # it's clear: remove a directory + +:verbose and :show_cmd options, almost every cmd has these two options. + +Pa.mv "dira", "dirb", :show_cmd => true + > mv dira dirb + +Pa.mv "dira", "dirb", :verbose => true + > rename dira/filea dirb/filea + > rename dira/fileb dirb/fileb + +Pa.touch "a b c", :show_cmd => true + > touch a b c + +Pa.touch "a b c", :verbose => true + > touch a + > touch b + > touch c =end class Pa module Cmd extend Util::Concern module ClassMethods @@ -25,10 +42,13 @@ # @overload ln(src, dest) # @overload ln([src,..], directory) # # @param [Array<String>, String] src_s support globbing # @param [String,Pa] dest + # @param [Hash] o + # @option o [Boolean] :show_cmd puts cmd + # @option o [Boolean] :verbose verbose mode # @return [nil] def ln(src_s, dest, o={}) _ln(:link, src_s, dest, o) end @@ -67,26 +87,28 @@ # change directory # # @param [String,Pa] path # @param [Hash] o # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd def cd(path=ENV["HOME"], o={}, &blk) p = get(path) - puts "cd #{p}" if o[:verbose] + puts "cd #{p}" if (o[:verbose] or o[:show_cmd]) Dir.chdir(p, &blk) end # chroot # @see {Dir.chroot} # # @param [String] path # @param [Hash] o # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @return [nil] def chroot(path, o={}) p = get(path) - puts "chdroot #{p}" if o[:verbose] + puts "chdroot #{p}" if (o[:verbose] or o[:show_cmd]) Dir.chroot(p) end # touch a blank file # @@ -94,11 +116,12 @@ # @param [String] *paths # @param [Hash] o option # @option o [Fixnum,String] :mode (0664) # @option o [Boolean] :mkdir auto mkdir if path contained directory not exists. # @option o [Boolean] :force - # @option o [Boolean] :verbose + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @return [nil] def touch(*args) paths, o = Util.extract_options(args) _touch(paths, o) end @@ -119,11 +142,12 @@ # @overload mkdir(*paths, o={}) # @param [String, Pa] *paths # @param [Hash] o option # @option o [Fixnum] :mode (0775) # @option o [Boolean] :force - # @option o [Boolean] :verbose + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @return [nil] def mkdir(*args) paths, o = Util.extract_options(args) _mkdir(paths, o) end @@ -142,18 +166,19 @@ # make temp directory # # @overload mktmpdir(name, o={}, &blk) # @param [Hash] o options # @option o [String] :tmpdir (ENV["TEMP"]) - # @option o [Symbol] :verbose + # @option o [Symbol] :verbose verbose mode + # @option o [Symbol] :show_cmd puts cmd # @return [String] path # @overload mktmpdir(o={}, &blk) # name=$$ def mktmpdir(*args, &blk) (name,), o = Util.extract_options(args) p = _mktmpname(name, o) - puts "mktmpdir #{p}" if o[:verbose] + puts "mktmpdir #{p}" if (o[:verbose] or o[:show_cmd]) Dir.mkdir(p) begin blk.call(p) @@ -167,18 +192,19 @@ # make temp file # @see mktmpdir # # @overload mktmpfile2(name=$$, o={}, &blk) # @param [Hash] o options - # @option o [Boolean] :verbose + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @option o [String] :tmpdir # @return [String] path def mktmpfile2(*args, &blk) (name,), o = Util.extract_options(args) p = _mktmpname(name, o) - puts "mktmpfile #{p}" if o[:verbose] + puts "mktmpfile #{p}" if (o[:verbose] or o[:show_cmd]) begin blk.call(p) ensure File.delete(p) @@ -190,11 +216,11 @@ # @return [Pa] path def mktmpfile(*args, &blk) (name,), o = Util.extract_options(args) p = _mktmpname(name, o) - puts "mktmpfile #{p}" if o[:verbose] + puts "mktmpfile #{p}" if (o[:verbose] or o[:show_cmd]) begin blk.call(Pa(p)) ensure File.delete(p) @@ -205,16 +231,19 @@ # rm file only # # @overload rm(*paths, o={}) # @param [String] *paths support globbing - # @param o [Boolean] :verbose + # @param o [Boolean] :verbose verbose mode + # @param o [Boolean] :show_cmd puts cmd # @return [nil] def rm(*paths) paths, o = Util.extract_options(paths) - glob(*paths) { |pa| - extra_doc = o[:force] ? "-f " : nil + extra_doc = o[:force] ? "-f " : nil + puts "rm #{extra_doc}#{paths.join(" ")}" if o[:show_cmd] + + Pa.glob(*paths) { |pa| puts "rm #{extra_doc}#{pa.p}" if o[:verbose] if File.directory?(pa.p) if o[:force] next @@ -234,16 +263,20 @@ end # rm directory only. still remove if directory is not empty. # # @param [String] *paths support globbing + # @param [Hash] o options + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @return [nil] def rmdir(*paths) paths, o = Util.extract_options(paths) - glob(*paths) { |pa| - extra_doc = o[:force] ? "-f " : nil - puts "rmdir #{extra_doc}#{pa.p}" if o[:verbose] + extra_doc = o[:force] ? "-f " : nil + puts "rmdir #{extra_doc}#{paths.join(" ")}" if o[:show_cmd] + Pa.glob(*paths) { |pa| + puts " rmdir #{extra_doc}#{pa.p}" if o[:verbose] if not File.directory?(pa.p) if o[:force] next else @@ -257,18 +290,53 @@ def rmdir_f(*paths) paths, o = Util.extract_options(paths) o[:force] = true rmdir *paths, o end + + # empty a directory. + # + # @example + # + # empty_dir("foo") + # + # @param [String] *dirs + # @param [Hash] o options + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd + # @return [nil] + def empty_dir(*dirs) + dirs, o = Util.extract_options(dirs) + extra_doc = o[:force] ? "-f " : nil + puts "empty_dir #{extra_doc}#{dirs.join(" ")}" if o[:show_cmd] + dirs.each {|dir| + dir = Pa(dir) + if not File.exists?(dir.p) + raise Errno::ENOENT, "not exists -- #{dir}" unless o[:force] + elsif not File.directory?(dir.p) + raise Errno::ENOTDIR, "not a directory -- #{dir}" unless o[:force] + else + rm_r *Pa.glob2("#{dir}/*", :dotmatch => true) + end + } + end + + def empty_dir_f(*dirs) + dirs, o = Util.extract_options(dirs) + o[:force] = true + empty_dir *dirs, o + end + # rm recusive, rm both file and directory # # @see rm # @return [nil] def rm_r(*paths) paths, o = Util.extract_options(paths) - glob(*paths){ |pa| + puts "rm -r #{path.join(" ")}" if o[:show_cmd] + Pa.glob(*paths){ |pa| puts "rm -r #{pa.p}" if o[:verbose] File.directory?(pa.p) ? _rmdir(pa) : File.delete(pa.p) } end alias rm_rf rm_r @@ -285,11 +353,11 @@ # @yieldparam [Pa] path # @yieldreturn [Boolean] rm_r path if true # @return [nil] def rm_if(*paths, &blk) paths, o = Util.extract_options(paths) - glob(*paths) do |pa| + Pa.glob(*paths) do |pa| rm_r pa, o if blk.call(pa) end end # copy @@ -314,20 +382,22 @@ # @param [Array<String>, String] src_s support globbing # @param [String,Pa] dest # @param [Hash] o option # @option o [Boolean] :mkdir mkdir(dest) if dest not exists. # @option o [Boolean] :verbose puts cmd when execute + # @option o [Boolean] :show_cmd puts cmd # @option o [Boolean] :folsymlink follow symlink # @option o [Boolean] :force force dest file if dest is a file # @option o [Boolean] :special special copy, when cp a directory, only mkdir, not cp the directory's content, usefull in Pa.each_r # @return [nil] # @overload cp(src_s, dest, o) # @yield [src,dest,o] # @return [nil] def cp(src_s, dest, o={}, &blk) - srcs = glob(*Util.wrap_array(src_s)).map{|v| v.path} + srcs = Pa.glob(*Util.wrap_array(src_s)).map{|v| v.path} dest = Pa.get(dest) + puts "cp #{srcs.join(" ")} #{dest}" if o[:show_cmd] if o[:mkdir] and (not File.exists?(dest)) Pa.mkdir dest end @@ -355,18 +425,22 @@ # move, use rename for same device. and cp for cross device. # @see cp # # @param [Hash] o option - # @option o [Boolean] :verbose + # @option o [Boolean] :verbose verbose mode + # @option o [Boolean] :show_cmd puts cmd # @option o [Boolean] :mkdir # @option o [Boolean] :fore # @return [nil] def mv(src_s, dest, o={}, &blk) - srcs = glob(*Util.wrap_array(src_s)).map{|v| get(v)} + srcs = Pa.glob(*Util.wrap_array(src_s)).map{|v| get(v)} dest = get(dest) + extra_doc = o[:force] ? "-f " : nil + puts "mv #{extra_doc}#{srcs.join(" ")} #{dest}" if o[:show_cmd] + if o[:mkdir] and (not File.exists?(dest)) mkdir dest end # mv file1 file2 .. dir @@ -423,12 +497,13 @@ # @param [Array<String,Pa>] paths def _touch(paths, o) o[:mode] ||= 0644 paths.map!{|v|get(v)} + extra_doc = o[:force] ? "-f " : nil + puts "touch #{extra_doc}#{paths.join(" ")}" if o[:show_cmd] paths.each {|p| - extra_doc = o[:force] ? "-f " : nil puts "touch #{extra_doc}#{p}" if o[:verbose] if File.exists?(p) o[:force] ? next : raise(Errno::EEXIST, "File exist -- #{p}") end @@ -444,32 +519,50 @@ } end # @param [Array,String,#path] src_s # @param [String,#path] dest + # def _ln(method, src_s, dest, o={}) + srcs = Util.wrap_array(src_s) dest = get(dest) - glob(*Util.wrap_array(src_s)) {|src| + extra_doc = "" + extra_doc << (method==:symlink ? "-s " : "") + extra_doc << (o[:force] ? "-f " : "") + puts "ln #{extra_doc}#{srcs.join(" ")} #{dest}" if o[:show_cmd] + + Pa.glob(*srcs) {|src| src = get(src) dest = File.join(dest, File.basename(src)) if File.directory?(dest) - Pa.rm_r(dest) if o[:force] and File.exists?(dest) - extra_doc = "" - extra_doc << (method==:symlink ? "-s " : "") - extra_doc << (o[:force] ? "-f " : "") - puts "ln #{extra_doc}#{src} #{dest}" if o[:verbose] + if File.exists?(dest) + if o[:force] + Pa.rm_r(dest) + else + raise Errno::EEXIST, "dest exists -- #{dest}" + end + end + + puts "ln #{extra_doc}#{src} #{dest}" if o[:verbose] + File.send(method, src, dest) } end def _mkdir(paths, o) + puts "mkdir #{paths.join(" ")}" if o[:show_cmd] + o[:mode] ||= 0775 paths.map!{|v|get(v)} paths.each {|p| puts "mkdir #{p}" if o[:verbose] if File.exists?(p) - o[:force] ? next : raise(Errno::EEXIST, "File exist -- #{p}") + if o[:force] + next + else + raise Errno::EEXIST, "File exist -- #{p}" + end end stack = [] until p == stack.last break if File.exists?(p)