#!/usr/bin/perl # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # $Source: src/build/tools/hwp_id.pl $ # # IBM CONFIDENTIAL # # COPYRIGHT International Business Machines Corp. 2012 # # p1 # # Object Code Only (OCO) source materials # Licensed Internal Code Source Materials # IBM HostBoot Licensed Internal Code # # The source code for this program is not published or other- # wise divested of its trade secrets, irrespective of what has # been deposited with the U.S. Copyright Office. # # Origin: 30 # # IBM_PROLOG_END_TAG use strict; use File::Find (); use File::Path; # Variables my $DIR = "."; my $DEBUG = 0; my @outputFnVn; my $SHOW_INFO = 0; # a bit for each: use constant SHOW_IMAGEID => 0x01; use constant SHOW_MISSING => 0x02; use constant SHOW_VERSION => 0x04; use constant SHOW_SHORT => 0x08; use constant SHOW_FULLPATH => 0x10; use constant SHOW_HTML => 0x20; use constant SHOW_ONLYMISS => 0x40; # directories that we'll check for files: my @dirList = ( "src/usr/hwpf/hwp", "src/usr/pore/poreve/model", ) ; # set defaults my $imageId = ""; $SHOW_INFO = SHOW_VERSION; while( $ARGV = shift ) { if( $ARGV =~ m/-h/ ) { usage(); } elsif( $ARGV =~ m/-D/ ) { if ( $DIR = shift ) { print("Using directory: $DIR\n"); } else { usage(); } } elsif( $ARGV =~ m/-d/ ) { $DEBUG = 1; } elsif( $ARGV =~ m/-f/ ) { $SHOW_INFO |= SHOW_FULLPATH; } elsif( $ARGV =~ m/-I/ ) { $SHOW_INFO |= SHOW_IMAGEID; if ( $imageId = shift ) { debugMsg("using supplied Hostboot version: $imageId\n"); } else { usage(); } } elsif( $ARGV =~ m/-i/ ) { $SHOW_INFO |= SHOW_IMAGEID; } elsif( $ARGV =~ m/-l/ ) { $SHOW_INFO |= SHOW_HTML; $SHOW_INFO &= ~SHOW_VERSION; $SHOW_INFO &= ~SHOW_SHORT; } elsif( $ARGV =~ m/-M/ ) { $SHOW_INFO |= SHOW_ONLYMISS; } elsif( $ARGV =~ m/-m/ ) { $SHOW_INFO |= SHOW_MISSING; } elsif( $ARGV =~ m/-s/ ) { $SHOW_INFO |= SHOW_SHORT; $SHOW_INFO &= ~SHOW_VERSION; $SHOW_INFO &= ~SHOW_HTML; } elsif( $ARGV =~ m/-v/ ) { $SHOW_INFO |= SHOW_VERSION; $SHOW_INFO &= ~SHOW_SHORT; $SHOW_INFO &= ~SHOW_HTML; } else { usage(); } } # make sure we're in the correct place chdir "$DIR"; if ($SHOW_INFO & SHOW_ONLYMISS) { $SHOW_INFO &= ~SHOW_VERSION; $SHOW_INFO &= ~SHOW_SHORT; $SHOW_INFO &= ~SHOW_HTML; } # generate starting html if needed if ($SHOW_INFO & SHOW_HTML) { print "\n"; print " HWP names and version IDs\n"; print < table.hwp_id { border-width: 1px; border-spacing: 2px; border-style: outset; border-color: gray; border-collapse: separate; background-color: white; } table.hwp_id th { border-width: 1px; padding: 1px; border-style: inset; border-color: gray; background-color: white; } table.hwp_id td { border-width: 1px; padding: 1px; border-style: inset; border-color: gray; background-color: white; } STYLESHEET print " \n"; } # determine what the hbi_ImageId would be, if we were asked to display that if ($SHOW_INFO & SHOW_IMAGEID) { if ($imageId eq "") { # copied from src/build/tools/addimgid: $imageId = `git describe --dirty || echo Unknown-Image \`git rev-parse --short HEAD\``; chomp $imageId; if (($imageId =~ m/Unknown-Image/) || # Couldn't find git describe tag. ($imageId =~ m/dirty/) || # Find 'dirty' commit. ($imageId =~ m/^.{15}-[1-9]+/)) # Found commits after a tag. { $imageId = $imageId."/".$ENV{"USER"}; } } if ($SHOW_INFO & SHOW_HTML) { print "

