rscm-accurev 0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +25 -0
- data/README +9 -0
- data/Rakefile +137 -0
- data/STATUS +63 -0
- data/TODO +43 -0
- data/apitest.rb +21 -0
- data/bumprelease.sh +13 -0
- data/lib/rscm/accurev.rb +18 -0
- data/lib/rscm/scm/accurev/api.rb +411 -0
- data/lib/rscm/scm/accurev/api.rb.mine +382 -0
- data/lib/rscm/scm/accurev/api.rb.r263 +364 -0
- data/lib/rscm/scm/accurev/api.rb.r265 +393 -0
- data/lib/rscm/scm/accurev/command.rb +151 -0
- data/lib/rscm/scm/accurev/exception.rb +38 -0
- data/lib/rscm/scm/accurev/filterio.rb +57 -0
- data/lib/rscm/scm/accurev/xml.rb +224 -0
- data/lib/test/unit/ui/xml/testrunner.rb +165 -0
- data/lib/test/unit/ui/xml/xmltestrunner.xslt +79 -0
- data/test/acreplay.rb +22 -0
- data/test/coverage/analyzer.rb +127 -0
- data/test/coverage/c_loader.rb +34 -0
- data/test/coverage/cover.rb +91 -0
- data/test/coverage/coverage_loader.rb +21 -0
- data/test/coverage/coveragetask.rb +38 -0
- data/test/coverage/index_tmpl.html +42 -0
- data/test/coverage/template.html +36 -0
- data/test/eg/ac-files.xml +172 -0
- data/test/eg/ac-pop.txt +195 -0
- data/test/eg/files-various-states.xml +188 -0
- data/test/eg/hist-oneweek-all.xml +1483 -0
- data/test/eg/hist-oneweek-external.xml +246 -0
- data/test/eg/hist-oneweek-promotes.xml +1092 -0
- data/test/eg/info.txt +14 -0
- data/test/eg/stat-a-various.xml +1789 -0
- data/test/eg/stat-m.xml +13 -0
- data/test/eg/stat-overlap.xml +13 -0
- data/test/eg/stat-x.xml +20 -0
- data/test/eg/update-i-mods-and-updates-and-overlap.xml +73 -0
- data/test/eg/update-i-nochanges.xml +8 -0
- data/test/eg/update-i-stale.xml +0 -0
- data/test/eg/update-i-updates.xml +125 -0
- data/test/eg/update-newwksp.xml +183 -0
- data/test/eg/update-nochanges.xml +7 -0
- data/test/eg/update-stale.xml +12 -0
- data/test/eg/update-updates.xml +147 -0
- data/test/t_api.rb +163 -0
- data/test/t_command.rb +85 -0
- data/test/t_filterio.rb +60 -0
- data/test/t_load.rb +11 -0
- data/test/t_scrubio.rb +117 -0
- data/test/t_xmlmapper.rb +75 -0
- metadata +106 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<xsl:stylesheet
|
3
|
+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
4
|
+
>
|
5
|
+
|
6
|
+
<xsl:output method="html" />
|
7
|
+
|
8
|
+
<xsl:template match="/testsuite">
|
9
|
+
<html>
|
10
|
+
<head>
|
11
|
+
<title>Test Suite Results for <xsl:value-of select="@name" /></title>
|
12
|
+
<style>
|
13
|
+
.error { color: #ff0000; }
|
14
|
+
.eresult {
|
15
|
+
background: #ffcccc;
|
16
|
+
color: #ff0000;
|
17
|
+
}
|
18
|
+
h1,h2 {
|
19
|
+
background: #cccccc;
|
20
|
+
color: #000055;
|
21
|
+
border: 1px dotted black;
|
22
|
+
}
|
23
|
+
</style>
|
24
|
+
</head>
|
25
|
+
<body>
|
26
|
+
<h1>Test Suite Results</h1>
|
27
|
+
|
28
|
+
<p>Results for: <xsl:value-of select="@name" /></p>
|
29
|
+
|
30
|
+
<p>
|
31
|
+
Test suite run at: <b><xsl:value-of select="@rundate" /></b>
|
32
|
+
</p>
|
33
|
+
|
34
|
+
<h2>Summary</h2>
|
35
|
+
|
36
|
+
<p>
|
37
|
+
<xsl:if test="result[@passed = 'false']">
|
38
|
+
<xsl:attribute name="class">error</xsl:attribute>
|
39
|
+
</xsl:if>
|
40
|
+
<xsl:value-of select="result/summary/text()" />
|
41
|
+
</p>
|
42
|
+
<p>
|
43
|
+
Elapsed time: <xsl:value-of select="elapsed-time/text()" />
|
44
|
+
</p>
|
45
|
+
|
46
|
+
<table border="1">
|
47
|
+
<tr>
|
48
|
+
<th>Case</th>
|
49
|
+
<th>Result</th>
|
50
|
+
</tr>
|
51
|
+
<xsl:for-each select="test">
|
52
|
+
<tr>
|
53
|
+
<td>
|
54
|
+
<xsl:if test="fault/text()">
|
55
|
+
<xsl:attribute name="class">error</xsl:attribute>
|
56
|
+
</xsl:if>
|
57
|
+
<xsl:value-of select="@name" />
|
58
|
+
</td>
|
59
|
+
<td>
|
60
|
+
<xsl:choose>
|
61
|
+
<xsl:when test="fault/text()">
|
62
|
+
<xsl:attribute name="class">eresult</xsl:attribute>
|
63
|
+
<pre>
|
64
|
+
<xsl:value-of select="fault/text()" />
|
65
|
+
</pre>
|
66
|
+
</xsl:when>
|
67
|
+
<xsl:otherwise>
|
68
|
+
(pass)
|
69
|
+
</xsl:otherwise>
|
70
|
+
</xsl:choose>
|
71
|
+
</td>
|
72
|
+
</tr>
|
73
|
+
</xsl:for-each>
|
74
|
+
</table>
|
75
|
+
</body>
|
76
|
+
</html>
|
77
|
+
</xsl:template>
|
78
|
+
|
79
|
+
</xsl:stylesheet>
|
data/test/acreplay.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# acreplay.rb: emit canned output for accurev commands, for testing.
|
4
|
+
# this script should be usable as a cmdline replacement
|
5
|
+
# for the accurev binary, for testing purposes.
|
6
|
+
# This is basically `cat`, except it doesn't complain about
|
7
|
+
# excess options it doesn't accept.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'getoptlong'
|
11
|
+
|
12
|
+
USAGE = <<-EOUSAGE
|
13
|
+
Usage:
|
14
|
+
acreplay.rb somefile.xml [any other options ignored]
|
15
|
+
EOUSAGE
|
16
|
+
|
17
|
+
if ARGV.length==0
|
18
|
+
puts USAGE
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
puts File.read( ARGV[0] )
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require 'erb'
|
3
|
+
require 'fileutils'
|
4
|
+
include FileUtils
|
5
|
+
|
6
|
+
#
|
7
|
+
# usage:
|
8
|
+
# rake coverage
|
9
|
+
#
|
10
|
+
#
|
11
|
+
|
12
|
+
trace_file = ARGV.shift
|
13
|
+
output_dir = ARGV.shift
|
14
|
+
template_file = ARGV.shift
|
15
|
+
template_index = ARGV.shift
|
16
|
+
|
17
|
+
if trace_file.nil? or output_dir.nil?
|
18
|
+
raise "Usage: $0 <tracefile> <output_dir> <template> <index_template>"
|
19
|
+
end
|
20
|
+
|
21
|
+
# stdout.printf("#%d:%s:%d:%s:%s: %s",
|
22
|
+
# get_thread_no,
|
23
|
+
# file,
|
24
|
+
# line,
|
25
|
+
# klass || '',
|
26
|
+
# EVENT_SYMBOL[event],
|
27
|
+
# get_line(file, line))
|
28
|
+
|
29
|
+
puts "Reading trace data #{trace_file}..."
|
30
|
+
files = {}
|
31
|
+
File.open( trace_file, "r" ).each_line do |line|
|
32
|
+
data, linedump = line.split(/ /)
|
33
|
+
threadno, file, n, classname, eventsym = data.split(/:/)
|
34
|
+
files[file] ||= []
|
35
|
+
files[file][n.to_i] ||= 0
|
36
|
+
files[file][n.to_i] += 1
|
37
|
+
end
|
38
|
+
|
39
|
+
class Summary
|
40
|
+
attr_accessor :filename, :total_lines, :covered_lines
|
41
|
+
attr_accessor :lines, :seen
|
42
|
+
def initialize( filename )
|
43
|
+
@filename = filename
|
44
|
+
@total_lines = 0
|
45
|
+
@covered_lines = 0
|
46
|
+
@lines = []
|
47
|
+
@seen = []
|
48
|
+
end
|
49
|
+
def pct
|
50
|
+
@covered_lines.to_f / @total_lines.to_f
|
51
|
+
end
|
52
|
+
def htmlfile
|
53
|
+
@filename.gsub(/[\.\/]/, '_') + ".html"
|
54
|
+
end
|
55
|
+
def get_binding
|
56
|
+
binding
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class IndexSummary
|
61
|
+
attr_accessor :summary
|
62
|
+
def get_binding
|
63
|
+
binding
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def pretty( template, output_dir, s )
|
68
|
+
htmlfile = "#{output_dir}/#{s.htmlfile}"
|
69
|
+
puts htmlfile
|
70
|
+
File.open( htmlfile, "w" ) do |out|
|
71
|
+
rhtml = ERB.new( template )
|
72
|
+
out.print( rhtml.result( s.get_binding ) )
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def index( template, output_dir, summaries )
|
77
|
+
idx = IndexSummary.new
|
78
|
+
idx.summary = summaries
|
79
|
+
puts "#{output_dir}/index.html"
|
80
|
+
File.open( "#{output_dir}/index.html", "w" ) do |out|
|
81
|
+
rhtml = ERB.new( template )
|
82
|
+
out.print( rhtml.result( idx.get_binding ) )
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
template = File.read( template_file )
|
87
|
+
index_tmpl = File.read( template_index )
|
88
|
+
|
89
|
+
puts "Outputting to #{output_dir}..."
|
90
|
+
mkdir_p( output_dir )
|
91
|
+
summary = {}
|
92
|
+
files.each do |file, linelist|
|
93
|
+
s = Summary.new( file )
|
94
|
+
lineno = 0
|
95
|
+
File.open( file ).each_line do |line|
|
96
|
+
lineno += 1
|
97
|
+
seen_this = false
|
98
|
+
# basic: line was traced
|
99
|
+
unless linelist[lineno].nil?
|
100
|
+
seen_this = true
|
101
|
+
end
|
102
|
+
# misc: various comments, blank lines, other "untraceables"
|
103
|
+
# mark them as seen
|
104
|
+
if line =~ /^\s*$/
|
105
|
+
seen_this = true
|
106
|
+
end
|
107
|
+
if line =~ /^\s*#/
|
108
|
+
seen_this = true
|
109
|
+
end
|
110
|
+
if line =~ /^\s*(require|class|module|end|else|include|def)/
|
111
|
+
seen_this = true
|
112
|
+
end
|
113
|
+
s.seen << seen_this
|
114
|
+
if seen_this
|
115
|
+
s.covered_lines += 1
|
116
|
+
end
|
117
|
+
s.total_lines +=1
|
118
|
+
s.lines << line
|
119
|
+
end
|
120
|
+
summary[file] = s
|
121
|
+
pretty( template, output_dir, summary[file] )
|
122
|
+
end
|
123
|
+
index( index_tmpl, output_dir, summary )
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'tracer'
|
3
|
+
|
4
|
+
# Initialize tracer
|
5
|
+
TRACE_FILE = "xxx.trace"
|
6
|
+
OUTPUT = File.open( TRACE_FILE, "w" )
|
7
|
+
puts "Tracing to #{TRACE_FILE}"
|
8
|
+
t = Tracer.new()
|
9
|
+
def t.stdout
|
10
|
+
OUTPUT
|
11
|
+
end
|
12
|
+
def t.coverage_filter( event, file, line, id, binding, klass )
|
13
|
+
# skip c libs
|
14
|
+
return false if event == 'c-call'
|
15
|
+
return false if event == 'c-return'
|
16
|
+
return false if event == 'class'
|
17
|
+
# skip any (other) core libs
|
18
|
+
return false if file =~ /^\//
|
19
|
+
# skip magical eval code
|
20
|
+
return false if file =~ /\(eval\)/
|
21
|
+
# log everything else
|
22
|
+
return true
|
23
|
+
end
|
24
|
+
t.add_filter( t.method(:coverage_filter).to_proc )
|
25
|
+
|
26
|
+
# load in test files
|
27
|
+
ARGV.each do |f|
|
28
|
+
load f unless f =~ /^-/
|
29
|
+
end
|
30
|
+
|
31
|
+
# turn tracing on: test::unit::autorunner runs test in an at_exit proc
|
32
|
+
t.on
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# set_trace_func proc do |event,file,line,id,binding,classname|
|
4
|
+
# 'c-call' # call into clib - file:line -> caller
|
5
|
+
# 'c-return' # return out of clib - file:line -> caller
|
6
|
+
# 'call' # call into ruby fn - file:line -> fn def
|
7
|
+
# 'class' # start class/mod def (only for dyn classes?)
|
8
|
+
# 'end' # end class/mod def
|
9
|
+
# 'line' # exec line
|
10
|
+
# 'raise' # exception
|
11
|
+
# 'return' # return from ruby fn - file:line -> returning stmt
|
12
|
+
# end
|
13
|
+
|
14
|
+
require 'rexml/document'
|
15
|
+
include REXML
|
16
|
+
|
17
|
+
# defining script_lines make ruby dump all scripts into this hash
|
18
|
+
SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
|
19
|
+
|
20
|
+
|
21
|
+
module Test
|
22
|
+
|
23
|
+
class Cover
|
24
|
+
|
25
|
+
attr_accessor :codebase_files
|
26
|
+
|
27
|
+
def initialize()
|
28
|
+
@codebase_files = []
|
29
|
+
# seen_lines is a hash of hashes
|
30
|
+
@seen_lines = {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def trace_func( event, file, line, id, binding, classname )
|
34
|
+
return if event == 'c-call'
|
35
|
+
return if event == 'c-return'
|
36
|
+
return if event == 'class'
|
37
|
+
@seen_lines[file] ||= {}
|
38
|
+
@seen_lines[file][line] ||= 0
|
39
|
+
@seen_lines[file][line] += 1
|
40
|
+
end
|
41
|
+
|
42
|
+
def coverage()
|
43
|
+
set_trace_func( self.method(:trace_func).to_proc )
|
44
|
+
yield self
|
45
|
+
set_trace_func( nil )
|
46
|
+
end
|
47
|
+
|
48
|
+
def coverage_all()
|
49
|
+
set_trace_func( self.method(:trace_func).to_proc )
|
50
|
+
end
|
51
|
+
|
52
|
+
def coverage_clear()
|
53
|
+
set_trace_func( nil )
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_xml
|
57
|
+
doc = Document.new()
|
58
|
+
doc << XMLDecl.new()
|
59
|
+
root = Element.new( "coverage" )
|
60
|
+
doc << root
|
61
|
+
root.attributes['timestamp'] = Time.now
|
62
|
+
codebase = Element.new( "codebase" )
|
63
|
+
root << codebase
|
64
|
+
@codebase_files.each do |file|
|
65
|
+
e = Element.new( "file" )
|
66
|
+
e.attributes['name'] = file
|
67
|
+
codebase << e
|
68
|
+
if @seen_lines.has_key?( file )
|
69
|
+
seen = Element.new( "seen" )
|
70
|
+
e << seen
|
71
|
+
linehash = @seen_lines[file]
|
72
|
+
next unless SCRIPT_LINES__.has_key?( file )
|
73
|
+
linehash.each do |n,occur|
|
74
|
+
le = Element.new( "line" )
|
75
|
+
le.attributes['n'] = n
|
76
|
+
le.attributes['occur'] = occur
|
77
|
+
seen << le
|
78
|
+
end
|
79
|
+
ce = Element.new( "coverage" )
|
80
|
+
ce.attributes['seen'] = linehash.size
|
81
|
+
ce.attributes['total'] = SCRIPT_LINES__[file].size
|
82
|
+
ce.attributes['pct'] = linehash.size.to_f / SCRIPT_LINES__[file].size.to_f
|
83
|
+
seen << ce
|
84
|
+
end
|
85
|
+
end
|
86
|
+
return doc
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
#require 'tracer'
|
4
|
+
require 'test/cover'
|
5
|
+
|
6
|
+
cover = Test::Cover.new()
|
7
|
+
cover.coverage_all
|
8
|
+
cover.codebase_files << "./lib/rscm/accurev.rb"
|
9
|
+
cover.codebase_files << "./lib/rscm/scm/accurev/command.rb"
|
10
|
+
|
11
|
+
#Tracer.on
|
12
|
+
ARGV.each do |f|
|
13
|
+
load f unless f =~ /^-/
|
14
|
+
end
|
15
|
+
|
16
|
+
END {
|
17
|
+
cover.coverage_clear
|
18
|
+
File.open( "xxx.xml", "w" ) do |f|
|
19
|
+
f.puts( cover.to_xml )
|
20
|
+
end
|
21
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/tasklib'
|
5
|
+
|
6
|
+
module Rake
|
7
|
+
|
8
|
+
class CoverageTask < TaskLib
|
9
|
+
attr_accessor :name
|
10
|
+
attr_accessor :libs
|
11
|
+
attr_accessor :test_files
|
12
|
+
attr_accessor :ruby_opts
|
13
|
+
|
14
|
+
def initialize( name=:coverage )
|
15
|
+
@name = name
|
16
|
+
@libs = ["lib"]
|
17
|
+
@test_files = nil
|
18
|
+
@ruby_opts = []
|
19
|
+
yield self if block_given?
|
20
|
+
define
|
21
|
+
end
|
22
|
+
|
23
|
+
def define
|
24
|
+
lib_path = @libs.join( File::PATH_SEPARATOR )
|
25
|
+
@ruby_opts.unshift( "-I#{lib_path}" )
|
26
|
+
task @name do
|
27
|
+
ruby @ruby_opts.join(" ") +
|
28
|
+
"test/coverage_loader.rb " +
|
29
|
+
file_list.collect {|fn| "\"#{fn}\"".join(" ")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_loader()
|
34
|
+
find_file( 'test/coverage_loader' ) or fail "I DIE"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Coverage Summary</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<h1>Coverage Summary</h1>
|
7
|
+
|
8
|
+
<%
|
9
|
+
def grad( pct )
|
10
|
+
zero_end = [255,0,0]
|
11
|
+
one_end = [0,255,0]
|
12
|
+
g = []
|
13
|
+
(0..2).each do |i|
|
14
|
+
g[i] = (pct * (one_end[i]-zero_end[i])) + zero_end[i]
|
15
|
+
end
|
16
|
+
return "#"+g.collect{|x| "%02x" % x }.join("")
|
17
|
+
end
|
18
|
+
%>
|
19
|
+
<p>
|
20
|
+
Codebase:
|
21
|
+
|
22
|
+
<table border="1">
|
23
|
+
<tr>
|
24
|
+
<td>File</td>
|
25
|
+
<td>Lines</td>
|
26
|
+
<td>Covered</td>
|
27
|
+
<td>% Covered</td>
|
28
|
+
</tr>
|
29
|
+
|
30
|
+
<% summary.each do |filename,s| %>
|
31
|
+
<tr>
|
32
|
+
<td><a href="<%= s.htmlfile %>"><%= filename %></a></td>
|
33
|
+
<td><%= s.total_lines %></td>
|
34
|
+
<td><%= s.covered_lines %></td>
|
35
|
+
<td bgcolor="<%= grad(s.pct) %>"><%= s.pct %></td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
</table>
|
40
|
+
</p>
|
41
|
+
</body>
|
42
|
+
</html>
|