diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/classaudit.pl | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/tools/classaudit.pl b/tools/classaudit.pl new file mode 100755 index 0000000..efe0069 --- /dev/null +++ b/tools/classaudit.pl | |||
@@ -0,0 +1,133 @@ | |||
1 | #!/usr/bin/perl | ||
2 | # | ||
3 | # Audit tool for OpenSim class and namespace definitions. | ||
4 | # | ||
5 | # Copyright 2007 IBM | ||
6 | # | ||
7 | # Authors: Sean Dague | ||
8 | # | ||
9 | # Redistribution and use in source and binary forms, with or without | ||
10 | # modification, are permitted provided that the following conditions are met: | ||
11 | # * Redistributions of source code must retain the above copyright | ||
12 | # notice, this list of conditions and the following disclaimer. | ||
13 | # * Redistributions in binary form must reproduce the above copyright | ||
14 | # notice, this list of conditions and the following disclaimer in the | ||
15 | # documentation and/or other materials provided with the distribution. | ||
16 | # * Neither the name of the OpenSim Project nor the | ||
17 | # names of its contributors may be used to endorse or promote products | ||
18 | # derived from this software without specific prior written permission. | ||
19 | # | ||
20 | # THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | ||
21 | # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
22 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
23 | # DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
24 | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
25 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
26 | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
27 | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
28 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
29 | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
30 | |||
31 | use strict; | ||
32 | use File::Find; | ||
33 | use Data::Dumper; | ||
34 | use constant YELLOW => "\033[33m"; | ||
35 | use constant RED => "\033[31m"; | ||
36 | use constant CLEAR => "\033[0m"; | ||
37 | our %totals; | ||
38 | |||
39 | |||
40 | find(\&test, "../OpenSim"); | ||
41 | print Dumper(\%totals); | ||
42 | |||
43 | sub test { | ||
44 | my $file = $File::Find::name; | ||
45 | my $dir = $File::Find::dir; | ||
46 | $file =~ s{^../}{}; #strip off prefix | ||
47 | $dir =~ s{^../}{}; #strip off prefix | ||
48 | |||
49 | return if ($file !~ /\.cs$/); | ||
50 | return if ($file =~ /AssemblyInfo\.cs$/); | ||
51 | |||
52 | print "Processing File: $file\n"; | ||
53 | |||
54 | my $namespace = find_namespace($_); | ||
55 | my $class = find_class($_); | ||
56 | |||
57 | |||
58 | |||
59 | if(cmp_namespace($namespace, $dir) == 1) { | ||
60 | $totals{goodns}++; | ||
61 | } else { | ||
62 | $totals{badns}++; | ||
63 | } | ||
64 | |||
65 | |||
66 | if(cmp_class($namespace, $class, $file) == 1) { | ||
67 | $totals{goodclass}++; | ||
68 | } else { | ||
69 | $totals{badclass}++; | ||
70 | } | ||
71 | print "\n"; | ||
72 | } | ||
73 | |||
74 | sub find_class { | ||
75 | my $file = shift; | ||
76 | my $content = slurp($file); | ||
77 | if ($content =~ /\n\s*(public|private|protected)?\s*(class|interface)\s+(\S+)/) { | ||
78 | return $3; | ||
79 | } | ||
80 | return ""; | ||
81 | } | ||
82 | |||
83 | sub find_namespace { | ||
84 | my $file = shift; | ||
85 | my $content = slurp($file); | ||
86 | |||
87 | if ($content =~ /\bnamespace\s+(\S+)/s) { | ||
88 | return $1; | ||
89 | } | ||
90 | return ""; | ||
91 | } | ||
92 | |||
93 | sub slurp { | ||
94 | my $file = shift; | ||
95 | local(*IN); | ||
96 | local $/ = undef; | ||
97 | |||
98 | open(IN, "$file") or die "Can't open '$file': $!"; | ||
99 | my $content = <IN>; | ||
100 | close(IN); | ||
101 | |||
102 | return $content; | ||
103 | } | ||
104 | |||
105 | sub cmp_class { | ||
106 | my ($ns, $class, $file) = @_; | ||
107 | $class = "$ns.$class"; | ||
108 | my $classtrans = $class; | ||
109 | $classtrans =~ s{\.}{/}g; | ||
110 | $classtrans .= ".cs"; | ||
111 | |||
112 | if($classtrans ne $file) { | ||
113 | error(YELLOW, "CLASS: $class != $file"); | ||
114 | return -1; | ||
115 | } | ||
116 | return 1; | ||
117 | } | ||
118 | |||
119 | sub cmp_namespace { | ||
120 | my ($ns, $dir) = @_; | ||
121 | my $nstrans = $ns; | ||
122 | $nstrans =~ s{\.}{/}g; | ||
123 | |||
124 | if($nstrans ne $dir) { | ||
125 | error(RED, "NS: $ns != $dir"); | ||
126 | return -1; | ||
127 | } | ||
128 | return 1; | ||
129 | } | ||
130 | |||
131 | sub error { | ||
132 | print @_, CLEAR, "\n"; | ||
133 | } | ||