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