#!/qds/opt/tools/bin/perl # # This PERL script updates the src/ directory (which is where this # script assumes it lives) with files from the "vc" directories. Only # files that are different are updated. The files processed in this # update are *.C, *.h and *.table files. This script also updates the # "vc" directory version of the store_module files from their home, in # the src/ directory. This update will only be done if the # store_module files are different and the version in src/ is more # recent than the version in the "vc" directory. # # Usage: # # This script has no arguments. The script assumes that it is in the # src/ directory and will now work properly if it is executed from outside. # To execute the script enter # # perl # # Ian Kaplan 12/96 # &main(); sub main { local($root) = "/vobs/quest/Import"; local($path) = "$root/vc"; local( $i, $test ); &get_dirs( $path ); $index = 0; for ($i = 0; $dirlist[ $i ]; ++$i) { # don't want to do the src directory and the store directory is special if ($dirlist[ $i ] ne "store" && $dirlist[ $i ] ne "src") { &get_files( $path, $dirlist[ $i ] ); } } &get_diff_files(); if (@diff_file) { print "Preparing to update these files in the source directory:\n"; for ($i = 0; $diff_full_path[ $i ]; ++$i) { print "$diff_full_path[ $i ]\n"; } print "Ok? (y/n, default y) "; $test = ; if ($test ne "n\n") { &check_out_files_in_src(); ©_files(); &check_in_files_in_src(); } } else { print "No differences found\n"; } &do_store_module( $path ); print "\nFiles in src/ that are not checked into clearcase:\n"; system("cleartool ls | fgrep -v Rule"); } # main # # do_store_module # # The store_module files that build net lists from information # supplied by "vc" are special, in that their home directory is # src/. Updates are done from src/ to vc/store. This PERL subroutine # makes this update. Note that the update is not done if the files # are not different, or if the time stamp of the file in vc/store # is newer than the file in src/ # # As new files are added for store_module, add their names to # the @store_module_file list. # sub do_store_module { (local $path ) = @_; (local $store_module_dir ) = "$path/store"; (local @store_module_files) = ("store_module.C", "store_local.h"); (local $time_src, $time_vc); (local $i, $tmp, $different); # yet another variation on list iteration for ($i = 0; @store_module_files; ++$i) { $tmp = pop( @store_module_files ); $time_src = -M $tmp; $time_vc = -M "$path/store/$tmp"; $different = system("diff $tmp $path/store/$tmp > /dev/null"); if ($time_vc < $time_src && $different) { print "Warning: the version of $tmp in $path/store\n"; print " is newer than the version in src/ and the files differ.\n"; print " No update of $path/store will be done.\n"; } elsif ($different) { print "Updating the copy of $tmp in $path/store\n"; system("cleartool co -nc $path/store/$tmp"); print "copying $tmp to $path/store/$tmp\n"; system("cp $tmp $path/store/$tmp"); system("cleartool ci -nc $path/store/$tmp"); } } } # do_store_module # # check_out_files_in_src # # Check out files in the src/ directory (the assumed home # of this script). # sub check_out_files_in_src() { local( $i ); if (@diff_file) { print "In src/ directory\n"; } for ($i = 0; $diff_file[ $i ]; ++$i) { system("cleartool co -nc $diff_file[ $i ]"); } } # check_out_files_in_src # # check_in_files_in_src # # Check in files in the src/ directory (the assumed home # of this script). # sub check_in_files_in_src() { local( $i ); if (@diff_file) { print "In src/ directory\n"; } for ($i = 0; $diff_file[ $i ]; ++$i) { system("cleartool ci -nc $diff_file[ $i ]"); } } # check_in_files_in_src # # copy_files # # Copy files from the "vc" directories into the src/ directories # (note that src/ is the assumed home of this script). # sub copy_files { local( $i ); for ($i = 0; $diff_full_path[ $i ]; ++$i) { print "copying $diff_full_path[ $i ] to $diff_file[ $i ]\n"; system("cp $diff_full_path[ $i ] $diff_file[ $i ]"); } } # copy_files # # get_diff_files # # This function iterates through the global list $full_path_list and # find files that differ when compared to the same file in the src/ # directory. It returns two global lists, $diff_file, which contains # the file name (without the path) and $diff_full_path, which contains # the full file name in the "vc" directory. # sub get_diff_files { local( $result, $i, $cnt ); $cnt = 0; print "\nLooking for files to update....\n"; for ($i = 0; $full_path_list[ $i ]; ++$i) { $result = system("diff $file_list[ $i ] $full_path_list[ $i ] > /dev/null"); if ($result) { $diff_file[ $cnt ] = $file_list[ $i ]; $diff_full_path[ $cnt ] = $full_path_list[ $i ]; ++$cnt; } } } # get_diff_files # # get_files # # This function is passed a root path (e.g., the path for the "vc" directory) # and a directory name. This function returns two global lists - $file_list # and $full_path_list that contain the *.C, *.h and *.table files from # the directory argument. # sub get_files { local( $path, $filename ) = @_; local( $full_filename ) = "$path/$filename"; local( $i ); opendir(FILEPTR, $full_filename) || die "error opening ", $full_filename, "\n"; local(@local_files) = readdir(FILEPTR); closedir( FILEPTR ); for ($i = 0; $local_files[ $i ]; ++$i) { # file all the files that end with .C if ($local_files[ $i ] =~ /.C$/) { $file_list[ $index ] = $local_files[ $i ]; $full_path_list[ $index ] = "$full_filename/$local_files[ $i ]"; ++$index; } if ($local_files[ $i ] =~ /.h$/) { $file_list[ $index ] = $local_files[ $i ]; $full_path_list[ $index ] = "$full_filename/$local_files[ $i ]"; ++$index; } if ($local_files[ $i ] =~ /.table$/) { $file_list[ $index ] = $local_files[ $i ]; $full_path_list[ $index ] = "$full_filename/$local_files[ $i ]"; ++$index; } } # for } # get_files # # get_dirs # # This function is passed a the path to the "vc" directory. It returns # the global list @dirlist, containing all the files that are directories # in this list. # sub get_dirs { local( $path ) = @_; local( $filecnt ) = 0; local( $dircnt ) = 0; opendir(TOPDIR, $path) || die "error opening ", $path; local(@topfiles) = readdir(TOPDIR); closedir(TOPDIR); while ($topfiles[ $filecnt] ) { if ( $topfiles[ $filecnt ] ne "." && $topfiles[ $filecnt ] ne "..") { local($filename) = "$path/$topfiles[ $filecnt ]"; # -d operator checks to see if filename is a directory if ( -d $filename) { # dirlist is a return value - global $dirlist[ $dircnt ] = $topfiles[ $filecnt ]; ++$dircnt; } } ++$filecnt; } # for } # get_dirs