2012-06-29 05:18:28 +00:00
|
|
|
# -*- coding: binary -*-
|
2009-11-09 01:50:44 +00:00
|
|
|
###
|
|
|
|
#
|
|
|
|
# framework-util-svn
|
|
|
|
# --------------
|
|
|
|
#
|
|
|
|
# The class provides methods for parsing the SVN information in the framework directory
|
|
|
|
#
|
|
|
|
###
|
|
|
|
|
|
|
|
require 'date'
|
|
|
|
|
|
|
|
module Msf
|
|
|
|
module Util
|
|
|
|
class SVN
|
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.load_root
|
|
|
|
info = {}
|
|
|
|
path = ::File.join(::File.dirname(__FILE__), "..", "..", "..", ".svn", "entries")
|
|
|
|
if !::File.exists?(path)
|
|
|
|
return info
|
|
|
|
end
|
|
|
|
contents = ''
|
|
|
|
File.open(path, "rb") do |fd|
|
|
|
|
contents = fd.read(::File.size(path))
|
|
|
|
end
|
|
|
|
if contents.include? "<?xml"
|
|
|
|
require 'rexml/document'
|
|
|
|
rd = REXML::Document.new(contents).root
|
|
|
|
rd.elements.each { |e|
|
|
|
|
if e.attributes['name'] == ""
|
|
|
|
info[:root] = e.attributes['url']
|
|
|
|
info[:revision] = e.attributes['revision']
|
|
|
|
info[:updated] = e.attributes['committed-date']
|
|
|
|
break
|
|
|
|
end
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ents = contents.split("\x0c")
|
|
|
|
ents[0].split("\n").each do |line|
|
|
|
|
line.strip!
|
|
|
|
next if line.empty?
|
|
|
|
case line
|
|
|
|
when /framework3/
|
|
|
|
info[:root] = line
|
|
|
|
when /^\d+$/
|
|
|
|
info[:revision] = line.to_i
|
|
|
|
when /^\d{4}-\d.*T/
|
|
|
|
info[:updated] = line
|
|
|
|
end
|
|
|
|
break if (info[:root] and info[:revision] and info[:updated])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
info
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.revision
|
|
|
|
@@info ||= load_root
|
|
|
|
@@info[:revision]
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.updated
|
|
|
|
@@info ||= load_root
|
|
|
|
@@info[:updated]
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.root
|
|
|
|
@@info ||= load_root
|
|
|
|
@@info[:root]
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.days_since_update
|
|
|
|
@@info ||= load_root
|
|
|
|
svnt = @@info[:updated]
|
|
|
|
if(not svnt)
|
|
|
|
return
|
|
|
|
end
|
2009-12-17 03:17:37 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
# Date.parse and Date.strptime are both broken beyond repair in
|
|
|
|
# ruby 1.8.6 and older. Just bail if the parsing doesn't work.
|
|
|
|
begin
|
|
|
|
diff = (Date.parse(Time.now.to_s) - Date.parse(svnt)).to_f
|
|
|
|
rescue ArgumentError
|
|
|
|
end
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.last_updated_friendly
|
|
|
|
diff = self.days_since_update
|
|
|
|
case diff
|
|
|
|
when nil
|
|
|
|
"at an unknown date"
|
|
|
|
when -2.0 .. 1.0
|
|
|
|
"today"
|
|
|
|
when 1.0 .. 2.0
|
|
|
|
"yesterday"
|
|
|
|
else
|
|
|
|
if (diff.to_i > 7)
|
|
|
|
"%red#{diff.to_i} days ago%clr"
|
|
|
|
else
|
|
|
|
"#{diff.to_i} days ago"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
2013-08-30 21:28:33 +00:00
|
|
|
def self.last_updated_date
|
|
|
|
@@info ||= load_root
|
2009-11-24 12:47:05 +00:00
|
|
|
svnt = @@info[:updated]
|
|
|
|
if(not svnt)
|
|
|
|
return
|
|
|
|
end
|
2013-08-30 21:28:33 +00:00
|
|
|
begin
|
|
|
|
Date.parse(@@info[:updated])
|
|
|
|
rescue ArgumentError
|
|
|
|
end
|
|
|
|
end
|
2009-11-09 01:50:44 +00:00
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|