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 def symlink to File.symlink to.to_s, to_s end def link to File.link to.to_s, to_s end def replace_i open 'r+' do |f| lines = yield f f.truncate 0 f.pos = 0 f.puts lines end end def sed_i **replaces, &e open 'r+' do |f| lines = f.each_line.flat_map {|l| yield l.chomp, replaces } f.truncate 0 f.pos = 0 f.puts lines replaces.each {|_,rls| f.puts rls } end end end class XPathname < Pathname %i[/ + join].each do |meth| define_method meth do |*n| XPathname.new "#{super *n}" end end %i[unlink read].each do |meth| define_method meth do |*a, &e| STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m" super *a, &e end end %i[replace_i sed_i].each do |meth| define_method meth do |*a, &e| STDERR.puts "\e[1;36mpatching \e[1;35m#{self}\e[0m" super *a, &e end end %i[link rename symlink].each do |meth| define_method meth do |*a, &e| STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m -> #{a.map{|x|"\e[1;35m#{x}\e[0m"}.join ', '}" super *a, &e end end %i[move copy].each do |meth| define_method meth do |*a, &e| STDERR.puts "\e[1;36m#{meth} \e[1;35m#{self}\e[0m <- #{a.map{|x|"\e[1;35m#{x}\e[0m"}.join ', '}" super *a, &e end end %i[make_link make_symlink].each do |meth| name = meth.to_s.sub /\Amake_/, '' define_method meth do |*a, &e| STDERR.puts "\e[1;36m#{name} \e[1;35m#{self}\e[0m -> #{a.map{|x|"\e[1;35m#{x}\e[0m"}.join ', '}" super *a, &e end end %i[write].each do |meth| define_method meth do |*a, &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