1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#! /usr/bin/ruby -nl
# Used by the "make uninstall" target to uninstall Ruby.
# See common.mk for more details.
BEGIN {
$dryrun = false
$tty = STDOUT.tty?
until ARGV.empty?
case ARGV[0]
when /\A--destdir=(.*)/
$destdir = $1
when /\A-n\z/
$dryrun = true
when /\A--(?:no-)?tty\z/
$tty = !$1
else
break
end
ARGV.shift
end
$dirs = []
$files = []
COLUMNS = $tty && (ENV["COLUMNS"]&.to_i || begin require 'io/console/size'; rescue; else IO.console_size&.at(1); end)&.then do |n|
n-1 if n > 1
end
if COLUMNS
$column = 0
def message(str = nil)
$stdout.print "\b \b" * $column
if str
if str.size > COLUMNS
str = "..." + str[(-COLUMNS+3)..-1]
end
$stdout.print str
end
$stdout.flush
$column = str&.size || 0
end
else
alias message puts
end
}
list = ($_.chomp!('/') ? $dirs : $files)
list << $_
END {
status = true
$\ = nil
$files.each do |file|
message "rm #{file}"
unless $dryrun
file = File.join($destdir, file) if $destdir
begin
File.unlink(file)
rescue Errno::ENOENT
rescue
status = false
puts $!
end
end
end
unlink = {}
$dirs.each do |dir|
unlink[dir] = true
end
nonempty = {}
while dir = $dirs.pop
dir = File.dirname(dir) while File.basename(dir) == '.'
message "rmdir #{dir}"
unless $dryrun
realdir = $destdir ? File.join($destdir, dir) : dir
begin
begin
unlink.delete(dir)
Dir.rmdir(realdir)
rescue Errno::ENOTDIR
raise unless File.symlink?(realdir)
File.unlink(realdir)
end
rescue Errno::ENOTEMPTY
nonempty[dir] = true
rescue Errno::ENOENT
rescue
status = false
puts $!
else
nonempty.delete(dir)
parent = File.dirname(dir)
$dirs.push(parent) unless parent == dir or unlink[parent]
end
end
end
message
unless nonempty.empty?
puts "Non empty director#{nonempty.size == 1 ? 'y' : 'ies'}:"
nonempty.each_key {|dir| print " #{dir}\n"}
end
exit(status)
}
|