xref: /trunk/main/offapi/util/checknewapi.pl (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1#
2# checknewapi - a perl script to check for new API's
3# using two outputs from regview and dump the interscetion
4# of new types
5#
6# Copyright 2000, 2010 Oracle and/or its affiliates.
7#
8
9if($#ARGV != 3)
10{
11    die "usage: checknewapi <new_type_library> <reference_type_library> <buildinfodescr> <fullpath_regview>\n";
12}
13
14-e "$ARGV[0]" || die "ERROR: type library \"$ARGV[0]\" does not exist\n";
15-e "$ARGV[1]" || die "ERROR: reference type library \"$ARGV[1]\" does not exist\n";
16-e "$ARGV[3]" || die "ERROR: invalid path to the regview tool \"$ARGV[3]\", please specify the full qualified path\n";
17
18# debug flag
19$DEBUG = 0;
20
21$main::buildinfo = "$ARGV[2]";
22$main::regview = "$ARGV[3]";
23%{$main::reftypes} = ();
24%{$main::currenttypes} = ();
25%{$main::removedtypes} = ();
26
27open ( FILEIN, "$main::regview \"$ARGV[0]\" |" ) || die "could not use content of current typelibrary \"$ARGV[0]\", regview doesn't work\n";
28
29if ($DEBUG == 1)
30{
31    open( CURRENT, ">current_types.txt" ) || die "\nERROR: could not open current_types.txt for writing";
32}
33
34$first = 1;
35$linebefore = "";
36$published = 0;
37$typeclass = "";
38while (<FILEIN>)
39{
40    if ($first == 0)
41    {
42        if ( $linebefore =~ m#type class: published (.+)# )
43        {
44            $published = 1;
45            $typeclass = $1;
46        } elsif ( $linebefore =~ m#type class: (.+)# )
47        {
48            $published = 0;
49            $typeclass = $1;
50        } else
51        {
52            $published = 0;
53            $typeclass = "";
54        }
55    } else
56    {
57        $first = 0;
58    }
59
60    if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) )
61    {
62        if ($DEBUG == 1)
63        {
64            print CURRENT "$1\n";
65        }
66        if ( ! exists $main::currenttypes->{$1} )
67        {
68            $main::currenttypes->{$1} = { PUBLISHED => $published,
69                                          TYPECLASS => $typeclass,
70                                          COUNT => 1 };
71#           print "### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n";
72        }
73    }
74    $linebefore = $_;
75}
76close( FILEIN );
77close( CURRENT );
78
79open ( FILEIN, "$main::regview \"$ARGV[1]\" |" ) || die "could not use content of reference type library \"$ARGV[1]\", regview doesn't work\n";
80
81if ($DEBUG == 1)
82{
83    open( REFERENCE, ">reference_types.txt" ) || die "\nERROR: could not open reference_types.txt for writing";
84}
85
86# reset variables
87$first = 1;
88$linebefore = "";
89$published = 0;
90$typeclass = "";
91while (<FILEIN>)
92{
93    if ($first == 0)
94    {
95        if ( $linebefore =~ m#type class: published (.+)# )
96        {
97            $published = 1;
98            $typeclass = $1;
99        } elsif ( $linebefore =~ m#type class: (.+)# )
100        {
101            $published = 0;
102            $typeclass = $1;
103        } else
104        {
105            $published = 0;
106            $typeclass = "";
107        }
108    } else
109    {
110        $first = 0;
111    }
112
113    if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) )
114    {
115        if ($DEBUG == 1)
116        {
117            print REFERENCE "$1\n";
118        }
119        if ( ! exists $main::reftypes->{$1} )
120        {
121            $main::reftypes->{$1}++;
122
123            if ( exists $main::currenttypes->{$1} )
124            {
125                $main::currenttypes->{$1}->{COUNT}++;
126#               print "###### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n";
127            } else
128            {
129                if ($published == 0)
130                {
131                    $main::removedtypes->{$1} = { PUBLISHED => $published,
132                                                  TYPECLASS => $typeclass };
133                } else
134                {
135                    print "ERROR: type $1 is only in reference type library, this can't be happen\n";
136                }
137            }
138        }
139    }
140    $linebefore = $_;
141}
142close( FILEIN );
143close( REFERENCE );
144
145
146@typekeys = keys %{$main::currenttypes};
147$allunotypes = $#typekeys+1;
148$newunotypes = 0;
149$newpublished = 0;
150$draftscount = 0;
151$draftspublished = 0;
152foreach $i ( sort @typekeys )
153{
154    if ( $main::currenttypes->{$i}->{COUNT} == 1 &&
155         !("$main::currenttypes->{$i}->{TYPECLASS}" eq "module"))
156    {
157        $newunotypes++;
158        my $t = $i;
159        $t =~ s#/#\.#go;
160        if ($main::currenttypes->{$i}->{PUBLISHED} == 1)
161        {
162            print "published ";
163            $newpublished++;
164        }
165        if ( $t =~ m#drafts\.com.+#)
166        {
167            $draftscount++;
168            if ($main::currenttypes->{$i}->{PUBLISHED} == 1)
169            {
170                $draftspublished++;
171            }
172        }
173        print "$main::currenttypes->{$i}->{TYPECLASS} = $t\n";
174    }
175}
176
177# count removed not yet published types
178$removednotpublished = 0;
179
180@removedtypekeys = keys %{$main::removedtypes};
181foreach $i ( sort @removedtypekeys )
182{
183    $removednotpublished++;
184    my $t = $i;
185    $t =~ s#/#\.#go;
186    print "removed not yet published $main::currenttypes->{$i}->{TYPECLASS} = $t\n";
187}
188
189print "\n=======================================================\n\n";
190print "Summary [last check for $main::buildinfo]:\n\n";
191print "Number of UNO types = $allunotypes\n";
192print "Number of new UNO types = $newunotypes\n";
193print "New and published types = $newpublished\n";
194print "New and draft types = $draftscount\n";
195print "New, draft and published = $draftspublished\n";
196print "Removed and not published = $removednotpublished\n";
197
198exit 0;
199