1*b1cdbd2cSJim Jagielski#************************************************************** 2*b1cdbd2cSJim Jagielski# 3*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski# distributed with this work for additional information 6*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski# 11*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski# 13*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski# under the License. 19*b1cdbd2cSJim Jagielski# 20*b1cdbd2cSJim Jagielski#************************************************************** 21*b1cdbd2cSJim Jagielski# 22*b1cdbd2cSJim Jagielski# checknewapi - a perl script to check for new API's 23*b1cdbd2cSJim Jagielski# using two outputs from regview and dump the interscetion 24*b1cdbd2cSJim Jagielski# of new types 25*b1cdbd2cSJim Jagielski# 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielskiif($#ARGV != 3) 28*b1cdbd2cSJim Jagielski{ 29*b1cdbd2cSJim Jagielski die "usage: checknewapi <new_type_library> <reference_type_library> <buildinfodescr> <fullpath_regview>\n"; 30*b1cdbd2cSJim Jagielski} 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski-e "$ARGV[0]" || die "ERROR: type library \"$ARGV[0]\" does not exist\n"; 33*b1cdbd2cSJim Jagielski-e "$ARGV[1]" || die "ERROR: reference type library \"$ARGV[1]\" does not exist\n"; 34*b1cdbd2cSJim Jagielski-e "$ARGV[3]" || die "ERROR: invalid path to the regview tool \"$ARGV[3]\", please specify the full qualified path\n"; 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski# debug flag 37*b1cdbd2cSJim Jagielski$DEBUG = 0; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski$main::buildinfo = "$ARGV[2]"; 40*b1cdbd2cSJim Jagielski$main::regview = "$ARGV[3]"; 41*b1cdbd2cSJim Jagielski%{$main::reftypes} = (); 42*b1cdbd2cSJim Jagielski%{$main::currenttypes} = (); 43*b1cdbd2cSJim Jagielski%{$main::removedtypes} = (); 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielskiopen ( FILEIN, "$main::regview \"$ARGV[0]\" |" ) || die "could not use content of current typelibrary \"$ARGV[0]\", regview doesn't work\n"; 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielskiif ($DEBUG == 1) 48*b1cdbd2cSJim Jagielski{ 49*b1cdbd2cSJim Jagielski open( CURRENT, ">current_types.txt" ) || die "\nERROR: could not open current_types.txt for writing"; 50*b1cdbd2cSJim Jagielski} 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski$first = 1; 53*b1cdbd2cSJim Jagielski$linebefore = ""; 54*b1cdbd2cSJim Jagielski$published = 0; 55*b1cdbd2cSJim Jagielski$typeclass = ""; 56*b1cdbd2cSJim Jagielskiwhile (<FILEIN>) 57*b1cdbd2cSJim Jagielski{ 58*b1cdbd2cSJim Jagielski if ($first == 0) 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski if ( $linebefore =~ m#type class: published (.+)# ) 61*b1cdbd2cSJim Jagielski { 62*b1cdbd2cSJim Jagielski $published = 1; 63*b1cdbd2cSJim Jagielski $typeclass = $1; 64*b1cdbd2cSJim Jagielski } elsif ( $linebefore =~ m#type class: (.+)# ) 65*b1cdbd2cSJim Jagielski { 66*b1cdbd2cSJim Jagielski $published = 0; 67*b1cdbd2cSJim Jagielski $typeclass = $1; 68*b1cdbd2cSJim Jagielski } else 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski $published = 0; 71*b1cdbd2cSJim Jagielski $typeclass = ""; 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski } else 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski $first = 0; 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) ) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski if ($DEBUG == 1) 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski print CURRENT "$1\n"; 83*b1cdbd2cSJim Jagielski } 84*b1cdbd2cSJim Jagielski if ( ! exists $main::currenttypes->{$1} ) 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski $main::currenttypes->{$1} = { PUBLISHED => $published, 87*b1cdbd2cSJim Jagielski TYPECLASS => $typeclass, 88*b1cdbd2cSJim Jagielski COUNT => 1 }; 89*b1cdbd2cSJim Jagielski# print "### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n"; 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski $linebefore = $_; 93*b1cdbd2cSJim Jagielski} 94*b1cdbd2cSJim Jagielskiclose( FILEIN ); 95*b1cdbd2cSJim Jagielskiclose( CURRENT ); 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielskiopen ( FILEIN, "$main::regview \"$ARGV[1]\" |" ) || die "could not use content of reference type library \"$ARGV[1]\", regview doesn't work\n"; 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielskiif ($DEBUG == 1) 100*b1cdbd2cSJim Jagielski{ 101*b1cdbd2cSJim Jagielski open( REFERENCE, ">reference_types.txt" ) || die "\nERROR: could not open reference_types.txt for writing"; 102*b1cdbd2cSJim Jagielski} 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski# reset variables 105*b1cdbd2cSJim Jagielski$first = 1; 106*b1cdbd2cSJim Jagielski$linebefore = ""; 107*b1cdbd2cSJim Jagielski$published = 0; 108*b1cdbd2cSJim Jagielski$typeclass = ""; 109*b1cdbd2cSJim Jagielskiwhile (<FILEIN>) 110*b1cdbd2cSJim Jagielski{ 111*b1cdbd2cSJim Jagielski if ($first == 0) 112*b1cdbd2cSJim Jagielski { 113*b1cdbd2cSJim Jagielski if ( $linebefore =~ m#type class: published (.+)# ) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski $published = 1; 116*b1cdbd2cSJim Jagielski $typeclass = $1; 117*b1cdbd2cSJim Jagielski } elsif ( $linebefore =~ m#type class: (.+)# ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski $published = 0; 120*b1cdbd2cSJim Jagielski $typeclass = $1; 121*b1cdbd2cSJim Jagielski } else 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski $published = 0; 124*b1cdbd2cSJim Jagielski $typeclass = ""; 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski } else 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski $first = 0; 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) ) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski if ($DEBUG == 1) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski print REFERENCE "$1\n"; 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski if ( ! exists $main::reftypes->{$1} ) 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski $main::reftypes->{$1}++; 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski if ( exists $main::currenttypes->{$1} ) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski $main::currenttypes->{$1}->{COUNT}++; 144*b1cdbd2cSJim Jagielski# print "###### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n"; 145*b1cdbd2cSJim Jagielski } else 146*b1cdbd2cSJim Jagielski { 147*b1cdbd2cSJim Jagielski if ($published == 0) 148*b1cdbd2cSJim Jagielski { 149*b1cdbd2cSJim Jagielski $main::removedtypes->{$1} = { PUBLISHED => $published, 150*b1cdbd2cSJim Jagielski TYPECLASS => $typeclass }; 151*b1cdbd2cSJim Jagielski } else 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski print "ERROR: type $1 is only in reference type library, this can't be happen\n"; 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski $linebefore = $_; 159*b1cdbd2cSJim Jagielski} 160*b1cdbd2cSJim Jagielskiclose( FILEIN ); 161*b1cdbd2cSJim Jagielskiclose( REFERENCE ); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski@typekeys = keys %{$main::currenttypes}; 165*b1cdbd2cSJim Jagielski$allunotypes = $#typekeys+1; 166*b1cdbd2cSJim Jagielski$newunotypes = 0; 167*b1cdbd2cSJim Jagielski$newpublished = 0; 168*b1cdbd2cSJim Jagielski$draftscount = 0; 169*b1cdbd2cSJim Jagielski$draftspublished = 0; 170*b1cdbd2cSJim Jagielskiforeach $i ( sort @typekeys ) 171*b1cdbd2cSJim Jagielski{ 172*b1cdbd2cSJim Jagielski if ( $main::currenttypes->{$i}->{COUNT} == 1 && 173*b1cdbd2cSJim Jagielski !("$main::currenttypes->{$i}->{TYPECLASS}" eq "module")) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski $newunotypes++; 176*b1cdbd2cSJim Jagielski my $t = $i; 177*b1cdbd2cSJim Jagielski $t =~ s#/#\.#go; 178*b1cdbd2cSJim Jagielski if ($main::currenttypes->{$i}->{PUBLISHED} == 1) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski print "published "; 181*b1cdbd2cSJim Jagielski $newpublished++; 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski if ( $t =~ m#drafts\.com.+#) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski $draftscount++; 186*b1cdbd2cSJim Jagielski if ($main::currenttypes->{$i}->{PUBLISHED} == 1) 187*b1cdbd2cSJim Jagielski { 188*b1cdbd2cSJim Jagielski $draftspublished++; 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski print "$main::currenttypes->{$i}->{TYPECLASS} = $t\n"; 192*b1cdbd2cSJim Jagielski } 193*b1cdbd2cSJim Jagielski} 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski# count removed not yet published types 196*b1cdbd2cSJim Jagielski$removednotpublished = 0; 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski@removedtypekeys = keys %{$main::removedtypes}; 199*b1cdbd2cSJim Jagielskiforeach $i ( sort @removedtypekeys ) 200*b1cdbd2cSJim Jagielski{ 201*b1cdbd2cSJim Jagielski $removednotpublished++; 202*b1cdbd2cSJim Jagielski my $t = $i; 203*b1cdbd2cSJim Jagielski $t =~ s#/#\.#go; 204*b1cdbd2cSJim Jagielski print "removed not yet published $main::currenttypes->{$i}->{TYPECLASS} = $t\n"; 205*b1cdbd2cSJim Jagielski} 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielskiprint "\n=======================================================\n\n"; 208*b1cdbd2cSJim Jagielskiprint "Summary [last check for $main::buildinfo]:\n\n"; 209*b1cdbd2cSJim Jagielskiprint "Number of UNO types = $allunotypes\n"; 210*b1cdbd2cSJim Jagielskiprint "Number of new UNO types = $newunotypes\n"; 211*b1cdbd2cSJim Jagielskiprint "New and published types = $newpublished\n"; 212*b1cdbd2cSJim Jagielskiprint "New and draft types = $draftscount\n"; 213*b1cdbd2cSJim Jagielskiprint "New, draft and published = $draftspublished\n"; 214*b1cdbd2cSJim Jagielskiprint "Removed and not published = $removednotpublished\n"; 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielskiexit 0; 217