Hostboot version: $imageId

\n"; } else { print("Hostboot version: $imageId\n"); } } # do the work - for each directory, check the files... foreach( @dirList ) { if ($SHOW_INFO & SHOW_HTML) { print("

HWP files in $_

\n"); } else { print("[HWP files in $_]\n"); } if ($SHOW_INFO & SHOW_SHORT) { print("[Procedure,Revision]\n" ); } if ($SHOW_INFO & SHOW_HTML) { print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; } @outputFnVn = (); checkFiles( $_ ); foreach( sort(@outputFnVn) ) { print( "$_\n" ); } if ($SHOW_INFO & SHOW_HTML) { print "
FilenameVersion
\n"; } } # generate closing html if needed if ($SHOW_INFO & SHOW_HTML) { print " \n"; print "\n"; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # End of Main program #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ################################################################################ # # Print debug messages if $DEBUG is enabled. # ################################################################################ sub debugMsg { my ($msg) = @_; if( $DEBUG ) { print "DEBUG: $msg\n"; } } ################################################################################ # # checkFiles - find *.[hHcC] and *.initfile files that are hwp files # and prints out their filename and version from the $Id: string. # This recursively searches the input directory passed in for all files. # ################################################################################ sub checkFiles { my ($l_input_dir) = @_; debugMsg( "Getting Files for dir: $l_input_dir" ); # Open the directory and read all entry names. local *DH; opendir(DH, $l_input_dir) or die("Cannot open $l_input_dir: $!"); # skip the dots my @dir_entry; @dir_entry = grep { !/^\./ } readdir(DH); closedir(DH); while (@dir_entry) { my $l_entry = shift(@dir_entry); my $full_path = "$l_input_dir/$l_entry"; debugMsg( "checkFiles: Full Path: $full_path" ); # if this is valid file: if (($l_entry =~ /\.[H|h|C|c]$/) || ($l_entry =~ /\.initfile$/)) { local *FH; open(FH, "$full_path") or die("Cannot open: $full_path: $!"); my $data; read(FH, $data, -s FH) or die("Error reading $full_path: $!"); close FH; # look for special string to skip file if ($data =~ /HWP_IGNORE_VERSION_CHECK/ ) { debugMsg( "checkFiles: found HWP_IGNORE_VERSION_CHECK in: $full_path" ); next; } # look for # $Id: - means this IS an hwp - print version and continue # else - missing! if ($data =~ /\$Id: (.*),v ([0-9.]*) .* \$/mgo ) { my $fn = $1; # filename my $vn = $2; # version my $display_name; if ($SHOW_INFO & SHOW_FULLPATH) { $display_name = $full_path; } else { $display_name = $fn; } debugMsg( "File: $display_name Version: $vn" ); if ($SHOW_INFO & SHOW_VERSION) { push( @outputFnVn, "File: $display_name Version: $vn" ); } elsif ($SHOW_INFO & SHOW_SHORT) { push( @outputFnVn, "$display_name,$vn" ); } elsif ($SHOW_INFO & SHOW_HTML) { push( @outputFnVn, "$display_name$vn" ); } # sanity check that fn is how it's in hb if ($fn ne $l_entry) { print( " note!! File: $fn in hostboot as: $full_path\n" ); } } else { debugMsg( "checkFiles: MISSING \$Id tag: $full_path" ); if ($SHOW_INFO & SHOW_MISSING) { if ($SHOW_INFO & SHOW_VERSION) { print( "File: $full_path Version: \$Id is MISSING\n" ); } elsif ($SHOW_INFO & SHOW_SHORT) { print( "$full_path,MISSING\n" ); } elsif ($SHOW_INFO & SHOW_HTML) { print( "$full_path\$Id is MISSING\n" ); } } elsif ($SHOW_INFO & SHOW_ONLYMISS) { print( "File: $full_path Version: \$Id is MISSING\n" ); } } } # else if this is a directory elsif (-d $full_path) { # recursive here checkFiles($full_path); } # else we ignore the file. } } ################################################################################ # # Print the Usage message # ################################################################################ sub usage { print "Usage: $0