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