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)