tolvmxfs/lib/to_lvm_xfs/exts.rb

130 lines
2.3 KiB
Ruby

require 'pathname'
class Pathname
def +@
expand_path.to_s
end
def chdir &exe
Dir.chdir self.to_s, &exe
end
alias cd chdir
# copies content of src in self as destination
def copy src, **opts
FileUtils.copy_file src.to_s, self.to_s, **opts
end
alias link make_link
alias symlink make_symlink
def replace_i &e
changed = false
open 'r+' do |f|
old = f.readlines
f.pos = 0
lines = yield f
changed = lines != old
if changed
f.truncate 0
f.pos = 0
f.puts lines
end
end
not changed
end
def sed_i **replaces, &e
changed = false
open 'r+' do |f|
lines =
f.each_line.flat_map do |l|
yield( l.chomp, replaces).tap {|r| changed = true unless l == r }
end
changed = true unless replaces.empty?
if changed
f.truncate 0
f.pos = 0
f.puts lines
replaces.each {|_,rls| f.puts rls }
end
end
not changed
end
end
class XPathname < Pathname
%i[/ + join].each do |meth|
define_method meth do |*n|
XPathname.new "#{super *n}"
end
end
%i[unlink read mkdir mkpath].each do |meth|
define_method meth do
STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m"
super()
end
end
%i[replace_i sed_i].each do |meth|
define_method meth do |*a, **o, &e|
STDERR.print "\e[1;36mpatching \e[1;35m#{self}\e[0m"
begin
r = super *a, **o, &e
STDERR.puts "\r\e[#{r ? "1;32" : "33"}mpatching \e[1;35m#{self}\e[0m"
rescue Object
STDERR.puts "\r\e[1;31mpatching \e[1;35m#{self}\e[0m"
raise
end
r
end
end
def rename dest
STDERR.puts "\e[1;36mrename \e[1;35m#{self}\e[0m -> \e[1;35m#{dest}\e[0m"
super dest
end
def move src
STDERR.puts "\e[1;36mmove \e[1;35m#{self}\e[0m <- \e[1;35m#{dest}\e[0m"
super src
end
def copy src, **opts
STDERR.puts "\e[1;36mcopy \e[1;35m#{self}\e[0m <- \e[1;35m#{src}\e[0m"
super src, **opts
end
%i[link symlink].each do |meth|
define_method meth do |dest|
STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m -> \e[1;35m#{dest}\e[0m"
super dest
end
end
alias link make_link
alias symlink make_symlink
%i[write].each do |meth|
define_method meth do |*a, **o, &e|
STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m \e[1;35m#{a[0][0...128].inspect}\e[0m"
super *a, &e
end
end
end
class Symbol
alias +@ to_s
def -@
:"-#{self}"
end
end
class File
def reset
f.truncate 0
f.pos = 0
end
end