def find_duplicate_code(dir=Dir.pwd)
require "rexml/document"
results = Array.new
Open3.popen3( cpd_command(dir) ) do |stdin, stdout, stderr|
xml = time_out_readlines(stdout)
if cpd_error?(stderr) || xml.first == "IO readlines timed out."
return results
end
doc = REXML::Document.new(xml.join("\n"))
doc.elements.each("pmd-cpd/duplication") do |dup|
results << {
:duplicate => {
:entry_num => results.size,
:lines => dup.attribute("lines").to_s,
:tokens => dup.attribute("tokens").to_s,
:code_fragement => highlight_code(dup.elements["codefragment"].cdatas.to_s),
:files => dup.get_elements("file").map { |f|
{
:path => f.attribute("path").to_s,
:line => f.attribute("line").to_s
}
},
}
}
end
end
results
end