400c9b254d
git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@4383 51baf565-9d33-0410-a72c-fc3788e3496d
258 lines
6.7 KiB
Ruby
258 lines
6.7 KiB
Ruby
#!/usr/local/bin/ruby
|
|
|
|
require 'rubygems'
|
|
require_gem 'ikko'
|
|
require 'yaml'
|
|
require '/home/tom/rubyforge/ruby-doom/trunk/ruby-doom/lib/doom.rb'
|
|
|
|
# add timeout thingy to the Thread class, thx to Rich Kilmer for the code
|
|
class MyThread < Thread
|
|
def MyThread.ttl=(timeout)
|
|
Thread.new(Thread.current) do |thread|
|
|
sleep timeout
|
|
if thread.alive?
|
|
thread.exit
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
class PMDMap
|
|
MIN_NOOKS = 2
|
|
MAX_NOOKS = 12
|
|
def initialize(problems)
|
|
@problems = problems
|
|
end
|
|
def nooks
|
|
if @problems < MIN_NOOKS
|
|
return MIN_NOOKS
|
|
elsif @problems > 100
|
|
return MAX_NOOKS
|
|
end
|
|
(@problems/10).to_i + MIN_NOOKS
|
|
end
|
|
end
|
|
|
|
class SFCVSROOTPattern
|
|
def munge(name)
|
|
":pserver:anonymous@#{name}.cvs.sourceforge.net:/cvsroot/#{name}"
|
|
end
|
|
end
|
|
|
|
class Job
|
|
JAVANCSS_BINARY="/usr/local/javancss/bin/javancss"
|
|
ROOT="/home/tom/pmd/pmd-web/src"
|
|
REMOTE_REPORT_DIR="/home/groups/p/pm/pmd/htdocs/reports/"
|
|
attr_reader :unix_name, :mod, :title, :src
|
|
attr_accessor :barrels
|
|
def initialize(title, data)
|
|
@title, @unix_name, @mod, @src, @cvsroot = title, data["unix_name"], data["module"], data["srcdir"]
|
|
@cvsroot = SFCVSROOTPattern.new.munge(@unix_name)
|
|
@data = data
|
|
end
|
|
def jdk15?
|
|
@data["jdk15"] == true
|
|
end
|
|
def checkout_code
|
|
t = MyThread.new {
|
|
MyThread.ttl = 120
|
|
cmd = "cvs -Q -d#{@cvsroot} export -D tomorrow \"#{@src}\""
|
|
puts cmd
|
|
`#{cmd}`
|
|
}
|
|
t.join
|
|
if @data["delete"] && File.exist?(@data["delete"])
|
|
`rm -rf #{@data["delete"]}`
|
|
end
|
|
end
|
|
def run_ncss
|
|
cmd="#{JAVANCSS_BINARY} -ncss -recursive \"#{@src}\" > \"#{ncss_report}\""
|
|
`#{cmd}`
|
|
end
|
|
def run_pmd
|
|
cmd="java -Xmx512m -cp /home/tom/pmd/pmd/lib/jaxen-1.1-beta-7.jar:/home/tom/pmd/pmd-web/src/pmd-3.6.jar net.sourceforge.pmd.PMD \"#{ROOT}/#{@src}\" html unusedcode -shortnames #{self.jdk15? ? "-targetjdk 1.5" : ""} > #{report}"
|
|
puts cmd
|
|
`#{cmd}`
|
|
if File.exists?(report)
|
|
arr = IO.readlines(report)
|
|
File.read(report) {|f|
|
|
arr.each {|x| f << x if x =~ /Error while parsing/ }
|
|
}
|
|
end
|
|
puts "PMD report contains #{pmd_lines} violations"
|
|
end
|
|
def run_cpd
|
|
cmd="java -Xmx512m -cp /home/tom/pmd/pmd/lib/jaxen-1.1-beta-7.jar:/home/tom/pmd/pmd-web/src/pmd-3.6.jar net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files #{@src} > #{cpd_file}"
|
|
`#{cmd}`
|
|
puts "CPD report contains #{cpd_lines} violations"
|
|
end
|
|
def copy_up
|
|
`scp #{wad} #{report} #{cpd_file} #{ncss_report} tomcopeland@pmd.sf.net:#{REMOTE_REPORT_DIR}`
|
|
end
|
|
def report
|
|
"reports/" + @unix_name + "_" + @mod.sub(/ /, '') + ".html"
|
|
end
|
|
def wad
|
|
"reports/" + @unix_name + "_" + @mod.sub(/ /, '') + ".wad"
|
|
end
|
|
def cpd_file
|
|
"reports/cpd_" + @unix_name + "_" + @mod.sub(/ /, '') + ".txt"
|
|
end
|
|
def ncss_report
|
|
"reports/" + @unix_name + "_" + @mod.sub(/ /, '') + "_ncss.txt"
|
|
end
|
|
def clear
|
|
`rm -rf "#{@mod}" reports/#{report} reports/#{cpd_file} reports/#{ncss_report}`
|
|
end
|
|
def homepage_html
|
|
"<a href=\"http://" + @unix_name + ".sf.net/\">http://" + @unix_name + ".sf.net/</a>"
|
|
end
|
|
def ncss
|
|
return 0 if File.size(ncss_report) < 5
|
|
File.read(ncss_report).split(":")[1].strip.chomp
|
|
end
|
|
def cpd_lines
|
|
count = 0
|
|
File.read(cpd_file).each {|line| count += 1 if line["================================="] }
|
|
count
|
|
end
|
|
def pmd_lines
|
|
count = 0
|
|
File.read(report).each {|line| count += 1 if line["</td>"] } unless !File.exists?(report)
|
|
count == 0 ? 0 : (count/4).to_i
|
|
end
|
|
def pctg
|
|
sprintf("%.2f", (pmd_lines.to_f/(ncss == 0 ? 1 : ncss.to_i))*100)
|
|
end
|
|
def color
|
|
if pctg.to_f < 0.2
|
|
"#00ff00"
|
|
elsif pctg.to_f < 0.8
|
|
"yellow"
|
|
else
|
|
"red"
|
|
end
|
|
end
|
|
def to_s
|
|
@title + ":" + @unix_name + ":" + @mod + ":" + @src
|
|
end
|
|
end
|
|
|
|
class PreviousTracker
|
|
def initialize(jobs)
|
|
@jobs = jobs
|
|
@counter = 0
|
|
end
|
|
def bump
|
|
@counter += 1
|
|
end
|
|
def anchor_idx
|
|
@counter
|
|
end
|
|
def previous_anchor_idx
|
|
if (@counter + 2) > (@jobs.size-1)
|
|
return @jobs.size - 1
|
|
end
|
|
@counter + 2
|
|
end
|
|
end
|
|
|
|
if __FILE__ == $0
|
|
puts "Starting at #{Time.now}"
|
|
Dir.chdir(Job::ROOT)
|
|
ENV['JAVA_HOME']="/usr/local/java"
|
|
ENV['PATH']="#{ENV['PATH']}:#{ENV['JAVA_HOME']}/bin"
|
|
jobs = []
|
|
tree = YAML.load(File.open("jobs.yaml"))
|
|
tree.keys.each {|key|
|
|
jobs << Job.new(key, tree[key])
|
|
}
|
|
jobs.sort! {|a,b| a.unix_name <=> b.unix_name }
|
|
|
|
if ARGV.include?("-build")
|
|
jobs.each do |job|
|
|
if ARGV.include?("-job") && job.unix_name != ARGV.at(ARGV.index("-job")+1)
|
|
puts "Skipping " + job.unix_name
|
|
next
|
|
end
|
|
puts "Processing #{job.unix_name}; jdk15 = #{job.jdk15?}"
|
|
job.checkout_code
|
|
if File.exists?(job.src)
|
|
if Dir.glob("#{job.src}/**/*.java").empty?
|
|
puts "Skipping #{job} because no source files got checked out"
|
|
else
|
|
job.run_pmd
|
|
job.run_cpd
|
|
job.run_ncss
|
|
job.copy_up
|
|
job.clear
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
jobs.sort! {|x,y|
|
|
if !File.exists?(x.ncss_report) || !File.exists?(y.ncss_report)
|
|
-1
|
|
else
|
|
x.pctg <=> y.pctg
|
|
end
|
|
}
|
|
|
|
if ARGV.include?("-doom")
|
|
jobs.each do |j|
|
|
begin
|
|
pmd = PMDMap.new(j.pmd_lines)
|
|
p = Path.new(0, 1000)
|
|
p.add("e200/n200/e200/s200/e200/", pmd.nooks)
|
|
p.add("s400/")
|
|
p.add("w200/s200/w200/n200/w200/", pmd.nooks)
|
|
p.add("n400/")
|
|
m = SimpleLineMap.new(p)
|
|
m.set_player(Point.new(50,900))
|
|
0.upto(pmd.nooks-1) do |x|
|
|
m.add_barrel(Point.new((x*600)+300, 1100))
|
|
m.add_barrel(Point.new((x*600)+300, 500))
|
|
end
|
|
j.barrels = pmd.nooks * 2
|
|
m.create_wad(j.wad + ".tmp")
|
|
cmd = "./bsp " + j.wad + ".tmp -o " + j.wad + " && rm -f " + j.wad + ".tmp"
|
|
`#{cmd}`
|
|
rescue
|
|
end
|
|
end
|
|
end
|
|
|
|
jobs.each {|j|
|
|
next if ARGV.include?("-job") && j.unix_name != ARGV.at(ARGV.index("-job")+1)
|
|
puts "Copying up #{j}"
|
|
j.copy_up
|
|
} if ARGV.include?("-copy")
|
|
|
|
fm = Ikko::FragmentManager.new
|
|
fm.base_path="./"
|
|
pt = PreviousTracker.new(jobs)
|
|
out = fm["header.frag", {"lastruntime"=>Time.now, "prev2header1"=>jobs[0].unix_name, "prev2header2"=>jobs[1].unix_name}]
|
|
jobs.each {|j|
|
|
out << fm["row.frag", {
|
|
"title"=>fm["title.frag", {"file"=>j.report, "title"=>j.title}],
|
|
"homepage"=>fm["homepage.frag", {"name"=>j.unix_name}],
|
|
"ncss"=>j.ncss,
|
|
"unix_name"=>j.unix_name,
|
|
"anchor"=>jobs[pt.anchor_idx].unix_name,
|
|
"previous_anchor"=>jobs[pt.previous_anchor_idx].unix_name,
|
|
"pmd"=>j.pmd_lines.to_s,
|
|
"pctg"=>fm["pctg.frag", {"color"=>j.color, "pctg"=>j.pctg.to_s}],
|
|
"dupe"=>fm["cpd.frag", {"file"=>j.cpd_file, "dupes"=>j.cpd_lines.to_s}],
|
|
"doom"=>fm["doom.frag", {"file"=>j.wad, "barrels"=>j.barrels}]
|
|
}] unless !File.exists?(j.report) || !File.exists?(j.ncss_report) || j.ncss == 0
|
|
pt.bump
|
|
}
|
|
File.open("scoreboard.html", "w") {|f| f.syswrite(out)}
|
|
|
|
`scp scoreboard.html tomcopeland@pmd.sf.net:/home/groups/p/pm/pmd/htdocs/`
|
|
|
|
puts "Done at #{Time.now}"
|
|
end
|
|
|