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
|
class InstalledFile
attr_reader :path
attr_reader :mtime
def initialize( filePath )
@path = filePath
@mtime = File.stat( filePath ).mtime
end
def ==( rhs )
self.path == rhs.path
end
def match( rhs )
self.path == rhs.path and self.mtime == rhs.mtime
end
def uninstall
File.unlink( self.path )
end
end
class InstalledFiles < Array
Repository = '__installedFiles.db'
def initialize( dir = '.' )
load( dir ) if dir
end
def uninstall( target )
if include?( target )
if checkRemove( target )
target.uninstall
delete!( target )
return true
else
STDERR.puts "File: #{ target.path } seems to be modified. It has not been uninstalled. Please remove the file manually if you want."
return false
end
end
false
end
def load( dir = '.' )
path = File.join( dir, Repository )
if File.exist?( path )
self.clear
File.open( path, "rb" ) do | f |
Marshal.load( f ).each do | package |
self << package
end
end
end
end
def dump( dir = '.' )
pack!
path = File.join( dir, Repository )
File.open( path, "wb" ) do | f |
f << Marshal.dump( self )
end
end
private
def pack!
self.replace( pack )
nil
end
def pack
newObj = self.class.new( false )
reverse_each do | package |
newObj << package unless newObj.include?( package )
end
newObj
end
def delete!( target )
self.replace( delete( target ))
nil
end
def delete( target )
newObj = self.class.new( false )
each do | package |
newObj << package unless package == target
end
newObj
end
def checkRemove( target )
each do | package |
return true if package.match( target )
end
false
end
end
|